wiki-graph-sdk 0.8.4 → 0.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/archives.cjs +345 -152
- package/dist/archives.cjs.map +1 -1
- package/dist/archives.js +356 -157
- package/dist/archives.js.map +1 -1
- package/dist/conversions.cjs +269 -99
- package/dist/conversions.cjs.map +1 -1
- package/dist/conversions.js +275 -103
- package/dist/conversions.js.map +1 -1
- package/dist/default-worker.cjs +278 -108
- package/dist/default-worker.cjs.map +1 -1
- package/dist/default-worker.js +285 -112
- package/dist/default-worker.js.map +1 -1
- package/dist/embedding.cjs +214 -54
- package/dist/embedding.cjs.map +1 -1
- package/dist/embedding.js +214 -54
- package/dist/embedding.js.map +1 -1
- package/dist/gc.cjs +214 -54
- package/dist/gc.cjs.map +1 -1
- package/dist/gc.js +214 -54
- package/dist/gc.js.map +1 -1
- package/dist/index.cjs +442 -226
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +461 -236
- package/dist/index.js.map +1 -1
- package/dist/local-config.cjs +214 -54
- package/dist/local-config.cjs.map +1 -1
- package/dist/local-config.js +214 -54
- package/dist/local-config.js.map +1 -1
- package/dist/maintenance.cjs +265 -97
- package/dist/maintenance.cjs.map +1 -1
- package/dist/maintenance.js +271 -101
- package/dist/maintenance.js.map +1 -1
- package/dist/node-platform.cjs +214 -54
- package/dist/node-platform.cjs.map +1 -1
- package/dist/node-platform.d.ts +2 -0
- package/dist/node-platform.js +214 -54
- package/dist/node-platform.js.map +1 -1
- package/dist/runtime-config.cjs +214 -54
- package/dist/runtime-config.cjs.map +1 -1
- package/dist/runtime-config.js +214 -54
- package/dist/runtime-config.js.map +1 -1
- package/dist/stage.cjs +214 -54
- package/dist/stage.cjs.map +1 -1
- package/dist/stage.js +214 -54
- package/dist/stage.js.map +1 -1
- package/dist/worker.cjs +277 -103
- package/dist/worker.cjs.map +1 -1
- package/dist/worker.js +284 -107
- package/dist/worker.js.map +1 -1
- package/package.json +2 -2
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/archive/archive.ts","../src/conversions.ts","../src/llm.ts","../src/node-platform.ts","../src/runtime-config.ts","../src/local-config.ts","../src/runtime-context.ts","../src/providers.ts","../src/runtime-path.ts","../src/archive/target.ts","../src/query-runtime.ts","../src/embedding.ts","../src/archive/inspect.ts","../src/archive/write.ts","../src/pages.ts","../src/result-pages.ts","../src/wikispine.ts","../src/config.ts","../src/continuations.ts","../src/default-worker.ts","../src/stage.ts","../src/planning.ts","../src/worker.ts","../src/host.ts","../src/entry-context.ts","../src/jobs.ts","../src/libraries.ts","../src/maintenance.ts","../src/sdk.ts","../src/index.ts"],"sourcesContent":["import { randomUUID } from \"crypto\";\nimport { link, mkdtemp, rename, rm, stat } from \"fs/promises\";\nimport { tmpdir } from \"os\";\nimport { basename, dirname, join } from \"path\";\nimport { Readable } from \"stream\";\n\nimport {\n addChapter,\n applyChapterTree,\n assertArchiveIndexArtifactsReady,\n assertNoActiveBuildJobConflicts,\n assertNoActiveBuildJobs,\n deleteArchiveSearchSessions,\n createContinuationCursor,\n deleteContinuationCursor,\n DirectoryDocument,\n findArchiveObjects,\n formatLocatedWikiGraphUri,\n isArchiveSearchIndexCurrent,\n isSourceLocatorScopeUri,\n listArchiveCollection,\n listArchiveEvidence,\n listArchiveQueryableChapterIds,\n listArchiveSourceLocators,\n listChapters,\n listRelatedArchiveObjects,\n moveChapter,\n packArchiveContext,\n parseLocatedWikiGraphUri,\n readArchivePage,\n readSearchIndexCapabilityStatus,\n rebuildArchiveSearchIndex,\n removeChapter,\n resetChapter,\n resolveChapterPathReadonly,\n setChapterSource,\n setChapterSummary,\n setChapterTitle,\n getChapterTree,\n WikiGraph,\n WikiGraphArchiveFile,\n TOC_FILE_VERSION,\n writeWikgArchive,\n type ArchiveCollectionOptions,\n type ArchiveCollectionResult,\n type ArchiveFindOptions,\n type ArchivePack,\n type ArchivePage,\n type ArchiveSourceLocatorResult,\n type BookMeta,\n type ChapterEntry,\n type ChapterDetails,\n type ChapterStage,\n type ChapterTree,\n type ChapterTreeApplyResult,\n type File,\n type IndexArtifactKind,\n ObjectMetadataKind,\n type ObjectMetadataTarget,\n type QueryIndexScope,\n type ContinuationCursor,\n type ReadonlyDocument,\n type SearchIndexEmbeddingProvider,\n type SearchIndexQueryMode,\n type WikiGraphProgressCallback,\n} from \"wiki-graph-core\";\n\nimport type { WikiGraphJobRuntime } from \"../jobs.js\";\nimport { WikiGraphConversionManager } from \"../conversions.js\";\nimport { NodeDirectory, NodeFile } from \"../node-platform.js\";\nimport {\n createConfiguredEmbeddingProvider,\n withConfiguredWikimediaResolver,\n} from \"../query-runtime.js\";\nimport {\n inspectWikiGraphArchive,\n type WikiGraphArchiveInspection,\n} from \"./inspect.js\";\nimport {\n assertStandaloneWikiGraphArchivePath,\n resolveWikiGraphArchiveLocation,\n type WikiGraphArchiveLocation,\n type WikiGraphArchiveTarget,\n} from \"./target.js\";\nimport { writeWikiGraphArchiveLocation } from \"./write.js\";\nimport {\n createArchiveCollectionPage,\n createArchiveEvidencePage,\n createArchiveFindPage,\n createArchiveRelatedPage,\n createArchiveSourceLocatorPage,\n type ArchiveCollectionPage,\n type ArchiveEvidencePage,\n type ArchiveFindPage,\n type ArchiveRelatedPage,\n type ArchiveSourceLocatorPage,\n} from \"../result-pages.js\";\n\nexport interface WikiGraphOperationOptions {\n readonly signal?: AbortSignal;\n}\n\ntype SearchIndexCapabilityStatus = Awaited<\n ReturnType<typeof readSearchIndexCapabilityStatus>\n>;\ntype SearchIndexProgressEvent = Parameters<\n NonNullable<Parameters<typeof rebuildArchiveSearchIndex>[1]>\n>[0];\nexport type WikiGraphChapterResetStage = Exclude<ChapterStage, \"summarized\">;\nexport type WikiGraphChapterSourceOptions = NonNullable<\n Parameters<typeof setChapterSource>[3]\n>;\nexport type WikiGraphChapterTreeInput = Parameters<typeof applyChapterTree>[1];\n\nexport interface WikiGraphArchiveCreateOptions extends WikiGraphOperationOptions {\n readonly importPath?: string;\n readonly onProgress?: WikiGraphProgressCallback;\n readonly path: string;\n readonly replace?: boolean;\n}\n\nexport interface WikiGraphArchiveCreateResult {\n readonly locatedUri: string;\n readonly path: string;\n}\n\nexport class WikiGraphArchiveExistsError extends Error {\n public readonly code = \"WIKI_GRAPH_ARCHIVE_EXISTS\";\n public readonly path: string;\n\n public constructor(path: string) {\n super(`Archive already exists: ${path}`);\n this.name = \"WikiGraphArchiveExistsError\";\n this.path = path;\n }\n}\n\nexport interface WikiGraphArchiveWriteOptions extends WikiGraphOperationOptions {\n readonly onIndexSyncError?: (error: unknown) => void;\n readonly refreshLibraryIndex?: boolean;\n readonly searchIndexWritebackPolicy?: \"archive\" | \"cache\";\n}\n\nexport interface WikiGraphArchiveIndexStatus {\n readonly capabilities: SearchIndexCapabilityStatus;\n readonly current: boolean;\n}\n\nexport interface WikiGraphArchiveCover {\n readonly data: Uint8Array;\n readonly mediaType: string;\n readonly path: string;\n}\n\nexport interface WikiGraphArchiveIndexSyncOptions extends WikiGraphOperationOptions {\n readonly onProgress?: (\n event: SearchIndexProgressEvent,\n ) => void | Promise<void>;\n readonly skipUnindexed?: boolean;\n}\n\nexport interface WikiGraphChapterArtifactStatus {\n readonly artifact?: {\n readonly createdAt: string;\n readonly metadata: Readonly<Record<string, unknown>>;\n readonly sourceRevision: number;\n };\n readonly chapterId: number;\n readonly current: boolean;\n readonly kind: IndexArtifactKind;\n readonly missing: boolean;\n readonly revision: number;\n}\n\nexport interface WikiGraphChapterMoveOptions {\n readonly afterPath?: string;\n readonly beforePath?: string;\n readonly first?: boolean;\n readonly last?: boolean;\n readonly parentPath?: string;\n readonly root?: boolean;\n}\n\nexport interface WikiGraphArchiveScopeOptions {\n readonly chapters?: readonly number[];\n readonly depth?: number;\n}\n\nexport interface WikiGraphArchiveSearchOptions\n extends\n Omit<ArchiveFindOptions, \"archiveKey\" | \"chapters\">,\n WikiGraphArchiveScopeOptions,\n WikiGraphOperationOptions {}\n\nexport interface WikiGraphArchiveListOptions\n extends\n Omit<ArchiveCollectionOptions, \"chapters\">,\n WikiGraphArchiveScopeOptions,\n WikiGraphOperationOptions {}\n\nexport interface WikiGraphArchivePageOptions extends WikiGraphOperationOptions {\n readonly backlinks?: boolean;\n readonly evidenceLimit?: number;\n readonly order?: \"doc-asc\" | \"doc-desc\";\n readonly sourceContext?: number;\n}\n\nexport interface WikiGraphArchiveRelatedOptions extends WikiGraphOperationOptions {\n readonly cursor?: string;\n readonly evidenceLimit?: number;\n readonly limit?: number;\n readonly order?: \"doc-asc\" | \"doc-desc\";\n readonly query?: string;\n readonly queryMode?: SearchIndexQueryMode;\n readonly role?: \"any\" | \"object\" | \"self\" | \"subject\";\n readonly skipUnindexed?: boolean;\n readonly sourceContext?: number;\n}\n\nexport interface WikiGraphArchiveEvidenceOptions extends WikiGraphOperationOptions {\n readonly cursor?: string;\n readonly limit?: number;\n readonly order?: \"doc-asc\" | \"doc-desc\";\n readonly query?: string;\n readonly queryMode?: SearchIndexQueryMode;\n readonly skipUnindexed?: boolean;\n readonly sourceContext?: number;\n}\n\nexport interface WikiGraphArchiveScope {\n readonly chapterIds: readonly number[];\n readonly entries: readonly ChapterEntry[];\n}\n\nexport class WikiGraphArchiveManager {\n readonly #runtime: WikiGraphJobRuntime;\n\n public constructor(runtime: WikiGraphJobRuntime) {\n this.#runtime = runtime;\n }\n\n public async create(\n options: WikiGraphArchiveCreateOptions,\n ): Promise<WikiGraphArchiveCreateResult> {\n return await this.#runtime.run(async () => {\n const path = await assertStandaloneWikiGraphArchivePath(options.path);\n if (options.replace !== true && (await nodePathExists(path))) {\n throw new WikiGraphArchiveExistsError(path);\n }\n const outputPath = join(\n dirname(path),\n `.${basename(path)}.${randomUUID()}.tmp.wikg`,\n );\n try {\n if (options.importPath === undefined) {\n await createEmptyArchiveFile(outputPath);\n } else {\n await new WikiGraphConversionManager(this.#runtime).convert({\n input: { format: \"epub\", path: options.importPath },\n ...(options.onProgress === undefined\n ? {}\n : { onProgress: options.onProgress }),\n output: { format: \"wikg\", path: outputPath },\n targetStage: \"sourced\",\n });\n }\n if (options.replace === true) {\n await rename(outputPath, path);\n } else {\n try {\n // A hard-link is an atomic no-clobber publish because the private\n // temporary file lives beside the target on the same filesystem.\n await link(outputPath, path);\n } catch (error) {\n if (isNodeEEXISTError(error)) {\n throw new WikiGraphArchiveExistsError(path);\n }\n throw error;\n }\n }\n return { locatedUri: formatLocatedWikiGraphUri(path), path };\n } finally {\n await rm(outputPath, { force: true, recursive: true });\n }\n }, options.signal);\n }\n\n public async open(\n target: WikiGraphArchiveTarget,\n options: WikiGraphOperationOptions = {},\n ): Promise<WikiGraphArchiveHandle> {\n const location = await this.#runtime.run(\n async () => await resolveWikiGraphArchiveLocation(target),\n options.signal,\n );\n return new WikiGraphArchiveHandle(this.#runtime, location);\n }\n}\n\nexport class WikiGraphArchiveHandle {\n readonly #runtime: WikiGraphJobRuntime;\n readonly #location: WikiGraphArchiveLocation;\n\n public constructor(runtime: WikiGraphJobRuntime, location: unknown) {\n this.#runtime = runtime;\n this.#location = location as WikiGraphArchiveLocation;\n }\n\n public get archiveKey(): string {\n return this.#location.archiveKey;\n }\n\n public get indexScope(): QueryIndexScope {\n return this.#location.indexScope;\n }\n\n public get locatedUri(): string {\n return this.#location.locatedUri;\n }\n\n public get objectUri(): string {\n return (\n parseLocatedWikiGraphUri(this.#location.locatedUri).objectUri ?? \"wikg://\"\n );\n }\n\n public get path(): string {\n return this.#location.archivePath;\n }\n\n public get target(): WikiGraphArchiveTarget {\n return this.#location.target;\n }\n\n async #persistCursor(cursor: ContinuationCursor): Promise<string> {\n return await this.#runtime.run(\n async () => await createContinuationCursor(cursor),\n );\n }\n\n async #releaseCursor(cursor: string): Promise<void> {\n await this.#runtime.run(async () => await deleteContinuationCursor(cursor));\n }\n\n public async inspect(\n options: WikiGraphOperationOptions & { readonly chapterId?: number } = {},\n ): Promise<WikiGraphArchiveInspection> {\n return await this.#readDocument(\n async (document) =>\n await inspectWikiGraphArchive(document, {\n archiveUri: this.#location.publicArchiveUri ?? this.locatedUri,\n ...(options.chapterId === undefined\n ? {}\n : { chapterId: options.chapterId }),\n }),\n options,\n );\n }\n\n public async search(\n query: string,\n options: WikiGraphArchiveSearchOptions = {},\n ): Promise<ArchiveFindPage> {\n const embeddingProvider = await this.#resolveQueryEmbeddingProvider(\n options.queryMode,\n options.signal,\n );\n const result = await this.#writeDocument(\n async (document) => {\n const chapters = await this.#resolveQueryChapters(document, options, {\n embeddingProvider,\n });\n await ensureArchiveSearchIndex(document, {\n ...(chapters === undefined ? {} : { chapters }),\n ...(embeddingProvider === undefined ? {} : { embeddingProvider }),\n });\n return await findArchiveObjects(document, query, {\n ...withoutOperationAndScope(options),\n archiveKey: this.archiveKey,\n ...(chapters === undefined ? {} : { chapters }),\n ...(embeddingProvider === undefined ? {} : { embeddingProvider }),\n });\n },\n {\n searchIndexWritebackPolicy: \"cache\",\n ...(options.signal === undefined ? {} : { signal: options.signal }),\n },\n );\n return createArchiveFindPage(\n result,\n async (cursor, nextOptions) =>\n await this.search(query, {\n ...options,\n cursor,\n ...(nextOptions.limit === undefined\n ? {}\n : { limit: nextOptions.limit }),\n ...(nextOptions.signal === undefined\n ? {}\n : { signal: nextOptions.signal }),\n }),\n (cursor) =>\n this.#persistCursor({\n archiveKey: this.archiveKey,\n archivePath: this.path,\n chapters: options.chapters ?? null,\n cursor,\n format: \"json\",\n indexScope: this.indexScope,\n kind: \"search\",\n ...(options.backlinks === undefined\n ? {}\n : { backlinks: options.backlinks }),\n ...(options.evidenceLimit === undefined\n ? {}\n : { evidenceLimit: options.evidenceLimit }),\n ...(options.match === undefined ? {} : { match: options.match }),\n ...(options.order === undefined ? {} : { order: options.order }),\n query,\n ...(options.queryMode === undefined\n ? {}\n : { queryMode: options.queryMode }),\n ...(options.skipUnindexed === undefined\n ? {}\n : { skipUnindexed: options.skipUnindexed }),\n ...(options.sourceContext === undefined\n ? {}\n : { sourceContext: options.sourceContext }),\n ...(options.triplePattern === undefined\n ? {}\n : { triplePattern: options.triplePattern }),\n types: options.types ?? null,\n }),\n (token) => this.#releaseCursor(token),\n );\n }\n\n public async list(\n options: WikiGraphArchiveListOptions = {},\n ): Promise<ArchiveCollectionPage | ArchiveSourceLocatorPage> {\n const result = await this.#readDocument(async (document) => {\n if (isSourceLocatorScopeUri(this.objectUri)) {\n return await listArchiveSourceLocators(document, this.objectUri, {\n ...(options.cursor === undefined ? {} : { cursor: options.cursor }),\n ...(options.limit === undefined ? {} : { limit: options.limit }),\n });\n }\n const chapters = await this.#resolveScope(document, options);\n return await listArchiveCollection(document, {\n ...withoutOperationAndScope(options),\n ...(chapters === undefined ? {} : { chapters }),\n });\n }, options);\n if (isSourceLocatorScopeUri(this.objectUri)) {\n return createArchiveSourceLocatorPage(\n result as ArchiveSourceLocatorResult,\n async (cursor, nextOptions) =>\n (await this.list({\n ...options,\n cursor,\n ...(nextOptions.limit === undefined\n ? {}\n : { limit: nextOptions.limit }),\n ...(nextOptions.signal === undefined\n ? {}\n : { signal: nextOptions.signal }),\n })) as ArchiveSourceLocatorPage,\n (cursor) =>\n this.#persistCursor({\n archiveKey: this.archiveKey,\n archivePath: this.path,\n cursor,\n format: \"json\",\n indexScope: this.indexScope,\n kind: \"source-locators\",\n targetUri: this.objectUri,\n }),\n (token) => this.#releaseCursor(token),\n );\n }\n return createArchiveCollectionPage(\n result as ArchiveCollectionResult,\n async (cursor, nextOptions) =>\n (await this.list({\n ...options,\n cursor,\n ...(nextOptions.limit === undefined\n ? {}\n : { limit: nextOptions.limit }),\n ...(nextOptions.signal === undefined\n ? {}\n : { signal: nextOptions.signal }),\n })) as ArchiveCollectionPage,\n (cursor) =>\n this.#persistCursor({\n archiveKey: this.archiveKey,\n archivePath: this.path,\n ...(options.backlinks === undefined\n ? {}\n : { backlinks: options.backlinks }),\n chapters: options.chapters ?? null,\n cursor,\n ...(options.evidenceLimit === undefined\n ? {}\n : { evidenceLimit: options.evidenceLimit }),\n format: \"json\",\n ids: options.ids ?? null,\n indexScope: this.indexScope,\n kind: \"collection\",\n order: options.order ?? \"doc-asc\",\n ...(options.sourceContext === undefined\n ? {}\n : { sourceContext: options.sourceContext }),\n ...(options.triplePattern === undefined\n ? {}\n : { triplePattern: options.triplePattern }),\n types: options.types ?? null,\n }),\n (token) => this.#releaseCursor(token),\n );\n }\n\n public async ensureSearchIndex(\n options: WikiGraphArchiveScopeOptions & WikiGraphOperationOptions = {},\n ): Promise<void> {\n const embeddingProvider = await this.#runtime.run(\n createConfiguredEmbeddingProvider,\n options.signal,\n );\n await this.#writeDocument(\n async (document) => {\n const chapters = await this.#resolveScope(document, options);\n await ensureArchiveSearchIndex(document, {\n ...(chapters === undefined ? {} : { chapters }),\n ...(embeddingProvider === undefined ? {} : { embeddingProvider }),\n });\n },\n {\n searchIndexWritebackPolicy: \"cache\",\n ...(options.signal === undefined ? {} : { signal: options.signal }),\n },\n );\n }\n\n public async getSearchIndexStatus(\n options: WikiGraphOperationOptions = {},\n ): Promise<WikiGraphArchiveIndexStatus> {\n return await this.#readDocument(\n async (document) => ({\n capabilities: await readSearchIndexCapabilityStatus(document),\n current: await isArchiveSearchIndexCurrent(document),\n }),\n options,\n );\n }\n\n public async syncSearchIndex(\n options: WikiGraphArchiveIndexSyncOptions = {},\n ): Promise<{ readonly rebuilt: boolean }> {\n const rebuilt = await this.#writeDocument(\n async (document) => {\n const scope =\n options.skipUnindexed === true\n ? { chapters: await listArchiveQueryableChapterIds(document) }\n : {};\n if (scope.chapters?.length === 0) {\n throw new Error(\n \"Wiki Graph index cache is not ready. No chapters have a current FTS artifact or source embedding artifact.\",\n );\n }\n if (await isArchiveSearchIndexCurrent(document, scope)) return false;\n await rebuildArchiveSearchIndex(document, options.onProgress, scope);\n return true;\n },\n {\n searchIndexWritebackPolicy: \"cache\",\n ...(options.signal === undefined ? {} : { signal: options.signal }),\n },\n );\n await this.#runtime.run(\n async () => await deleteArchiveSearchSessions(this.path),\n options.signal,\n );\n return { rebuilt };\n }\n\n public async cleanSearchIndex(\n options: WikiGraphOperationOptions = {},\n ): Promise<WikiGraphArchiveIndexStatus> {\n const status = await this.#writeDocument(\n async (document) => {\n await document.deleteSearchIndexDatabase();\n return {\n capabilities: {\n dense: { current: false },\n indexes: \"missing\" as const,\n },\n current: false,\n };\n },\n {\n searchIndexWritebackPolicy: \"cache\",\n ...(options.signal === undefined ? {} : { signal: options.signal }),\n },\n );\n await this.#runtime.run(\n async () => await deleteArchiveSearchSessions(this.path),\n options.signal,\n );\n return status;\n }\n\n /** Clear cached search sessions without changing the archive index. */\n public async clearSearchSessions(\n options: WikiGraphOperationOptions = {},\n ): Promise<void> {\n await this.#runtime.run(\n async () => await deleteArchiveSearchSessions(this.path),\n options.signal,\n );\n }\n\n public async listChapters(\n options: WikiGraphOperationOptions = {},\n ): Promise<readonly ChapterEntry[]> {\n return await this.#readDocument(\n async (document) => await listChapters(document),\n options,\n );\n }\n\n public async getChapter(\n path: string,\n options: WikiGraphOperationOptions = {},\n ): Promise<ChapterEntry> {\n return await this.#readDocument(async (document) => {\n const chapterId = await resolveChapterPathReadonly(document, path);\n return requireChapter(await listChapters(document), chapterId);\n }, options);\n }\n\n public async addChapter(options: {\n readonly parentPath?: string;\n readonly source?: string;\n readonly title?: string;\n }): Promise<ChapterDetails> {\n return await this.#writeDocument(async (document) => {\n const parentChapterId = await resolveOptionalChapterPath(\n document,\n options.parentPath,\n );\n await assertNoActiveBuildJobConflicts({\n archive: this.#location.archiveFile,\n operation: \"Adding chapter\",\n scope: { kind: \"archive\" },\n });\n let details = await addChapter(document, {\n ...(parentChapterId === undefined ? {} : { parentChapterId }),\n ...(options.title === undefined ? {} : { title: options.title }),\n });\n if (options.source !== undefined) {\n details = await setChapterSource(\n document,\n details.chapterId,\n asTextStream(options.source),\n );\n }\n return details;\n });\n }\n\n public async getChapterArtifact(\n path: string,\n kind: IndexArtifactKind,\n ): Promise<WikiGraphChapterArtifactStatus> {\n return await this.#readDocument(async (document) => {\n const chapterId = await resolveChapterPathReadonly(document, path);\n const [artifact, revision] = await Promise.all([\n document.indexArtifacts.get(chapterId, kind),\n document.serials.getRevision(chapterId),\n ]);\n return {\n ...(artifact === undefined\n ? {}\n : {\n artifact: {\n createdAt: artifact.createdAt,\n metadata: artifact.metadata,\n sourceRevision: artifact.sourceRevision,\n },\n }),\n chapterId,\n current: artifact?.sourceRevision === revision,\n kind,\n missing: artifact === undefined,\n revision,\n };\n });\n }\n\n public async deleteChapterArtifact(\n path: string,\n kind: IndexArtifactKind,\n ): Promise<{\n readonly chapterId: number;\n readonly deleted: true;\n readonly kind: IndexArtifactKind;\n }> {\n return await this.#writeDocument(async (document) => {\n const chapterId = await resolveChapterPathReadonly(document, path);\n await document.indexArtifacts.delete(chapterId, kind);\n return { chapterId, deleted: true, kind };\n });\n }\n\n public async moveChapter(\n path: string,\n options: WikiGraphChapterMoveOptions,\n ): Promise<ChapterDetails> {\n return await this.#writeDocument(async (document) => {\n const chapterId = await resolveChapterPathReadonly(document, path);\n const [afterChapterId, beforeChapterId, parentChapterId] =\n await Promise.all([\n resolveOptionalChapterPath(document, options.afterPath),\n resolveOptionalChapterPath(document, options.beforePath),\n resolveOptionalChapterPath(document, options.parentPath),\n ]);\n await assertNoActiveBuildJobConflicts({\n archive: this.#location.archiveFile,\n operation: \"Moving chapter\",\n scope: { kind: \"archive\" },\n });\n return await moveChapter(document, chapterId, {\n ...(afterChapterId === undefined ? {} : { afterChapterId }),\n ...(beforeChapterId === undefined ? {} : { beforeChapterId }),\n ...(parentChapterId === undefined ? {} : { parentChapterId }),\n ...(options.first === undefined ? {} : { first: options.first }),\n ...(options.last === undefined ? {} : { last: options.last }),\n ...(options.root === undefined ? {} : { root: options.root }),\n });\n });\n }\n\n public async removeChapter(path: string, recursive = false): Promise<void> {\n await this.#writeDocument(async (document) => {\n const chapterId = await resolveChapterPathReadonly(document, path);\n await assertNoActiveBuildJobConflicts({\n archive: this.#location.archiveFile,\n operation: \"Removing chapter\",\n scope: { kind: \"archive\" },\n });\n await removeChapter(document, chapterId, { recursive });\n });\n }\n\n public async resetChapter(\n path: string,\n stage: WikiGraphChapterResetStage,\n ): Promise<ChapterDetails> {\n return await this.#writeDocument(async (document) => {\n const chapterId = await resolveChapterPathReadonly(document, path);\n await assertChapterResetAllowed(\n this.#location.archiveFile,\n chapterId,\n stage,\n );\n return await resetChapter(document, chapterId, stage);\n });\n }\n\n public async setChapterSource(\n path: string,\n source: string,\n options: WikiGraphChapterSourceOptions = {},\n ): Promise<ChapterDetails> {\n return await this.#writeDocument(async (document) => {\n const chapterId = await resolveChapterPathReadonly(document, path);\n await assertNoActiveBuildJobs({\n archive: this.#location.archiveFile,\n chapterIds: [chapterId],\n operation: \"Setting chapter source\",\n });\n return await setChapterSource(\n document,\n chapterId,\n asTextStream(source),\n options,\n );\n });\n }\n\n public async setChapterSummary(\n path: string,\n summary: string,\n ): Promise<ChapterDetails> {\n return await this.#writeDocument(async (document) => {\n const chapterId = await resolveChapterPathReadonly(document, path);\n await assertNoActiveBuildJobs({\n archive: this.#location.archiveFile,\n chapterIds: [chapterId],\n operation: \"Setting chapter summary\",\n requiresTarget: \"reading-summary\",\n });\n return await setChapterSummary(document, chapterId, summary);\n });\n }\n\n public async setChapterTitle(\n path: string,\n title: Parameters<typeof setChapterTitle>[2],\n ): Promise<ChapterDetails> {\n return await this.#writeDocument(async (document) => {\n const chapterId = await resolveChapterPathReadonly(document, path);\n await assertNoActiveBuildJobs({\n archive: this.#location.archiveFile,\n chapterIds: [chapterId],\n operation: \"Setting chapter title\",\n });\n return await setChapterTitle(document, chapterId, title);\n });\n }\n\n public async getChapterTree(): Promise<ChapterTree> {\n return await this.#readDocument(\n async (document) => await getChapterTree(document),\n );\n }\n\n public async applyChapterTree(\n tree: WikiGraphChapterTreeInput,\n options: { readonly dryRun?: boolean } = {},\n ): Promise<ChapterTreeApplyResult> {\n return await this.#writeDocument(\n async (document) => {\n if (options.dryRun !== true) {\n await assertNoActiveBuildJobConflicts({\n archive: this.#location.archiveFile,\n operation: \"Changing chapter tree\",\n scope: { kind: \"archive\" },\n });\n }\n return await applyChapterTree(document, tree, {\n dryRun: options.dryRun ?? false,\n });\n },\n { refreshLibraryIndex: options.dryRun !== true },\n );\n }\n\n public async page(\n objectUri = this.objectUri,\n options: WikiGraphArchivePageOptions = {},\n ): Promise<ArchivePage> {\n return await this.#runtime.run(\n async () =>\n await withConfiguredWikimediaResolver(\n objectUri,\n async (wikimediaOptions) =>\n await this.#readDocument(\n async (document) =>\n await readArchivePage(document, objectUri, {\n ...options,\n ...wikimediaOptions,\n }),\n options,\n ),\n ),\n options.signal,\n );\n }\n\n public async related(\n objectUri = this.objectUri,\n options: WikiGraphArchiveRelatedOptions = {},\n ): Promise<ArchiveRelatedPage> {\n if (options.query === undefined) {\n if (options.queryMode !== undefined) {\n throw new Error(\"`queryMode` requires `query`.\");\n }\n const result = await this.#readDocument(async (document) => {\n const chapters = await this.#resolveScope(document, {});\n return await listRelatedArchiveObjects(document, objectUri, {\n ...withoutOperation(options),\n ...(chapters === undefined ? {} : { chapters }),\n });\n }, options);\n return createArchiveRelatedPage(\n result,\n async (cursor, nextOptions) =>\n await this.related(objectUri, {\n ...options,\n cursor,\n ...(nextOptions.limit === undefined\n ? {}\n : { limit: nextOptions.limit }),\n ...(nextOptions.signal === undefined\n ? {}\n : { signal: nextOptions.signal }),\n }),\n (cursor) => Promise.resolve(cursor),\n () => Promise.resolve(),\n );\n }\n const embeddingProvider = await this.#resolveQueryEmbeddingProvider(\n options.queryMode,\n options.signal,\n );\n const result = await this.#writeDocument(\n async (document) => {\n const chapters = await this.#resolveQueryChapters(document, options, {\n embeddingProvider,\n });\n await ensureArchiveSearchIndex(document, {\n ...(chapters === undefined ? {} : { chapters }),\n ...(embeddingProvider === undefined ? {} : { embeddingProvider }),\n });\n return await listRelatedArchiveObjects(document, objectUri, {\n ...withoutOperation(options),\n ...(embeddingProvider === undefined ? {} : { embeddingProvider }),\n ...(chapters === undefined ? {} : { chapters }),\n });\n },\n {\n searchIndexWritebackPolicy: \"cache\",\n ...(options.signal === undefined ? {} : { signal: options.signal }),\n },\n );\n return createArchiveRelatedPage(\n result,\n async (cursor, nextOptions) =>\n await this.related(objectUri, {\n ...options,\n cursor,\n ...(nextOptions.limit === undefined\n ? {}\n : { limit: nextOptions.limit }),\n ...(nextOptions.signal === undefined\n ? {}\n : { signal: nextOptions.signal }),\n }),\n (cursor) => Promise.resolve(cursor),\n () => Promise.resolve(),\n );\n }\n\n public async evidence(\n objectUri = this.objectUri,\n options: WikiGraphArchiveEvidenceOptions = {},\n ): Promise<ArchiveEvidencePage> {\n if (options.query === undefined) {\n if (options.queryMode !== undefined) {\n throw new Error(\"`queryMode` requires `query`.\");\n }\n const result = await this.#readDocument(async (document) => {\n const chapters = await this.#resolveScope(document, {});\n return await listArchiveEvidence(document, objectUri, {\n ...withoutOperation(options),\n ...(chapters === undefined ? {} : { chapters }),\n });\n }, options);\n return createArchiveEvidencePage(\n result,\n async (cursor, nextOptions) =>\n await this.evidence(objectUri, {\n ...options,\n cursor,\n ...(nextOptions.limit === undefined\n ? {}\n : { limit: nextOptions.limit }),\n ...(nextOptions.signal === undefined\n ? {}\n : { signal: nextOptions.signal }),\n }),\n (cursor) => Promise.resolve(cursor),\n () => Promise.resolve(),\n );\n }\n const embeddingProvider = await this.#resolveQueryEmbeddingProvider(\n options.queryMode,\n options.signal,\n );\n const result = await this.#writeDocument(\n async (document) => {\n const chapters = await this.#resolveQueryChapters(document, options, {\n embeddingProvider,\n });\n await ensureArchiveSearchIndex(document, {\n ...(chapters === undefined ? {} : { chapters }),\n ...(embeddingProvider === undefined ? {} : { embeddingProvider }),\n });\n return await listArchiveEvidence(document, objectUri, {\n ...withoutOperation(options),\n ...(embeddingProvider === undefined ? {} : { embeddingProvider }),\n ...(chapters === undefined ? {} : { chapters }),\n });\n },\n {\n searchIndexWritebackPolicy: \"cache\",\n ...(options.signal === undefined ? {} : { signal: options.signal }),\n },\n );\n return createArchiveEvidencePage(\n result,\n async (cursor, nextOptions) =>\n await this.evidence(objectUri, {\n ...options,\n cursor,\n ...(nextOptions.limit === undefined\n ? {}\n : { limit: nextOptions.limit }),\n ...(nextOptions.signal === undefined\n ? {}\n : { signal: nextOptions.signal }),\n }),\n (cursor) => Promise.resolve(cursor),\n () => Promise.resolve(),\n );\n }\n\n public async pack(\n objectUri = this.objectUri,\n budget = 5_000,\n options: WikiGraphOperationOptions = {},\n ): Promise<ArchivePack> {\n return await this.#readDocument(\n async (document) => await packArchiveContext(document, objectUri, budget),\n options,\n );\n }\n\n public async getMetadata(\n objectPath: string,\n options: WikiGraphOperationOptions = {},\n ): Promise<Readonly<Record<string, unknown>>> {\n return await this.#readDocument(\n async (document) => await document.metadata.getMap(objectPath),\n options,\n );\n }\n\n public async readBookMeta(\n options: WikiGraphOperationOptions = {},\n ): Promise<BookMeta | undefined> {\n return await this.#readDocument(\n async (document) => await document.readBookMeta(),\n options,\n );\n }\n\n public async replaceBookMeta(\n meta: BookMeta,\n options: WikiGraphArchiveWriteOptions = {},\n ): Promise<BookMeta> {\n return await this.#writeDocument(async (document) => {\n await document.replaceBookMeta(meta);\n return meta;\n }, options);\n }\n\n public async setArchiveTitle(\n title: string | null,\n options: WikiGraphArchiveWriteOptions = {},\n ): Promise<string | null> {\n const normalized = title?.trim() ?? null;\n\n if (title !== null && normalized === \"\") {\n throw new Error(\"Archive title cannot be empty.\");\n }\n return await this.#writeDocument(async (document) => {\n if (normalized === null) {\n await document.metadata.deleteKey(\"\", \"title\");\n } else {\n await document.metadata.put(\n { kind: ObjectMetadataKind.Archive, objectPath: \"\" },\n \"title\",\n normalized,\n );\n }\n return normalized;\n }, options);\n }\n\n public async readCover(\n options: WikiGraphOperationOptions = {},\n ): Promise<WikiGraphArchiveCover | undefined> {\n const app = new WikiGraph({});\n return await this.#runtime.run(\n async () =>\n await app.openSession(\n this.#location.archiveFile,\n async (archive) => await archive.readCover(),\n ),\n options.signal,\n );\n }\n\n public async replaceMetadata(\n objectPath: string,\n value: Readonly<Record<string, unknown>>,\n options: WikiGraphArchiveWriteOptions = {},\n ): Promise<Readonly<Record<string, unknown>>> {\n return await this.#writeDocument(async (document) => {\n await document.metadata.replaceMap(\n parseObjectMetadataTarget(objectPath),\n value,\n );\n return await document.metadata.getMap(objectPath);\n }, options);\n }\n\n public async putMetadata(\n objectPath: string,\n key: string,\n value: unknown,\n options: WikiGraphArchiveWriteOptions = {},\n ): Promise<Readonly<Record<string, unknown>>> {\n return await this.#writeDocument(async (document) => {\n await document.metadata.put(\n parseObjectMetadataTarget(objectPath),\n key,\n value,\n );\n return await document.metadata.getMap(objectPath);\n }, options);\n }\n\n public async deleteMetadata(\n objectPath: string,\n key: string,\n options: WikiGraphArchiveWriteOptions = {},\n ): Promise<Readonly<Record<string, unknown>>> {\n return await this.#writeDocument(async (document) => {\n await document.metadata.deleteKey(objectPath, key);\n return await document.metadata.getMap(objectPath);\n }, options);\n }\n\n public async clearMetadata(\n objectPath: string,\n options: WikiGraphArchiveWriteOptions = {},\n ): Promise<Readonly<Record<string, unknown>>> {\n return await this.#writeDocument(async (document) => {\n await document.metadata.clear(objectPath);\n return await document.metadata.getMap(objectPath);\n }, options);\n }\n\n public async resolveScope(\n options: WikiGraphArchiveScopeOptions & WikiGraphOperationOptions = {},\n ): Promise<WikiGraphArchiveScope | undefined> {\n return await this.#readDocument(\n async (document) =>\n await resolveArchiveScope(document, this.objectUri, options.depth),\n options,\n );\n }\n\n async #readDocument<T>(\n operation: (document: ReadonlyDocument) => Promise<T> | T,\n options: WikiGraphOperationOptions = {},\n ): Promise<T> {\n return await this.#runtime.run(\n async () =>\n await new WikiGraphArchiveFile(this.#location.archiveFile).readDocument(\n operation,\n ),\n options.signal,\n );\n }\n\n async #writeDocument<T>(\n operation: (document: DirectoryDocument) => Promise<T> | T,\n options: WikiGraphArchiveWriteOptions = {},\n ): Promise<T> {\n return await this.#runtime.run(async () => {\n return await writeWikiGraphArchiveLocation(this.#location, operation, {\n ...(options.onIndexSyncError === undefined\n ? {}\n : { onIndexSyncError: options.onIndexSyncError }),\n ...(options.refreshLibraryIndex === undefined\n ? {}\n : { refreshLibraryIndex: options.refreshLibraryIndex }),\n ...(options.searchIndexWritebackPolicy === undefined\n ? {}\n : {\n searchIndexWritebackPolicy: options.searchIndexWritebackPolicy,\n }),\n });\n }, options.signal);\n }\n\n async #resolveScope(\n document: ReadonlyDocument,\n options: WikiGraphArchiveScopeOptions,\n ): Promise<readonly number[] | undefined> {\n if (options.chapters !== undefined) return options.chapters;\n return (await resolveArchiveScope(document, this.objectUri, options.depth))\n ?.chapterIds;\n }\n\n async #resolveQueryChapters(\n document: ReadonlyDocument,\n options: WikiGraphArchiveScopeOptions & {\n readonly queryMode?: SearchIndexQueryMode;\n readonly skipUnindexed?: boolean;\n },\n capabilities: {\n readonly embeddingProvider: SearchIndexEmbeddingProvider | undefined;\n },\n ): Promise<readonly number[] | undefined> {\n const chapters = await this.#resolveScope(document, options);\n const coverageOptions = {\n ...(chapters === undefined ? {} : { chapters }),\n ...(capabilities.embeddingProvider === undefined\n ? {}\n : { embeddingProvider: capabilities.embeddingProvider }),\n requireEmbeddingProvider: true,\n ...(options.queryMode === undefined\n ? {}\n : { queryMode: options.queryMode }),\n };\n if (options.skipUnindexed !== true) {\n await assertArchiveIndexArtifactsReady(document, coverageOptions);\n return chapters;\n }\n const queryable = await listArchiveQueryableChapterIds(document, {\n ...coverageOptions,\n });\n if (queryable.length === 0) {\n throw new Error(\n \"Wiki Graph query is not ready. No chapters in this scope have a current FTS artifact or source embedding artifact.\",\n );\n }\n return queryable;\n }\n\n async #resolveQueryEmbeddingProvider(\n queryMode: SearchIndexQueryMode | undefined,\n signal: AbortSignal | undefined,\n ): Promise<SearchIndexEmbeddingProvider | undefined> {\n if (queryMode === \"fts\") return undefined;\n const provider = await this.#runtime.run(\n createConfiguredEmbeddingProvider,\n signal,\n );\n if (queryMode === \"embedding\" && provider === undefined) {\n throw new Error(\n \"Embedding query mode requires embeddings configuration at `wikg://local/config/embeddings`.\",\n );\n }\n return provider;\n }\n}\n\nasync function ensureArchiveSearchIndex(\n document: DirectoryDocument,\n options: {\n readonly chapters?: readonly number[];\n readonly embeddingProvider?: SearchIndexEmbeddingProvider;\n } = {},\n): Promise<void> {\n const scope =\n options.chapters === undefined ? {} : { chapters: options.chapters };\n if (await isArchiveSearchIndexCurrent(document, scope)) return;\n await rebuildArchiveSearchIndex(document, undefined, {\n ...scope,\n ...(options.embeddingProvider === undefined\n ? {}\n : { embeddingProvider: options.embeddingProvider }),\n });\n}\n\nasync function resolveArchiveScope(\n document: ReadonlyDocument,\n objectUri: string,\n depth: number | undefined,\n): Promise<WikiGraphArchiveScope | undefined> {\n const parsed = parseChapterScopePath(objectUri);\n if (\n parsed === undefined ||\n (parsed.kind === \"collection\" && depth === undefined)\n ) {\n return undefined;\n }\n const chapters = await listChapters(document);\n const entries =\n parsed.kind === \"collection\"\n ? chapters.filter((chapter) => chapter.depth <= depth!)\n : selectChapterSubtree(\n chapters,\n await resolveChapterPathReadonly(document, parsed.chapterPath),\n depth,\n );\n return { chapterIds: entries.map((entry) => entry.chapterId), entries };\n}\n\nfunction parseChapterScopePath(\n objectUri: string,\n):\n | { readonly kind: \"collection\" }\n | { readonly chapterPath: string; readonly kind: \"chapter\" }\n | undefined {\n if (objectUri === \"wikg://chapter\" || objectUri === \"wikg://chapter/\") {\n return { kind: \"collection\" };\n }\n const match = /^wikg:\\/\\/chapter\\/([^/].*?)(?:\\/)?$/u.exec(objectUri);\n return match?.[1] === undefined\n ? undefined\n : { chapterPath: decodeURIComponent(match[1]), kind: \"chapter\" };\n}\n\nfunction selectChapterSubtree(\n chapters: readonly ChapterEntry[],\n rootChapterId: number,\n depth: number | undefined,\n): readonly ChapterEntry[] {\n const root = chapters.find((chapter) => chapter.chapterId === rootChapterId);\n if (root === undefined) {\n throw new Error(`Chapter ${rootChapterId} does not exist.`);\n }\n const prefix = `${root.path}/`;\n return chapters.filter(\n (chapter) =>\n chapter.chapterId === root.chapterId ||\n (chapter.path.startsWith(prefix) &&\n (depth === undefined || chapter.depth - root.depth <= depth)),\n );\n}\n\nasync function createEmptyArchiveFile(path: string): Promise<void> {\n const directoryPath = await mkdtemp(\n join(tmpdir(), \"wikigraph-archive-write-\"),\n );\n try {\n const directory = new NodeDirectory(directoryPath);\n const document = await DirectoryDocument.open(directory);\n try {\n await document.openSession(async (openedDocument) => {\n await openedDocument.writeToc({ items: [], version: TOC_FILE_VERSION });\n });\n } finally {\n await document.release();\n }\n await writeWikgArchive(directory, new NodeFile(path));\n } finally {\n await rm(directoryPath, { force: true, recursive: true });\n }\n}\n\nfunction isNodeEEXISTError(error: unknown): error is NodeJS.ErrnoException {\n return (\n error instanceof Error &&\n \"code\" in error &&\n (error as NodeJS.ErrnoException).code === \"EEXIST\"\n );\n}\n\nasync function nodePathExists(path: string): Promise<boolean> {\n try {\n await stat(path);\n return true;\n } catch (error) {\n if (isNodeENOENTError(error)) return false;\n throw error;\n }\n}\n\nfunction isNodeENOENTError(error: unknown): error is NodeJS.ErrnoException {\n return (\n error instanceof Error &&\n \"code\" in error &&\n (error as NodeJS.ErrnoException).code === \"ENOENT\"\n );\n}\n\nfunction parseObjectMetadataTarget(objectPath: string): ObjectMetadataTarget {\n if (objectPath === \"\") {\n return { kind: ObjectMetadataKind.Archive, objectPath };\n }\n const chapter = /^chapter\\/([1-9][0-9]*)(?:\\/.*)?$/u.exec(objectPath);\n if (chapter?.[1] !== undefined) {\n return {\n chapterId: Number(chapter[1]),\n kind: ObjectMetadataKind.Chapter,\n objectPath,\n };\n }\n const chunk = /^chunk\\/([1-9][0-9]*)$/u.exec(objectPath);\n if (chunk?.[1] !== undefined) {\n return {\n chunkId: Number(chunk[1]),\n kind: ObjectMetadataKind.Chunk,\n objectPath,\n };\n }\n const entity = /^entity\\/(Q[1-9][0-9]*)$/u.exec(objectPath);\n if (entity?.[1] !== undefined) {\n return {\n entityQid: entity[1],\n kind: ObjectMetadataKind.Entity,\n objectPath,\n };\n }\n const triple = /^triple\\/(Q[1-9][0-9]*)\\/([^/]+)\\/(Q[1-9][0-9]*)$/u.exec(\n objectPath,\n );\n if (triple?.[1] !== undefined) {\n return {\n kind: ObjectMetadataKind.Triple,\n objectPath,\n tripleObjectQid: triple[3]!,\n triplePredicate: decodeURIComponent(triple[2]!),\n tripleSubjectQid: triple[1],\n };\n }\n return { kind: ObjectMetadataKind.Object, objectPath };\n}\n\nfunction withoutOperation<T extends WikiGraphOperationOptions>(\n options: T,\n): Omit<T, \"signal\"> {\n const { signal: _signal, ...rest } = options;\n return rest;\n}\n\nfunction withoutOperationAndScope<\n T extends WikiGraphOperationOptions & WikiGraphArchiveScopeOptions,\n>(options: T): Omit<T, \"chapters\" | \"depth\" | \"signal\"> {\n const {\n chapters: _chapters,\n depth: _depth,\n signal: _signal,\n ...rest\n } = options;\n return rest;\n}\n\nasync function resolveOptionalChapterPath(\n document: ReadonlyDocument,\n path: string | undefined,\n): Promise<number | undefined> {\n return path === undefined\n ? undefined\n : await resolveChapterPathReadonly(document, path);\n}\n\nfunction requireChapter(\n chapters: readonly ChapterEntry[],\n chapterId: number,\n): ChapterEntry {\n const chapter = chapters.find((entry) => entry.chapterId === chapterId);\n if (chapter === undefined) {\n throw new Error(`Chapter internal id ${chapterId} does not exist.`);\n }\n return chapter;\n}\n\nfunction asTextStream(text: string): AsyncIterable<string> {\n return Readable.from([text]);\n}\n\nasync function assertChapterResetAllowed(\n archive: File,\n chapterId: number,\n stage: WikiGraphChapterResetStage,\n): Promise<void> {\n if (stage === \"planned\") {\n await assertNoActiveBuildJobs({\n archive,\n chapterIds: [chapterId],\n operation: \"Resetting chapter to planned\",\n });\n return;\n }\n if (stage === \"sourced\") {\n await assertNoActiveBuildJobs({\n archive,\n chapterIds: [chapterId],\n operation: \"Resetting chapter graph\",\n requiresTarget: \"reading-graph\",\n });\n }\n await assertNoActiveBuildJobs({\n archive,\n chapterIds: [chapterId],\n operation: \"Resetting chapter summary\",\n requiresTarget: \"reading-summary\",\n });\n}\n","import { createHash } from \"crypto\";\nimport { createReadStream } from \"fs\";\nimport { rm } from \"fs/promises\";\nimport { basename } from \"path\";\n\nimport {\n WikiGraph,\n type ChapterStage,\n type WikiGraphArchive,\n type WikiGraphProgressCallback,\n type SourceArtifactInput,\n} from \"wiki-graph-core\";\n\nimport { buildWikiGraphLLMOptions } from \"./llm.js\";\nimport { NodeDirectory, NodeFile } from \"./node-platform.js\";\nimport { loadWikiGraphRuntimeConfig } from \"./runtime-config.js\";\nimport { resolveWikiGraphLLMJSON } from \"./providers.js\";\nimport type { WikiGraphLLMConfig } from \"./runtime-config.js\";\nimport { getWikiGraphSDKProviders } from \"./runtime-context.js\";\nimport type { WikiGraphJobRuntime } from \"./jobs.js\";\nimport { resolveWikiGraphRuntimePath } from \"./runtime-path.js\";\nimport { assertStandaloneWikiGraphArchivePath } from \"./archive/target.js\";\n\nexport type WikiGraphConversionFormat =\n | \"epub\"\n | \"markdown\"\n | \"pcex\"\n | \"txt\"\n | \"wikg\";\nexport type WikiGraphSourceFormat = Exclude<WikiGraphConversionFormat, \"wikg\">;\n\nexport type WikiGraphConversionInput =\n | {\n readonly format: Exclude<WikiGraphConversionFormat, \"pcex\">;\n readonly path: string;\n }\n | {\n readonly format: \"pcex\";\n readonly path: string;\n readonly sourcePdf: { readonly digest: string; readonly name?: string };\n }\n | {\n readonly format: Extract<WikiGraphSourceFormat, \"markdown\" | \"txt\">;\n readonly stream: AsyncIterable<string> | Iterable<string>;\n };\n\nexport interface WikiGraphConversionOptions {\n readonly digestDirectory?: string;\n readonly input: WikiGraphConversionInput;\n readonly llm?: WikiGraphLLMConfig;\n /** @deprecated Prefer the typed llm option. */\n readonly llmJSON?: string;\n readonly onProgress?: WikiGraphProgressCallback;\n readonly onSourceImported?: () => void | Promise<void>;\n readonly output: {\n readonly format: WikiGraphConversionFormat;\n readonly path: string;\n };\n readonly prompt?: string;\n readonly targetStage?: ChapterStage;\n readonly verbose?: boolean;\n}\n\nexport interface WikiGraphConversionResult {\n readonly chapterCount?: number;\n readonly chapterPaths?: readonly string[];\n readonly inputFormat: WikiGraphConversionFormat;\n readonly outputFormat: WikiGraphConversionFormat;\n readonly outputPath: string;\n readonly sourceArtifact?: SourceArtifactInput;\n}\n\nexport class WikiGraphConversionManager {\n readonly #runtime: WikiGraphJobRuntime;\n\n public constructor(runtime: WikiGraphJobRuntime) {\n this.#runtime = runtime;\n }\n\n public async convert(\n options: WikiGraphConversionOptions,\n ): Promise<WikiGraphConversionResult> {\n return await this.#runtime.run(async () => await this.#convert(options));\n }\n\n async #convert(\n options: WikiGraphConversionOptions,\n ): Promise<WikiGraphConversionResult> {\n const targetStage = options.targetStage ?? \"summarized\";\n if (options.targetStage !== undefined && options.output.format !== \"wikg\") {\n throw new Error(\"targetStage is only supported for wikg output.\");\n }\n if (options.output.format === \"pcex\") {\n throw new Error(\"pcex is supported only as a conversion input.\");\n }\n if (options.targetStage !== undefined && options.input.format === \"wikg\") {\n throw new Error(\n \"targetStage is only supported when creating a wikg archive.\",\n );\n }\n\n const requiresDigest = options.input.format !== \"wikg\";\n const requiresLLM =\n requiresDigest && targetStage !== \"planned\" && targetStage !== \"sourced\";\n const llmJSON = resolveWikiGraphLLMJSON(options);\n const injectedLLM =\n llmJSON === undefined ? getWikiGraphSDKProviders().llm : undefined;\n const config = await loadWikiGraphRuntimeConfig({\n ...(llmJSON === undefined ? {} : { llmJSON }),\n ...(injectedLLM === undefined ? {} : { skipLLMConfig: true }),\n ...(getWikiGraphSDKProviders().embedding === undefined\n ? {}\n : { skipEmbeddingConfig: true }),\n });\n const app = new WikiGraph({\n ...(options.verbose === true ? { verbose: true } : {}),\n ...(requiresLLM\n ? {\n llm:\n injectedLLM === undefined\n ? buildWikiGraphLLMOptions(config)\n : { streamProvider: injectedLLM },\n }\n : {}),\n });\n const documentDirectory = await prepareDigestDirectory(\n options.digestDirectory,\n requiresDigest,\n );\n let chapterCount: number | undefined;\n let chapterPaths: readonly string[] | undefined;\n const write = async (archive: WikiGraphArchive): Promise<void> => {\n if (requiresDigest) await options.onSourceImported?.();\n if (typeof archive.readToc === \"function\") {\n const toc = await archive.readToc();\n chapterCount =\n toc === undefined ? undefined : countTocChapters(toc.items);\n if (options.output.format === \"wikg\") {\n chapterPaths =\n toc === undefined ? [] : collectTocChapterPaths(toc.items);\n }\n }\n await writeArchive(archive, options.output.path, options.output.format);\n };\n\n if (options.input.format === \"wikg\") {\n if (!(\"path\" in options.input)) {\n throw new Error(\"wikg input requires a file path.\");\n }\n await app.openSession(\n new NodeFile(\n await assertStandaloneWikiGraphArchivePath(options.input.path),\n ),\n write,\n );\n } else if (\"stream\" in options.input) {\n await app.digestTextStreamSession(\n {\n ...(documentDirectory === undefined ? {} : { documentDirectory }),\n ...(options.onProgress === undefined\n ? {}\n : { onProgress: options.onProgress }),\n sourceFormat: options.input.format,\n stream: options.input.stream,\n ...((options.prompt ?? config.prompt) === undefined\n ? {}\n : { extractionPrompt: options.prompt ?? config.prompt }),\n targetStage,\n },\n write,\n );\n } else {\n const digestOptions = {\n ...(documentDirectory === undefined ? {} : { documentDirectory }),\n file: new NodeFile(resolveWikiGraphRuntimePath(options.input.path)),\n ...(options.onProgress === undefined\n ? {}\n : { onProgress: options.onProgress }),\n ...((options.prompt ?? config.prompt) === undefined\n ? {}\n : { extractionPrompt: options.prompt ?? config.prompt }),\n targetStage,\n };\n if (options.input.format === \"epub\") {\n await app.digestEpubSession(digestOptions, write);\n } else if (options.input.format === \"pcex\") {\n await app.digestPcexSession(\n {\n ...digestOptions,\n pdfDigest: options.input.sourcePdf.digest,\n ...(options.input.sourcePdf.name === undefined\n ? {}\n : { pdfName: options.input.sourcePdf.name }),\n },\n write,\n );\n } else if (options.input.format === \"markdown\") {\n await app.digestMarkdownSession(digestOptions, write);\n } else {\n await app.digestTxtSession(digestOptions, write);\n }\n }\n\n const sourceArtifact = await resolveSourceArtifact(options.input);\n return {\n ...(chapterCount === undefined ? {} : { chapterCount }),\n ...(chapterPaths === undefined ? {} : { chapterPaths }),\n inputFormat: options.input.format,\n outputFormat: options.output.format,\n outputPath: options.output.path,\n ...(sourceArtifact === undefined ? {} : { sourceArtifact }),\n };\n }\n}\n\nasync function prepareDigestDirectory(\n path: string | undefined,\n required: boolean,\n): Promise<NodeDirectory | undefined> {\n const normalized = path?.trim();\n if (!required || normalized === undefined || normalized === \"\")\n return undefined;\n const resolved = resolveWikiGraphRuntimePath(normalized);\n await rm(resolved, { force: true, recursive: true });\n return new NodeDirectory(resolved);\n}\n\nasync function writeArchive(\n archive: WikiGraphArchive,\n path: string,\n format: WikiGraphConversionFormat,\n): Promise<void> {\n const outputPath =\n format === \"wikg\"\n ? await assertStandaloneWikiGraphArchivePath(path)\n : resolveWikiGraphRuntimePath(path);\n const file = new NodeFile(outputPath);\n if (format === \"epub\") await archive.exportEpub(file);\n else if (format === \"wikg\") await archive.saveAs(file);\n else if (format === \"pcex\") throw new Error(\"pcex output is not supported.\");\n else await archive.exportText(file);\n}\n\nasync function resolveSourceArtifact(\n input: WikiGraphConversionInput,\n): Promise<SourceArtifactInput | undefined> {\n if (!(\"path\" in input) || input.format === \"wikg\") return undefined;\n if (input.format === \"pcex\") {\n return {\n digest: input.sourcePdf.digest.trim().toLowerCase(),\n mediaType: \"application/pdf\",\n ...(input.sourcePdf.name === undefined\n ? {}\n : { name: input.sourcePdf.name }),\n };\n }\n if (input.format !== \"epub\") return undefined;\n const path = resolveWikiGraphRuntimePath(input.path);\n const hash = createHash(\"sha256\");\n try {\n for await (const chunk of createReadStream(path)) {\n hash.update(chunk as Buffer);\n }\n } catch (error) {\n if (isNodeErrorCode(error, \"ENOENT\")) return undefined;\n throw error;\n }\n return {\n digest: hash.digest(\"hex\"),\n mediaType: \"application/epub+zip\",\n name: basename(path),\n };\n}\n\nfunction isNodeErrorCode(error: unknown, code: string): boolean {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === code\n );\n}\n\nfunction countTocChapters(\n items: readonly {\n readonly children: readonly unknown[];\n readonly serialId?: number | undefined;\n }[],\n): number {\n let count = 0;\n for (const item of items) {\n if (item.serialId !== undefined) count += 1;\n count += countTocChapters(\n item.children as readonly {\n readonly children: readonly unknown[];\n readonly serialId?: number | undefined;\n }[],\n );\n }\n return count;\n}\n\nfunction collectTocChapterPaths(\n items: readonly {\n readonly children: readonly unknown[];\n readonly key?: string | undefined;\n readonly serialId?: number | undefined;\n }[],\n ancestorKeys: readonly string[] = [],\n): readonly string[] {\n const paths: string[] = [];\n for (const item of items) {\n const key = item.key ?? `chapter-${item.serialId ?? \"group\"}`;\n const chapterPath = [...ancestorKeys, key];\n if (item.serialId !== undefined) paths.push(chapterPath.join(\"/\"));\n paths.push(\n ...collectTocChapterPaths(\n item.children as readonly {\n readonly children: readonly unknown[];\n readonly key?: string | undefined;\n readonly serialId?: number | undefined;\n }[],\n chapterPath,\n ),\n );\n }\n return paths;\n}\n","import type { WikiGraphLLMOptions } from \"wiki-graph-core\";\n\nimport { createAnthropic } from \"@ai-sdk/anthropic\";\nimport { createGoogleGenerativeAI } from \"@ai-sdk/google\";\nimport { createOpenAI } from \"@ai-sdk/openai\";\nimport { createOpenAICompatible } from \"@ai-sdk/openai-compatible\";\n\nimport type {\n WikiGraphProvider,\n WikiGraphRuntimeConfig,\n} from \"./runtime-config.js\";\n\nexport function buildWikiGraphLLMOptions(\n config: WikiGraphRuntimeConfig,\n): WikiGraphLLMOptions {\n const llm = config.llm;\n\n if (llm?.provider === undefined || llm.model === undefined) {\n throw new Error(\n \"Missing LLM configuration. Set --llm for one run, or configure `wikg://local/config/llm` with provider and model.\",\n );\n }\n\n return {\n model: createLanguageModel(llm.provider, llm.model, {\n apiKey: llm.apiKey,\n baseURL: llm.baseURL,\n name: llm.name,\n }),\n ...(config.concurrent?.request === undefined\n ? {}\n : { concurrent: config.concurrent.request }),\n };\n}\n\nfunction createLanguageModel(\n provider: WikiGraphProvider,\n model: string,\n options: {\n readonly apiKey: string | undefined;\n readonly baseURL: string | undefined;\n readonly name: string | undefined;\n },\n) {\n switch (provider) {\n case \"anthropic\": {\n const anthropic = createAnthropic({\n ...(options.apiKey === undefined ? {} : { apiKey: options.apiKey }),\n ...(options.name === undefined ? {} : { name: options.name }),\n });\n\n return anthropic(model);\n }\n case \"google\": {\n const google = createGoogleGenerativeAI({\n ...(options.apiKey === undefined ? {} : { apiKey: options.apiKey }),\n ...(options.name === undefined ? {} : { name: options.name }),\n });\n\n return google(model);\n }\n case \"openai\": {\n if (options.baseURL !== undefined) {\n throw new Error(\n \"openai does not accept llm.baseURL or baseURL in --llm JSON. Use openai-compatible for third-party OpenAI-style APIs.\",\n );\n }\n\n const openai = createOpenAI({\n ...(options.apiKey === undefined ? {} : { apiKey: options.apiKey }),\n ...(options.name === undefined ? {} : { name: options.name }),\n });\n\n return openai(model);\n }\n case \"openai-compatible\": {\n if (options.baseURL === undefined) {\n throw new Error(\n \"openai-compatible requires llm.baseURL or baseURL in --llm JSON.\",\n );\n }\n\n const openaiCompatible = createOpenAICompatible({\n baseURL: options.baseURL,\n name: options.name ?? createOpenAICompatibleName(options.baseURL),\n ...(options.apiKey === undefined ? {} : { apiKey: options.apiKey }),\n });\n\n return openaiCompatible(model);\n }\n }\n}\n\nfunction createOpenAICompatibleName(baseURL: string): string {\n try {\n return new URL(baseURL).hostname;\n } catch {\n return \"openai-compatible\";\n }\n}\n","/* eslint-disable no-restricted-syntax, @typescript-eslint/parameter-properties */\nimport * as asyncHooks from \"node:async_hooks\";\nimport * as crypto from \"node:crypto\";\nimport * as fs from \"node:fs\";\nimport * as fsPromises from \"node:fs/promises\";\nimport * as os from \"node:os\";\nimport * as pathModule from \"node:path\";\nimport * as process from \"node:process\";\nimport { Readable, Writable } from \"node:stream\";\nimport { pipeline } from \"node:stream/promises\";\nimport * as sqlite3 from \"sqlite3\";\nimport * as yauzl from \"yauzl\";\nimport * as yazl from \"yazl\";\nimport { Environment, Loader, type LoaderSource } from \"nunjucks\";\n\nconst nodeProcess =\n (process as unknown as { default?: typeof process }).default ?? process;\nconst nodeSqlite3 =\n (sqlite3 as unknown as { default?: typeof sqlite3 }).default ?? sqlite3;\n\nimport {\n getWikiGraphPlatform,\n getWikiGraphStorage,\n installWikiGraphPlatform,\n installWikiGraphStorage,\n withWikiGraphStorage,\n type Directory,\n type File,\n type FileReader,\n type ReadonlyFile,\n type FileWriter,\n type HostDatabaseConnection,\n type HostDatabaseOpenOptions,\n type HostDatabaseRow,\n type HostDatabaseValue,\n type HostLifecycleProvider,\n type HostZipWriteEntry,\n type HostZipReader,\n type WikiGraphPlatform,\n type WikiGraphStorage,\n normalizeTemplateName,\n} from \"wiki-graph-core/platform\";\n\n/** Stable across independently bundled SDK entry points. */\nconst NODE_RESOURCE_KIND = Symbol.for(\"wiki-graph-sdk.node-resource.v1\");\n\n/** Install the Node implementation used by the CLI and its workers. */\nexport class NodeFile implements File {\n public readonly kind = \"file\" as const;\n public readonly [NODE_RESOURCE_KIND] = \"file\" as const;\n public readonly identity: string;\n public readonly name: string;\n\n public constructor(\n public readonly path: string,\n name = pathModule.basename(path),\n ) {\n this.identity = encodeNodeResourceIdentity(\"file\", path);\n this.name = name;\n }\n\n public async openReader(): Promise<FileReader> {\n const handle = await fsPromises.open(this.path, \"r\");\n let closed = false;\n try {\n const stats = await handle.stat();\n if (!stats.isFile())\n throw new Error(\"File reader requires a regular file\");\n const { size } = stats;\n return {\n size,\n close: async () => {\n if (!closed) await handle.close();\n closed = true;\n },\n read: async (offset, length) => {\n if (closed) throw new Error(\"Cannot read from a closed FileReader\");\n assertFileRange(offset, length, size);\n const buffer = Buffer.allocUnsafe(length);\n let bytesRead = 0;\n while (bytesRead < length) {\n const result = await handle.read(\n buffer,\n bytesRead,\n length - bytesRead,\n offset + bytesRead,\n );\n if (result.bytesRead === 0) {\n throw new Error(\"File changed while reading its byte range\");\n }\n bytesRead += result.bytesRead;\n }\n return new Uint8Array(buffer.buffer, buffer.byteOffset, bytesRead);\n },\n };\n } catch (error) {\n await handle.close();\n throw error;\n }\n }\n\n public async getLastModified(): Promise<number | undefined> {\n try {\n return (await fsPromises.stat(this.path)).mtimeMs;\n } catch (error) {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n ) {\n return undefined;\n }\n throw error;\n }\n }\n\n public async openWriter(): Promise<FileWriter> {\n await fsPromises.mkdir(pathModule.dirname(this.path), { recursive: true });\n const temporary = `${this.path}.tmp-${crypto.randomUUID()}`;\n const handle = await fsPromises.open(temporary, \"wx\");\n let closed = false;\n return {\n write: async (data) => {\n if (closed) throw new Error(\"Cannot write to a closed FileWriter\");\n await writeNodeFileHandle(handle, data);\n },\n writeAt: async (offset, data) => {\n if (closed) throw new Error(\"Cannot write to a closed FileWriter\");\n assertFileOffset(offset);\n await writeNodeFileHandle(handle, data, offset);\n },\n commit: async () => {\n if (!closed) {\n await handle.close();\n await fsPromises.rename(temporary, this.path);\n }\n closed = true;\n },\n abort: async () => {\n if (!closed) {\n await handle.close();\n await fsPromises.rm(temporary, { force: true });\n }\n closed = true;\n },\n };\n }\n}\n\n/** @internal Completes writes even when the Node file handle reports a short write. */\nexport async function writeNodeFileHandle(\n handle: Pick<fsPromises.FileHandle, \"write\">,\n data: Uint8Array | string,\n position?: number,\n): Promise<void> {\n const buffer = Buffer.from(data);\n let written = 0;\n while (written < buffer.byteLength) {\n const result = await handle.write(\n buffer,\n written,\n buffer.byteLength - written,\n position === undefined ? null : position + written,\n );\n if (result.bytesWritten === 0) {\n throw new Error(\"File writer made no progress\");\n }\n written += result.bytesWritten;\n }\n}\n\nfunction assertFileRange(offset: number, length: number, size: number): void {\n assertFileOffset(offset);\n if (!Number.isSafeInteger(length) || length < 0) {\n throw new RangeError(\n \"File read length must be a non-negative safe integer\",\n );\n }\n if (offset > size || length > size - offset) {\n throw new RangeError(\"File read range exceeds the file size\");\n }\n}\n\nfunction assertFileOffset(offset: number): void {\n if (!Number.isSafeInteger(offset) || offset < 0) {\n throw new RangeError(\"File offset must be a non-negative safe integer\");\n }\n}\n\nexport class NodeDirectory implements Directory {\n public readonly kind = \"directory\" as const;\n public readonly [NODE_RESOURCE_KIND] = \"directory\" as const;\n public readonly identity: string;\n public readonly name: string;\n\n public constructor(public readonly path: string) {\n this.identity = encodeNodeResourceIdentity(\"directory\", path);\n this.name = pathModule.basename(path);\n }\n\n public async getFile(name: string): Promise<File | undefined> {\n assertChildName(name);\n const file = new NodeFile(pathModule.join(this.path, name));\n try {\n return (await fsPromises.stat(file.path)).isFile() ? file : undefined;\n } catch {\n return undefined;\n }\n }\n\n public async getLastModified(): Promise<number | undefined> {\n try {\n return (await fsPromises.stat(this.path)).mtimeMs;\n } catch (error) {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n ) {\n return undefined;\n }\n throw error;\n }\n }\n\n public async getDirectory(name: string): Promise<Directory | undefined> {\n assertChildName(name);\n const directory = new NodeDirectory(pathModule.join(this.path, name));\n try {\n return (await fsPromises.stat(directory.path)).isDirectory()\n ? directory\n : undefined;\n } catch {\n return undefined;\n }\n }\n\n public async list(): Promise<ReadonlyArray<File | Directory>> {\n const entries = await fsPromises.readdir(this.path, {\n withFileTypes: true,\n });\n return entries.map((entry) =>\n entry.isDirectory()\n ? new NodeDirectory(pathModule.join(this.path, entry.name))\n : new NodeFile(pathModule.join(this.path, entry.name), entry.name),\n );\n }\n\n public async createFile(name: string): Promise<File> {\n assertChildName(name);\n await fsPromises.mkdir(this.path, { recursive: true });\n const file = new NodeFile(pathModule.join(this.path, name));\n await fsPromises.writeFile(file.path, \"\", { flag: \"wx\" });\n return file;\n }\n\n public async createDirectory(name: string): Promise<Directory> {\n assertChildName(name);\n await fsPromises.mkdir(this.path, { recursive: true });\n const directory = new NodeDirectory(pathModule.join(this.path, name));\n await fsPromises.mkdir(directory.path);\n return directory;\n }\n\n public async remove(\n name: string,\n options?: { readonly recursive?: boolean },\n ): Promise<void> {\n assertChildName(name);\n await fsPromises.rm(pathModule.join(this.path, name), {\n force: true,\n recursive: options?.recursive === true,\n });\n }\n}\n\nfunction encodeNodeResourceIdentity(\n kind: \"directory\" | \"file\",\n path: string,\n): string {\n return `node-${kind}:${Buffer.from(pathModule.resolve(path), \"utf8\").toString(\"base64url\")}`;\n}\n\nfunction decodeNodeResourceIdentity(\n identity: string,\n kind: \"directory\" | \"file\",\n): string | undefined {\n const prefix = `node-${kind}:`;\n if (!identity.startsWith(prefix)) {\n // State created before opaque resource identities stored native paths.\n return pathModule.isAbsolute(identity) ? identity : undefined;\n }\n try {\n return Buffer.from(identity.slice(prefix.length), \"base64url\").toString(\n \"utf8\",\n );\n } catch {\n return undefined;\n }\n}\n\nexport function getNodeResourcePath(resource: File | Directory): string {\n const brandedPath = getBrandedNodeResourcePath(resource, resource.kind);\n if (brandedPath !== undefined) return brandedPath;\n if (\n typeof resource === \"object\" &&\n resource !== null &&\n \"path\" in resource &&\n typeof resource.path === \"string\"\n ) {\n return resource.path;\n }\n throw new TypeError(\"Expected a Node File or Directory resource\");\n}\n\nfunction assertChildName(name: string): void {\n if (\n name.length === 0 ||\n name === \".\" ||\n name === \"..\" ||\n pathModule.isAbsolute(name) ||\n name.includes(\"/\") ||\n name.includes(\"\\\\\")\n ) {\n throw new TypeError(`Directory child must be a relative name: ${name}`);\n }\n}\n\nclass NodeDatabaseConnection implements HostDatabaseConnection {\n public constructor(private readonly database: sqlite3.Database) {}\n\n public async close(): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n this.database.close((error) => {\n if (error) reject(error);\n else resolve();\n });\n });\n }\n\n public async execute(sql: string): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n this.database.exec(sql, (error) => {\n if (error) reject(error);\n else resolve();\n });\n });\n }\n\n public async queryAll(\n sql: string,\n params: readonly HostDatabaseValue[] = [],\n ): Promise<readonly HostDatabaseRow[]> {\n return await new Promise((resolve, reject) => {\n this.database.all(sql, [...params], (error, rows: HostDatabaseRow[]) => {\n if (error) reject(error);\n else resolve(rows);\n });\n });\n }\n\n public async queryOne(\n sql: string,\n params: readonly HostDatabaseValue[] = [],\n ): Promise<HostDatabaseRow | undefined> {\n return await new Promise((resolve, reject) => {\n this.database.get(sql, [...params], (error, row: HostDatabaseRow) => {\n if (error) reject(error);\n else resolve(row);\n });\n });\n }\n\n public async run(\n sql: string,\n params: readonly HostDatabaseValue[] = [],\n ): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n this.database.run(sql, [...params], (error) => {\n if (error) reject(error);\n else resolve();\n });\n });\n }\n}\n\nasync function openNodeDatabase(\n file: ReadonlyFile,\n options: HostDatabaseOpenOptions,\n): Promise<NodeDatabaseConnection> {\n const flags =\n (options.mode === \"readonly\"\n ? nodeSqlite3.OPEN_READONLY\n : nodeSqlite3.OPEN_READWRITE |\n (options.create ? nodeSqlite3.OPEN_CREATE : 0)) |\n nodeSqlite3.OPEN_FULLMUTEX;\n return new NodeDatabaseConnection(await openNativeNodeDatabase(file, flags));\n}\n\nasync function openNativeNodeDatabase(\n file: ReadonlyFile,\n flags: number,\n): Promise<sqlite3.Database> {\n const path = getBrandedNodeResourcePath(file, \"file\");\n if (path === undefined) {\n throw new TypeError(\"The Node database adapter requires a NodeFile\");\n }\n return await new Promise((resolve, reject) => {\n const database = new nodeSqlite3.Database(path, flags, (error) => {\n if (error) reject(error);\n else resolve(database);\n });\n });\n}\n\nasync function openNodeZip(file: ReadonlyFile): Promise<HostZipReader> {\n const path = getBrandedNodeResourcePath(file, \"file\");\n if (path === undefined) {\n throw new TypeError(\"The Node ZIP adapter requires a NodeFile\");\n }\n const zipFile = await new Promise<yauzl.ZipFile>((resolve, reject) => {\n yauzl.open(\n path,\n { autoClose: false, lazyEntries: true },\n (error, opened) => {\n if (error || opened === undefined)\n reject(error ?? new Error(\"Cannot open ZIP\"));\n else resolve(opened);\n },\n );\n });\n\n const entries = await new Promise<Map<string, yauzl.Entry>>(\n (resolve, reject) => {\n const discovered = new Map<string, yauzl.Entry>();\n const rejectAndClose = (error: unknown) => {\n zipFile.close();\n reject(\n error instanceof Error\n ? error\n : new Error(\"Cannot scan ZIP central directory\"),\n );\n };\n const resolveEntries = () => {\n zipFile.off(\"error\", rejectAndClose);\n resolve(discovered);\n };\n zipFile.on(\"entry\", (entry: yauzl.Entry) => {\n if (!entry.fileName.endsWith(\"/\")) {\n discovered.set(entry.fileName, entry);\n }\n zipFile.readEntry();\n });\n zipFile.once(\"error\", rejectAndClose);\n zipFile.once(\"end\", resolveEntries);\n zipFile.readEntry();\n },\n );\n\n let closed = false;\n return {\n close: () => {\n if (!closed) zipFile.close();\n closed = true;\n return Promise.resolve();\n },\n copyEntry: async (name, target) => {\n if (closed) throw new Error(\"Cannot read a closed ZIP archive\");\n const entry = entries.get(name);\n if (entry === undefined) return false;\n await copyNodeZipEntry(zipFile, entry, target);\n return true;\n },\n getEntrySize: (name) => {\n if (closed) throw new Error(\"Cannot read a closed ZIP archive\");\n return Promise.resolve(entries.get(name)?.uncompressedSize);\n },\n listEntries: () => Promise.resolve([...entries.keys()]),\n readEntryRange: async (name, offset, length) => {\n if (closed) throw new Error(\"Cannot read a closed ZIP archive\");\n const entry = entries.get(name);\n if (entry === undefined) return undefined;\n return await readNodeZipEntryRange(zipFile, entry, offset, length);\n },\n readEntry: async (name) => {\n if (closed) throw new Error(\"Cannot read a closed ZIP archive\");\n const entry = entries.get(name);\n if (entry === undefined) return undefined;\n return await readNodeZipEntry(zipFile, entry);\n },\n };\n}\n\nasync function copyNodeZipEntry(\n zipFile: yauzl.ZipFile,\n entry: yauzl.Entry,\n target: File,\n): Promise<void> {\n const writer = await target.openWriter();\n try {\n const stream = await openNodeZipEntryStream(zipFile, entry);\n await writeNodeStream(stream, writer);\n await writer.commit();\n } catch (error) {\n await writer.abort().catch(() => undefined);\n throw error;\n }\n}\n\nasync function readNodeZipEntry(\n zipFile: yauzl.ZipFile,\n entry: yauzl.Entry,\n): Promise<Uint8Array> {\n return await collectNodeStream(await openNodeZipEntryStream(zipFile, entry));\n}\n\nasync function readNodeZipEntryRange(\n zipFile: yauzl.ZipFile,\n entry: yauzl.Entry,\n offset: number,\n length: number,\n): Promise<Uint8Array> {\n assertFileRange(offset, length, entry.uncompressedSize);\n if (length === 0) return new Uint8Array();\n if (entry.compressionMethod !== 0) {\n const content = await collectDecodedNodeStreamRange(\n await openNodeZipEntryStream(zipFile, entry),\n offset,\n length,\n );\n return new Uint8Array(\n content.buffer,\n content.byteOffset,\n content.byteLength,\n );\n }\n const content = await collectNodeStream(\n await openNodeZipEntryStream(zipFile, entry, {\n decompress: null,\n decrypt: null,\n end: offset + length,\n start: offset,\n }),\n );\n return new Uint8Array(content.buffer, content.byteOffset, content.byteLength);\n}\n\nasync function collectDecodedNodeStreamRange(\n input: NodeJS.ReadableStream,\n offset: number,\n length: number,\n): Promise<Buffer> {\n const chunks: Buffer[] = [];\n const end = offset + length;\n let position = 0;\n let collected = 0;\n for await (const value of input) {\n const chunk = Buffer.isBuffer(value) ? value : Buffer.from(value);\n const chunkEnd = position + chunk.byteLength;\n if (chunkEnd > offset && position < end) {\n const selected = chunk.subarray(\n Math.max(0, offset - position),\n Math.min(chunk.byteLength, end - position),\n );\n chunks.push(selected);\n collected += selected.byteLength;\n }\n position = chunkEnd;\n if (position >= end) break;\n }\n if (collected !== length) {\n throw new Error(\"ZIP entry changed while reading its byte range\");\n }\n return Buffer.concat(chunks, collected);\n}\n\nasync function openNodeZipEntryStream(\n zipFile: yauzl.ZipFile,\n entry: yauzl.Entry,\n options?: yauzl.ZipFileOptions,\n): Promise<NodeJS.ReadableStream> {\n return await new Promise<NodeJS.ReadableStream>((resolve, reject) => {\n const callback = (error: Error | null, opened: Readable) => {\n if (error || opened === undefined) {\n reject(error ?? new Error(`Cannot read ZIP entry: ${entry.fileName}`));\n } else {\n resolve(opened);\n }\n };\n if (options === undefined) zipFile.openReadStream(entry, callback);\n else zipFile.openReadStream(entry, options, callback);\n });\n}\n\nasync function writeNodeZip(\n file: File,\n entries: Iterable<HostZipWriteEntry> | AsyncIterable<HostZipWriteEntry>,\n): Promise<void> {\n const zipFile = new yazl.ZipFile();\n const writer = await file.openWriter();\n const outputStream = zipFile.outputStream as Readable;\n const outputDone = writeNodeStream(outputStream, writer);\n const entryState = { cancelled: false, complete: false };\n let iterator:\n | Iterator<HostZipWriteEntry>\n | AsyncIterator<HostZipWriteEntry>\n | undefined;\n\n try {\n iterator = getNodeZipEntryIterator(entries);\n const entriesDone = addNodeZipEntries(zipFile, iterator, entryState);\n await Promise.race([entriesDone, outputDone]);\n if (!entryState.complete) {\n throw new Error(\"ZIP output ended before entry production completed\");\n }\n zipFile.end();\n await outputDone;\n await writer.commit();\n } catch (error) {\n entryState.cancelled = true;\n if (!entryState.complete && iterator !== undefined) {\n closeNodeZipEntryIterator(iterator);\n }\n if (!outputStream.destroyed) {\n outputStream.destroy(\n error instanceof Error ? error : new Error(\"Cannot write ZIP archive\"),\n );\n }\n await outputDone.catch(() => undefined);\n await writer.abort().catch(() => undefined);\n throw error;\n }\n}\n\nasync function addNodeZipEntries(\n zipFile: yazl.ZipFile,\n iterator: Iterator<HostZipWriteEntry> | AsyncIterator<HostZipWriteEntry>,\n state: { cancelled: boolean; complete: boolean },\n): Promise<void> {\n while (!state.cancelled) {\n const result = await iterator.next();\n if (state.cancelled) return;\n if (result.done) {\n state.complete = true;\n return;\n }\n if (\"file\" in result.value) {\n zipFile.addReadStream(\n createNodeFileReadStream(result.value.file),\n result.value.name,\n { compress: false },\n );\n } else if (\"data\" in result.value) {\n zipFile.addBuffer(Buffer.from(result.value.data), result.value.name, {\n compress: false,\n });\n } else {\n zipFile.addReadStream(\n createNodeRangeReadStream(result.value),\n result.value.name,\n { compress: false, size: result.value.size },\n );\n }\n }\n}\n\nfunction createNodeFileReadStream(file: ReadonlyFile): Readable {\n return Readable.from(\n (async function* () {\n const reader = await file.openReader();\n try {\n for (let offset = 0; offset < reader.size; ) {\n const chunk = await reader.read(\n offset,\n Math.min(64 * 1024, reader.size - offset),\n );\n offset += chunk.byteLength;\n yield chunk;\n }\n } finally {\n await reader.close();\n }\n })(),\n );\n}\n\nfunction getBrandedNodeResourcePath(\n resource: unknown,\n kind: \"directory\" | \"file\",\n): string | undefined {\n if (typeof resource !== \"object\" || resource === null) return undefined;\n const candidate = resource as {\n readonly [NODE_RESOURCE_KIND]?: unknown;\n readonly path?: unknown;\n };\n return candidate[NODE_RESOURCE_KIND] === kind &&\n typeof candidate.path === \"string\"\n ? candidate.path\n : undefined;\n}\n\nfunction createNodeRangeReadStream(\n entry: Extract<HostZipWriteEntry, { readonly size: number }>,\n): Readable {\n return Readable.from(\n (async function* () {\n for (let offset = 0; offset < entry.size; ) {\n const chunk = await entry.read(\n offset,\n Math.min(64 * 1024, entry.size - offset),\n );\n offset += chunk.byteLength;\n yield chunk;\n }\n })(),\n );\n}\n\nfunction getNodeZipEntryIterator(\n entries: Iterable<HostZipWriteEntry> | AsyncIterable<HostZipWriteEntry>,\n): Iterator<HostZipWriteEntry> | AsyncIterator<HostZipWriteEntry> {\n const asyncIterator = (entries as AsyncIterable<HostZipWriteEntry>)[\n Symbol.asyncIterator\n ];\n return asyncIterator === undefined\n ? (entries as Iterable<HostZipWriteEntry>)[Symbol.iterator]()\n : asyncIterator.call(entries);\n}\n\nfunction closeNodeZipEntryIterator(\n iterator: Iterator<HostZipWriteEntry> | AsyncIterator<HostZipWriteEntry>,\n): void {\n if (iterator.return === undefined) return;\n try {\n void Promise.resolve(iterator.return()).catch(() => undefined);\n } catch {\n // Preserve the failure that caused iteration to stop.\n }\n}\n\nasync function writeNodeStream(\n input: NodeJS.ReadableStream,\n writer: FileWriter,\n): Promise<void> {\n await pipeline(\n input,\n new Writable({\n write: (chunk: Buffer, _encoding, callback) => {\n void writer.write(chunk).then(\n () => callback(),\n (error: unknown) =>\n callback(\n error instanceof Error\n ? error\n : new Error(\"Cannot stream ZIP archive\"),\n ),\n );\n },\n }),\n );\n}\n\nasync function collectNodeStream(\n input: NodeJS.ReadableStream,\n): Promise<Buffer> {\n return await new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n input.on(\"data\", (chunk: Buffer) => chunks.push(chunk));\n input.once(\"error\", reject);\n input.once(\"end\", () => resolve(Buffer.concat(chunks)));\n });\n}\n\nexport const nodeWikiGraphPlatform: WikiGraphPlatform = {\n asyncContext: {\n create: <T>() => new asyncHooks.AsyncLocalStorage<T>(),\n },\n database: { open: openNodeDatabase },\n lifecycle: {\n instanceId: `node-process:${nodeProcess.pid}`,\n isInstanceAlive: (instanceId) => {\n const match = /^node-process:(\\d+)$/u.exec(instanceId);\n if (match === null) return Promise.resolve(undefined);\n try {\n nodeProcess.kill(Number(match[1]), 0);\n return Promise.resolve(true);\n } catch (error) {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === \"ESRCH\"\n ) {\n return Promise.resolve(false);\n }\n return Promise.resolve(true);\n }\n },\n },\n resources: {\n getDirectory: (identity) => {\n const path = decodeNodeResourceIdentity(identity, \"directory\");\n return Promise.resolve(\n path === undefined ? undefined : new NodeDirectory(path),\n );\n },\n getFile: (identity) => {\n const path = decodeNodeResourceIdentity(identity, \"file\");\n return Promise.resolve(\n path === undefined ? undefined : new NodeFile(path),\n );\n },\n resolveLegacyDirectory: (reference) => {\n const path = decodeNodeResourceIdentity(reference, \"directory\");\n return Promise.resolve(\n path === undefined ? undefined : new NodeDirectory(path),\n );\n },\n },\n templates: {\n createEnvironment: (options) =>\n new Environment(new NodeTemplateLoader(), options),\n },\n zip: {\n open: openNodeZip,\n write: writeNodeZip,\n },\n};\n\nexport interface NodeWikiGraphPlatformOptions {\n readonly lifecycle?: HostLifecycleProvider;\n}\n\n/** Create the Node platform with an optional host-owned lifecycle identity. */\nexport function createNodeWikiGraphPlatform(\n options: NodeWikiGraphPlatformOptions = {},\n): WikiGraphPlatform {\n return options.lifecycle === undefined\n ? nodeWikiGraphPlatform\n : { ...nodeWikiGraphPlatform, lifecycle: options.lifecycle };\n}\n\nclass NodeTemplateLoader extends Loader {\n readonly #dataDirectory: string | undefined;\n\n public constructor(dataDirectory?: string) {\n super();\n this.#dataDirectory = dataDirectory;\n }\n\n public getSource(templateName: string): LoaderSource {\n const name = normalizeTemplateName(templateName);\n const filePath = pathModule.join(\n this.#dataDirectory ?? resolveNodeDataDirectory(),\n name,\n );\n return {\n noCache: false,\n path: name,\n src: fs.readFileSync(filePath, \"utf8\"),\n };\n }\n}\n\nexport function createNodeTemplateEnvironment(\n dataDirectory: string,\n options: {\n readonly autoescape?: boolean;\n readonly trimBlocks?: boolean;\n } = {},\n): Environment {\n return new Environment(new NodeTemplateLoader(dataDirectory), {\n autoescape: options.autoescape ?? true,\n trimBlocks: options.trimBlocks ?? true,\n });\n}\n\nfunction resolveNodeDataDirectory(): string {\n const injected = (globalThis as { __WIKIGRAPH_DATA_DIR__?: unknown })\n .__WIKIGRAPH_DATA_DIR__;\n if (typeof injected === \"string\" && injected !== \"\") return injected;\n let directory = nodeProcess.cwd();\n while (true) {\n for (const candidate of [\n pathModule.join(directory, \"data\"),\n pathModule.join(directory, \"packages\", \"core\", \"data\"),\n ]) {\n try {\n if (fs.statSync(candidate).isDirectory()) return candidate;\n } catch {\n // Keep looking toward the filesystem root.\n }\n }\n const parent = pathModule.dirname(directory);\n if (parent === directory)\n throw new Error(\"Could not locate data directory\");\n directory = parent;\n }\n}\n\nexport interface NodeWikiGraphStorageOptions {\n readonly documentStoreRoot: string;\n readonly libraryRoot: string;\n}\n\nexport function createNodeWikiGraphStorage(\n stateRootOrOptions: string | NodeWikiGraphStorageOptions = pathModule.join(\n os.homedir(),\n \".wikigraph\",\n ),\n): WikiGraphStorage {\n const libraryRoot =\n typeof stateRootOrOptions === \"string\"\n ? stateRootOrOptions\n : stateRootOrOptions.libraryRoot;\n const documentStoreRoot =\n typeof stateRootOrOptions === \"string\"\n ? pathModule.join(stateRootOrOptions, \"documents\")\n : stateRootOrOptions.documentStoreRoot;\n return {\n library: new NodeDirectory(libraryRoot),\n documentStore: new NodeDirectory(documentStoreRoot),\n };\n}\n\nexport function installNodeWikiGraphPlatform(stateRoot?: string): void {\n installWikiGraphPlatform(nodeWikiGraphPlatform);\n installWikiGraphStorage(createNodeWikiGraphStorage(stateRoot));\n}\n\nexport function ensureNodeWikiGraphPlatform(): void {\n try {\n getWikiGraphPlatform();\n } catch {\n installWikiGraphPlatform(nodeWikiGraphPlatform);\n }\n try {\n getWikiGraphStorage();\n } catch {\n installWikiGraphStorage(createNodeWikiGraphStorage());\n }\n}\n\nexport async function withNodeWikiGraphStorage<T>(\n stateRoot: string | undefined,\n operation: () => Promise<T> | T,\n): Promise<T> {\n return await withWikiGraphStorage(\n stateRoot === undefined ? undefined : createNodeWikiGraphStorage(stateRoot),\n operation,\n );\n}\n","import { z } from \"zod\";\n\nimport { readLocalConfigSection } from \"./local-config.js\";\nimport { getWikiGraphSDKRuntimeContext } from \"./runtime-context.js\";\n\nconst WIKI_GRAPH_PROVIDER_VALUES = [\n \"anthropic\",\n \"google\",\n \"openai\",\n \"openai-compatible\",\n] as const;\n\nconst wikiGraphProviderSchema = z.enum(WIKI_GRAPH_PROVIDER_VALUES);\nconst inlineLLMConfigSchema = z.object({\n apiKey: z.string().min(1).optional(),\n baseURL: z.string().min(1).optional(),\n baseUrl: z.string().min(1).optional(),\n chatCompletionsUrl: z.string().min(1).optional(),\n llm: z\n .object({\n apiKey: z.string().min(1).optional(),\n baseURL: z.string().min(1).optional(),\n baseUrl: z.string().min(1).optional(),\n chatCompletionsUrl: z.string().min(1).optional(),\n model: z.string().min(1).optional(),\n name: z.string().min(1).optional(),\n provider: wikiGraphProviderSchema.optional(),\n })\n .optional(),\n model: z.string().min(1).optional(),\n name: z.string().min(1).optional(),\n provider: wikiGraphProviderSchema.optional(),\n});\n\nexport type WikiGraphProvider = z.infer<typeof wikiGraphProviderSchema>;\n\nexport interface WikiGraphRuntimeConfig {\n readonly embedding?: {\n readonly apiKey?: string;\n readonly baseURL?: string;\n readonly dimensions?: number;\n readonly model?: string;\n readonly name?: string;\n readonly provider?: \"openai\" | \"openai-compatible\";\n };\n readonly llm?: {\n readonly apiKey?: string;\n readonly baseURL?: string;\n readonly model?: string;\n readonly name?: string;\n readonly provider?: WikiGraphProvider;\n };\n readonly prompt?: string;\n readonly concurrent?: {\n readonly job?: number;\n readonly request?: number;\n };\n readonly wikispine?:\n | { readonly provider: \"cli\" }\n | {\n readonly endpoint: string;\n readonly provider: \"fetch\";\n readonly token: string;\n };\n readonly wikimedia?: {\n readonly endpoint: string;\n readonly token: string;\n };\n}\n\nexport type WikiGraphLLMConfig = NonNullable<WikiGraphRuntimeConfig[\"llm\"]>;\n\nexport type HostedProviderScope = \"wg-wikimedia\" | \"wikispine\";\n\ntype InlineLLMConfig = WikiGraphLLMConfig;\n\nexport async function loadWikiGraphRuntimeConfig(options?: {\n readonly llmJSON?: string;\n readonly skipEmbeddingConfig?: boolean;\n readonly skipLLMConfig?: boolean;\n}): Promise<WikiGraphRuntimeConfig> {\n const [embedding, localLLM, concurrent, wikimedia, wikispine] =\n await Promise.all([\n options?.skipEmbeddingConfig === true\n ? Promise.resolve({} as Record<string, unknown>)\n : readLocalConfigSection(\"embeddings\"),\n options?.skipLLMConfig === true\n ? Promise.resolve({} as Record<string, unknown>)\n : readLocalConfigSection(\"llm\"),\n readLocalConfigSection(\"concurrent\"),\n readLocalConfigSection(\"wikimedia\"),\n readLocalConfigSection(\"wikispine\"),\n ]);\n const inlineLLMConfig =\n options?.llmJSON === undefined\n ? undefined\n : parseInlineLLMConfig(options.llmJSON);\n const llm = createLLMConfig({\n apiKey: firstDefined(inlineLLMConfig?.apiKey, readString(localLLM.apiKey)),\n baseURL: firstDefined(\n inlineLLMConfig?.baseURL,\n readString(localLLM.baseURL),\n ),\n model: firstDefined(inlineLLMConfig?.model, readString(localLLM.model)),\n name: firstDefined(inlineLLMConfig?.name, readString(localLLM.name)),\n provider: firstDefined(\n inlineLLMConfig?.provider,\n readProvider(localLLM.provider),\n ),\n });\n const requestConcurrent = readPositiveInteger(concurrent.request);\n const jobConcurrent = readPositiveInteger(concurrent.job);\n const envPolicy = getWikiGraphSDKRuntimeContext().envPolicy;\n const wikispineConfig = resolveWikispineConfig(wikispine, envPolicy);\n const wikimediaConfig = createWikimediaConfig(wikimedia, envPolicy);\n const embeddingConfig = createEmbeddingConfig(embedding);\n\n return {\n ...(jobConcurrent === undefined && requestConcurrent === undefined\n ? {}\n : {\n concurrent: {\n ...(jobConcurrent === undefined ? {} : { job: jobConcurrent }),\n ...(requestConcurrent === undefined\n ? {}\n : { request: requestConcurrent }),\n },\n }),\n ...(embeddingConfig === undefined ? {} : { embedding: embeddingConfig }),\n ...(llm === undefined ? {} : { llm }),\n ...(wikimediaConfig === undefined ? {} : { wikimedia: wikimediaConfig }),\n ...(wikispineConfig === undefined ? {} : { wikispine: wikispineConfig }),\n };\n}\n\nfunction createWikimediaConfig(\n input: Record<string, unknown> | undefined,\n envPolicy: \"development\" | \"production\",\n): WikiGraphRuntimeConfig[\"wikimedia\"] | undefined {\n const endpoint = readString(input?.endpoint);\n const token = readString(input?.token);\n\n if (endpoint === undefined && token === undefined) return undefined;\n if (token === undefined) {\n throw new Error(\n \"Remote Wikimedia access requires an API key. Configure `wikg://local/config/wikimedia` token with `put token --secret`.\",\n );\n }\n return {\n endpoint:\n endpoint ?? resolveHostedProviderEndpoint(\"wg-wikimedia\", envPolicy),\n token,\n };\n}\n\nfunction createEmbeddingConfig(\n input: Record<string, unknown> | undefined,\n): WikiGraphRuntimeConfig[\"embedding\"] | undefined {\n const value = input ?? {};\n const provider = readEmbeddingProvider(value.provider);\n const apiKey = readString(value.apiKey);\n const baseURL = readString(value.baseURL);\n const dimensions =\n typeof value.dimensions === \"number\" &&\n Number.isInteger(value.dimensions) &&\n value.dimensions > 0\n ? value.dimensions\n : undefined;\n const model = readString(value.model);\n const name = readString(value.name);\n\n if (\n provider === undefined ||\n model === undefined ||\n (provider === \"openai-compatible\" && baseURL === undefined) ||\n (provider === \"openai\" && baseURL !== undefined)\n ) {\n return undefined;\n }\n\n return {\n ...(apiKey === undefined ? {} : { apiKey }),\n ...(baseURL === undefined ? {} : { baseURL }),\n ...(dimensions === undefined ? {} : { dimensions }),\n ...(model === undefined ? {} : { model }),\n ...(name === undefined ? {} : { name }),\n ...(provider === undefined ? {} : { provider }),\n };\n}\n\nfunction parseInlineLLMConfig(value: string): InlineLLMConfig | undefined {\n const normalized = normalizeString(value);\n\n if (normalized === undefined) {\n throw new Error(\"--llm must be a non-empty JSON object.\");\n }\n\n let parsedJson: unknown;\n\n try {\n parsedJson = JSON.parse(normalized);\n } catch (error) {\n throw new Error(`Invalid --llm JSON: ${formatError(error)}`);\n }\n\n const parsed = inlineLLMConfigSchema.safeParse(parsedJson);\n\n if (!parsed.success) {\n throw new Error(\n `Invalid --llm config: ${parsed.error.issues\n .map((issue) => `${issue.path.join(\".\") || \"<root>\"}: ${issue.message}`)\n .join(\"; \")}`,\n );\n }\n\n const input = parsed.data.llm ?? parsed.data;\n const provider = input.provider ?? inferInlineProvider(input);\n const baseURL = resolveInlineBaseURL(input);\n const config = createLLMConfig({\n apiKey: input.apiKey,\n baseURL,\n model: input.model,\n name: input.name,\n provider,\n });\n\n if (config === undefined) {\n throw new Error(\"--llm must contain at least one supported LLM field.\");\n }\n\n return config;\n}\n\nfunction inferInlineProvider(input: {\n readonly baseURL?: string | undefined;\n readonly baseUrl?: string | undefined;\n readonly chatCompletionsUrl?: string | undefined;\n readonly provider?: WikiGraphProvider | undefined;\n}): WikiGraphProvider | undefined {\n if (\n input.provider === undefined &&\n (input.baseURL !== undefined ||\n input.baseUrl !== undefined ||\n input.chatCompletionsUrl !== undefined)\n ) {\n return \"openai-compatible\";\n }\n\n return input.provider;\n}\n\nfunction inferBaseURLFromChatCompletionsURL(input: {\n readonly chatCompletionsUrl?: string | undefined;\n}): string | undefined {\n if (input.chatCompletionsUrl === undefined) {\n return undefined;\n }\n\n const suffix = \"/chat/completions\";\n\n if (!input.chatCompletionsUrl.endsWith(suffix)) {\n throw new Error(\n \"--llm chatCompletionsUrl must end with /chat/completions when baseURL is not provided.\",\n );\n }\n\n return input.chatCompletionsUrl.slice(0, -suffix.length);\n}\n\nfunction resolveInlineBaseURL(input: {\n readonly baseURL?: string | undefined;\n readonly baseUrl?: string | undefined;\n readonly chatCompletionsUrl?: string | undefined;\n}): string | undefined {\n if (input.baseURL !== undefined) {\n return input.baseURL;\n }\n if (input.baseUrl !== undefined) {\n return input.baseUrl;\n }\n\n return inferBaseURLFromChatCompletionsURL(input);\n}\n\nfunction createLLMConfig(input: {\n readonly apiKey: string | undefined;\n readonly baseURL: string | undefined;\n readonly model: string | undefined;\n readonly name: string | undefined;\n readonly provider: WikiGraphProvider | undefined;\n}): WikiGraphRuntimeConfig[\"llm\"] {\n if (\n input.apiKey === undefined &&\n input.baseURL === undefined &&\n input.model === undefined &&\n input.name === undefined &&\n input.provider === undefined\n ) {\n return undefined;\n }\n\n return {\n ...(input.apiKey === undefined ? {} : { apiKey: input.apiKey }),\n ...(input.baseURL === undefined ? {} : { baseURL: input.baseURL }),\n ...(input.model === undefined ? {} : { model: input.model }),\n ...(input.name === undefined ? {} : { name: input.name }),\n ...(input.provider === undefined ? {} : { provider: input.provider }),\n };\n}\n\nfunction readProvider(value: unknown): WikiGraphProvider | undefined {\n if (typeof value !== \"string\") {\n return undefined;\n }\n\n const parsed = wikiGraphProviderSchema.safeParse(value);\n\n return parsed.success ? parsed.data : undefined;\n}\n\nexport function resolveWikispineConfig(\n value: Record<string, unknown>,\n envPolicy: \"development\" | \"production\" = getWikiGraphSDKRuntimeContext()\n .envPolicy,\n): WikiGraphRuntimeConfig[\"wikispine\"] | undefined {\n const provider = readWikispineProvider(value.provider);\n const endpoint = readString(value.endpoint);\n const token = readString(value.token);\n\n if (provider === undefined) {\n return undefined;\n }\n\n if (provider === \"cli\") return { provider };\n if (token === undefined) {\n throw new Error(\n \"Remote WikiSpine access requires an API key. Configure `wikg://local/config/wikispine` token with `put token --secret`.\",\n );\n }\n\n return {\n endpoint: endpoint ?? resolveHostedProviderEndpoint(\"wikispine\", envPolicy),\n provider,\n token,\n };\n}\n\nexport function resolveHostedProviderEndpoint(\n scope: HostedProviderScope,\n envPolicy: \"development\" | \"production\" = getWikiGraphSDKRuntimeContext()\n .envPolicy,\n): string {\n const origin =\n envPolicy === \"development\"\n ? \"https://pdf-craft-api.oomol.dev\"\n : \"https://api.pdfcraft.ai\";\n return `${origin}/v1/${scope}`;\n}\n\nfunction readWikispineProvider(value: unknown): \"cli\" | \"fetch\" | undefined {\n return value === \"cli\" || value === \"fetch\" ? value : undefined;\n}\n\nfunction readEmbeddingProvider(\n value: unknown,\n): \"openai\" | \"openai-compatible\" | undefined {\n return value === \"openai\" || value === \"openai-compatible\"\n ? value\n : undefined;\n}\n\nfunction readString(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction readPositiveInteger(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isInteger(value) && value > 0\n ? value\n : undefined;\n}\n\nfunction firstDefined<T>(\n first: T | undefined,\n second: T | undefined,\n): T | undefined {\n return first ?? second;\n}\n\nfunction normalizeString(value: string | undefined): string | undefined {\n const normalized = value?.trim();\n\n return normalized === undefined || normalized === \"\" ? undefined : normalized;\n}\n\nfunction formatError(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n","import { openSharedStateDatabase } from \"wiki-graph-core\";\nimport { getWikiGraphSDKStateDir } from \"./runtime-context.js\";\nimport { NodeFile } from \"./node-platform.js\";\nimport { mkdir } from \"fs/promises\";\nimport { join } from \"path\";\nimport { homedir } from \"os\";\nimport type { Database } from \"wiki-graph-core\";\n\nexport const LOCAL_CONFIG_SECTIONS = [\n \"concurrent\",\n \"embeddings\",\n \"llm\",\n \"wikimedia\",\n \"wikispine\",\n] as const;\n\nexport type LocalConfigSection = (typeof LOCAL_CONFIG_SECTIONS)[number];\n\nexport type LocalConfigObject = Readonly<Record<string, unknown>>;\n\nconst LOCAL_CONFIG_SCHEMA_SQL = `\nCREATE TABLE IF NOT EXISTS config_sections (\n section TEXT PRIMARY KEY,\n value_json TEXT NOT NULL,\n updated_at INTEGER NOT NULL\n);\n`;\n\nexport async function readLocalConfigSection(\n section: LocalConfigSection,\n): Promise<LocalConfigObject> {\n return await withLocalConfigDatabase(async (database) => {\n return await readLocalConfigSectionInDatabase(database, section);\n });\n}\n\nexport async function replaceLocalConfigSection(\n section: LocalConfigSection,\n value: LocalConfigObject,\n): Promise<LocalConfigObject> {\n const normalized = validateLocalConfigSection(section, value);\n\n return await withLocalConfigDatabase(async (database) => {\n await writeLocalConfigSectionInDatabase(database, section, normalized);\n return normalized;\n });\n}\n\nexport async function putLocalConfigValue(\n section: LocalConfigSection,\n key: string,\n value: unknown,\n): Promise<LocalConfigObject> {\n return await withLocalConfigDatabase(async (database) => {\n const current = await readLocalConfigSectionInDatabase(database, section);\n const next = validateLocalConfigSection(section, {\n ...current,\n [normalizeLocalConfigKey(section, key)]: value,\n });\n\n await writeLocalConfigSectionInDatabase(database, section, next);\n return next;\n });\n}\n\nexport async function deleteLocalConfigValue(\n section: LocalConfigSection,\n key: string,\n): Promise<LocalConfigObject> {\n return await withLocalConfigDatabase(async (database) => {\n const current = await readLocalConfigSectionInDatabase(database, section);\n const normalizedKey = normalizeLocalConfigKey(section, key);\n const { [normalizedKey]: _removed, ...nextInput } = current;\n const next = validateLocalConfigSection(section, nextInput);\n\n await writeLocalConfigSectionInDatabase(database, section, next);\n return next;\n });\n}\n\nexport async function clearLocalConfigSection(\n section: LocalConfigSection,\n): Promise<LocalConfigObject> {\n return await replaceLocalConfigSection(section, {});\n}\n\nexport function parseLocalConfigSection(\n value: string | undefined,\n): LocalConfigSection | undefined {\n if (value === \"embedding\") {\n return \"embeddings\";\n }\n\n return LOCAL_CONFIG_SECTIONS.find((section) => section === value);\n}\n\nexport function maskLocalConfigSection(\n section: LocalConfigSection,\n value: LocalConfigObject,\n): LocalConfigObject {\n if (\n (section !== \"llm\" &&\n section !== \"embeddings\" &&\n section !== \"wikimedia\" &&\n section !== \"wikispine\") ||\n (value.apiKey === undefined && value.token === undefined)\n ) {\n return value;\n }\n\n return {\n ...value,\n ...(value.apiKey === undefined ? {} : { apiKey: \"****\" }),\n ...(value.token === undefined ? {} : { token: \"****\" }),\n };\n}\n\nexport function normalizeLocalConfigKey(\n section: LocalConfigSection,\n key: string,\n): string {\n const normalized = key.trim();\n\n if (normalized === \"\") {\n throw new Error(\"Config key cannot be empty.\");\n }\n\n if (section === \"llm\" || section === \"embeddings\") {\n switch (normalized) {\n case \"api-key\":\n return \"apiKey\";\n case \"base-url\":\n return \"baseURL\";\n default:\n return normalized;\n }\n }\n return normalized;\n}\n\nexport function validateLocalConfigSection(\n section: LocalConfigSection,\n value: LocalConfigObject,\n): LocalConfigObject {\n switch (section) {\n case \"embeddings\":\n return validateEmbeddingsConfig(value);\n case \"llm\":\n return validateLLMConfig(value);\n case \"concurrent\":\n return validateConcurrentConfig(value);\n case \"wikimedia\":\n return validateWikimediaConfig(value);\n case \"wikispine\":\n return validateWikispineConfig(value);\n }\n}\n\nasync function withLocalConfigDatabase<T>(\n operation: (database: Database) => Promise<T>,\n): Promise<T> {\n const stateDir = getWikiGraphSDKStateDir() ?? join(homedir(), \".wikigraph\");\n await mkdir(stateDir, { recursive: true });\n const database = await openSharedStateDatabase(\n new NodeFile(join(stateDir, \"core.sqlite\")),\n LOCAL_CONFIG_SCHEMA_SQL,\n );\n\n try {\n return await operation(database);\n } finally {\n await database.close();\n }\n}\n\nasync function readLocalConfigSectionInDatabase(\n database: Database,\n section: LocalConfigSection,\n): Promise<LocalConfigObject> {\n const value = await database.queryOne(\n \"SELECT value_json FROM config_sections WHERE section = ?\",\n [section],\n (row) => String(row.value_json),\n );\n\n return value === undefined ? {} : parseSectionJSON(section, value);\n}\n\nasync function writeLocalConfigSectionInDatabase(\n database: Database,\n section: LocalConfigSection,\n value: LocalConfigObject,\n): Promise<void> {\n await database.run(\n `\nINSERT INTO config_sections (section, value_json, updated_at)\nVALUES (?, ?, ?)\nON CONFLICT(section) DO UPDATE SET\n value_json = excluded.value_json,\n updated_at = excluded.updated_at\n`,\n [section, JSON.stringify(value), Date.now()],\n );\n}\n\nfunction parseSectionJSON(\n section: LocalConfigSection,\n value: string,\n): LocalConfigObject {\n let parsed: unknown;\n\n try {\n parsed = JSON.parse(value);\n } catch (error) {\n throw new Error(\n `Invalid local config JSON for ${section}: ${formatError(error)}`,\n );\n }\n\n if (parsed === null || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n throw new Error(\n `Invalid local config section ${section}: expected object.`,\n );\n }\n\n return validateLocalConfigSection(section, parsed as LocalConfigObject);\n}\n\nfunction validateEmbeddingsConfig(value: LocalConfigObject): LocalConfigObject {\n const allowedKeys = new Set([\n \"apiKey\",\n \"baseURL\",\n \"dimensions\",\n \"model\",\n \"name\",\n \"provider\",\n ]);\n const allowedProviders = new Set([\"openai\", \"openai-compatible\"]);\n const next: Record<string, unknown> = {};\n\n for (const [key, entry] of Object.entries(value)) {\n if (!allowedKeys.has(key)) {\n throw new Error(`Unknown embeddings config key: ${key}`);\n }\n if (key === \"dimensions\") {\n const parsed =\n typeof entry === \"number\"\n ? entry\n : typeof entry === \"string\"\n ? Number(entry)\n : NaN;\n\n if (!Number.isInteger(parsed) || parsed <= 0) {\n throw new Error(\"embeddings.dimensions must be a positive integer.\");\n }\n next[key] = parsed;\n continue;\n }\n if (typeof entry !== \"string\" || entry.trim() === \"\") {\n throw new Error(`embeddings.${key} must be a non-empty string.`);\n }\n const normalized = entry.trim();\n\n if (key === \"provider\" && !allowedProviders.has(normalized)) {\n throw new Error(`Unknown embeddings.provider: ${normalized}`);\n }\n\n next[key] = normalized;\n }\n\n return next;\n}\n\nfunction validateLLMConfig(value: LocalConfigObject): LocalConfigObject {\n const allowedKeys = new Set([\n \"apiKey\",\n \"baseURL\",\n \"model\",\n \"name\",\n \"provider\",\n ]);\n const allowedProviders = new Set([\n \"anthropic\",\n \"google\",\n \"openai\",\n \"openai-compatible\",\n ]);\n const next: Record<string, unknown> = {};\n\n for (const [key, entry] of Object.entries(value)) {\n if (!allowedKeys.has(key)) {\n throw new Error(`Unknown llm config key: ${key}`);\n }\n if (typeof entry !== \"string\" || entry.trim() === \"\") {\n throw new Error(`llm.${key} must be a non-empty string.`);\n }\n const normalized = entry.trim();\n\n if (key === \"provider\" && !allowedProviders.has(normalized)) {\n throw new Error(`Unknown llm.provider: ${normalized}`);\n }\n\n next[key] = normalized;\n }\n\n return next;\n}\n\nfunction validateConcurrentConfig(value: LocalConfigObject): LocalConfigObject {\n const allowedKeys = new Set([\"job\", \"request\"]);\n const next: Record<string, unknown> = {};\n\n for (const [key, entry] of Object.entries(value)) {\n if (!allowedKeys.has(key)) {\n throw new Error(`Unknown concurrent config key: ${key}`);\n }\n const parsed =\n typeof entry === \"number\"\n ? entry\n : typeof entry === \"string\"\n ? Number(entry)\n : NaN;\n\n if (!Number.isInteger(parsed) || parsed <= 0) {\n throw new Error(`concurrent.${key} must be a positive integer.`);\n }\n next[key] = parsed;\n }\n\n return next;\n}\n\nfunction validateWikispineConfig(value: LocalConfigObject): LocalConfigObject {\n const allowedKeys = new Set([\"endpoint\", \"provider\", \"token\"]);\n const allowedProviders = new Set([\"cli\", \"fetch\"]);\n const next: Record<string, unknown> = {};\n\n for (const [key, entry] of Object.entries(value)) {\n if (!allowedKeys.has(key)) {\n throw new Error(`Unknown wikispine config key: ${key}`);\n }\n if (typeof entry !== \"string\" || entry.trim() === \"\") {\n throw new Error(`wikispine.${key} must be a non-empty string.`);\n }\n const normalized = entry.trim();\n\n if (key === \"provider\" && !allowedProviders.has(normalized)) {\n throw new Error(`Unknown wikispine.provider: ${normalized}`);\n }\n\n next[key] = normalized;\n }\n\n return next;\n}\n\nfunction validateWikimediaConfig(value: LocalConfigObject): LocalConfigObject {\n return validateEndpointConfig(\"wikimedia\", value);\n}\n\nfunction validateEndpointConfig(\n section: \"wikimedia\",\n value: LocalConfigObject,\n): LocalConfigObject {\n const allowedKeys = new Set([\"endpoint\", \"token\"]);\n const next: Record<string, unknown> = {};\n\n for (const [key, entry] of Object.entries(value)) {\n if (!allowedKeys.has(key)) {\n throw new Error(`Unknown ${section} config key: ${key}`);\n }\n if (typeof entry !== \"string\" || entry.trim() === \"\") {\n throw new Error(`${section}.${key} must be a non-empty string.`);\n }\n next[key] = entry.trim();\n }\n\n return next;\n}\n\nfunction formatError(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n","import { AsyncLocalStorage } from \"async_hooks\";\n\nimport type { WikiGraphSDKProviders } from \"./providers.js\";\nimport type { WikiGraphSDKHost } from \"./host.js\";\n\nexport type WikiGraphSDKEnvPolicy = \"development\" | \"production\";\n\nexport interface WikiGraphSDKRuntimeContext {\n readonly cwd: string;\n readonly env: NodeJS.ProcessEnv;\n readonly envPolicy: WikiGraphSDKEnvPolicy;\n readonly host?: WikiGraphSDKHost;\n readonly providers?: WikiGraphSDKProviders;\n readonly stateDir?: string | undefined;\n}\n\n/** Shared by independently bundled SDK entry points in the same process. */\nconst RUNTIME_CONTEXT_KEY = Symbol.for(\"wiki-graph-sdk.runtime-context.v1\");\nconst runtimeContext = getRuntimeContextStorage();\n\nfunction getRuntimeContextStorage(): AsyncLocalStorage<WikiGraphSDKRuntimeContext> {\n const runtimeGlobal = globalThis as unknown as Record<PropertyKey, unknown>;\n const existing = runtimeGlobal[RUNTIME_CONTEXT_KEY];\n if (existing !== undefined) {\n return existing as AsyncLocalStorage<WikiGraphSDKRuntimeContext>;\n }\n\n const storage = new AsyncLocalStorage<WikiGraphSDKRuntimeContext>();\n Object.defineProperty(runtimeGlobal, RUNTIME_CONTEXT_KEY, {\n configurable: false,\n enumerable: false,\n value: storage,\n writable: false,\n });\n return storage;\n}\n\nexport async function withWikiGraphSDKRuntimeContext<T>(\n context: WikiGraphSDKRuntimeContext,\n operation: () => Promise<T> | T,\n): Promise<T> {\n return await runtimeContext.run(context, operation);\n}\n\nexport function getWikiGraphSDKRuntimeContext(): WikiGraphSDKRuntimeContext {\n return (\n runtimeContext.getStore() ?? {\n cwd: process.cwd(),\n env: process.env,\n envPolicy: \"production\",\n providers: {},\n }\n );\n}\n\nexport function getWikiGraphSDKStateDir(): string | undefined {\n const context = getWikiGraphSDKRuntimeContext();\n return context.host?.stateDir ?? context.stateDir;\n}\n\nexport function getWikiGraphSDKProviders(): WikiGraphSDKProviders {\n return getWikiGraphSDKRuntimeContext().providers ?? {};\n}\n","import type {\n LLMessage,\n LLMRequestOptions,\n LLMStreamProviderEvent,\n SearchIndexEmbeddingProvider,\n WikiGraphScope,\n} from \"wiki-graph-core\";\nimport type { WikiGraphLLMConfig } from \"./runtime-config.js\";\n\nexport type WikiGraphLLMMessage = LLMessage;\nexport type WikiGraphLLMProviderEvent = LLMStreamProviderEvent;\nexport type WikiGraphLLMProviderOptions = LLMRequestOptions<WikiGraphScope>;\n\nexport interface WikiGraphLLMProvider {\n readonly identity?: string;\n readonly model: string;\n stream(\n messages: readonly WikiGraphLLMMessage[],\n options: WikiGraphLLMProviderOptions,\n ): AsyncIterable<WikiGraphLLMProviderEvent>;\n}\n\nexport type WikiGraphEmbeddingProvider = SearchIndexEmbeddingProvider;\n\nexport interface WikiGraphSDKProviders {\n readonly embedding?: WikiGraphEmbeddingProvider;\n readonly llm?: WikiGraphLLMProvider;\n}\n\nexport function resolveWikiGraphLLMJSON(options: {\n readonly llm?: WikiGraphLLMConfig;\n readonly llmJSON?: string;\n}): string | undefined {\n if (options.llm !== undefined && options.llmJSON !== undefined) {\n throw new Error(\"Pass either llm or llmJSON, not both.\");\n }\n return options.llm === undefined\n ? options.llmJSON\n : JSON.stringify(options.llm);\n}\n","import { homedir } from \"os\";\nimport { isAbsolute, resolve } from \"path\";\n\nimport { getWikiGraphSDKRuntimeContext } from \"./runtime-context.js\";\n\nexport function resolveWikiGraphRuntimePath(path: string): string {\n const context = getWikiGraphSDKRuntimeContext();\n const environmentHome = context.env.HOME?.trim();\n const home =\n environmentHome === undefined || environmentHome === \"\"\n ? homedir()\n : environmentHome;\n if (path === \"~\") return home;\n if (path.startsWith(\"~/\")) return resolve(home, path.slice(2));\n return isAbsolute(path) ? path : resolve(context.cwd, path);\n}\n","import { realpath, stat } from \"fs/promises\";\nimport { basename, dirname, isAbsolute, join, relative, resolve } from \"path\";\n\nimport {\n formatLocatedWikiGraphUri,\n formatWikiGraphLibraryUri,\n listWikiGraphLibraries,\n listWikiGraphLibraryArchives,\n parseLocatedWikiGraphUri,\n parseWikiGraphLibraryUri,\n resolveWikiGraphLibrary,\n resolveWikiGraphLibraryArchiveFile,\n type ParsedWikiGraphLibraryUri,\n type QueryIndexScope,\n type File,\n} from \"wiki-graph-core\";\n\nimport { getNodeResourcePath, NodeFile } from \"../node-platform.js\";\nimport { resolveWikiGraphRuntimePath } from \"../runtime-path.js\";\n\nexport type WikiGraphArchiveTarget =\n | {\n readonly kind: \"standalone\";\n readonly objectUri?: string;\n readonly path: string;\n }\n | {\n readonly kind: \"library\";\n readonly uri: string;\n };\n\nexport interface WikiGraphArchiveLocation {\n readonly archiveFile: File;\n readonly archiveKey: string;\n /** Logical archive locator. Never contains a managed archive's physical path. */\n readonly archivePath: string;\n readonly indexScope: QueryIndexScope;\n readonly libraryArchiveTarget?: ParsedWikiGraphLibraryUri;\n readonly locatedUri: string;\n readonly publicArchiveUri?: string;\n readonly target: WikiGraphArchiveTarget;\n}\n\nexport class WikiGraphArchiveOwnershipError extends Error {\n public readonly code = \"WIKI_GRAPH_ARCHIVE_OWNERSHIP_MISMATCH\";\n\n public constructor(message: string) {\n super(message);\n this.name = \"WikiGraphArchiveOwnershipError\";\n }\n}\n\nexport async function resolveWikiGraphArchiveLocation(\n target: WikiGraphArchiveTarget,\n): Promise<WikiGraphArchiveLocation> {\n if (target.kind === \"standalone\") {\n return await resolveStandaloneLocation(target);\n }\n return await resolveLibraryLocation(target);\n}\n\nexport async function assertStandaloneWikiGraphArchivePath(\n inputPath: string,\n): Promise<string> {\n const path = resolveWikiGraphRuntimePath(inputPath);\n const candidate = await canonicalPath(path);\n const candidateIdentity = await readFileIdentity(path);\n const libraries = await listWikiGraphLibraries();\n const matches = await findMatchingMembers(\n libraries,\n candidate,\n candidateIdentity,\n );\n if (matches.length > 0) {\n const match = requireUnambiguousManagedMatch(path, matches);\n throw new WikiGraphArchiveOwnershipError(\n `Standalone archive path belongs to registered library ${formatWikiGraphLibraryUri(\n match.library.isDefault ? undefined : match.library.publicId,\n )}: ${path}. Use the library UUID URI ${match.archive.uri} instead.`,\n );\n }\n for (const library of libraries) {\n const rootPath = getNodeResourcePath(library.folder);\n const root = await canonicalPath(rootPath);\n if (!isWithin(root, candidate)) continue;\n throw new WikiGraphArchiveOwnershipError(\n `Standalone archive path belongs to registered library ${formatWikiGraphLibraryUri(\n library.isDefault ? undefined : library.publicId,\n )}: ${path}. Scan the library, then address the archive by its library UUID URI.`,\n );\n }\n return path;\n}\n\nexport function archiveTargetFromLogicalLocator(\n locator: string,\n objectUri?: string,\n): WikiGraphArchiveTarget {\n if (locator.startsWith(\"wikg://lib/\")) {\n return { kind: \"library\", uri: withObjectUri(locator, objectUri) };\n }\n return {\n kind: \"standalone\",\n path: locator,\n ...(objectUri === undefined ? {} : { objectUri }),\n };\n}\n\nexport async function resolveWikiGraphArchiveTarget(\n file: File,\n): Promise<WikiGraphArchiveTarget> {\n const path = getNodeResourcePath(file);\n const candidate = await canonicalPath(path);\n const candidateIdentity = await readFileIdentity(path);\n const matches = await findMatchingMembers(\n await listWikiGraphLibraries(),\n candidate,\n candidateIdentity,\n );\n if (matches.length > 0) {\n const match = requireUnambiguousManagedMatch(path, matches);\n return { kind: \"library\", uri: match.archive.uri };\n }\n return { kind: \"standalone\", path: getNodeResourcePath(file) };\n}\n\nasync function resolveStandaloneLocation(\n target: Extract<WikiGraphArchiveTarget, { readonly kind: \"standalone\" }>,\n): Promise<WikiGraphArchiveLocation> {\n if (target.path.startsWith(\"wikg://lib/\")) {\n throw new WikiGraphArchiveOwnershipError(\n `A library archive URI cannot be used as a standalone path: ${target.path}`,\n );\n }\n const path = await assertStandaloneWikiGraphArchivePath(target.path);\n const normalized: WikiGraphArchiveTarget = {\n kind: \"standalone\",\n path,\n ...(target.objectUri === undefined ? {} : { objectUri: target.objectUri }),\n };\n return {\n archiveFile: new NodeFile(path),\n archiveKey: path,\n archivePath: path,\n indexScope: { archiveKey: path, archivePath: path, kind: \"archive-index\" },\n locatedUri: formatLocatedWikiGraphUri(path, target.objectUri),\n target: normalized,\n };\n}\n\nasync function resolveLibraryLocation(\n target: Extract<WikiGraphArchiveTarget, { readonly kind: \"library\" }>,\n): Promise<WikiGraphArchiveLocation> {\n const parsedLocated = parseLocatedWikiGraphUri(target.uri);\n const archiveUri = parsedLocated.archivePath ?? target.uri;\n const parsed = parseWikiGraphLibraryUri(archiveUri);\n if (parsed?.kind !== \"archive\") {\n throw new WikiGraphArchiveOwnershipError(\n `Library archive target must be a UUID archive URI: ${target.uri}`,\n );\n }\n // Resolving the library first distinguishes a missing membership database\n // from an ordinary file path and prevents path fallback.\n await resolveWikiGraphLibrary(parsed);\n const archiveFile = await resolveWikiGraphLibraryArchiveFile(archiveUri);\n const normalized: WikiGraphArchiveTarget = {\n kind: \"library\",\n uri: target.uri,\n };\n return {\n archiveFile,\n archiveKey: archiveUri,\n archivePath: archiveUri,\n indexScope: {\n archiveKey: archiveUri,\n archivePath: archiveUri,\n kind: \"archive-index\",\n },\n libraryArchiveTarget: parsed,\n locatedUri: target.uri,\n publicArchiveUri: archiveUri,\n target: normalized,\n };\n}\n\nfunction withObjectUri(archiveLocator: string, objectUri?: string): string {\n if (objectUri === undefined) return archiveLocator;\n const path = objectUri.replace(/^wikg:\\/\\//u, \"\");\n return `${archiveLocator.replace(/\\/$/u, \"\")}/${path}`;\n}\n\nasync function canonicalPath(path: string): Promise<string> {\n try {\n return await realpath(path);\n } catch {\n const absolute = resolve(path);\n const parent = dirname(absolute);\n return parent === absolute\n ? absolute\n : join(await canonicalPath(parent), basename(absolute));\n }\n}\n\nfunction isWithin(root: string, candidate: string): boolean {\n const child = relative(root, candidate);\n return child === \"\" || (!child.startsWith(\"..\") && !isAbsolute(child));\n}\n\ntype ListedLibrary = Awaited<ReturnType<typeof listWikiGraphLibraries>>[number];\ntype ListedArchive = Awaited<\n ReturnType<typeof listWikiGraphLibraryArchives>\n>[number];\n\ninterface ManagedArchiveMatch {\n readonly archive: ListedArchive;\n readonly library: ListedLibrary;\n readonly memberPath: string;\n}\n\nasync function findMatchingMembers(\n libraries: Awaited<ReturnType<typeof listWikiGraphLibraries>>,\n candidate: string,\n candidateIdentity?: string,\n): Promise<readonly ManagedArchiveMatch[]> {\n const members: ManagedArchiveMatch[] = [];\n for (const library of libraries) {\n const archives = await listWikiGraphLibraryArchives({\n isDefault: library.isDefault,\n kind: \"scope\",\n ...(library.isDefault ? {} : { publicId: library.publicId }),\n });\n for (const archive of archives) {\n if (archive.file === undefined) continue;\n members.push({\n archive,\n library,\n memberPath: getNodeResourcePath(archive.file),\n });\n }\n }\n\n const exact: ManagedArchiveMatch[] = [];\n for (const member of members) {\n if ((await canonicalPath(member.memberPath)) === candidate) {\n exact.push(member);\n }\n }\n if (exact.length > 0 || candidateIdentity === undefined) return exact;\n\n const identityMatches: ManagedArchiveMatch[] = [];\n for (const member of members) {\n if ((await readFileIdentity(member.memberPath)) === candidateIdentity) {\n identityMatches.push(member);\n }\n }\n return identityMatches;\n}\n\nfunction requireUnambiguousManagedMatch(\n path: string,\n matches: readonly ManagedArchiveMatch[],\n): ManagedArchiveMatch {\n if (matches.length === 1) return matches[0]!;\n throw new WikiGraphArchiveOwnershipError(\n `Archive file identity is ambiguous across managed archives: ${path}. Use an explicit library UUID URI (${matches\n .map((match) => match.archive.uri)\n .join(\", \")}).`,\n );\n}\n\nasync function readFileIdentity(path: string): Promise<string | undefined> {\n try {\n const value = await stat(path);\n return `${value.dev}:${value.ino}`;\n } catch {\n return undefined;\n }\n}\n","import {\n openWikimediaResolver,\n type SearchIndexEmbeddingProvider,\n} from \"wiki-graph-core\";\n\nimport {\n buildSearchIndexEmbeddingProvider,\n readWikiGraphEmbeddingConfig,\n} from \"./embedding.js\";\nimport { loadWikiGraphRuntimeConfig } from \"./runtime-config.js\";\nimport { getWikiGraphSDKProviders } from \"./runtime-context.js\";\n\nexport async function createConfiguredEmbeddingProvider(): Promise<\n SearchIndexEmbeddingProvider | undefined\n> {\n const injected = getWikiGraphSDKProviders().embedding;\n if (injected !== undefined) return injected;\n const config = await readWikiGraphEmbeddingConfig();\n if (\n config.provider === undefined ||\n config.model === undefined ||\n (config.provider === \"openai-compatible\" && config.baseURL === undefined) ||\n (config.provider === \"openai\" && config.baseURL !== undefined)\n ) {\n return undefined;\n }\n return buildSearchIndexEmbeddingProvider(config);\n}\n\nexport async function withConfiguredWikimediaResolver<T>(\n objectUri: string,\n operation: (\n options:\n | Record<string, never>\n | {\n readonly wikimediaResolver: Awaited<\n ReturnType<typeof openWikimediaResolver>\n >;\n },\n ) => Promise<T>,\n): Promise<T> {\n if (!objectUri.endsWith(\"/wikipage\")) return await operation({});\n\n const config = await loadWikiGraphRuntimeConfig();\n const resolver = await openWikimediaResolver(\n config.wikimedia === undefined\n ? { kind: \"local\" }\n : {\n endpoint: config.wikimedia.endpoint,\n kind: \"remote\",\n token: config.wikimedia.token,\n },\n );\n try {\n return await operation({ wikimediaResolver: resolver });\n } finally {\n await resolver.close();\n }\n}\n","import type { SearchIndexEmbeddingProvider } from \"wiki-graph-core\";\n\nimport { embed, embedMany } from \"ai\";\nimport { createOpenAI } from \"@ai-sdk/openai\";\nimport { createOpenAICompatible } from \"@ai-sdk/openai-compatible\";\n\nimport { readLocalConfigSection } from \"./local-config.js\";\n\nexport type WikiGraphEmbeddingProviderName = \"openai\" | \"openai-compatible\";\n\nexport interface WikiGraphEmbeddingConfig {\n readonly apiKey?: string;\n readonly baseURL?: string;\n readonly dimensions?: number;\n readonly model?: string;\n readonly name?: string;\n readonly provider?: WikiGraphEmbeddingProviderName;\n}\n\nexport interface QueryEmbeddingResult {\n readonly dimensions: number;\n readonly embedding: readonly number[];\n readonly model: string;\n readonly provider: WikiGraphEmbeddingProviderName;\n readonly usage?: {\n readonly tokens?: number;\n };\n}\n\nconst EMBEDDING_BATCH_SIZE = 10;\n\nexport async function readWikiGraphEmbeddingConfig(): Promise<WikiGraphEmbeddingConfig> {\n const config = await readLocalConfigSection(\"embeddings\");\n\n return {\n ...(typeof config.apiKey === \"string\" ? { apiKey: config.apiKey } : {}),\n ...(typeof config.baseURL === \"string\" ? { baseURL: config.baseURL } : {}),\n ...(typeof config.dimensions === \"number\"\n ? { dimensions: config.dimensions }\n : {}),\n ...(typeof config.model === \"string\" ? { model: config.model } : {}),\n ...(typeof config.name === \"string\" ? { name: config.name } : {}),\n ...(typeof config.provider === \"string\"\n ? { provider: parseEmbeddingProvider(config.provider) }\n : {}),\n };\n}\n\nexport async function embedQueryText(\n value: string,\n config: WikiGraphEmbeddingConfig = {},\n): Promise<QueryEmbeddingResult> {\n const normalized = value.trim();\n\n if (normalized === \"\") {\n throw new Error(\"Query text cannot be empty.\");\n }\n\n const provider = requireEmbeddingProvider(config.provider);\n const model = requireEmbeddingModel(config.model);\n const embeddingModel = createEmbeddingModel(provider, model, config);\n const providerOptions = createEmbeddingProviderOptions(provider, config);\n const result = await embed({\n model: embeddingModel,\n ...(providerOptions === undefined ? {} : { providerOptions }),\n value: normalized,\n });\n\n return {\n dimensions: result.embedding.length,\n embedding: result.embedding,\n model,\n provider,\n ...(result.usage.tokens === undefined\n ? {}\n : { usage: { tokens: result.usage.tokens } }),\n };\n}\n\nexport function buildSearchIndexEmbeddingProvider(\n config: WikiGraphEmbeddingConfig,\n): SearchIndexEmbeddingProvider {\n const provider = requireEmbeddingProvider(config.provider);\n const model = requireEmbeddingModel(config.model);\n const embeddingModel = createEmbeddingModel(provider, model, config);\n const providerOptions = createEmbeddingProviderOptions(provider, config);\n\n return {\n ...(config.dimensions === undefined\n ? {}\n : { dimensions: config.dimensions }),\n identity: createEmbeddingIdentity(provider, model, config),\n model,\n embedTexts: async (texts, options) => {\n const embeddings: number[][] = [];\n let tokens = 0;\n\n for (const batch of chunkTexts(texts, EMBEDDING_BATCH_SIZE)) {\n options?.signal?.throwIfAborted();\n const result = await embedMany({\n ...(options?.signal === undefined\n ? {}\n : { abortSignal: options.signal }),\n model: embeddingModel,\n ...(providerOptions === undefined ? {} : { providerOptions }),\n values: [...batch],\n });\n\n embeddings.push(...result.embeddings);\n tokens += result.usage.tokens ?? 0;\n }\n return {\n embeddings,\n ...(tokens === 0 ? {} : { tokens }),\n };\n },\n };\n}\n\nfunction createEmbeddingIdentity(\n provider: WikiGraphEmbeddingProviderName,\n model: string,\n config: WikiGraphEmbeddingConfig,\n): string {\n return JSON.stringify({\n ...(config.baseURL === undefined ? {} : { baseURL: config.baseURL }),\n ...(config.dimensions === undefined\n ? {}\n : { dimensions: config.dimensions }),\n model,\n provider,\n });\n}\n\nfunction* chunkTexts(\n texts: readonly string[],\n size: number,\n): Iterable<readonly string[]> {\n for (let index = 0; index < texts.length; index += size) {\n yield texts.slice(index, index + size);\n }\n}\n\nexport async function embedQueryTextWithLocalConfig(\n value: string,\n): Promise<QueryEmbeddingResult> {\n return await embedQueryText(value, await readWikiGraphEmbeddingConfig());\n}\n\nfunction createEmbeddingModel(\n provider: WikiGraphEmbeddingProviderName,\n model: string,\n config: WikiGraphEmbeddingConfig,\n) {\n switch (provider) {\n case \"openai\": {\n if (config.baseURL !== undefined) {\n throw new Error(\n \"openai does not accept embeddings.baseURL. Use openai-compatible for third-party OpenAI-style embeddings APIs.\",\n );\n }\n\n return createOpenAI({\n ...(config.apiKey === undefined ? {} : { apiKey: config.apiKey }),\n ...(config.name === undefined ? {} : { name: config.name }),\n }).embeddingModel(model);\n }\n case \"openai-compatible\": {\n if (config.baseURL === undefined) {\n throw new Error(\"openai-compatible requires embeddings.baseURL.\");\n }\n\n return createOpenAICompatible({\n baseURL: config.baseURL,\n name: config.name ?? createOpenAICompatibleName(config.baseURL),\n ...(config.apiKey === undefined ? {} : { apiKey: config.apiKey }),\n }).embeddingModel(model);\n }\n }\n}\n\nfunction createEmbeddingProviderOptions(\n provider: WikiGraphEmbeddingProviderName,\n config: WikiGraphEmbeddingConfig,\n): Record<string, { readonly dimensions: number }> | undefined {\n if (config.dimensions === undefined) {\n return undefined;\n }\n\n return {\n [getEmbeddingProviderOptionsName(provider, config)]: {\n dimensions: config.dimensions,\n },\n };\n}\n\nfunction getEmbeddingProviderOptionsName(\n provider: WikiGraphEmbeddingProviderName,\n _config: WikiGraphEmbeddingConfig,\n): string {\n if (provider === \"openai\") {\n return \"openai\";\n }\n return \"openaiCompatible\";\n}\n\nfunction requireEmbeddingProvider(\n provider: WikiGraphEmbeddingProviderName | undefined,\n): WikiGraphEmbeddingProviderName {\n if (provider !== undefined) {\n return provider;\n }\n\n throw new Error(\n \"Missing embeddings configuration. Configure `wikg://local/config/embeddings` with provider and model.\",\n );\n}\n\nfunction requireEmbeddingModel(model: string | undefined): string {\n if (model !== undefined) {\n return model;\n }\n\n throw new Error(\n \"Missing embeddings.model. Configure `wikg://local/config/embeddings` before using Dense search.\",\n );\n}\n\nfunction parseEmbeddingProvider(value: string): WikiGraphEmbeddingProviderName {\n switch (value) {\n case \"openai\":\n case \"openai-compatible\":\n return value;\n default:\n throw new Error(\n `Invalid embeddings.provider: ${value}. Expected openai or openai-compatible.`,\n );\n }\n}\n\nfunction createOpenAICompatibleName(baseURL: string): string {\n try {\n return new URL(baseURL).hostname;\n } catch {\n return \"openai-compatible\";\n }\n}\n","import {\n isArchiveSearchIndexCurrent,\n listChapters,\n type ChapterEntry,\n type IndexArtifactCoverageRecord,\n type IndexArtifactKind,\n type ReadonlyDocument,\n} from \"wiki-graph-core\";\n\nexport interface WikiGraphArchiveIndexArtifactInspection {\n readonly current: boolean;\n readonly exists: boolean;\n readonly kind: IndexArtifactKind;\n readonly sourceRevision?: number;\n}\n\nexport interface WikiGraphArchiveChapterInspection {\n readonly capabilities: {\n readonly knowledgeGraph: { readonly completed: boolean };\n readonly readingGraph: { readonly completed: boolean };\n readonly readingSummary: { readonly completed: boolean };\n };\n readonly chapter: ChapterEntry;\n readonly indexes: {\n readonly fts: WikiGraphArchiveIndexArtifactInspection;\n readonly sourceEmbedding: WikiGraphArchiveIndexArtifactInspection;\n readonly summaryEmbedding: WikiGraphArchiveIndexArtifactInspection;\n };\n readonly revision: number;\n readonly summaryWords: number;\n}\n\nexport interface WikiGraphArchiveInspection {\n readonly archiveUri: string;\n readonly chapters: readonly WikiGraphArchiveChapterInspection[];\n readonly localIndexCache: { readonly current: boolean };\n readonly scope: {\n readonly chapterId?: number;\n readonly type: \"archive\" | \"chapter\";\n };\n readonly uri: string;\n}\n\nexport async function inspectWikiGraphArchive(\n document: ReadonlyDocument,\n options: {\n readonly archiveUri: string;\n readonly chapterId?: number;\n },\n): Promise<WikiGraphArchiveInspection> {\n const [allChapters, indexCacheCurrent, summaryWords, ...coverage] =\n await Promise.all([\n listChapters(document),\n isArchiveSearchIndexCurrent(document),\n readSummaryWords(document),\n document.indexArtifacts.listCoverage(\"fts\"),\n document.indexArtifacts.listCoverage(\"embedding-source\"),\n document.indexArtifacts.listCoverage(\"embedding-summary\"),\n ]);\n const chapters = selectChapters(allChapters, options.chapterId);\n const coverageByKind = {\n fts: byChapterId(coverage[0]),\n sourceEmbedding: byChapterId(coverage[1]),\n summaryEmbedding: byChapterId(coverage[2]),\n };\n const inspections = await Promise.all(\n chapters.map(async (chapter) => {\n const serial = await document.serials.getById(chapter.chapterId);\n return {\n capabilities: {\n knowledgeGraph: {\n completed: serial?.knowledgeGraphReady === true,\n },\n readingGraph: { completed: serial?.topologyReady === true },\n readingSummary: { completed: chapter.stage === \"summarized\" },\n },\n chapter,\n indexes: {\n fts: inspectArtifact(\n \"fts\",\n coverageByKind.fts.get(chapter.chapterId),\n ),\n sourceEmbedding: inspectArtifact(\n \"embedding-source\",\n coverageByKind.sourceEmbedding.get(chapter.chapterId),\n ),\n summaryEmbedding: inspectArtifact(\n \"embedding-summary\",\n coverageByKind.summaryEmbedding.get(chapter.chapterId),\n ),\n },\n revision: serial?.revision ?? 0,\n summaryWords: summaryWords.get(chapter.chapterId) ?? 0,\n } satisfies WikiGraphArchiveChapterInspection;\n }),\n );\n const selected = inspections[0];\n return {\n archiveUri: options.archiveUri,\n chapters: inspections,\n localIndexCache: { current: indexCacheCurrent },\n scope:\n options.chapterId === undefined\n ? { type: \"archive\" }\n : { chapterId: options.chapterId, type: \"chapter\" },\n uri:\n selected === undefined || options.chapterId === undefined\n ? options.archiveUri\n : formatLocatedChapterUri(options.archiveUri, selected.chapter),\n };\n}\n\nfunction selectChapters(\n chapters: readonly ChapterEntry[],\n chapterId: number | undefined,\n): readonly ChapterEntry[] {\n if (chapterId === undefined) return chapters;\n const selected = chapters.filter(\n (chapter) => chapter.chapterId === chapterId,\n );\n if (selected.length === 0) {\n throw new Error(`Chapter ${chapterId} does not exist.`);\n }\n return selected;\n}\n\nfunction byChapterId(\n coverage: readonly IndexArtifactCoverageRecord[],\n): ReadonlyMap<number, IndexArtifactCoverageRecord> {\n return new Map(coverage.map((item) => [item.serialId, item]));\n}\n\nfunction inspectArtifact(\n kind: IndexArtifactKind,\n coverage: IndexArtifactCoverageRecord | undefined,\n): WikiGraphArchiveIndexArtifactInspection {\n return {\n current: coverage?.current === true,\n exists: coverage?.sourceRevision !== undefined,\n kind,\n ...(coverage?.sourceRevision === undefined\n ? {}\n : { sourceRevision: coverage.sourceRevision }),\n };\n}\n\nasync function readSummaryWords(\n document: ReadonlyDocument,\n): Promise<ReadonlyMap<number, number>> {\n const rows = await document.readDatabase(\n async (database) =>\n await database.queryAll(\n `\n SELECT chapter_id, COALESCE(SUM(words_count), 0) AS words\n FROM text_sentence_records\n WHERE kind = 2\n GROUP BY chapter_id\n `,\n undefined,\n (row) => ({\n chapterId: Number(row.chapter_id),\n words: Number(row.words),\n }),\n ),\n );\n return new Map(rows.map((row) => [row.chapterId, row.words]));\n}\n\nfunction formatLocatedChapterUri(\n archiveUri: string,\n chapter: Pick<ChapterEntry, \"uri\">,\n): string {\n return `${archiveUri.replace(/\\/+$/u, \"\")}/${chapter.uri.replace(/^wikg:\\/\\//u, \"\")}`;\n}\n","import {\n WikiGraphArchiveFile,\n writeWikiGraphLibraryArchive,\n type DirectoryDocument,\n type File,\n} from \"wiki-graph-core\";\n\nimport type { WikiGraphArchiveLocation } from \"./target.js\";\n\nexport interface WriteWikiGraphArchiveLocationOptions {\n readonly invalidateContinuationCursors?: boolean;\n readonly onIndexSyncError?: (error: unknown) => void;\n readonly refreshLibraryIndex?: boolean;\n readonly searchIndexWritebackPolicy?: \"archive\" | \"cache\";\n}\n\nexport async function writeWikiGraphArchiveLocation<T>(\n location: WikiGraphArchiveLocation,\n operation: (document: DirectoryDocument) => Promise<T> | T,\n options: WriteWikiGraphArchiveLocationOptions = {},\n): Promise<T> {\n const cacheOnly = options.searchIndexWritebackPolicy === \"cache\";\n const write = async (archiveFile: File = location.archiveFile) =>\n await new WikiGraphArchiveFile(archiveFile).write(operation, {\n ...(cacheOnly\n ? {}\n : { derivedStateKeys: [location.archiveKey, location.archivePath] }),\n ...(options.invalidateContinuationCursors === undefined\n ? {}\n : {\n invalidateContinuationCursors:\n options.invalidateContinuationCursors,\n }),\n ...(options.searchIndexWritebackPolicy === undefined\n ? {}\n : { searchIndexWritebackPolicy: options.searchIndexWritebackPolicy }),\n });\n\n if (\n location.libraryArchiveTarget === undefined ||\n cacheOnly ||\n options.refreshLibraryIndex === false\n ) {\n return await write();\n }\n return await writeWikiGraphLibraryArchive({\n additionalDerivedStateKeys: [location.archiveKey, location.archivePath],\n ...(options.invalidateContinuationCursors === undefined\n ? {}\n : {\n invalidateContinuationCursors: options.invalidateContinuationCursors,\n }),\n ...(options.onIndexSyncError === undefined\n ? {}\n : { onIndexSyncError: options.onIndexSyncError }),\n operation: async (archiveFile) => await write(archiveFile),\n target: location.libraryArchiveTarget,\n });\n}\n","/** Options that may be changed while advancing an existing cursor. */\nexport interface CursorNextOptions {\n readonly limit?: number;\n readonly signal?: AbortSignal;\n}\n\n/** A runtime page constructor used for page-type identity and reconstruction. */\nexport type PageClass<P> = abstract new (...args: never[]) => P;\n\n/** The common, deliberately small surface shared by SDK result pages. */\nexport interface IPage<T> extends Iterable<T> {\n nextCursor(): ICursor<this> | null;\n}\n\n/** A lazy continuation associated with a concrete page class. */\nexport interface ICursor<P extends IPage<unknown>> {\n readonly pageClass: PageClass<P>;\n next(options?: CursorNextOptions): Promise<P>;\n token(): Promise<string>;\n release(): Promise<void>;\n}\n\nexport interface CursorImplementation<P extends IPage<unknown>> {\n readonly pageClass: PageClass<P>;\n readonly next: (options: CursorNextOptions) => Promise<P>;\n readonly token: () => Promise<string>;\n readonly release?: () => Promise<void> | void;\n}\n\nexport interface PageCursorImplementation<P extends IPage<unknown>> {\n readonly pageClass: PageClass<P>;\n readonly rawCursor: string;\n readonly next: (rawCursor: string, options: CursorNextOptions) => Promise<P>;\n readonly createToken: (rawCursor: string) => Promise<string>;\n readonly releaseToken?: (token: string) => Promise<void> | void;\n}\n\n/**\n * Creates a cursor without retaining the page that created it. The callbacks\n * are deliberately supplied by the SDK operation that owns continuation\n * persistence; this type is only the lifecycle/typing facade.\n */\nexport function createCursor<P extends IPage<unknown>>(\n implementation: CursorImplementation<P>,\n): ICursor<P> {\n let released = false;\n\n const assertLive = (): void => {\n if (released) throw new Error(\"Cursor has been released.\");\n };\n\n return {\n pageClass: implementation.pageClass,\n async next(options: CursorNextOptions = {}): Promise<P> {\n assertLive();\n return await implementation.next(options);\n },\n async token(): Promise<string> {\n assertLive();\n return await implementation.token();\n },\n async release(): Promise<void> {\n if (released) return;\n released = true;\n await implementation.release?.();\n },\n };\n}\n\n/** Adapts an existing raw cursor while creating durable state only on demand. */\nexport function createPageCursor<P extends IPage<unknown>>(\n implementation: PageCursorImplementation<P>,\n): ICursor<P> {\n let token: string | undefined;\n return createCursor({\n pageClass: implementation.pageClass,\n next: async (options) =>\n await implementation.next(implementation.rawCursor, options),\n token: async () => {\n token ??= await implementation.createToken(implementation.rawCursor);\n return token;\n },\n release: async () => {\n if (token !== undefined) await implementation.releaseToken?.(token);\n token = undefined;\n },\n });\n}\n\n/** Iterates concrete pages and releases each page cursor after advancing. */\nexport async function* iteratePages<P extends IPage<T>, T>(\n firstPage: P,\n options: CursorNextOptions = {},\n): AsyncIterable<P> {\n let page = firstPage;\n\n while (true) {\n yield page;\n const cursor = page.nextCursor();\n if (cursor === null) return;\n\n try {\n const nextPage = await cursor.next(options);\n await cursor.release();\n page = nextPage;\n } catch (error) {\n await cursor.release();\n throw error;\n }\n }\n}\n\n/** Iterates items across all pages while managing every continuation cursor. */\nexport async function* iterateItems<P extends IPage<T>, T>(\n firstPage: P,\n options: CursorNextOptions = {},\n): AsyncIterable<T> {\n for await (const page of iteratePages(firstPage, options)) {\n yield* page;\n }\n}\n","import type {\n ArchiveCollectionResult,\n ArchiveEvidence,\n ArchiveFindHit,\n ArchiveFindResult,\n ArchiveListItem,\n ArchiveRelatedResult,\n ArchiveSourceLocator,\n ArchiveSourceLocatorResult,\n WikiGraphLibrarySearchBucketPage,\n} from \"wiki-graph-core\";\n\nimport {\n createPageCursor,\n type CursorNextOptions,\n type ICursor,\n type IPage,\n type PageClass,\n} from \"./pages.js\";\n\nexport class ArchiveFindPage implements IPage<ArchiveFindHit> {\n public readonly result: ArchiveFindResult;\n public readonly chapters: ArchiveFindResult[\"chapters\"];\n public readonly items: ArchiveFindResult[\"items\"];\n public readonly lens: ArchiveFindResult[\"lens\"];\n public readonly lensHint: ArchiveFindResult[\"lensHint\"];\n public readonly limit: number;\n public readonly match: ArchiveFindResult[\"match\"];\n public readonly rawNextCursor: string | null;\n public readonly order: ArchiveFindResult[\"order\"];\n public readonly query: string;\n public readonly terms: readonly string[];\n public readonly types: ArchiveFindResult[\"types\"];\n readonly #cursor: ICursor<this> | null;\n\n public constructor(\n result: ArchiveFindResult,\n cursor: ICursor<ArchiveFindPage> | null = null,\n ) {\n this.result = result;\n this.chapters = result.chapters;\n this.items = result.items;\n this.lens = result.lens;\n this.lensHint = result.lensHint;\n this.limit = result.limit;\n this.match = result.match;\n this.rawNextCursor = result.nextCursor;\n this.order = result.order;\n this.query = result.query;\n this.terms = result.terms;\n this.types = result.types;\n this.#cursor = cursor as ICursor<this> | null;\n }\n\n public static readonly pageClass: PageClass<ArchiveFindPage> =\n ArchiveFindPage;\n public [Symbol.iterator](): Iterator<ArchiveFindHit> {\n return this.items[Symbol.iterator]();\n }\n public nextCursor(): ICursor<this> | null {\n return this.#cursor;\n }\n}\n\nexport class ArchiveCollectionPage implements IPage<ArchiveFindHit> {\n public readonly result: ArchiveCollectionResult;\n public readonly chapters: ArchiveCollectionResult[\"chapters\"];\n public readonly ids: ArchiveCollectionResult[\"ids\"];\n public readonly items: ArchiveCollectionResult[\"items\"];\n public readonly limit: number;\n public readonly rawNextCursor: string | null;\n public readonly order: ArchiveCollectionResult[\"order\"];\n public readonly types: ArchiveCollectionResult[\"types\"];\n readonly #cursor: ICursor<this> | null;\n\n public constructor(\n result: ArchiveCollectionResult,\n cursor: ICursor<ArchiveCollectionPage> | null = null,\n ) {\n this.result = result;\n this.chapters = result.chapters;\n this.ids = result.ids;\n this.items = result.items;\n this.limit = result.limit;\n this.rawNextCursor = result.nextCursor;\n this.order = result.order;\n this.types = result.types;\n this.#cursor = cursor as ICursor<this> | null;\n }\n\n public static readonly pageClass: PageClass<ArchiveCollectionPage> =\n ArchiveCollectionPage;\n public [Symbol.iterator](): Iterator<ArchiveFindHit> {\n return this.items[Symbol.iterator]();\n }\n public nextCursor(): ICursor<this> | null {\n return this.#cursor;\n }\n}\n\nexport class ArchiveEvidencePage implements IPage<\n ArchiveEvidence[\"items\"][number]\n> {\n public readonly result: ArchiveEvidence;\n public readonly items: ArchiveEvidence[\"items\"];\n public readonly limit: number;\n public readonly rawNextCursor: string | null;\n readonly #cursor: ICursor<this> | null;\n\n public constructor(\n result: ArchiveEvidence,\n cursor: ICursor<ArchiveEvidencePage> | null = null,\n ) {\n this.result = result;\n this.items = result.items;\n this.limit = result.limit;\n this.rawNextCursor = result.nextCursor;\n this.#cursor = cursor as ICursor<this> | null;\n }\n\n public static readonly pageClass: PageClass<ArchiveEvidencePage> =\n ArchiveEvidencePage;\n public [Symbol.iterator](): Iterator<ArchiveEvidence[\"items\"][number]> {\n return this.items[Symbol.iterator]();\n }\n public nextCursor(): ICursor<this> | null {\n return this.#cursor;\n }\n}\n\nexport class ArchiveRelatedPage implements IPage<ArchiveListItem> {\n public readonly result: ArchiveRelatedResult;\n public readonly items: ArchiveRelatedResult[\"items\"];\n public readonly limit: number;\n public readonly rawNextCursor: string | null;\n readonly #cursor: ICursor<this> | null;\n\n public constructor(\n result: ArchiveRelatedResult,\n cursor: ICursor<ArchiveRelatedPage> | null = null,\n ) {\n this.result = result;\n this.items = result.items;\n this.limit = result.limit;\n this.rawNextCursor = result.nextCursor;\n this.#cursor = cursor as ICursor<this> | null;\n }\n\n public static readonly pageClass: PageClass<ArchiveRelatedPage> =\n ArchiveRelatedPage;\n public [Symbol.iterator](): Iterator<ArchiveListItem> {\n return this.items[Symbol.iterator]();\n }\n public nextCursor(): ICursor<this> | null {\n return this.#cursor;\n }\n}\n\nexport class ArchiveSourceLocatorPage implements IPage<ArchiveSourceLocator> {\n public readonly result: ArchiveSourceLocatorResult;\n public readonly items: ArchiveSourceLocatorResult[\"items\"];\n public readonly limit: number;\n public readonly rawNextCursor: string | null;\n readonly #cursor: ICursor<this> | null;\n\n public constructor(\n result: ArchiveSourceLocatorResult,\n cursor: ICursor<ArchiveSourceLocatorPage> | null = null,\n ) {\n this.result = result;\n this.items = result.items;\n this.limit = result.limit;\n this.rawNextCursor = result.nextCursor;\n this.#cursor = cursor as ICursor<this> | null;\n }\n\n public static readonly pageClass: PageClass<ArchiveSourceLocatorPage> =\n ArchiveSourceLocatorPage;\n public [Symbol.iterator](): Iterator<ArchiveSourceLocator> {\n return this.items[Symbol.iterator]();\n }\n public nextCursor(): ICursor<this> | null {\n return this.#cursor;\n }\n}\n\nexport function createArchiveFindPage(\n result: ArchiveFindResult,\n next: (\n cursor: string,\n options: CursorNextOptions,\n ) => Promise<ArchiveFindPage>,\n createToken: (cursor: string) => Promise<string>,\n releaseToken: (token: string) => Promise<void>,\n): ArchiveFindPage {\n return new ArchiveFindPage(\n result,\n result.nextCursor === null\n ? null\n : createPageCursor({\n pageClass: ArchiveFindPage,\n rawCursor: result.nextCursor,\n next,\n createToken,\n releaseToken,\n }),\n );\n}\n\nexport function createArchiveCollectionPage(\n result: ArchiveCollectionResult,\n next: (\n cursor: string,\n options: CursorNextOptions,\n ) => Promise<ArchiveCollectionPage>,\n createToken: (cursor: string) => Promise<string>,\n releaseToken: (token: string) => Promise<void>,\n): ArchiveCollectionPage {\n return new ArchiveCollectionPage(\n result,\n result.nextCursor === null\n ? null\n : createPageCursor({\n pageClass: ArchiveCollectionPage,\n rawCursor: result.nextCursor,\n next,\n createToken,\n releaseToken,\n }),\n );\n}\n\nexport function createArchiveEvidencePage(\n result: ArchiveEvidence,\n next: (\n cursor: string,\n options: CursorNextOptions,\n ) => Promise<ArchiveEvidencePage>,\n createToken: (cursor: string) => Promise<string>,\n releaseToken: (token: string) => Promise<void>,\n): ArchiveEvidencePage {\n return new ArchiveEvidencePage(\n result,\n result.nextCursor === null\n ? null\n : createPageCursor({\n pageClass: ArchiveEvidencePage,\n rawCursor: result.nextCursor,\n next,\n createToken,\n releaseToken,\n }),\n );\n}\n\nexport function createArchiveRelatedPage(\n result: ArchiveRelatedResult,\n next: (\n cursor: string,\n options: CursorNextOptions,\n ) => Promise<ArchiveRelatedPage>,\n createToken: (cursor: string) => Promise<string>,\n releaseToken: (token: string) => Promise<void>,\n): ArchiveRelatedPage {\n return new ArchiveRelatedPage(\n result,\n result.nextCursor === null\n ? null\n : createPageCursor({\n pageClass: ArchiveRelatedPage,\n rawCursor: result.nextCursor,\n next,\n createToken,\n releaseToken,\n }),\n );\n}\n\nexport function createArchiveSourceLocatorPage(\n result: ArchiveSourceLocatorResult,\n next: (\n cursor: string,\n options: CursorNextOptions,\n ) => Promise<ArchiveSourceLocatorPage>,\n createToken: (cursor: string) => Promise<string>,\n releaseToken: (token: string) => Promise<void>,\n): ArchiveSourceLocatorPage {\n return new ArchiveSourceLocatorPage(\n result,\n result.nextCursor === null\n ? null\n : createPageCursor({\n pageClass: ArchiveSourceLocatorPage,\n rawCursor: result.nextCursor,\n next,\n createToken,\n releaseToken,\n }),\n );\n}\n\nexport class LibraryBucketPage implements IPage<ArchiveFindHit> {\n public readonly id: string;\n public readonly items: readonly ArchiveFindHit[];\n public readonly rawNextCursor: string | null;\n public readonly query: string;\n public readonly terms: readonly string[];\n public readonly types: WikiGraphLibrarySearchBucketPage[\"types\"];\n readonly #cursor: ICursor<this> | null;\n\n public constructor(\n result: WikiGraphLibrarySearchBucketPage,\n cursor: ICursor<LibraryBucketPage> | null = null,\n ) {\n this.id = result.id;\n this.items = result.items;\n this.rawNextCursor = result.nextCursor;\n this.query = result.query;\n this.terms = result.terms;\n this.types = result.types;\n this.#cursor = cursor as ICursor<this> | null;\n }\n\n public static readonly pageClass: PageClass<LibraryBucketPage> =\n LibraryBucketPage;\n public [Symbol.iterator](): Iterator<ArchiveFindHit> {\n return this.items[Symbol.iterator]();\n }\n public nextCursor(): ICursor<this> | null {\n return this.#cursor;\n }\n}\n\nexport function createLibraryBucketPage(\n result: WikiGraphLibrarySearchBucketPage,\n next: (\n cursor: string,\n options: CursorNextOptions,\n ) => Promise<LibraryBucketPage>,\n createToken: (cursor: string) => Promise<string>,\n releaseToken: (token: string) => Promise<void>,\n): LibraryBucketPage {\n return new LibraryBucketPage(\n result,\n result.nextCursor === null\n ? null\n : createPageCursor({\n pageClass: LibraryBucketPage,\n rawCursor: result.nextCursor,\n next,\n createToken,\n releaseToken,\n }),\n );\n}\n","import { spawn } from \"child_process\";\n\nimport type { WikispineCommandRunner } from \"wiki-graph-core\";\n\n/** Node host implementation for Core's optional WikiSpine command capability. */\nexport const nodeWikispineCommandRunner: WikispineCommandRunner = {\n run: async ({ args, command, input, onStdout, signal }) =>\n await new Promise((resolve, reject) => {\n signal?.throwIfAborted();\n const child = spawn(command, [...args], {\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n const stderr: Uint8Array[] = [];\n let stdoutQueue = Promise.resolve();\n let settled = false;\n const settle = (operation: () => void): void => {\n if (settled) return;\n settled = true;\n signal?.removeEventListener(\"abort\", abort);\n operation();\n };\n const abort = (): void => {\n child.kill();\n settle(() => reject(abortError(signal)));\n };\n signal?.addEventListener(\"abort\", abort, { once: true });\n\n child.stdout.setEncoding(\"utf8\");\n child.stdout.on(\"data\", (chunk: string) => {\n if (settled) return;\n child.stdout.pause();\n stdoutQueue = stdoutQueue\n .then(async () => await onStdout(chunk))\n .then(() => {\n child.stdout.resume();\n })\n .catch((error: unknown) => {\n child.kill();\n settle(() =>\n reject(error instanceof Error ? error : new Error(String(error))),\n );\n });\n });\n child.stderr.on(\"data\", (chunk: Uint8Array) => stderr.push(chunk));\n child.on(\"error\", (error) => {\n settle(() =>\n reject(\n new Error(`Failed to start wikispine command: ${error.message}`),\n ),\n );\n });\n child.on(\"close\", (exitCode) => {\n void stdoutQueue.then(() => {\n settle(() =>\n resolve({\n exitCode,\n stderr: Buffer.concat(stderr).toString(\"utf8\"),\n }),\n );\n });\n });\n child.stdin.end(input);\n }),\n};\n\nfunction abortError(signal: AbortSignal | undefined): Error {\n return signal?.reason instanceof Error\n ? signal.reason\n : new Error(\"WikiSpine command aborted.\");\n}\n","import {\n clearLocalConfigSection,\n deleteLocalConfigValue,\n maskLocalConfigSection,\n putLocalConfigValue,\n readLocalConfigSection,\n replaceLocalConfigSection,\n type LocalConfigObject,\n type LocalConfigSection,\n} from \"./local-config.js\";\nimport type { WikiGraphJobRuntime } from \"./jobs.js\";\nimport { embedQueryText, readWikiGraphEmbeddingConfig } from \"./embedding.js\";\nimport { buildWikiGraphLLMOptions } from \"./llm.js\";\nimport {\n resolveWikispineConfig,\n type WikiGraphProvider,\n} from \"./runtime-config.js\";\nimport { nodeWikispineCommandRunner } from \"./wikispine.js\";\n\nexport interface WikiGraphProviderTestResult {\n readonly durationMs: number;\n readonly model?: string;\n readonly provider?: string;\n readonly response?: string;\n readonly dimensions?: number;\n readonly tokens?: number;\n readonly endpoint?: string;\n readonly metadata?: {\n readonly format: string;\n readonly qid_count: number;\n readonly surface_count: number;\n };\n}\n\nexport class WikiGraphConfigManager {\n readonly #runtime: WikiGraphJobRuntime;\n\n public constructor(runtime: WikiGraphJobRuntime) {\n this.#runtime = runtime;\n }\n\n public async get(\n section: LocalConfigSection,\n options: { readonly maskSecrets?: boolean } = {},\n ): Promise<LocalConfigObject> {\n const value = await this.#runtime.run(\n async () => await readLocalConfigSection(section),\n );\n return options.maskSecrets === true\n ? maskLocalConfigSection(section, value)\n : value;\n }\n\n public async replace(\n section: LocalConfigSection,\n value: LocalConfigObject,\n ): Promise<LocalConfigObject> {\n return await this.#runtime.run(\n async () => await replaceLocalConfigSection(section, value),\n );\n }\n\n public async put(\n section: LocalConfigSection,\n key: string,\n value: unknown,\n ): Promise<LocalConfigObject> {\n return await this.#runtime.run(\n async () => await putLocalConfigValue(section, key, value),\n );\n }\n\n public async delete(\n section: LocalConfigSection,\n key: string,\n ): Promise<LocalConfigObject> {\n return await this.#runtime.run(\n async () => await deleteLocalConfigValue(section, key),\n );\n }\n\n public async clear(section: LocalConfigSection): Promise<LocalConfigObject> {\n return await this.#runtime.run(\n async () => await clearLocalConfigSection(section),\n );\n }\n\n public async testLLM(): Promise<WikiGraphProviderTestResult> {\n return await this.#runtime.run(async () => {\n const startedAt = Date.now();\n const llm = await readLocalConfigSection(\"llm\");\n const config = {\n ...(typeof llm.apiKey === \"string\" ? { apiKey: llm.apiKey } : {}),\n ...(typeof llm.baseURL === \"string\" ? { baseURL: llm.baseURL } : {}),\n ...(typeof llm.model === \"string\" ? { model: llm.model } : {}),\n ...(typeof llm.name === \"string\" ? { name: llm.name } : {}),\n ...(typeof llm.provider === \"string\"\n ? { provider: parseProvider(llm.provider) }\n : {}),\n };\n const options = buildWikiGraphLLMOptions({ llm: config });\n const result = streamText({\n maxRetries: 0,\n messages: [{ content: \"Reply with exactly: ok\", role: \"user\" }],\n model: options.model!,\n temperature: 0,\n });\n const chunks: string[] = [];\n for await (const chunk of result.textStream) chunks.push(chunk);\n return {\n durationMs: Date.now() - startedAt,\n ...(config.model === undefined ? {} : { model: config.model }),\n ...(config.provider === undefined ? {} : { provider: config.provider }),\n response: chunks.join(\"\").trim(),\n };\n });\n }\n\n public async testEmbedding(): Promise<WikiGraphProviderTestResult> {\n return await this.#runtime.run(async () => {\n const startedAt = Date.now();\n const result = await embedQueryText(\n \"Wiki Graph embedding connectivity test.\",\n await readWikiGraphEmbeddingConfig(),\n );\n return {\n dimensions: result.dimensions,\n durationMs: Date.now() - startedAt,\n model: result.model,\n provider: result.provider,\n ...(result.usage?.tokens === undefined\n ? {}\n : { tokens: result.usage.tokens }),\n };\n });\n }\n\n public async testWikispine(): Promise<WikiGraphProviderTestResult> {\n return await this.#runtime.run(async () => {\n const value = await readLocalConfigSection(\"wikispine\");\n const resolved = resolveWikispineConfig(value);\n if (resolved === undefined) {\n throw new Error(\"WikiSpine provider is not configured.\");\n }\n const result = await testWikispineRuntime({\n ...resolved,\n ...(resolved.provider === \"cli\"\n ? { commandRunner: nodeWikispineCommandRunner }\n : {}),\n });\n return {\n durationMs: result.durationMs,\n ...(resolved.provider === \"fetch\"\n ? { endpoint: resolved.endpoint }\n : {}),\n ...(result.metadata === undefined ? {} : { metadata: result.metadata }),\n provider: resolved.provider,\n };\n });\n }\n}\n\nfunction parseProvider(value: string): WikiGraphProvider {\n if (\n value === \"anthropic\" ||\n value === \"google\" ||\n value === \"openai\" ||\n value === \"openai-compatible\"\n ) {\n return value;\n }\n throw new Error(\n `Invalid llm.provider: ${value}. Expected anthropic, google, openai, or openai-compatible.`,\n );\n}\nimport { streamText } from \"ai\";\nimport { testWikispineRuntime } from \"wiki-graph-core\";\n","import {\n createContinuationCursor,\n findArchiveObjects,\n findWikiGraphLibraryArchiveMembers,\n findWikiGraphLibraryObjects,\n listArchiveCollection,\n listArchiveEvidence,\n listArchiveSourceLocators,\n listRelatedArchiveObjects,\n listRelatedWikiGraphLibraryObjects,\n listWikiGraphLibraryArchiveMembers,\n listWikiGraphLibraryEvidence,\n listWikiGraphLibraryObjects,\n readContinuationCursor,\n resolveWikiGraphLibraryQueryTargetById,\n WikiGraphArchiveFile,\n type ArchiveCollectionOptions,\n type ArchiveCollectionResult,\n type ArchiveEvidence,\n type ArchiveFindOptions,\n type ArchiveFindResult,\n type ArchiveRelatedResult,\n type ArchiveSourceLocatorResult,\n type ContinuationCursor,\n type QueryIndexScope,\n type SearchIndexEmbeddingProvider,\n type SearchIndexQueryMode,\n} from \"wiki-graph-core\";\n\nimport { type WikiGraphArchiveTarget } from \"./archive/index.js\";\nimport {\n archiveTargetFromLogicalLocator,\n resolveWikiGraphArchiveLocation,\n} from \"./archive/target.js\";\nimport type { WikiGraphJobRuntime } from \"./jobs.js\";\nimport { createConfiguredEmbeddingProvider } from \"./query-runtime.js\";\n\nexport interface WikiGraphContinuationOptions {\n /** Optional archive locator used to verify that the cursor belongs to it. */\n readonly archive?: WikiGraphArchiveTarget;\n readonly cursor: string;\n readonly format?: ContinuationCursor[\"format\"];\n readonly limit?: number;\n readonly signal?: AbortSignal;\n}\n\nexport interface WikiGraphContinuationContext {\n readonly archiveKey: string;\n readonly archivePath: string;\n readonly backlinks?: boolean;\n readonly chapters?: readonly number[];\n readonly continuationKind?: ContinuationCursor[\"kind\"];\n readonly evidenceLimit?: number;\n readonly format: ContinuationCursor[\"format\"];\n readonly ids?: readonly string[];\n readonly indexScope: QueryIndexScope;\n readonly libraryQuery?: \"archive-members\" | \"objects\";\n readonly match?: \"all\" | \"any\";\n readonly order?: \"doc-asc\" | \"doc-desc\";\n readonly query?: string;\n readonly queryMode?: SearchIndexQueryMode;\n readonly role?: \"any\" | \"object\" | \"self\" | \"subject\" | undefined;\n readonly skipUnindexed?: boolean;\n readonly sourceContext?: number;\n readonly targetUri?: string;\n readonly triplePattern?:\n | {\n readonly objectQid?: string;\n readonly predicate?: string;\n readonly subjectQid?: string;\n }\n | undefined;\n readonly types: readonly string[] | null;\n}\n\ntype ContinuationPageBase<TCursor extends ContinuationCursor> = {\n readonly cursor: TCursor;\n readonly format: TCursor[\"format\"];\n readonly limit: number;\n};\n\nexport type WikiGraphContinuationPage =\n | (ContinuationPageBase<\n Extract<ContinuationCursor, { readonly kind: \"source-locators\" }>\n > & {\n readonly kind: \"source-locators\";\n readonly result: ArchiveSourceLocatorResult;\n })\n | (ContinuationPageBase<\n Extract<ContinuationCursor, { readonly kind: \"collection\" }>\n > & {\n readonly kind: \"collection\";\n readonly result: ArchiveCollectionResult;\n })\n | (ContinuationPageBase<\n Extract<ContinuationCursor, { readonly kind: \"search\" }>\n > & {\n readonly kind: \"search\";\n readonly result: ArchiveFindResult;\n })\n | (ContinuationPageBase<\n Extract<ContinuationCursor, { readonly kind: \"evidence\" }>\n > & {\n readonly kind: \"evidence\";\n readonly result: ArchiveEvidence;\n })\n | (ContinuationPageBase<\n Extract<ContinuationCursor, { readonly kind: \"related\" }>\n > & {\n readonly kind: \"related\";\n readonly result: ArchiveRelatedResult;\n });\n\nexport class WikiGraphContinuationManager {\n readonly #runtime: WikiGraphJobRuntime;\n\n public constructor(runtime: WikiGraphJobRuntime) {\n this.#runtime = runtime;\n }\n\n public async next(\n options: WikiGraphContinuationOptions,\n ): Promise<WikiGraphContinuationPage> {\n return await this.#runtime.run(\n async () => await this.#next(options),\n options.signal,\n );\n }\n\n public async create(\n context: WikiGraphContinuationContext,\n cursor: string | null | undefined,\n ): Promise<string | null> {\n if (cursor === null || cursor === undefined) return null;\n return await this.#runtime.run(\n async () =>\n await createContinuationCursor(\n createContinuationPayload(context, cursor),\n ),\n );\n }\n\n async #next(\n options: WikiGraphContinuationOptions,\n ): Promise<WikiGraphContinuationPage> {\n const cursor = await readContinuationCursor(options.cursor);\n const continuationCursor =\n options.format === undefined\n ? cursor\n : ({ ...cursor, format: options.format } as ContinuationCursor);\n const limit = options.limit ?? 20;\n if (options.archive !== undefined) {\n const explicit = await resolveWikiGraphArchiveLocation(options.archive);\n const cursorArchivePath = getCursorArchivePath(cursor);\n if (explicit.archivePath !== cursorArchivePath) {\n throw new Error(\n `Continuation cursor ${options.cursor} belongs to ${cursorArchivePath}, not ${explicit.archivePath}.`,\n );\n }\n }\n\n const result =\n cursor.indexScope.kind === \"library-index\"\n ? await continueLibraryCursor(cursor, limit)\n : await continueArchiveCursor(cursor, limit);\n const durableResult = await persistResultCursor(continuationCursor, result);\n return {\n cursor: continuationCursor,\n format: continuationCursor.format,\n kind: cursor.kind,\n limit,\n result: durableResult,\n } as WikiGraphContinuationPage;\n }\n}\n\nasync function continueArchiveCursor(\n cursor: ContinuationCursor,\n limit: number,\n): Promise<\n | ArchiveCollectionResult\n | ArchiveEvidence\n | ArchiveFindResult\n | ArchiveRelatedResult\n | ArchiveSourceLocatorResult\n> {\n const embeddingProvider =\n cursor.kind === \"evidence\" || cursor.kind === \"related\"\n ? await resolveCursorEmbeddingProvider(cursor)\n : undefined;\n const location = await resolveWikiGraphArchiveLocation(\n archiveTargetFromLogicalLocator(getCursorArchivePath(cursor)),\n );\n return await new WikiGraphArchiveFile(location.archiveFile).readDocument(\n async (document) => {\n switch (cursor.kind) {\n case \"source-locators\":\n return await listArchiveSourceLocators(document, cursor.targetUri, {\n cursor: cursor.cursor,\n limit,\n });\n case \"collection\":\n return await listArchiveCollection(\n document,\n createCollectionOptions(cursor, limit),\n );\n case \"search\":\n return await findArchiveObjects(\n document,\n cursor.query ?? \"\",\n await createFindOptions(cursor, limit),\n );\n case \"evidence\":\n return await listArchiveEvidence(document, cursor.targetUri, {\n ...(cursor.chapters === null ? {} : { chapters: cursor.chapters }),\n cursor: cursor.cursor,\n limit,\n order: cursor.order,\n ...(cursor.query === undefined ? {} : { query: cursor.query }),\n ...(cursor.queryMode === undefined\n ? {}\n : { queryMode: cursor.queryMode }),\n ...(embeddingProvider === undefined ? {} : { embeddingProvider }),\n ...(cursor.skipUnindexed === undefined\n ? {}\n : { skipUnindexed: cursor.skipUnindexed }),\n ...(cursor.sourceContext === undefined\n ? {}\n : { sourceContext: cursor.sourceContext }),\n });\n case \"related\":\n return await listRelatedArchiveObjects(document, cursor.targetUri, {\n ...(cursor.chapters === null ? {} : { chapters: cursor.chapters }),\n cursor: cursor.cursor,\n ...(cursor.evidenceLimit === undefined\n ? {}\n : { evidenceLimit: cursor.evidenceLimit }),\n limit,\n order: cursor.order,\n ...(cursor.query === undefined ? {} : { query: cursor.query }),\n ...(cursor.queryMode === undefined\n ? {}\n : { queryMode: cursor.queryMode }),\n ...(embeddingProvider === undefined ? {} : { embeddingProvider }),\n ...(cursor.role === undefined ? {} : { role: cursor.role }),\n ...(cursor.skipUnindexed === undefined\n ? {}\n : { skipUnindexed: cursor.skipUnindexed }),\n ...(cursor.sourceContext === undefined\n ? {}\n : { sourceContext: cursor.sourceContext }),\n });\n }\n },\n );\n}\n\nasync function continueLibraryCursor(\n cursor: ContinuationCursor,\n limit: number,\n): Promise<\n | ArchiveCollectionResult\n | ArchiveEvidence\n | ArchiveFindResult\n | ArchiveRelatedResult\n> {\n const embeddingProvider =\n cursor.kind === \"evidence\" || cursor.kind === \"related\"\n ? await resolveCursorEmbeddingProvider(cursor)\n : undefined;\n if (cursor.kind === \"source-locators\") {\n throw new Error(\n \"Source locator cursors do not use the aggregate library index.\",\n );\n }\n if (cursor.indexScope.kind !== \"library-index\") {\n throw new Error(\"Internal error: expected a library index cursor.\");\n }\n const target = await resolveWikiGraphLibraryQueryTargetById(\n cursor.indexScope.libraryId,\n );\n switch (cursor.kind) {\n case \"collection\":\n return await (requireLibraryQuery(cursor) === \"archive-members\"\n ? listWikiGraphLibraryArchiveMembers(\n target,\n createCollectionOptions(cursor, limit),\n )\n : listWikiGraphLibraryObjects(\n target,\n createCollectionOptions(cursor, limit),\n ));\n case \"search\":\n return await (requireLibraryQuery(cursor) === \"archive-members\"\n ? findWikiGraphLibraryArchiveMembers(\n target,\n cursor.query ?? \"\",\n await createFindOptions(cursor, limit),\n )\n : findWikiGraphLibraryObjects(\n target,\n cursor.query ?? \"\",\n await createFindOptions(cursor, limit),\n ));\n case \"evidence\":\n return await listWikiGraphLibraryEvidence(target, cursor.targetUri, {\n cursor: cursor.cursor,\n limit,\n order: cursor.order,\n ...(cursor.query === undefined ? {} : { query: cursor.query }),\n ...(cursor.queryMode === undefined\n ? {}\n : { queryMode: cursor.queryMode }),\n ...(embeddingProvider === undefined ? {} : { embeddingProvider }),\n ...(cursor.skipUnindexed === undefined\n ? {}\n : { skipUnindexed: cursor.skipUnindexed }),\n ...(cursor.sourceContext === undefined\n ? {}\n : { sourceContext: cursor.sourceContext }),\n });\n case \"related\":\n return await listRelatedWikiGraphLibraryObjects(\n target,\n cursor.targetUri,\n {\n cursor: cursor.cursor,\n ...(cursor.evidenceLimit === undefined\n ? {}\n : { evidenceLimit: cursor.evidenceLimit }),\n limit,\n order: cursor.order,\n ...(cursor.query === undefined ? {} : { query: cursor.query }),\n ...(cursor.queryMode === undefined\n ? {}\n : { queryMode: cursor.queryMode }),\n ...(embeddingProvider === undefined ? {} : { embeddingProvider }),\n ...(cursor.role === undefined ? {} : { role: cursor.role }),\n ...(cursor.skipUnindexed === undefined\n ? {}\n : { skipUnindexed: cursor.skipUnindexed }),\n ...(cursor.sourceContext === undefined\n ? {}\n : { sourceContext: cursor.sourceContext }),\n },\n );\n }\n}\n\nfunction createCollectionOptions(\n cursor: Extract<ContinuationCursor, { readonly kind: \"collection\" }>,\n limit: number,\n): ArchiveCollectionOptions {\n return {\n ...(cursor.backlinks === undefined ? {} : { backlinks: cursor.backlinks }),\n ...(cursor.chapters === null ? {} : { chapters: cursor.chapters }),\n cursor: cursor.cursor,\n ...(cursor.evidenceLimit === undefined\n ? {}\n : { evidenceLimit: cursor.evidenceLimit }),\n ...(cursor.ids === null ? {} : { ids: cursor.ids }),\n limit,\n order: cursor.order,\n ...(cursor.sourceContext === undefined\n ? {}\n : { sourceContext: cursor.sourceContext }),\n ...(cursor.triplePattern === undefined\n ? {}\n : { triplePattern: cursor.triplePattern }),\n ...(cursor.types === null\n ? {}\n : {\n types: cursor.types as NonNullable<ArchiveCollectionOptions[\"types\"]>,\n }),\n };\n}\n\nasync function createFindOptions(\n cursor: Extract<ContinuationCursor, { readonly kind: \"search\" }>,\n limit: number,\n): Promise<ArchiveFindOptions> {\n const embeddingProvider = await resolveCursorEmbeddingProvider(cursor);\n return {\n archiveKey: cursor.archiveKey,\n ...(cursor.backlinks === undefined ? {} : { backlinks: cursor.backlinks }),\n ...(cursor.chapters == null ? {} : { chapters: cursor.chapters }),\n cursor: cursor.cursor,\n ...(cursor.evidenceLimit === undefined\n ? {}\n : { evidenceLimit: cursor.evidenceLimit }),\n limit,\n ...(cursor.match === undefined ? {} : { match: cursor.match }),\n ...(cursor.order === undefined ? {} : { order: cursor.order }),\n ...(cursor.queryMode === undefined ? {} : { queryMode: cursor.queryMode }),\n ...(cursor.skipUnindexed === undefined\n ? {}\n : { skipUnindexed: cursor.skipUnindexed }),\n ...(cursor.sourceContext === undefined\n ? {}\n : { sourceContext: cursor.sourceContext }),\n ...(cursor.triplePattern === undefined\n ? {}\n : { triplePattern: cursor.triplePattern }),\n ...(cursor.types === null\n ? {}\n : { types: cursor.types as NonNullable<ArchiveFindOptions[\"types\"]> }),\n ...(embeddingProvider === undefined ? {} : { embeddingProvider }),\n };\n}\n\nfunction requireLibraryQuery(\n cursor: ContinuationCursor,\n): \"archive-members\" | \"objects\" {\n if (\n (cursor.kind === \"collection\" || cursor.kind === \"search\") &&\n cursor.libraryQuery !== undefined\n ) {\n return cursor.libraryQuery;\n }\n throw new Error(\n \"Library continuation cursor is missing its typed query variant.\",\n );\n}\n\nfunction getCursorArchivePath(cursor: ContinuationCursor): string {\n return cursor.indexScope.kind === \"archive-index\"\n ? cursor.indexScope.archivePath\n : cursor.archivePath;\n}\n\nasync function persistResultCursor<\n T extends { readonly nextCursor: string | null },\n>(cursor: ContinuationCursor, result: T): Promise<T> {\n if (result.nextCursor === null) return result;\n const nextCursor = await createContinuationCursor({\n ...cursor,\n cursor: result.nextCursor,\n });\n return { ...result, nextCursor };\n}\n\nfunction createContinuationPayload(\n context: WikiGraphContinuationContext,\n cursor: string,\n): ContinuationCursor {\n switch (context.continuationKind ?? \"search\") {\n case \"source-locators\":\n return {\n archiveKey: context.archiveKey,\n archivePath: context.archivePath,\n cursor,\n format: context.format,\n indexScope: context.indexScope,\n kind: \"source-locators\",\n targetUri: requireTargetUri(context, \"Source locator\"),\n };\n case \"evidence\":\n return {\n archiveKey: context.archiveKey,\n archivePath: context.archivePath,\n chapters: context.chapters ?? null,\n cursor,\n format: context.format,\n indexScope: context.indexScope,\n kind: \"evidence\",\n order: context.order ?? \"doc-asc\",\n ...(context.query === undefined ? {} : { query: context.query }),\n ...(context.queryMode === undefined\n ? {}\n : { queryMode: context.queryMode }),\n ...(context.skipUnindexed === undefined\n ? {}\n : { skipUnindexed: context.skipUnindexed }),\n ...(context.sourceContext === undefined\n ? {}\n : { sourceContext: context.sourceContext }),\n targetUri: requireTargetUri(context, \"Evidence\"),\n };\n case \"related\":\n return {\n archiveKey: context.archiveKey,\n archivePath: context.archivePath,\n chapters: context.chapters ?? null,\n cursor,\n ...(context.evidenceLimit === undefined\n ? {}\n : { evidenceLimit: context.evidenceLimit }),\n format: context.format,\n indexScope: context.indexScope,\n kind: \"related\",\n order: context.order ?? \"doc-asc\",\n ...(context.query === undefined ? {} : { query: context.query }),\n ...(context.queryMode === undefined\n ? {}\n : { queryMode: context.queryMode }),\n ...(context.role === undefined ? {} : { role: context.role }),\n ...(context.skipUnindexed === undefined\n ? {}\n : { skipUnindexed: context.skipUnindexed }),\n ...(context.sourceContext === undefined\n ? {}\n : { sourceContext: context.sourceContext }),\n targetUri: requireTargetUri(context, \"Related\"),\n };\n case \"collection\":\n return {\n archiveKey: context.archiveKey,\n archivePath: context.archivePath,\n ...(context.backlinks === undefined\n ? {}\n : { backlinks: context.backlinks }),\n chapters: context.chapters ?? null,\n cursor,\n ...(context.evidenceLimit === undefined\n ? {}\n : { evidenceLimit: context.evidenceLimit }),\n format: context.format,\n ids: context.ids ?? null,\n indexScope: context.indexScope,\n kind: \"collection\",\n ...createLibraryQueryPayload(context),\n order: context.order ?? \"doc-asc\",\n ...(context.sourceContext === undefined\n ? {}\n : { sourceContext: context.sourceContext }),\n ...(context.triplePattern === undefined\n ? {}\n : { triplePattern: context.triplePattern }),\n types: context.types,\n };\n case \"search\":\n return {\n archiveKey: context.archiveKey,\n archivePath: context.archivePath,\n ...(context.backlinks === undefined\n ? {}\n : { backlinks: context.backlinks }),\n ...(context.chapters === undefined\n ? {}\n : { chapters: context.chapters }),\n cursor,\n ...(context.evidenceLimit === undefined\n ? {}\n : { evidenceLimit: context.evidenceLimit }),\n format: context.format,\n indexScope: context.indexScope,\n kind: \"search\",\n ...createLibraryQueryPayload(context),\n ...(context.match === undefined ? {} : { match: context.match }),\n ...(context.order === undefined ? {} : { order: context.order }),\n ...(context.query === undefined ? {} : { query: context.query }),\n ...(context.queryMode === undefined\n ? {}\n : { queryMode: context.queryMode }),\n ...(context.skipUnindexed === undefined\n ? {}\n : { skipUnindexed: context.skipUnindexed }),\n ...(context.sourceContext === undefined\n ? {}\n : { sourceContext: context.sourceContext }),\n ...(context.triplePattern === undefined\n ? {}\n : { triplePattern: context.triplePattern }),\n types: context.types,\n };\n }\n}\n\nasync function resolveCursorEmbeddingProvider(\n cursor: Pick<ContinuationCursor, \"kind\" | \"queryMode\"> & {\n readonly query?: string;\n },\n): Promise<SearchIndexEmbeddingProvider | undefined> {\n if (cursor.kind !== \"search\" && cursor.query === undefined) return undefined;\n if (cursor.queryMode === \"fts\") return undefined;\n const provider = await createConfiguredEmbeddingProvider();\n if (cursor.queryMode === \"embedding\" && provider === undefined) {\n throw new Error(\n \"Embedding query mode requires embeddings configuration at `wikg://local/config/embeddings`.\",\n );\n }\n return provider;\n}\n\nfunction requireTargetUri(\n context: WikiGraphContinuationContext,\n label: string,\n): string {\n if (context.targetUri !== undefined) return context.targetUri;\n throw new Error(`${label} continuation cursors require a target URI.`);\n}\n\nfunction createLibraryQueryPayload(context: WikiGraphContinuationContext): {\n readonly libraryQuery?: \"archive-members\" | \"objects\";\n} {\n if (context.indexScope.kind !== \"library-index\") return {};\n if (context.libraryQuery !== undefined) {\n return { libraryQuery: context.libraryQuery };\n }\n throw new Error(\n \"Library collection and search continuations require an explicit query variant.\",\n );\n}\n","import {\n getBuildJob,\n getChapterDetails,\n openWikimediaResolver,\n recordBuildJobInputRevision,\n WikiGraphArchiveFile,\n WikiGraphScope,\n withLoggingContext,\n type BuildJob,\n type BuildJobExecutionContext,\n type BuildJobProgressReporter,\n type Directory,\n type GuaranteedRequest,\n type GuaranteedRequestController,\n type LLMessage,\n} from \"wiki-graph-core\";\nimport {\n applyChapterJobArtifactFile,\n createLocalChapterJobFileExecutor,\n writeChapterJobInputFile,\n type ChapterJobFileExecutor,\n type ChapterJobInputOptions,\n type ChapterJobKind,\n} from \"wiki-graph-core/worker\";\n\nimport { buildSearchIndexEmbeddingProvider } from \"./embedding.js\";\nimport {\n loadWikiGraphRuntimeConfig,\n type WikiGraphRuntimeConfig,\n} from \"./runtime-config.js\";\nimport {\n createStageLLM,\n loadRequiredStageConfig,\n resolveExtractionPrompt,\n resolveKnowledgeGraphRecallPrompt,\n} from \"./stage.js\";\nimport { DEFAULT_GENERATION_JOB_CONCURRENCY } from \"./planning.js\";\nimport { nodeWikispineCommandRunner } from \"./wikispine.js\";\nimport { runBuildJobWorker } from \"./worker.js\";\nimport { getWikiGraphSDKProviders } from \"./runtime-context.js\";\nimport {\n resolveWikiGraphArchiveTarget,\n resolveWikiGraphArchiveLocation,\n} from \"./archive/target.js\";\nimport { writeWikiGraphArchiveLocation } from \"./archive/write.js\";\n\nexport interface WikiGraphQueueWorkerOptions {\n readonly idleTimeoutMs?: number;\n readonly signal?: AbortSignal;\n}\n\nexport async function runWikiGraphQueueWorker(\n options: WikiGraphQueueWorkerOptions = {},\n): Promise<void> {\n const providers = getWikiGraphSDKProviders();\n const config = await loadWikiGraphRuntimeConfig({\n ...(providers.embedding === undefined ? {} : { skipEmbeddingConfig: true }),\n ...(providers.llm === undefined ? {} : { skipLLMConfig: true }),\n });\n await runBuildJobWorker({\n concurrency: config.concurrent?.job ?? DEFAULT_GENERATION_JOB_CONCURRENCY,\n executeJob: async (job, reporter, context) => {\n await withLoggingContext(\n { logDirectory: job.log, operation: \"build-job\" },\n async () => await executeBuildJob(job, reporter, context),\n );\n },\n ...(options.idleTimeoutMs === undefined\n ? {}\n : { idleTimeoutMs: options.idleTimeoutMs }),\n ...(options.signal === undefined ? {} : { signal: options.signal }),\n });\n}\n\nasync function executeBuildJob(\n job: BuildJob,\n reporter: BuildJobProgressReporter,\n context: BuildJobExecutionContext,\n): Promise<void> {\n const providers = getWikiGraphSDKProviders();\n const config = await loadWikiGraphRuntimeConfig({\n ...(job.llmJSON === undefined ? {} : { llmJSON: job.llmJSON }),\n ...(providers.embedding === undefined ? {} : { skipEmbeddingConfig: true }),\n ...(job.llmJSON === undefined && providers.llm !== undefined\n ? { skipLLMConfig: true }\n : {}),\n });\n const execution = await openJobExecutor(\n job,\n config,\n context.signal,\n reporter,\n );\n try {\n if (job.target === \"reading-summary\") {\n let stage = await readChapterStage(job);\n if (stage === \"sourced\") {\n await executeStep(job, \"reading-graph\", execution, reporter, context, {\n ...(execution.extractionPrompt === undefined\n ? {}\n : { prompt: execution.extractionPrompt }),\n });\n stage = await readChapterStage(job);\n }\n if (stage === \"summarized\") return;\n if (stage !== \"graphed\") {\n throw new Error(\n `Chapter ${job.chapterId} is ${stage}. Cannot generate summary.`,\n );\n }\n await executeStep(job, \"reading-summary\", execution, reporter, context, {\n ...(job.prompt === undefined ? {} : { prompt: job.prompt }),\n });\n return;\n }\n\n if (job.target === \"reading-graph\") {\n const stage = await readChapterStage(job);\n if (stage === \"graphed\" || stage === \"summarized\") return;\n if (stage !== \"sourced\") {\n throw new Error(\n `Chapter ${job.chapterId} is ${stage}. Cannot generate Reading Graph.`,\n );\n }\n }\n if (job.target === \"knowledge-graph\") {\n const stage = await readChapterStage(job);\n if (stage === \"planned\") {\n throw new Error(\n `Chapter ${job.chapterId} is planned. Set source before generating Knowledge Graph.`,\n );\n }\n }\n\n await executeStep(job, job.target, execution, reporter, context, {\n ...(job.target === \"reading-graph\"\n ? { prompt: execution.extractionPrompt }\n : {}),\n ...(job.target === \"knowledge-graph\"\n ? { prompt: execution.knowledgeGraphPrompt }\n : {}),\n });\n } finally {\n await execution.close();\n }\n}\n\nasync function executeStep(\n job: BuildJob,\n kind: ChapterJobKind,\n execution: OpenedExecutor,\n reporter: BuildJobProgressReporter,\n context: BuildJobExecutionContext,\n inputOptions: ChapterJobInputOptions,\n): Promise<void> {\n await reporter.throwIfStopped();\n await reporter.stepStarted(kind);\n if (kind === \"reading-graph\" || kind === \"knowledge-graph\") {\n await assertCurrentFtsArtifact(job);\n }\n\n const stepWorkspace = await resetStepWorkspace(job.workspace, kind);\n const inputFile = await stepWorkspace.createFile(\"input.jsonl\");\n const outputWorkspace = await stepWorkspace.createDirectory(\"output\");\n const revision = await new WikiGraphArchiveFile(job.archive).readDocument(\n async (document) => {\n await getChapterDetails(document, job.chapterId);\n return await writeChapterJobInputFile(\n document,\n job.chapterId,\n kind,\n inputFile,\n inputOptions,\n );\n },\n );\n await recordBuildJobInputRevision({\n currentRevision: revision,\n jobId: job.jobId,\n ownerId: requireRunningJobOwnerId(job),\n });\n await reporter.updatePhase({\n done: 0,\n phase: kind.startsWith(\"index-\") ? \"indexing\" : \"grounding\",\n total: 1,\n unit: \"item\",\n });\n\n const result = await execution.executor({\n inputFile,\n kind,\n progress: reporter,\n revision,\n signal: context.signal,\n workspace: outputWorkspace,\n });\n if (result.revision !== revision) {\n throw new Error(\n `Chapter job returned revision ${result.revision}; expected ${revision}.`,\n );\n }\n await reporter.updatePhase({\n done: 0,\n phase: \"committing\",\n total: 1,\n unit: \"item\",\n });\n const target = await resolveWikiGraphArchiveTarget(job.archive);\n const resolvedLocation = await resolveWikiGraphArchiveLocation(target);\n const location =\n target.kind === \"standalone\"\n ? { ...resolvedLocation, archiveFile: job.archive }\n : resolvedLocation;\n await writeWikiGraphArchiveLocation(\n location,\n async (document) => {\n assertJobStillRunning(await getBuildJob(job.jobId));\n await applyChapterJobArtifactFile(\n document,\n job.chapterId,\n kind,\n revision,\n result.artifactFile,\n );\n },\n { invalidateContinuationCursors: true },\n );\n await reporter.updatePhase({\n done: 1,\n phase: \"committing\",\n total: 1,\n unit: \"item\",\n });\n await reporter.stepCompleted(kind);\n assertJobStillRunning(await getBuildJob(job.jobId));\n}\n\ninterface OpenedExecutor {\n readonly close: () => Promise<void>;\n readonly executor: ChapterJobFileExecutor;\n readonly extractionPrompt?: string;\n readonly knowledgeGraphPrompt?: string;\n}\n\nasync function openJobExecutor(\n job: BuildJob,\n config: WikiGraphRuntimeConfig,\n signal: AbortSignal,\n reporter: BuildJobProgressReporter,\n): Promise<OpenedExecutor> {\n const generation = !job.target.startsWith(\"index-\");\n const stageConfig = generation\n ? await loadRequiredStageConfig({\n ...(job.llmJSON === undefined ? {} : { llmJSON: job.llmJSON }),\n })\n : undefined;\n const injectedLLM =\n job.llmJSON === undefined ? getWikiGraphSDKProviders().llm : undefined;\n const llm =\n stageConfig === undefined\n ? undefined\n : createStageLLM(stageConfig, {\n cacheDirectory: job.cache,\n logDirectory: job.log,\n onTokenUsage: async (usage) => {\n await reporter.addTokenUsage(usage);\n },\n onStreamProgress: async ({ outputCharacters }) => {\n await reporter.addOutputCharacters(outputCharacters);\n },\n ...(injectedLLM === undefined ? {} : { provider: injectedLLM }),\n });\n const promptSource = job.prompt ?? stageConfig?.prompt;\n const wikispine =\n job.target === \"knowledge-graph\"\n ? requireKnowledgeGraphWikispineConfig(config)\n : undefined;\n const request: GuaranteedRequestController | undefined =\n llm === undefined\n ? undefined\n : async (\n messages: readonly LLMessage[],\n index: number,\n maxRetries: number,\n ) =>\n await llm.request(messages, {\n retryIndex: index,\n retryMax: maxRetries,\n scope: WikiGraphScope.ReaderExtraction,\n signal,\n });\n if (request !== undefined && llm !== undefined) {\n request.lazy = async <T>(\n operation: (request: GuaranteedRequest) => Promise<T>,\n ): Promise<T> => await llm.request(async () => await operation(request));\n }\n const wikimediaResolver =\n job.target !== \"knowledge-graph\"\n ? undefined\n : await openWikimediaResolver(\n config.wikimedia === undefined\n ? {\n kind: \"local\",\n llmRequest: requireValue(\n request,\n \"Local Wikimedia resolution requires an LLM.\",\n ),\n llmModelId: requireValue(\n stageConfig?.llm?.model ?? injectedLLM?.model,\n \"Local Wikimedia resolution requires an LLM model.\",\n ),\n }\n : {\n endpoint: config.wikimedia.endpoint,\n kind: \"remote\",\n token: config.wikimedia.token,\n },\n );\n const embeddingProvider =\n job.target === \"index-embedding-source\" ||\n job.target === \"index-embedding-summary\"\n ? (getWikiGraphSDKProviders().embedding ??\n buildSearchIndexEmbeddingProvider(requireEmbeddingConfig(config)))\n : undefined;\n\n return {\n async close() {\n await wikimediaResolver?.close();\n },\n executor: createLocalChapterJobFileExecutor({\n ...(embeddingProvider === undefined ? {} : { embeddingProvider }),\n ...(llm === undefined ? {} : { llm }),\n ...(wikimediaResolver === undefined ? {} : { wikimediaResolver }),\n ...(wikispine === undefined\n ? {}\n : {\n wikispine: {\n ...wikispine,\n ...(wikispine.provider === \"cli\"\n ? { commandRunner: nodeWikispineCommandRunner }\n : {}),\n },\n }),\n }),\n ...(promptSource === undefined\n ? {}\n : { extractionPrompt: resolveExtractionPrompt(promptSource) }),\n ...(promptSource === undefined\n ? {}\n : {\n knowledgeGraphPrompt: resolveKnowledgeGraphRecallPrompt(promptSource),\n }),\n };\n}\n\nasync function resetStepWorkspace(\n workspace: Directory,\n kind: ChapterJobKind,\n): Promise<Directory> {\n const name = `chapter-job-${kind}`;\n if ((await workspace.getDirectory(name)) !== undefined) {\n await workspace.remove(name, { recursive: true });\n }\n return await workspace.createDirectory(name);\n}\n\nasync function readChapterStage(job: BuildJob) {\n return await new WikiGraphArchiveFile(job.archive).readDocument(\n async (document) =>\n (await getChapterDetails(document, job.chapterId)).stage,\n );\n}\n\nasync function assertCurrentFtsArtifact(job: BuildJob): Promise<void> {\n await new WikiGraphArchiveFile(job.archive).readDocument(async (document) => {\n const revision = await document.serials.getRevision(job.chapterId);\n const artifact = await document.indexArtifacts.get(job.chapterId, \"fts\");\n if (artifact?.sourceRevision !== revision) {\n throw new Error(\n `Chapter ${job.chapterId} needs a current FTS index artifact before running ${job.target}.`,\n );\n }\n });\n}\n\nfunction requireEmbeddingConfig(config: WikiGraphRuntimeConfig) {\n if (config.embedding !== undefined) return config.embedding;\n throw new Error(\n \"Missing embeddings configuration. Configure `wikg://local/config/embeddings` before building embedding index artifacts.\",\n );\n}\n\nexport function requireKnowledgeGraphWikispineConfig(\n config: WikiGraphRuntimeConfig,\n): NonNullable<WikiGraphRuntimeConfig[\"wikispine\"]> {\n if (config.wikispine?.provider !== undefined) return config.wikispine;\n throw new Error(\n \"Knowledge Graph requires WikiSpine. Configure `wikg://local/config/wikispine` with provider `cli` or `fetch` and test the provider before running the worker.\",\n );\n}\n\nfunction requireRunningJobOwnerId(job: BuildJob): string {\n if (job.ownerId === undefined) {\n throw new Error(`Build job ${job.jobId} has no running owner.`);\n }\n return job.ownerId;\n}\n\nfunction assertJobStillRunning(job: BuildJob): void {\n if (job.state !== \"running\") {\n throw new Error(`Job ${job.jobId} is ${job.state}. Stop before flushing.`);\n }\n}\n\nfunction requireValue<T>(value: T | undefined, message: string): T {\n if (value === undefined) throw new Error(message);\n return value;\n}\n","export {\n DEFAULT_EXTRACTION_PROMPT,\n DEFAULT_KNOWLEDGE_GRAPH_RECALL_PROMPT,\n resolveExtractionPrompt,\n resolveKnowledgeGraphRecallPrompt,\n} from \"wiki-graph-core\";\nimport type { WikiGraphScope } from \"wiki-graph-core\";\nimport { createDefaultWikiGraphSampling } from \"wiki-graph-core\";\nimport { LLM } from \"wiki-graph-core\";\nimport type {\n Directory,\n LLMStreamProgressCallback,\n LLMTokenUsageCallback,\n} from \"wiki-graph-core\";\nimport type { WikiGraphLLMProvider } from \"./providers.js\";\nimport { getWikiGraphSDKProviders } from \"./runtime-context.js\";\n\nimport {\n loadWikiGraphRuntimeConfig,\n type WikiGraphRuntimeConfig,\n} from \"./runtime-config.js\";\nimport { buildWikiGraphLLMOptions } from \"./llm.js\";\n\nexport function createStageLLM(\n config: WikiGraphRuntimeConfig,\n options?: {\n readonly cacheDirectory?: Directory;\n readonly logDirectory?: Directory;\n readonly onStreamProgress?: LLMStreamProgressCallback;\n readonly onTokenUsage?: LLMTokenUsageCallback;\n readonly provider?: WikiGraphLLMProvider;\n },\n): LLM<WikiGraphScope> {\n const llmOptions =\n options?.provider === undefined\n ? buildWikiGraphLLMOptions(config)\n : {\n ...(config.concurrent?.request === undefined\n ? {}\n : { concurrent: config.concurrent.request }),\n streamProvider: options.provider,\n };\n\n return new LLM<WikiGraphScope>({\n sampling: createDefaultWikiGraphSampling({\n ...(llmOptions.temperature === undefined\n ? {}\n : { temperature: llmOptions.temperature }),\n ...(llmOptions.topP === undefined ? {} : { topP: llmOptions.topP }),\n }),\n ...llmOptions,\n ...(options?.cacheDirectory === undefined\n ? {}\n : { cacheDirectory: options.cacheDirectory }),\n ...(options?.logDirectory === undefined\n ? {}\n : { logDirectory: options.logDirectory }),\n ...(options?.onStreamProgress === undefined\n ? {}\n : { onStreamProgress: options.onStreamProgress }),\n ...(options?.onTokenUsage === undefined\n ? {}\n : { onTokenUsage: options.onTokenUsage }),\n });\n}\n\nexport async function loadRequiredStageConfig(options: {\n readonly llmJSON?: string;\n}): Promise<WikiGraphRuntimeConfig> {\n const injected =\n options.llmJSON === undefined ? getWikiGraphSDKProviders().llm : undefined;\n const config = await loadWikiGraphRuntimeConfig({\n ...(options.llmJSON === undefined ? {} : { llmJSON: options.llmJSON }),\n ...(options.llmJSON === undefined && injected !== undefined\n ? { skipLLMConfig: true }\n : {}),\n ...(getWikiGraphSDKProviders().embedding === undefined\n ? {}\n : { skipEmbeddingConfig: true }),\n });\n\n if (\n injected === undefined &&\n (config.llm?.provider === undefined || config.llm.model === undefined)\n ) {\n throw new Error(\n \"Missing LLM configuration. Set --llm for one run, or configure `wikg://local/config/llm` with provider and model.\",\n );\n }\n\n return config;\n}\n","import type { BuildJobTarget } from \"wiki-graph-core\";\n\n/** Cost estimate returned before a durable build job is accepted. */\n\nexport interface GenerationConcurrency {\n readonly job: number;\n readonly request: number;\n}\n\nexport const DEFAULT_GENERATION_JOB_CONCURRENCY = 3;\nexport const DEFAULT_GENERATION_REQUEST_CONCURRENCY = 6;\n\nexport interface GenerationPlanningCost {\n readonly model: string;\n readonly timeSeconds: {\n readonly max: number;\n readonly min: number;\n };\n readonly tokens: {\n readonly cacheableInput: number;\n readonly input: number;\n readonly output: number;\n };\n}\n\nexport interface GenerationPerformanceHint {\n readonly configKey: \"job\" | \"request\";\n readonly configValue: number;\n readonly current: number;\n readonly kind: \"job\" | \"request\";\n readonly message: string;\n readonly recommended: number;\n}\n\nexport function planGenerationTask(\n task: BuildJobTarget,\n words: number,\n chapters: number,\n concurrent: GenerationConcurrency,\n model: string,\n): GenerationPlanningCost {\n const profile = getGenerationPlanningProfile(task);\n const calls = Math.max(chapters, Math.ceil(words / profile.wordsPerCall));\n const effectiveConcurrency = Math.max(\n 1,\n task === \"reading-graph\" ? 1 : concurrent.request,\n );\n const callBatches = Math.ceil(calls / effectiveConcurrency);\n const wordSeconds = words * profile.secondsPerWord;\n\n return {\n model,\n timeSeconds: {\n max: Math.ceil(callBatches * profile.maxSecondsPerCall + wordSeconds),\n min: Math.ceil(callBatches * profile.minSecondsPerCall + wordSeconds),\n },\n tokens: {\n cacheableInput: Math.ceil(words * profile.cacheableInputTokenPerWord),\n input: Math.ceil(words * profile.inputTokenPerWord),\n output: Math.ceil(words * profile.outputTokenPerWord),\n },\n };\n}\n\nexport function createGenerationPerformanceHints(input: {\n readonly chapters: number;\n readonly concurrent: GenerationConcurrency;\n readonly hasJobWork: boolean;\n readonly hasRequestWork: boolean;\n}): readonly GenerationPerformanceHint[] {\n if (!input.hasJobWork) {\n return [];\n }\n\n const hints: GenerationPerformanceHint[] = [];\n\n const recommendedRequest =\n input.concurrent.request < 4\n ? DEFAULT_GENERATION_REQUEST_CONCURRENCY\n : input.concurrent.request < 8\n ? 8\n : undefined;\n\n if (input.hasRequestWork && recommendedRequest !== undefined) {\n hints.push({\n configKey: \"request\",\n configValue: recommendedRequest,\n current: input.concurrent.request,\n kind: \"request\",\n message:\n \"LLM request concurrency can often be higher. Use at least 4; 6-8 is usually faster when the provider allows it.\",\n recommended: recommendedRequest,\n });\n }\n\n if (input.concurrent.job < 4 && input.chapters > 1) {\n hints.push({\n configKey: \"job\",\n configValue: 4,\n current: input.concurrent.job,\n kind: \"job\",\n message:\n \"Multiple chapters need work and job concurrency is below 4. Raising it lets chapter jobs run in parallel.\",\n recommended: 4,\n });\n }\n\n return hints;\n}\n\nexport function formatGenerationPlanningModel(\n llm: { readonly model?: string; readonly provider?: string } | undefined,\n): string {\n if (llm?.model === undefined) {\n return \"not configured\";\n }\n\n return llm.provider === undefined\n ? llm.model\n : `${llm.provider}/${llm.model}`;\n}\n\nexport function formatGenerationPlanningDuration(seconds: number): string {\n if (seconds < 60) {\n return `${seconds}s`;\n }\n\n const minutes = Math.round(seconds / 60);\n\n if (minutes < 60) {\n return `${minutes}m`;\n }\n\n return `${Math.round(minutes / 60)}h`;\n}\n\nfunction getGenerationPlanningProfile(task: BuildJobTarget): {\n readonly inputTokenPerWord: number;\n readonly cacheableInputTokenPerWord: number;\n readonly maxSecondsPerCall: number;\n readonly minSecondsPerCall: number;\n readonly outputTokenPerWord: number;\n readonly secondsPerWord: number;\n readonly wordsPerCall: number;\n} {\n switch (task) {\n case \"index-fts\":\n return {\n cacheableInputTokenPerWord: 0,\n inputTokenPerWord: 0,\n maxSecondsPerCall: 1,\n minSecondsPerCall: 0,\n outputTokenPerWord: 0,\n secondsPerWord: 0.0005,\n wordsPerCall: 100_000,\n };\n case \"index-embedding-source\":\n case \"index-embedding-summary\":\n return {\n cacheableInputTokenPerWord: 0,\n inputTokenPerWord: 0,\n maxSecondsPerCall: 10,\n minSecondsPerCall: 1,\n outputTokenPerWord: 0,\n secondsPerWord: 0.002,\n wordsPerCall: 10_000,\n };\n case \"knowledge-graph\":\n return {\n cacheableInputTokenPerWord: 60,\n inputTokenPerWord: 80,\n maxSecondsPerCall: 35,\n minSecondsPerCall: 15,\n outputTokenPerWord: 25,\n secondsPerWord: 0.02,\n wordsPerCall: 35,\n };\n case \"reading-graph\":\n return {\n cacheableInputTokenPerWord: 20,\n inputTokenPerWord: 25,\n maxSecondsPerCall: 45,\n minSecondsPerCall: 15,\n outputTokenPerWord: 4,\n secondsPerWord: 0.01,\n wordsPerCall: 160,\n };\n case \"reading-summary\":\n return {\n cacheableInputTokenPerWord: 45,\n inputTokenPerWord: 55,\n maxSecondsPerCall: 25,\n minSecondsPerCall: 10,\n outputTokenPerWord: 4,\n secondsPerWord: 0.01,\n wordsPerCall: 110,\n };\n }\n}\n","import {\n applyChapterJobArtifactFile,\n runBuildJobWorker as runCoreBuildJobWorker,\n writeChapterJobInputFile,\n type ChapterJobInputOptions,\n type BuildJobWorkerOptions as CoreBuildJobWorkerOptions,\n} from \"wiki-graph-core/worker\";\nimport {\n resolveChapterPathReadonly,\n WikiGraphArchiveFile,\n} from \"wiki-graph-core\";\nimport type { ChapterJobKind } from \"wiki-graph-job\";\n\nimport { NodeFile } from \"./node-platform.js\";\nimport { withWikiGraphSDKHost, type WikiGraphSDKHost } from \"./host.js\";\nimport {\n resolveWikiGraphArchiveLocation,\n type WikiGraphArchiveTarget,\n} from \"./archive/target.js\";\nimport { writeWikiGraphArchiveLocation } from \"./archive/write.js\";\n\nexport {\n applyChapterJobArtifactFile,\n createLocalChapterJobFileExecutor,\n writeChapterJobInputFile,\n} from \"wiki-graph-core/worker\";\nexport type {\n BuildJob,\n BuildJobExecutionContext,\n BuildJobProgressReporter,\n BuildJobWorkerOptions,\n ChapterJobInputOptions,\n LocalChapterJobFileExecutorOptions,\n} from \"wiki-graph-core/worker\";\nexport type { ChapterJobFileExecutor, ChapterJobKind } from \"wiki-graph-job\";\n\nexport interface WikiGraphJobArtifactInput {\n readonly artifactPath: string;\n readonly chapterId: number;\n readonly kind: ChapterJobKind;\n}\n\nexport interface WikiGraphJobSnapshotInput {\n readonly chapterPath: string;\n readonly kind: ChapterJobKind;\n readonly options?: ChapterJobInputOptions;\n readonly outputPath: string;\n}\n\nexport interface WikiGraphJobSnapshotResult extends WikiGraphJobSnapshotInput {\n readonly chapterId: number;\n readonly revision: number;\n}\n\nexport interface ExtractWikiGraphJobSnapshotsOptions {\n readonly host?: WikiGraphSDKHost;\n readonly onSnapshot?: (\n snapshot: WikiGraphJobSnapshotResult,\n ) => void | Promise<void>;\n readonly requests: readonly WikiGraphJobSnapshotInput[];\n readonly signal?: AbortSignal;\n readonly stateDir?: string;\n readonly wikgPath: string;\n}\n\nexport async function extractWikiGraphJobSnapshots(\n options: ExtractWikiGraphJobSnapshotsOptions,\n): Promise<readonly WikiGraphJobSnapshotResult[]> {\n return await withWikiGraphSDKHost(\n {\n ...(options.host === undefined ? {} : { host: options.host }),\n ...(options.stateDir === undefined ? {} : { stateDir: options.stateDir }),\n },\n async () =>\n await new WikiGraphArchiveFile(\n new NodeFile(options.wikgPath),\n ).readDocument(async (document) => {\n const results: WikiGraphJobSnapshotResult[] = [];\n for (const request of options.requests) {\n options.signal?.throwIfAborted();\n const chapterId = await resolveChapterPathReadonly(\n document,\n request.chapterPath,\n );\n const revision = await writeChapterJobInputFile(\n document,\n chapterId,\n request.kind,\n new NodeFile(request.outputPath),\n request.options,\n );\n const result = { ...request, chapterId, revision };\n results.push(result);\n await options.onSnapshot?.(result);\n }\n options.signal?.throwIfAborted();\n return results;\n }),\n );\n}\n\nexport interface ApplyWikiGraphJobArtifactsOptions {\n readonly archive: WikiGraphArchiveTarget;\n readonly artifacts: AsyncIterable<WikiGraphJobArtifactInput>;\n readonly host?: WikiGraphSDKHost;\n readonly signal?: AbortSignal;\n readonly stateDir?: string;\n}\n\nexport async function applyWikiGraphJobArtifacts(\n options: ApplyWikiGraphJobArtifactsOptions,\n): Promise<{ readonly applied: number }> {\n return await withWikiGraphSDKHost(\n {\n ...(options.host === undefined ? {} : { host: options.host }),\n ...(options.stateDir === undefined ? {} : { stateDir: options.stateDir }),\n },\n async () => {\n const location = await resolveWikiGraphArchiveLocation(options.archive);\n let applied = 0;\n await writeWikiGraphArchiveLocation(\n location,\n async (document) => {\n for await (const artifact of options.artifacts) {\n options.signal?.throwIfAborted();\n const revision = await document.serials.getRevision(\n artifact.chapterId,\n );\n await applyChapterJobArtifactFile(\n document,\n artifact.chapterId,\n artifact.kind,\n revision,\n new NodeFile(artifact.artifactPath),\n );\n applied += 1;\n }\n },\n { invalidateContinuationCursors: true },\n );\n options.signal?.throwIfAborted();\n return { applied };\n },\n );\n}\n\nexport interface WikiGraphBuildJobWorkerOptions extends CoreBuildJobWorkerOptions {\n readonly host?: WikiGraphSDKHost;\n /** Wiki Graph state root. Defaults to `~/.wikigraph`. */\n readonly stateDir?: string;\n}\n\n/** Run the persistent build worker with invocation-scoped Node storage. */\nexport async function runBuildJobWorker(\n options: WikiGraphBuildJobWorkerOptions,\n): Promise<void> {\n const { host, stateDir, ...coreOptions } = options;\n await withWikiGraphSDKHost(\n {\n ...(host === undefined ? {} : { host }),\n ...(stateDir === undefined ? {} : { stateDir }),\n },\n async () => await runCoreBuildJobWorker(coreOptions),\n );\n}\n","import {\n installWikiGraphPlatform,\n withWikiGraphStorage,\n type WikiGraphPlatform,\n type WikiGraphStorage,\n} from \"wiki-graph-core/platform\";\n\nimport {\n ensureNodeWikiGraphPlatform,\n withNodeWikiGraphStorage,\n} from \"./node-platform.js\";\nimport {\n getWikiGraphSDKRuntimeContext,\n withWikiGraphSDKRuntimeContext,\n} from \"./runtime-context.js\";\n\ninterface WikiGraphSDKHostBase {\n /** Process-wide runtime services. Concurrent SDKs must use one compatible platform. */\n readonly platform?: WikiGraphPlatform;\n}\n\nexport type WikiGraphSDKHost = WikiGraphSDKHostBase &\n (\n | {\n /** Node state root for SDK configuration and other host-local state. */\n readonly stateDir: string;\n /** Storage roots scoped to this SDK instance or standalone operation. */\n readonly storage: WikiGraphStorage;\n }\n | {\n /** Node state root used by the default Node storage layout. */\n readonly stateDir?: string;\n readonly storage?: undefined;\n }\n );\n\nexport interface WikiGraphSDKHostOptions {\n readonly host?: WikiGraphSDKHost;\n readonly stateDir?: string;\n}\n\nexport function prepareWikiGraphSDKHost(host?: WikiGraphSDKHost): void {\n if (host?.platform === undefined) {\n ensureNodeWikiGraphPlatform();\n return;\n }\n installWikiGraphPlatform(host.platform);\n}\n\nexport function assertWikiGraphSDKHostOptions(\n options: WikiGraphSDKHostOptions,\n): void {\n if (\n options.host?.storage !== undefined &&\n options.host.stateDir === undefined\n ) {\n throw new TypeError(\n \"Wiki Graph SDK host.storage requires host.stateDir so SDK configuration cannot fall back to the default user state directory.\",\n );\n }\n if (\n options.stateDir !== undefined &&\n (options.host?.stateDir !== undefined ||\n options.host?.storage !== undefined)\n ) {\n throw new TypeError(\n \"Wiki Graph SDK host state/storage and top-level stateDir cannot be used together. Put the state directory in host.stateDir when providing host.storage.\",\n );\n }\n}\n\nexport async function withWikiGraphSDKHost<T>(\n options: WikiGraphSDKHostOptions,\n operation: () => Promise<T> | T,\n): Promise<T> {\n const current = getWikiGraphSDKRuntimeContext();\n const effective = {\n ...(options.host === undefined\n ? current.host === undefined\n ? {}\n : { host: current.host }\n : { host: options.host }),\n ...(options.stateDir === undefined\n ? current.stateDir === undefined\n ? {}\n : { stateDir: current.stateDir }\n : { stateDir: options.stateDir }),\n };\n assertWikiGraphSDKHostOptions(effective);\n prepareWikiGraphSDKHost(effective.host);\n const runWithContext = async (): Promise<T> =>\n await withWikiGraphSDKRuntimeContext(\n {\n ...current,\n ...(effective.host === undefined ? {} : { host: effective.host }),\n ...(effective.stateDir === undefined\n ? {}\n : { stateDir: effective.stateDir }),\n },\n operation,\n );\n if (effective.host?.storage !== undefined) {\n return await withWikiGraphStorage(effective.host.storage, runWithContext);\n }\n return await withNodeWikiGraphStorage(\n effective.host?.stateDir ?? effective.stateDir,\n runWithContext,\n );\n}\n","/** Controls whether development-only environment overrides are accepted. */\nexport type WikiGraphEntryEnvPolicy = \"development\" | \"production\";\n\nexport interface WikiGraphEntryRuntimeOptions {\n readonly argv?: readonly string[] | undefined;\n readonly cwd?: string | undefined;\n readonly devProjectRoot?: string | undefined;\n readonly env?: NodeJS.ProcessEnv | undefined;\n readonly envPolicy: WikiGraphEntryEnvPolicy;\n readonly stateDir?: string | undefined;\n}\n\nexport interface WikiGraphEntryRuntimeContext {\n readonly devProjectRoot?: string | undefined;\n readonly env: NodeJS.ProcessEnv;\n readonly envPolicy: WikiGraphEntryEnvPolicy;\n readonly stateDir?: string | undefined;\n}\n\nexport const DANGEROUS_RUNTIME_ENV_NAMES = [\n \"WIKIGRAPH_DEV\",\n \"WIKIGRAPH_ENV_POLICY\",\n \"WIKIGRAPH_QUEUE_DISABLE_AUTOSTART\",\n \"WIKIGRAPH_STATE_DIR\",\n] as const;\n\nexport function createEntryRuntimeContext(\n options: WikiGraphEntryRuntimeOptions,\n): WikiGraphEntryRuntimeContext {\n const environment = createMergedEnvironment(options.env);\n\n if (options.envPolicy === \"production\") {\n const blocked = DANGEROUS_RUNTIME_ENV_NAMES.filter(\n (name) => environment[name] !== undefined,\n );\n\n if (blocked.length > 0) {\n throw new Error(\n `Wiki Graph production entries do not support runtime env overrides: ${blocked.join(\", \")}. Use the development entry or explicit SDK options instead.`,\n );\n }\n\n return {\n env: environment,\n envPolicy: options.envPolicy,\n stateDir: options.stateDir,\n };\n }\n\n const envStateDir =\n environment.WIKIGRAPH_DEV ?? environment.WIKIGRAPH_STATE_DIR;\n const stateDir = normalizeOptionalPath(options.stateDir ?? envStateDir);\n\n if (stateDir === undefined) {\n throw new Error(\n \"Wiki Graph development entries require an explicit runtime state directory.\",\n );\n }\n\n const devProjectRoot = normalizeOptionalPath(options.devProjectRoot);\n\n if (devProjectRoot === undefined) {\n throw new Error(\n \"Wiki Graph development entries require an explicit project root.\",\n );\n }\n\n return {\n devProjectRoot,\n env: environment,\n envPolicy: options.envPolicy,\n stateDir,\n };\n}\n\nfunction createMergedEnvironment(\n environment: NodeJS.ProcessEnv | undefined,\n): NodeJS.ProcessEnv {\n if (environment === undefined) {\n return { ...process.env };\n }\n\n return {\n ...process.env,\n ...environment,\n };\n}\n\nfunction normalizeOptionalPath(path: string | undefined): string | undefined {\n if (path === undefined || path.trim() === \"\") {\n return undefined;\n }\n\n return path;\n}\n","import {\n addBuildJob,\n boostBuildJob,\n cancelBuildJob,\n cleanBuildJobs,\n formatLocatedChapterUri,\n getBuildJob,\n listBuildJobs,\n listChapters,\n pauseBuildJob,\n readBuildJobEvents,\n resolveBuildJobId,\n resumeBuildJob,\n updateBuildJobTarget,\n withArchiveBuildJobCreationLock,\n resolveChapterPathReadonly,\n WikiGraphArchiveFile,\n type AddBuildJobOptions,\n type BuildJob,\n type BuildJobEvent,\n type BuildJobEventChunk,\n type BuildJobListOptions,\n type BuildJobTarget,\n type ChapterEntry,\n} from \"wiki-graph-core\";\n\nimport { getNodeResourcePath } from \"./node-platform.js\";\nimport { type WikiGraphArchiveTarget } from \"./archive/index.js\";\nimport {\n archiveTargetFromLogicalLocator,\n resolveWikiGraphArchiveLocation,\n resolveWikiGraphArchiveTarget,\n} from \"./archive/target.js\";\nimport {\n requireKnowledgeGraphWikispineConfig,\n runWikiGraphQueueWorker,\n type WikiGraphQueueWorkerOptions,\n} from \"./default-worker.js\";\nimport { getWikiGraphSDKProviders } from \"./runtime-context.js\";\nimport { resolveWikiGraphLLMJSON } from \"./providers.js\";\nimport type { WikiGraphLLMConfig } from \"./runtime-config.js\";\nimport { loadWikiGraphRuntimeConfig } from \"./runtime-config.js\";\nimport { loadRequiredStageConfig } from \"./stage.js\";\n\nconst TERMINAL_STATES = new Set([\"canceled\", \"failed\", \"succeeded\"]);\nconst TERMINAL_EVENT_GRACE_READS = 3;\n\nexport interface WikiGraphJobBackend {\n add(options: AddBuildJobOptions): Promise<BuildJob>;\n boost(jobId: string): Promise<BuildJob>;\n cancel(jobId: string): Promise<BuildJob>;\n get(jobId: string): Promise<BuildJob>;\n list(options: BuildJobListOptions): Promise<readonly BuildJob[]>;\n pause(jobId: string): Promise<BuildJob>;\n readEventChunk?(job: BuildJob, cursor: number): Promise<BuildJobEventChunk>;\n readEvents?(job: BuildJob): Promise<readonly BuildJobEvent[]>;\n resume(jobId: string): Promise<BuildJob>;\n setTarget(jobId: string, target: BuildJobTarget): Promise<BuildJob>;\n}\n\nconst CORE_BUILD_JOB_BACKEND: WikiGraphJobBackend = {\n add: async (options) => await addBuildJob(options),\n boost: async (jobId) => await boostBuildJob(jobId),\n cancel: async (jobId) => await cancelBuildJob(jobId),\n get: async (jobId) => await getBuildJob(jobId),\n list: async (options) => await listBuildJobs(options),\n pause: async (jobId) => await pauseBuildJob(jobId),\n readEventChunk: async (job, cursor) =>\n await readIncrementalBuildJobEvents(job, cursor),\n readEvents: async (job) => await readBuildJobEvents(job),\n resume: async (jobId) => await resumeBuildJob(jobId),\n setTarget: async (jobId, target) => await updateBuildJobTarget(jobId, target),\n};\n\nasync function readIncrementalBuildJobEvents(\n job: BuildJob,\n cursor: number,\n): Promise<BuildJobEventChunk> {\n let reader: Awaited<ReturnType<BuildJob[\"events\"][\"openReader\"]>>;\n try {\n reader = await job.events.openReader();\n } catch {\n return { cursor, events: await readBuildJobEvents(job) };\n }\n try {\n const offset = cursor <= reader.size ? cursor : 0;\n const content = new TextDecoder().decode(\n await reader.read(offset, reader.size - offset),\n );\n return {\n cursor: reader.size,\n events: content\n .split(\"\\n\")\n .filter((line) => line.trim() !== \"\")\n .map((line) => JSON.parse(line) as BuildJobEvent),\n };\n } finally {\n await reader.close();\n }\n}\n\nexport interface WikiGraphJobCreateOptions extends Omit<\n AddBuildJobOptions,\n \"archive\"\n> {\n readonly archive: WikiGraphArchiveTarget;\n}\n\nexport interface WikiGraphJobListOptions extends Omit<\n BuildJobListOptions,\n \"archive\"\n> {\n readonly archive?: WikiGraphArchiveTarget;\n}\n\nexport interface WikiGraphJobChapterReference {\n readonly locatedUri: string;\n readonly title: string | null;\n readonly uri: string;\n}\n\nexport interface WikiGraphJobSnapshot extends Omit<\n BuildJob,\n \"archive\" | \"cache\" | \"events\" | \"log\" | \"workspace\"\n> {\n readonly archive: WikiGraphArchiveTarget;\n readonly cachePath?: string;\n readonly eventsPath?: string;\n readonly logPath?: string;\n readonly workspacePath?: string;\n}\n\nexport interface WikiGraphJobEnqueueOptions {\n readonly archive: WikiGraphArchiveTarget;\n readonly boost?: boolean;\n readonly chapterId?: number;\n readonly chapterIds?: readonly number[];\n readonly chapterPath?: string;\n readonly depth?: number;\n readonly llm?: WikiGraphLLMConfig;\n /** @deprecated Prefer the typed llm option. */\n readonly llmJSON?: string;\n readonly prompt?: string;\n readonly target?: BuildJobTarget;\n}\n\nexport interface WikiGraphJobEnqueueResult {\n readonly created: readonly {\n readonly chapter: ChapterEntry;\n readonly job: WikiGraphJob;\n }[];\n readonly skipped: readonly {\n readonly chapter: ChapterEntry;\n readonly reason: string;\n }[];\n}\n\nexport interface WikiGraphJobEnqueuePlan {\n readonly ready: readonly ChapterEntry[];\n readonly skipped: readonly {\n readonly chapter: ChapterEntry;\n readonly reason: string;\n }[];\n}\n\nexport interface WikiGraphJobEventsOptions {\n readonly from?: \"beginning\" | \"now\";\n readonly pollIntervalMs?: number;\n readonly signal?: AbortSignal;\n}\n\nexport type WikiGraphJobEventListener = (\n event: BuildJobEvent,\n) => void | Promise<void>;\n\nexport interface WikiGraphJobSubscriptionOptions extends WikiGraphJobEventsOptions {\n readonly onError?: (error: unknown) => void;\n}\n\nexport interface WikiGraphJobRuntime {\n run<T>(\n operation: () => Promise<T> | T,\n signal?: AbortSignal,\n options?: { readonly skipHomeBootstrap?: boolean },\n ): Promise<T>;\n}\n\nexport class WikiGraphJobManager {\n readonly #runtime: WikiGraphJobRuntime;\n readonly #backend: WikiGraphJobBackend;\n readonly #subscriptions = new Set<AbortController>();\n\n public constructor(\n runtime: WikiGraphJobRuntime,\n backend: WikiGraphJobBackend = CORE_BUILD_JOB_BACKEND,\n ) {\n this.#runtime = runtime;\n this.#backend = backend;\n }\n\n public async create(\n options: WikiGraphJobCreateOptions,\n ): Promise<WikiGraphJob> {\n const resolved = await this.#runtime.run(async () => {\n const location = await resolveWikiGraphArchiveLocation(options.archive);\n return {\n job: await this.#backend.add({\n ...options,\n archive: location.archiveFile,\n }),\n target: location.target,\n };\n });\n return await this.#createHandle(resolved.job, resolved.target);\n }\n\n public async clean(): Promise<number> {\n return await this.#runtime.run(async () => await cleanBuildJobs());\n }\n\n public async runWorker(\n options: WikiGraphQueueWorkerOptions = {},\n ): Promise<void> {\n await this.#runtime.run(\n async () => await runWikiGraphQueueWorker(options),\n options.signal,\n );\n }\n\n public async get(jobId: string): Promise<WikiGraphJob> {\n return await this.#runtime.run(\n async () => await this.#createHandle(await this.#backend.get(jobId)),\n );\n }\n\n public async resolveId(reference: string): Promise<string> {\n return await this.#runtime.run(\n async () => await resolveBuildJobId(reference),\n );\n }\n\n public async list(\n options: WikiGraphJobListOptions = {},\n ): Promise<readonly WikiGraphJob[]> {\n return await this.#runtime.run(async () => {\n const normalized: BuildJobListOptions = {\n ...(options.activeOnly === undefined\n ? {}\n : { activeOnly: options.activeOnly }),\n ...(options.all === undefined ? {} : { all: options.all }),\n ...(options.archive === undefined\n ? {}\n : {\n archive: (await resolveWikiGraphArchiveLocation(options.archive))\n .archiveFile,\n }),\n };\n const jobs = await this.#backend.list(normalized);\n return await Promise.all(\n jobs.map(async (job) => await this.#createHandle(job)),\n );\n });\n }\n\n public async resolveChapters(\n jobs: readonly WikiGraphJobSnapshot[],\n ): Promise<ReadonlyMap<string, WikiGraphJobChapterReference>> {\n return await this.#runtime.run(async () => {\n const jobsByArchive = new Map<string, WikiGraphJobSnapshot[]>();\n for (const job of jobs) {\n const archivePath = getJobArchiveLocator(job);\n const grouped = jobsByArchive.get(archivePath) ?? [];\n grouped.push(job);\n jobsByArchive.set(archivePath, grouped);\n }\n const entries = (\n await Promise.all(\n [...jobsByArchive].map(async ([archivePath, archiveJobs]) => {\n try {\n const location = await resolveWikiGraphArchiveLocation(\n archiveJobs[0]!.archive,\n );\n const chapters = await new WikiGraphArchiveFile(\n location.archiveFile,\n ).readDocument(async (document) => await listChapters(document));\n const chaptersById = new Map(\n chapters.map((chapter) => [chapter.chapterId, chapter]),\n );\n return archiveJobs.flatMap((job) => {\n const chapter = chaptersById.get(job.chapterId);\n return chapter === undefined\n ? []\n : [\n [\n job.jobId,\n {\n locatedUri: formatLocatedChapterUri(\n archivePath,\n chapter.path,\n ),\n title: chapter.title,\n uri: chapter.uri,\n },\n ] as const,\n ];\n });\n } catch {\n return [];\n }\n }),\n )\n ).flat();\n return new Map(entries);\n });\n }\n\n public async resolveChapter(\n job: WikiGraphJobSnapshot,\n ): Promise<WikiGraphJobChapterReference | undefined> {\n return (await this.resolveChapters([job])).get(job.jobId);\n }\n\n public async enqueue(\n options: WikiGraphJobEnqueueOptions,\n ): Promise<WikiGraphJobEnqueueResult> {\n return await this.#runtime.run(async () => {\n const llmJSON = resolveWikiGraphLLMJSON(options);\n const location = await resolveWikiGraphArchiveLocation(options.archive);\n return await withArchiveBuildJobCreationLock(\n location.archiveFile,\n async () => {\n const target = options.target ?? \"reading-summary\";\n await validateQueueTargetConfig(target, llmJSON);\n const selectedExplicitly =\n options.chapterId !== undefined ||\n options.chapterIds !== undefined ||\n options.chapterPath !== undefined ||\n options.depth !== undefined;\n const candidates = await new WikiGraphArchiveFile(\n location.archiveFile,\n ).readDocument(async (document) => {\n const chapters = await listChapters(document);\n const selected = await selectQueueChapters(\n document,\n chapters,\n options,\n );\n const checked = await Promise.all(\n selected.map(async (chapter) => ({\n chapter,\n reason: await readQueueReadinessReason(\n document,\n chapter,\n target,\n ),\n })),\n );\n return checked;\n });\n const created: Array<{ chapter: ChapterEntry; job: WikiGraphJob }> =\n [];\n const skipped: Array<{ chapter: ChapterEntry; reason: string }> = [];\n for (const candidate of candidates) {\n if (candidate.reason !== undefined) {\n if (selectedExplicitly && candidates.length === 1) {\n throw new Error(\n formatQueueReadinessError(\n candidate.chapter,\n target,\n candidate.reason,\n ),\n );\n }\n skipped.push({\n chapter: candidate.chapter,\n reason: candidate.reason,\n });\n continue;\n }\n try {\n created.push({\n chapter: candidate.chapter,\n job: await this.#createHandle(\n await this.#backend.add({\n archive: location.archiveFile,\n boost: options.boost ?? false,\n chapterId: candidate.chapter.chapterId,\n ...(llmJSON === undefined ? {} : { llmJSON }),\n ...(options.prompt === undefined\n ? {}\n : { prompt: options.prompt }),\n target,\n }),\n location.target,\n ),\n });\n } catch (error) {\n if (selectedExplicitly && candidates.length === 1) throw error;\n skipped.push({\n chapter: candidate.chapter,\n reason: error instanceof Error ? error.message : String(error),\n });\n }\n }\n return { created, skipped };\n },\n );\n });\n }\n\n public async planEnqueue(\n options: WikiGraphJobEnqueueOptions,\n ): Promise<WikiGraphJobEnqueuePlan> {\n return await this.#runtime.run(async () => {\n const llmJSON = resolveWikiGraphLLMJSON(options);\n const location = await resolveWikiGraphArchiveLocation(options.archive);\n const target = options.target ?? \"reading-summary\";\n await validateQueueTargetConfig(target, llmJSON);\n const selectedExplicitly =\n options.chapterId !== undefined ||\n options.chapterIds !== undefined ||\n options.chapterPath !== undefined ||\n options.depth !== undefined;\n const candidates = await new WikiGraphArchiveFile(\n location.archiveFile,\n ).readDocument(async (document) => {\n const chapters = await listChapters(document);\n const selected = await selectQueueChapters(document, chapters, options);\n return await Promise.all(\n selected.map(async (chapter) => ({\n chapter,\n reason: await readQueueReadinessReason(document, chapter, target),\n })),\n );\n });\n if (\n selectedExplicitly &&\n candidates.length === 1 &&\n candidates[0]?.reason !== undefined\n ) {\n throw new Error(\n formatQueueReadinessError(\n candidates[0].chapter,\n target,\n candidates[0].reason,\n ),\n );\n }\n return {\n ready: candidates\n .filter((item) => item.reason === undefined)\n .map((item) => item.chapter),\n skipped: candidates.flatMap((item) =>\n item.reason === undefined\n ? []\n : [{ chapter: item.chapter, reason: item.reason }],\n ),\n };\n });\n }\n\n public close(): void {\n for (const controller of this.#subscriptions) controller.abort();\n this.#subscriptions.clear();\n }\n\n public trackSubscription(controller: AbortController): () => void {\n this.#subscriptions.add(controller);\n return () => this.#subscriptions.delete(controller);\n }\n\n async #createHandle(\n snapshot: BuildJob,\n target?: WikiGraphArchiveTarget,\n ): Promise<WikiGraphJob> {\n const legacy = snapshot as BuildJob & { readonly archivePath?: string };\n const resolvedTarget =\n target ??\n (snapshot.archive === undefined\n ? archiveTargetFromLogicalLocator(legacy.archivePath ?? \"unknown.wikg\")\n : await resolveWikiGraphArchiveTarget(snapshot.archive));\n return new WikiGraphJob(\n this,\n this.#runtime,\n this.#backend,\n snapshot,\n cloneWikiGraphArchiveTarget(resolvedTarget),\n );\n }\n}\n\nfunction getJobArchiveLocator(job: WikiGraphJobSnapshot): string {\n return job.archive.kind === \"library\" ? job.archive.uri : job.archive.path;\n}\n\nexport class WikiGraphJob {\n readonly #manager: WikiGraphJobManager;\n readonly #runtime: WikiGraphJobRuntime;\n readonly #backend: WikiGraphJobBackend;\n readonly #archiveTarget: WikiGraphArchiveTarget;\n #snapshot: BuildJob;\n\n public constructor(\n manager: WikiGraphJobManager,\n runtime: WikiGraphJobRuntime,\n backend: WikiGraphJobBackend,\n snapshot: BuildJob,\n archiveTarget: WikiGraphArchiveTarget,\n ) {\n this.#manager = manager;\n this.#runtime = runtime;\n this.#backend = backend;\n this.#snapshot = snapshot;\n this.#archiveTarget = archiveTarget;\n }\n\n public get id(): string {\n return this.#snapshot.jobId;\n }\n\n public get snapshot(): WikiGraphJobSnapshot {\n return toPublicJobSnapshot(this.#snapshot, this.#archiveTarget);\n }\n\n public async status(): Promise<WikiGraphJobSnapshot> {\n return await this.#update(async () => await this.#backend.get(this.id));\n }\n\n public async pause(): Promise<WikiGraphJobSnapshot> {\n return await this.#update(async () => await this.#backend.pause(this.id));\n }\n\n public async resume(): Promise<WikiGraphJobSnapshot> {\n return await this.#update(async () => await this.#backend.resume(this.id));\n }\n\n public async cancel(): Promise<WikiGraphJobSnapshot> {\n return await this.#update(async () => await this.#backend.cancel(this.id));\n }\n\n public async boost(): Promise<WikiGraphJobSnapshot> {\n return await this.#update(async () => await this.#backend.boost(this.id));\n }\n\n public async setTarget(\n target: BuildJobTarget,\n ): Promise<WikiGraphJobSnapshot> {\n return await this.#update(\n async () => await this.#backend.setTarget(this.id, target),\n );\n }\n\n public async *events(\n options: WikiGraphJobEventsOptions = {},\n ): AsyncIterable<BuildJobEvent> {\n let seenSeq = 0;\n let cursor = 0;\n let job = this.#snapshot;\n if (options.from === \"now\") {\n await this.status();\n job = this.#snapshot;\n const chunk = await this.#readEventChunkSafely(job, cursor);\n const events = chunk.events;\n cursor = chunk.cursor;\n seenSeq = events.at(-1)?.seq ?? 0;\n if (isTerminalState(job.state)) return;\n }\n\n let terminalReadsWithoutEvent = 0;\n while (options.signal?.aborted !== true) {\n const chunk = await this.#readEventChunkSafely(job, cursor);\n const events = chunk.events;\n cursor = chunk.cursor;\n let sawTerminalEvent = false;\n for (const event of events) {\n if (event.seq <= seenSeq) continue;\n seenSeq = event.seq;\n sawTerminalEvent ||= isTerminalEvent(event);\n yield event;\n }\n if (sawTerminalEvent) return;\n\n await this.status();\n job = this.#snapshot;\n if (isTerminalState(job.state)) {\n terminalReadsWithoutEvent += 1;\n if (terminalReadsWithoutEvent >= TERMINAL_EVENT_GRACE_READS) return;\n } else {\n terminalReadsWithoutEvent = 0;\n }\n await wait(options.pollIntervalMs ?? 1_000, options.signal);\n }\n }\n\n public subscribe(\n listener: WikiGraphJobEventListener,\n options: WikiGraphJobSubscriptionOptions = {},\n ): () => void {\n const controller = new AbortController();\n const untrack = this.#manager.trackSubscription(controller);\n const stopForwarding = forwardAbort(options.signal, controller);\n void (async () => {\n try {\n for await (const event of this.events({\n ...options,\n signal: controller.signal,\n })) {\n try {\n await listener(event);\n } catch (error) {\n options.onError?.(error);\n }\n }\n } catch (error) {\n if (!controller.signal.aborted) options.onError?.(error);\n } finally {\n stopForwarding();\n untrack();\n }\n })();\n return () => controller.abort();\n }\n\n async #update(\n operation: () => Promise<BuildJob>,\n ): Promise<WikiGraphJobSnapshot> {\n this.#snapshot = await this.#runtime.run(operation);\n return this.snapshot;\n }\n\n async #readEventChunk(\n job: BuildJob,\n cursor: number,\n ): Promise<BuildJobEventChunk> {\n return await this.#runtime.run(async () => {\n if (this.#backend.readEventChunk !== undefined) {\n return await this.#backend.readEventChunk(job, cursor);\n }\n const events = await this.#backend.readEvents?.(job);\n return { cursor: 0, events: events ?? [] };\n });\n }\n\n async #readEventChunkSafely(\n job: BuildJob,\n cursor: number,\n ): Promise<BuildJobEventChunk> {\n try {\n return await this.#readEventChunk(job, cursor);\n } catch {\n return { cursor, events: [] };\n }\n }\n}\n\nfunction toPublicJobSnapshot(\n job: BuildJob,\n archive: WikiGraphArchiveTarget,\n): WikiGraphJobSnapshot {\n const legacy = job as BuildJob & {\n readonly cachePath?: string;\n readonly eventsPath?: string;\n readonly logPath?: string;\n readonly workspacePath?: string;\n };\n return {\n archive: cloneWikiGraphArchiveTarget(archive),\n archiveKey: archive.kind === \"library\" ? archive.uri : job.archiveKey,\n ...(getJobResourcePath(job.cache, legacy.cachePath) === undefined\n ? {}\n : { cachePath: getJobResourcePath(job.cache, legacy.cachePath)! }),\n chapterId: job.chapterId,\n createdAt: job.createdAt,\n ...(job.currentStep === undefined ? {} : { currentStep: job.currentStep }),\n ...(job.errorJSON === undefined ? {} : { errorJSON: job.errorJSON }),\n ...(getJobResourcePath(job.events, legacy.eventsPath) === undefined\n ? {}\n : { eventsPath: getJobResourcePath(job.events, legacy.eventsPath)! }),\n ...(job.finishedAt === undefined ? {} : { finishedAt: job.finishedAt }),\n jobId: job.jobId,\n ...(job.inputRevision === undefined\n ? {}\n : { inputRevision: job.inputRevision }),\n ...(getJobResourcePath(job.log, legacy.logPath) === undefined\n ? {}\n : { logPath: getJobResourcePath(job.log, legacy.logPath)! }),\n ...(job.llmJSON === undefined ? {} : { llmJSON: job.llmJSON }),\n ...(job.ownerId === undefined ? {} : { ownerId: job.ownerId }),\n ...(job.prompt === undefined ? {} : { prompt: job.prompt }),\n queueRank: job.queueRank,\n ...(job.readingSummaryStartedAt === undefined\n ? {}\n : { readingSummaryStartedAt: job.readingSummaryStartedAt }),\n state: job.state,\n target: job.target,\n updatedAt: job.updatedAt,\n ...(getJobResourcePath(job.workspace, legacy.workspacePath) === undefined\n ? {}\n : {\n workspacePath: getJobResourcePath(\n job.workspace,\n legacy.workspacePath,\n )!,\n }),\n };\n}\n\nfunction cloneWikiGraphArchiveTarget(\n target: WikiGraphArchiveTarget,\n): WikiGraphArchiveTarget {\n return target.kind === \"library\"\n ? Object.freeze({ kind: \"library\", uri: target.uri })\n : Object.freeze({\n kind: \"standalone\",\n path: target.path,\n ...(target.objectUri === undefined\n ? {}\n : { objectUri: target.objectUri }),\n });\n}\n\nfunction getJobResourcePath(\n resource: Parameters<typeof getNodeResourcePath>[0] | undefined,\n legacy: string | undefined,\n): string | undefined {\n if (resource === undefined) return legacy;\n try {\n return getNodeResourcePath(resource);\n } catch {\n const identity = (resource as { readonly identity?: unknown }).identity;\n if (typeof identity === \"string\") return identity;\n throw new TypeError(\"Expected a Node File or Directory resource\");\n }\n}\n\nasync function selectQueueChapters(\n document: Parameters<typeof listChapters>[0],\n chapters: readonly ChapterEntry[],\n options: WikiGraphJobEnqueueOptions,\n): Promise<readonly ChapterEntry[]> {\n const ids =\n options.chapterIds ??\n (options.chapterId === undefined ? undefined : [options.chapterId]);\n if (ids !== undefined) {\n const selected = new Set(ids);\n for (const id of selected) requireQueueChapter(chapters, id);\n return chapters.filter((chapter) => selected.has(chapter.chapterId));\n }\n if (options.chapterPath === undefined) {\n return options.depth === undefined\n ? chapters\n : chapters.filter((chapter) => chapter.depth <= options.depth!);\n }\n const rootId = await resolveChapterPathReadonly(\n document,\n options.chapterPath,\n );\n const root = requireQueueChapter(chapters, rootId);\n const prefix = `${root.path}/`;\n return chapters.filter(\n (chapter) =>\n chapter.chapterId === rootId ||\n (chapter.path.startsWith(prefix) &&\n (options.depth === undefined ||\n chapter.depth - root.depth <= options.depth)),\n );\n}\n\nasync function validateQueueTargetConfig(\n target: BuildJobTarget,\n llmJSON: string | undefined,\n): Promise<void> {\n const providers = getWikiGraphSDKProviders();\n const config =\n target === \"knowledge-graph\" ||\n target === \"reading-graph\" ||\n target === \"reading-summary\"\n ? await loadRequiredStageConfig({\n ...(llmJSON === undefined ? {} : { llmJSON }),\n })\n : await loadWikiGraphRuntimeConfig({\n ...(llmJSON === undefined ? {} : { llmJSON }),\n ...(providers.embedding === undefined\n ? {}\n : { skipEmbeddingConfig: true }),\n ...(llmJSON === undefined && providers.llm !== undefined\n ? { skipLLMConfig: true }\n : {}),\n });\n if (\n (target === \"index-embedding-source\" ||\n target === \"index-embedding-summary\") &&\n config.embedding === undefined &&\n providers.embedding === undefined\n ) {\n throw new Error(\n \"Missing embeddings configuration. Configure `wikg://local/config/embeddings` before queueing embedding index artifact jobs.\",\n );\n }\n if (target === \"knowledge-graph\")\n requireKnowledgeGraphWikispineConfig(config);\n}\n\nfunction requireQueueChapter(\n chapters: readonly ChapterEntry[],\n chapterId: number,\n): ChapterEntry {\n const chapter = chapters.find((entry) => entry.chapterId === chapterId);\n if (chapter === undefined)\n throw new Error(`Chapter ${chapterId} does not exist.`);\n return chapter;\n}\n\nasync function readQueueReadinessReason(\n document: Parameters<typeof listChapters>[0],\n chapter: ChapterEntry,\n target: BuildJobTarget,\n): Promise<string | undefined> {\n if (chapter.stage === \"planned\") {\n return \"planned\";\n }\n if (target === \"index-embedding-summary\") {\n const summary = await document.readSummary(chapter.chapterId);\n if (summary === undefined || summary.trim() === \"\") {\n return \"missing summary\";\n }\n }\n if (target === \"knowledge-graph\" || target === \"reading-graph\") {\n const [artifact, revision] = await Promise.all([\n document.indexArtifacts.get(chapter.chapterId, \"fts\"),\n document.serials.getRevision(chapter.chapterId),\n ]);\n if (artifact?.sourceRevision !== revision) {\n return \"missing current FTS index artifact\";\n }\n }\n return undefined;\n}\n\nfunction formatQueueReadinessError(\n chapter: ChapterEntry,\n target: BuildJobTarget,\n reason: string,\n): string {\n if (reason === \"planned\") {\n return `Chapter ${chapter.uri} is planned. Set source before queueing a build job.`;\n }\n if (reason === \"missing summary\") {\n return `Chapter ${chapter.uri} has no summary. Build a reading summary before queueing a summary embedding index artifact job.`;\n }\n if (reason === \"missing current FTS index artifact\") {\n return `Chapter ${chapter.uri} needs a current FTS index artifact before queueing ${target}.`;\n }\n return reason;\n}\n\nasync function wait(milliseconds: number, signal?: AbortSignal): Promise<void> {\n if (signal?.aborted === true) return;\n await new Promise<void>((resolve) => {\n let settled = false;\n const complete = (): void => {\n if (settled) return;\n settled = true;\n clearTimeout(timeout);\n signal?.removeEventListener(\"abort\", complete);\n resolve();\n };\n const timeout = setTimeout(complete, milliseconds);\n signal?.addEventListener(\"abort\", complete, { once: true });\n if (signal?.aborted === true) complete();\n });\n}\n\nfunction isTerminalState(state: BuildJob[\"state\"]): boolean {\n return TERMINAL_STATES.has(state);\n}\n\nfunction isTerminalEvent(event: BuildJobEvent): boolean {\n return (\n event.type === \"canceled\" ||\n event.type === \"failed\" ||\n event.type === \"succeeded\"\n );\n}\n\nfunction forwardAbort(\n source: AbortSignal | undefined,\n target: AbortController,\n): () => void {\n if (source === undefined) return () => undefined;\n const abort = (): void => target.abort(source.reason);\n if (source.aborted) abort();\n else source.addEventListener(\"abort\", abort, { once: true });\n return () => source.removeEventListener(\"abort\", abort);\n}\n","import {\n addWikiGraphLibraryArchive,\n assertWikiGraphLibrarySchemaCurrent,\n cleanWikiGraphLibraryIndex,\n clearWikiGraphLibraryMetadata,\n continueWikiGraphLibraryObjectBucket,\n createWikiGraphLibrary,\n deleteWikiGraphLibraryMetadataKey,\n findWikiGraphLibraryObjects,\n findWikiGraphLibraryObjectBuckets,\n findWikiGraphLibraryArchiveMembers,\n formatWikiGraphLibraryUri,\n getWikiGraphLibraryArchive,\n getWikiGraphLibraryMetadata,\n listRelatedWikiGraphLibraryObjects,\n listWikiGraphLibraries,\n listWikiGraphLibraryArchives,\n listWikiGraphLibraryArchiveMembers,\n listWikiGraphLibraryEvidence,\n listWikiGraphLibraryObjects,\n moveWikiGraphLibraryArchive,\n packWikiGraphLibraryContext,\n parseWikiGraphLibraryUri,\n putWikiGraphLibraryMetadata,\n readWikiGraphLibraryIndexState,\n readWikiGraphLibraryPage,\n rebuildWikiGraphLibraryIndex,\n rebindWikiGraphLibrary,\n removeWikiGraphLibrary,\n removeWikiGraphLibraryArchive,\n replaceWikiGraphLibraryArchive,\n replaceWikiGraphLibraryMetadata,\n resolveWikiGraphLibrary,\n scanWikiGraphLibrary,\n withWikiGraphLibraryLock,\n type ArchiveCollectionOptions,\n type ArchiveFindOptions,\n type ArchivePack,\n type ArchivePage,\n type ParsedWikiGraphLibraryUri,\n type SearchIndexEmbeddingProvider,\n type SearchIndexQueryMode,\n type WikiGraphLibraryArchiveRecord,\n type WikiGraphLibraryBucketContinuationOptions as CoreWikiGraphLibraryBucketContinuationOptions,\n type WikiGraphLibraryBucketSearchOptions as CoreWikiGraphLibraryBucketSearchOptions,\n type WikiGraphLibraryIndexState,\n type WikiGraphLibraryRecord,\n type WikiGraphLibraryScanResult,\n type FileReader,\n} from \"wiki-graph-core\";\nimport { mkdir } from \"fs/promises\";\n\nimport type { WikiGraphJobRuntime } from \"./jobs.js\";\nimport {\n getNodeResourcePath,\n NodeDirectory,\n NodeFile,\n} from \"./node-platform.js\";\nimport { resolveWikiGraphRuntimePath } from \"./runtime-path.js\";\nimport {\n createConfiguredEmbeddingProvider,\n withConfiguredWikimediaResolver,\n} from \"./query-runtime.js\";\nimport { assertStandaloneWikiGraphArchivePath } from \"./archive/target.js\";\nimport {\n createArchiveCollectionPage,\n createArchiveEvidencePage,\n createArchiveFindPage,\n createArchiveRelatedPage,\n createLibraryBucketPage,\n type ArchiveCollectionPage,\n type ArchiveEvidencePage,\n type ArchiveFindPage,\n type ArchiveRelatedPage,\n type LibraryBucketPage,\n} from \"./result-pages.js\";\n\nexport type WikiGraphLibraryTarget = ParsedWikiGraphLibraryUri | string;\n\nasync function resolveQueryEmbeddingProvider(\n queryMode: SearchIndexQueryMode | undefined,\n): Promise<SearchIndexEmbeddingProvider | undefined> {\n if (queryMode === \"fts\") return undefined;\n const provider = await createConfiguredEmbeddingProvider();\n if (queryMode === \"embedding\" && provider === undefined) {\n throw new Error(\n \"Embedding query mode requires embeddings configuration at `wikg://local/config/embeddings`.\",\n );\n }\n return provider;\n}\n\nexport type WikiGraphLibrarySearchOptions = Omit<\n ArchiveFindOptions,\n \"embeddingProvider\"\n>;\nexport type WikiGraphLibraryBucketSearchOptions = Omit<\n CoreWikiGraphLibraryBucketSearchOptions,\n \"embeddingProvider\"\n>;\nexport type WikiGraphLibraryBucketContinuationOptions = Omit<\n CoreWikiGraphLibraryBucketContinuationOptions,\n \"embeddingProvider\"\n>;\nexport type {\n WikiGraphLibraryBucketSearchResult,\n WikiGraphLibrarySearchBucketDefinition,\n WikiGraphLibrarySearchBucketPage,\n} from \"wiki-graph-core\";\nexport type WikiGraphLibraryRelatedOptions = Omit<\n NonNullable<Parameters<typeof listRelatedWikiGraphLibraryObjects>[2]>,\n \"embeddingProvider\"\n>;\nexport type WikiGraphLibraryEvidenceOptions = Omit<\n NonNullable<Parameters<typeof listWikiGraphLibraryEvidence>[2]>,\n \"embeddingProvider\"\n>;\nexport type WikiGraphLibraryPageOptions = Omit<\n Parameters<typeof readWikiGraphLibraryPage>[2],\n \"wikimediaResolver\"\n> & { readonly signal?: AbortSignal };\n\nexport interface WikiGraphLibraryAddArchiveOptions {\n readonly inputPath: string;\n readonly target: WikiGraphLibraryTarget;\n readonly to?: string;\n}\n\nexport interface WikiGraphLibraryMoveArchiveOptions {\n readonly target: WikiGraphLibraryTarget;\n readonly to: string;\n}\n\nexport interface WikiGraphLibraryReplaceArchiveOptions {\n readonly inputPath: string;\n readonly target: WikiGraphLibraryTarget;\n}\n\nexport interface WikiGraphLibraryArchiveContent {\n readonly mediaType: \"application/vnd.wiki-graph.archive\";\n readonly size: number;\n readonly stream: AsyncIterable<Uint8Array>;\n readonly uri: string;\n}\n\nexport interface WikiGraphLibraryArchiveReadOptions {\n readonly signal?: AbortSignal;\n}\n\nexport interface WikiGraphLibrarySnapshot extends Omit<\n WikiGraphLibraryRecord,\n \"folder\" | \"staging\"\n> {\n readonly folderPath: string;\n}\n\nexport type WikiGraphLibraryArchiveSnapshot = Omit<\n WikiGraphLibraryArchiveRecord,\n \"file\"\n>;\n\nexport interface WikiGraphLibraryScanSnapshot {\n readonly archives: readonly WikiGraphLibraryArchiveSnapshot[];\n readonly library?: WikiGraphLibrarySnapshot;\n}\n\nexport class WikiGraphLibraryManager {\n readonly #runtime: WikiGraphJobRuntime;\n\n public constructor(runtime: WikiGraphJobRuntime) {\n this.#runtime = runtime;\n }\n\n public async create(folder: string): Promise<WikiGraphLibrary> {\n const record = await this.#runtime.run(async () => {\n const path = resolveWikiGraphRuntimePath(folder);\n await mkdir(path);\n return await createWikiGraphLibrary({ folder: new NodeDirectory(path) });\n });\n return new WikiGraphLibrary(this.#runtime, record);\n }\n\n public async get(\n uri = formatWikiGraphLibraryUri(),\n ): Promise<WikiGraphLibrary> {\n const target = requireLibraryTarget(uri);\n const record = await this.#runtime.run(\n async () => await resolveWikiGraphLibrary(target),\n );\n return new WikiGraphLibrary(this.#runtime, record);\n }\n\n public async addArchive(\n options: WikiGraphLibraryAddArchiveOptions,\n ): Promise<WikiGraphLibraryArchiveSnapshot> {\n return toArchiveSnapshot(\n await this.#runtime.run(\n async () =>\n await addWikiGraphLibraryArchive({\n inputFile: new NodeFile(\n await assertStandaloneWikiGraphArchivePath(options.inputPath),\n ),\n target: requireLibraryTarget(options.target),\n ...(options.to === undefined ? {} : { to: options.to }),\n }),\n ),\n );\n }\n\n public async assertCurrent(target: WikiGraphLibraryTarget): Promise<void> {\n await this.#runtime.run(\n async () =>\n await assertWikiGraphLibrarySchemaCurrent(requireLibraryTarget(target)),\n );\n }\n\n public async rebind(\n target: WikiGraphLibraryTarget,\n folder: string,\n ): Promise<WikiGraphLibraryScanSnapshot> {\n return toScanSnapshot(\n await this.#runtime.run(\n async () =>\n await rebindWikiGraphLibrary({\n folder: new NodeDirectory(resolveWikiGraphRuntimePath(folder)),\n target: requireLibraryTarget(target),\n }),\n ),\n );\n }\n\n public async remove(\n target: WikiGraphLibraryTarget,\n ): Promise<WikiGraphLibrarySnapshot> {\n return toLibrarySnapshot(\n await this.#runtime.run(\n async () => await removeWikiGraphLibrary(requireLibraryTarget(target)),\n ),\n );\n }\n\n public async scan(\n target: WikiGraphLibraryTarget,\n ): Promise<WikiGraphLibraryScanSnapshot> {\n return toScanSnapshot(\n await this.#runtime.run(\n async () => await scanWikiGraphLibrary(requireLibraryTarget(target)),\n ),\n );\n }\n\n public async getArchive(\n target: WikiGraphLibraryTarget,\n ): Promise<WikiGraphLibraryArchiveSnapshot> {\n return toArchiveSnapshot(\n await this.#runtime.run(\n async () =>\n await getWikiGraphLibraryArchive(requireLibraryTarget(target)),\n ),\n );\n }\n\n public async readArchive<T>(\n target: WikiGraphLibraryTarget,\n consume: (content: WikiGraphLibraryArchiveContent) => Promise<T> | T,\n options: WikiGraphLibraryArchiveReadOptions = {},\n ): Promise<T> {\n return await this.#runtime.run(async () => {\n const parsedTarget = requireLibraryArchiveTarget(target);\n const library = await resolveWikiGraphLibrary(parsedTarget);\n\n return await withWikiGraphLibraryLock(\n library.id,\n \"read\",\n async () => {\n throwIfAborted(options.signal);\n const archive = await getWikiGraphLibraryArchive(parsedTarget);\n const file = requireReadableLibraryArchiveFile(archive);\n const reader = await file.openReader();\n let active = true;\n\n try {\n const content: WikiGraphLibraryArchiveContent = {\n mediaType: \"application/vnd.wiki-graph.archive\",\n size: reader.size,\n stream: createCallbackScopedArchiveStream(\n reader,\n () => active,\n options.signal,\n ),\n uri: archive.uri,\n };\n return await runAbortableCallback(\n async () => await consume(content),\n options.signal,\n );\n } finally {\n active = false;\n await reader.close();\n }\n },\n options.signal === undefined ? {} : { signal: options.signal },\n );\n }, options.signal);\n }\n\n public async moveArchive(\n options: WikiGraphLibraryMoveArchiveOptions,\n ): Promise<WikiGraphLibraryArchiveSnapshot> {\n return toArchiveSnapshot(\n await this.#runtime.run(\n async () =>\n await moveWikiGraphLibraryArchive({\n target: requireLibraryTarget(options.target),\n to: options.to,\n }),\n ),\n );\n }\n\n public async removeArchive(\n target: WikiGraphLibraryTarget,\n ): Promise<WikiGraphLibraryArchiveSnapshot> {\n return toArchiveSnapshot(\n await this.#runtime.run(\n async () =>\n await removeWikiGraphLibraryArchive({\n target: requireLibraryTarget(target),\n }),\n ),\n );\n }\n\n public async replaceArchive(\n options: WikiGraphLibraryReplaceArchiveOptions,\n ): Promise<WikiGraphLibraryArchiveSnapshot> {\n return toArchiveSnapshot(\n await this.#runtime.run(async () => {\n const target = requireLibraryTarget(options.target);\n const current = await getWikiGraphLibraryArchive(target);\n return await replaceWikiGraphLibraryArchive({\n additionalDerivedStateKeys:\n current.file === undefined\n ? []\n : [getNodeResourcePath(current.file)],\n inputFile: new NodeFile(\n await assertStandaloneWikiGraphArchivePath(options.inputPath),\n ),\n target,\n });\n }),\n );\n }\n\n public async indexState(\n target: WikiGraphLibraryTarget,\n ): Promise<WikiGraphLibraryIndexState> {\n return await this.#runtime.run(\n async () =>\n await readWikiGraphLibraryIndexState(requireLibraryTarget(target)),\n );\n }\n\n public async rebuildIndex(\n target: WikiGraphLibraryTarget,\n onProgress?: Parameters<typeof rebuildWikiGraphLibraryIndex>[1],\n ): Promise<WikiGraphLibraryIndexState> {\n return await this.#runtime.run(\n async () =>\n await rebuildWikiGraphLibraryIndex(\n requireLibraryTarget(target),\n onProgress,\n ),\n );\n }\n\n public async cleanIndex(\n target: WikiGraphLibraryTarget,\n ): Promise<WikiGraphLibraryIndexState> {\n return await this.#runtime.run(\n async () =>\n await cleanWikiGraphLibraryIndex(requireLibraryTarget(target)),\n );\n }\n\n public async getMetadata(\n target: WikiGraphLibraryTarget,\n ): Promise<Readonly<Record<string, unknown>>> {\n return await this.#runtime.run(\n async () =>\n await getWikiGraphLibraryMetadata(requireLibraryTarget(target)),\n );\n }\n\n public async replaceMetadata(\n target: WikiGraphLibraryTarget,\n value: Readonly<Record<string, unknown>>,\n ): Promise<Readonly<Record<string, unknown>>> {\n return await this.#runtime.run(\n async () =>\n await replaceWikiGraphLibraryMetadata(\n requireLibraryTarget(target),\n value,\n ),\n );\n }\n\n public async putMetadata(\n target: WikiGraphLibraryTarget,\n key: string,\n value: unknown,\n ): Promise<Readonly<Record<string, unknown>>> {\n return await this.#runtime.run(\n async () =>\n await putWikiGraphLibraryMetadata(\n requireLibraryTarget(target),\n key,\n value,\n ),\n );\n }\n\n public async deleteMetadata(\n target: WikiGraphLibraryTarget,\n key: string,\n ): Promise<Readonly<Record<string, unknown>>> {\n return await this.#runtime.run(\n async () =>\n await deleteWikiGraphLibraryMetadataKey(\n requireLibraryTarget(target),\n key,\n ),\n );\n }\n\n public async clearMetadata(\n target: WikiGraphLibraryTarget,\n ): Promise<Readonly<Record<string, unknown>>> {\n return await this.#runtime.run(\n async () =>\n await clearWikiGraphLibraryMetadata(requireLibraryTarget(target)),\n );\n }\n\n public async search(\n target: WikiGraphLibraryTarget,\n query: string,\n options: WikiGraphLibrarySearchOptions = {},\n ): Promise<ArchiveFindPage> {\n const result = await this.#runtime.run(async () => {\n const embeddingProvider = await resolveQueryEmbeddingProvider(\n options.queryMode,\n );\n return await findWikiGraphLibraryObjects(\n requireLibraryTarget(target),\n query,\n {\n ...options,\n ...(embeddingProvider === undefined ? {} : { embeddingProvider }),\n },\n );\n });\n return createArchiveFindPage(\n result,\n async (cursor, nextOptions) =>\n await this.search(target, query, {\n ...options,\n cursor,\n ...(nextOptions.limit === undefined\n ? {}\n : { limit: nextOptions.limit }),\n ...(nextOptions.signal === undefined\n ? {}\n : { signal: nextOptions.signal }),\n }),\n (cursor) => Promise.resolve(cursor),\n () => Promise.resolve(),\n );\n }\n\n public async searchBuckets(\n target: WikiGraphLibraryTarget,\n query: string,\n options: WikiGraphLibraryBucketSearchOptions,\n ): Promise<{\n readonly buckets: readonly LibraryBucketPage[];\n readonly query: string;\n }> {\n const result = await this.#runtime.run(async () => {\n const embeddingProvider = await resolveQueryEmbeddingProvider(\n options.queryMode,\n );\n return await findWikiGraphLibraryObjectBuckets(\n requireLibraryTarget(target),\n query,\n {\n ...options,\n ...(embeddingProvider === undefined ? {} : { embeddingProvider }),\n },\n );\n });\n return {\n buckets: result.buckets.map((bucket) =>\n createLibraryBucketPage(\n bucket,\n async (cursor, nextOptions) =>\n await this.continueSearchBucket(target, cursor, {\n ...(nextOptions.limit === undefined\n ? {}\n : { limit: nextOptions.limit }),\n }),\n (cursor) => Promise.resolve(cursor),\n () => Promise.resolve(),\n ),\n ),\n query: result.query,\n };\n }\n\n public async continueSearchBucket(\n target: WikiGraphLibraryTarget,\n cursor: string,\n options: WikiGraphLibraryBucketContinuationOptions = {},\n ): Promise<LibraryBucketPage> {\n const result = await this.#runtime.run(async () => {\n const embeddingProvider = await resolveQueryEmbeddingProvider(undefined);\n return await continueWikiGraphLibraryObjectBucket(\n requireLibraryTarget(target),\n cursor,\n {\n ...options,\n ...(embeddingProvider === undefined ? {} : { embeddingProvider }),\n },\n );\n });\n return createLibraryBucketPage(\n result,\n async (nextCursor, nextOptions) =>\n await this.continueSearchBucket(target, nextCursor, {\n ...options,\n ...(nextOptions.limit === undefined\n ? {}\n : { limit: nextOptions.limit }),\n }),\n (cursor) => Promise.resolve(cursor),\n () => Promise.resolve(),\n );\n }\n\n public async searchArchiveMembers(\n target: WikiGraphLibraryTarget,\n query: string,\n options: WikiGraphLibrarySearchOptions = {},\n ): Promise<ArchiveFindPage> {\n const result = await this.#runtime.run(async () => {\n const embeddingProvider = await resolveQueryEmbeddingProvider(\n options.queryMode,\n );\n return await findWikiGraphLibraryArchiveMembers(\n requireLibraryTarget(target),\n query,\n {\n ...options,\n ...(embeddingProvider === undefined ? {} : { embeddingProvider }),\n },\n );\n });\n return createArchiveFindPage(\n result,\n async (cursor, nextOptions) =>\n await this.searchArchiveMembers(target, query, {\n ...options,\n cursor,\n ...(nextOptions.limit === undefined\n ? {}\n : { limit: nextOptions.limit }),\n ...(nextOptions.signal === undefined\n ? {}\n : { signal: nextOptions.signal }),\n }),\n (cursor) => Promise.resolve(cursor),\n () => Promise.resolve(),\n );\n }\n\n public async objects(\n target: WikiGraphLibraryTarget,\n options: ArchiveCollectionOptions = {},\n ): Promise<ArchiveCollectionPage> {\n const result = await this.#runtime.run(\n async () =>\n await listWikiGraphLibraryObjects(\n requireLibraryTarget(target),\n options,\n ),\n );\n return createArchiveCollectionPage(\n result,\n async (cursor, nextOptions) =>\n await this.objects(target, {\n ...options,\n cursor,\n ...(nextOptions.limit === undefined\n ? {}\n : { limit: nextOptions.limit }),\n }),\n (cursor) => Promise.resolve(cursor),\n () => Promise.resolve(),\n );\n }\n\n public async archiveMembers(\n target: WikiGraphLibraryTarget,\n options: ArchiveCollectionOptions = {},\n ): Promise<ArchiveCollectionPage> {\n const result = await this.#runtime.run(\n async () =>\n await listWikiGraphLibraryArchiveMembers(\n requireLibraryTarget(target),\n options,\n ),\n );\n return createArchiveCollectionPage(\n result,\n async (cursor, nextOptions) =>\n await this.archiveMembers(target, {\n ...options,\n cursor,\n ...(nextOptions.limit === undefined\n ? {}\n : { limit: nextOptions.limit }),\n }),\n (cursor) => Promise.resolve(cursor),\n () => Promise.resolve(),\n );\n }\n\n public async page(\n target: WikiGraphLibraryTarget,\n objectUri: string,\n options: WikiGraphLibraryPageOptions = {},\n ): Promise<ArchivePage> {\n return await this.#runtime.run(\n async () =>\n await withConfiguredWikimediaResolver(\n objectUri,\n async (wikimediaOptions) =>\n await readWikiGraphLibraryPage(\n requireLibraryTarget(target),\n objectUri,\n { ...options, ...wikimediaOptions },\n ),\n ),\n options.signal,\n );\n }\n\n public async related(\n target: WikiGraphLibraryTarget,\n objectUri: string,\n options: WikiGraphLibraryRelatedOptions = {},\n ): Promise<ArchiveRelatedPage> {\n const result = await this.#runtime.run(async () => {\n if (options.query === undefined && options.queryMode !== undefined) {\n throw new Error(\"`queryMode` requires `query`.\");\n }\n const embeddingProvider =\n options.query === undefined\n ? undefined\n : await resolveQueryEmbeddingProvider(options.queryMode);\n return await listRelatedWikiGraphLibraryObjects(\n requireLibraryTarget(target),\n objectUri,\n {\n ...options,\n ...(embeddingProvider === undefined ? {} : { embeddingProvider }),\n },\n );\n });\n return createArchiveRelatedPage(\n result,\n async (cursor, nextOptions) =>\n await this.related(target, objectUri, {\n ...options,\n cursor,\n ...(nextOptions.limit === undefined\n ? {}\n : { limit: nextOptions.limit }),\n ...(nextOptions.signal === undefined\n ? {}\n : { signal: nextOptions.signal }),\n }),\n (cursor) => Promise.resolve(cursor),\n () => Promise.resolve(),\n );\n }\n\n public async evidence(\n target: WikiGraphLibraryTarget,\n objectUri: string,\n options: WikiGraphLibraryEvidenceOptions = {},\n ): Promise<ArchiveEvidencePage> {\n const result = await this.#runtime.run(async () => {\n if (options.query === undefined && options.queryMode !== undefined) {\n throw new Error(\"`queryMode` requires `query`.\");\n }\n const embeddingProvider =\n options.query === undefined\n ? undefined\n : await resolveQueryEmbeddingProvider(options.queryMode);\n return await listWikiGraphLibraryEvidence(\n requireLibraryTarget(target),\n objectUri,\n {\n ...options,\n ...(embeddingProvider === undefined ? {} : { embeddingProvider }),\n },\n );\n });\n return createArchiveEvidencePage(\n result,\n async (cursor, nextOptions) =>\n await this.evidence(target, objectUri, {\n ...options,\n cursor,\n ...(nextOptions.limit === undefined\n ? {}\n : { limit: nextOptions.limit }),\n ...(nextOptions.signal === undefined\n ? {}\n : { signal: nextOptions.signal }),\n }),\n (cursor) => Promise.resolve(cursor),\n () => Promise.resolve(),\n );\n }\n\n public async pack(\n target: WikiGraphLibraryTarget,\n objectUri: string,\n budget = 5_000,\n ): Promise<ArchivePack> {\n return await this.#runtime.run(\n async () =>\n await packWikiGraphLibraryContext(\n requireLibraryTarget(target),\n objectUri,\n budget,\n ),\n );\n }\n\n public async list(): Promise<readonly WikiGraphLibrary[]> {\n const records = await this.#runtime.run(\n async () => await listWikiGraphLibraries(),\n );\n return records.map((record) => new WikiGraphLibrary(this.#runtime, record));\n }\n}\n\nexport class WikiGraphLibrary {\n readonly #runtime: WikiGraphJobRuntime;\n readonly #record: WikiGraphLibraryRecord;\n\n public constructor(\n runtime: WikiGraphJobRuntime,\n record: WikiGraphLibraryRecord,\n ) {\n this.#runtime = runtime;\n this.#record = record;\n }\n\n public get snapshot(): WikiGraphLibrarySnapshot {\n return toLibrarySnapshot(this.#record);\n }\n\n public get uri(): string {\n return formatWikiGraphLibraryUri(\n this.#record.isDefault ? undefined : this.#record.publicId,\n );\n }\n\n public async archives(): Promise<readonly WikiGraphLibraryArchiveSnapshot[]> {\n const target = requireLibraryTarget(this.uri);\n return (\n await this.#runtime.run(\n async () => await listWikiGraphLibraryArchives(target),\n )\n ).map(toArchiveSnapshot);\n }\n\n public async scan(): Promise<WikiGraphLibraryScanSnapshot> {\n const target = requireLibraryTarget(this.uri);\n return toScanSnapshot(\n await this.#runtime.run(async () => await scanWikiGraphLibrary(target)),\n );\n }\n\n public async remove(): Promise<WikiGraphLibrarySnapshot> {\n const target = requireLibraryTarget(this.uri);\n return toLibrarySnapshot(\n await this.#runtime.run(async () => await removeWikiGraphLibrary(target)),\n );\n }\n}\n\nfunction toLibrarySnapshot(\n record: WikiGraphLibraryRecord,\n): WikiGraphLibrarySnapshot {\n const compatible = record as WikiGraphLibraryRecord & {\n readonly folderPath?: string;\n };\n return {\n id: record.id,\n publicId: record.publicId,\n uri: record.uri,\n folderPath:\n compatible.folderPath ??\n (record.folder === undefined ? \"\" : getNodeResourcePath(record.folder)),\n isDefault: record.isDefault,\n createdAt: record.createdAt,\n updatedAt: record.updatedAt,\n };\n}\n\nfunction toArchiveSnapshot(\n record: WikiGraphLibraryArchiveRecord,\n): WikiGraphLibraryArchiveSnapshot {\n const { file: _file, ...snapshot } = record;\n return snapshot;\n}\n\nfunction toScanSnapshot(\n result: WikiGraphLibraryScanResult,\n): WikiGraphLibraryScanSnapshot {\n return {\n ...(result.library === undefined\n ? {}\n : { library: toLibrarySnapshot(result.library) }),\n archives: result.archives.map(toArchiveSnapshot),\n };\n}\n\nfunction requireLibraryTarget(\n value: WikiGraphLibraryTarget,\n): ParsedWikiGraphLibraryUri {\n if (typeof value !== \"string\") return value;\n const target = parseWikiGraphLibraryUri(value);\n if (target === undefined) {\n throw new TypeError(`Invalid Wiki Graph library URI: ${value}`);\n }\n return target;\n}\n\nfunction requireLibraryArchiveTarget(\n value: WikiGraphLibraryTarget,\n): ParsedWikiGraphLibraryUri & { readonly kind: \"archive\" } {\n const target = requireLibraryTarget(value);\n if (\n target.kind !== \"archive\" ||\n target.archivePublicId === undefined ||\n target.objectUri !== undefined\n ) {\n throw new TypeError(\"Expected a Wiki Graph library archive URI.\");\n }\n return target as ParsedWikiGraphLibraryUri & { readonly kind: \"archive\" };\n}\n\nfunction requireReadableLibraryArchiveFile(\n archive: WikiGraphLibraryArchiveRecord,\n): NonNullable<WikiGraphLibraryArchiveRecord[\"file\"]> {\n if (!archive.exists || archive.status === \"missing\") {\n throw new Error(`Wiki Graph library archive is missing: ${archive.uri}`);\n }\n if (archive.status === \"conflict\") {\n throw new Error(\n `Wiki Graph library archive has a conflict and cannot be read: ${archive.uri}`,\n );\n }\n if (archive.file === undefined) {\n throw new Error(\n `Wiki Graph library archive is unavailable: ${archive.uri}`,\n );\n }\n return archive.file;\n}\n\nconst ARCHIVE_STREAM_CHUNK_SIZE = 64 * 1024;\n\nfunction createCallbackScopedArchiveStream(\n reader: FileReader,\n isActive: () => boolean,\n signal: AbortSignal | undefined,\n): AsyncIterable<Uint8Array> {\n let consumed = false;\n\n return {\n [Symbol.asyncIterator]() {\n assertArchiveReadSessionActive(isActive, signal);\n if (consumed) {\n throw new Error(\n \"The library archive stream has already been consumed.\",\n );\n }\n consumed = true;\n let offset = 0;\n let finished = false;\n\n return {\n async next(): Promise<IteratorResult<Uint8Array>> {\n if (finished) return { done: true, value: undefined };\n assertArchiveReadSessionActive(isActive, signal);\n if (offset >= reader.size) {\n finished = true;\n return { done: true, value: undefined };\n }\n\n const length = Math.min(\n ARCHIVE_STREAM_CHUNK_SIZE,\n reader.size - offset,\n );\n const chunk = await reader.read(offset, length);\n assertArchiveReadSessionActive(isActive, signal);\n offset += chunk.byteLength;\n return { done: false, value: chunk };\n },\n return(): Promise<IteratorResult<Uint8Array>> {\n finished = true;\n return Promise.resolve({ done: true, value: undefined });\n },\n };\n },\n };\n}\n\nfunction assertArchiveReadSessionActive(\n isActive: () => boolean,\n signal: AbortSignal | undefined,\n): void {\n if (!isActive()) {\n throw new Error(\n \"The library archive stream cannot be read after its callback has finished.\",\n );\n }\n throwIfAborted(signal);\n}\n\nasync function runAbortableCallback<T>(\n operation: () => Promise<T>,\n signal: AbortSignal | undefined,\n): Promise<T> {\n if (signal === undefined) return await operation();\n throwIfAborted(signal);\n\n let rejectAbort!: (reason: unknown) => void;\n const aborted = new Promise<never>((_resolve, reject) => {\n rejectAbort = reject;\n });\n const onAbort = (): void => rejectAbort(abortReason(signal));\n signal.addEventListener(\"abort\", onAbort, { once: true });\n try {\n return await Promise.race([operation(), aborted]);\n } finally {\n signal.removeEventListener(\"abort\", onAbort);\n }\n}\n\nfunction throwIfAborted(signal: AbortSignal | undefined): void {\n if (signal?.aborted === true) throw abortReason(signal);\n}\n\nfunction abortReason(signal: AbortSignal): unknown {\n return (\n signal.reason ??\n new DOMException(\"The operation was aborted.\", \"AbortError\")\n );\n}\n","import {\n migrateLegacySdpubToWikg,\n parseWikiGraphLibraryUri,\n upgradeWikiGraphMaintenanceTarget,\n type WikiGraphMaintenanceUpgradeResult,\n} from \"wiki-graph-core\";\nimport { basename } from \"path\";\n\nimport type { WikiGraphJobRuntime } from \"./jobs.js\";\nimport { NodeFile } from \"./node-platform.js\";\nimport { resolveWikiGraphRuntimePath } from \"./runtime-path.js\";\nimport { assertStandaloneWikiGraphArchivePath } from \"./archive/target.js\";\n\nexport type WikiGraphMaintenanceTarget =\n | { readonly kind: \"archive\"; readonly path: string }\n | { readonly kind: \"home\" }\n | { readonly kind: \"library\"; readonly uri: string };\n\nexport interface WikiGraphLegacyMigrationResult {\n readonly inputPath: string;\n readonly outputPath: string;\n}\n\nexport class WikiGraphMaintenanceManager {\n readonly #runtime: WikiGraphJobRuntime;\n\n public constructor(runtime: WikiGraphJobRuntime) {\n this.#runtime = runtime;\n }\n\n public async upgrade(\n target: WikiGraphMaintenanceTarget,\n ): Promise<WikiGraphMaintenanceUpgradeResult> {\n return await this.#runtime.run(\n async () => {\n if (target.kind === \"home\") {\n return await upgradeWikiGraphMaintenanceTarget({ kind: \"home\" });\n }\n if (target.kind === \"library\") {\n const parsed = parseWikiGraphLibraryUri(target.uri);\n if (parsed === undefined || parsed.kind === \"archive\") {\n throw new Error(\n `Invalid Wiki Graph library upgrade target: ${target.uri}`,\n );\n }\n return await upgradeWikiGraphMaintenanceTarget({\n kind: \"library\",\n target: parsed,\n });\n }\n const path = await assertStandaloneWikiGraphArchivePath(target.path);\n return await upgradeWikiGraphMaintenanceTarget({\n file: new NodeFile(path),\n kind: \"archive\",\n });\n },\n undefined,\n { skipHomeBootstrap: target.kind === \"home\" },\n );\n }\n\n public async migrateLegacy(\n inputPath: string,\n outputPath = defaultWikgOutputPath(inputPath),\n ): Promise<WikiGraphLegacyMigrationResult> {\n return await this.#runtime.run(async () => {\n const resolvedInputPath = resolveWikiGraphRuntimePath(inputPath);\n const resolvedOutputPath = resolveWikiGraphRuntimePath(outputPath);\n await migrateLegacySdpubToWikg(\n new NodeFile(resolvedInputPath),\n new NodeFile(resolvedOutputPath, basename(resolvedOutputPath)),\n );\n return {\n inputPath: resolvedInputPath,\n outputPath: resolvedOutputPath,\n };\n });\n }\n}\n\nfunction defaultWikgOutputPath(inputPath: string): string {\n return inputPath.toLowerCase().endsWith(\".sdpub\")\n ? `${inputPath.slice(0, -\".sdpub\".length)}.wikg`\n : `${inputPath}.wikg`;\n}\n","import { ensureWikiGraphHomeSchemaCurrent } from \"wiki-graph-core\";\n\nimport { WikiGraphArchiveManager } from \"./archive/index.js\";\nimport { WikiGraphConversionManager } from \"./conversions.js\";\nimport { WikiGraphConfigManager } from \"./config.js\";\nimport { WikiGraphContinuationManager } from \"./continuations.js\";\nimport { WikiGraphJobManager, type WikiGraphJobRuntime } from \"./jobs.js\";\nimport { WikiGraphLibraryManager } from \"./libraries.js\";\nimport { WikiGraphMaintenanceManager } from \"./maintenance.js\";\nimport {\n assertWikiGraphSDKHostOptions,\n prepareWikiGraphSDKHost,\n withWikiGraphSDKHost,\n type WikiGraphSDKHost,\n} from \"./host.js\";\nimport {\n withWikiGraphSDKRuntimeContext,\n type WikiGraphSDKEnvPolicy,\n type WikiGraphSDKRuntimeContext,\n} from \"./runtime-context.js\";\nimport type { WikiGraphSDKProviders } from \"./providers.js\";\n\nexport interface WikiGraphSDKOptions {\n readonly cwd?: string;\n readonly env?: NodeJS.ProcessEnv;\n readonly envPolicy?: WikiGraphSDKEnvPolicy;\n readonly host?: WikiGraphSDKHost;\n readonly providers?: WikiGraphSDKProviders;\n readonly stateDir?: string;\n}\n\nexport class WikiGraphSDK implements WikiGraphJobRuntime {\n readonly #context: WikiGraphSDKRuntimeContext;\n #homeReady: Promise<void> | undefined;\n public readonly archives: WikiGraphArchiveManager;\n public readonly conversions: WikiGraphConversionManager;\n public readonly config: WikiGraphConfigManager;\n public readonly continuations: WikiGraphContinuationManager;\n public readonly jobs: WikiGraphJobManager;\n public readonly libraries: WikiGraphLibraryManager;\n public readonly maintenance: WikiGraphMaintenanceManager;\n\n public constructor(options: WikiGraphSDKOptions = {}) {\n assertWikiGraphSDKHostOptions(options);\n prepareWikiGraphSDKHost(options.host);\n this.#context = {\n cwd: options.cwd ?? process.cwd(),\n env: { ...process.env, ...options.env },\n envPolicy: options.envPolicy ?? \"production\",\n ...(options.host === undefined ? {} : { host: options.host }),\n providers: { ...options.providers },\n ...(options.stateDir === undefined ? {} : { stateDir: options.stateDir }),\n };\n this.archives = new WikiGraphArchiveManager(this);\n this.conversions = new WikiGraphConversionManager(this);\n this.config = new WikiGraphConfigManager(this);\n this.continuations = new WikiGraphContinuationManager(this);\n this.jobs = new WikiGraphJobManager(this);\n this.libraries = new WikiGraphLibraryManager(this);\n this.maintenance = new WikiGraphMaintenanceManager(this);\n }\n\n public async run<T>(\n operation: () => Promise<T> | T,\n signal?: AbortSignal,\n options: { readonly skipHomeBootstrap?: boolean } = {},\n ): Promise<T> {\n throwIfAborted(signal);\n const runWithContext = async (): Promise<T> =>\n await withWikiGraphSDKRuntimeContext(this.#context, async () => {\n if (options.skipHomeBootstrap !== true) {\n this.#homeReady ??= ensureWikiGraphHomeSchemaCurrent().catch(\n (error: unknown) => {\n this.#homeReady = undefined;\n throw error;\n },\n );\n await this.#homeReady;\n }\n return await operation();\n });\n const result = await withWikiGraphSDKHost(\n {\n ...(this.#context.host === undefined\n ? {}\n : { host: this.#context.host }),\n ...(this.#context.stateDir === undefined\n ? {}\n : { stateDir: this.#context.stateDir }),\n },\n runWithContext,\n );\n throwIfAborted(signal);\n return result;\n }\n\n public close(): void {\n this.jobs.close();\n }\n}\n\nfunction throwIfAborted(signal: AbortSignal | undefined): void {\n if (signal?.aborted !== true) return;\n throw signal.reason instanceof Error\n ? signal.reason\n : new Error(\"The Wiki Graph SDK operation was aborted.\");\n}\n\nexport function createWikiGraphSDK(\n options: WikiGraphSDKOptions = {},\n): WikiGraphSDK {\n return new WikiGraphSDK(options);\n}\n","export * from \"./archive/index.js\";\nexport * from \"./config.js\";\nexport * from \"./continuations.js\";\nexport * from \"./conversions.js\";\nexport * from \"./default-worker.js\";\nexport * from \"./entry-context.js\";\nexport * from \"./embedding.js\";\nexport * from \"./jobs.js\";\nexport type { WikiGraphSDKHost } from \"./host.js\";\nexport * from \"./libraries.js\";\nexport * from \"./local-config.js\";\nexport * from \"./pages.js\";\nexport * from \"./result-pages.js\";\nexport * from \"./llm.js\";\nexport * from \"./maintenance.js\";\nexport * from \"./node-platform.js\";\nexport * from \"./planning.js\";\nexport * from \"./providers.js\";\nexport * from \"./runtime-context.js\";\nexport * from \"./runtime-config.js\";\nexport * from \"./sdk.js\";\nexport * from \"./stage.js\";\nexport * from \"./wikispine.js\";\n// Curated Core surface used by the Node delivery API. Keep this list explicit:\n// the SDK is not a second wildcard entry point for wiki-graph-core.\nexport {\n LLMPaymentRequiredError,\n WIKI_GRAPH_URI_PREFIX,\n WikiGraphError,\n formatError,\n formatLocatedChapterResourceUri,\n formatLocatedChapterSourceCollectionUri,\n formatLocatedChapterUri,\n formatLocatedWikiGraphUri,\n formatSourceArtifactUri,\n formatSourceLocatorFragment,\n formatWikiGraphCommandUri,\n formatWikiGraphLibraryUri,\n isWikiGraphJobUri,\n isWikiGraphUri,\n isSourceLocatorScopeUri,\n isWikiGraphLibraryUri,\n parseChapterPath,\n parseChapterTreeInput,\n parseChapterUriPath,\n parseLocatedWikiGraphUri,\n parseSourceTextJsonl,\n parseSourceLocatorFragment,\n parseWikiGraphLibraryUri,\n parseWikiGraphUriSyntax,\n requireArchiveUri,\n requireLocatedObjectOrArchiveUri,\n requireLocatedObjectUri,\n} from \"wiki-graph-core\";\nexport type {\n ArchiveBacklinkBucket,\n ArchiveBacklinks,\n ArchiveCollectionOptions,\n ArchiveCollectionResult,\n ArchiveEvidence,\n ArchiveEvidenceItem,\n ArchiveFindEvidencePreview,\n ArchiveFindHit,\n ArchiveFindOptions,\n ArchiveFindResult,\n ArchiveListItem,\n ArchivePack,\n ArchivePage,\n ArchiveRelatedResult,\n ArchiveSourceLocator,\n ArchiveSourceLocatorResult,\n ArchiveTriplePattern,\n BookMeta,\n SourceArtifactInput,\n BuildJobEvent,\n BuildJobProgressCounter,\n BuildJobTarget,\n ChapterDetails,\n ChapterEntry,\n ChapterStage,\n ChapterTree,\n ChapterTreeApplyResult,\n ContinuationCursor,\n IndexArtifactKind,\n LocatedWikiGraphUri,\n ParsedWikiGraphLibraryUri,\n ParsedWikiGraphUri,\n QueryIndexScope,\n SearchIndexEmbeddingProvider,\n SearchIndexQueryMode,\n ParsedSourceLocatorFragment,\n Directory,\n File,\n FileReader,\n FileWriter,\n ReadonlyFile,\n WikiGraphPlatform,\n WikiGraphStorage,\n WikiGraphLLMOptions,\n WikiGraphLibraryIndexState,\n WikiGraphMaintenanceUpgradeResult,\n WikiGraphProgressCallback,\n WikiGraphProgressEvent,\n WikispineProvider,\n} from \"wiki-graph-core\";\n"],"mappings":";;;;;AAAA,SAAS,cAAAA,mBAAkB;AAC3B,SAAS,MAAM,SAAS,UAAAC,SAAQ,MAAAC,KAAI,QAAAC,aAAY;AAChD,SAAS,cAAc;AACvB,SAAS,YAAAC,WAAU,WAAAC,UAAS,QAAAC,aAAY;AACxC,SAAS,YAAAC,iBAAgB;AAEzB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,6BAAAC;AAAA,EACA,+BAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,gBAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,4BAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAAC;AAAA,EACA,wBAAAC;AAAA,EACA;AAAA,EACA;AAAA,EAeA;AAAA,OAQK;;;ACjEP,SAAS,kBAAkB;AAC3B,SAAS,wBAAwB;AACjC,SAAS,MAAAC,WAAU;AACnB,SAAS,YAAAC,iBAAgB;AAEzB;AAAA,EACE;AAAA,OAKK;;;ACTP,SAAS,uBAAuB;AAChC,SAAS,gCAAgC;AACzC,SAAS,oBAAoB;AAC7B,SAAS,8BAA8B;AAOhC,SAAS,yBACd,QACqB;AACrB,QAAM,MAAM,OAAO;AAEnB,MAAI,KAAK,aAAa,UAAa,IAAI,UAAU,QAAW;AAC1D,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,OAAO,oBAAoB,IAAI,UAAU,IAAI,OAAO;AAAA,MAClD,QAAQ,IAAI;AAAA,MACZ,SAAS,IAAI;AAAA,MACb,MAAM,IAAI;AAAA,IACZ,CAAC;AAAA,IACD,GAAI,OAAO,YAAY,YAAY,SAC/B,CAAC,IACD,EAAE,YAAY,OAAO,WAAW,QAAQ;AAAA,EAC9C;AACF;AAEA,SAAS,oBACP,UACA,OACA,SAKA;AACA,UAAQ,UAAU;AAAA,IAChB,KAAK,aAAa;AAChB,YAAM,YAAY,gBAAgB;AAAA,QAChC,GAAI,QAAQ,WAAW,SAAY,CAAC,IAAI,EAAE,QAAQ,QAAQ,OAAO;AAAA,QACjE,GAAI,QAAQ,SAAS,SAAY,CAAC,IAAI,EAAE,MAAM,QAAQ,KAAK;AAAA,MAC7D,CAAC;AAED,aAAO,UAAU,KAAK;AAAA,IACxB;AAAA,IACA,KAAK,UAAU;AACb,YAAM,SAAS,yBAAyB;AAAA,QACtC,GAAI,QAAQ,WAAW,SAAY,CAAC,IAAI,EAAE,QAAQ,QAAQ,OAAO;AAAA,QACjE,GAAI,QAAQ,SAAS,SAAY,CAAC,IAAI,EAAE,MAAM,QAAQ,KAAK;AAAA,MAC7D,CAAC;AAED,aAAO,OAAO,KAAK;AAAA,IACrB;AAAA,IACA,KAAK,UAAU;AACb,UAAI,QAAQ,YAAY,QAAW;AACjC,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAEA,YAAM,SAAS,aAAa;AAAA,QAC1B,GAAI,QAAQ,WAAW,SAAY,CAAC,IAAI,EAAE,QAAQ,QAAQ,OAAO;AAAA,QACjE,GAAI,QAAQ,SAAS,SAAY,CAAC,IAAI,EAAE,MAAM,QAAQ,KAAK;AAAA,MAC7D,CAAC;AAED,aAAO,OAAO,KAAK;AAAA,IACrB;AAAA,IACA,KAAK,qBAAqB;AACxB,UAAI,QAAQ,YAAY,QAAW;AACjC,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAEA,YAAM,mBAAmB,uBAAuB;AAAA,QAC9C,SAAS,QAAQ;AAAA,QACjB,MAAM,QAAQ,QAAQ,2BAA2B,QAAQ,OAAO;AAAA,QAChE,GAAI,QAAQ,WAAW,SAAY,CAAC,IAAI,EAAE,QAAQ,QAAQ,OAAO;AAAA,MACnE,CAAC;AAED,aAAO,iBAAiB,KAAK;AAAA,IAC/B;AAAA,EACF;AACF;AAEA,SAAS,2BAA2B,SAAyB;AAC3D,MAAI;AACF,WAAO,IAAI,IAAI,OAAO,EAAE;AAAA,EAC1B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;AClGA,YAAY,gBAAgB;AAC5B,YAAY,YAAY;AACxB,YAAY,QAAQ;AACpB,YAAY,gBAAgB;AAC5B,YAAY,QAAQ;AACpB,YAAY,gBAAgB;AAC5B,YAAYC,cAAa;AACzB,SAAS,UAAU,gBAAgB;AACnC,SAAS,gBAAgB;AACzB,YAAY,aAAa;AACzB,YAAY,WAAW;AACvB,YAAY,UAAU;AACtB,SAAS,aAAa,cAAiC;AAOvD;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAeA;AAAA,OACK;AA1BP,IAAM,cACiD,oBAAWA;AAClE,IAAM,cACiD,mBAAW;AA0BlE,IAAM,qBAAqB,uBAAO,IAAI,iCAAiC;AAGhE,IAAM,WAAN,MAA+B;AAAA,EAM7B,YACW,MAChB,OAAkB,oBAAS,IAAI,GAC/B;AAFgB;AAGhB,SAAK,WAAW,2BAA2B,QAAQ,IAAI;AACvD,SAAK,OAAO;AAAA,EACd;AAAA,EALkB;AAAA,EANF,OAAO;AAAA,EACvB,CAAiB,kBAAkB,IAAI;AAAA,EACvB;AAAA,EACA;AAAA,EAUhB,MAAa,aAAkC;AAC7C,UAAM,SAAS,MAAiB,gBAAK,KAAK,MAAM,GAAG;AACnD,QAAI,SAAS;AACb,QAAI;AACF,YAAM,QAAQ,MAAM,OAAO,KAAK;AAChC,UAAI,CAAC,MAAM,OAAO;AAChB,cAAM,IAAI,MAAM,qCAAqC;AACvD,YAAM,EAAE,KAAK,IAAI;AACjB,aAAO;AAAA,QACL;AAAA,QACA,OAAO,YAAY;AACjB,cAAI,CAAC,OAAQ,OAAM,OAAO,MAAM;AAChC,mBAAS;AAAA,QACX;AAAA,QACA,MAAM,OAAO,QAAQ,WAAW;AAC9B,cAAI,OAAQ,OAAM,IAAI,MAAM,sCAAsC;AAClE,0BAAgB,QAAQ,QAAQ,IAAI;AACpC,gBAAM,SAAS,OAAO,YAAY,MAAM;AACxC,cAAI,YAAY;AAChB,iBAAO,YAAY,QAAQ;AACzB,kBAAM,SAAS,MAAM,OAAO;AAAA,cAC1B;AAAA,cACA;AAAA,cACA,SAAS;AAAA,cACT,SAAS;AAAA,YACX;AACA,gBAAI,OAAO,cAAc,GAAG;AAC1B,oBAAM,IAAI,MAAM,2CAA2C;AAAA,YAC7D;AACA,yBAAa,OAAO;AAAA,UACtB;AACA,iBAAO,IAAI,WAAW,OAAO,QAAQ,OAAO,YAAY,SAAS;AAAA,QACnE;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,YAAM,OAAO,MAAM;AACnB,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAa,kBAA+C;AAC1D,QAAI;AACF,cAAQ,MAAiB,gBAAK,KAAK,IAAI,GAAG;AAAA,IAC5C,SAAS,OAAO;AACd,UACE,OAAO,UAAU,YACjB,UAAU,QACV,UAAU,SACV,MAAM,SAAS,UACf;AACA,eAAO;AAAA,MACT;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAa,aAAkC;AAC7C,UAAiB,iBAAiB,mBAAQ,KAAK,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AACzE,UAAM,YAAY,GAAG,KAAK,IAAI,QAAe,kBAAW,CAAC;AACzD,UAAM,SAAS,MAAiB,gBAAK,WAAW,IAAI;AACpD,QAAI,SAAS;AACb,WAAO;AAAA,MACL,OAAO,OAAO,SAAS;AACrB,YAAI,OAAQ,OAAM,IAAI,MAAM,qCAAqC;AACjE,cAAM,oBAAoB,QAAQ,IAAI;AAAA,MACxC;AAAA,MACA,SAAS,OAAO,QAAQ,SAAS;AAC/B,YAAI,OAAQ,OAAM,IAAI,MAAM,qCAAqC;AACjE,yBAAiB,MAAM;AACvB,cAAM,oBAAoB,QAAQ,MAAM,MAAM;AAAA,MAChD;AAAA,MACA,QAAQ,YAAY;AAClB,YAAI,CAAC,QAAQ;AACX,gBAAM,OAAO,MAAM;AACnB,gBAAiB,kBAAO,WAAW,KAAK,IAAI;AAAA,QAC9C;AACA,iBAAS;AAAA,MACX;AAAA,MACA,OAAO,YAAY;AACjB,YAAI,CAAC,QAAQ;AACX,gBAAM,OAAO,MAAM;AACnB,gBAAiB,cAAG,WAAW,EAAE,OAAO,KAAK,CAAC;AAAA,QAChD;AACA,iBAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AACF;AAGA,eAAsB,oBACpB,QACA,MACA,UACe;AACf,QAAM,SAAS,OAAO,KAAK,IAAI;AAC/B,MAAI,UAAU;AACd,SAAO,UAAU,OAAO,YAAY;AAClC,UAAM,SAAS,MAAM,OAAO;AAAA,MAC1B;AAAA,MACA;AAAA,MACA,OAAO,aAAa;AAAA,MACpB,aAAa,SAAY,OAAO,WAAW;AAAA,IAC7C;AACA,QAAI,OAAO,iBAAiB,GAAG;AAC7B,YAAM,IAAI,MAAM,8BAA8B;AAAA,IAChD;AACA,eAAW,OAAO;AAAA,EACpB;AACF;AAEA,SAAS,gBAAgB,QAAgB,QAAgB,MAAoB;AAC3E,mBAAiB,MAAM;AACvB,MAAI,CAAC,OAAO,cAAc,MAAM,KAAK,SAAS,GAAG;AAC/C,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,MAAI,SAAS,QAAQ,SAAS,OAAO,QAAQ;AAC3C,UAAM,IAAI,WAAW,uCAAuC;AAAA,EAC9D;AACF;AAEA,SAAS,iBAAiB,QAAsB;AAC9C,MAAI,CAAC,OAAO,cAAc,MAAM,KAAK,SAAS,GAAG;AAC/C,UAAM,IAAI,WAAW,iDAAiD;AAAA,EACxE;AACF;AAEO,IAAM,gBAAN,MAAM,eAAmC;AAAA,EAMvC,YAA4B,MAAc;AAAd;AACjC,SAAK,WAAW,2BAA2B,aAAa,IAAI;AAC5D,SAAK,OAAkB,oBAAS,IAAI;AAAA,EACtC;AAAA,EAHmC;AAAA,EALnB,OAAO;AAAA,EACvB,CAAiB,kBAAkB,IAAI;AAAA,EACvB;AAAA,EACA;AAAA,EAOhB,MAAa,QAAQ,MAAyC;AAC5D,oBAAgB,IAAI;AACpB,UAAM,OAAO,IAAI,SAAoB,gBAAK,KAAK,MAAM,IAAI,CAAC;AAC1D,QAAI;AACF,cAAQ,MAAiB,gBAAK,KAAK,IAAI,GAAG,OAAO,IAAI,OAAO;AAAA,IAC9D,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAa,kBAA+C;AAC1D,QAAI;AACF,cAAQ,MAAiB,gBAAK,KAAK,IAAI,GAAG;AAAA,IAC5C,SAAS,OAAO;AACd,UACE,OAAO,UAAU,YACjB,UAAU,QACV,UAAU,SACV,MAAM,SAAS,UACf;AACA,eAAO;AAAA,MACT;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAa,aAAa,MAA8C;AACtE,oBAAgB,IAAI;AACpB,UAAM,YAAY,IAAI,eAAyB,gBAAK,KAAK,MAAM,IAAI,CAAC;AACpE,QAAI;AACF,cAAQ,MAAiB,gBAAK,UAAU,IAAI,GAAG,YAAY,IACvD,YACA;AAAA,IACN,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAa,OAAiD;AAC5D,UAAM,UAAU,MAAiB,mBAAQ,KAAK,MAAM;AAAA,MAClD,eAAe;AAAA,IACjB,CAAC;AACD,WAAO,QAAQ;AAAA,MAAI,CAAC,UAClB,MAAM,YAAY,IACd,IAAI,eAAyB,gBAAK,KAAK,MAAM,MAAM,IAAI,CAAC,IACxD,IAAI,SAAoB,gBAAK,KAAK,MAAM,MAAM,IAAI,GAAG,MAAM,IAAI;AAAA,IACrE;AAAA,EACF;AAAA,EAEA,MAAa,WAAW,MAA6B;AACnD,oBAAgB,IAAI;AACpB,UAAiB,iBAAM,KAAK,MAAM,EAAE,WAAW,KAAK,CAAC;AACrD,UAAM,OAAO,IAAI,SAAoB,gBAAK,KAAK,MAAM,IAAI,CAAC;AAC1D,UAAiB,qBAAU,KAAK,MAAM,IAAI,EAAE,MAAM,KAAK,CAAC;AACxD,WAAO;AAAA,EACT;AAAA,EAEA,MAAa,gBAAgB,MAAkC;AAC7D,oBAAgB,IAAI;AACpB,UAAiB,iBAAM,KAAK,MAAM,EAAE,WAAW,KAAK,CAAC;AACrD,UAAM,YAAY,IAAI,eAAyB,gBAAK,KAAK,MAAM,IAAI,CAAC;AACpE,UAAiB,iBAAM,UAAU,IAAI;AACrC,WAAO;AAAA,EACT;AAAA,EAEA,MAAa,OACX,MACA,SACe;AACf,oBAAgB,IAAI;AACpB,UAAiB,cAAc,gBAAK,KAAK,MAAM,IAAI,GAAG;AAAA,MACpD,OAAO;AAAA,MACP,WAAW,SAAS,cAAc;AAAA,IACpC,CAAC;AAAA,EACH;AACF;AAEA,SAAS,2BACP,MACA,MACQ;AACR,SAAO,QAAQ,IAAI,IAAI,OAAO,KAAgB,mBAAQ,IAAI,GAAG,MAAM,EAAE,SAAS,WAAW,CAAC;AAC5F;AAEA,SAAS,2BACP,UACA,MACoB;AACpB,QAAM,SAAS,QAAQ,IAAI;AAC3B,MAAI,CAAC,SAAS,WAAW,MAAM,GAAG;AAEhC,WAAkB,sBAAW,QAAQ,IAAI,WAAW;AAAA,EACtD;AACA,MAAI;AACF,WAAO,OAAO,KAAK,SAAS,MAAM,OAAO,MAAM,GAAG,WAAW,EAAE;AAAA,MAC7D;AAAA,IACF;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,oBAAoB,UAAoC;AACtE,QAAM,cAAc,2BAA2B,UAAU,SAAS,IAAI;AACtE,MAAI,gBAAgB,OAAW,QAAO;AACtC,MACE,OAAO,aAAa,YACpB,aAAa,QACb,UAAU,YACV,OAAO,SAAS,SAAS,UACzB;AACA,WAAO,SAAS;AAAA,EAClB;AACA,QAAM,IAAI,UAAU,4CAA4C;AAClE;AAEA,SAAS,gBAAgB,MAAoB;AAC3C,MACE,KAAK,WAAW,KAChB,SAAS,OACT,SAAS,QACE,sBAAW,IAAI,KAC1B,KAAK,SAAS,GAAG,KACjB,KAAK,SAAS,IAAI,GAClB;AACA,UAAM,IAAI,UAAU,4CAA4C,IAAI,EAAE;AAAA,EACxE;AACF;AAEA,IAAM,yBAAN,MAA+D;AAAA,EACtD,YAA6B,UAA4B;AAA5B;AAAA,EAA6B;AAAA,EAA7B;AAAA,EAEpC,MAAa,QAAuB;AAClC,UAAM,IAAI,QAAc,CAACC,UAAS,WAAW;AAC3C,WAAK,SAAS,MAAM,CAAC,UAAU;AAC7B,YAAI,MAAO,QAAO,KAAK;AAAA,YAClB,CAAAA,SAAQ;AAAA,MACf,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA,EAEA,MAAa,QAAQ,KAA4B;AAC/C,UAAM,IAAI,QAAc,CAACA,UAAS,WAAW;AAC3C,WAAK,SAAS,KAAK,KAAK,CAAC,UAAU;AACjC,YAAI,MAAO,QAAO,KAAK;AAAA,YAClB,CAAAA,SAAQ;AAAA,MACf,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA,EAEA,MAAa,SACX,KACA,SAAuC,CAAC,GACH;AACrC,WAAO,MAAM,IAAI,QAAQ,CAACA,UAAS,WAAW;AAC5C,WAAK,SAAS,IAAI,KAAK,CAAC,GAAG,MAAM,GAAG,CAAC,OAAO,SAA4B;AACtE,YAAI,MAAO,QAAO,KAAK;AAAA,YAClB,CAAAA,SAAQ,IAAI;AAAA,MACnB,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA,EAEA,MAAa,SACX,KACA,SAAuC,CAAC,GACF;AACtC,WAAO,MAAM,IAAI,QAAQ,CAACA,UAAS,WAAW;AAC5C,WAAK,SAAS,IAAI,KAAK,CAAC,GAAG,MAAM,GAAG,CAAC,OAAO,QAAyB;AACnE,YAAI,MAAO,QAAO,KAAK;AAAA,YAClB,CAAAA,SAAQ,GAAG;AAAA,MAClB,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA,EAEA,MAAa,IACX,KACA,SAAuC,CAAC,GACzB;AACf,UAAM,IAAI,QAAc,CAACA,UAAS,WAAW;AAC3C,WAAK,SAAS,IAAI,KAAK,CAAC,GAAG,MAAM,GAAG,CAAC,UAAU;AAC7C,YAAI,MAAO,QAAO,KAAK;AAAA,YAClB,CAAAA,SAAQ;AAAA,MACf,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AACF;AAEA,eAAe,iBACb,MACA,SACiC;AACjC,QAAM,SACH,QAAQ,SAAS,aACd,YAAY,gBACZ,YAAY,kBACX,QAAQ,SAAS,YAAY,cAAc,MAChD,YAAY;AACd,SAAO,IAAI,uBAAuB,MAAM,uBAAuB,MAAM,KAAK,CAAC;AAC7E;AAEA,eAAe,uBACb,MACA,OAC2B;AAC3B,QAAM,OAAO,2BAA2B,MAAM,MAAM;AACpD,MAAI,SAAS,QAAW;AACtB,UAAM,IAAI,UAAU,+CAA+C;AAAA,EACrE;AACA,SAAO,MAAM,IAAI,QAAQ,CAACA,UAAS,WAAW;AAC5C,UAAM,WAAW,IAAI,YAAY,SAAS,MAAM,OAAO,CAAC,UAAU;AAChE,UAAI,MAAO,QAAO,KAAK;AAAA,UAClB,CAAAA,SAAQ,QAAQ;AAAA,IACvB,CAAC;AAAA,EACH,CAAC;AACH;AAEA,eAAe,YAAY,MAA4C;AACrE,QAAM,OAAO,2BAA2B,MAAM,MAAM;AACpD,MAAI,SAAS,QAAW;AACtB,UAAM,IAAI,UAAU,0CAA0C;AAAA,EAChE;AACA,QAAM,UAAU,MAAM,IAAI,QAAuB,CAACA,UAAS,WAAW;AACpE,IAAM;AAAA,MACJ;AAAA,MACA,EAAE,WAAW,OAAO,aAAa,KAAK;AAAA,MACtC,CAAC,OAAO,WAAW;AACjB,YAAI,SAAS,WAAW;AACtB,iBAAO,SAAS,IAAI,MAAM,iBAAiB,CAAC;AAAA,YACzC,CAAAA,SAAQ,MAAM;AAAA,MACrB;AAAA,IACF;AAAA,EACF,CAAC;AAED,QAAM,UAAU,MAAM,IAAI;AAAA,IACxB,CAACA,UAAS,WAAW;AACnB,YAAM,aAAa,oBAAI,IAAyB;AAChD,YAAM,iBAAiB,CAAC,UAAmB;AACzC,gBAAQ,MAAM;AACd;AAAA,UACE,iBAAiB,QACb,QACA,IAAI,MAAM,mCAAmC;AAAA,QACnD;AAAA,MACF;AACA,YAAM,iBAAiB,MAAM;AAC3B,gBAAQ,IAAI,SAAS,cAAc;AACnC,QAAAA,SAAQ,UAAU;AAAA,MACpB;AACA,cAAQ,GAAG,SAAS,CAAC,UAAuB;AAC1C,YAAI,CAAC,MAAM,SAAS,SAAS,GAAG,GAAG;AACjC,qBAAW,IAAI,MAAM,UAAU,KAAK;AAAA,QACtC;AACA,gBAAQ,UAAU;AAAA,MACpB,CAAC;AACD,cAAQ,KAAK,SAAS,cAAc;AACpC,cAAQ,KAAK,OAAO,cAAc;AAClC,cAAQ,UAAU;AAAA,IACpB;AAAA,EACF;AAEA,MAAI,SAAS;AACb,SAAO;AAAA,IACL,OAAO,MAAM;AACX,UAAI,CAAC,OAAQ,SAAQ,MAAM;AAC3B,eAAS;AACT,aAAO,QAAQ,QAAQ;AAAA,IACzB;AAAA,IACA,WAAW,OAAO,MAAM,WAAW;AACjC,UAAI,OAAQ,OAAM,IAAI,MAAM,kCAAkC;AAC9D,YAAM,QAAQ,QAAQ,IAAI,IAAI;AAC9B,UAAI,UAAU,OAAW,QAAO;AAChC,YAAM,iBAAiB,SAAS,OAAO,MAAM;AAC7C,aAAO;AAAA,IACT;AAAA,IACA,cAAc,CAAC,SAAS;AACtB,UAAI,OAAQ,OAAM,IAAI,MAAM,kCAAkC;AAC9D,aAAO,QAAQ,QAAQ,QAAQ,IAAI,IAAI,GAAG,gBAAgB;AAAA,IAC5D;AAAA,IACA,aAAa,MAAM,QAAQ,QAAQ,CAAC,GAAG,QAAQ,KAAK,CAAC,CAAC;AAAA,IACtD,gBAAgB,OAAO,MAAM,QAAQ,WAAW;AAC9C,UAAI,OAAQ,OAAM,IAAI,MAAM,kCAAkC;AAC9D,YAAM,QAAQ,QAAQ,IAAI,IAAI;AAC9B,UAAI,UAAU,OAAW,QAAO;AAChC,aAAO,MAAM,sBAAsB,SAAS,OAAO,QAAQ,MAAM;AAAA,IACnE;AAAA,IACA,WAAW,OAAO,SAAS;AACzB,UAAI,OAAQ,OAAM,IAAI,MAAM,kCAAkC;AAC9D,YAAM,QAAQ,QAAQ,IAAI,IAAI;AAC9B,UAAI,UAAU,OAAW,QAAO;AAChC,aAAO,MAAM,iBAAiB,SAAS,KAAK;AAAA,IAC9C;AAAA,EACF;AACF;AAEA,eAAe,iBACb,SACA,OACA,QACe;AACf,QAAM,SAAS,MAAM,OAAO,WAAW;AACvC,MAAI;AACF,UAAM,SAAS,MAAM,uBAAuB,SAAS,KAAK;AAC1D,UAAM,gBAAgB,QAAQ,MAAM;AACpC,UAAM,OAAO,OAAO;AAAA,EACtB,SAAS,OAAO;AACd,UAAM,OAAO,MAAM,EAAE,MAAM,MAAM,MAAS;AAC1C,UAAM;AAAA,EACR;AACF;AAEA,eAAe,iBACb,SACA,OACqB;AACrB,SAAO,MAAM,kBAAkB,MAAM,uBAAuB,SAAS,KAAK,CAAC;AAC7E;AAEA,eAAe,sBACb,SACA,OACA,QACA,QACqB;AACrB,kBAAgB,QAAQ,QAAQ,MAAM,gBAAgB;AACtD,MAAI,WAAW,EAAG,QAAO,IAAI,WAAW;AACxC,MAAI,MAAM,sBAAsB,GAAG;AACjC,UAAMC,WAAU,MAAM;AAAA,MACpB,MAAM,uBAAuB,SAAS,KAAK;AAAA,MAC3C;AAAA,MACA;AAAA,IACF;AACA,WAAO,IAAI;AAAA,MACTA,SAAQ;AAAA,MACRA,SAAQ;AAAA,MACRA,SAAQ;AAAA,IACV;AAAA,EACF;AACA,QAAM,UAAU,MAAM;AAAA,IACpB,MAAM,uBAAuB,SAAS,OAAO;AAAA,MAC3C,YAAY;AAAA,MACZ,SAAS;AAAA,MACT,KAAK,SAAS;AAAA,MACd,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AACA,SAAO,IAAI,WAAW,QAAQ,QAAQ,QAAQ,YAAY,QAAQ,UAAU;AAC9E;AAEA,eAAe,8BACb,OACA,QACA,QACiB;AACjB,QAAM,SAAmB,CAAC;AAC1B,QAAM,MAAM,SAAS;AACrB,MAAI,WAAW;AACf,MAAI,YAAY;AAChB,mBAAiB,SAAS,OAAO;AAC/B,UAAM,QAAQ,OAAO,SAAS,KAAK,IAAI,QAAQ,OAAO,KAAK,KAAK;AAChE,UAAM,WAAW,WAAW,MAAM;AAClC,QAAI,WAAW,UAAU,WAAW,KAAK;AACvC,YAAM,WAAW,MAAM;AAAA,QACrB,KAAK,IAAI,GAAG,SAAS,QAAQ;AAAA,QAC7B,KAAK,IAAI,MAAM,YAAY,MAAM,QAAQ;AAAA,MAC3C;AACA,aAAO,KAAK,QAAQ;AACpB,mBAAa,SAAS;AAAA,IACxB;AACA,eAAW;AACX,QAAI,YAAY,IAAK;AAAA,EACvB;AACA,MAAI,cAAc,QAAQ;AACxB,UAAM,IAAI,MAAM,gDAAgD;AAAA,EAClE;AACA,SAAO,OAAO,OAAO,QAAQ,SAAS;AACxC;AAEA,eAAe,uBACb,SACA,OACA,SACgC;AAChC,SAAO,MAAM,IAAI,QAA+B,CAACD,UAAS,WAAW;AACnE,UAAM,WAAW,CAAC,OAAqB,WAAqB;AAC1D,UAAI,SAAS,WAAW,QAAW;AACjC,eAAO,SAAS,IAAI,MAAM,0BAA0B,MAAM,QAAQ,EAAE,CAAC;AAAA,MACvE,OAAO;AACL,QAAAA,SAAQ,MAAM;AAAA,MAChB;AAAA,IACF;AACA,QAAI,YAAY,OAAW,SAAQ,eAAe,OAAO,QAAQ;AAAA,QAC5D,SAAQ,eAAe,OAAO,SAAS,QAAQ;AAAA,EACtD,CAAC;AACH;AAEA,eAAe,aACb,MACA,SACe;AACf,QAAM,UAAU,IAAS,aAAQ;AACjC,QAAM,SAAS,MAAM,KAAK,WAAW;AACrC,QAAM,eAAe,QAAQ;AAC7B,QAAM,aAAa,gBAAgB,cAAc,MAAM;AACvD,QAAM,aAAa,EAAE,WAAW,OAAO,UAAU,MAAM;AACvD,MAAI;AAKJ,MAAI;AACF,eAAW,wBAAwB,OAAO;AAC1C,UAAM,cAAc,kBAAkB,SAAS,UAAU,UAAU;AACnE,UAAM,QAAQ,KAAK,CAAC,aAAa,UAAU,CAAC;AAC5C,QAAI,CAAC,WAAW,UAAU;AACxB,YAAM,IAAI,MAAM,oDAAoD;AAAA,IACtE;AACA,YAAQ,IAAI;AACZ,UAAM;AACN,UAAM,OAAO,OAAO;AAAA,EACtB,SAAS,OAAO;AACd,eAAW,YAAY;AACvB,QAAI,CAAC,WAAW,YAAY,aAAa,QAAW;AAClD,gCAA0B,QAAQ;AAAA,IACpC;AACA,QAAI,CAAC,aAAa,WAAW;AAC3B,mBAAa;AAAA,QACX,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,0BAA0B;AAAA,MACvE;AAAA,IACF;AACA,UAAM,WAAW,MAAM,MAAM,MAAS;AACtC,UAAM,OAAO,MAAM,EAAE,MAAM,MAAM,MAAS;AAC1C,UAAM;AAAA,EACR;AACF;AAEA,eAAe,kBACb,SACA,UACA,OACe;AACf,SAAO,CAAC,MAAM,WAAW;AACvB,UAAM,SAAS,MAAM,SAAS,KAAK;AACnC,QAAI,MAAM,UAAW;AACrB,QAAI,OAAO,MAAM;AACf,YAAM,WAAW;AACjB;AAAA,IACF;AACA,QAAI,UAAU,OAAO,OAAO;AAC1B,cAAQ;AAAA,QACN,yBAAyB,OAAO,MAAM,IAAI;AAAA,QAC1C,OAAO,MAAM;AAAA,QACb,EAAE,UAAU,MAAM;AAAA,MACpB;AAAA,IACF,WAAW,UAAU,OAAO,OAAO;AACjC,cAAQ,UAAU,OAAO,KAAK,OAAO,MAAM,IAAI,GAAG,OAAO,MAAM,MAAM;AAAA,QACnE,UAAU;AAAA,MACZ,CAAC;AAAA,IACH,OAAO;AACL,cAAQ;AAAA,QACN,0BAA0B,OAAO,KAAK;AAAA,QACtC,OAAO,MAAM;AAAA,QACb,EAAE,UAAU,OAAO,MAAM,OAAO,MAAM,KAAK;AAAA,MAC7C;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,yBAAyB,MAA8B;AAC9D,SAAO,SAAS;AAAA,KACb,mBAAmB;AAClB,YAAM,SAAS,MAAM,KAAK,WAAW;AACrC,UAAI;AACF,iBAAS,SAAS,GAAG,SAAS,OAAO,QAAQ;AAC3C,gBAAM,QAAQ,MAAM,OAAO;AAAA,YACzB;AAAA,YACA,KAAK,IAAI,KAAK,MAAM,OAAO,OAAO,MAAM;AAAA,UAC1C;AACA,oBAAU,MAAM;AAChB,gBAAM;AAAA,QACR;AAAA,MACF,UAAE;AACA,cAAM,OAAO,MAAM;AAAA,MACrB;AAAA,IACF,GAAG;AAAA,EACL;AACF;AAEA,SAAS,2BACP,UACA,MACoB;AACpB,MAAI,OAAO,aAAa,YAAY,aAAa,KAAM,QAAO;AAC9D,QAAM,YAAY;AAIlB,SAAO,UAAU,kBAAkB,MAAM,QACvC,OAAO,UAAU,SAAS,WACxB,UAAU,OACV;AACN;AAEA,SAAS,0BACP,OACU;AACV,SAAO,SAAS;AAAA,KACb,mBAAmB;AAClB,eAAS,SAAS,GAAG,SAAS,MAAM,QAAQ;AAC1C,cAAM,QAAQ,MAAM,MAAM;AAAA,UACxB;AAAA,UACA,KAAK,IAAI,KAAK,MAAM,MAAM,OAAO,MAAM;AAAA,QACzC;AACA,kBAAU,MAAM;AAChB,cAAM;AAAA,MACR;AAAA,IACF,GAAG;AAAA,EACL;AACF;AAEA,SAAS,wBACP,SACgE;AAChE,QAAM,gBAAiB,QACrB,OAAO,aACT;AACA,SAAO,kBAAkB,SACpB,QAAwC,OAAO,QAAQ,EAAE,IAC1D,cAAc,KAAK,OAAO;AAChC;AAEA,SAAS,0BACP,UACM;AACN,MAAI,SAAS,WAAW,OAAW;AACnC,MAAI;AACF,SAAK,QAAQ,QAAQ,SAAS,OAAO,CAAC,EAAE,MAAM,MAAM,MAAS;AAAA,EAC/D,QAAQ;AAAA,EAER;AACF;AAEA,eAAe,gBACb,OACA,QACe;AACf,QAAM;AAAA,IACJ;AAAA,IACA,IAAI,SAAS;AAAA,MACX,OAAO,CAAC,OAAe,WAAW,aAAa;AAC7C,aAAK,OAAO,MAAM,KAAK,EAAE;AAAA,UACvB,MAAM,SAAS;AAAA,UACf,CAAC,UACC;AAAA,YACE,iBAAiB,QACb,QACA,IAAI,MAAM,2BAA2B;AAAA,UAC3C;AAAA,QACJ;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAEA,eAAe,kBACb,OACiB;AACjB,SAAO,MAAM,IAAI,QAAQ,CAACA,UAAS,WAAW;AAC5C,UAAM,SAAmB,CAAC;AAC1B,UAAM,GAAG,QAAQ,CAAC,UAAkB,OAAO,KAAK,KAAK,CAAC;AACtD,UAAM,KAAK,SAAS,MAAM;AAC1B,UAAM,KAAK,OAAO,MAAMA,SAAQ,OAAO,OAAO,MAAM,CAAC,CAAC;AAAA,EACxD,CAAC;AACH;AAEO,IAAM,wBAA2C;AAAA,EACtD,cAAc;AAAA,IACZ,QAAQ,MAAS,IAAe,6BAAqB;AAAA,EACvD;AAAA,EACA,UAAU,EAAE,MAAM,iBAAiB;AAAA,EACnC,WAAW;AAAA,IACT,YAAY,gBAAgB,YAAY,GAAG;AAAA,IAC3C,iBAAiB,CAAC,eAAe;AAC/B,YAAM,QAAQ,wBAAwB,KAAK,UAAU;AACrD,UAAI,UAAU,KAAM,QAAO,QAAQ,QAAQ,MAAS;AACpD,UAAI;AACF,oBAAY,KAAK,OAAO,MAAM,CAAC,CAAC,GAAG,CAAC;AACpC,eAAO,QAAQ,QAAQ,IAAI;AAAA,MAC7B,SAAS,OAAO;AACd,YACE,OAAO,UAAU,YACjB,UAAU,QACV,UAAU,SACV,MAAM,SAAS,SACf;AACA,iBAAO,QAAQ,QAAQ,KAAK;AAAA,QAC9B;AACA,eAAO,QAAQ,QAAQ,IAAI;AAAA,MAC7B;AAAA,IACF;AAAA,EACF;AAAA,EACA,WAAW;AAAA,IACT,cAAc,CAAC,aAAa;AAC1B,YAAM,OAAO,2BAA2B,UAAU,WAAW;AAC7D,aAAO,QAAQ;AAAA,QACb,SAAS,SAAY,SAAY,IAAI,cAAc,IAAI;AAAA,MACzD;AAAA,IACF;AAAA,IACA,SAAS,CAAC,aAAa;AACrB,YAAM,OAAO,2BAA2B,UAAU,MAAM;AACxD,aAAO,QAAQ;AAAA,QACb,SAAS,SAAY,SAAY,IAAI,SAAS,IAAI;AAAA,MACpD;AAAA,IACF;AAAA,IACA,wBAAwB,CAAC,cAAc;AACrC,YAAM,OAAO,2BAA2B,WAAW,WAAW;AAC9D,aAAO,QAAQ;AAAA,QACb,SAAS,SAAY,SAAY,IAAI,cAAc,IAAI;AAAA,MACzD;AAAA,IACF;AAAA,EACF;AAAA,EACA,WAAW;AAAA,IACT,mBAAmB,CAAC,YAClB,IAAI,YAAY,IAAI,mBAAmB,GAAG,OAAO;AAAA,EACrD;AAAA,EACA,KAAK;AAAA,IACH,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AACF;AAOO,SAAS,4BACd,UAAwC,CAAC,GACtB;AACnB,SAAO,QAAQ,cAAc,SACzB,wBACA,EAAE,GAAG,uBAAuB,WAAW,QAAQ,UAAU;AAC/D;AAEA,IAAM,qBAAN,cAAiC,OAAO;AAAA,EAC7B;AAAA,EAEF,YAAY,eAAwB;AACzC,UAAM;AACN,SAAK,iBAAiB;AAAA,EACxB;AAAA,EAEO,UAAU,cAAoC;AACnD,UAAM,OAAO,sBAAsB,YAAY;AAC/C,UAAM,WAAsB;AAAA,MAC1B,KAAK,kBAAkB,yBAAyB;AAAA,MAChD;AAAA,IACF;AACA,WAAO;AAAA,MACL,SAAS;AAAA,MACT,MAAM;AAAA,MACN,KAAQ,gBAAa,UAAU,MAAM;AAAA,IACvC;AAAA,EACF;AACF;AAEO,SAAS,8BACd,eACA,UAGI,CAAC,GACQ;AACb,SAAO,IAAI,YAAY,IAAI,mBAAmB,aAAa,GAAG;AAAA,IAC5D,YAAY,QAAQ,cAAc;AAAA,IAClC,YAAY,QAAQ,cAAc;AAAA,EACpC,CAAC;AACH;AAEA,SAAS,2BAAmC;AAC1C,QAAM,WAAY,WACf;AACH,MAAI,OAAO,aAAa,YAAY,aAAa,GAAI,QAAO;AAC5D,MAAI,YAAY,YAAY,IAAI;AAChC,SAAO,MAAM;AACX,eAAW,aAAa;AAAA,MACX,gBAAK,WAAW,MAAM;AAAA,MACtB,gBAAK,WAAW,YAAY,QAAQ,MAAM;AAAA,IACvD,GAAG;AACD,UAAI;AACF,YAAO,YAAS,SAAS,EAAE,YAAY,EAAG,QAAO;AAAA,MACnD,QAAQ;AAAA,MAER;AAAA,IACF;AACA,UAAM,SAAoB,mBAAQ,SAAS;AAC3C,QAAI,WAAW;AACb,YAAM,IAAI,MAAM,iCAAiC;AACnD,gBAAY;AAAA,EACd;AACF;AAOO,SAAS,2BACd,qBAAsE;AAAA,EACjE,WAAQ;AAAA,EACX;AACF,GACkB;AAClB,QAAM,cACJ,OAAO,uBAAuB,WAC1B,qBACA,mBAAmB;AACzB,QAAM,oBACJ,OAAO,uBAAuB,WACf,gBAAK,oBAAoB,WAAW,IAC/C,mBAAmB;AACzB,SAAO;AAAA,IACL,SAAS,IAAI,cAAc,WAAW;AAAA,IACtC,eAAe,IAAI,cAAc,iBAAiB;AAAA,EACpD;AACF;AAEO,SAAS,6BAA6B,WAA0B;AACrE,2BAAyB,qBAAqB;AAC9C,0BAAwB,2BAA2B,SAAS,CAAC;AAC/D;AAEO,SAAS,8BAAoC;AAClD,MAAI;AACF,yBAAqB;AAAA,EACvB,QAAQ;AACN,6BAAyB,qBAAqB;AAAA,EAChD;AACA,MAAI;AACF,wBAAoB;AAAA,EACtB,QAAQ;AACN,4BAAwB,2BAA2B,CAAC;AAAA,EACtD;AACF;AAEA,eAAsB,yBACpB,WACA,WACY;AACZ,SAAO,MAAM;AAAA,IACX,cAAc,SAAY,SAAY,2BAA2B,SAAS;AAAA,IAC1E;AAAA,EACF;AACF;;;ACz7BA,SAAS,SAAS;;;ACAlB,SAAS,+BAA+B;;;ACAxC,SAAS,qBAAAE,0BAAyB;AAiBlC,IAAM,sBAAsB,uBAAO,IAAI,mCAAmC;AAC1E,IAAM,iBAAiB,yBAAyB;AAEhD,SAAS,2BAA0E;AACjF,QAAM,gBAAgB;AACtB,QAAM,WAAW,cAAc,mBAAmB;AAClD,MAAI,aAAa,QAAW;AAC1B,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,IAAIA,mBAA8C;AAClE,SAAO,eAAe,eAAe,qBAAqB;AAAA,IACxD,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,UAAU;AAAA,EACZ,CAAC;AACD,SAAO;AACT;AAEA,eAAsB,+BACpB,SACA,WACY;AACZ,SAAO,MAAM,eAAe,IAAI,SAAS,SAAS;AACpD;AAEO,SAAS,gCAA4D;AAC1E,SACE,eAAe,SAAS,KAAK;AAAA,IAC3B,KAAK,QAAQ,IAAI;AAAA,IACjB,KAAK,QAAQ;AAAA,IACb,WAAW;AAAA,IACX,WAAW,CAAC;AAAA,EACd;AAEJ;AAEO,SAAS,0BAA8C;AAC5D,QAAM,UAAU,8BAA8B;AAC9C,SAAO,QAAQ,MAAM,YAAY,QAAQ;AAC3C;AAEO,SAAS,2BAAkD;AAChE,SAAO,8BAA8B,EAAE,aAAa,CAAC;AACvD;;;AD3DA,SAAS,SAAAC,cAAa;AACtB,SAAS,QAAAC,aAAY;AACrB,SAAS,WAAAC,gBAAe;AAGjB,IAAM,wBAAwB;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAMA,IAAM,0BAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQhC,eAAsB,uBACpB,SAC4B;AAC5B,SAAO,MAAM,wBAAwB,OAAO,aAAa;AACvD,WAAO,MAAM,iCAAiC,UAAU,OAAO;AAAA,EACjE,CAAC;AACH;AAEA,eAAsB,0BACpB,SACA,OAC4B;AAC5B,QAAM,aAAa,2BAA2B,SAAS,KAAK;AAE5D,SAAO,MAAM,wBAAwB,OAAO,aAAa;AACvD,UAAM,kCAAkC,UAAU,SAAS,UAAU;AACrE,WAAO;AAAA,EACT,CAAC;AACH;AAEA,eAAsB,oBACpB,SACA,KACA,OAC4B;AAC5B,SAAO,MAAM,wBAAwB,OAAO,aAAa;AACvD,UAAM,UAAU,MAAM,iCAAiC,UAAU,OAAO;AACxE,UAAM,OAAO,2BAA2B,SAAS;AAAA,MAC/C,GAAG;AAAA,MACH,CAAC,wBAAwB,SAAS,GAAG,CAAC,GAAG;AAAA,IAC3C,CAAC;AAED,UAAM,kCAAkC,UAAU,SAAS,IAAI;AAC/D,WAAO;AAAA,EACT,CAAC;AACH;AAEA,eAAsB,uBACpB,SACA,KAC4B;AAC5B,SAAO,MAAM,wBAAwB,OAAO,aAAa;AACvD,UAAM,UAAU,MAAM,iCAAiC,UAAU,OAAO;AACxE,UAAM,gBAAgB,wBAAwB,SAAS,GAAG;AAC1D,UAAM,EAAE,CAAC,aAAa,GAAG,UAAU,GAAG,UAAU,IAAI;AACpD,UAAM,OAAO,2BAA2B,SAAS,SAAS;AAE1D,UAAM,kCAAkC,UAAU,SAAS,IAAI;AAC/D,WAAO;AAAA,EACT,CAAC;AACH;AAEA,eAAsB,wBACpB,SAC4B;AAC5B,SAAO,MAAM,0BAA0B,SAAS,CAAC,CAAC;AACpD;AAEO,SAAS,wBACd,OACgC;AAChC,MAAI,UAAU,aAAa;AACzB,WAAO;AAAA,EACT;AAEA,SAAO,sBAAsB,KAAK,CAAC,YAAY,YAAY,KAAK;AAClE;AAEO,SAAS,uBACd,SACA,OACmB;AACnB,MACG,YAAY,SACX,YAAY,gBACZ,YAAY,eACZ,YAAY,eACb,MAAM,WAAW,UAAa,MAAM,UAAU,QAC/C;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAI,MAAM,WAAW,SAAY,CAAC,IAAI,EAAE,QAAQ,OAAO;AAAA,IACvD,GAAI,MAAM,UAAU,SAAY,CAAC,IAAI,EAAE,OAAO,OAAO;AAAA,EACvD;AACF;AAEO,SAAS,wBACd,SACA,KACQ;AACR,QAAM,aAAa,IAAI,KAAK;AAE5B,MAAI,eAAe,IAAI;AACrB,UAAM,IAAI,MAAM,6BAA6B;AAAA,EAC/C;AAEA,MAAI,YAAY,SAAS,YAAY,cAAc;AACjD,YAAQ,YAAY;AAAA,MAClB,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT;AACE,eAAO;AAAA,IACX;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,2BACd,SACA,OACmB;AACnB,UAAQ,SAAS;AAAA,IACf,KAAK;AACH,aAAO,yBAAyB,KAAK;AAAA,IACvC,KAAK;AACH,aAAO,kBAAkB,KAAK;AAAA,IAChC,KAAK;AACH,aAAO,yBAAyB,KAAK;AAAA,IACvC,KAAK;AACH,aAAO,wBAAwB,KAAK;AAAA,IACtC,KAAK;AACH,aAAO,wBAAwB,KAAK;AAAA,EACxC;AACF;AAEA,eAAe,wBACb,WACY;AACZ,QAAM,WAAW,wBAAwB,KAAKD,MAAKC,SAAQ,GAAG,YAAY;AAC1E,QAAMF,OAAM,UAAU,EAAE,WAAW,KAAK,CAAC;AACzC,QAAM,WAAW,MAAM;AAAA,IACrB,IAAI,SAASC,MAAK,UAAU,aAAa,CAAC;AAAA,IAC1C;AAAA,EACF;AAEA,MAAI;AACF,WAAO,MAAM,UAAU,QAAQ;AAAA,EACjC,UAAE;AACA,UAAM,SAAS,MAAM;AAAA,EACvB;AACF;AAEA,eAAe,iCACb,UACA,SAC4B;AAC5B,QAAM,QAAQ,MAAM,SAAS;AAAA,IAC3B;AAAA,IACA,CAAC,OAAO;AAAA,IACR,CAAC,QAAQ,OAAO,IAAI,UAAU;AAAA,EAChC;AAEA,SAAO,UAAU,SAAY,CAAC,IAAI,iBAAiB,SAAS,KAAK;AACnE;AAEA,eAAe,kCACb,UACA,SACA,OACe;AACf,QAAM,SAAS;AAAA,IACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOA,CAAC,SAAS,KAAK,UAAU,KAAK,GAAG,KAAK,IAAI,CAAC;AAAA,EAC7C;AACF;AAEA,SAAS,iBACP,SACA,OACmB;AACnB,MAAI;AAEJ,MAAI;AACF,aAAS,KAAK,MAAM,KAAK;AAAA,EAC3B,SAAS,OAAO;AACd,UAAM,IAAI;AAAA,MACR,iCAAiC,OAAO,KAAK,YAAY,KAAK,CAAC;AAAA,IACjE;AAAA,EACF;AAEA,MAAI,WAAW,QAAQ,OAAO,WAAW,YAAY,MAAM,QAAQ,MAAM,GAAG;AAC1E,UAAM,IAAI;AAAA,MACR,gCAAgC,OAAO;AAAA,IACzC;AAAA,EACF;AAEA,SAAO,2BAA2B,SAAS,MAA2B;AACxE;AAEA,SAAS,yBAAyB,OAA6C;AAC7E,QAAM,cAAc,oBAAI,IAAI;AAAA,IAC1B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACD,QAAM,mBAAmB,oBAAI,IAAI,CAAC,UAAU,mBAAmB,CAAC;AAChE,QAAM,OAAgC,CAAC;AAEvC,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAChD,QAAI,CAAC,YAAY,IAAI,GAAG,GAAG;AACzB,YAAM,IAAI,MAAM,kCAAkC,GAAG,EAAE;AAAA,IACzD;AACA,QAAI,QAAQ,cAAc;AACxB,YAAM,SACJ,OAAO,UAAU,WACb,QACA,OAAO,UAAU,WACf,OAAO,KAAK,IACZ;AAER,UAAI,CAAC,OAAO,UAAU,MAAM,KAAK,UAAU,GAAG;AAC5C,cAAM,IAAI,MAAM,mDAAmD;AAAA,MACrE;AACA,WAAK,GAAG,IAAI;AACZ;AAAA,IACF;AACA,QAAI,OAAO,UAAU,YAAY,MAAM,KAAK,MAAM,IAAI;AACpD,YAAM,IAAI,MAAM,cAAc,GAAG,8BAA8B;AAAA,IACjE;AACA,UAAM,aAAa,MAAM,KAAK;AAE9B,QAAI,QAAQ,cAAc,CAAC,iBAAiB,IAAI,UAAU,GAAG;AAC3D,YAAM,IAAI,MAAM,gCAAgC,UAAU,EAAE;AAAA,IAC9D;AAEA,SAAK,GAAG,IAAI;AAAA,EACd;AAEA,SAAO;AACT;AAEA,SAAS,kBAAkB,OAA6C;AACtE,QAAM,cAAc,oBAAI,IAAI;AAAA,IAC1B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACD,QAAM,mBAAmB,oBAAI,IAAI;AAAA,IAC/B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACD,QAAM,OAAgC,CAAC;AAEvC,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAChD,QAAI,CAAC,YAAY,IAAI,GAAG,GAAG;AACzB,YAAM,IAAI,MAAM,2BAA2B,GAAG,EAAE;AAAA,IAClD;AACA,QAAI,OAAO,UAAU,YAAY,MAAM,KAAK,MAAM,IAAI;AACpD,YAAM,IAAI,MAAM,OAAO,GAAG,8BAA8B;AAAA,IAC1D;AACA,UAAM,aAAa,MAAM,KAAK;AAE9B,QAAI,QAAQ,cAAc,CAAC,iBAAiB,IAAI,UAAU,GAAG;AAC3D,YAAM,IAAI,MAAM,yBAAyB,UAAU,EAAE;AAAA,IACvD;AAEA,SAAK,GAAG,IAAI;AAAA,EACd;AAEA,SAAO;AACT;AAEA,SAAS,yBAAyB,OAA6C;AAC7E,QAAM,cAAc,oBAAI,IAAI,CAAC,OAAO,SAAS,CAAC;AAC9C,QAAM,OAAgC,CAAC;AAEvC,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAChD,QAAI,CAAC,YAAY,IAAI,GAAG,GAAG;AACzB,YAAM,IAAI,MAAM,kCAAkC,GAAG,EAAE;AAAA,IACzD;AACA,UAAM,SACJ,OAAO,UAAU,WACb,QACA,OAAO,UAAU,WACf,OAAO,KAAK,IACZ;AAER,QAAI,CAAC,OAAO,UAAU,MAAM,KAAK,UAAU,GAAG;AAC5C,YAAM,IAAI,MAAM,cAAc,GAAG,8BAA8B;AAAA,IACjE;AACA,SAAK,GAAG,IAAI;AAAA,EACd;AAEA,SAAO;AACT;AAEA,SAAS,wBAAwB,OAA6C;AAC5E,QAAM,cAAc,oBAAI,IAAI,CAAC,YAAY,YAAY,OAAO,CAAC;AAC7D,QAAM,mBAAmB,oBAAI,IAAI,CAAC,OAAO,OAAO,CAAC;AACjD,QAAM,OAAgC,CAAC;AAEvC,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAChD,QAAI,CAAC,YAAY,IAAI,GAAG,GAAG;AACzB,YAAM,IAAI,MAAM,iCAAiC,GAAG,EAAE;AAAA,IACxD;AACA,QAAI,OAAO,UAAU,YAAY,MAAM,KAAK,MAAM,IAAI;AACpD,YAAM,IAAI,MAAM,aAAa,GAAG,8BAA8B;AAAA,IAChE;AACA,UAAM,aAAa,MAAM,KAAK;AAE9B,QAAI,QAAQ,cAAc,CAAC,iBAAiB,IAAI,UAAU,GAAG;AAC3D,YAAM,IAAI,MAAM,+BAA+B,UAAU,EAAE;AAAA,IAC7D;AAEA,SAAK,GAAG,IAAI;AAAA,EACd;AAEA,SAAO;AACT;AAEA,SAAS,wBAAwB,OAA6C;AAC5E,SAAO,uBAAuB,aAAa,KAAK;AAClD;AAEA,SAAS,uBACP,SACA,OACmB;AACnB,QAAM,cAAc,oBAAI,IAAI,CAAC,YAAY,OAAO,CAAC;AACjD,QAAM,OAAgC,CAAC;AAEvC,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAChD,QAAI,CAAC,YAAY,IAAI,GAAG,GAAG;AACzB,YAAM,IAAI,MAAM,WAAW,OAAO,gBAAgB,GAAG,EAAE;AAAA,IACzD;AACA,QAAI,OAAO,UAAU,YAAY,MAAM,KAAK,MAAM,IAAI;AACpD,YAAM,IAAI,MAAM,GAAG,OAAO,IAAI,GAAG,8BAA8B;AAAA,IACjE;AACA,SAAK,GAAG,IAAI,MAAM,KAAK;AAAA,EACzB;AAEA,SAAO;AACT;AAEA,SAAS,YAAY,OAAwB;AAC3C,SAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAC9D;;;ADzXA,IAAM,6BAA6B;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,0BAA0B,EAAE,KAAK,0BAA0B;AACjE,IAAM,wBAAwB,EAAE,OAAO;AAAA,EACrC,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EACnC,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EACpC,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EACpC,oBAAoB,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EAC/C,KAAK,EACF,OAAO;AAAA,IACN,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,IACnC,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,IACpC,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,IACpC,oBAAoB,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,IAC/C,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,IAClC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,IACjC,UAAU,wBAAwB,SAAS;AAAA,EAC7C,CAAC,EACA,SAAS;AAAA,EACZ,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EAClC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EACjC,UAAU,wBAAwB,SAAS;AAC7C,CAAC;AA4CD,eAAsB,2BAA2B,SAIb;AAClC,QAAM,CAAC,WAAW,UAAU,YAAY,WAAW,SAAS,IAC1D,MAAM,QAAQ,IAAI;AAAA,IAChB,SAAS,wBAAwB,OAC7B,QAAQ,QAAQ,CAAC,CAA4B,IAC7C,uBAAuB,YAAY;AAAA,IACvC,SAAS,kBAAkB,OACvB,QAAQ,QAAQ,CAAC,CAA4B,IAC7C,uBAAuB,KAAK;AAAA,IAChC,uBAAuB,YAAY;AAAA,IACnC,uBAAuB,WAAW;AAAA,IAClC,uBAAuB,WAAW;AAAA,EACpC,CAAC;AACH,QAAM,kBACJ,SAAS,YAAY,SACjB,SACA,qBAAqB,QAAQ,OAAO;AAC1C,QAAM,MAAM,gBAAgB;AAAA,IAC1B,QAAQ,aAAa,iBAAiB,QAAQ,WAAW,SAAS,MAAM,CAAC;AAAA,IACzE,SAAS;AAAA,MACP,iBAAiB;AAAA,MACjB,WAAW,SAAS,OAAO;AAAA,IAC7B;AAAA,IACA,OAAO,aAAa,iBAAiB,OAAO,WAAW,SAAS,KAAK,CAAC;AAAA,IACtE,MAAM,aAAa,iBAAiB,MAAM,WAAW,SAAS,IAAI,CAAC;AAAA,IACnE,UAAU;AAAA,MACR,iBAAiB;AAAA,MACjB,aAAa,SAAS,QAAQ;AAAA,IAChC;AAAA,EACF,CAAC;AACD,QAAM,oBAAoB,oBAAoB,WAAW,OAAO;AAChE,QAAM,gBAAgB,oBAAoB,WAAW,GAAG;AACxD,QAAM,YAAY,8BAA8B,EAAE;AAClD,QAAM,kBAAkB,uBAAuB,WAAW,SAAS;AACnE,QAAM,kBAAkB,sBAAsB,WAAW,SAAS;AAClE,QAAM,kBAAkB,sBAAsB,SAAS;AAEvD,SAAO;AAAA,IACL,GAAI,kBAAkB,UAAa,sBAAsB,SACrD,CAAC,IACD;AAAA,MACE,YAAY;AAAA,QACV,GAAI,kBAAkB,SAAY,CAAC,IAAI,EAAE,KAAK,cAAc;AAAA,QAC5D,GAAI,sBAAsB,SACtB,CAAC,IACD,EAAE,SAAS,kBAAkB;AAAA,MACnC;AAAA,IACF;AAAA,IACJ,GAAI,oBAAoB,SAAY,CAAC,IAAI,EAAE,WAAW,gBAAgB;AAAA,IACtE,GAAI,QAAQ,SAAY,CAAC,IAAI,EAAE,IAAI;AAAA,IACnC,GAAI,oBAAoB,SAAY,CAAC,IAAI,EAAE,WAAW,gBAAgB;AAAA,IACtE,GAAI,oBAAoB,SAAY,CAAC,IAAI,EAAE,WAAW,gBAAgB;AAAA,EACxE;AACF;AAEA,SAAS,sBACP,OACA,WACiD;AACjD,QAAM,WAAW,WAAW,OAAO,QAAQ;AAC3C,QAAM,QAAQ,WAAW,OAAO,KAAK;AAErC,MAAI,aAAa,UAAa,UAAU,OAAW,QAAO;AAC1D,MAAI,UAAU,QAAW;AACvB,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,SAAO;AAAA,IACL,UACE,YAAY,8BAA8B,gBAAgB,SAAS;AAAA,IACrE;AAAA,EACF;AACF;AAEA,SAAS,sBACP,OACiD;AACjD,QAAM,QAAQ,SAAS,CAAC;AACxB,QAAM,WAAW,sBAAsB,MAAM,QAAQ;AACrD,QAAM,SAAS,WAAW,MAAM,MAAM;AACtC,QAAM,UAAU,WAAW,MAAM,OAAO;AACxC,QAAM,aACJ,OAAO,MAAM,eAAe,YAC5B,OAAO,UAAU,MAAM,UAAU,KACjC,MAAM,aAAa,IACf,MAAM,aACN;AACN,QAAM,QAAQ,WAAW,MAAM,KAAK;AACpC,QAAM,OAAO,WAAW,MAAM,IAAI;AAElC,MACE,aAAa,UACb,UAAU,UACT,aAAa,uBAAuB,YAAY,UAChD,aAAa,YAAY,YAAY,QACtC;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,GAAI,WAAW,SAAY,CAAC,IAAI,EAAE,OAAO;AAAA,IACzC,GAAI,YAAY,SAAY,CAAC,IAAI,EAAE,QAAQ;AAAA,IAC3C,GAAI,eAAe,SAAY,CAAC,IAAI,EAAE,WAAW;AAAA,IACjD,GAAI,UAAU,SAAY,CAAC,IAAI,EAAE,MAAM;AAAA,IACvC,GAAI,SAAS,SAAY,CAAC,IAAI,EAAE,KAAK;AAAA,IACrC,GAAI,aAAa,SAAY,CAAC,IAAI,EAAE,SAAS;AAAA,EAC/C;AACF;AAEA,SAAS,qBAAqB,OAA4C;AACxE,QAAM,aAAa,gBAAgB,KAAK;AAExC,MAAI,eAAe,QAAW;AAC5B,UAAM,IAAI,MAAM,wCAAwC;AAAA,EAC1D;AAEA,MAAI;AAEJ,MAAI;AACF,iBAAa,KAAK,MAAM,UAAU;AAAA,EACpC,SAAS,OAAO;AACd,UAAM,IAAI,MAAM,uBAAuBE,aAAY,KAAK,CAAC,EAAE;AAAA,EAC7D;AAEA,QAAM,SAAS,sBAAsB,UAAU,UAAU;AAEzD,MAAI,CAAC,OAAO,SAAS;AACnB,UAAM,IAAI;AAAA,MACR,yBAAyB,OAAO,MAAM,OACnC,IAAI,CAAC,UAAU,GAAG,MAAM,KAAK,KAAK,GAAG,KAAK,QAAQ,KAAK,MAAM,OAAO,EAAE,EACtE,KAAK,IAAI,CAAC;AAAA,IACf;AAAA,EACF;AAEA,QAAM,QAAQ,OAAO,KAAK,OAAO,OAAO;AACxC,QAAM,WAAW,MAAM,YAAY,oBAAoB,KAAK;AAC5D,QAAM,UAAU,qBAAqB,KAAK;AAC1C,QAAM,SAAS,gBAAgB;AAAA,IAC7B,QAAQ,MAAM;AAAA,IACd;AAAA,IACA,OAAO,MAAM;AAAA,IACb,MAAM,MAAM;AAAA,IACZ;AAAA,EACF,CAAC;AAED,MAAI,WAAW,QAAW;AACxB,UAAM,IAAI,MAAM,sDAAsD;AAAA,EACxE;AAEA,SAAO;AACT;AAEA,SAAS,oBAAoB,OAKK;AAChC,MACE,MAAM,aAAa,WAClB,MAAM,YAAY,UACjB,MAAM,YAAY,UAClB,MAAM,uBAAuB,SAC/B;AACA,WAAO;AAAA,EACT;AAEA,SAAO,MAAM;AACf;AAEA,SAAS,mCAAmC,OAErB;AACrB,MAAI,MAAM,uBAAuB,QAAW;AAC1C,WAAO;AAAA,EACT;AAEA,QAAM,SAAS;AAEf,MAAI,CAAC,MAAM,mBAAmB,SAAS,MAAM,GAAG;AAC9C,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,SAAO,MAAM,mBAAmB,MAAM,GAAG,CAAC,OAAO,MAAM;AACzD;AAEA,SAAS,qBAAqB,OAIP;AACrB,MAAI,MAAM,YAAY,QAAW;AAC/B,WAAO,MAAM;AAAA,EACf;AACA,MAAI,MAAM,YAAY,QAAW;AAC/B,WAAO,MAAM;AAAA,EACf;AAEA,SAAO,mCAAmC,KAAK;AACjD;AAEA,SAAS,gBAAgB,OAMS;AAChC,MACE,MAAM,WAAW,UACjB,MAAM,YAAY,UAClB,MAAM,UAAU,UAChB,MAAM,SAAS,UACf,MAAM,aAAa,QACnB;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,GAAI,MAAM,WAAW,SAAY,CAAC,IAAI,EAAE,QAAQ,MAAM,OAAO;AAAA,IAC7D,GAAI,MAAM,YAAY,SAAY,CAAC,IAAI,EAAE,SAAS,MAAM,QAAQ;AAAA,IAChE,GAAI,MAAM,UAAU,SAAY,CAAC,IAAI,EAAE,OAAO,MAAM,MAAM;AAAA,IAC1D,GAAI,MAAM,SAAS,SAAY,CAAC,IAAI,EAAE,MAAM,MAAM,KAAK;AAAA,IACvD,GAAI,MAAM,aAAa,SAAY,CAAC,IAAI,EAAE,UAAU,MAAM,SAAS;AAAA,EACrE;AACF;AAEA,SAAS,aAAa,OAA+C;AACnE,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,wBAAwB,UAAU,KAAK;AAEtD,SAAO,OAAO,UAAU,OAAO,OAAO;AACxC;AAEO,SAAS,uBACd,OACA,YAA0C,8BAA8B,EACrE,WAC8C;AACjD,QAAM,WAAW,sBAAsB,MAAM,QAAQ;AACrD,QAAM,WAAW,WAAW,MAAM,QAAQ;AAC1C,QAAM,QAAQ,WAAW,MAAM,KAAK;AAEpC,MAAI,aAAa,QAAW;AAC1B,WAAO;AAAA,EACT;AAEA,MAAI,aAAa,MAAO,QAAO,EAAE,SAAS;AAC1C,MAAI,UAAU,QAAW;AACvB,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,UAAU,YAAY,8BAA8B,aAAa,SAAS;AAAA,IAC1E;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,8BACd,OACA,YAA0C,8BAA8B,EACrE,WACK;AACR,QAAM,SACJ,cAAc,gBACV,oCACA;AACN,SAAO,GAAG,MAAM,OAAO,KAAK;AAC9B;AAEA,SAAS,sBAAsB,OAA6C;AAC1E,SAAO,UAAU,SAAS,UAAU,UAAU,QAAQ;AACxD;AAEA,SAAS,sBACP,OAC4C;AAC5C,SAAO,UAAU,YAAY,UAAU,sBACnC,QACA;AACN;AAEA,SAAS,WAAW,OAAoC;AACtD,SAAO,OAAO,UAAU,WAAW,QAAQ;AAC7C;AAEA,SAAS,oBAAoB,OAAoC;AAC/D,SAAO,OAAO,UAAU,YAAY,OAAO,UAAU,KAAK,KAAK,QAAQ,IACnE,QACA;AACN;AAEA,SAAS,aACP,OACA,QACe;AACf,SAAO,SAAS;AAClB;AAEA,SAAS,gBAAgB,OAA+C;AACtE,QAAM,aAAa,OAAO,KAAK;AAE/B,SAAO,eAAe,UAAa,eAAe,KAAK,SAAY;AACrE;AAEA,SAASA,aAAY,OAAwB;AAC3C,SAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAC9D;;;AG/WO,SAAS,wBAAwB,SAGjB;AACrB,MAAI,QAAQ,QAAQ,UAAa,QAAQ,YAAY,QAAW;AAC9D,UAAM,IAAI,MAAM,uCAAuC;AAAA,EACzD;AACA,SAAO,QAAQ,QAAQ,SACnB,QAAQ,UACR,KAAK,UAAU,QAAQ,GAAG;AAChC;;;ACvCA,SAAS,WAAAC,gBAAe;AACxB,SAAS,cAAAC,aAAY,WAAAC,gBAAe;AAI7B,SAAS,4BAA4B,MAAsB;AAChE,QAAM,UAAU,8BAA8B;AAC9C,QAAM,kBAAkB,QAAQ,IAAI,MAAM,KAAK;AAC/C,QAAM,OACJ,oBAAoB,UAAa,oBAAoB,KACjDC,SAAQ,IACR;AACN,MAAI,SAAS,IAAK,QAAO;AACzB,MAAI,KAAK,WAAW,IAAI,EAAG,QAAOC,SAAQ,MAAM,KAAK,MAAM,CAAC,CAAC;AAC7D,SAAOC,YAAW,IAAI,IAAI,OAAOD,SAAQ,QAAQ,KAAK,IAAI;AAC5D;;;ACfA,SAAS,UAAU,QAAAE,aAAY;AAC/B,SAAS,YAAAC,WAAU,WAAAC,UAAS,cAAAC,aAAY,QAAAC,OAAM,UAAU,WAAAC,gBAAe;AAEvE;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAIK;AA4BA,IAAM,iCAAN,cAA6C,MAAM;AAAA,EACxC,OAAO;AAAA,EAEhB,YAAY,SAAiB;AAClC,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;AAEA,eAAsB,gCACpB,QACmC;AACnC,MAAI,OAAO,SAAS,cAAc;AAChC,WAAO,MAAM,0BAA0B,MAAM;AAAA,EAC/C;AACA,SAAO,MAAM,uBAAuB,MAAM;AAC5C;AAEA,eAAsB,qCACpB,WACiB;AACjB,QAAM,OAAO,4BAA4B,SAAS;AAClD,QAAM,YAAY,MAAM,cAAc,IAAI;AAC1C,QAAM,oBAAoB,MAAM,iBAAiB,IAAI;AACrD,QAAM,YAAY,MAAM,uBAAuB;AAC/C,QAAM,UAAU,MAAM;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,MAAI,QAAQ,SAAS,GAAG;AACtB,UAAM,QAAQ,+BAA+B,MAAM,OAAO;AAC1D,UAAM,IAAI;AAAA,MACR,yDAAyD;AAAA,QACvD,MAAM,QAAQ,YAAY,SAAY,MAAM,QAAQ;AAAA,MACtD,CAAC,KAAK,IAAI,8BAA8B,MAAM,QAAQ,GAAG;AAAA,IAC3D;AAAA,EACF;AACA,aAAW,WAAW,WAAW;AAC/B,UAAM,WAAW,oBAAoB,QAAQ,MAAM;AACnD,UAAM,OAAO,MAAM,cAAc,QAAQ;AACzC,QAAI,CAAC,SAAS,MAAM,SAAS,EAAG;AAChC,UAAM,IAAI;AAAA,MACR,yDAAyD;AAAA,QACvD,QAAQ,YAAY,SAAY,QAAQ;AAAA,MAC1C,CAAC,KAAK,IAAI;AAAA,IACZ;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,gCACd,SACA,WACwB;AACxB,MAAI,QAAQ,WAAW,aAAa,GAAG;AACrC,WAAO,EAAE,MAAM,WAAW,KAAK,cAAc,SAAS,SAAS,EAAE;AAAA,EACnE;AACA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM;AAAA,IACN,GAAI,cAAc,SAAY,CAAC,IAAI,EAAE,UAAU;AAAA,EACjD;AACF;AAEA,eAAsB,8BACpB,MACiC;AACjC,QAAM,OAAO,oBAAoB,IAAI;AACrC,QAAM,YAAY,MAAM,cAAc,IAAI;AAC1C,QAAM,oBAAoB,MAAM,iBAAiB,IAAI;AACrD,QAAM,UAAU,MAAM;AAAA,IACpB,MAAM,uBAAuB;AAAA,IAC7B;AAAA,IACA;AAAA,EACF;AACA,MAAI,QAAQ,SAAS,GAAG;AACtB,UAAM,QAAQ,+BAA+B,MAAM,OAAO;AAC1D,WAAO,EAAE,MAAM,WAAW,KAAK,MAAM,QAAQ,IAAI;AAAA,EACnD;AACA,SAAO,EAAE,MAAM,cAAc,MAAM,oBAAoB,IAAI,EAAE;AAC/D;AAEA,eAAe,0BACb,QACmC;AACnC,MAAI,OAAO,KAAK,WAAW,aAAa,GAAG;AACzC,UAAM,IAAI;AAAA,MACR,8DAA8D,OAAO,IAAI;AAAA,IAC3E;AAAA,EACF;AACA,QAAM,OAAO,MAAM,qCAAqC,OAAO,IAAI;AACnE,QAAM,aAAqC;AAAA,IACzC,MAAM;AAAA,IACN;AAAA,IACA,GAAI,OAAO,cAAc,SAAY,CAAC,IAAI,EAAE,WAAW,OAAO,UAAU;AAAA,EAC1E;AACA,SAAO;AAAA,IACL,aAAa,IAAI,SAAS,IAAI;AAAA,IAC9B,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,YAAY,EAAE,YAAY,MAAM,aAAa,MAAM,MAAM,gBAAgB;AAAA,IACzE,YAAY,0BAA0B,MAAM,OAAO,SAAS;AAAA,IAC5D,QAAQ;AAAA,EACV;AACF;AAEA,eAAe,uBACb,QACmC;AACnC,QAAM,gBAAgB,yBAAyB,OAAO,GAAG;AACzD,QAAM,aAAa,cAAc,eAAe,OAAO;AACvD,QAAM,SAAS,yBAAyB,UAAU;AAClD,MAAI,QAAQ,SAAS,WAAW;AAC9B,UAAM,IAAI;AAAA,MACR,sDAAsD,OAAO,GAAG;AAAA,IAClE;AAAA,EACF;AAGA,QAAM,wBAAwB,MAAM;AACpC,QAAM,cAAc,MAAM,mCAAmC,UAAU;AACvE,QAAM,aAAqC;AAAA,IACzC,MAAM;AAAA,IACN,KAAK,OAAO;AAAA,EACd;AACA,SAAO;AAAA,IACL;AAAA,IACA,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,YAAY;AAAA,MACV,YAAY;AAAA,MACZ,aAAa;AAAA,MACb,MAAM;AAAA,IACR;AAAA,IACA,sBAAsB;AAAA,IACtB,YAAY,OAAO;AAAA,IACnB,kBAAkB;AAAA,IAClB,QAAQ;AAAA,EACV;AACF;AAEA,SAAS,cAAc,gBAAwB,WAA4B;AACzE,MAAI,cAAc,OAAW,QAAO;AACpC,QAAM,OAAO,UAAU,QAAQ,eAAe,EAAE;AAChD,SAAO,GAAG,eAAe,QAAQ,QAAQ,EAAE,CAAC,IAAI,IAAI;AACtD;AAEA,eAAe,cAAc,MAA+B;AAC1D,MAAI;AACF,WAAO,MAAM,SAAS,IAAI;AAAA,EAC5B,QAAQ;AACN,UAAM,WAAWC,SAAQ,IAAI;AAC7B,UAAM,SAASC,SAAQ,QAAQ;AAC/B,WAAO,WAAW,WACd,WACAC,MAAK,MAAM,cAAc,MAAM,GAAGC,UAAS,QAAQ,CAAC;AAAA,EAC1D;AACF;AAEA,SAAS,SAAS,MAAc,WAA4B;AAC1D,QAAM,QAAQ,SAAS,MAAM,SAAS;AACtC,SAAO,UAAU,MAAO,CAAC,MAAM,WAAW,IAAI,KAAK,CAACC,YAAW,KAAK;AACtE;AAaA,eAAe,oBACb,WACA,WACA,mBACyC;AACzC,QAAM,UAAiC,CAAC;AACxC,aAAW,WAAW,WAAW;AAC/B,UAAM,WAAW,MAAM,6BAA6B;AAAA,MAClD,WAAW,QAAQ;AAAA,MACnB,MAAM;AAAA,MACN,GAAI,QAAQ,YAAY,CAAC,IAAI,EAAE,UAAU,QAAQ,SAAS;AAAA,IAC5D,CAAC;AACD,eAAW,WAAW,UAAU;AAC9B,UAAI,QAAQ,SAAS,OAAW;AAChC,cAAQ,KAAK;AAAA,QACX;AAAA,QACA;AAAA,QACA,YAAY,oBAAoB,QAAQ,IAAI;AAAA,MAC9C,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,QAA+B,CAAC;AACtC,aAAW,UAAU,SAAS;AAC5B,QAAK,MAAM,cAAc,OAAO,UAAU,MAAO,WAAW;AAC1D,YAAM,KAAK,MAAM;AAAA,IACnB;AAAA,EACF;AACA,MAAI,MAAM,SAAS,KAAK,sBAAsB,OAAW,QAAO;AAEhE,QAAM,kBAAyC,CAAC;AAChD,aAAW,UAAU,SAAS;AAC5B,QAAK,MAAM,iBAAiB,OAAO,UAAU,MAAO,mBAAmB;AACrE,sBAAgB,KAAK,MAAM;AAAA,IAC7B;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,+BACP,MACA,SACqB;AACrB,MAAI,QAAQ,WAAW,EAAG,QAAO,QAAQ,CAAC;AAC1C,QAAM,IAAI;AAAA,IACR,+DAA+D,IAAI,uCAAuC,QACvG,IAAI,CAAC,UAAU,MAAM,QAAQ,GAAG,EAChC,KAAK,IAAI,CAAC;AAAA,EACf;AACF;AAEA,eAAe,iBAAiB,MAA2C;AACzE,MAAI;AACF,UAAM,QAAQ,MAAMC,MAAK,IAAI;AAC7B,WAAO,GAAG,MAAM,GAAG,IAAI,MAAM,GAAG;AAAA,EAClC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;AR7MO,IAAM,6BAAN,MAAiC;AAAA,EAC7B;AAAA,EAEF,YAAY,SAA8B;AAC/C,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,MAAa,QACX,SACoC;AACpC,WAAO,MAAM,KAAK,SAAS,IAAI,YAAY,MAAM,KAAK,SAAS,OAAO,CAAC;AAAA,EACzE;AAAA,EAEA,MAAM,SACJ,SACoC;AACpC,UAAM,cAAc,QAAQ,eAAe;AAC3C,QAAI,QAAQ,gBAAgB,UAAa,QAAQ,OAAO,WAAW,QAAQ;AACzE,YAAM,IAAI,MAAM,gDAAgD;AAAA,IAClE;AACA,QAAI,QAAQ,OAAO,WAAW,QAAQ;AACpC,YAAM,IAAI,MAAM,+CAA+C;AAAA,IACjE;AACA,QAAI,QAAQ,gBAAgB,UAAa,QAAQ,MAAM,WAAW,QAAQ;AACxE,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,UAAM,iBAAiB,QAAQ,MAAM,WAAW;AAChD,UAAM,cACJ,kBAAkB,gBAAgB,aAAa,gBAAgB;AACjE,UAAM,UAAU,wBAAwB,OAAO;AAC/C,UAAM,cACJ,YAAY,SAAY,yBAAyB,EAAE,MAAM;AAC3D,UAAM,SAAS,MAAM,2BAA2B;AAAA,MAC9C,GAAI,YAAY,SAAY,CAAC,IAAI,EAAE,QAAQ;AAAA,MAC3C,GAAI,gBAAgB,SAAY,CAAC,IAAI,EAAE,eAAe,KAAK;AAAA,MAC3D,GAAI,yBAAyB,EAAE,cAAc,SACzC,CAAC,IACD,EAAE,qBAAqB,KAAK;AAAA,IAClC,CAAC;AACD,UAAM,MAAM,IAAI,UAAU;AAAA,MACxB,GAAI,QAAQ,YAAY,OAAO,EAAE,SAAS,KAAK,IAAI,CAAC;AAAA,MACpD,GAAI,cACA;AAAA,QACE,KACE,gBAAgB,SACZ,yBAAyB,MAAM,IAC/B,EAAE,gBAAgB,YAAY;AAAA,MACtC,IACA,CAAC;AAAA,IACP,CAAC;AACD,UAAM,oBAAoB,MAAM;AAAA,MAC9B,QAAQ;AAAA,MACR;AAAA,IACF;AACA,QAAI;AACJ,QAAI;AACJ,UAAM,QAAQ,OAAO,YAA6C;AAChE,UAAI,eAAgB,OAAM,QAAQ,mBAAmB;AACrD,UAAI,OAAO,QAAQ,YAAY,YAAY;AACzC,cAAM,MAAM,MAAM,QAAQ,QAAQ;AAClC,uBACE,QAAQ,SAAY,SAAY,iBAAiB,IAAI,KAAK;AAC5D,YAAI,QAAQ,OAAO,WAAW,QAAQ;AACpC,yBACE,QAAQ,SAAY,CAAC,IAAI,uBAAuB,IAAI,KAAK;AAAA,QAC7D;AAAA,MACF;AACA,YAAM,aAAa,SAAS,QAAQ,OAAO,MAAM,QAAQ,OAAO,MAAM;AAAA,IACxE;AAEA,QAAI,QAAQ,MAAM,WAAW,QAAQ;AACnC,UAAI,EAAE,UAAU,QAAQ,QAAQ;AAC9B,cAAM,IAAI,MAAM,kCAAkC;AAAA,MACpD;AACA,YAAM,IAAI;AAAA,QACR,IAAI;AAAA,UACF,MAAM,qCAAqC,QAAQ,MAAM,IAAI;AAAA,QAC/D;AAAA,QACA;AAAA,MACF;AAAA,IACF,WAAW,YAAY,QAAQ,OAAO;AACpC,YAAM,IAAI;AAAA,QACR;AAAA,UACE,GAAI,sBAAsB,SAAY,CAAC,IAAI,EAAE,kBAAkB;AAAA,UAC/D,GAAI,QAAQ,eAAe,SACvB,CAAC,IACD,EAAE,YAAY,QAAQ,WAAW;AAAA,UACrC,cAAc,QAAQ,MAAM;AAAA,UAC5B,QAAQ,QAAQ,MAAM;AAAA,UACtB,IAAK,QAAQ,UAAU,OAAO,YAAY,SACtC,CAAC,IACD,EAAE,kBAAkB,QAAQ,UAAU,OAAO,OAAO;AAAA,UACxD;AAAA,QACF;AAAA,QACA;AAAA,MACF;AAAA,IACF,OAAO;AACL,YAAM,gBAAgB;AAAA,QACpB,GAAI,sBAAsB,SAAY,CAAC,IAAI,EAAE,kBAAkB;AAAA,QAC/D,MAAM,IAAI,SAAS,4BAA4B,QAAQ,MAAM,IAAI,CAAC;AAAA,QAClE,GAAI,QAAQ,eAAe,SACvB,CAAC,IACD,EAAE,YAAY,QAAQ,WAAW;AAAA,QACrC,IAAK,QAAQ,UAAU,OAAO,YAAY,SACtC,CAAC,IACD,EAAE,kBAAkB,QAAQ,UAAU,OAAO,OAAO;AAAA,QACxD;AAAA,MACF;AACA,UAAI,QAAQ,MAAM,WAAW,QAAQ;AACnC,cAAM,IAAI,kBAAkB,eAAe,KAAK;AAAA,MAClD,WAAW,QAAQ,MAAM,WAAW,QAAQ;AAC1C,cAAM,IAAI;AAAA,UACR;AAAA,YACE,GAAG;AAAA,YACH,WAAW,QAAQ,MAAM,UAAU;AAAA,YACnC,GAAI,QAAQ,MAAM,UAAU,SAAS,SACjC,CAAC,IACD,EAAE,SAAS,QAAQ,MAAM,UAAU,KAAK;AAAA,UAC9C;AAAA,UACA;AAAA,QACF;AAAA,MACF,WAAW,QAAQ,MAAM,WAAW,YAAY;AAC9C,cAAM,IAAI,sBAAsB,eAAe,KAAK;AAAA,MACtD,OAAO;AACL,cAAM,IAAI,iBAAiB,eAAe,KAAK;AAAA,MACjD;AAAA,IACF;AAEA,UAAM,iBAAiB,MAAM,sBAAsB,QAAQ,KAAK;AAChE,WAAO;AAAA,MACL,GAAI,iBAAiB,SAAY,CAAC,IAAI,EAAE,aAAa;AAAA,MACrD,GAAI,iBAAiB,SAAY,CAAC,IAAI,EAAE,aAAa;AAAA,MACrD,aAAa,QAAQ,MAAM;AAAA,MAC3B,cAAc,QAAQ,OAAO;AAAA,MAC7B,YAAY,QAAQ,OAAO;AAAA,MAC3B,GAAI,mBAAmB,SAAY,CAAC,IAAI,EAAE,eAAe;AAAA,IAC3D;AAAA,EACF;AACF;AAEA,eAAe,uBACb,MACA,UACoC;AACpC,QAAM,aAAa,MAAM,KAAK;AAC9B,MAAI,CAAC,YAAY,eAAe,UAAa,eAAe;AAC1D,WAAO;AACT,QAAM,WAAW,4BAA4B,UAAU;AACvD,QAAMC,IAAG,UAAU,EAAE,OAAO,MAAM,WAAW,KAAK,CAAC;AACnD,SAAO,IAAI,cAAc,QAAQ;AACnC;AAEA,eAAe,aACb,SACA,MACA,QACe;AACf,QAAM,aACJ,WAAW,SACP,MAAM,qCAAqC,IAAI,IAC/C,4BAA4B,IAAI;AACtC,QAAM,OAAO,IAAI,SAAS,UAAU;AACpC,MAAI,WAAW,OAAQ,OAAM,QAAQ,WAAW,IAAI;AAAA,WAC3C,WAAW,OAAQ,OAAM,QAAQ,OAAO,IAAI;AAAA,WAC5C,WAAW,OAAQ,OAAM,IAAI,MAAM,+BAA+B;AAAA,MACtE,OAAM,QAAQ,WAAW,IAAI;AACpC;AAEA,eAAe,sBACb,OAC0C;AAC1C,MAAI,EAAE,UAAU,UAAU,MAAM,WAAW,OAAQ,QAAO;AAC1D,MAAI,MAAM,WAAW,QAAQ;AAC3B,WAAO;AAAA,MACL,QAAQ,MAAM,UAAU,OAAO,KAAK,EAAE,YAAY;AAAA,MAClD,WAAW;AAAA,MACX,GAAI,MAAM,UAAU,SAAS,SACzB,CAAC,IACD,EAAE,MAAM,MAAM,UAAU,KAAK;AAAA,IACnC;AAAA,EACF;AACA,MAAI,MAAM,WAAW,OAAQ,QAAO;AACpC,QAAM,OAAO,4BAA4B,MAAM,IAAI;AACnD,QAAM,OAAO,WAAW,QAAQ;AAChC,MAAI;AACF,qBAAiB,SAAS,iBAAiB,IAAI,GAAG;AAChD,WAAK,OAAO,KAAe;AAAA,IAC7B;AAAA,EACF,SAAS,OAAO;AACd,QAAI,gBAAgB,OAAO,QAAQ,EAAG,QAAO;AAC7C,UAAM;AAAA,EACR;AACA,SAAO;AAAA,IACL,QAAQ,KAAK,OAAO,KAAK;AAAA,IACzB,WAAW;AAAA,IACX,MAAMC,UAAS,IAAI;AAAA,EACrB;AACF;AAEA,SAAS,gBAAgB,OAAgB,MAAuB;AAC9D,SACE,OAAO,UAAU,YACjB,UAAU,QACV,UAAU,SACV,MAAM,SAAS;AAEnB;AAEA,SAAS,iBACP,OAIQ;AACR,MAAI,QAAQ;AACZ,aAAW,QAAQ,OAAO;AACxB,QAAI,KAAK,aAAa,OAAW,UAAS;AAC1C,aAAS;AAAA,MACP,KAAK;AAAA,IAIP;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,uBACP,OAKA,eAAkC,CAAC,GAChB;AACnB,QAAM,QAAkB,CAAC;AACzB,aAAW,QAAQ,OAAO;AACxB,UAAM,MAAM,KAAK,OAAO,WAAW,KAAK,YAAY,OAAO;AAC3D,UAAM,cAAc,CAAC,GAAG,cAAc,GAAG;AACzC,QAAI,KAAK,aAAa,OAAW,OAAM,KAAK,YAAY,KAAK,GAAG,CAAC;AACjE,UAAM;AAAA,MACJ,GAAG;AAAA,QACD,KAAK;AAAA,QAKL;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;;;ASvUA;AAAA,EACE;AAAA,OAEK;;;ACDP,SAAS,OAAO,iBAAiB;AACjC,SAAS,gBAAAC,qBAAoB;AAC7B,SAAS,0BAAAC,+BAA8B;AAyBvC,IAAM,uBAAuB;AAE7B,eAAsB,+BAAkE;AACtF,QAAM,SAAS,MAAM,uBAAuB,YAAY;AAExD,SAAO;AAAA,IACL,GAAI,OAAO,OAAO,WAAW,WAAW,EAAE,QAAQ,OAAO,OAAO,IAAI,CAAC;AAAA,IACrE,GAAI,OAAO,OAAO,YAAY,WAAW,EAAE,SAAS,OAAO,QAAQ,IAAI,CAAC;AAAA,IACxE,GAAI,OAAO,OAAO,eAAe,WAC7B,EAAE,YAAY,OAAO,WAAW,IAChC,CAAC;AAAA,IACL,GAAI,OAAO,OAAO,UAAU,WAAW,EAAE,OAAO,OAAO,MAAM,IAAI,CAAC;AAAA,IAClE,GAAI,OAAO,OAAO,SAAS,WAAW,EAAE,MAAM,OAAO,KAAK,IAAI,CAAC;AAAA,IAC/D,GAAI,OAAO,OAAO,aAAa,WAC3B,EAAE,UAAU,uBAAuB,OAAO,QAAQ,EAAE,IACpD,CAAC;AAAA,EACP;AACF;AAEA,eAAsB,eACpB,OACA,SAAmC,CAAC,GACL;AAC/B,QAAM,aAAa,MAAM,KAAK;AAE9B,MAAI,eAAe,IAAI;AACrB,UAAM,IAAI,MAAM,6BAA6B;AAAA,EAC/C;AAEA,QAAM,WAAW,yBAAyB,OAAO,QAAQ;AACzD,QAAM,QAAQ,sBAAsB,OAAO,KAAK;AAChD,QAAM,iBAAiB,qBAAqB,UAAU,OAAO,MAAM;AACnE,QAAM,kBAAkB,+BAA+B,UAAU,MAAM;AACvE,QAAM,SAAS,MAAM,MAAM;AAAA,IACzB,OAAO;AAAA,IACP,GAAI,oBAAoB,SAAY,CAAC,IAAI,EAAE,gBAAgB;AAAA,IAC3D,OAAO;AAAA,EACT,CAAC;AAED,SAAO;AAAA,IACL,YAAY,OAAO,UAAU;AAAA,IAC7B,WAAW,OAAO;AAAA,IAClB;AAAA,IACA;AAAA,IACA,GAAI,OAAO,MAAM,WAAW,SACxB,CAAC,IACD,EAAE,OAAO,EAAE,QAAQ,OAAO,MAAM,OAAO,EAAE;AAAA,EAC/C;AACF;AAEO,SAAS,kCACd,QAC8B;AAC9B,QAAM,WAAW,yBAAyB,OAAO,QAAQ;AACzD,QAAM,QAAQ,sBAAsB,OAAO,KAAK;AAChD,QAAM,iBAAiB,qBAAqB,UAAU,OAAO,MAAM;AACnE,QAAM,kBAAkB,+BAA+B,UAAU,MAAM;AAEvE,SAAO;AAAA,IACL,GAAI,OAAO,eAAe,SACtB,CAAC,IACD,EAAE,YAAY,OAAO,WAAW;AAAA,IACpC,UAAU,wBAAwB,UAAU,OAAO,MAAM;AAAA,IACzD;AAAA,IACA,YAAY,OAAO,OAAO,YAAY;AACpC,YAAM,aAAyB,CAAC;AAChC,UAAI,SAAS;AAEb,iBAAW,SAAS,WAAW,OAAO,oBAAoB,GAAG;AAC3D,iBAAS,QAAQ,eAAe;AAChC,cAAM,SAAS,MAAM,UAAU;AAAA,UAC7B,GAAI,SAAS,WAAW,SACpB,CAAC,IACD,EAAE,aAAa,QAAQ,OAAO;AAAA,UAClC,OAAO;AAAA,UACP,GAAI,oBAAoB,SAAY,CAAC,IAAI,EAAE,gBAAgB;AAAA,UAC3D,QAAQ,CAAC,GAAG,KAAK;AAAA,QACnB,CAAC;AAED,mBAAW,KAAK,GAAG,OAAO,UAAU;AACpC,kBAAU,OAAO,MAAM,UAAU;AAAA,MACnC;AACA,aAAO;AAAA,QACL;AAAA,QACA,GAAI,WAAW,IAAI,CAAC,IAAI,EAAE,OAAO;AAAA,MACnC;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,wBACP,UACA,OACA,QACQ;AACR,SAAO,KAAK,UAAU;AAAA,IACpB,GAAI,OAAO,YAAY,SAAY,CAAC,IAAI,EAAE,SAAS,OAAO,QAAQ;AAAA,IAClE,GAAI,OAAO,eAAe,SACtB,CAAC,IACD,EAAE,YAAY,OAAO,WAAW;AAAA,IACpC;AAAA,IACA;AAAA,EACF,CAAC;AACH;AAEA,UAAU,WACR,OACA,MAC6B;AAC7B,WAAS,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS,MAAM;AACvD,UAAM,MAAM,MAAM,OAAO,QAAQ,IAAI;AAAA,EACvC;AACF;AAEA,eAAsB,8BACpB,OAC+B;AAC/B,SAAO,MAAM,eAAe,OAAO,MAAM,6BAA6B,CAAC;AACzE;AAEA,SAAS,qBACP,UACA,OACA,QACA;AACA,UAAQ,UAAU;AAAA,IAChB,KAAK,UAAU;AACb,UAAI,OAAO,YAAY,QAAW;AAChC,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAEA,aAAOC,cAAa;AAAA,QAClB,GAAI,OAAO,WAAW,SAAY,CAAC,IAAI,EAAE,QAAQ,OAAO,OAAO;AAAA,QAC/D,GAAI,OAAO,SAAS,SAAY,CAAC,IAAI,EAAE,MAAM,OAAO,KAAK;AAAA,MAC3D,CAAC,EAAE,eAAe,KAAK;AAAA,IACzB;AAAA,IACA,KAAK,qBAAqB;AACxB,UAAI,OAAO,YAAY,QAAW;AAChC,cAAM,IAAI,MAAM,gDAAgD;AAAA,MAClE;AAEA,aAAOC,wBAAuB;AAAA,QAC5B,SAAS,OAAO;AAAA,QAChB,MAAM,OAAO,QAAQC,4BAA2B,OAAO,OAAO;AAAA,QAC9D,GAAI,OAAO,WAAW,SAAY,CAAC,IAAI,EAAE,QAAQ,OAAO,OAAO;AAAA,MACjE,CAAC,EAAE,eAAe,KAAK;AAAA,IACzB;AAAA,EACF;AACF;AAEA,SAAS,+BACP,UACA,QAC6D;AAC7D,MAAI,OAAO,eAAe,QAAW;AACnC,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,CAAC,gCAAgC,UAAU,MAAM,CAAC,GAAG;AAAA,MACnD,YAAY,OAAO;AAAA,IACrB;AAAA,EACF;AACF;AAEA,SAAS,gCACP,UACA,SACQ;AACR,MAAI,aAAa,UAAU;AACzB,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,yBACP,UACgC;AAChC,MAAI,aAAa,QAAW;AAC1B,WAAO;AAAA,EACT;AAEA,QAAM,IAAI;AAAA,IACR;AAAA,EACF;AACF;AAEA,SAAS,sBAAsB,OAAmC;AAChE,MAAI,UAAU,QAAW;AACvB,WAAO;AAAA,EACT;AAEA,QAAM,IAAI;AAAA,IACR;AAAA,EACF;AACF;AAEA,SAAS,uBAAuB,OAA+C;AAC7E,UAAQ,OAAO;AAAA,IACb,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT;AACE,YAAM,IAAI;AAAA,QACR,gCAAgC,KAAK;AAAA,MACvC;AAAA,EACJ;AACF;AAEA,SAASA,4BAA2B,SAAyB;AAC3D,MAAI;AACF,WAAO,IAAI,IAAI,OAAO,EAAE;AAAA,EAC1B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;AD1OA,eAAsB,oCAEpB;AACA,QAAM,WAAW,yBAAyB,EAAE;AAC5C,MAAI,aAAa,OAAW,QAAO;AACnC,QAAM,SAAS,MAAM,6BAA6B;AAClD,MACE,OAAO,aAAa,UACpB,OAAO,UAAU,UAChB,OAAO,aAAa,uBAAuB,OAAO,YAAY,UAC9D,OAAO,aAAa,YAAY,OAAO,YAAY,QACpD;AACA,WAAO;AAAA,EACT;AACA,SAAO,kCAAkC,MAAM;AACjD;AAEA,eAAsB,gCACpB,WACA,WASY;AACZ,MAAI,CAAC,UAAU,SAAS,WAAW,EAAG,QAAO,MAAM,UAAU,CAAC,CAAC;AAE/D,QAAM,SAAS,MAAM,2BAA2B;AAChD,QAAM,WAAW,MAAM;AAAA,IACrB,OAAO,cAAc,SACjB,EAAE,MAAM,QAAQ,IAChB;AAAA,MACE,UAAU,OAAO,UAAU;AAAA,MAC3B,MAAM;AAAA,MACN,OAAO,OAAO,UAAU;AAAA,IAC1B;AAAA,EACN;AACA,MAAI;AACF,WAAO,MAAM,UAAU,EAAE,mBAAmB,SAAS,CAAC;AAAA,EACxD,UAAE;AACA,UAAM,SAAS,MAAM;AAAA,EACvB;AACF;;;AE1DA;AAAA,EACE;AAAA,EACA;AAAA,OAKK;AAoCP,eAAsB,wBACpB,UACA,SAIqC;AACrC,QAAM,CAAC,aAAa,mBAAmB,cAAc,GAAG,QAAQ,IAC9D,MAAM,QAAQ,IAAI;AAAA,IAChB,aAAa,QAAQ;AAAA,IACrB,4BAA4B,QAAQ;AAAA,IACpC,iBAAiB,QAAQ;AAAA,IACzB,SAAS,eAAe,aAAa,KAAK;AAAA,IAC1C,SAAS,eAAe,aAAa,kBAAkB;AAAA,IACvD,SAAS,eAAe,aAAa,mBAAmB;AAAA,EAC1D,CAAC;AACH,QAAM,WAAW,eAAe,aAAa,QAAQ,SAAS;AAC9D,QAAM,iBAAiB;AAAA,IACrB,KAAK,YAAY,SAAS,CAAC,CAAC;AAAA,IAC5B,iBAAiB,YAAY,SAAS,CAAC,CAAC;AAAA,IACxC,kBAAkB,YAAY,SAAS,CAAC,CAAC;AAAA,EAC3C;AACA,QAAM,cAAc,MAAM,QAAQ;AAAA,IAChC,SAAS,IAAI,OAAO,YAAY;AAC9B,YAAM,SAAS,MAAM,SAAS,QAAQ,QAAQ,QAAQ,SAAS;AAC/D,aAAO;AAAA,QACL,cAAc;AAAA,UACZ,gBAAgB;AAAA,YACd,WAAW,QAAQ,wBAAwB;AAAA,UAC7C;AAAA,UACA,cAAc,EAAE,WAAW,QAAQ,kBAAkB,KAAK;AAAA,UAC1D,gBAAgB,EAAE,WAAW,QAAQ,UAAU,aAAa;AAAA,QAC9D;AAAA,QACA;AAAA,QACA,SAAS;AAAA,UACP,KAAK;AAAA,YACH;AAAA,YACA,eAAe,IAAI,IAAI,QAAQ,SAAS;AAAA,UAC1C;AAAA,UACA,iBAAiB;AAAA,YACf;AAAA,YACA,eAAe,gBAAgB,IAAI,QAAQ,SAAS;AAAA,UACtD;AAAA,UACA,kBAAkB;AAAA,YAChB;AAAA,YACA,eAAe,iBAAiB,IAAI,QAAQ,SAAS;AAAA,UACvD;AAAA,QACF;AAAA,QACA,UAAU,QAAQ,YAAY;AAAA,QAC9B,cAAc,aAAa,IAAI,QAAQ,SAAS,KAAK;AAAA,MACvD;AAAA,IACF,CAAC;AAAA,EACH;AACA,QAAM,WAAW,YAAY,CAAC;AAC9B,SAAO;AAAA,IACL,YAAY,QAAQ;AAAA,IACpB,UAAU;AAAA,IACV,iBAAiB,EAAE,SAAS,kBAAkB;AAAA,IAC9C,OACE,QAAQ,cAAc,SAClB,EAAE,MAAM,UAAU,IAClB,EAAE,WAAW,QAAQ,WAAW,MAAM,UAAU;AAAA,IACtD,KACE,aAAa,UAAa,QAAQ,cAAc,SAC5C,QAAQ,aACR,wBAAwB,QAAQ,YAAY,SAAS,OAAO;AAAA,EACpE;AACF;AAEA,SAAS,eACP,UACA,WACyB;AACzB,MAAI,cAAc,OAAW,QAAO;AACpC,QAAM,WAAW,SAAS;AAAA,IACxB,CAAC,YAAY,QAAQ,cAAc;AAAA,EACrC;AACA,MAAI,SAAS,WAAW,GAAG;AACzB,UAAM,IAAI,MAAM,WAAW,SAAS,kBAAkB;AAAA,EACxD;AACA,SAAO;AACT;AAEA,SAAS,YACP,UACkD;AAClD,SAAO,IAAI,IAAI,SAAS,IAAI,CAAC,SAAS,CAAC,KAAK,UAAU,IAAI,CAAC,CAAC;AAC9D;AAEA,SAAS,gBACP,MACA,UACyC;AACzC,SAAO;AAAA,IACL,SAAS,UAAU,YAAY;AAAA,IAC/B,QAAQ,UAAU,mBAAmB;AAAA,IACrC;AAAA,IACA,GAAI,UAAU,mBAAmB,SAC7B,CAAC,IACD,EAAE,gBAAgB,SAAS,eAAe;AAAA,EAChD;AACF;AAEA,eAAe,iBACb,UACsC;AACtC,QAAM,OAAO,MAAM,SAAS;AAAA,IAC1B,OAAO,aACL,MAAM,SAAS;AAAA,MACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA;AAAA,MACA,CAAC,SAAS;AAAA,QACR,WAAW,OAAO,IAAI,UAAU;AAAA,QAChC,OAAO,OAAO,IAAI,KAAK;AAAA,MACzB;AAAA,IACF;AAAA,EACJ;AACA,SAAO,IAAI,IAAI,KAAK,IAAI,CAAC,QAAQ,CAAC,IAAI,WAAW,IAAI,KAAK,CAAC,CAAC;AAC9D;AAEA,SAAS,wBACP,YACA,SACQ;AACR,SAAO,GAAG,WAAW,QAAQ,SAAS,EAAE,CAAC,IAAI,QAAQ,IAAI,QAAQ,eAAe,EAAE,CAAC;AACrF;;;AC7KA;AAAA,EACE;AAAA,EACA;AAAA,OAGK;AAWP,eAAsB,8BACpB,UACA,WACA,UAAgD,CAAC,GACrC;AACZ,QAAM,YAAY,QAAQ,+BAA+B;AACzD,QAAM,QAAQ,OAAO,cAAoB,SAAS,gBAChD,MAAM,IAAI,qBAAqB,WAAW,EAAE,MAAM,WAAW;AAAA,IAC3D,GAAI,YACA,CAAC,IACD,EAAE,kBAAkB,CAAC,SAAS,YAAY,SAAS,WAAW,EAAE;AAAA,IACpE,GAAI,QAAQ,kCAAkC,SAC1C,CAAC,IACD;AAAA,MACE,+BACE,QAAQ;AAAA,IACZ;AAAA,IACJ,GAAI,QAAQ,+BAA+B,SACvC,CAAC,IACD,EAAE,4BAA4B,QAAQ,2BAA2B;AAAA,EACvE,CAAC;AAEH,MACE,SAAS,yBAAyB,UAClC,aACA,QAAQ,wBAAwB,OAChC;AACA,WAAO,MAAM,MAAM;AAAA,EACrB;AACA,SAAO,MAAM,6BAA6B;AAAA,IACxC,4BAA4B,CAAC,SAAS,YAAY,SAAS,WAAW;AAAA,IACtE,GAAI,QAAQ,kCAAkC,SAC1C,CAAC,IACD;AAAA,MACE,+BAA+B,QAAQ;AAAA,IACzC;AAAA,IACJ,GAAI,QAAQ,qBAAqB,SAC7B,CAAC,IACD,EAAE,kBAAkB,QAAQ,iBAAiB;AAAA,IACjD,WAAW,OAAO,gBAAgB,MAAM,MAAM,WAAW;AAAA,IACzD,QAAQ,SAAS;AAAA,EACnB,CAAC;AACH;;;AChBO,SAAS,aACd,gBACY;AACZ,MAAI,WAAW;AAEf,QAAM,aAAa,MAAY;AAC7B,QAAI,SAAU,OAAM,IAAI,MAAM,2BAA2B;AAAA,EAC3D;AAEA,SAAO;AAAA,IACL,WAAW,eAAe;AAAA,IAC1B,MAAM,KAAK,UAA6B,CAAC,GAAe;AACtD,iBAAW;AACX,aAAO,MAAM,eAAe,KAAK,OAAO;AAAA,IAC1C;AAAA,IACA,MAAM,QAAyB;AAC7B,iBAAW;AACX,aAAO,MAAM,eAAe,MAAM;AAAA,IACpC;AAAA,IACA,MAAM,UAAyB;AAC7B,UAAI,SAAU;AACd,iBAAW;AACX,YAAM,eAAe,UAAU;AAAA,IACjC;AAAA,EACF;AACF;AAGO,SAAS,iBACd,gBACY;AACZ,MAAI;AACJ,SAAO,aAAa;AAAA,IAClB,WAAW,eAAe;AAAA,IAC1B,MAAM,OAAO,YACX,MAAM,eAAe,KAAK,eAAe,WAAW,OAAO;AAAA,IAC7D,OAAO,YAAY;AACjB,gBAAU,MAAM,eAAe,YAAY,eAAe,SAAS;AACnE,aAAO;AAAA,IACT;AAAA,IACA,SAAS,YAAY;AACnB,UAAI,UAAU,OAAW,OAAM,eAAe,eAAe,KAAK;AAClE,cAAQ;AAAA,IACV;AAAA,EACF,CAAC;AACH;AAGA,gBAAuB,aACrB,WACA,UAA6B,CAAC,GACZ;AAClB,MAAI,OAAO;AAEX,SAAO,MAAM;AACX,UAAM;AACN,UAAM,SAAS,KAAK,WAAW;AAC/B,QAAI,WAAW,KAAM;AAErB,QAAI;AACF,YAAM,WAAW,MAAM,OAAO,KAAK,OAAO;AAC1C,YAAM,OAAO,QAAQ;AACrB,aAAO;AAAA,IACT,SAAS,OAAO;AACd,YAAM,OAAO,QAAQ;AACrB,YAAM;AAAA,IACR;AAAA,EACF;AACF;AAGA,gBAAuB,aACrB,WACA,UAA6B,CAAC,GACZ;AAClB,mBAAiB,QAAQ,aAAa,WAAW,OAAO,GAAG;AACzD,WAAO;AAAA,EACT;AACF;;;ACpGO,IAAM,kBAAN,MAAM,iBAAiD;AAAA,EAC5C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACP;AAAA,EAEF,YACL,QACA,SAA0C,MAC1C;AACA,SAAK,SAAS;AACd,SAAK,WAAW,OAAO;AACvB,SAAK,QAAQ,OAAO;AACpB,SAAK,OAAO,OAAO;AACnB,SAAK,WAAW,OAAO;AACvB,SAAK,QAAQ,OAAO;AACpB,SAAK,QAAQ,OAAO;AACpB,SAAK,gBAAgB,OAAO;AAC5B,SAAK,QAAQ,OAAO;AACpB,SAAK,QAAQ,OAAO;AACpB,SAAK,QAAQ,OAAO;AACpB,SAAK,QAAQ,OAAO;AACpB,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,OAAuB,YACrB;AAAA,EACF,CAAQ,OAAO,QAAQ,IAA8B;AACnD,WAAO,KAAK,MAAM,OAAO,QAAQ,EAAE;AAAA,EACrC;AAAA,EACO,aAAmC;AACxC,WAAO,KAAK;AAAA,EACd;AACF;AAEO,IAAM,wBAAN,MAAM,uBAAuD;AAAA,EAClD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACP;AAAA,EAEF,YACL,QACA,SAAgD,MAChD;AACA,SAAK,SAAS;AACd,SAAK,WAAW,OAAO;AACvB,SAAK,MAAM,OAAO;AAClB,SAAK,QAAQ,OAAO;AACpB,SAAK,QAAQ,OAAO;AACpB,SAAK,gBAAgB,OAAO;AAC5B,SAAK,QAAQ,OAAO;AACpB,SAAK,QAAQ,OAAO;AACpB,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,OAAuB,YACrB;AAAA,EACF,CAAQ,OAAO,QAAQ,IAA8B;AACnD,WAAO,KAAK,MAAM,OAAO,QAAQ,EAAE;AAAA,EACrC;AAAA,EACO,aAAmC;AACxC,WAAO,KAAK;AAAA,EACd;AACF;AAEO,IAAM,sBAAN,MAAM,qBAEX;AAAA,EACgB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACP;AAAA,EAEF,YACL,QACA,SAA8C,MAC9C;AACA,SAAK,SAAS;AACd,SAAK,QAAQ,OAAO;AACpB,SAAK,QAAQ,OAAO;AACpB,SAAK,gBAAgB,OAAO;AAC5B,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,OAAuB,YACrB;AAAA,EACF,CAAQ,OAAO,QAAQ,IAAgD;AACrE,WAAO,KAAK,MAAM,OAAO,QAAQ,EAAE;AAAA,EACrC;AAAA,EACO,aAAmC;AACxC,WAAO,KAAK;AAAA,EACd;AACF;AAEO,IAAM,qBAAN,MAAM,oBAAqD;AAAA,EAChD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACP;AAAA,EAEF,YACL,QACA,SAA6C,MAC7C;AACA,SAAK,SAAS;AACd,SAAK,QAAQ,OAAO;AACpB,SAAK,QAAQ,OAAO;AACpB,SAAK,gBAAgB,OAAO;AAC5B,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,OAAuB,YACrB;AAAA,EACF,CAAQ,OAAO,QAAQ,IAA+B;AACpD,WAAO,KAAK,MAAM,OAAO,QAAQ,EAAE;AAAA,EACrC;AAAA,EACO,aAAmC;AACxC,WAAO,KAAK;AAAA,EACd;AACF;AAEO,IAAM,2BAAN,MAAM,0BAAgE;AAAA,EAC3D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACP;AAAA,EAEF,YACL,QACA,SAAmD,MACnD;AACA,SAAK,SAAS;AACd,SAAK,QAAQ,OAAO;AACpB,SAAK,QAAQ,OAAO;AACpB,SAAK,gBAAgB,OAAO;AAC5B,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,OAAuB,YACrB;AAAA,EACF,CAAQ,OAAO,QAAQ,IAAoC;AACzD,WAAO,KAAK,MAAM,OAAO,QAAQ,EAAE;AAAA,EACrC;AAAA,EACO,aAAmC;AACxC,WAAO,KAAK;AAAA,EACd;AACF;AAEO,SAAS,sBACd,QACA,MAIA,aACA,cACiB;AACjB,SAAO,IAAI;AAAA,IACT;AAAA,IACA,OAAO,eAAe,OAClB,OACA,iBAAiB;AAAA,MACf,WAAW;AAAA,MACX,WAAW,OAAO;AAAA,MAClB;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACP;AACF;AAEO,SAAS,4BACd,QACA,MAIA,aACA,cACuB;AACvB,SAAO,IAAI;AAAA,IACT;AAAA,IACA,OAAO,eAAe,OAClB,OACA,iBAAiB;AAAA,MACf,WAAW;AAAA,MACX,WAAW,OAAO;AAAA,MAClB;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACP;AACF;AAEO,SAAS,0BACd,QACA,MAIA,aACA,cACqB;AACrB,SAAO,IAAI;AAAA,IACT;AAAA,IACA,OAAO,eAAe,OAClB,OACA,iBAAiB;AAAA,MACf,WAAW;AAAA,MACX,WAAW,OAAO;AAAA,MAClB;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACP;AACF;AAEO,SAAS,yBACd,QACA,MAIA,aACA,cACoB;AACpB,SAAO,IAAI;AAAA,IACT;AAAA,IACA,OAAO,eAAe,OAClB,OACA,iBAAiB;AAAA,MACf,WAAW;AAAA,MACX,WAAW,OAAO;AAAA,MAClB;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACP;AACF;AAEO,SAAS,+BACd,QACA,MAIA,aACA,cAC0B;AAC1B,SAAO,IAAI;AAAA,IACT;AAAA,IACA,OAAO,eAAe,OAClB,OACA,iBAAiB;AAAA,MACf,WAAW;AAAA,MACX,WAAW,OAAO;AAAA,MAClB;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACP;AACF;AAEO,IAAM,oBAAN,MAAM,mBAAmD;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACP;AAAA,EAEF,YACL,QACA,SAA4C,MAC5C;AACA,SAAK,KAAK,OAAO;AACjB,SAAK,QAAQ,OAAO;AACpB,SAAK,gBAAgB,OAAO;AAC5B,SAAK,QAAQ,OAAO;AACpB,SAAK,QAAQ,OAAO;AACpB,SAAK,QAAQ,OAAO;AACpB,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,OAAuB,YACrB;AAAA,EACF,CAAQ,OAAO,QAAQ,IAA8B;AACnD,WAAO,KAAK,MAAM,OAAO,QAAQ,EAAE;AAAA,EACrC;AAAA,EACO,aAAmC;AACxC,WAAO,KAAK;AAAA,EACd;AACF;AAEO,SAAS,wBACd,QACA,MAIA,aACA,cACmB;AACnB,SAAO,IAAI;AAAA,IACT;AAAA,IACA,OAAO,eAAe,OAClB,OACA,iBAAiB;AAAA,MACf,WAAW;AAAA,MACX,WAAW,OAAO;AAAA,MAClB;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACP;AACF;;;AfpOO,IAAM,8BAAN,cAA0C,MAAM;AAAA,EACrC,OAAO;AAAA,EACP;AAAA,EAET,YAAY,MAAc;AAC/B,UAAM,2BAA2B,IAAI,EAAE;AACvC,SAAK,OAAO;AACZ,SAAK,OAAO;AAAA,EACd;AACF;AAmGO,IAAM,0BAAN,MAA8B;AAAA,EAC1B;AAAA,EAEF,YAAY,SAA8B;AAC/C,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,MAAa,OACX,SACuC;AACvC,WAAO,MAAM,KAAK,SAAS,IAAI,YAAY;AACzC,YAAM,OAAO,MAAM,qCAAqC,QAAQ,IAAI;AACpE,UAAI,QAAQ,YAAY,QAAS,MAAM,eAAe,IAAI,GAAI;AAC5D,cAAM,IAAI,4BAA4B,IAAI;AAAA,MAC5C;AACA,YAAM,aAAaC;AAAA,QACjBC,SAAQ,IAAI;AAAA,QACZ,IAAIC,UAAS,IAAI,CAAC,IAAIC,YAAW,CAAC;AAAA,MACpC;AACA,UAAI;AACF,YAAI,QAAQ,eAAe,QAAW;AACpC,gBAAM,uBAAuB,UAAU;AAAA,QACzC,OAAO;AACL,gBAAM,IAAI,2BAA2B,KAAK,QAAQ,EAAE,QAAQ;AAAA,YAC1D,OAAO,EAAE,QAAQ,QAAQ,MAAM,QAAQ,WAAW;AAAA,YAClD,GAAI,QAAQ,eAAe,SACvB,CAAC,IACD,EAAE,YAAY,QAAQ,WAAW;AAAA,YACrC,QAAQ,EAAE,QAAQ,QAAQ,MAAM,WAAW;AAAA,YAC3C,aAAa;AAAA,UACf,CAAC;AAAA,QACH;AACA,YAAI,QAAQ,YAAY,MAAM;AAC5B,gBAAMC,QAAO,YAAY,IAAI;AAAA,QAC/B,OAAO;AACL,cAAI;AAGF,kBAAM,KAAK,YAAY,IAAI;AAAA,UAC7B,SAAS,OAAO;AACd,gBAAI,kBAAkB,KAAK,GAAG;AAC5B,oBAAM,IAAI,4BAA4B,IAAI;AAAA,YAC5C;AACA,kBAAM;AAAA,UACR;AAAA,QACF;AACA,eAAO,EAAE,YAAYC,2BAA0B,IAAI,GAAG,KAAK;AAAA,MAC7D,UAAE;AACA,cAAMC,IAAG,YAAY,EAAE,OAAO,MAAM,WAAW,KAAK,CAAC;AAAA,MACvD;AAAA,IACF,GAAG,QAAQ,MAAM;AAAA,EACnB;AAAA,EAEA,MAAa,KACX,QACA,UAAqC,CAAC,GACL;AACjC,UAAM,WAAW,MAAM,KAAK,SAAS;AAAA,MACnC,YAAY,MAAM,gCAAgC,MAAM;AAAA,MACxD,QAAQ;AAAA,IACV;AACA,WAAO,IAAI,uBAAuB,KAAK,UAAU,QAAQ;AAAA,EAC3D;AACF;AAEO,IAAM,yBAAN,MAA6B;AAAA,EACzB;AAAA,EACA;AAAA,EAEF,YAAY,SAA8B,UAAmB;AAClE,SAAK,WAAW;AAChB,SAAK,YAAY;AAAA,EACnB;AAAA,EAEA,IAAW,aAAqB;AAC9B,WAAO,KAAK,UAAU;AAAA,EACxB;AAAA,EAEA,IAAW,aAA8B;AACvC,WAAO,KAAK,UAAU;AAAA,EACxB;AAAA,EAEA,IAAW,aAAqB;AAC9B,WAAO,KAAK,UAAU;AAAA,EACxB;AAAA,EAEA,IAAW,YAAoB;AAC7B,WACEC,0BAAyB,KAAK,UAAU,UAAU,EAAE,aAAa;AAAA,EAErE;AAAA,EAEA,IAAW,OAAe;AACxB,WAAO,KAAK,UAAU;AAAA,EACxB;AAAA,EAEA,IAAW,SAAiC;AAC1C,WAAO,KAAK,UAAU;AAAA,EACxB;AAAA,EAEA,MAAM,eAAe,QAA6C;AAChE,WAAO,MAAM,KAAK,SAAS;AAAA,MACzB,YAAY,MAAM,yBAAyB,MAAM;AAAA,IACnD;AAAA,EACF;AAAA,EAEA,MAAM,eAAe,QAA+B;AAClD,UAAM,KAAK,SAAS,IAAI,YAAY,MAAM,yBAAyB,MAAM,CAAC;AAAA,EAC5E;AAAA,EAEA,MAAa,QACX,UAAuE,CAAC,GACnC;AACrC,WAAO,MAAM,KAAK;AAAA,MAChB,OAAO,aACL,MAAM,wBAAwB,UAAU;AAAA,QACtC,YAAY,KAAK,UAAU,oBAAoB,KAAK;AAAA,QACpD,GAAI,QAAQ,cAAc,SACtB,CAAC,IACD,EAAE,WAAW,QAAQ,UAAU;AAAA,MACrC,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAa,OACX,OACA,UAAyC,CAAC,GAChB;AAC1B,UAAM,oBAAoB,MAAM,KAAK;AAAA,MACnC,QAAQ;AAAA,MACR,QAAQ;AAAA,IACV;AACA,UAAM,SAAS,MAAM,KAAK;AAAA,MACxB,OAAO,aAAa;AAClB,cAAM,WAAW,MAAM,KAAK,sBAAsB,UAAU,SAAS;AAAA,UACnE;AAAA,QACF,CAAC;AACD,cAAM,yBAAyB,UAAU;AAAA,UACvC,GAAI,aAAa,SAAY,CAAC,IAAI,EAAE,SAAS;AAAA,UAC7C,GAAI,sBAAsB,SAAY,CAAC,IAAI,EAAE,kBAAkB;AAAA,QACjE,CAAC;AACD,eAAO,MAAM,mBAAmB,UAAU,OAAO;AAAA,UAC/C,GAAG,yBAAyB,OAAO;AAAA,UACnC,YAAY,KAAK;AAAA,UACjB,GAAI,aAAa,SAAY,CAAC,IAAI,EAAE,SAAS;AAAA,UAC7C,GAAI,sBAAsB,SAAY,CAAC,IAAI,EAAE,kBAAkB;AAAA,QACjE,CAAC;AAAA,MACH;AAAA,MACA;AAAA,QACE,4BAA4B;AAAA,QAC5B,GAAI,QAAQ,WAAW,SAAY,CAAC,IAAI,EAAE,QAAQ,QAAQ,OAAO;AAAA,MACnE;AAAA,IACF;AACA,WAAO;AAAA,MACL;AAAA,MACA,OAAO,QAAQ,gBACb,MAAM,KAAK,OAAO,OAAO;AAAA,QACvB,GAAG;AAAA,QACH;AAAA,QACA,GAAI,YAAY,UAAU,SACtB,CAAC,IACD,EAAE,OAAO,YAAY,MAAM;AAAA,QAC/B,GAAI,YAAY,WAAW,SACvB,CAAC,IACD,EAAE,QAAQ,YAAY,OAAO;AAAA,MACnC,CAAC;AAAA,MACH,CAAC,WACC,KAAK,eAAe;AAAA,QAClB,YAAY,KAAK;AAAA,QACjB,aAAa,KAAK;AAAA,QAClB,UAAU,QAAQ,YAAY;AAAA,QAC9B;AAAA,QACA,QAAQ;AAAA,QACR,YAAY,KAAK;AAAA,QACjB,MAAM;AAAA,QACN,GAAI,QAAQ,cAAc,SACtB,CAAC,IACD,EAAE,WAAW,QAAQ,UAAU;AAAA,QACnC,GAAI,QAAQ,kBAAkB,SAC1B,CAAC,IACD,EAAE,eAAe,QAAQ,cAAc;AAAA,QAC3C,GAAI,QAAQ,UAAU,SAAY,CAAC,IAAI,EAAE,OAAO,QAAQ,MAAM;AAAA,QAC9D,GAAI,QAAQ,UAAU,SAAY,CAAC,IAAI,EAAE,OAAO,QAAQ,MAAM;AAAA,QAC9D;AAAA,QACA,GAAI,QAAQ,cAAc,SACtB,CAAC,IACD,EAAE,WAAW,QAAQ,UAAU;AAAA,QACnC,GAAI,QAAQ,kBAAkB,SAC1B,CAAC,IACD,EAAE,eAAe,QAAQ,cAAc;AAAA,QAC3C,GAAI,QAAQ,kBAAkB,SAC1B,CAAC,IACD,EAAE,eAAe,QAAQ,cAAc;AAAA,QAC3C,GAAI,QAAQ,kBAAkB,SAC1B,CAAC,IACD,EAAE,eAAe,QAAQ,cAAc;AAAA,QAC3C,OAAO,QAAQ,SAAS;AAAA,MAC1B,CAAC;AAAA,MACH,CAAC,UAAU,KAAK,eAAe,KAAK;AAAA,IACtC;AAAA,EACF;AAAA,EAEA,MAAa,KACX,UAAuC,CAAC,GACmB;AAC3D,UAAM,SAAS,MAAM,KAAK,cAAc,OAAO,aAAa;AAC1D,UAAI,wBAAwB,KAAK,SAAS,GAAG;AAC3C,eAAO,MAAM,0BAA0B,UAAU,KAAK,WAAW;AAAA,UAC/D,GAAI,QAAQ,WAAW,SAAY,CAAC,IAAI,EAAE,QAAQ,QAAQ,OAAO;AAAA,UACjE,GAAI,QAAQ,UAAU,SAAY,CAAC,IAAI,EAAE,OAAO,QAAQ,MAAM;AAAA,QAChE,CAAC;AAAA,MACH;AACA,YAAM,WAAW,MAAM,KAAK,cAAc,UAAU,OAAO;AAC3D,aAAO,MAAM,sBAAsB,UAAU;AAAA,QAC3C,GAAG,yBAAyB,OAAO;AAAA,QACnC,GAAI,aAAa,SAAY,CAAC,IAAI,EAAE,SAAS;AAAA,MAC/C,CAAC;AAAA,IACH,GAAG,OAAO;AACV,QAAI,wBAAwB,KAAK,SAAS,GAAG;AAC3C,aAAO;AAAA,QACL;AAAA,QACA,OAAO,QAAQ,gBACZ,MAAM,KAAK,KAAK;AAAA,UACf,GAAG;AAAA,UACH;AAAA,UACA,GAAI,YAAY,UAAU,SACtB,CAAC,IACD,EAAE,OAAO,YAAY,MAAM;AAAA,UAC/B,GAAI,YAAY,WAAW,SACvB,CAAC,IACD,EAAE,QAAQ,YAAY,OAAO;AAAA,QACnC,CAAC;AAAA,QACH,CAAC,WACC,KAAK,eAAe;AAAA,UAClB,YAAY,KAAK;AAAA,UACjB,aAAa,KAAK;AAAA,UAClB;AAAA,UACA,QAAQ;AAAA,UACR,YAAY,KAAK;AAAA,UACjB,MAAM;AAAA,UACN,WAAW,KAAK;AAAA,QAClB,CAAC;AAAA,QACH,CAAC,UAAU,KAAK,eAAe,KAAK;AAAA,MACtC;AAAA,IACF;AACA,WAAO;AAAA,MACL;AAAA,MACA,OAAO,QAAQ,gBACZ,MAAM,KAAK,KAAK;AAAA,QACf,GAAG;AAAA,QACH;AAAA,QACA,GAAI,YAAY,UAAU,SACtB,CAAC,IACD,EAAE,OAAO,YAAY,MAAM;AAAA,QAC/B,GAAI,YAAY,WAAW,SACvB,CAAC,IACD,EAAE,QAAQ,YAAY,OAAO;AAAA,MACnC,CAAC;AAAA,MACH,CAAC,WACC,KAAK,eAAe;AAAA,QAClB,YAAY,KAAK;AAAA,QACjB,aAAa,KAAK;AAAA,QAClB,GAAI,QAAQ,cAAc,SACtB,CAAC,IACD,EAAE,WAAW,QAAQ,UAAU;AAAA,QACnC,UAAU,QAAQ,YAAY;AAAA,QAC9B;AAAA,QACA,GAAI,QAAQ,kBAAkB,SAC1B,CAAC,IACD,EAAE,eAAe,QAAQ,cAAc;AAAA,QAC3C,QAAQ;AAAA,QACR,KAAK,QAAQ,OAAO;AAAA,QACpB,YAAY,KAAK;AAAA,QACjB,MAAM;AAAA,QACN,OAAO,QAAQ,SAAS;AAAA,QACxB,GAAI,QAAQ,kBAAkB,SAC1B,CAAC,IACD,EAAE,eAAe,QAAQ,cAAc;AAAA,QAC3C,GAAI,QAAQ,kBAAkB,SAC1B,CAAC,IACD,EAAE,eAAe,QAAQ,cAAc;AAAA,QAC3C,OAAO,QAAQ,SAAS;AAAA,MAC1B,CAAC;AAAA,MACH,CAAC,UAAU,KAAK,eAAe,KAAK;AAAA,IACtC;AAAA,EACF;AAAA,EAEA,MAAa,kBACX,UAAoE,CAAC,GACtD;AACf,UAAM,oBAAoB,MAAM,KAAK,SAAS;AAAA,MAC5C;AAAA,MACA,QAAQ;AAAA,IACV;AACA,UAAM,KAAK;AAAA,MACT,OAAO,aAAa;AAClB,cAAM,WAAW,MAAM,KAAK,cAAc,UAAU,OAAO;AAC3D,cAAM,yBAAyB,UAAU;AAAA,UACvC,GAAI,aAAa,SAAY,CAAC,IAAI,EAAE,SAAS;AAAA,UAC7C,GAAI,sBAAsB,SAAY,CAAC,IAAI,EAAE,kBAAkB;AAAA,QACjE,CAAC;AAAA,MACH;AAAA,MACA;AAAA,QACE,4BAA4B;AAAA,QAC5B,GAAI,QAAQ,WAAW,SAAY,CAAC,IAAI,EAAE,QAAQ,QAAQ,OAAO;AAAA,MACnE;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAa,qBACX,UAAqC,CAAC,GACA;AACtC,WAAO,MAAM,KAAK;AAAA,MAChB,OAAO,cAAc;AAAA,QACnB,cAAc,MAAM,gCAAgC,QAAQ;AAAA,QAC5D,SAAS,MAAMC,6BAA4B,QAAQ;AAAA,MACrD;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAa,gBACX,UAA4C,CAAC,GACL;AACxC,UAAM,UAAU,MAAM,KAAK;AAAA,MACzB,OAAO,aAAa;AAClB,cAAM,QACJ,QAAQ,kBAAkB,OACtB,EAAE,UAAU,MAAM,+BAA+B,QAAQ,EAAE,IAC3D,CAAC;AACP,YAAI,MAAM,UAAU,WAAW,GAAG;AAChC,gBAAM,IAAI;AAAA,YACR;AAAA,UACF;AAAA,QACF;AACA,YAAI,MAAMA,6BAA4B,UAAU,KAAK,EAAG,QAAO;AAC/D,cAAM,0BAA0B,UAAU,QAAQ,YAAY,KAAK;AACnE,eAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,4BAA4B;AAAA,QAC5B,GAAI,QAAQ,WAAW,SAAY,CAAC,IAAI,EAAE,QAAQ,QAAQ,OAAO;AAAA,MACnE;AAAA,IACF;AACA,UAAM,KAAK,SAAS;AAAA,MAClB,YAAY,MAAM,4BAA4B,KAAK,IAAI;AAAA,MACvD,QAAQ;AAAA,IACV;AACA,WAAO,EAAE,QAAQ;AAAA,EACnB;AAAA,EAEA,MAAa,iBACX,UAAqC,CAAC,GACA;AACtC,UAAM,SAAS,MAAM,KAAK;AAAA,MACxB,OAAO,aAAa;AAClB,cAAM,SAAS,0BAA0B;AACzC,eAAO;AAAA,UACL,cAAc;AAAA,YACZ,OAAO,EAAE,SAAS,MAAM;AAAA,YACxB,SAAS;AAAA,UACX;AAAA,UACA,SAAS;AAAA,QACX;AAAA,MACF;AAAA,MACA;AAAA,QACE,4BAA4B;AAAA,QAC5B,GAAI,QAAQ,WAAW,SAAY,CAAC,IAAI,EAAE,QAAQ,QAAQ,OAAO;AAAA,MACnE;AAAA,IACF;AACA,UAAM,KAAK,SAAS;AAAA,MAClB,YAAY,MAAM,4BAA4B,KAAK,IAAI;AAAA,MACvD,QAAQ;AAAA,IACV;AACA,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,MAAa,oBACX,UAAqC,CAAC,GACvB;AACf,UAAM,KAAK,SAAS;AAAA,MAClB,YAAY,MAAM,4BAA4B,KAAK,IAAI;AAAA,MACvD,QAAQ;AAAA,IACV;AAAA,EACF;AAAA,EAEA,MAAa,aACX,UAAqC,CAAC,GACJ;AAClC,WAAO,MAAM,KAAK;AAAA,MAChB,OAAO,aAAa,MAAMC,cAAa,QAAQ;AAAA,MAC/C;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAa,WACX,MACA,UAAqC,CAAC,GACf;AACvB,WAAO,MAAM,KAAK,cAAc,OAAO,aAAa;AAClD,YAAM,YAAY,MAAM,2BAA2B,UAAU,IAAI;AACjE,aAAO,eAAe,MAAMA,cAAa,QAAQ,GAAG,SAAS;AAAA,IAC/D,GAAG,OAAO;AAAA,EACZ;AAAA,EAEA,MAAa,WAAW,SAII;AAC1B,WAAO,MAAM,KAAK,eAAe,OAAO,aAAa;AACnD,YAAM,kBAAkB,MAAM;AAAA,QAC5B;AAAA,QACA,QAAQ;AAAA,MACV;AACA,YAAM,gCAAgC;AAAA,QACpC,SAAS,KAAK,UAAU;AAAA,QACxB,WAAW;AAAA,QACX,OAAO,EAAE,MAAM,UAAU;AAAA,MAC3B,CAAC;AACD,UAAI,UAAU,MAAM,WAAW,UAAU;AAAA,QACvC,GAAI,oBAAoB,SAAY,CAAC,IAAI,EAAE,gBAAgB;AAAA,QAC3D,GAAI,QAAQ,UAAU,SAAY,CAAC,IAAI,EAAE,OAAO,QAAQ,MAAM;AAAA,MAChE,CAAC;AACD,UAAI,QAAQ,WAAW,QAAW;AAChC,kBAAU,MAAM;AAAA,UACd;AAAA,UACA,QAAQ;AAAA,UACR,aAAa,QAAQ,MAAM;AAAA,QAC7B;AAAA,MACF;AACA,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAAA,EAEA,MAAa,mBACX,MACA,MACyC;AACzC,WAAO,MAAM,KAAK,cAAc,OAAO,aAAa;AAClD,YAAM,YAAY,MAAM,2BAA2B,UAAU,IAAI;AACjE,YAAM,CAAC,UAAU,QAAQ,IAAI,MAAM,QAAQ,IAAI;AAAA,QAC7C,SAAS,eAAe,IAAI,WAAW,IAAI;AAAA,QAC3C,SAAS,QAAQ,YAAY,SAAS;AAAA,MACxC,CAAC;AACD,aAAO;AAAA,QACL,GAAI,aAAa,SACb,CAAC,IACD;AAAA,UACE,UAAU;AAAA,YACR,WAAW,SAAS;AAAA,YACpB,UAAU,SAAS;AAAA,YACnB,gBAAgB,SAAS;AAAA,UAC3B;AAAA,QACF;AAAA,QACJ;AAAA,QACA,SAAS,UAAU,mBAAmB;AAAA,QACtC;AAAA,QACA,SAAS,aAAa;AAAA,QACtB;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAa,sBACX,MACA,MAKC;AACD,WAAO,MAAM,KAAK,eAAe,OAAO,aAAa;AACnD,YAAM,YAAY,MAAM,2BAA2B,UAAU,IAAI;AACjE,YAAM,SAAS,eAAe,OAAO,WAAW,IAAI;AACpD,aAAO,EAAE,WAAW,SAAS,MAAM,KAAK;AAAA,IAC1C,CAAC;AAAA,EACH;AAAA,EAEA,MAAa,YACX,MACA,SACyB;AACzB,WAAO,MAAM,KAAK,eAAe,OAAO,aAAa;AACnD,YAAM,YAAY,MAAM,2BAA2B,UAAU,IAAI;AACjE,YAAM,CAAC,gBAAgB,iBAAiB,eAAe,IACrD,MAAM,QAAQ,IAAI;AAAA,QAChB,2BAA2B,UAAU,QAAQ,SAAS;AAAA,QACtD,2BAA2B,UAAU,QAAQ,UAAU;AAAA,QACvD,2BAA2B,UAAU,QAAQ,UAAU;AAAA,MACzD,CAAC;AACH,YAAM,gCAAgC;AAAA,QACpC,SAAS,KAAK,UAAU;AAAA,QACxB,WAAW;AAAA,QACX,OAAO,EAAE,MAAM,UAAU;AAAA,MAC3B,CAAC;AACD,aAAO,MAAM,YAAY,UAAU,WAAW;AAAA,QAC5C,GAAI,mBAAmB,SAAY,CAAC,IAAI,EAAE,eAAe;AAAA,QACzD,GAAI,oBAAoB,SAAY,CAAC,IAAI,EAAE,gBAAgB;AAAA,QAC3D,GAAI,oBAAoB,SAAY,CAAC,IAAI,EAAE,gBAAgB;AAAA,QAC3D,GAAI,QAAQ,UAAU,SAAY,CAAC,IAAI,EAAE,OAAO,QAAQ,MAAM;AAAA,QAC9D,GAAI,QAAQ,SAAS,SAAY,CAAC,IAAI,EAAE,MAAM,QAAQ,KAAK;AAAA,QAC3D,GAAI,QAAQ,SAAS,SAAY,CAAC,IAAI,EAAE,MAAM,QAAQ,KAAK;AAAA,MAC7D,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA,EAEA,MAAa,cAAc,MAAc,YAAY,OAAsB;AACzE,UAAM,KAAK,eAAe,OAAO,aAAa;AAC5C,YAAM,YAAY,MAAM,2BAA2B,UAAU,IAAI;AACjE,YAAM,gCAAgC;AAAA,QACpC,SAAS,KAAK,UAAU;AAAA,QACxB,WAAW;AAAA,QACX,OAAO,EAAE,MAAM,UAAU;AAAA,MAC3B,CAAC;AACD,YAAM,cAAc,UAAU,WAAW,EAAE,UAAU,CAAC;AAAA,IACxD,CAAC;AAAA,EACH;AAAA,EAEA,MAAa,aACX,MACA,OACyB;AACzB,WAAO,MAAM,KAAK,eAAe,OAAO,aAAa;AACnD,YAAM,YAAY,MAAM,2BAA2B,UAAU,IAAI;AACjE,YAAM;AAAA,QACJ,KAAK,UAAU;AAAA,QACf;AAAA,QACA;AAAA,MACF;AACA,aAAO,MAAM,aAAa,UAAU,WAAW,KAAK;AAAA,IACtD,CAAC;AAAA,EACH;AAAA,EAEA,MAAa,iBACX,MACA,QACA,UAAyC,CAAC,GACjB;AACzB,WAAO,MAAM,KAAK,eAAe,OAAO,aAAa;AACnD,YAAM,YAAY,MAAM,2BAA2B,UAAU,IAAI;AACjE,YAAM,wBAAwB;AAAA,QAC5B,SAAS,KAAK,UAAU;AAAA,QACxB,YAAY,CAAC,SAAS;AAAA,QACtB,WAAW;AAAA,MACb,CAAC;AACD,aAAO,MAAM;AAAA,QACX;AAAA,QACA;AAAA,QACA,aAAa,MAAM;AAAA,QACnB;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAa,kBACX,MACA,SACyB;AACzB,WAAO,MAAM,KAAK,eAAe,OAAO,aAAa;AACnD,YAAM,YAAY,MAAM,2BAA2B,UAAU,IAAI;AACjE,YAAM,wBAAwB;AAAA,QAC5B,SAAS,KAAK,UAAU;AAAA,QACxB,YAAY,CAAC,SAAS;AAAA,QACtB,WAAW;AAAA,QACX,gBAAgB;AAAA,MAClB,CAAC;AACD,aAAO,MAAM,kBAAkB,UAAU,WAAW,OAAO;AAAA,IAC7D,CAAC;AAAA,EACH;AAAA,EAEA,MAAa,gBACX,MACA,OACyB;AACzB,WAAO,MAAM,KAAK,eAAe,OAAO,aAAa;AACnD,YAAM,YAAY,MAAM,2BAA2B,UAAU,IAAI;AACjE,YAAM,wBAAwB;AAAA,QAC5B,SAAS,KAAK,UAAU;AAAA,QACxB,YAAY,CAAC,SAAS;AAAA,QACtB,WAAW;AAAA,MACb,CAAC;AACD,aAAO,MAAM,gBAAgB,UAAU,WAAW,KAAK;AAAA,IACzD,CAAC;AAAA,EACH;AAAA,EAEA,MAAa,iBAAuC;AAClD,WAAO,MAAM,KAAK;AAAA,MAChB,OAAO,aAAa,MAAM,eAAe,QAAQ;AAAA,IACnD;AAAA,EACF;AAAA,EAEA,MAAa,iBACX,MACA,UAAyC,CAAC,GACT;AACjC,WAAO,MAAM,KAAK;AAAA,MAChB,OAAO,aAAa;AAClB,YAAI,QAAQ,WAAW,MAAM;AAC3B,gBAAM,gCAAgC;AAAA,YACpC,SAAS,KAAK,UAAU;AAAA,YACxB,WAAW;AAAA,YACX,OAAO,EAAE,MAAM,UAAU;AAAA,UAC3B,CAAC;AAAA,QACH;AACA,eAAO,MAAM,iBAAiB,UAAU,MAAM;AAAA,UAC5C,QAAQ,QAAQ,UAAU;AAAA,QAC5B,CAAC;AAAA,MACH;AAAA,MACA,EAAE,qBAAqB,QAAQ,WAAW,KAAK;AAAA,IACjD;AAAA,EACF;AAAA,EAEA,MAAa,KACX,YAAY,KAAK,WACjB,UAAuC,CAAC,GAClB;AACtB,WAAO,MAAM,KAAK,SAAS;AAAA,MACzB,YACE,MAAM;AAAA,QACJ;AAAA,QACA,OAAO,qBACL,MAAM,KAAK;AAAA,UACT,OAAO,aACL,MAAM,gBAAgB,UAAU,WAAW;AAAA,YACzC,GAAG;AAAA,YACH,GAAG;AAAA,UACL,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACJ;AAAA,MACF,QAAQ;AAAA,IACV;AAAA,EACF;AAAA,EAEA,MAAa,QACX,YAAY,KAAK,WACjB,UAA0C,CAAC,GACd;AAC7B,QAAI,QAAQ,UAAU,QAAW;AAC/B,UAAI,QAAQ,cAAc,QAAW;AACnC,cAAM,IAAI,MAAM,+BAA+B;AAAA,MACjD;AACA,YAAMC,UAAS,MAAM,KAAK,cAAc,OAAO,aAAa;AAC1D,cAAM,WAAW,MAAM,KAAK,cAAc,UAAU,CAAC,CAAC;AACtD,eAAO,MAAM,0BAA0B,UAAU,WAAW;AAAA,UAC1D,GAAG,iBAAiB,OAAO;AAAA,UAC3B,GAAI,aAAa,SAAY,CAAC,IAAI,EAAE,SAAS;AAAA,QAC/C,CAAC;AAAA,MACH,GAAG,OAAO;AACV,aAAO;AAAA,QACLA;AAAA,QACA,OAAO,QAAQ,gBACb,MAAM,KAAK,QAAQ,WAAW;AAAA,UAC5B,GAAG;AAAA,UACH;AAAA,UACA,GAAI,YAAY,UAAU,SACtB,CAAC,IACD,EAAE,OAAO,YAAY,MAAM;AAAA,UAC/B,GAAI,YAAY,WAAW,SACvB,CAAC,IACD,EAAE,QAAQ,YAAY,OAAO;AAAA,QACnC,CAAC;AAAA,QACH,CAAC,WAAW,QAAQ,QAAQ,MAAM;AAAA,QAClC,MAAM,QAAQ,QAAQ;AAAA,MACxB;AAAA,IACF;AACA,UAAM,oBAAoB,MAAM,KAAK;AAAA,MACnC,QAAQ;AAAA,MACR,QAAQ;AAAA,IACV;AACA,UAAM,SAAS,MAAM,KAAK;AAAA,MACxB,OAAO,aAAa;AAClB,cAAM,WAAW,MAAM,KAAK,sBAAsB,UAAU,SAAS;AAAA,UACnE;AAAA,QACF,CAAC;AACD,cAAM,yBAAyB,UAAU;AAAA,UACvC,GAAI,aAAa,SAAY,CAAC,IAAI,EAAE,SAAS;AAAA,UAC7C,GAAI,sBAAsB,SAAY,CAAC,IAAI,EAAE,kBAAkB;AAAA,QACjE,CAAC;AACD,eAAO,MAAM,0BAA0B,UAAU,WAAW;AAAA,UAC1D,GAAG,iBAAiB,OAAO;AAAA,UAC3B,GAAI,sBAAsB,SAAY,CAAC,IAAI,EAAE,kBAAkB;AAAA,UAC/D,GAAI,aAAa,SAAY,CAAC,IAAI,EAAE,SAAS;AAAA,QAC/C,CAAC;AAAA,MACH;AAAA,MACA;AAAA,QACE,4BAA4B;AAAA,QAC5B,GAAI,QAAQ,WAAW,SAAY,CAAC,IAAI,EAAE,QAAQ,QAAQ,OAAO;AAAA,MACnE;AAAA,IACF;AACA,WAAO;AAAA,MACL;AAAA,MACA,OAAO,QAAQ,gBACb,MAAM,KAAK,QAAQ,WAAW;AAAA,QAC5B,GAAG;AAAA,QACH;AAAA,QACA,GAAI,YAAY,UAAU,SACtB,CAAC,IACD,EAAE,OAAO,YAAY,MAAM;AAAA,QAC/B,GAAI,YAAY,WAAW,SACvB,CAAC,IACD,EAAE,QAAQ,YAAY,OAAO;AAAA,MACnC,CAAC;AAAA,MACH,CAAC,WAAW,QAAQ,QAAQ,MAAM;AAAA,MAClC,MAAM,QAAQ,QAAQ;AAAA,IACxB;AAAA,EACF;AAAA,EAEA,MAAa,SACX,YAAY,KAAK,WACjB,UAA2C,CAAC,GACd;AAC9B,QAAI,QAAQ,UAAU,QAAW;AAC/B,UAAI,QAAQ,cAAc,QAAW;AACnC,cAAM,IAAI,MAAM,+BAA+B;AAAA,MACjD;AACA,YAAMA,UAAS,MAAM,KAAK,cAAc,OAAO,aAAa;AAC1D,cAAM,WAAW,MAAM,KAAK,cAAc,UAAU,CAAC,CAAC;AACtD,eAAO,MAAM,oBAAoB,UAAU,WAAW;AAAA,UACpD,GAAG,iBAAiB,OAAO;AAAA,UAC3B,GAAI,aAAa,SAAY,CAAC,IAAI,EAAE,SAAS;AAAA,QAC/C,CAAC;AAAA,MACH,GAAG,OAAO;AACV,aAAO;AAAA,QACLA;AAAA,QACA,OAAO,QAAQ,gBACb,MAAM,KAAK,SAAS,WAAW;AAAA,UAC7B,GAAG;AAAA,UACH;AAAA,UACA,GAAI,YAAY,UAAU,SACtB,CAAC,IACD,EAAE,OAAO,YAAY,MAAM;AAAA,UAC/B,GAAI,YAAY,WAAW,SACvB,CAAC,IACD,EAAE,QAAQ,YAAY,OAAO;AAAA,QACnC,CAAC;AAAA,QACH,CAAC,WAAW,QAAQ,QAAQ,MAAM;AAAA,QAClC,MAAM,QAAQ,QAAQ;AAAA,MACxB;AAAA,IACF;AACA,UAAM,oBAAoB,MAAM,KAAK;AAAA,MACnC,QAAQ;AAAA,MACR,QAAQ;AAAA,IACV;AACA,UAAM,SAAS,MAAM,KAAK;AAAA,MACxB,OAAO,aAAa;AAClB,cAAM,WAAW,MAAM,KAAK,sBAAsB,UAAU,SAAS;AAAA,UACnE;AAAA,QACF,CAAC;AACD,cAAM,yBAAyB,UAAU;AAAA,UACvC,GAAI,aAAa,SAAY,CAAC,IAAI,EAAE,SAAS;AAAA,UAC7C,GAAI,sBAAsB,SAAY,CAAC,IAAI,EAAE,kBAAkB;AAAA,QACjE,CAAC;AACD,eAAO,MAAM,oBAAoB,UAAU,WAAW;AAAA,UACpD,GAAG,iBAAiB,OAAO;AAAA,UAC3B,GAAI,sBAAsB,SAAY,CAAC,IAAI,EAAE,kBAAkB;AAAA,UAC/D,GAAI,aAAa,SAAY,CAAC,IAAI,EAAE,SAAS;AAAA,QAC/C,CAAC;AAAA,MACH;AAAA,MACA;AAAA,QACE,4BAA4B;AAAA,QAC5B,GAAI,QAAQ,WAAW,SAAY,CAAC,IAAI,EAAE,QAAQ,QAAQ,OAAO;AAAA,MACnE;AAAA,IACF;AACA,WAAO;AAAA,MACL;AAAA,MACA,OAAO,QAAQ,gBACb,MAAM,KAAK,SAAS,WAAW;AAAA,QAC7B,GAAG;AAAA,QACH;AAAA,QACA,GAAI,YAAY,UAAU,SACtB,CAAC,IACD,EAAE,OAAO,YAAY,MAAM;AAAA,QAC/B,GAAI,YAAY,WAAW,SACvB,CAAC,IACD,EAAE,QAAQ,YAAY,OAAO;AAAA,MACnC,CAAC;AAAA,MACH,CAAC,WAAW,QAAQ,QAAQ,MAAM;AAAA,MAClC,MAAM,QAAQ,QAAQ;AAAA,IACxB;AAAA,EACF;AAAA,EAEA,MAAa,KACX,YAAY,KAAK,WACjB,SAAS,KACT,UAAqC,CAAC,GAChB;AACtB,WAAO,MAAM,KAAK;AAAA,MAChB,OAAO,aAAa,MAAM,mBAAmB,UAAU,WAAW,MAAM;AAAA,MACxE;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAa,YACX,YACA,UAAqC,CAAC,GACM;AAC5C,WAAO,MAAM,KAAK;AAAA,MAChB,OAAO,aAAa,MAAM,SAAS,SAAS,OAAO,UAAU;AAAA,MAC7D;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAa,aACX,UAAqC,CAAC,GACP;AAC/B,WAAO,MAAM,KAAK;AAAA,MAChB,OAAO,aAAa,MAAM,SAAS,aAAa;AAAA,MAChD;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAa,gBACX,MACA,UAAwC,CAAC,GACtB;AACnB,WAAO,MAAM,KAAK,eAAe,OAAO,aAAa;AACnD,YAAM,SAAS,gBAAgB,IAAI;AACnC,aAAO;AAAA,IACT,GAAG,OAAO;AAAA,EACZ;AAAA,EAEA,MAAa,gBACX,OACA,UAAwC,CAAC,GACjB;AACxB,UAAM,aAAa,OAAO,KAAK,KAAK;AAEpC,QAAI,UAAU,QAAQ,eAAe,IAAI;AACvC,YAAM,IAAI,MAAM,gCAAgC;AAAA,IAClD;AACA,WAAO,MAAM,KAAK,eAAe,OAAO,aAAa;AACnD,UAAI,eAAe,MAAM;AACvB,cAAM,SAAS,SAAS,UAAU,IAAI,OAAO;AAAA,MAC/C,OAAO;AACL,cAAM,SAAS,SAAS;AAAA,UACtB,EAAE,MAAM,mBAAmB,SAAS,YAAY,GAAG;AAAA,UACnD;AAAA,UACA;AAAA,QACF;AAAA,MACF;AACA,aAAO;AAAA,IACT,GAAG,OAAO;AAAA,EACZ;AAAA,EAEA,MAAa,UACX,UAAqC,CAAC,GACM;AAC5C,UAAM,MAAM,IAAIC,WAAU,CAAC,CAAC;AAC5B,WAAO,MAAM,KAAK,SAAS;AAAA,MACzB,YACE,MAAM,IAAI;AAAA,QACR,KAAK,UAAU;AAAA,QACf,OAAO,YAAY,MAAM,QAAQ,UAAU;AAAA,MAC7C;AAAA,MACF,QAAQ;AAAA,IACV;AAAA,EACF;AAAA,EAEA,MAAa,gBACX,YACA,OACA,UAAwC,CAAC,GACG;AAC5C,WAAO,MAAM,KAAK,eAAe,OAAO,aAAa;AACnD,YAAM,SAAS,SAAS;AAAA,QACtB,0BAA0B,UAAU;AAAA,QACpC;AAAA,MACF;AACA,aAAO,MAAM,SAAS,SAAS,OAAO,UAAU;AAAA,IAClD,GAAG,OAAO;AAAA,EACZ;AAAA,EAEA,MAAa,YACX,YACA,KACA,OACA,UAAwC,CAAC,GACG;AAC5C,WAAO,MAAM,KAAK,eAAe,OAAO,aAAa;AACnD,YAAM,SAAS,SAAS;AAAA,QACtB,0BAA0B,UAAU;AAAA,QACpC;AAAA,QACA;AAAA,MACF;AACA,aAAO,MAAM,SAAS,SAAS,OAAO,UAAU;AAAA,IAClD,GAAG,OAAO;AAAA,EACZ;AAAA,EAEA,MAAa,eACX,YACA,KACA,UAAwC,CAAC,GACG;AAC5C,WAAO,MAAM,KAAK,eAAe,OAAO,aAAa;AACnD,YAAM,SAAS,SAAS,UAAU,YAAY,GAAG;AACjD,aAAO,MAAM,SAAS,SAAS,OAAO,UAAU;AAAA,IAClD,GAAG,OAAO;AAAA,EACZ;AAAA,EAEA,MAAa,cACX,YACA,UAAwC,CAAC,GACG;AAC5C,WAAO,MAAM,KAAK,eAAe,OAAO,aAAa;AACnD,YAAM,SAAS,SAAS,MAAM,UAAU;AACxC,aAAO,MAAM,SAAS,SAAS,OAAO,UAAU;AAAA,IAClD,GAAG,OAAO;AAAA,EACZ;AAAA,EAEA,MAAa,aACX,UAAoE,CAAC,GACzB;AAC5C,WAAO,MAAM,KAAK;AAAA,MAChB,OAAO,aACL,MAAM,oBAAoB,UAAU,KAAK,WAAW,QAAQ,KAAK;AAAA,MACnE;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,cACJ,WACA,UAAqC,CAAC,GAC1B;AACZ,WAAO,MAAM,KAAK,SAAS;AAAA,MACzB,YACE,MAAM,IAAIC,sBAAqB,KAAK,UAAU,WAAW,EAAE;AAAA,QACzD;AAAA,MACF;AAAA,MACF,QAAQ;AAAA,IACV;AAAA,EACF;AAAA,EAEA,MAAM,eACJ,WACA,UAAwC,CAAC,GAC7B;AACZ,WAAO,MAAM,KAAK,SAAS,IAAI,YAAY;AACzC,aAAO,MAAM,8BAA8B,KAAK,WAAW,WAAW;AAAA,QACpE,GAAI,QAAQ,qBAAqB,SAC7B,CAAC,IACD,EAAE,kBAAkB,QAAQ,iBAAiB;AAAA,QACjD,GAAI,QAAQ,wBAAwB,SAChC,CAAC,IACD,EAAE,qBAAqB,QAAQ,oBAAoB;AAAA,QACvD,GAAI,QAAQ,+BAA+B,SACvC,CAAC,IACD;AAAA,UACE,4BAA4B,QAAQ;AAAA,QACtC;AAAA,MACN,CAAC;AAAA,IACH,GAAG,QAAQ,MAAM;AAAA,EACnB;AAAA,EAEA,MAAM,cACJ,UACA,SACwC;AACxC,QAAI,QAAQ,aAAa,OAAW,QAAO,QAAQ;AACnD,YAAQ,MAAM,oBAAoB,UAAU,KAAK,WAAW,QAAQ,KAAK,IACrE;AAAA,EACN;AAAA,EAEA,MAAM,sBACJ,UACA,SAIA,cAGwC;AACxC,UAAM,WAAW,MAAM,KAAK,cAAc,UAAU,OAAO;AAC3D,UAAM,kBAAkB;AAAA,MACtB,GAAI,aAAa,SAAY,CAAC,IAAI,EAAE,SAAS;AAAA,MAC7C,GAAI,aAAa,sBAAsB,SACnC,CAAC,IACD,EAAE,mBAAmB,aAAa,kBAAkB;AAAA,MACxD,0BAA0B;AAAA,MAC1B,GAAI,QAAQ,cAAc,SACtB,CAAC,IACD,EAAE,WAAW,QAAQ,UAAU;AAAA,IACrC;AACA,QAAI,QAAQ,kBAAkB,MAAM;AAClC,YAAM,iCAAiC,UAAU,eAAe;AAChE,aAAO;AAAA,IACT;AACA,UAAM,YAAY,MAAM,+BAA+B,UAAU;AAAA,MAC/D,GAAG;AAAA,IACL,CAAC;AACD,QAAI,UAAU,WAAW,GAAG;AAC1B,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,+BACJ,WACA,QACmD;AACnD,QAAI,cAAc,MAAO,QAAO;AAChC,UAAM,WAAW,MAAM,KAAK,SAAS;AAAA,MACnC;AAAA,MACA;AAAA,IACF;AACA,QAAI,cAAc,eAAe,aAAa,QAAW;AACvD,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACF;AAEA,eAAe,yBACb,UACA,UAGI,CAAC,GACU;AACf,QAAM,QACJ,QAAQ,aAAa,SAAY,CAAC,IAAI,EAAE,UAAU,QAAQ,SAAS;AACrE,MAAI,MAAMJ,6BAA4B,UAAU,KAAK,EAAG;AACxD,QAAM,0BAA0B,UAAU,QAAW;AAAA,IACnD,GAAG;AAAA,IACH,GAAI,QAAQ,sBAAsB,SAC9B,CAAC,IACD,EAAE,mBAAmB,QAAQ,kBAAkB;AAAA,EACrD,CAAC;AACH;AAEA,eAAe,oBACb,UACA,WACA,OAC4C;AAC5C,QAAM,SAAS,sBAAsB,SAAS;AAC9C,MACE,WAAW,UACV,OAAO,SAAS,gBAAgB,UAAU,QAC3C;AACA,WAAO;AAAA,EACT;AACA,QAAM,WAAW,MAAMC,cAAa,QAAQ;AAC5C,QAAM,UACJ,OAAO,SAAS,eACZ,SAAS,OAAO,CAAC,YAAY,QAAQ,SAAS,KAAM,IACpD;AAAA,IACE;AAAA,IACA,MAAM,2BAA2B,UAAU,OAAO,WAAW;AAAA,IAC7D;AAAA,EACF;AACN,SAAO,EAAE,YAAY,QAAQ,IAAI,CAAC,UAAU,MAAM,SAAS,GAAG,QAAQ;AACxE;AAEA,SAAS,sBACP,WAIY;AACZ,MAAI,cAAc,oBAAoB,cAAc,mBAAmB;AACrE,WAAO,EAAE,MAAM,aAAa;AAAA,EAC9B;AACA,QAAM,QAAQ,wCAAwC,KAAK,SAAS;AACpE,SAAO,QAAQ,CAAC,MAAM,SAClB,SACA,EAAE,aAAa,mBAAmB,MAAM,CAAC,CAAC,GAAG,MAAM,UAAU;AACnE;AAEA,SAAS,qBACP,UACA,eACA,OACyB;AACzB,QAAM,OAAO,SAAS,KAAK,CAAC,YAAY,QAAQ,cAAc,aAAa;AAC3E,MAAI,SAAS,QAAW;AACtB,UAAM,IAAI,MAAM,WAAW,aAAa,kBAAkB;AAAA,EAC5D;AACA,QAAM,SAAS,GAAG,KAAK,IAAI;AAC3B,SAAO,SAAS;AAAA,IACd,CAAC,YACC,QAAQ,cAAc,KAAK,aAC1B,QAAQ,KAAK,WAAW,MAAM,MAC5B,UAAU,UAAa,QAAQ,QAAQ,KAAK,SAAS;AAAA,EAC5D;AACF;AAEA,eAAe,uBAAuB,MAA6B;AACjE,QAAM,gBAAgB,MAAM;AAAA,IAC1BT,MAAK,OAAO,GAAG,0BAA0B;AAAA,EAC3C;AACA,MAAI;AACF,UAAM,YAAY,IAAI,cAAc,aAAa;AACjD,UAAM,WAAW,MAAM,kBAAkB,KAAK,SAAS;AACvD,QAAI;AACF,YAAM,SAAS,YAAY,OAAO,mBAAmB;AACnD,cAAM,eAAe,SAAS,EAAE,OAAO,CAAC,GAAG,SAAS,iBAAiB,CAAC;AAAA,MACxE,CAAC;AAAA,IACH,UAAE;AACA,YAAM,SAAS,QAAQ;AAAA,IACzB;AACA,UAAM,iBAAiB,WAAW,IAAI,SAAS,IAAI,CAAC;AAAA,EACtD,UAAE;AACA,UAAMM,IAAG,eAAe,EAAE,OAAO,MAAM,WAAW,KAAK,CAAC;AAAA,EAC1D;AACF;AAEA,SAAS,kBAAkB,OAAgD;AACzE,SACE,iBAAiB,SACjB,UAAU,SACT,MAAgC,SAAS;AAE9C;AAEA,eAAe,eAAe,MAAgC;AAC5D,MAAI;AACF,UAAMO,MAAK,IAAI;AACf,WAAO;AAAA,EACT,SAAS,OAAO;AACd,QAAI,kBAAkB,KAAK,EAAG,QAAO;AACrC,UAAM;AAAA,EACR;AACF;AAEA,SAAS,kBAAkB,OAAgD;AACzE,SACE,iBAAiB,SACjB,UAAU,SACT,MAAgC,SAAS;AAE9C;AAEA,SAAS,0BAA0B,YAA0C;AAC3E,MAAI,eAAe,IAAI;AACrB,WAAO,EAAE,MAAM,mBAAmB,SAAS,WAAW;AAAA,EACxD;AACA,QAAM,UAAU,qCAAqC,KAAK,UAAU;AACpE,MAAI,UAAU,CAAC,MAAM,QAAW;AAC9B,WAAO;AAAA,MACL,WAAW,OAAO,QAAQ,CAAC,CAAC;AAAA,MAC5B,MAAM,mBAAmB;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AACA,QAAM,QAAQ,0BAA0B,KAAK,UAAU;AACvD,MAAI,QAAQ,CAAC,MAAM,QAAW;AAC5B,WAAO;AAAA,MACL,SAAS,OAAO,MAAM,CAAC,CAAC;AAAA,MACxB,MAAM,mBAAmB;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AACA,QAAM,SAAS,4BAA4B,KAAK,UAAU;AAC1D,MAAI,SAAS,CAAC,MAAM,QAAW;AAC7B,WAAO;AAAA,MACL,WAAW,OAAO,CAAC;AAAA,MACnB,MAAM,mBAAmB;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AACA,QAAM,SAAS,qDAAqD;AAAA,IAClE;AAAA,EACF;AACA,MAAI,SAAS,CAAC,MAAM,QAAW;AAC7B,WAAO;AAAA,MACL,MAAM,mBAAmB;AAAA,MACzB;AAAA,MACA,iBAAiB,OAAO,CAAC;AAAA,MACzB,iBAAiB,mBAAmB,OAAO,CAAC,CAAE;AAAA,MAC9C,kBAAkB,OAAO,CAAC;AAAA,IAC5B;AAAA,EACF;AACA,SAAO,EAAE,MAAM,mBAAmB,QAAQ,WAAW;AACvD;AAEA,SAAS,iBACP,SACmB;AACnB,QAAM,EAAE,QAAQ,SAAS,GAAG,KAAK,IAAI;AACrC,SAAO;AACT;AAEA,SAAS,yBAEP,SAAsD;AACtD,QAAM;AAAA,IACJ,UAAU;AAAA,IACV,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,GAAG;AAAA,EACL,IAAI;AACJ,SAAO;AACT;AAEA,eAAe,2BACb,UACA,MAC6B;AAC7B,SAAO,SAAS,SACZ,SACA,MAAM,2BAA2B,UAAU,IAAI;AACrD;AAEA,SAAS,eACP,UACA,WACc;AACd,QAAM,UAAU,SAAS,KAAK,CAAC,UAAU,MAAM,cAAc,SAAS;AACtE,MAAI,YAAY,QAAW;AACzB,UAAM,IAAI,MAAM,uBAAuB,SAAS,kBAAkB;AAAA,EACpE;AACA,SAAO;AACT;AAEA,SAAS,aAAa,MAAqC;AACzD,SAAOC,UAAS,KAAK,CAAC,IAAI,CAAC;AAC7B;AAEA,eAAe,0BACb,SACA,WACA,OACe;AACf,MAAI,UAAU,WAAW;AACvB,UAAM,wBAAwB;AAAA,MAC5B;AAAA,MACA,YAAY,CAAC,SAAS;AAAA,MACtB,WAAW;AAAA,IACb,CAAC;AACD;AAAA,EACF;AACA,MAAI,UAAU,WAAW;AACvB,UAAM,wBAAwB;AAAA,MAC5B;AAAA,MACA,YAAY,CAAC,SAAS;AAAA,MACtB,WAAW;AAAA,MACX,gBAAgB;AAAA,IAClB,CAAC;AAAA,EACH;AACA,QAAM,wBAAwB;AAAA,IAC5B;AAAA,IACA,YAAY,CAAC,SAAS;AAAA,IACtB,WAAW;AAAA,IACX,gBAAgB;AAAA,EAClB,CAAC;AACH;;;AgBh9CA,SAAS,aAAa;AAKf,IAAM,6BAAqD;AAAA,EAChE,KAAK,OAAO,EAAE,MAAM,SAAS,OAAO,UAAU,OAAO,MACnD,MAAM,IAAI,QAAQ,CAACC,UAAS,WAAW;AACrC,YAAQ,eAAe;AACvB,UAAM,QAAQ,MAAM,SAAS,CAAC,GAAG,IAAI,GAAG;AAAA,MACtC,OAAO,CAAC,QAAQ,QAAQ,MAAM;AAAA,IAChC,CAAC;AACD,UAAM,SAAuB,CAAC;AAC9B,QAAI,cAAc,QAAQ,QAAQ;AAClC,QAAI,UAAU;AACd,UAAM,SAAS,CAAC,cAAgC;AAC9C,UAAI,QAAS;AACb,gBAAU;AACV,cAAQ,oBAAoB,SAAS,KAAK;AAC1C,gBAAU;AAAA,IACZ;AACA,UAAM,QAAQ,MAAY;AACxB,YAAM,KAAK;AACX,aAAO,MAAM,OAAO,WAAW,MAAM,CAAC,CAAC;AAAA,IACzC;AACA,YAAQ,iBAAiB,SAAS,OAAO,EAAE,MAAM,KAAK,CAAC;AAEvD,UAAM,OAAO,YAAY,MAAM;AAC/B,UAAM,OAAO,GAAG,QAAQ,CAAC,UAAkB;AACzC,UAAI,QAAS;AACb,YAAM,OAAO,MAAM;AACnB,oBAAc,YACX,KAAK,YAAY,MAAM,SAAS,KAAK,CAAC,EACtC,KAAK,MAAM;AACV,cAAM,OAAO,OAAO;AAAA,MACtB,CAAC,EACA,MAAM,CAAC,UAAmB;AACzB,cAAM,KAAK;AACX;AAAA,UAAO,MACL,OAAO,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC,CAAC;AAAA,QAClE;AAAA,MACF,CAAC;AAAA,IACL,CAAC;AACD,UAAM,OAAO,GAAG,QAAQ,CAAC,UAAsB,OAAO,KAAK,KAAK,CAAC;AACjE,UAAM,GAAG,SAAS,CAAC,UAAU;AAC3B;AAAA,QAAO,MACL;AAAA,UACE,IAAI,MAAM,sCAAsC,MAAM,OAAO,EAAE;AAAA,QACjE;AAAA,MACF;AAAA,IACF,CAAC;AACD,UAAM,GAAG,SAAS,CAAC,aAAa;AAC9B,WAAK,YAAY,KAAK,MAAM;AAC1B;AAAA,UAAO,MACLA,SAAQ;AAAA,YACN;AAAA,YACA,QAAQ,OAAO,OAAO,MAAM,EAAE,SAAS,MAAM;AAAA,UAC/C,CAAC;AAAA,QACH;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AACD,UAAM,MAAM,IAAI,KAAK;AAAA,EACvB,CAAC;AACL;AAEA,SAAS,WAAW,QAAwC;AAC1D,SAAO,QAAQ,kBAAkB,QAC7B,OAAO,SACP,IAAI,MAAM,4BAA4B;AAC5C;;;AC0GA,SAAS,kBAAkB;AAC3B,SAAS,4BAA4B;AA9I9B,IAAM,yBAAN,MAA6B;AAAA,EACzB;AAAA,EAEF,YAAY,SAA8B;AAC/C,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,MAAa,IACX,SACA,UAA8C,CAAC,GACnB;AAC5B,UAAM,QAAQ,MAAM,KAAK,SAAS;AAAA,MAChC,YAAY,MAAM,uBAAuB,OAAO;AAAA,IAClD;AACA,WAAO,QAAQ,gBAAgB,OAC3B,uBAAuB,SAAS,KAAK,IACrC;AAAA,EACN;AAAA,EAEA,MAAa,QACX,SACA,OAC4B;AAC5B,WAAO,MAAM,KAAK,SAAS;AAAA,MACzB,YAAY,MAAM,0BAA0B,SAAS,KAAK;AAAA,IAC5D;AAAA,EACF;AAAA,EAEA,MAAa,IACX,SACA,KACA,OAC4B;AAC5B,WAAO,MAAM,KAAK,SAAS;AAAA,MACzB,YAAY,MAAM,oBAAoB,SAAS,KAAK,KAAK;AAAA,IAC3D;AAAA,EACF;AAAA,EAEA,MAAa,OACX,SACA,KAC4B;AAC5B,WAAO,MAAM,KAAK,SAAS;AAAA,MACzB,YAAY,MAAM,uBAAuB,SAAS,GAAG;AAAA,IACvD;AAAA,EACF;AAAA,EAEA,MAAa,MAAM,SAAyD;AAC1E,WAAO,MAAM,KAAK,SAAS;AAAA,MACzB,YAAY,MAAM,wBAAwB,OAAO;AAAA,IACnD;AAAA,EACF;AAAA,EAEA,MAAa,UAAgD;AAC3D,WAAO,MAAM,KAAK,SAAS,IAAI,YAAY;AACzC,YAAM,YAAY,KAAK,IAAI;AAC3B,YAAM,MAAM,MAAM,uBAAuB,KAAK;AAC9C,YAAM,SAAS;AAAA,QACb,GAAI,OAAO,IAAI,WAAW,WAAW,EAAE,QAAQ,IAAI,OAAO,IAAI,CAAC;AAAA,QAC/D,GAAI,OAAO,IAAI,YAAY,WAAW,EAAE,SAAS,IAAI,QAAQ,IAAI,CAAC;AAAA,QAClE,GAAI,OAAO,IAAI,UAAU,WAAW,EAAE,OAAO,IAAI,MAAM,IAAI,CAAC;AAAA,QAC5D,GAAI,OAAO,IAAI,SAAS,WAAW,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;AAAA,QACzD,GAAI,OAAO,IAAI,aAAa,WACxB,EAAE,UAAU,cAAc,IAAI,QAAQ,EAAE,IACxC,CAAC;AAAA,MACP;AACA,YAAM,UAAU,yBAAyB,EAAE,KAAK,OAAO,CAAC;AACxD,YAAM,SAAS,WAAW;AAAA,QACxB,YAAY;AAAA,QACZ,UAAU,CAAC,EAAE,SAAS,0BAA0B,MAAM,OAAO,CAAC;AAAA,QAC9D,OAAO,QAAQ;AAAA,QACf,aAAa;AAAA,MACf,CAAC;AACD,YAAM,SAAmB,CAAC;AAC1B,uBAAiB,SAAS,OAAO,WAAY,QAAO,KAAK,KAAK;AAC9D,aAAO;AAAA,QACL,YAAY,KAAK,IAAI,IAAI;AAAA,QACzB,GAAI,OAAO,UAAU,SAAY,CAAC,IAAI,EAAE,OAAO,OAAO,MAAM;AAAA,QAC5D,GAAI,OAAO,aAAa,SAAY,CAAC,IAAI,EAAE,UAAU,OAAO,SAAS;AAAA,QACrE,UAAU,OAAO,KAAK,EAAE,EAAE,KAAK;AAAA,MACjC;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAa,gBAAsD;AACjE,WAAO,MAAM,KAAK,SAAS,IAAI,YAAY;AACzC,YAAM,YAAY,KAAK,IAAI;AAC3B,YAAM,SAAS,MAAM;AAAA,QACnB;AAAA,QACA,MAAM,6BAA6B;AAAA,MACrC;AACA,aAAO;AAAA,QACL,YAAY,OAAO;AAAA,QACnB,YAAY,KAAK,IAAI,IAAI;AAAA,QACzB,OAAO,OAAO;AAAA,QACd,UAAU,OAAO;AAAA,QACjB,GAAI,OAAO,OAAO,WAAW,SACzB,CAAC,IACD,EAAE,QAAQ,OAAO,MAAM,OAAO;AAAA,MACpC;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAa,gBAAsD;AACjE,WAAO,MAAM,KAAK,SAAS,IAAI,YAAY;AACzC,YAAM,QAAQ,MAAM,uBAAuB,WAAW;AACtD,YAAM,WAAW,uBAAuB,KAAK;AAC7C,UAAI,aAAa,QAAW;AAC1B,cAAM,IAAI,MAAM,uCAAuC;AAAA,MACzD;AACA,YAAM,SAAS,MAAM,qBAAqB;AAAA,QACxC,GAAG;AAAA,QACH,GAAI,SAAS,aAAa,QACtB,EAAE,eAAe,2BAA2B,IAC5C,CAAC;AAAA,MACP,CAAC;AACD,aAAO;AAAA,QACL,YAAY,OAAO;AAAA,QACnB,GAAI,SAAS,aAAa,UACtB,EAAE,UAAU,SAAS,SAAS,IAC9B,CAAC;AAAA,QACL,GAAI,OAAO,aAAa,SAAY,CAAC,IAAI,EAAE,UAAU,OAAO,SAAS;AAAA,QACrE,UAAU,SAAS;AAAA,MACrB;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAEA,SAAS,cAAc,OAAkC;AACvD,MACE,UAAU,eACV,UAAU,YACV,UAAU,YACV,UAAU,qBACV;AACA,WAAO;AAAA,EACT;AACA,QAAM,IAAI;AAAA,IACR,yBAAyB,KAAK;AAAA,EAChC;AACF;;;AC9KA;AAAA,EACE,4BAAAC;AAAA,EACA,sBAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA,yBAAAC;AAAA,EACA,uBAAAC;AAAA,EACA,6BAAAC;AAAA,EACA,6BAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,wBAAAC;AAAA,OAYK;AAsFA,IAAM,+BAAN,MAAmC;AAAA,EAC/B;AAAA,EAEF,YAAY,SAA8B;AAC/C,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,MAAa,KACX,SACoC;AACpC,WAAO,MAAM,KAAK,SAAS;AAAA,MACzB,YAAY,MAAM,KAAK,MAAM,OAAO;AAAA,MACpC,QAAQ;AAAA,IACV;AAAA,EACF;AAAA,EAEA,MAAa,OACX,SACA,QACwB;AACxB,QAAI,WAAW,QAAQ,WAAW,OAAW,QAAO;AACpD,WAAO,MAAM,KAAK,SAAS;AAAA,MACzB,YACE,MAAMC;AAAA,QACJ,0BAA0B,SAAS,MAAM;AAAA,MAC3C;AAAA,IACJ;AAAA,EACF;AAAA,EAEA,MAAM,MACJ,SACoC;AACpC,UAAM,SAAS,MAAM,uBAAuB,QAAQ,MAAM;AAC1D,UAAM,qBACJ,QAAQ,WAAW,SACf,SACC,EAAE,GAAG,QAAQ,QAAQ,QAAQ,OAAO;AAC3C,UAAM,QAAQ,QAAQ,SAAS;AAC/B,QAAI,QAAQ,YAAY,QAAW;AACjC,YAAM,WAAW,MAAM,gCAAgC,QAAQ,OAAO;AACtE,YAAM,oBAAoB,qBAAqB,MAAM;AACrD,UAAI,SAAS,gBAAgB,mBAAmB;AAC9C,cAAM,IAAI;AAAA,UACR,uBAAuB,QAAQ,MAAM,eAAe,iBAAiB,SAAS,SAAS,WAAW;AAAA,QACpG;AAAA,MACF;AAAA,IACF;AAEA,UAAM,SACJ,OAAO,WAAW,SAAS,kBACvB,MAAM,sBAAsB,QAAQ,KAAK,IACzC,MAAM,sBAAsB,QAAQ,KAAK;AAC/C,UAAM,gBAAgB,MAAM,oBAAoB,oBAAoB,MAAM;AAC1E,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,QAAQ,mBAAmB;AAAA,MAC3B,MAAM,OAAO;AAAA,MACb;AAAA,MACA,QAAQ;AAAA,IACV;AAAA,EACF;AACF;AAEA,eAAe,sBACb,QACA,OAOA;AACA,QAAM,oBACJ,OAAO,SAAS,cAAc,OAAO,SAAS,YAC1C,MAAM,+BAA+B,MAAM,IAC3C;AACN,QAAM,WAAW,MAAM;AAAA,IACrB,gCAAgC,qBAAqB,MAAM,CAAC;AAAA,EAC9D;AACA,SAAO,MAAM,IAAIC,sBAAqB,SAAS,WAAW,EAAE;AAAA,IAC1D,OAAO,aAAa;AAClB,cAAQ,OAAO,MAAM;AAAA,QACnB,KAAK;AACH,iBAAO,MAAMC,2BAA0B,UAAU,OAAO,WAAW;AAAA,YACjE,QAAQ,OAAO;AAAA,YACf;AAAA,UACF,CAAC;AAAA,QACH,KAAK;AACH,iBAAO,MAAMC;AAAA,YACX;AAAA,YACA,wBAAwB,QAAQ,KAAK;AAAA,UACvC;AAAA,QACF,KAAK;AACH,iBAAO,MAAMC;AAAA,YACX;AAAA,YACA,OAAO,SAAS;AAAA,YAChB,MAAM,kBAAkB,QAAQ,KAAK;AAAA,UACvC;AAAA,QACF,KAAK;AACH,iBAAO,MAAMC,qBAAoB,UAAU,OAAO,WAAW;AAAA,YAC3D,GAAI,OAAO,aAAa,OAAO,CAAC,IAAI,EAAE,UAAU,OAAO,SAAS;AAAA,YAChE,QAAQ,OAAO;AAAA,YACf;AAAA,YACA,OAAO,OAAO;AAAA,YACd,GAAI,OAAO,UAAU,SAAY,CAAC,IAAI,EAAE,OAAO,OAAO,MAAM;AAAA,YAC5D,GAAI,OAAO,cAAc,SACrB,CAAC,IACD,EAAE,WAAW,OAAO,UAAU;AAAA,YAClC,GAAI,sBAAsB,SAAY,CAAC,IAAI,EAAE,kBAAkB;AAAA,YAC/D,GAAI,OAAO,kBAAkB,SACzB,CAAC,IACD,EAAE,eAAe,OAAO,cAAc;AAAA,YAC1C,GAAI,OAAO,kBAAkB,SACzB,CAAC,IACD,EAAE,eAAe,OAAO,cAAc;AAAA,UAC5C,CAAC;AAAA,QACH,KAAK;AACH,iBAAO,MAAMC,2BAA0B,UAAU,OAAO,WAAW;AAAA,YACjE,GAAI,OAAO,aAAa,OAAO,CAAC,IAAI,EAAE,UAAU,OAAO,SAAS;AAAA,YAChE,QAAQ,OAAO;AAAA,YACf,GAAI,OAAO,kBAAkB,SACzB,CAAC,IACD,EAAE,eAAe,OAAO,cAAc;AAAA,YAC1C;AAAA,YACA,OAAO,OAAO;AAAA,YACd,GAAI,OAAO,UAAU,SAAY,CAAC,IAAI,EAAE,OAAO,OAAO,MAAM;AAAA,YAC5D,GAAI,OAAO,cAAc,SACrB,CAAC,IACD,EAAE,WAAW,OAAO,UAAU;AAAA,YAClC,GAAI,sBAAsB,SAAY,CAAC,IAAI,EAAE,kBAAkB;AAAA,YAC/D,GAAI,OAAO,SAAS,SAAY,CAAC,IAAI,EAAE,MAAM,OAAO,KAAK;AAAA,YACzD,GAAI,OAAO,kBAAkB,SACzB,CAAC,IACD,EAAE,eAAe,OAAO,cAAc;AAAA,YAC1C,GAAI,OAAO,kBAAkB,SACzB,CAAC,IACD,EAAE,eAAe,OAAO,cAAc;AAAA,UAC5C,CAAC;AAAA,MACL;AAAA,IACF;AAAA,EACF;AACF;AAEA,eAAe,sBACb,QACA,OAMA;AACA,QAAM,oBACJ,OAAO,SAAS,cAAc,OAAO,SAAS,YAC1C,MAAM,+BAA+B,MAAM,IAC3C;AACN,MAAI,OAAO,SAAS,mBAAmB;AACrC,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,MAAI,OAAO,WAAW,SAAS,iBAAiB;AAC9C,UAAM,IAAI,MAAM,kDAAkD;AAAA,EACpE;AACA,QAAM,SAAS,MAAM;AAAA,IACnB,OAAO,WAAW;AAAA,EACpB;AACA,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK;AACH,aAAO,OAAO,oBAAoB,MAAM,MAAM,oBAC1C;AAAA,QACE;AAAA,QACA,wBAAwB,QAAQ,KAAK;AAAA,MACvC,IACA;AAAA,QACE;AAAA,QACA,wBAAwB,QAAQ,KAAK;AAAA,MACvC;AAAA,IACN,KAAK;AACH,aAAO,OAAO,oBAAoB,MAAM,MAAM,oBAC1C;AAAA,QACE;AAAA,QACA,OAAO,SAAS;AAAA,QAChB,MAAM,kBAAkB,QAAQ,KAAK;AAAA,MACvC,IACA;AAAA,QACE;AAAA,QACA,OAAO,SAAS;AAAA,QAChB,MAAM,kBAAkB,QAAQ,KAAK;AAAA,MACvC;AAAA,IACN,KAAK;AACH,aAAO,MAAM,6BAA6B,QAAQ,OAAO,WAAW;AAAA,QAClE,QAAQ,OAAO;AAAA,QACf;AAAA,QACA,OAAO,OAAO;AAAA,QACd,GAAI,OAAO,UAAU,SAAY,CAAC,IAAI,EAAE,OAAO,OAAO,MAAM;AAAA,QAC5D,GAAI,OAAO,cAAc,SACrB,CAAC,IACD,EAAE,WAAW,OAAO,UAAU;AAAA,QAClC,GAAI,sBAAsB,SAAY,CAAC,IAAI,EAAE,kBAAkB;AAAA,QAC/D,GAAI,OAAO,kBAAkB,SACzB,CAAC,IACD,EAAE,eAAe,OAAO,cAAc;AAAA,QAC1C,GAAI,OAAO,kBAAkB,SACzB,CAAC,IACD,EAAE,eAAe,OAAO,cAAc;AAAA,MAC5C,CAAC;AAAA,IACH,KAAK;AACH,aAAO,MAAM;AAAA,QACX;AAAA,QACA,OAAO;AAAA,QACP;AAAA,UACE,QAAQ,OAAO;AAAA,UACf,GAAI,OAAO,kBAAkB,SACzB,CAAC,IACD,EAAE,eAAe,OAAO,cAAc;AAAA,UAC1C;AAAA,UACA,OAAO,OAAO;AAAA,UACd,GAAI,OAAO,UAAU,SAAY,CAAC,IAAI,EAAE,OAAO,OAAO,MAAM;AAAA,UAC5D,GAAI,OAAO,cAAc,SACrB,CAAC,IACD,EAAE,WAAW,OAAO,UAAU;AAAA,UAClC,GAAI,sBAAsB,SAAY,CAAC,IAAI,EAAE,kBAAkB;AAAA,UAC/D,GAAI,OAAO,SAAS,SAAY,CAAC,IAAI,EAAE,MAAM,OAAO,KAAK;AAAA,UACzD,GAAI,OAAO,kBAAkB,SACzB,CAAC,IACD,EAAE,eAAe,OAAO,cAAc;AAAA,UAC1C,GAAI,OAAO,kBAAkB,SACzB,CAAC,IACD,EAAE,eAAe,OAAO,cAAc;AAAA,QAC5C;AAAA,MACF;AAAA,EACJ;AACF;AAEA,SAAS,wBACP,QACA,OAC0B;AAC1B,SAAO;AAAA,IACL,GAAI,OAAO,cAAc,SAAY,CAAC,IAAI,EAAE,WAAW,OAAO,UAAU;AAAA,IACxE,GAAI,OAAO,aAAa,OAAO,CAAC,IAAI,EAAE,UAAU,OAAO,SAAS;AAAA,IAChE,QAAQ,OAAO;AAAA,IACf,GAAI,OAAO,kBAAkB,SACzB,CAAC,IACD,EAAE,eAAe,OAAO,cAAc;AAAA,IAC1C,GAAI,OAAO,QAAQ,OAAO,CAAC,IAAI,EAAE,KAAK,OAAO,IAAI;AAAA,IACjD;AAAA,IACA,OAAO,OAAO;AAAA,IACd,GAAI,OAAO,kBAAkB,SACzB,CAAC,IACD,EAAE,eAAe,OAAO,cAAc;AAAA,IAC1C,GAAI,OAAO,kBAAkB,SACzB,CAAC,IACD,EAAE,eAAe,OAAO,cAAc;AAAA,IAC1C,GAAI,OAAO,UAAU,OACjB,CAAC,IACD;AAAA,MACE,OAAO,OAAO;AAAA,IAChB;AAAA,EACN;AACF;AAEA,eAAe,kBACb,QACA,OAC6B;AAC7B,QAAM,oBAAoB,MAAM,+BAA+B,MAAM;AACrE,SAAO;AAAA,IACL,YAAY,OAAO;AAAA,IACnB,GAAI,OAAO,cAAc,SAAY,CAAC,IAAI,EAAE,WAAW,OAAO,UAAU;AAAA,IACxE,GAAI,OAAO,YAAY,OAAO,CAAC,IAAI,EAAE,UAAU,OAAO,SAAS;AAAA,IAC/D,QAAQ,OAAO;AAAA,IACf,GAAI,OAAO,kBAAkB,SACzB,CAAC,IACD,EAAE,eAAe,OAAO,cAAc;AAAA,IAC1C;AAAA,IACA,GAAI,OAAO,UAAU,SAAY,CAAC,IAAI,EAAE,OAAO,OAAO,MAAM;AAAA,IAC5D,GAAI,OAAO,UAAU,SAAY,CAAC,IAAI,EAAE,OAAO,OAAO,MAAM;AAAA,IAC5D,GAAI,OAAO,cAAc,SAAY,CAAC,IAAI,EAAE,WAAW,OAAO,UAAU;AAAA,IACxE,GAAI,OAAO,kBAAkB,SACzB,CAAC,IACD,EAAE,eAAe,OAAO,cAAc;AAAA,IAC1C,GAAI,OAAO,kBAAkB,SACzB,CAAC,IACD,EAAE,eAAe,OAAO,cAAc;AAAA,IAC1C,GAAI,OAAO,kBAAkB,SACzB,CAAC,IACD,EAAE,eAAe,OAAO,cAAc;AAAA,IAC1C,GAAI,OAAO,UAAU,OACjB,CAAC,IACD,EAAE,OAAO,OAAO,MAAkD;AAAA,IACtE,GAAI,sBAAsB,SAAY,CAAC,IAAI,EAAE,kBAAkB;AAAA,EACjE;AACF;AAEA,SAAS,oBACP,QAC+B;AAC/B,OACG,OAAO,SAAS,gBAAgB,OAAO,SAAS,aACjD,OAAO,iBAAiB,QACxB;AACA,WAAO,OAAO;AAAA,EAChB;AACA,QAAM,IAAI;AAAA,IACR;AAAA,EACF;AACF;AAEA,SAAS,qBAAqB,QAAoC;AAChE,SAAO,OAAO,WAAW,SAAS,kBAC9B,OAAO,WAAW,cAClB,OAAO;AACb;AAEA,eAAe,oBAEb,QAA4B,QAAuB;AACnD,MAAI,OAAO,eAAe,KAAM,QAAO;AACvC,QAAM,aAAa,MAAMN,0BAAyB;AAAA,IAChD,GAAG;AAAA,IACH,QAAQ,OAAO;AAAA,EACjB,CAAC;AACD,SAAO,EAAE,GAAG,QAAQ,WAAW;AACjC;AAEA,SAAS,0BACP,SACA,QACoB;AACpB,UAAQ,QAAQ,oBAAoB,UAAU;AAAA,IAC5C,KAAK;AACH,aAAO;AAAA,QACL,YAAY,QAAQ;AAAA,QACpB,aAAa,QAAQ;AAAA,QACrB;AAAA,QACA,QAAQ,QAAQ;AAAA,QAChB,YAAY,QAAQ;AAAA,QACpB,MAAM;AAAA,QACN,WAAW,iBAAiB,SAAS,gBAAgB;AAAA,MACvD;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,YAAY,QAAQ;AAAA,QACpB,aAAa,QAAQ;AAAA,QACrB,UAAU,QAAQ,YAAY;AAAA,QAC9B;AAAA,QACA,QAAQ,QAAQ;AAAA,QAChB,YAAY,QAAQ;AAAA,QACpB,MAAM;AAAA,QACN,OAAO,QAAQ,SAAS;AAAA,QACxB,GAAI,QAAQ,UAAU,SAAY,CAAC,IAAI,EAAE,OAAO,QAAQ,MAAM;AAAA,QAC9D,GAAI,QAAQ,cAAc,SACtB,CAAC,IACD,EAAE,WAAW,QAAQ,UAAU;AAAA,QACnC,GAAI,QAAQ,kBAAkB,SAC1B,CAAC,IACD,EAAE,eAAe,QAAQ,cAAc;AAAA,QAC3C,GAAI,QAAQ,kBAAkB,SAC1B,CAAC,IACD,EAAE,eAAe,QAAQ,cAAc;AAAA,QAC3C,WAAW,iBAAiB,SAAS,UAAU;AAAA,MACjD;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,YAAY,QAAQ;AAAA,QACpB,aAAa,QAAQ;AAAA,QACrB,UAAU,QAAQ,YAAY;AAAA,QAC9B;AAAA,QACA,GAAI,QAAQ,kBAAkB,SAC1B,CAAC,IACD,EAAE,eAAe,QAAQ,cAAc;AAAA,QAC3C,QAAQ,QAAQ;AAAA,QAChB,YAAY,QAAQ;AAAA,QACpB,MAAM;AAAA,QACN,OAAO,QAAQ,SAAS;AAAA,QACxB,GAAI,QAAQ,UAAU,SAAY,CAAC,IAAI,EAAE,OAAO,QAAQ,MAAM;AAAA,QAC9D,GAAI,QAAQ,cAAc,SACtB,CAAC,IACD,EAAE,WAAW,QAAQ,UAAU;AAAA,QACnC,GAAI,QAAQ,SAAS,SAAY,CAAC,IAAI,EAAE,MAAM,QAAQ,KAAK;AAAA,QAC3D,GAAI,QAAQ,kBAAkB,SAC1B,CAAC,IACD,EAAE,eAAe,QAAQ,cAAc;AAAA,QAC3C,GAAI,QAAQ,kBAAkB,SAC1B,CAAC,IACD,EAAE,eAAe,QAAQ,cAAc;AAAA,QAC3C,WAAW,iBAAiB,SAAS,SAAS;AAAA,MAChD;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,YAAY,QAAQ;AAAA,QACpB,aAAa,QAAQ;AAAA,QACrB,GAAI,QAAQ,cAAc,SACtB,CAAC,IACD,EAAE,WAAW,QAAQ,UAAU;AAAA,QACnC,UAAU,QAAQ,YAAY;AAAA,QAC9B;AAAA,QACA,GAAI,QAAQ,kBAAkB,SAC1B,CAAC,IACD,EAAE,eAAe,QAAQ,cAAc;AAAA,QAC3C,QAAQ,QAAQ;AAAA,QAChB,KAAK,QAAQ,OAAO;AAAA,QACpB,YAAY,QAAQ;AAAA,QACpB,MAAM;AAAA,QACN,GAAG,0BAA0B,OAAO;AAAA,QACpC,OAAO,QAAQ,SAAS;AAAA,QACxB,GAAI,QAAQ,kBAAkB,SAC1B,CAAC,IACD,EAAE,eAAe,QAAQ,cAAc;AAAA,QAC3C,GAAI,QAAQ,kBAAkB,SAC1B,CAAC,IACD,EAAE,eAAe,QAAQ,cAAc;AAAA,QAC3C,OAAO,QAAQ;AAAA,MACjB;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,YAAY,QAAQ;AAAA,QACpB,aAAa,QAAQ;AAAA,QACrB,GAAI,QAAQ,cAAc,SACtB,CAAC,IACD,EAAE,WAAW,QAAQ,UAAU;AAAA,QACnC,GAAI,QAAQ,aAAa,SACrB,CAAC,IACD,EAAE,UAAU,QAAQ,SAAS;AAAA,QACjC;AAAA,QACA,GAAI,QAAQ,kBAAkB,SAC1B,CAAC,IACD,EAAE,eAAe,QAAQ,cAAc;AAAA,QAC3C,QAAQ,QAAQ;AAAA,QAChB,YAAY,QAAQ;AAAA,QACpB,MAAM;AAAA,QACN,GAAG,0BAA0B,OAAO;AAAA,QACpC,GAAI,QAAQ,UAAU,SAAY,CAAC,IAAI,EAAE,OAAO,QAAQ,MAAM;AAAA,QAC9D,GAAI,QAAQ,UAAU,SAAY,CAAC,IAAI,EAAE,OAAO,QAAQ,MAAM;AAAA,QAC9D,GAAI,QAAQ,UAAU,SAAY,CAAC,IAAI,EAAE,OAAO,QAAQ,MAAM;AAAA,QAC9D,GAAI,QAAQ,cAAc,SACtB,CAAC,IACD,EAAE,WAAW,QAAQ,UAAU;AAAA,QACnC,GAAI,QAAQ,kBAAkB,SAC1B,CAAC,IACD,EAAE,eAAe,QAAQ,cAAc;AAAA,QAC3C,GAAI,QAAQ,kBAAkB,SAC1B,CAAC,IACD,EAAE,eAAe,QAAQ,cAAc;AAAA,QAC3C,GAAI,QAAQ,kBAAkB,SAC1B,CAAC,IACD,EAAE,eAAe,QAAQ,cAAc;AAAA,QAC3C,OAAO,QAAQ;AAAA,MACjB;AAAA,EACJ;AACF;AAEA,eAAe,+BACb,QAGmD;AACnD,MAAI,OAAO,SAAS,YAAY,OAAO,UAAU,OAAW,QAAO;AACnE,MAAI,OAAO,cAAc,MAAO,QAAO;AACvC,QAAM,WAAW,MAAM,kCAAkC;AACzD,MAAI,OAAO,cAAc,eAAe,aAAa,QAAW;AAC9D,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,iBACP,SACA,OACQ;AACR,MAAI,QAAQ,cAAc,OAAW,QAAO,QAAQ;AACpD,QAAM,IAAI,MAAM,GAAG,KAAK,6CAA6C;AACvE;AAEA,SAAS,0BAA0B,SAEjC;AACA,MAAI,QAAQ,WAAW,SAAS,gBAAiB,QAAO,CAAC;AACzD,MAAI,QAAQ,iBAAiB,QAAW;AACtC,WAAO,EAAE,cAAc,QAAQ,aAAa;AAAA,EAC9C;AACA,QAAM,IAAI;AAAA,IACR;AAAA,EACF;AACF;;;AC1lBA;AAAA,EACE;AAAA,EACA;AAAA,EACA,yBAAAO;AAAA,EACA;AAAA,EACA,wBAAAC;AAAA,EACA;AAAA,EACA;AAAA,OAQK;AACP;AAAA,EACE,+BAAAC;AAAA,EACA,qCAAAC;AAAA,EACA,4BAAAC;AAAA,OAIK;;;ACvBP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP,SAAS,sCAAsC;AAC/C,SAAS,WAAW;AAeb,SAAS,eACd,QACA,SAOqB;AACrB,QAAM,aACJ,SAAS,aAAa,SAClB,yBAAyB,MAAM,IAC/B;AAAA,IACE,GAAI,OAAO,YAAY,YAAY,SAC/B,CAAC,IACD,EAAE,YAAY,OAAO,WAAW,QAAQ;AAAA,IAC5C,gBAAgB,QAAQ;AAAA,EAC1B;AAEN,SAAO,IAAI,IAAoB;AAAA,IAC7B,UAAU,+BAA+B;AAAA,MACvC,GAAI,WAAW,gBAAgB,SAC3B,CAAC,IACD,EAAE,aAAa,WAAW,YAAY;AAAA,MAC1C,GAAI,WAAW,SAAS,SAAY,CAAC,IAAI,EAAE,MAAM,WAAW,KAAK;AAAA,IACnE,CAAC;AAAA,IACD,GAAG;AAAA,IACH,GAAI,SAAS,mBAAmB,SAC5B,CAAC,IACD,EAAE,gBAAgB,QAAQ,eAAe;AAAA,IAC7C,GAAI,SAAS,iBAAiB,SAC1B,CAAC,IACD,EAAE,cAAc,QAAQ,aAAa;AAAA,IACzC,GAAI,SAAS,qBAAqB,SAC9B,CAAC,IACD,EAAE,kBAAkB,QAAQ,iBAAiB;AAAA,IACjD,GAAI,SAAS,iBAAiB,SAC1B,CAAC,IACD,EAAE,cAAc,QAAQ,aAAa;AAAA,EAC3C,CAAC;AACH;AAEA,eAAsB,wBAAwB,SAEV;AAClC,QAAM,WACJ,QAAQ,YAAY,SAAY,yBAAyB,EAAE,MAAM;AACnE,QAAM,SAAS,MAAM,2BAA2B;AAAA,IAC9C,GAAI,QAAQ,YAAY,SAAY,CAAC,IAAI,EAAE,SAAS,QAAQ,QAAQ;AAAA,IACpE,GAAI,QAAQ,YAAY,UAAa,aAAa,SAC9C,EAAE,eAAe,KAAK,IACtB,CAAC;AAAA,IACL,GAAI,yBAAyB,EAAE,cAAc,SACzC,CAAC,IACD,EAAE,qBAAqB,KAAK;AAAA,EAClC,CAAC;AAED,MACE,aAAa,WACZ,OAAO,KAAK,aAAa,UAAa,OAAO,IAAI,UAAU,SAC5D;AACA,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;;;AClFO,IAAM,qCAAqC;AAC3C,IAAM,yCAAyC;AAwB/C,SAAS,mBACd,MACA,OACA,UACA,YACA,OACwB;AACxB,QAAM,UAAU,6BAA6B,IAAI;AACjD,QAAM,QAAQ,KAAK,IAAI,UAAU,KAAK,KAAK,QAAQ,QAAQ,YAAY,CAAC;AACxE,QAAM,uBAAuB,KAAK;AAAA,IAChC;AAAA,IACA,SAAS,kBAAkB,IAAI,WAAW;AAAA,EAC5C;AACA,QAAM,cAAc,KAAK,KAAK,QAAQ,oBAAoB;AAC1D,QAAM,cAAc,QAAQ,QAAQ;AAEpC,SAAO;AAAA,IACL;AAAA,IACA,aAAa;AAAA,MACX,KAAK,KAAK,KAAK,cAAc,QAAQ,oBAAoB,WAAW;AAAA,MACpE,KAAK,KAAK,KAAK,cAAc,QAAQ,oBAAoB,WAAW;AAAA,IACtE;AAAA,IACA,QAAQ;AAAA,MACN,gBAAgB,KAAK,KAAK,QAAQ,QAAQ,0BAA0B;AAAA,MACpE,OAAO,KAAK,KAAK,QAAQ,QAAQ,iBAAiB;AAAA,MAClD,QAAQ,KAAK,KAAK,QAAQ,QAAQ,kBAAkB;AAAA,IACtD;AAAA,EACF;AACF;AAEO,SAAS,iCAAiC,OAKR;AACvC,MAAI,CAAC,MAAM,YAAY;AACrB,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,QAAqC,CAAC;AAE5C,QAAM,qBACJ,MAAM,WAAW,UAAU,IACvB,yCACA,MAAM,WAAW,UAAU,IACzB,IACA;AAER,MAAI,MAAM,kBAAkB,uBAAuB,QAAW;AAC5D,UAAM,KAAK;AAAA,MACT,WAAW;AAAA,MACX,aAAa;AAAA,MACb,SAAS,MAAM,WAAW;AAAA,MAC1B,MAAM;AAAA,MACN,SACE;AAAA,MACF,aAAa;AAAA,IACf,CAAC;AAAA,EACH;AAEA,MAAI,MAAM,WAAW,MAAM,KAAK,MAAM,WAAW,GAAG;AAClD,UAAM,KAAK;AAAA,MACT,WAAW;AAAA,MACX,aAAa;AAAA,MACb,SAAS,MAAM,WAAW;AAAA,MAC1B,MAAM;AAAA,MACN,SACE;AAAA,MACF,aAAa;AAAA,IACf,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEO,SAAS,8BACd,KACQ;AACR,MAAI,KAAK,UAAU,QAAW;AAC5B,WAAO;AAAA,EACT;AAEA,SAAO,IAAI,aAAa,SACpB,IAAI,QACJ,GAAG,IAAI,QAAQ,IAAI,IAAI,KAAK;AAClC;AAEO,SAAS,iCAAiC,SAAyB;AACxE,MAAI,UAAU,IAAI;AAChB,WAAO,GAAG,OAAO;AAAA,EACnB;AAEA,QAAM,UAAU,KAAK,MAAM,UAAU,EAAE;AAEvC,MAAI,UAAU,IAAI;AAChB,WAAO,GAAG,OAAO;AAAA,EACnB;AAEA,SAAO,GAAG,KAAK,MAAM,UAAU,EAAE,CAAC;AACpC;AAEA,SAAS,6BAA6B,MAQpC;AACA,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO;AAAA,QACL,4BAA4B;AAAA,QAC5B,mBAAmB;AAAA,QACnB,mBAAmB;AAAA,QACnB,mBAAmB;AAAA,QACnB,oBAAoB;AAAA,QACpB,gBAAgB;AAAA,QAChB,cAAc;AAAA,MAChB;AAAA,IACF,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,QACL,4BAA4B;AAAA,QAC5B,mBAAmB;AAAA,QACnB,mBAAmB;AAAA,QACnB,mBAAmB;AAAA,QACnB,oBAAoB;AAAA,QACpB,gBAAgB;AAAA,QAChB,cAAc;AAAA,MAChB;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,4BAA4B;AAAA,QAC5B,mBAAmB;AAAA,QACnB,mBAAmB;AAAA,QACnB,mBAAmB;AAAA,QACnB,oBAAoB;AAAA,QACpB,gBAAgB;AAAA,QAChB,cAAc;AAAA,MAChB;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,4BAA4B;AAAA,QAC5B,mBAAmB;AAAA,QACnB,mBAAmB;AAAA,QACnB,mBAAmB;AAAA,QACnB,oBAAoB;AAAA,QACpB,gBAAgB;AAAA,QAChB,cAAc;AAAA,MAChB;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,4BAA4B;AAAA,QAC5B,mBAAmB;AAAA,QACnB,mBAAmB;AAAA,QACnB,mBAAmB;AAAA,QACnB,oBAAoB;AAAA,QACpB,gBAAgB;AAAA,QAChB,cAAc;AAAA,MAChB;AAAA,EACJ;AACF;;;ACtMA;AAAA,EACE;AAAA,EACA,qBAAqB;AAAA,EACrB;AAAA,OAGK;AACP;AAAA,EACE,8BAAAC;AAAA,EACA,wBAAAC;AAAA,OACK;;;ACVP;AAAA,EACE,4BAAAC;AAAA,EACA,wBAAAC;AAAA,OAGK;AAoCA,SAAS,wBAAwB,MAA+B;AACrE,MAAI,MAAM,aAAa,QAAW;AAChC,gCAA4B;AAC5B;AAAA,EACF;AACA,EAAAC,0BAAyB,KAAK,QAAQ;AACxC;AAEO,SAAS,8BACd,SACM;AACN,MACE,QAAQ,MAAM,YAAY,UAC1B,QAAQ,KAAK,aAAa,QAC1B;AACA,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,MACE,QAAQ,aAAa,WACpB,QAAQ,MAAM,aAAa,UAC1B,QAAQ,MAAM,YAAY,SAC5B;AACA,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;AAEA,eAAsB,qBACpB,SACA,WACY;AACZ,QAAM,UAAU,8BAA8B;AAC9C,QAAM,YAAY;AAAA,IAChB,GAAI,QAAQ,SAAS,SACjB,QAAQ,SAAS,SACf,CAAC,IACD,EAAE,MAAM,QAAQ,KAAK,IACvB,EAAE,MAAM,QAAQ,KAAK;AAAA,IACzB,GAAI,QAAQ,aAAa,SACrB,QAAQ,aAAa,SACnB,CAAC,IACD,EAAE,UAAU,QAAQ,SAAS,IAC/B,EAAE,UAAU,QAAQ,SAAS;AAAA,EACnC;AACA,gCAA8B,SAAS;AACvC,0BAAwB,UAAU,IAAI;AACtC,QAAM,iBAAiB,YACrB,MAAM;AAAA,IACJ;AAAA,MACE,GAAG;AAAA,MACH,GAAI,UAAU,SAAS,SAAY,CAAC,IAAI,EAAE,MAAM,UAAU,KAAK;AAAA,MAC/D,GAAI,UAAU,aAAa,SACvB,CAAC,IACD,EAAE,UAAU,UAAU,SAAS;AAAA,IACrC;AAAA,IACA;AAAA,EACF;AACF,MAAI,UAAU,MAAM,YAAY,QAAW;AACzC,WAAO,MAAMC,sBAAqB,UAAU,KAAK,SAAS,cAAc;AAAA,EAC1E;AACA,SAAO,MAAM;AAAA,IACX,UAAU,MAAM,YAAY,UAAU;AAAA,IACtC;AAAA,EACF;AACF;;;ADvFA;AAAA,EACE,+BAAAC;AAAA,EACA;AAAA,EACA,4BAAAC;AAAA,OACK;AAgIP,eAAsB,kBACpB,SACe;AACf,QAAM,EAAE,MAAM,UAAU,GAAG,YAAY,IAAI;AAC3C,QAAM;AAAA,IACJ;AAAA,MACE,GAAI,SAAS,SAAY,CAAC,IAAI,EAAE,KAAK;AAAA,MACrC,GAAI,aAAa,SAAY,CAAC,IAAI,EAAE,SAAS;AAAA,IAC/C;AAAA,IACA,YAAY,MAAM,sBAAsB,WAAW;AAAA,EACrD;AACF;;;AHjHA,eAAsB,wBACpB,UAAuC,CAAC,GACzB;AACf,QAAM,YAAY,yBAAyB;AAC3C,QAAM,SAAS,MAAM,2BAA2B;AAAA,IAC9C,GAAI,UAAU,cAAc,SAAY,CAAC,IAAI,EAAE,qBAAqB,KAAK;AAAA,IACzE,GAAI,UAAU,QAAQ,SAAY,CAAC,IAAI,EAAE,eAAe,KAAK;AAAA,EAC/D,CAAC;AACD,QAAM,kBAAkB;AAAA,IACtB,aAAa,OAAO,YAAY,OAAO;AAAA,IACvC,YAAY,OAAO,KAAK,UAAU,YAAY;AAC5C,YAAM;AAAA,QACJ,EAAE,cAAc,IAAI,KAAK,WAAW,YAAY;AAAA,QAChD,YAAY,MAAM,gBAAgB,KAAK,UAAU,OAAO;AAAA,MAC1D;AAAA,IACF;AAAA,IACA,GAAI,QAAQ,kBAAkB,SAC1B,CAAC,IACD,EAAE,eAAe,QAAQ,cAAc;AAAA,IAC3C,GAAI,QAAQ,WAAW,SAAY,CAAC,IAAI,EAAE,QAAQ,QAAQ,OAAO;AAAA,EACnE,CAAC;AACH;AAEA,eAAe,gBACb,KACA,UACA,SACe;AACf,QAAM,YAAY,yBAAyB;AAC3C,QAAM,SAAS,MAAM,2BAA2B;AAAA,IAC9C,GAAI,IAAI,YAAY,SAAY,CAAC,IAAI,EAAE,SAAS,IAAI,QAAQ;AAAA,IAC5D,GAAI,UAAU,cAAc,SAAY,CAAC,IAAI,EAAE,qBAAqB,KAAK;AAAA,IACzE,GAAI,IAAI,YAAY,UAAa,UAAU,QAAQ,SAC/C,EAAE,eAAe,KAAK,IACtB,CAAC;AAAA,EACP,CAAC;AACD,QAAM,YAAY,MAAM;AAAA,IACtB;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,EACF;AACA,MAAI;AACF,QAAI,IAAI,WAAW,mBAAmB;AACpC,UAAI,QAAQ,MAAM,iBAAiB,GAAG;AACtC,UAAI,UAAU,WAAW;AACvB,cAAM,YAAY,KAAK,iBAAiB,WAAW,UAAU,SAAS;AAAA,UACpE,GAAI,UAAU,qBAAqB,SAC/B,CAAC,IACD,EAAE,QAAQ,UAAU,iBAAiB;AAAA,QAC3C,CAAC;AACD,gBAAQ,MAAM,iBAAiB,GAAG;AAAA,MACpC;AACA,UAAI,UAAU,aAAc;AAC5B,UAAI,UAAU,WAAW;AACvB,cAAM,IAAI;AAAA,UACR,WAAW,IAAI,SAAS,OAAO,KAAK;AAAA,QACtC;AAAA,MACF;AACA,YAAM,YAAY,KAAK,mBAAmB,WAAW,UAAU,SAAS;AAAA,QACtE,GAAI,IAAI,WAAW,SAAY,CAAC,IAAI,EAAE,QAAQ,IAAI,OAAO;AAAA,MAC3D,CAAC;AACD;AAAA,IACF;AAEA,QAAI,IAAI,WAAW,iBAAiB;AAClC,YAAM,QAAQ,MAAM,iBAAiB,GAAG;AACxC,UAAI,UAAU,aAAa,UAAU,aAAc;AACnD,UAAI,UAAU,WAAW;AACvB,cAAM,IAAI;AAAA,UACR,WAAW,IAAI,SAAS,OAAO,KAAK;AAAA,QACtC;AAAA,MACF;AAAA,IACF;AACA,QAAI,IAAI,WAAW,mBAAmB;AACpC,YAAM,QAAQ,MAAM,iBAAiB,GAAG;AACxC,UAAI,UAAU,WAAW;AACvB,cAAM,IAAI;AAAA,UACR,WAAW,IAAI,SAAS;AAAA,QAC1B;AAAA,MACF;AAAA,IACF;AAEA,UAAM,YAAY,KAAK,IAAI,QAAQ,WAAW,UAAU,SAAS;AAAA,MAC/D,GAAI,IAAI,WAAW,kBACf,EAAE,QAAQ,UAAU,iBAAiB,IACrC,CAAC;AAAA,MACL,GAAI,IAAI,WAAW,oBACf,EAAE,QAAQ,UAAU,qBAAqB,IACzC,CAAC;AAAA,IACP,CAAC;AAAA,EACH,UAAE;AACA,UAAM,UAAU,MAAM;AAAA,EACxB;AACF;AAEA,eAAe,YACb,KACA,MACA,WACA,UACA,SACA,cACe;AACf,QAAM,SAAS,eAAe;AAC9B,QAAM,SAAS,YAAY,IAAI;AAC/B,MAAI,SAAS,mBAAmB,SAAS,mBAAmB;AAC1D,UAAM,yBAAyB,GAAG;AAAA,EACpC;AAEA,QAAM,gBAAgB,MAAM,mBAAmB,IAAI,WAAW,IAAI;AAClE,QAAM,YAAY,MAAM,cAAc,WAAW,aAAa;AAC9D,QAAM,kBAAkB,MAAM,cAAc,gBAAgB,QAAQ;AACpE,QAAM,WAAW,MAAM,IAAIC,sBAAqB,IAAI,OAAO,EAAE;AAAA,IAC3D,OAAO,aAAa;AAClB,YAAM,kBAAkB,UAAU,IAAI,SAAS;AAC/C,aAAO,MAAMC;AAAA,QACX;AAAA,QACA,IAAI;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,QAAM,4BAA4B;AAAA,IAChC,iBAAiB;AAAA,IACjB,OAAO,IAAI;AAAA,IACX,SAAS,yBAAyB,GAAG;AAAA,EACvC,CAAC;AACD,QAAM,SAAS,YAAY;AAAA,IACzB,MAAM;AAAA,IACN,OAAO,KAAK,WAAW,QAAQ,IAAI,aAAa;AAAA,IAChD,OAAO;AAAA,IACP,MAAM;AAAA,EACR,CAAC;AAED,QAAM,SAAS,MAAM,UAAU,SAAS;AAAA,IACtC;AAAA,IACA;AAAA,IACA,UAAU;AAAA,IACV;AAAA,IACA,QAAQ,QAAQ;AAAA,IAChB,WAAW;AAAA,EACb,CAAC;AACD,MAAI,OAAO,aAAa,UAAU;AAChC,UAAM,IAAI;AAAA,MACR,iCAAiC,OAAO,QAAQ,cAAc,QAAQ;AAAA,IACxE;AAAA,EACF;AACA,QAAM,SAAS,YAAY;AAAA,IACzB,MAAM;AAAA,IACN,OAAO;AAAA,IACP,OAAO;AAAA,IACP,MAAM;AAAA,EACR,CAAC;AACD,QAAM,SAAS,MAAM,8BAA8B,IAAI,OAAO;AAC9D,QAAM,mBAAmB,MAAM,gCAAgC,MAAM;AACrE,QAAM,WACJ,OAAO,SAAS,eACZ,EAAE,GAAG,kBAAkB,aAAa,IAAI,QAAQ,IAChD;AACN,QAAM;AAAA,IACJ;AAAA,IACA,OAAO,aAAa;AAClB,4BAAsB,MAAM,YAAY,IAAI,KAAK,CAAC;AAClD,YAAMC;AAAA,QACJ;AAAA,QACA,IAAI;AAAA,QACJ;AAAA,QACA;AAAA,QACA,OAAO;AAAA,MACT;AAAA,IACF;AAAA,IACA,EAAE,+BAA+B,KAAK;AAAA,EACxC;AACA,QAAM,SAAS,YAAY;AAAA,IACzB,MAAM;AAAA,IACN,OAAO;AAAA,IACP,OAAO;AAAA,IACP,MAAM;AAAA,EACR,CAAC;AACD,QAAM,SAAS,cAAc,IAAI;AACjC,wBAAsB,MAAM,YAAY,IAAI,KAAK,CAAC;AACpD;AASA,eAAe,gBACb,KACA,QACA,QACA,UACyB;AACzB,QAAM,aAAa,CAAC,IAAI,OAAO,WAAW,QAAQ;AAClD,QAAM,cAAc,aAChB,MAAM,wBAAwB;AAAA,IAC5B,GAAI,IAAI,YAAY,SAAY,CAAC,IAAI,EAAE,SAAS,IAAI,QAAQ;AAAA,EAC9D,CAAC,IACD;AACJ,QAAM,cACJ,IAAI,YAAY,SAAY,yBAAyB,EAAE,MAAM;AAC/D,QAAM,MACJ,gBAAgB,SACZ,SACA,eAAe,aAAa;AAAA,IAC1B,gBAAgB,IAAI;AAAA,IACpB,cAAc,IAAI;AAAA,IAClB,cAAc,OAAO,UAAU;AAC7B,YAAM,SAAS,cAAc,KAAK;AAAA,IACpC;AAAA,IACA,kBAAkB,OAAO,EAAE,iBAAiB,MAAM;AAChD,YAAM,SAAS,oBAAoB,gBAAgB;AAAA,IACrD;AAAA,IACA,GAAI,gBAAgB,SAAY,CAAC,IAAI,EAAE,UAAU,YAAY;AAAA,EAC/D,CAAC;AACP,QAAM,eAAe,IAAI,UAAU,aAAa;AAChD,QAAM,YACJ,IAAI,WAAW,oBACX,qCAAqC,MAAM,IAC3C;AACN,QAAM,UACJ,QAAQ,SACJ,SACA,OACE,UACA,OACA,eAEA,MAAM,IAAI,QAAQ,UAAU;AAAA,IAC1B,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,OAAO,eAAe;AAAA,IACtB;AAAA,EACF,CAAC;AACT,MAAI,YAAY,UAAa,QAAQ,QAAW;AAC9C,YAAQ,OAAO,OACb,cACe,MAAM,IAAI,QAAQ,YAAY,MAAM,UAAU,OAAO,CAAC;AAAA,EACzE;AACA,QAAM,oBACJ,IAAI,WAAW,oBACX,SACA,MAAMC;AAAA,IACJ,OAAO,cAAc,SACjB;AAAA,MACE,MAAM;AAAA,MACN,YAAY;AAAA,QACV;AAAA,QACA;AAAA,MACF;AAAA,MACA,YAAY;AAAA,QACV,aAAa,KAAK,SAAS,aAAa;AAAA,QACxC;AAAA,MACF;AAAA,IACF,IACA;AAAA,MACE,UAAU,OAAO,UAAU;AAAA,MAC3B,MAAM;AAAA,MACN,OAAO,OAAO,UAAU;AAAA,IAC1B;AAAA,EACN;AACN,QAAM,oBACJ,IAAI,WAAW,4BACf,IAAI,WAAW,4BACV,yBAAyB,EAAE,aAC5B,kCAAkC,uBAAuB,MAAM,CAAC,IAChE;AAEN,SAAO;AAAA,IACL,MAAM,QAAQ;AACZ,YAAM,mBAAmB,MAAM;AAAA,IACjC;AAAA,IACA,UAAUC,mCAAkC;AAAA,MAC1C,GAAI,sBAAsB,SAAY,CAAC,IAAI,EAAE,kBAAkB;AAAA,MAC/D,GAAI,QAAQ,SAAY,CAAC,IAAI,EAAE,IAAI;AAAA,MACnC,GAAI,sBAAsB,SAAY,CAAC,IAAI,EAAE,kBAAkB;AAAA,MAC/D,GAAI,cAAc,SACd,CAAC,IACD;AAAA,QACE,WAAW;AAAA,UACT,GAAG;AAAA,UACH,GAAI,UAAU,aAAa,QACvB,EAAE,eAAe,2BAA2B,IAC5C,CAAC;AAAA,QACP;AAAA,MACF;AAAA,IACN,CAAC;AAAA,IACD,GAAI,iBAAiB,SACjB,CAAC,IACD,EAAE,kBAAkB,wBAAwB,YAAY,EAAE;AAAA,IAC9D,GAAI,iBAAiB,SACjB,CAAC,IACD;AAAA,MACE,sBAAsB,kCAAkC,YAAY;AAAA,IACtE;AAAA,EACN;AACF;AAEA,eAAe,mBACb,WACA,MACoB;AACpB,QAAM,OAAO,eAAe,IAAI;AAChC,MAAK,MAAM,UAAU,aAAa,IAAI,MAAO,QAAW;AACtD,UAAM,UAAU,OAAO,MAAM,EAAE,WAAW,KAAK,CAAC;AAAA,EAClD;AACA,SAAO,MAAM,UAAU,gBAAgB,IAAI;AAC7C;AAEA,eAAe,iBAAiB,KAAe;AAC7C,SAAO,MAAM,IAAIJ,sBAAqB,IAAI,OAAO,EAAE;AAAA,IACjD,OAAO,cACJ,MAAM,kBAAkB,UAAU,IAAI,SAAS,GAAG;AAAA,EACvD;AACF;AAEA,eAAe,yBAAyB,KAA8B;AACpE,QAAM,IAAIA,sBAAqB,IAAI,OAAO,EAAE,aAAa,OAAO,aAAa;AAC3E,UAAM,WAAW,MAAM,SAAS,QAAQ,YAAY,IAAI,SAAS;AACjE,UAAM,WAAW,MAAM,SAAS,eAAe,IAAI,IAAI,WAAW,KAAK;AACvE,QAAI,UAAU,mBAAmB,UAAU;AACzC,YAAM,IAAI;AAAA,QACR,WAAW,IAAI,SAAS,sDAAsD,IAAI,MAAM;AAAA,MAC1F;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEA,SAAS,uBAAuB,QAAgC;AAC9D,MAAI,OAAO,cAAc,OAAW,QAAO,OAAO;AAClD,QAAM,IAAI;AAAA,IACR;AAAA,EACF;AACF;AAEO,SAAS,qCACd,QACkD;AAClD,MAAI,OAAO,WAAW,aAAa,OAAW,QAAO,OAAO;AAC5D,QAAM,IAAI;AAAA,IACR;AAAA,EACF;AACF;AAEA,SAAS,yBAAyB,KAAuB;AACvD,MAAI,IAAI,YAAY,QAAW;AAC7B,UAAM,IAAI,MAAM,aAAa,IAAI,KAAK,wBAAwB;AAAA,EAChE;AACA,SAAO,IAAI;AACb;AAEA,SAAS,sBAAsB,KAAqB;AAClD,MAAI,IAAI,UAAU,WAAW;AAC3B,UAAM,IAAI,MAAM,OAAO,IAAI,KAAK,OAAO,IAAI,KAAK,yBAAyB;AAAA,EAC3E;AACF;AAEA,SAAS,aAAgB,OAAsB,SAAoB;AACjE,MAAI,UAAU,OAAW,OAAM,IAAI,MAAM,OAAO;AAChD,SAAO;AACT;;;AK9YO,IAAM,8BAA8B;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,SAAS,0BACd,SAC8B;AAC9B,QAAM,cAAc,wBAAwB,QAAQ,GAAG;AAEvD,MAAI,QAAQ,cAAc,cAAc;AACtC,UAAM,UAAU,4BAA4B;AAAA,MAC1C,CAAC,SAAS,YAAY,IAAI,MAAM;AAAA,IAClC;AAEA,QAAI,QAAQ,SAAS,GAAG;AACtB,YAAM,IAAI;AAAA,QACR,uEAAuE,QAAQ,KAAK,IAAI,CAAC;AAAA,MAC3F;AAAA,IACF;AAEA,WAAO;AAAA,MACL,KAAK;AAAA,MACL,WAAW,QAAQ;AAAA,MACnB,UAAU,QAAQ;AAAA,IACpB;AAAA,EACF;AAEA,QAAM,cACJ,YAAY,iBAAiB,YAAY;AAC3C,QAAM,WAAW,sBAAsB,QAAQ,YAAY,WAAW;AAEtE,MAAI,aAAa,QAAW;AAC1B,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,QAAM,iBAAiB,sBAAsB,QAAQ,cAAc;AAEnE,MAAI,mBAAmB,QAAW;AAChC,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA,KAAK;AAAA,IACL,WAAW,QAAQ;AAAA,IACnB;AAAA,EACF;AACF;AAEA,SAAS,wBACP,aACmB;AACnB,MAAI,gBAAgB,QAAW;AAC7B,WAAO,EAAE,GAAG,QAAQ,IAAI;AAAA,EAC1B;AAEA,SAAO;AAAA,IACL,GAAG,QAAQ;AAAA,IACX,GAAG;AAAA,EACL;AACF;AAEA,SAAS,sBAAsB,MAA8C;AAC3E,MAAI,SAAS,UAAa,KAAK,KAAK,MAAM,IAAI;AAC5C,WAAO;AAAA,EACT;AAEA,SAAO;AACT;;;AC9FA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,2BAAAK;AAAA,EACA,eAAAC;AAAA,EACA;AAAA,EACA,gBAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,8BAAAC;AAAA,EACA,wBAAAC;AAAA,OAQK;AAoBP,IAAM,kBAAkB,oBAAI,IAAI,CAAC,YAAY,UAAU,WAAW,CAAC;AACnE,IAAM,6BAA6B;AAenC,IAAM,yBAA8C;AAAA,EAClD,KAAK,OAAO,YAAY,MAAM,YAAY,OAAO;AAAA,EACjD,OAAO,OAAO,UAAU,MAAM,cAAc,KAAK;AAAA,EACjD,QAAQ,OAAO,UAAU,MAAM,eAAe,KAAK;AAAA,EACnD,KAAK,OAAO,UAAU,MAAMC,aAAY,KAAK;AAAA,EAC7C,MAAM,OAAO,YAAY,MAAM,cAAc,OAAO;AAAA,EACpD,OAAO,OAAO,UAAU,MAAM,cAAc,KAAK;AAAA,EACjD,gBAAgB,OAAO,KAAK,WAC1B,MAAM,8BAA8B,KAAK,MAAM;AAAA,EACjD,YAAY,OAAO,QAAQ,MAAM,mBAAmB,GAAG;AAAA,EACvD,QAAQ,OAAO,UAAU,MAAM,eAAe,KAAK;AAAA,EACnD,WAAW,OAAO,OAAO,WAAW,MAAM,qBAAqB,OAAO,MAAM;AAC9E;AAEA,eAAe,8BACb,KACA,QAC6B;AAC7B,MAAI;AACJ,MAAI;AACF,aAAS,MAAM,IAAI,OAAO,WAAW;AAAA,EACvC,QAAQ;AACN,WAAO,EAAE,QAAQ,QAAQ,MAAM,mBAAmB,GAAG,EAAE;AAAA,EACzD;AACA,MAAI;AACF,UAAM,SAAS,UAAU,OAAO,OAAO,SAAS;AAChD,UAAM,UAAU,IAAI,YAAY,EAAE;AAAA,MAChC,MAAM,OAAO,KAAK,QAAQ,OAAO,OAAO,MAAM;AAAA,IAChD;AACA,WAAO;AAAA,MACL,QAAQ,OAAO;AAAA,MACf,QAAQ,QACL,MAAM,IAAI,EACV,OAAO,CAAC,SAAS,KAAK,KAAK,MAAM,EAAE,EACnC,IAAI,CAAC,SAAS,KAAK,MAAM,IAAI,CAAkB;AAAA,IACpD;AAAA,EACF,UAAE;AACA,UAAM,OAAO,MAAM;AAAA,EACrB;AACF;AAwFO,IAAM,sBAAN,MAA0B;AAAA,EACtB;AAAA,EACA;AAAA,EACA,iBAAiB,oBAAI,IAAqB;AAAA,EAE5C,YACL,SACA,UAA+B,wBAC/B;AACA,SAAK,WAAW;AAChB,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,MAAa,OACX,SACuB;AACvB,UAAM,WAAW,MAAM,KAAK,SAAS,IAAI,YAAY;AACnD,YAAM,WAAW,MAAM,gCAAgC,QAAQ,OAAO;AACtE,aAAO;AAAA,QACL,KAAK,MAAM,KAAK,SAAS,IAAI;AAAA,UAC3B,GAAG;AAAA,UACH,SAAS,SAAS;AAAA,QACpB,CAAC;AAAA,QACD,QAAQ,SAAS;AAAA,MACnB;AAAA,IACF,CAAC;AACD,WAAO,MAAM,KAAK,cAAc,SAAS,KAAK,SAAS,MAAM;AAAA,EAC/D;AAAA,EAEA,MAAa,QAAyB;AACpC,WAAO,MAAM,KAAK,SAAS,IAAI,YAAY,MAAM,eAAe,CAAC;AAAA,EACnE;AAAA,EAEA,MAAa,UACX,UAAuC,CAAC,GACzB;AACf,UAAM,KAAK,SAAS;AAAA,MAClB,YAAY,MAAM,wBAAwB,OAAO;AAAA,MACjD,QAAQ;AAAA,IACV;AAAA,EACF;AAAA,EAEA,MAAa,IAAI,OAAsC;AACrD,WAAO,MAAM,KAAK,SAAS;AAAA,MACzB,YAAY,MAAM,KAAK,cAAc,MAAM,KAAK,SAAS,IAAI,KAAK,CAAC;AAAA,IACrE;AAAA,EACF;AAAA,EAEA,MAAa,UAAU,WAAoC;AACzD,WAAO,MAAM,KAAK,SAAS;AAAA,MACzB,YAAY,MAAM,kBAAkB,SAAS;AAAA,IAC/C;AAAA,EACF;AAAA,EAEA,MAAa,KACX,UAAmC,CAAC,GACF;AAClC,WAAO,MAAM,KAAK,SAAS,IAAI,YAAY;AACzC,YAAM,aAAkC;AAAA,QACtC,GAAI,QAAQ,eAAe,SACvB,CAAC,IACD,EAAE,YAAY,QAAQ,WAAW;AAAA,QACrC,GAAI,QAAQ,QAAQ,SAAY,CAAC,IAAI,EAAE,KAAK,QAAQ,IAAI;AAAA,QACxD,GAAI,QAAQ,YAAY,SACpB,CAAC,IACD;AAAA,UACE,UAAU,MAAM,gCAAgC,QAAQ,OAAO,GAC5D;AAAA,QACL;AAAA,MACN;AACA,YAAM,OAAO,MAAM,KAAK,SAAS,KAAK,UAAU;AAChD,aAAO,MAAM,QAAQ;AAAA,QACnB,KAAK,IAAI,OAAO,QAAQ,MAAM,KAAK,cAAc,GAAG,CAAC;AAAA,MACvD;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAa,gBACX,MAC4D;AAC5D,WAAO,MAAM,KAAK,SAAS,IAAI,YAAY;AACzC,YAAM,gBAAgB,oBAAI,IAAoC;AAC9D,iBAAW,OAAO,MAAM;AACtB,cAAM,cAAc,qBAAqB,GAAG;AAC5C,cAAM,UAAU,cAAc,IAAI,WAAW,KAAK,CAAC;AACnD,gBAAQ,KAAK,GAAG;AAChB,sBAAc,IAAI,aAAa,OAAO;AAAA,MACxC;AACA,YAAM,WACJ,MAAM,QAAQ;AAAA,QACZ,CAAC,GAAG,aAAa,EAAE,IAAI,OAAO,CAAC,aAAa,WAAW,MAAM;AAC3D,cAAI;AACF,kBAAM,WAAW,MAAM;AAAA,cACrB,YAAY,CAAC,EAAG;AAAA,YAClB;AACA,kBAAM,WAAW,MAAM,IAAIC;AAAA,cACzB,SAAS;AAAA,YACX,EAAE,aAAa,OAAO,aAAa,MAAMC,cAAa,QAAQ,CAAC;AAC/D,kBAAM,eAAe,IAAI;AAAA,cACvB,SAAS,IAAI,CAAC,YAAY,CAAC,QAAQ,WAAW,OAAO,CAAC;AAAA,YACxD;AACA,mBAAO,YAAY,QAAQ,CAAC,QAAQ;AAClC,oBAAM,UAAU,aAAa,IAAI,IAAI,SAAS;AAC9C,qBAAO,YAAY,SACf,CAAC,IACD;AAAA,gBACE;AAAA,kBACE,IAAI;AAAA,kBACJ;AAAA,oBACE,YAAYC;AAAA,sBACV;AAAA,sBACA,QAAQ;AAAA,oBACV;AAAA,oBACA,OAAO,QAAQ;AAAA,oBACf,KAAK,QAAQ;AAAA,kBACf;AAAA,gBACF;AAAA,cACF;AAAA,YACN,CAAC;AAAA,UACH,QAAQ;AACN,mBAAO,CAAC;AAAA,UACV;AAAA,QACF,CAAC;AAAA,MACH,GACA,KAAK;AACP,aAAO,IAAI,IAAI,OAAO;AAAA,IACxB,CAAC;AAAA,EACH;AAAA,EAEA,MAAa,eACX,KACmD;AACnD,YAAQ,MAAM,KAAK,gBAAgB,CAAC,GAAG,CAAC,GAAG,IAAI,IAAI,KAAK;AAAA,EAC1D;AAAA,EAEA,MAAa,QACX,SACoC;AACpC,WAAO,MAAM,KAAK,SAAS,IAAI,YAAY;AACzC,YAAM,UAAU,wBAAwB,OAAO;AAC/C,YAAM,WAAW,MAAM,gCAAgC,QAAQ,OAAO;AACtE,aAAO,MAAM;AAAA,QACX,SAAS;AAAA,QACT,YAAY;AACV,gBAAM,SAAS,QAAQ,UAAU;AACjC,gBAAM,0BAA0B,QAAQ,OAAO;AAC/C,gBAAM,qBACJ,QAAQ,cAAc,UACtB,QAAQ,eAAe,UACvB,QAAQ,gBAAgB,UACxB,QAAQ,UAAU;AACpB,gBAAM,aAAa,MAAM,IAAIF;AAAA,YAC3B,SAAS;AAAA,UACX,EAAE,aAAa,OAAO,aAAa;AACjC,kBAAM,WAAW,MAAMC,cAAa,QAAQ;AAC5C,kBAAM,WAAW,MAAM;AAAA,cACrB;AAAA,cACA;AAAA,cACA;AAAA,YACF;AACA,kBAAM,UAAU,MAAM,QAAQ;AAAA,cAC5B,SAAS,IAAI,OAAO,aAAa;AAAA,gBAC/B;AAAA,gBACA,QAAQ,MAAM;AAAA,kBACZ;AAAA,kBACA;AAAA,kBACA;AAAA,gBACF;AAAA,cACF,EAAE;AAAA,YACJ;AACA,mBAAO;AAAA,UACT,CAAC;AACD,gBAAM,UACJ,CAAC;AACH,gBAAM,UAA4D,CAAC;AACnE,qBAAW,aAAa,YAAY;AAClC,gBAAI,UAAU,WAAW,QAAW;AAClC,kBAAI,sBAAsB,WAAW,WAAW,GAAG;AACjD,sBAAM,IAAI;AAAA,kBACR;AAAA,oBACE,UAAU;AAAA,oBACV;AAAA,oBACA,UAAU;AAAA,kBACZ;AAAA,gBACF;AAAA,cACF;AACA,sBAAQ,KAAK;AAAA,gBACX,SAAS,UAAU;AAAA,gBACnB,QAAQ,UAAU;AAAA,cACpB,CAAC;AACD;AAAA,YACF;AACA,gBAAI;AACF,sBAAQ,KAAK;AAAA,gBACX,SAAS,UAAU;AAAA,gBACnB,KAAK,MAAM,KAAK;AAAA,kBACd,MAAM,KAAK,SAAS,IAAI;AAAA,oBACtB,SAAS,SAAS;AAAA,oBAClB,OAAO,QAAQ,SAAS;AAAA,oBACxB,WAAW,UAAU,QAAQ;AAAA,oBAC7B,GAAI,YAAY,SAAY,CAAC,IAAI,EAAE,QAAQ;AAAA,oBAC3C,GAAI,QAAQ,WAAW,SACnB,CAAC,IACD,EAAE,QAAQ,QAAQ,OAAO;AAAA,oBAC7B;AAAA,kBACF,CAAC;AAAA,kBACD,SAAS;AAAA,gBACX;AAAA,cACF,CAAC;AAAA,YACH,SAAS,OAAO;AACd,kBAAI,sBAAsB,WAAW,WAAW,EAAG,OAAM;AACzD,sBAAQ,KAAK;AAAA,gBACX,SAAS,UAAU;AAAA,gBACnB,QAAQ,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,cAC/D,CAAC;AAAA,YACH;AAAA,UACF;AACA,iBAAO,EAAE,SAAS,QAAQ;AAAA,QAC5B;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAa,YACX,SACkC;AAClC,WAAO,MAAM,KAAK,SAAS,IAAI,YAAY;AACzC,YAAM,UAAU,wBAAwB,OAAO;AAC/C,YAAM,WAAW,MAAM,gCAAgC,QAAQ,OAAO;AACtE,YAAM,SAAS,QAAQ,UAAU;AACjC,YAAM,0BAA0B,QAAQ,OAAO;AAC/C,YAAM,qBACJ,QAAQ,cAAc,UACtB,QAAQ,eAAe,UACvB,QAAQ,gBAAgB,UACxB,QAAQ,UAAU;AACpB,YAAM,aAAa,MAAM,IAAID;AAAA,QAC3B,SAAS;AAAA,MACX,EAAE,aAAa,OAAO,aAAa;AACjC,cAAM,WAAW,MAAMC,cAAa,QAAQ;AAC5C,cAAM,WAAW,MAAM,oBAAoB,UAAU,UAAU,OAAO;AACtE,eAAO,MAAM,QAAQ;AAAA,UACnB,SAAS,IAAI,OAAO,aAAa;AAAA,YAC/B;AAAA,YACA,QAAQ,MAAM,yBAAyB,UAAU,SAAS,MAAM;AAAA,UAClE,EAAE;AAAA,QACJ;AAAA,MACF,CAAC;AACD,UACE,sBACA,WAAW,WAAW,KACtB,WAAW,CAAC,GAAG,WAAW,QAC1B;AACA,cAAM,IAAI;AAAA,UACR;AAAA,YACE,WAAW,CAAC,EAAE;AAAA,YACd;AAAA,YACA,WAAW,CAAC,EAAE;AAAA,UAChB;AAAA,QACF;AAAA,MACF;AACA,aAAO;AAAA,QACL,OAAO,WACJ,OAAO,CAAC,SAAS,KAAK,WAAW,MAAS,EAC1C,IAAI,CAAC,SAAS,KAAK,OAAO;AAAA,QAC7B,SAAS,WAAW;AAAA,UAAQ,CAAC,SAC3B,KAAK,WAAW,SACZ,CAAC,IACD,CAAC,EAAE,SAAS,KAAK,SAAS,QAAQ,KAAK,OAAO,CAAC;AAAA,QACrD;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEO,QAAc;AACnB,eAAW,cAAc,KAAK,eAAgB,YAAW,MAAM;AAC/D,SAAK,eAAe,MAAM;AAAA,EAC5B;AAAA,EAEO,kBAAkB,YAAyC;AAChE,SAAK,eAAe,IAAI,UAAU;AAClC,WAAO,MAAM,KAAK,eAAe,OAAO,UAAU;AAAA,EACpD;AAAA,EAEA,MAAM,cACJ,UACA,QACuB;AACvB,UAAM,SAAS;AACf,UAAM,iBACJ,WACC,SAAS,YAAY,SAClB,gCAAgC,OAAO,eAAe,cAAc,IACpE,MAAM,8BAA8B,SAAS,OAAO;AAC1D,WAAO,IAAI;AAAA,MACT;AAAA,MACA,KAAK;AAAA,MACL,KAAK;AAAA,MACL;AAAA,MACA,4BAA4B,cAAc;AAAA,IAC5C;AAAA,EACF;AACF;AAEA,SAAS,qBAAqB,KAAmC;AAC/D,SAAO,IAAI,QAAQ,SAAS,YAAY,IAAI,QAAQ,MAAM,IAAI,QAAQ;AACxE;AAEO,IAAM,eAAN,MAAmB;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACT;AAAA,EAEO,YACL,SACA,SACA,SACA,UACA,eACA;AACA,SAAK,WAAW;AAChB,SAAK,WAAW;AAChB,SAAK,WAAW;AAChB,SAAK,YAAY;AACjB,SAAK,iBAAiB;AAAA,EACxB;AAAA,EAEA,IAAW,KAAa;AACtB,WAAO,KAAK,UAAU;AAAA,EACxB;AAAA,EAEA,IAAW,WAAiC;AAC1C,WAAO,oBAAoB,KAAK,WAAW,KAAK,cAAc;AAAA,EAChE;AAAA,EAEA,MAAa,SAAwC;AACnD,WAAO,MAAM,KAAK,QAAQ,YAAY,MAAM,KAAK,SAAS,IAAI,KAAK,EAAE,CAAC;AAAA,EACxE;AAAA,EAEA,MAAa,QAAuC;AAClD,WAAO,MAAM,KAAK,QAAQ,YAAY,MAAM,KAAK,SAAS,MAAM,KAAK,EAAE,CAAC;AAAA,EAC1E;AAAA,EAEA,MAAa,SAAwC;AACnD,WAAO,MAAM,KAAK,QAAQ,YAAY,MAAM,KAAK,SAAS,OAAO,KAAK,EAAE,CAAC;AAAA,EAC3E;AAAA,EAEA,MAAa,SAAwC;AACnD,WAAO,MAAM,KAAK,QAAQ,YAAY,MAAM,KAAK,SAAS,OAAO,KAAK,EAAE,CAAC;AAAA,EAC3E;AAAA,EAEA,MAAa,QAAuC;AAClD,WAAO,MAAM,KAAK,QAAQ,YAAY,MAAM,KAAK,SAAS,MAAM,KAAK,EAAE,CAAC;AAAA,EAC1E;AAAA,EAEA,MAAa,UACX,QAC+B;AAC/B,WAAO,MAAM,KAAK;AAAA,MAChB,YAAY,MAAM,KAAK,SAAS,UAAU,KAAK,IAAI,MAAM;AAAA,IAC3D;AAAA,EACF;AAAA,EAEA,OAAc,OACZ,UAAqC,CAAC,GACR;AAC9B,QAAI,UAAU;AACd,QAAI,SAAS;AACb,QAAI,MAAM,KAAK;AACf,QAAI,QAAQ,SAAS,OAAO;AAC1B,YAAM,KAAK,OAAO;AAClB,YAAM,KAAK;AACX,YAAM,QAAQ,MAAM,KAAK,sBAAsB,KAAK,MAAM;AAC1D,YAAM,SAAS,MAAM;AACrB,eAAS,MAAM;AACf,gBAAU,OAAO,GAAG,EAAE,GAAG,OAAO;AAChC,UAAI,gBAAgB,IAAI,KAAK,EAAG;AAAA,IAClC;AAEA,QAAI,4BAA4B;AAChC,WAAO,QAAQ,QAAQ,YAAY,MAAM;AACvC,YAAM,QAAQ,MAAM,KAAK,sBAAsB,KAAK,MAAM;AAC1D,YAAM,SAAS,MAAM;AACrB,eAAS,MAAM;AACf,UAAI,mBAAmB;AACvB,iBAAW,SAAS,QAAQ;AAC1B,YAAI,MAAM,OAAO,QAAS;AAC1B,kBAAU,MAAM;AAChB,6BAAqB,gBAAgB,KAAK;AAC1C,cAAM;AAAA,MACR;AACA,UAAI,iBAAkB;AAEtB,YAAM,KAAK,OAAO;AAClB,YAAM,KAAK;AACX,UAAI,gBAAgB,IAAI,KAAK,GAAG;AAC9B,qCAA6B;AAC7B,YAAI,6BAA6B,2BAA4B;AAAA,MAC/D,OAAO;AACL,oCAA4B;AAAA,MAC9B;AACA,YAAM,KAAK,QAAQ,kBAAkB,KAAO,QAAQ,MAAM;AAAA,IAC5D;AAAA,EACF;AAAA,EAEO,UACL,UACA,UAA2C,CAAC,GAChC;AACZ,UAAM,aAAa,IAAI,gBAAgB;AACvC,UAAM,UAAU,KAAK,SAAS,kBAAkB,UAAU;AAC1D,UAAM,iBAAiB,aAAa,QAAQ,QAAQ,UAAU;AAC9D,UAAM,YAAY;AAChB,UAAI;AACF,yBAAiB,SAAS,KAAK,OAAO;AAAA,UACpC,GAAG;AAAA,UACH,QAAQ,WAAW;AAAA,QACrB,CAAC,GAAG;AACF,cAAI;AACF,kBAAM,SAAS,KAAK;AAAA,UACtB,SAAS,OAAO;AACd,oBAAQ,UAAU,KAAK;AAAA,UACzB;AAAA,QACF;AAAA,MACF,SAAS,OAAO;AACd,YAAI,CAAC,WAAW,OAAO,QAAS,SAAQ,UAAU,KAAK;AAAA,MACzD,UAAE;AACA,uBAAe;AACf,gBAAQ;AAAA,MACV;AAAA,IACF,GAAG;AACH,WAAO,MAAM,WAAW,MAAM;AAAA,EAChC;AAAA,EAEA,MAAM,QACJ,WAC+B;AAC/B,SAAK,YAAY,MAAM,KAAK,SAAS,IAAI,SAAS;AAClD,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,gBACJ,KACA,QAC6B;AAC7B,WAAO,MAAM,KAAK,SAAS,IAAI,YAAY;AACzC,UAAI,KAAK,SAAS,mBAAmB,QAAW;AAC9C,eAAO,MAAM,KAAK,SAAS,eAAe,KAAK,MAAM;AAAA,MACvD;AACA,YAAM,SAAS,MAAM,KAAK,SAAS,aAAa,GAAG;AACnD,aAAO,EAAE,QAAQ,GAAG,QAAQ,UAAU,CAAC,EAAE;AAAA,IAC3C,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,sBACJ,KACA,QAC6B;AAC7B,QAAI;AACF,aAAO,MAAM,KAAK,gBAAgB,KAAK,MAAM;AAAA,IAC/C,QAAQ;AACN,aAAO,EAAE,QAAQ,QAAQ,CAAC,EAAE;AAAA,IAC9B;AAAA,EACF;AACF;AAEA,SAAS,oBACP,KACA,SACsB;AACtB,QAAM,SAAS;AAMf,SAAO;AAAA,IACL,SAAS,4BAA4B,OAAO;AAAA,IAC5C,YAAY,QAAQ,SAAS,YAAY,QAAQ,MAAM,IAAI;AAAA,IAC3D,GAAI,mBAAmB,IAAI,OAAO,OAAO,SAAS,MAAM,SACpD,CAAC,IACD,EAAE,WAAW,mBAAmB,IAAI,OAAO,OAAO,SAAS,EAAG;AAAA,IAClE,WAAW,IAAI;AAAA,IACf,WAAW,IAAI;AAAA,IACf,GAAI,IAAI,gBAAgB,SAAY,CAAC,IAAI,EAAE,aAAa,IAAI,YAAY;AAAA,IACxE,GAAI,IAAI,cAAc,SAAY,CAAC,IAAI,EAAE,WAAW,IAAI,UAAU;AAAA,IAClE,GAAI,mBAAmB,IAAI,QAAQ,OAAO,UAAU,MAAM,SACtD,CAAC,IACD,EAAE,YAAY,mBAAmB,IAAI,QAAQ,OAAO,UAAU,EAAG;AAAA,IACrE,GAAI,IAAI,eAAe,SAAY,CAAC,IAAI,EAAE,YAAY,IAAI,WAAW;AAAA,IACrE,OAAO,IAAI;AAAA,IACX,GAAI,IAAI,kBAAkB,SACtB,CAAC,IACD,EAAE,eAAe,IAAI,cAAc;AAAA,IACvC,GAAI,mBAAmB,IAAI,KAAK,OAAO,OAAO,MAAM,SAChD,CAAC,IACD,EAAE,SAAS,mBAAmB,IAAI,KAAK,OAAO,OAAO,EAAG;AAAA,IAC5D,GAAI,IAAI,YAAY,SAAY,CAAC,IAAI,EAAE,SAAS,IAAI,QAAQ;AAAA,IAC5D,GAAI,IAAI,YAAY,SAAY,CAAC,IAAI,EAAE,SAAS,IAAI,QAAQ;AAAA,IAC5D,GAAI,IAAI,WAAW,SAAY,CAAC,IAAI,EAAE,QAAQ,IAAI,OAAO;AAAA,IACzD,WAAW,IAAI;AAAA,IACf,GAAI,IAAI,4BAA4B,SAChC,CAAC,IACD,EAAE,yBAAyB,IAAI,wBAAwB;AAAA,IAC3D,OAAO,IAAI;AAAA,IACX,QAAQ,IAAI;AAAA,IACZ,WAAW,IAAI;AAAA,IACf,GAAI,mBAAmB,IAAI,WAAW,OAAO,aAAa,MAAM,SAC5D,CAAC,IACD;AAAA,MACE,eAAe;AAAA,QACb,IAAI;AAAA,QACJ,OAAO;AAAA,MACT;AAAA,IACF;AAAA,EACN;AACF;AAEA,SAAS,4BACP,QACwB;AACxB,SAAO,OAAO,SAAS,YACnB,OAAO,OAAO,EAAE,MAAM,WAAW,KAAK,OAAO,IAAI,CAAC,IAClD,OAAO,OAAO;AAAA,IACZ,MAAM;AAAA,IACN,MAAM,OAAO;AAAA,IACb,GAAI,OAAO,cAAc,SACrB,CAAC,IACD,EAAE,WAAW,OAAO,UAAU;AAAA,EACpC,CAAC;AACP;AAEA,SAAS,mBACP,UACA,QACoB;AACpB,MAAI,aAAa,OAAW,QAAO;AACnC,MAAI;AACF,WAAO,oBAAoB,QAAQ;AAAA,EACrC,QAAQ;AACN,UAAM,WAAY,SAA6C;AAC/D,QAAI,OAAO,aAAa,SAAU,QAAO;AACzC,UAAM,IAAI,UAAU,4CAA4C;AAAA,EAClE;AACF;AAEA,eAAe,oBACb,UACA,UACA,SACkC;AAClC,QAAM,MACJ,QAAQ,eACP,QAAQ,cAAc,SAAY,SAAY,CAAC,QAAQ,SAAS;AACnE,MAAI,QAAQ,QAAW;AACrB,UAAM,WAAW,IAAI,IAAI,GAAG;AAC5B,eAAW,MAAM,SAAU,qBAAoB,UAAU,EAAE;AAC3D,WAAO,SAAS,OAAO,CAAC,YAAY,SAAS,IAAI,QAAQ,SAAS,CAAC;AAAA,EACrE;AACA,MAAI,QAAQ,gBAAgB,QAAW;AACrC,WAAO,QAAQ,UAAU,SACrB,WACA,SAAS,OAAO,CAAC,YAAY,QAAQ,SAAS,QAAQ,KAAM;AAAA,EAClE;AACA,QAAM,SAAS,MAAME;AAAA,IACnB;AAAA,IACA,QAAQ;AAAA,EACV;AACA,QAAM,OAAO,oBAAoB,UAAU,MAAM;AACjD,QAAM,SAAS,GAAG,KAAK,IAAI;AAC3B,SAAO,SAAS;AAAA,IACd,CAAC,YACC,QAAQ,cAAc,UACrB,QAAQ,KAAK,WAAW,MAAM,MAC5B,QAAQ,UAAU,UACjB,QAAQ,QAAQ,KAAK,SAAS,QAAQ;AAAA,EAC9C;AACF;AAEA,eAAe,0BACb,QACA,SACe;AACf,QAAM,YAAY,yBAAyB;AAC3C,QAAM,SACJ,WAAW,qBACX,WAAW,mBACX,WAAW,oBACP,MAAM,wBAAwB;AAAA,IAC5B,GAAI,YAAY,SAAY,CAAC,IAAI,EAAE,QAAQ;AAAA,EAC7C,CAAC,IACD,MAAM,2BAA2B;AAAA,IAC/B,GAAI,YAAY,SAAY,CAAC,IAAI,EAAE,QAAQ;AAAA,IAC3C,GAAI,UAAU,cAAc,SACxB,CAAC,IACD,EAAE,qBAAqB,KAAK;AAAA,IAChC,GAAI,YAAY,UAAa,UAAU,QAAQ,SAC3C,EAAE,eAAe,KAAK,IACtB,CAAC;AAAA,EACP,CAAC;AACP,OACG,WAAW,4BACV,WAAW,8BACb,OAAO,cAAc,UACrB,UAAU,cAAc,QACxB;AACA,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,MAAI,WAAW;AACb,yCAAqC,MAAM;AAC/C;AAEA,SAAS,oBACP,UACA,WACc;AACd,QAAM,UAAU,SAAS,KAAK,CAAC,UAAU,MAAM,cAAc,SAAS;AACtE,MAAI,YAAY;AACd,UAAM,IAAI,MAAM,WAAW,SAAS,kBAAkB;AACxD,SAAO;AACT;AAEA,eAAe,yBACb,UACA,SACA,QAC6B;AAC7B,MAAI,QAAQ,UAAU,WAAW;AAC/B,WAAO;AAAA,EACT;AACA,MAAI,WAAW,2BAA2B;AACxC,UAAM,UAAU,MAAM,SAAS,YAAY,QAAQ,SAAS;AAC5D,QAAI,YAAY,UAAa,QAAQ,KAAK,MAAM,IAAI;AAClD,aAAO;AAAA,IACT;AAAA,EACF;AACA,MAAI,WAAW,qBAAqB,WAAW,iBAAiB;AAC9D,UAAM,CAAC,UAAU,QAAQ,IAAI,MAAM,QAAQ,IAAI;AAAA,MAC7C,SAAS,eAAe,IAAI,QAAQ,WAAW,KAAK;AAAA,MACpD,SAAS,QAAQ,YAAY,QAAQ,SAAS;AAAA,IAChD,CAAC;AACD,QAAI,UAAU,mBAAmB,UAAU;AACzC,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,0BACP,SACA,QACA,QACQ;AACR,MAAI,WAAW,WAAW;AACxB,WAAO,WAAW,QAAQ,GAAG;AAAA,EAC/B;AACA,MAAI,WAAW,mBAAmB;AAChC,WAAO,WAAW,QAAQ,GAAG;AAAA,EAC/B;AACA,MAAI,WAAW,sCAAsC;AACnD,WAAO,WAAW,QAAQ,GAAG,uDAAuD,MAAM;AAAA,EAC5F;AACA,SAAO;AACT;AAEA,eAAe,KAAK,cAAsB,QAAqC;AAC7E,MAAI,QAAQ,YAAY,KAAM;AAC9B,QAAM,IAAI,QAAc,CAACC,aAAY;AACnC,QAAI,UAAU;AACd,UAAM,WAAW,MAAY;AAC3B,UAAI,QAAS;AACb,gBAAU;AACV,mBAAa,OAAO;AACpB,cAAQ,oBAAoB,SAAS,QAAQ;AAC7C,MAAAA,SAAQ;AAAA,IACV;AACA,UAAM,UAAU,WAAW,UAAU,YAAY;AACjD,YAAQ,iBAAiB,SAAS,UAAU,EAAE,MAAM,KAAK,CAAC;AAC1D,QAAI,QAAQ,YAAY,KAAM,UAAS;AAAA,EACzC,CAAC;AACH;AAEA,SAAS,gBAAgB,OAAmC;AAC1D,SAAO,gBAAgB,IAAI,KAAK;AAClC;AAEA,SAAS,gBAAgB,OAA+B;AACtD,SACE,MAAM,SAAS,cACf,MAAM,SAAS,YACf,MAAM,SAAS;AAEnB;AAEA,SAAS,aACP,QACA,QACY;AACZ,MAAI,WAAW,OAAW,QAAO,MAAM;AACvC,QAAM,QAAQ,MAAY,OAAO,MAAM,OAAO,MAAM;AACpD,MAAI,OAAO,QAAS,OAAM;AAAA,MACrB,QAAO,iBAAiB,SAAS,OAAO,EAAE,MAAM,KAAK,CAAC;AAC3D,SAAO,MAAM,OAAO,oBAAoB,SAAS,KAAK;AACxD;;;AC93BA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,+BAAAC;AAAA,EACA;AAAA,EACA,sCAAAC;AAAA,EACA,6BAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA,sCAAAC;AAAA,EACA,0BAAAC;AAAA,EACA,gCAAAC;AAAA,EACA,sCAAAC;AAAA,EACA,gCAAAC;AAAA,EACA,+BAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA,4BAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,2BAAAC;AAAA,EACA;AAAA,EACA;AAAA,OAeK;AACP,SAAS,SAAAC,cAAa;AA6BtB,eAAe,8BACb,WACmD;AACnD,MAAI,cAAc,MAAO,QAAO;AAChC,QAAM,WAAW,MAAM,kCAAkC;AACzD,MAAI,cAAc,eAAe,aAAa,QAAW;AACvD,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AA4EO,IAAM,0BAAN,MAA8B;AAAA,EAC1B;AAAA,EAEF,YAAY,SAA8B;AAC/C,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,MAAa,OAAO,QAA2C;AAC7D,UAAM,SAAS,MAAM,KAAK,SAAS,IAAI,YAAY;AACjD,YAAM,OAAO,4BAA4B,MAAM;AAC/C,YAAMC,OAAM,IAAI;AAChB,aAAO,MAAM,uBAAuB,EAAE,QAAQ,IAAI,cAAc,IAAI,EAAE,CAAC;AAAA,IACzE,CAAC;AACD,WAAO,IAAI,iBAAiB,KAAK,UAAU,MAAM;AAAA,EACnD;AAAA,EAEA,MAAa,IACX,MAAMC,2BAA0B,GACL;AAC3B,UAAM,SAAS,qBAAqB,GAAG;AACvC,UAAM,SAAS,MAAM,KAAK,SAAS;AAAA,MACjC,YAAY,MAAMC,yBAAwB,MAAM;AAAA,IAClD;AACA,WAAO,IAAI,iBAAiB,KAAK,UAAU,MAAM;AAAA,EACnD;AAAA,EAEA,MAAa,WACX,SAC0C;AAC1C,WAAO;AAAA,MACL,MAAM,KAAK,SAAS;AAAA,QAClB,YACE,MAAM,2BAA2B;AAAA,UAC/B,WAAW,IAAI;AAAA,YACb,MAAM,qCAAqC,QAAQ,SAAS;AAAA,UAC9D;AAAA,UACA,QAAQ,qBAAqB,QAAQ,MAAM;AAAA,UAC3C,GAAI,QAAQ,OAAO,SAAY,CAAC,IAAI,EAAE,IAAI,QAAQ,GAAG;AAAA,QACvD,CAAC;AAAA,MACL;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAa,cAAc,QAA+C;AACxE,UAAM,KAAK,SAAS;AAAA,MAClB,YACE,MAAM,oCAAoC,qBAAqB,MAAM,CAAC;AAAA,IAC1E;AAAA,EACF;AAAA,EAEA,MAAa,OACX,QACA,QACuC;AACvC,WAAO;AAAA,MACL,MAAM,KAAK,SAAS;AAAA,QAClB,YACE,MAAM,uBAAuB;AAAA,UAC3B,QAAQ,IAAI,cAAc,4BAA4B,MAAM,CAAC;AAAA,UAC7D,QAAQ,qBAAqB,MAAM;AAAA,QACrC,CAAC;AAAA,MACL;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAa,OACX,QACmC;AACnC,WAAO;AAAA,MACL,MAAM,KAAK,SAAS;AAAA,QAClB,YAAY,MAAM,uBAAuB,qBAAqB,MAAM,CAAC;AAAA,MACvE;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAa,KACX,QACuC;AACvC,WAAO;AAAA,MACL,MAAM,KAAK,SAAS;AAAA,QAClB,YAAY,MAAM,qBAAqB,qBAAqB,MAAM,CAAC;AAAA,MACrE;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAa,WACX,QAC0C;AAC1C,WAAO;AAAA,MACL,MAAM,KAAK,SAAS;AAAA,QAClB,YACE,MAAM,2BAA2B,qBAAqB,MAAM,CAAC;AAAA,MACjE;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAa,YACX,QACA,SACA,UAA8C,CAAC,GACnC;AACZ,WAAO,MAAM,KAAK,SAAS,IAAI,YAAY;AACzC,YAAM,eAAe,4BAA4B,MAAM;AACvD,YAAM,UAAU,MAAMA,yBAAwB,YAAY;AAE1D,aAAO,MAAM;AAAA,QACX,QAAQ;AAAA,QACR;AAAA,QACA,YAAY;AACV,yBAAe,QAAQ,MAAM;AAC7B,gBAAM,UAAU,MAAM,2BAA2B,YAAY;AAC7D,gBAAM,OAAO,kCAAkC,OAAO;AACtD,gBAAM,SAAS,MAAM,KAAK,WAAW;AACrC,cAAI,SAAS;AAEb,cAAI;AACF,kBAAM,UAA0C;AAAA,cAC9C,WAAW;AAAA,cACX,MAAM,OAAO;AAAA,cACb,QAAQ;AAAA,gBACN;AAAA,gBACA,MAAM;AAAA,gBACN,QAAQ;AAAA,cACV;AAAA,cACA,KAAK,QAAQ;AAAA,YACf;AACA,mBAAO,MAAM;AAAA,cACX,YAAY,MAAM,QAAQ,OAAO;AAAA,cACjC,QAAQ;AAAA,YACV;AAAA,UACF,UAAE;AACA,qBAAS;AACT,kBAAM,OAAO,MAAM;AAAA,UACrB;AAAA,QACF;AAAA,QACA,QAAQ,WAAW,SAAY,CAAC,IAAI,EAAE,QAAQ,QAAQ,OAAO;AAAA,MAC/D;AAAA,IACF,GAAG,QAAQ,MAAM;AAAA,EACnB;AAAA,EAEA,MAAa,YACX,SAC0C;AAC1C,WAAO;AAAA,MACL,MAAM,KAAK,SAAS;AAAA,QAClB,YACE,MAAM,4BAA4B;AAAA,UAChC,QAAQ,qBAAqB,QAAQ,MAAM;AAAA,UAC3C,IAAI,QAAQ;AAAA,QACd,CAAC;AAAA,MACL;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAa,cACX,QAC0C;AAC1C,WAAO;AAAA,MACL,MAAM,KAAK,SAAS;AAAA,QAClB,YACE,MAAM,8BAA8B;AAAA,UAClC,QAAQ,qBAAqB,MAAM;AAAA,QACrC,CAAC;AAAA,MACL;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAa,eACX,SAC0C;AAC1C,WAAO;AAAA,MACL,MAAM,KAAK,SAAS,IAAI,YAAY;AAClC,cAAM,SAAS,qBAAqB,QAAQ,MAAM;AAClD,cAAM,UAAU,MAAM,2BAA2B,MAAM;AACvD,eAAO,MAAM,+BAA+B;AAAA,UAC1C,4BACE,QAAQ,SAAS,SACb,CAAC,IACD,CAAC,oBAAoB,QAAQ,IAAI,CAAC;AAAA,UACxC,WAAW,IAAI;AAAA,YACb,MAAM,qCAAqC,QAAQ,SAAS;AAAA,UAC9D;AAAA,UACA;AAAA,QACF,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAa,WACX,QACqC;AACrC,WAAO,MAAM,KAAK,SAAS;AAAA,MACzB,YACE,MAAM,+BAA+B,qBAAqB,MAAM,CAAC;AAAA,IACrE;AAAA,EACF;AAAA,EAEA,MAAa,aACX,QACA,YACqC;AACrC,WAAO,MAAM,KAAK,SAAS;AAAA,MACzB,YACE,MAAM;AAAA,QACJ,qBAAqB,MAAM;AAAA,QAC3B;AAAA,MACF;AAAA,IACJ;AAAA,EACF;AAAA,EAEA,MAAa,WACX,QACqC;AACrC,WAAO,MAAM,KAAK,SAAS;AAAA,MACzB,YACE,MAAM,2BAA2B,qBAAqB,MAAM,CAAC;AAAA,IACjE;AAAA,EACF;AAAA,EAEA,MAAa,YACX,QAC4C;AAC5C,WAAO,MAAM,KAAK,SAAS;AAAA,MACzB,YACE,MAAM,4BAA4B,qBAAqB,MAAM,CAAC;AAAA,IAClE;AAAA,EACF;AAAA,EAEA,MAAa,gBACX,QACA,OAC4C;AAC5C,WAAO,MAAM,KAAK,SAAS;AAAA,MACzB,YACE,MAAM;AAAA,QACJ,qBAAqB,MAAM;AAAA,QAC3B;AAAA,MACF;AAAA,IACJ;AAAA,EACF;AAAA,EAEA,MAAa,YACX,QACA,KACA,OAC4C;AAC5C,WAAO,MAAM,KAAK,SAAS;AAAA,MACzB,YACE,MAAM;AAAA,QACJ,qBAAqB,MAAM;AAAA,QAC3B;AAAA,QACA;AAAA,MACF;AAAA,IACJ;AAAA,EACF;AAAA,EAEA,MAAa,eACX,QACA,KAC4C;AAC5C,WAAO,MAAM,KAAK,SAAS;AAAA,MACzB,YACE,MAAM;AAAA,QACJ,qBAAqB,MAAM;AAAA,QAC3B;AAAA,MACF;AAAA,IACJ;AAAA,EACF;AAAA,EAEA,MAAa,cACX,QAC4C;AAC5C,WAAO,MAAM,KAAK,SAAS;AAAA,MACzB,YACE,MAAM,8BAA8B,qBAAqB,MAAM,CAAC;AAAA,IACpE;AAAA,EACF;AAAA,EAEA,MAAa,OACX,QACA,OACA,UAAyC,CAAC,GAChB;AAC1B,UAAM,SAAS,MAAM,KAAK,SAAS,IAAI,YAAY;AACjD,YAAM,oBAAoB,MAAM;AAAA,QAC9B,QAAQ;AAAA,MACV;AACA,aAAO,MAAMC;AAAA,QACX,qBAAqB,MAAM;AAAA,QAC3B;AAAA,QACA;AAAA,UACE,GAAG;AAAA,UACH,GAAI,sBAAsB,SAAY,CAAC,IAAI,EAAE,kBAAkB;AAAA,QACjE;AAAA,MACF;AAAA,IACF,CAAC;AACD,WAAO;AAAA,MACL;AAAA,MACA,OAAO,QAAQ,gBACb,MAAM,KAAK,OAAO,QAAQ,OAAO;AAAA,QAC/B,GAAG;AAAA,QACH;AAAA,QACA,GAAI,YAAY,UAAU,SACtB,CAAC,IACD,EAAE,OAAO,YAAY,MAAM;AAAA,QAC/B,GAAI,YAAY,WAAW,SACvB,CAAC,IACD,EAAE,QAAQ,YAAY,OAAO;AAAA,MACnC,CAAC;AAAA,MACH,CAAC,WAAW,QAAQ,QAAQ,MAAM;AAAA,MAClC,MAAM,QAAQ,QAAQ;AAAA,IACxB;AAAA,EACF;AAAA,EAEA,MAAa,cACX,QACA,OACA,SAIC;AACD,UAAM,SAAS,MAAM,KAAK,SAAS,IAAI,YAAY;AACjD,YAAM,oBAAoB,MAAM;AAAA,QAC9B,QAAQ;AAAA,MACV;AACA,aAAO,MAAM;AAAA,QACX,qBAAqB,MAAM;AAAA,QAC3B;AAAA,QACA;AAAA,UACE,GAAG;AAAA,UACH,GAAI,sBAAsB,SAAY,CAAC,IAAI,EAAE,kBAAkB;AAAA,QACjE;AAAA,MACF;AAAA,IACF,CAAC;AACD,WAAO;AAAA,MACL,SAAS,OAAO,QAAQ;AAAA,QAAI,CAAC,WAC3B;AAAA,UACE;AAAA,UACA,OAAO,QAAQ,gBACb,MAAM,KAAK,qBAAqB,QAAQ,QAAQ;AAAA,YAC9C,GAAI,YAAY,UAAU,SACtB,CAAC,IACD,EAAE,OAAO,YAAY,MAAM;AAAA,UACjC,CAAC;AAAA,UACH,CAAC,WAAW,QAAQ,QAAQ,MAAM;AAAA,UAClC,MAAM,QAAQ,QAAQ;AAAA,QACxB;AAAA,MACF;AAAA,MACA,OAAO,OAAO;AAAA,IAChB;AAAA,EACF;AAAA,EAEA,MAAa,qBACX,QACA,QACA,UAAqD,CAAC,GAC1B;AAC5B,UAAM,SAAS,MAAM,KAAK,SAAS,IAAI,YAAY;AACjD,YAAM,oBAAoB,MAAM,8BAA8B,MAAS;AACvE,aAAO,MAAM;AAAA,QACX,qBAAqB,MAAM;AAAA,QAC3B;AAAA,QACA;AAAA,UACE,GAAG;AAAA,UACH,GAAI,sBAAsB,SAAY,CAAC,IAAI,EAAE,kBAAkB;AAAA,QACjE;AAAA,MACF;AAAA,IACF,CAAC;AACD,WAAO;AAAA,MACL;AAAA,MACA,OAAO,YAAY,gBACjB,MAAM,KAAK,qBAAqB,QAAQ,YAAY;AAAA,QAClD,GAAG;AAAA,QACH,GAAI,YAAY,UAAU,SACtB,CAAC,IACD,EAAE,OAAO,YAAY,MAAM;AAAA,MACjC,CAAC;AAAA,MACH,CAACC,YAAW,QAAQ,QAAQA,OAAM;AAAA,MAClC,MAAM,QAAQ,QAAQ;AAAA,IACxB;AAAA,EACF;AAAA,EAEA,MAAa,qBACX,QACA,OACA,UAAyC,CAAC,GAChB;AAC1B,UAAM,SAAS,MAAM,KAAK,SAAS,IAAI,YAAY;AACjD,YAAM,oBAAoB,MAAM;AAAA,QAC9B,QAAQ;AAAA,MACV;AACA,aAAO,MAAMC;AAAA,QACX,qBAAqB,MAAM;AAAA,QAC3B;AAAA,QACA;AAAA,UACE,GAAG;AAAA,UACH,GAAI,sBAAsB,SAAY,CAAC,IAAI,EAAE,kBAAkB;AAAA,QACjE;AAAA,MACF;AAAA,IACF,CAAC;AACD,WAAO;AAAA,MACL;AAAA,MACA,OAAO,QAAQ,gBACb,MAAM,KAAK,qBAAqB,QAAQ,OAAO;AAAA,QAC7C,GAAG;AAAA,QACH;AAAA,QACA,GAAI,YAAY,UAAU,SACtB,CAAC,IACD,EAAE,OAAO,YAAY,MAAM;AAAA,QAC/B,GAAI,YAAY,WAAW,SACvB,CAAC,IACD,EAAE,QAAQ,YAAY,OAAO;AAAA,MACnC,CAAC;AAAA,MACH,CAAC,WAAW,QAAQ,QAAQ,MAAM;AAAA,MAClC,MAAM,QAAQ,QAAQ;AAAA,IACxB;AAAA,EACF;AAAA,EAEA,MAAa,QACX,QACA,UAAoC,CAAC,GACL;AAChC,UAAM,SAAS,MAAM,KAAK,SAAS;AAAA,MACjC,YACE,MAAMC;AAAA,QACJ,qBAAqB,MAAM;AAAA,QAC3B;AAAA,MACF;AAAA,IACJ;AACA,WAAO;AAAA,MACL;AAAA,MACA,OAAO,QAAQ,gBACb,MAAM,KAAK,QAAQ,QAAQ;AAAA,QACzB,GAAG;AAAA,QACH;AAAA,QACA,GAAI,YAAY,UAAU,SACtB,CAAC,IACD,EAAE,OAAO,YAAY,MAAM;AAAA,MACjC,CAAC;AAAA,MACH,CAAC,WAAW,QAAQ,QAAQ,MAAM;AAAA,MAClC,MAAM,QAAQ,QAAQ;AAAA,IACxB;AAAA,EACF;AAAA,EAEA,MAAa,eACX,QACA,UAAoC,CAAC,GACL;AAChC,UAAM,SAAS,MAAM,KAAK,SAAS;AAAA,MACjC,YACE,MAAMC;AAAA,QACJ,qBAAqB,MAAM;AAAA,QAC3B;AAAA,MACF;AAAA,IACJ;AACA,WAAO;AAAA,MACL;AAAA,MACA,OAAO,QAAQ,gBACb,MAAM,KAAK,eAAe,QAAQ;AAAA,QAChC,GAAG;AAAA,QACH;AAAA,QACA,GAAI,YAAY,UAAU,SACtB,CAAC,IACD,EAAE,OAAO,YAAY,MAAM;AAAA,MACjC,CAAC;AAAA,MACH,CAAC,WAAW,QAAQ,QAAQ,MAAM;AAAA,MAClC,MAAM,QAAQ,QAAQ;AAAA,IACxB;AAAA,EACF;AAAA,EAEA,MAAa,KACX,QACA,WACA,UAAuC,CAAC,GAClB;AACtB,WAAO,MAAM,KAAK,SAAS;AAAA,MACzB,YACE,MAAM;AAAA,QACJ;AAAA,QACA,OAAO,qBACL,MAAM;AAAA,UACJ,qBAAqB,MAAM;AAAA,UAC3B;AAAA,UACA,EAAE,GAAG,SAAS,GAAG,iBAAiB;AAAA,QACpC;AAAA,MACJ;AAAA,MACF,QAAQ;AAAA,IACV;AAAA,EACF;AAAA,EAEA,MAAa,QACX,QACA,WACA,UAA0C,CAAC,GACd;AAC7B,UAAM,SAAS,MAAM,KAAK,SAAS,IAAI,YAAY;AACjD,UAAI,QAAQ,UAAU,UAAa,QAAQ,cAAc,QAAW;AAClE,cAAM,IAAI,MAAM,+BAA+B;AAAA,MACjD;AACA,YAAM,oBACJ,QAAQ,UAAU,SACd,SACA,MAAM,8BAA8B,QAAQ,SAAS;AAC3D,aAAO,MAAMC;AAAA,QACX,qBAAqB,MAAM;AAAA,QAC3B;AAAA,QACA;AAAA,UACE,GAAG;AAAA,UACH,GAAI,sBAAsB,SAAY,CAAC,IAAI,EAAE,kBAAkB;AAAA,QACjE;AAAA,MACF;AAAA,IACF,CAAC;AACD,WAAO;AAAA,MACL;AAAA,MACA,OAAO,QAAQ,gBACb,MAAM,KAAK,QAAQ,QAAQ,WAAW;AAAA,QACpC,GAAG;AAAA,QACH;AAAA,QACA,GAAI,YAAY,UAAU,SACtB,CAAC,IACD,EAAE,OAAO,YAAY,MAAM;AAAA,QAC/B,GAAI,YAAY,WAAW,SACvB,CAAC,IACD,EAAE,QAAQ,YAAY,OAAO;AAAA,MACnC,CAAC;AAAA,MACH,CAAC,WAAW,QAAQ,QAAQ,MAAM;AAAA,MAClC,MAAM,QAAQ,QAAQ;AAAA,IACxB;AAAA,EACF;AAAA,EAEA,MAAa,SACX,QACA,WACA,UAA2C,CAAC,GACd;AAC9B,UAAM,SAAS,MAAM,KAAK,SAAS,IAAI,YAAY;AACjD,UAAI,QAAQ,UAAU,UAAa,QAAQ,cAAc,QAAW;AAClE,cAAM,IAAI,MAAM,+BAA+B;AAAA,MACjD;AACA,YAAM,oBACJ,QAAQ,UAAU,SACd,SACA,MAAM,8BAA8B,QAAQ,SAAS;AAC3D,aAAO,MAAMC;AAAA,QACX,qBAAqB,MAAM;AAAA,QAC3B;AAAA,QACA;AAAA,UACE,GAAG;AAAA,UACH,GAAI,sBAAsB,SAAY,CAAC,IAAI,EAAE,kBAAkB;AAAA,QACjE;AAAA,MACF;AAAA,IACF,CAAC;AACD,WAAO;AAAA,MACL;AAAA,MACA,OAAO,QAAQ,gBACb,MAAM,KAAK,SAAS,QAAQ,WAAW;AAAA,QACrC,GAAG;AAAA,QACH;AAAA,QACA,GAAI,YAAY,UAAU,SACtB,CAAC,IACD,EAAE,OAAO,YAAY,MAAM;AAAA,QAC/B,GAAI,YAAY,WAAW,SACvB,CAAC,IACD,EAAE,QAAQ,YAAY,OAAO;AAAA,MACnC,CAAC;AAAA,MACH,CAAC,WAAW,QAAQ,QAAQ,MAAM;AAAA,MAClC,MAAM,QAAQ,QAAQ;AAAA,IACxB;AAAA,EACF;AAAA,EAEA,MAAa,KACX,QACA,WACA,SAAS,KACa;AACtB,WAAO,MAAM,KAAK,SAAS;AAAA,MACzB,YACE,MAAM;AAAA,QACJ,qBAAqB,MAAM;AAAA,QAC3B;AAAA,QACA;AAAA,MACF;AAAA,IACJ;AAAA,EACF;AAAA,EAEA,MAAa,OAA6C;AACxD,UAAM,UAAU,MAAM,KAAK,SAAS;AAAA,MAClC,YAAY,MAAMC,wBAAuB;AAAA,IAC3C;AACA,WAAO,QAAQ,IAAI,CAAC,WAAW,IAAI,iBAAiB,KAAK,UAAU,MAAM,CAAC;AAAA,EAC5E;AACF;AAEO,IAAM,mBAAN,MAAuB;AAAA,EACnB;AAAA,EACA;AAAA,EAEF,YACL,SACA,QACA;AACA,SAAK,WAAW;AAChB,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,IAAW,WAAqC;AAC9C,WAAO,kBAAkB,KAAK,OAAO;AAAA,EACvC;AAAA,EAEA,IAAW,MAAc;AACvB,WAAOT;AAAA,MACL,KAAK,QAAQ,YAAY,SAAY,KAAK,QAAQ;AAAA,IACpD;AAAA,EACF;AAAA,EAEA,MAAa,WAAgE;AAC3E,UAAM,SAAS,qBAAqB,KAAK,GAAG;AAC5C,YACE,MAAM,KAAK,SAAS;AAAA,MAClB,YAAY,MAAMU,8BAA6B,MAAM;AAAA,IACvD,GACA,IAAI,iBAAiB;AAAA,EACzB;AAAA,EAEA,MAAa,OAA8C;AACzD,UAAM,SAAS,qBAAqB,KAAK,GAAG;AAC5C,WAAO;AAAA,MACL,MAAM,KAAK,SAAS,IAAI,YAAY,MAAM,qBAAqB,MAAM,CAAC;AAAA,IACxE;AAAA,EACF;AAAA,EAEA,MAAa,SAA4C;AACvD,UAAM,SAAS,qBAAqB,KAAK,GAAG;AAC5C,WAAO;AAAA,MACL,MAAM,KAAK,SAAS,IAAI,YAAY,MAAM,uBAAuB,MAAM,CAAC;AAAA,IAC1E;AAAA,EACF;AACF;AAEA,SAAS,kBACP,QAC0B;AAC1B,QAAM,aAAa;AAGnB,SAAO;AAAA,IACL,IAAI,OAAO;AAAA,IACX,UAAU,OAAO;AAAA,IACjB,KAAK,OAAO;AAAA,IACZ,YACE,WAAW,eACV,OAAO,WAAW,SAAY,KAAK,oBAAoB,OAAO,MAAM;AAAA,IACvE,WAAW,OAAO;AAAA,IAClB,WAAW,OAAO;AAAA,IAClB,WAAW,OAAO;AAAA,EACpB;AACF;AAEA,SAAS,kBACP,QACiC;AACjC,QAAM,EAAE,MAAM,OAAO,GAAG,SAAS,IAAI;AACrC,SAAO;AACT;AAEA,SAAS,eACP,QAC8B;AAC9B,SAAO;AAAA,IACL,GAAI,OAAO,YAAY,SACnB,CAAC,IACD,EAAE,SAAS,kBAAkB,OAAO,OAAO,EAAE;AAAA,IACjD,UAAU,OAAO,SAAS,IAAI,iBAAiB;AAAA,EACjD;AACF;AAEA,SAAS,qBACP,OAC2B;AAC3B,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,QAAM,SAASC,0BAAyB,KAAK;AAC7C,MAAI,WAAW,QAAW;AACxB,UAAM,IAAI,UAAU,mCAAmC,KAAK,EAAE;AAAA,EAChE;AACA,SAAO;AACT;AAEA,SAAS,4BACP,OAC0D;AAC1D,QAAM,SAAS,qBAAqB,KAAK;AACzC,MACE,OAAO,SAAS,aAChB,OAAO,oBAAoB,UAC3B,OAAO,cAAc,QACrB;AACA,UAAM,IAAI,UAAU,4CAA4C;AAAA,EAClE;AACA,SAAO;AACT;AAEA,SAAS,kCACP,SACoD;AACpD,MAAI,CAAC,QAAQ,UAAU,QAAQ,WAAW,WAAW;AACnD,UAAM,IAAI,MAAM,0CAA0C,QAAQ,GAAG,EAAE;AAAA,EACzE;AACA,MAAI,QAAQ,WAAW,YAAY;AACjC,UAAM,IAAI;AAAA,MACR,iEAAiE,QAAQ,GAAG;AAAA,IAC9E;AAAA,EACF;AACA,MAAI,QAAQ,SAAS,QAAW;AAC9B,UAAM,IAAI;AAAA,MACR,8CAA8C,QAAQ,GAAG;AAAA,IAC3D;AAAA,EACF;AACA,SAAO,QAAQ;AACjB;AAEA,IAAM,4BAA4B,KAAK;AAEvC,SAAS,kCACP,QACA,UACA,QAC2B;AAC3B,MAAI,WAAW;AAEf,SAAO;AAAA,IACL,CAAC,OAAO,aAAa,IAAI;AACvB,qCAA+B,UAAU,MAAM;AAC/C,UAAI,UAAU;AACZ,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAAA,MACF;AACA,iBAAW;AACX,UAAI,SAAS;AACb,UAAI,WAAW;AAEf,aAAO;AAAA,QACL,MAAM,OAA4C;AAChD,cAAI,SAAU,QAAO,EAAE,MAAM,MAAM,OAAO,OAAU;AACpD,yCAA+B,UAAU,MAAM;AAC/C,cAAI,UAAU,OAAO,MAAM;AACzB,uBAAW;AACX,mBAAO,EAAE,MAAM,MAAM,OAAO,OAAU;AAAA,UACxC;AAEA,gBAAM,SAAS,KAAK;AAAA,YAClB;AAAA,YACA,OAAO,OAAO;AAAA,UAChB;AACA,gBAAM,QAAQ,MAAM,OAAO,KAAK,QAAQ,MAAM;AAC9C,yCAA+B,UAAU,MAAM;AAC/C,oBAAU,MAAM;AAChB,iBAAO,EAAE,MAAM,OAAO,OAAO,MAAM;AAAA,QACrC;AAAA,QACA,SAA8C;AAC5C,qBAAW;AACX,iBAAO,QAAQ,QAAQ,EAAE,MAAM,MAAM,OAAO,OAAU,CAAC;AAAA,QACzD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,+BACP,UACA,QACM;AACN,MAAI,CAAC,SAAS,GAAG;AACf,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,iBAAe,MAAM;AACvB;AAEA,eAAe,qBACb,WACA,QACY;AACZ,MAAI,WAAW,OAAW,QAAO,MAAM,UAAU;AACjD,iBAAe,MAAM;AAErB,MAAI;AACJ,QAAM,UAAU,IAAI,QAAe,CAAC,UAAU,WAAW;AACvD,kBAAc;AAAA,EAChB,CAAC;AACD,QAAM,UAAU,MAAY,YAAY,YAAY,MAAM,CAAC;AAC3D,SAAO,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;AACxD,MAAI;AACF,WAAO,MAAM,QAAQ,KAAK,CAAC,UAAU,GAAG,OAAO,CAAC;AAAA,EAClD,UAAE;AACA,WAAO,oBAAoB,SAAS,OAAO;AAAA,EAC7C;AACF;AAEA,SAAS,eAAe,QAAuC;AAC7D,MAAI,QAAQ,YAAY,KAAM,OAAM,YAAY,MAAM;AACxD;AAEA,SAAS,YAAY,QAA8B;AACjD,SACE,OAAO,UACP,IAAI,aAAa,8BAA8B,YAAY;AAE/D;;;ACh9BA;AAAA,EACE;AAAA,EACA,4BAAAC;AAAA,EACA;AAAA,OAEK;AACP,SAAS,YAAAC,iBAAgB;AAiBlB,IAAM,8BAAN,MAAkC;AAAA,EAC9B;AAAA,EAEF,YAAY,SAA8B;AAC/C,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,MAAa,QACX,QAC4C;AAC5C,WAAO,MAAM,KAAK,SAAS;AAAA,MACzB,YAAY;AACV,YAAI,OAAO,SAAS,QAAQ;AAC1B,iBAAO,MAAM,kCAAkC,EAAE,MAAM,OAAO,CAAC;AAAA,QACjE;AACA,YAAI,OAAO,SAAS,WAAW;AAC7B,gBAAM,SAASC,0BAAyB,OAAO,GAAG;AAClD,cAAI,WAAW,UAAa,OAAO,SAAS,WAAW;AACrD,kBAAM,IAAI;AAAA,cACR,8CAA8C,OAAO,GAAG;AAAA,YAC1D;AAAA,UACF;AACA,iBAAO,MAAM,kCAAkC;AAAA,YAC7C,MAAM;AAAA,YACN,QAAQ;AAAA,UACV,CAAC;AAAA,QACH;AACA,cAAM,OAAO,MAAM,qCAAqC,OAAO,IAAI;AACnE,eAAO,MAAM,kCAAkC;AAAA,UAC7C,MAAM,IAAI,SAAS,IAAI;AAAA,UACvB,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAAA,MACA;AAAA,MACA,EAAE,mBAAmB,OAAO,SAAS,OAAO;AAAA,IAC9C;AAAA,EACF;AAAA,EAEA,MAAa,cACX,WACA,aAAa,sBAAsB,SAAS,GACH;AACzC,WAAO,MAAM,KAAK,SAAS,IAAI,YAAY;AACzC,YAAM,oBAAoB,4BAA4B,SAAS;AAC/D,YAAM,qBAAqB,4BAA4B,UAAU;AACjE,YAAM;AAAA,QACJ,IAAI,SAAS,iBAAiB;AAAA,QAC9B,IAAI,SAAS,oBAAoBC,UAAS,kBAAkB,CAAC;AAAA,MAC/D;AACA,aAAO;AAAA,QACL,WAAW;AAAA,QACX,YAAY;AAAA,MACd;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAEA,SAAS,sBAAsB,WAA2B;AACxD,SAAO,UAAU,YAAY,EAAE,SAAS,QAAQ,IAC5C,GAAG,UAAU,MAAM,GAAG,CAAC,SAAS,MAAM,CAAC,UACvC,GAAG,SAAS;AAClB;;;ACpFA,SAAS,wCAAwC;AA+B1C,IAAM,eAAN,MAAkD;AAAA,EAC9C;AAAA,EACT;AAAA,EACgB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAY,UAA+B,CAAC,GAAG;AACpD,kCAA8B,OAAO;AACrC,4BAAwB,QAAQ,IAAI;AACpC,SAAK,WAAW;AAAA,MACd,KAAK,QAAQ,OAAO,QAAQ,IAAI;AAAA,MAChC,KAAK,EAAE,GAAG,QAAQ,KAAK,GAAG,QAAQ,IAAI;AAAA,MACtC,WAAW,QAAQ,aAAa;AAAA,MAChC,GAAI,QAAQ,SAAS,SAAY,CAAC,IAAI,EAAE,MAAM,QAAQ,KAAK;AAAA,MAC3D,WAAW,EAAE,GAAG,QAAQ,UAAU;AAAA,MAClC,GAAI,QAAQ,aAAa,SAAY,CAAC,IAAI,EAAE,UAAU,QAAQ,SAAS;AAAA,IACzE;AACA,SAAK,WAAW,IAAI,wBAAwB,IAAI;AAChD,SAAK,cAAc,IAAI,2BAA2B,IAAI;AACtD,SAAK,SAAS,IAAI,uBAAuB,IAAI;AAC7C,SAAK,gBAAgB,IAAI,6BAA6B,IAAI;AAC1D,SAAK,OAAO,IAAI,oBAAoB,IAAI;AACxC,SAAK,YAAY,IAAI,wBAAwB,IAAI;AACjD,SAAK,cAAc,IAAI,4BAA4B,IAAI;AAAA,EACzD;AAAA,EAEA,MAAa,IACX,WACA,QACA,UAAoD,CAAC,GACzC;AACZ,IAAAC,gBAAe,MAAM;AACrB,UAAM,iBAAiB,YACrB,MAAM,+BAA+B,KAAK,UAAU,YAAY;AAC9D,UAAI,QAAQ,sBAAsB,MAAM;AACtC,aAAK,eAAe,iCAAiC,EAAE;AAAA,UACrD,CAAC,UAAmB;AAClB,iBAAK,aAAa;AAClB,kBAAM;AAAA,UACR;AAAA,QACF;AACA,cAAM,KAAK;AAAA,MACb;AACA,aAAO,MAAM,UAAU;AAAA,IACzB,CAAC;AACH,UAAM,SAAS,MAAM;AAAA,MACnB;AAAA,QACE,GAAI,KAAK,SAAS,SAAS,SACvB,CAAC,IACD,EAAE,MAAM,KAAK,SAAS,KAAK;AAAA,QAC/B,GAAI,KAAK,SAAS,aAAa,SAC3B,CAAC,IACD,EAAE,UAAU,KAAK,SAAS,SAAS;AAAA,MACzC;AAAA,MACA;AAAA,IACF;AACA,IAAAA,gBAAe,MAAM;AACrB,WAAO;AAAA,EACT;AAAA,EAEO,QAAc;AACnB,SAAK,KAAK,MAAM;AAAA,EAClB;AACF;AAEA,SAASA,gBAAe,QAAuC;AAC7D,MAAI,QAAQ,YAAY,KAAM;AAC9B,QAAM,OAAO,kBAAkB,QAC3B,OAAO,SACP,IAAI,MAAM,2CAA2C;AAC3D;AAEO,SAAS,mBACd,UAA+B,CAAC,GAClB;AACd,SAAO,IAAI,aAAa,OAAO;AACjC;;;ACvFA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA,2BAAAC;AAAA,EACA,6BAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,6BAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA,2BAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,4BAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA,4BAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;","names":["randomUUID","rename","rm","stat","basename","dirname","join","Readable","formatLocatedWikiGraphUri","isArchiveSearchIndexCurrent","listChapters","parseLocatedWikiGraphUri","WikiGraph","WikiGraphArchiveFile","rm","basename","process","resolve","content","AsyncLocalStorage","mkdir","join","homedir","formatError","homedir","isAbsolute","resolve","homedir","resolve","isAbsolute","stat","basename","dirname","isAbsolute","join","resolve","resolve","dirname","join","basename","isAbsolute","stat","rm","basename","createOpenAI","createOpenAICompatible","createOpenAI","createOpenAICompatible","createOpenAICompatibleName","join","dirname","basename","randomUUID","rename","formatLocatedWikiGraphUri","rm","parseLocatedWikiGraphUri","isArchiveSearchIndexCurrent","listChapters","result","WikiGraph","WikiGraphArchiveFile","stat","Readable","resolve","createContinuationCursor","findArchiveObjects","listArchiveCollection","listArchiveEvidence","listArchiveSourceLocators","listRelatedArchiveObjects","WikiGraphArchiveFile","createContinuationCursor","WikiGraphArchiveFile","listArchiveSourceLocators","listArchiveCollection","findArchiveObjects","listArchiveEvidence","listRelatedArchiveObjects","openWikimediaResolver","WikiGraphArchiveFile","applyChapterJobArtifactFile","createLocalChapterJobFileExecutor","writeChapterJobInputFile","resolveChapterPathReadonly","WikiGraphArchiveFile","installWikiGraphPlatform","withWikiGraphStorage","installWikiGraphPlatform","withWikiGraphStorage","applyChapterJobArtifactFile","writeChapterJobInputFile","WikiGraphArchiveFile","writeChapterJobInputFile","applyChapterJobArtifactFile","openWikimediaResolver","createLocalChapterJobFileExecutor","formatLocatedChapterUri","getBuildJob","listChapters","resolveChapterPathReadonly","WikiGraphArchiveFile","getBuildJob","WikiGraphArchiveFile","listChapters","formatLocatedChapterUri","resolveChapterPathReadonly","resolve","findWikiGraphLibraryObjects","findWikiGraphLibraryArchiveMembers","formatWikiGraphLibraryUri","listRelatedWikiGraphLibraryObjects","listWikiGraphLibraries","listWikiGraphLibraryArchives","listWikiGraphLibraryArchiveMembers","listWikiGraphLibraryEvidence","listWikiGraphLibraryObjects","parseWikiGraphLibraryUri","resolveWikiGraphLibrary","mkdir","mkdir","formatWikiGraphLibraryUri","resolveWikiGraphLibrary","findWikiGraphLibraryObjects","cursor","findWikiGraphLibraryArchiveMembers","listWikiGraphLibraryObjects","listWikiGraphLibraryArchiveMembers","listRelatedWikiGraphLibraryObjects","listWikiGraphLibraryEvidence","listWikiGraphLibraries","listWikiGraphLibraryArchives","parseWikiGraphLibraryUri","parseWikiGraphLibraryUri","basename","parseWikiGraphLibraryUri","basename","throwIfAborted","formatError","formatLocatedChapterUri","formatLocatedWikiGraphUri","formatWikiGraphLibraryUri","isSourceLocatorScopeUri","parseLocatedWikiGraphUri","parseWikiGraphLibraryUri"]}
|
|
1
|
+
{"version":3,"sources":["../src/archive/archive.ts","../src/conversions.ts","../src/llm.ts","../src/node-platform.ts","../src/runtime-config.ts","../src/local-config.ts","../src/runtime-context.ts","../src/providers.ts","../src/runtime-path.ts","../src/archive/target.ts","../src/query-runtime.ts","../src/embedding.ts","../src/archive/inspect.ts","../src/archive/write.ts","../src/pages.ts","../src/result-pages.ts","../src/wikispine.ts","../src/config.ts","../src/continuations.ts","../src/default-worker.ts","../src/stage.ts","../src/planning.ts","../src/worker.ts","../src/host.ts","../src/entry-context.ts","../src/jobs.ts","../src/libraries.ts","../src/maintenance.ts","../src/sdk.ts","../src/index.ts"],"sourcesContent":["import { randomUUID } from \"crypto\";\nimport { link, mkdtemp, rename, rm, stat } from \"fs/promises\";\nimport { tmpdir } from \"os\";\nimport { basename, dirname, join } from \"path\";\nimport { Readable } from \"stream\";\n\nimport {\n addChapter,\n applyChapterTree,\n assertArchiveQueryReady,\n resolveIndexedArchiveChapterScope,\n ensureWikiGraphArchiveSchemaCurrent,\n assertNoActiveBuildJobConflicts,\n assertNoActiveBuildJobs,\n deleteArchiveSearchSessions,\n createContinuationCursor,\n deleteContinuationCursor,\n DirectoryDocument,\n findArchiveObjects,\n formatLocatedWikiGraphUri,\n isArchiveSearchIndexCurrent,\n isSourceLocatorScopeUri,\n listArchiveCollection,\n listArchiveEvidence,\n listArchiveQueryableChapterIds,\n listArchiveSourceLocators,\n listChapters,\n listRelatedArchiveObjects,\n moveChapter,\n packArchiveContext,\n parseLocatedWikiGraphUri,\n readArchivePage,\n readSearchIndexCapabilityStatus,\n rebuildArchiveSearchIndex,\n removeChapter,\n resetChapter,\n resolveChapterPathReadonly,\n setChapterSource,\n setChapterSummary,\n setChapterTitle,\n getChapterTree,\n WikiGraph,\n WikiGraphArchiveFile,\n WikiGraphDirectoryFile,\n TOC_FILE_VERSION,\n writeWikgArchive,\n type ArchiveCollectionOptions,\n type ArchiveCollectionResult,\n type ArchiveFindOptions,\n type ArchivePack,\n type ArchivePage,\n type ArchiveSourceLocatorResult,\n type BookMeta,\n type ChapterEntry,\n type ChapterDetails,\n type ChapterStage,\n type ChapterTree,\n type ChapterTreeApplyResult,\n type File,\n type Directory,\n type IndexArtifactKind,\n ObjectMetadataKind,\n type ObjectMetadataTarget,\n type QueryIndexScope,\n type ContinuationCursor,\n type ReadonlyDocument,\n type SearchIndexEmbeddingProvider,\n type SearchIndexQueryMode,\n type WikiGraphProgressCallback,\n} from \"wiki-graph-core\";\n\nimport type { WikiGraphJobRuntime } from \"../jobs.js\";\nimport { WikiGraphConversionManager } from \"../conversions.js\";\nimport { NodeDirectory, NodeFile } from \"../node-platform.js\";\nimport {\n createConfiguredEmbeddingProvider,\n withConfiguredWikimediaResolver,\n} from \"../query-runtime.js\";\nimport {\n inspectWikiGraphArchive,\n type WikiGraphArchiveInspection,\n} from \"./inspect.js\";\nimport {\n assertStandaloneWikiGraphArchivePath,\n requireWikiGraphArchiveFile,\n resolveWikiGraphArchiveLocation,\n rethrowArchiveSchemaError,\n type WikiGraphArchiveLocation,\n type WikiGraphArchiveTarget,\n} from \"./target.js\";\nimport { writeWikiGraphArchiveLocation } from \"./write.js\";\nimport {\n createArchiveCollectionPage,\n createArchiveEvidencePage,\n createArchiveFindPage,\n createArchiveRelatedPage,\n createArchiveSourceLocatorPage,\n type ArchiveCollectionPage,\n type ArchiveEvidencePage,\n type ArchiveFindPage,\n type ArchiveRelatedPage,\n type ArchiveSourceLocatorPage,\n} from \"../result-pages.js\";\n\nexport interface WikiGraphOperationOptions {\n readonly signal?: AbortSignal;\n}\n\ntype SearchIndexCapabilityStatus = Awaited<\n ReturnType<typeof readSearchIndexCapabilityStatus>\n>;\ntype SearchIndexProgressEvent = Parameters<\n NonNullable<Parameters<typeof rebuildArchiveSearchIndex>[1]>\n>[0];\nexport type WikiGraphChapterResetStage = Exclude<ChapterStage, \"summarized\">;\nexport type WikiGraphChapterSourceOptions = NonNullable<\n Parameters<typeof setChapterSource>[3]\n>;\nexport type WikiGraphChapterTreeInput = Parameters<typeof applyChapterTree>[1];\n\nexport interface WikiGraphArchiveCreateOptions extends WikiGraphOperationOptions {\n readonly importPath?: string;\n readonly onProgress?: WikiGraphProgressCallback;\n readonly path: string;\n readonly replace?: boolean;\n}\n\nexport interface WikiGraphArchiveCreateResult {\n readonly locatedUri: string;\n readonly path: string;\n}\n\nexport class WikiGraphArchiveExistsError extends Error {\n public readonly code = \"WIKI_GRAPH_ARCHIVE_EXISTS\";\n public readonly path: string;\n\n public constructor(path: string) {\n super(`Archive already exists: ${path}`);\n this.name = \"WikiGraphArchiveExistsError\";\n this.path = path;\n }\n}\n\nexport interface WikiGraphArchiveWriteOptions extends WikiGraphOperationOptions {\n readonly onIndexSyncError?: (error: unknown) => void;\n readonly refreshLibraryIndex?: boolean;\n readonly searchIndexWritebackPolicy?: \"archive\" | \"cache\";\n}\n\nexport interface WikiGraphArchiveIndexStatus {\n readonly capabilities: SearchIndexCapabilityStatus;\n readonly current: boolean;\n}\n\nexport interface WikiGraphArchiveCover {\n readonly data: Uint8Array;\n readonly mediaType: string;\n readonly path: string;\n}\n\nexport interface WikiGraphArchiveIndexSyncOptions extends WikiGraphOperationOptions {\n readonly onProgress?: (\n event: SearchIndexProgressEvent,\n ) => void | Promise<void>;\n readonly skipUnindexed?: boolean;\n}\n\nexport interface WikiGraphChapterArtifactStatus {\n readonly artifact?: {\n readonly createdAt: string;\n readonly metadata: Readonly<Record<string, unknown>>;\n readonly sourceRevision: number;\n };\n readonly chapterId: number;\n readonly current: boolean;\n readonly kind: IndexArtifactKind;\n readonly missing: boolean;\n readonly revision: number;\n}\n\nexport interface WikiGraphChapterMoveOptions {\n readonly afterPath?: string;\n readonly beforePath?: string;\n readonly first?: boolean;\n readonly last?: boolean;\n readonly parentPath?: string;\n readonly root?: boolean;\n}\n\nexport interface WikiGraphArchiveScopeOptions {\n readonly chapters?: readonly number[];\n readonly depth?: number;\n}\n\nexport interface WikiGraphArchiveSearchOptions\n extends\n Omit<ArchiveFindOptions, \"archiveKey\" | \"chapters\">,\n WikiGraphArchiveScopeOptions,\n WikiGraphOperationOptions {}\n\nexport interface WikiGraphArchiveListOptions\n extends\n Omit<ArchiveCollectionOptions, \"chapters\">,\n WikiGraphArchiveScopeOptions,\n WikiGraphOperationOptions {}\n\nexport interface WikiGraphArchivePageOptions extends WikiGraphOperationOptions {\n readonly backlinks?: boolean;\n readonly evidenceLimit?: number;\n readonly order?: \"doc-asc\" | \"doc-desc\";\n readonly sourceContext?: number;\n}\n\nexport interface WikiGraphArchiveRelatedOptions extends WikiGraphOperationOptions {\n readonly cursor?: string;\n readonly evidenceLimit?: number;\n readonly limit?: number;\n readonly order?: \"doc-asc\" | \"doc-desc\";\n readonly query?: string;\n readonly queryMode?: SearchIndexQueryMode;\n readonly role?: \"any\" | \"object\" | \"self\" | \"subject\";\n readonly skipUnindexed?: boolean;\n readonly sourceContext?: number;\n}\n\nexport interface WikiGraphArchiveEvidenceOptions extends WikiGraphOperationOptions {\n readonly cursor?: string;\n readonly limit?: number;\n readonly order?: \"doc-asc\" | \"doc-desc\";\n readonly query?: string;\n readonly queryMode?: SearchIndexQueryMode;\n readonly skipUnindexed?: boolean;\n readonly sourceContext?: number;\n}\n\nexport interface WikiGraphArchiveScope {\n readonly chapterIds: readonly number[];\n readonly entries: readonly ChapterEntry[];\n}\n\nexport class WikiGraphArchiveManager {\n readonly #runtime: WikiGraphJobRuntime;\n\n public constructor(runtime: WikiGraphJobRuntime) {\n this.#runtime = runtime;\n }\n\n public async create(\n options: WikiGraphArchiveCreateOptions,\n ): Promise<WikiGraphArchiveCreateResult> {\n return await this.#runtime.run(async () => {\n const path = await assertStandaloneWikiGraphArchivePath(options.path);\n if (options.replace !== true && (await nodePathExists(path))) {\n throw new WikiGraphArchiveExistsError(path);\n }\n const outputPath = join(\n dirname(path),\n `.${basename(path)}.${randomUUID()}.tmp.wikg`,\n );\n try {\n if (options.importPath === undefined) {\n await createEmptyArchiveFile(outputPath);\n } else {\n await new WikiGraphConversionManager(this.#runtime).convert({\n input: { format: \"epub\", path: options.importPath },\n ...(options.onProgress === undefined\n ? {}\n : { onProgress: options.onProgress }),\n output: { format: \"wikg\", path: outputPath },\n targetStage: \"sourced\",\n });\n }\n if (options.replace === true) {\n await rename(outputPath, path);\n } else {\n try {\n // A hard-link is an atomic no-clobber publish because the private\n // temporary file lives beside the target on the same filesystem.\n await link(outputPath, path);\n } catch (error) {\n if (isNodeEEXISTError(error)) {\n throw new WikiGraphArchiveExistsError(path);\n }\n throw error;\n }\n }\n return { locatedUri: formatLocatedWikiGraphUri(path), path };\n } finally {\n await rm(outputPath, { force: true, recursive: true });\n }\n }, options.signal);\n }\n\n public async open(\n target: WikiGraphArchiveTarget,\n options: WikiGraphOperationOptions = {},\n ): Promise<WikiGraphArchiveHandle> {\n const location = await this.#runtime.run(async () => {\n const location = await resolveWikiGraphArchiveLocation(target);\n try {\n await ensureWikiGraphArchiveSchemaCurrent(location.archiveFile);\n } catch (error) {\n rethrowArchiveSchemaError(error, target);\n }\n return location;\n }, options.signal);\n return new WikiGraphArchiveHandle(this.#runtime, location);\n }\n}\n\nexport class WikiGraphArchiveHandle {\n readonly #runtime: WikiGraphJobRuntime;\n readonly #location: WikiGraphArchiveLocation;\n\n public constructor(runtime: WikiGraphJobRuntime, location: unknown) {\n this.#runtime = runtime;\n this.#location = location as WikiGraphArchiveLocation;\n }\n\n public get archiveKey(): string {\n return this.#location.archiveKey;\n }\n\n public get indexScope(): QueryIndexScope {\n return this.#location.indexScope;\n }\n\n public get locatedUri(): string {\n return this.#location.locatedUri;\n }\n\n public get objectUri(): string {\n return (\n parseLocatedWikiGraphUri(this.#location.locatedUri).objectUri ?? \"wikg://\"\n );\n }\n\n public get path(): string {\n return this.#location.archivePath;\n }\n\n public get target(): WikiGraphArchiveTarget {\n return this.#location.target;\n }\n\n async #persistCursor(cursor: ContinuationCursor): Promise<string> {\n return await this.#runtime.run(\n async () => await createContinuationCursor(cursor),\n );\n }\n\n async #releaseCursor(cursor: string): Promise<void> {\n await this.#runtime.run(async () => await deleteContinuationCursor(cursor));\n }\n\n public async inspect(\n options: WikiGraphOperationOptions & { readonly chapterId?: number } = {},\n ): Promise<WikiGraphArchiveInspection> {\n return await this.#readDocument(\n async (document) =>\n await inspectWikiGraphArchive(document, {\n archiveUri: this.#location.publicArchiveUri ?? this.locatedUri,\n ...(options.chapterId === undefined\n ? {}\n : { chapterId: options.chapterId }),\n }),\n options,\n );\n }\n\n public async search(\n query: string,\n options: WikiGraphArchiveSearchOptions = {},\n ): Promise<ArchiveFindPage> {\n const embeddingProvider = await this.#resolveQueryEmbeddingProvider(\n options.queryMode,\n options.signal,\n );\n const result = await this.#readDocument(\n async (document) => {\n const chapters = await this.#resolveQueryChapters(document, options, {\n embeddingProvider,\n });\n return await findArchiveObjects(document, query, {\n ...withoutOperationAndScope(options),\n archiveKey: this.archiveKey,\n ...(chapters === undefined ? {} : { chapters }),\n ...(embeddingProvider === undefined ? {} : { embeddingProvider }),\n });\n },\n {\n ...(options.signal === undefined ? {} : { signal: options.signal }),\n },\n );\n return createArchiveFindPage(\n result,\n async (cursor, nextOptions) =>\n await this.search(query, {\n ...options,\n cursor,\n ...(nextOptions.limit === undefined\n ? {}\n : { limit: nextOptions.limit }),\n ...(nextOptions.signal === undefined\n ? {}\n : { signal: nextOptions.signal }),\n }),\n (cursor) =>\n this.#persistCursor({\n archiveKey: this.archiveKey,\n archivePath: this.path,\n chapters: options.chapters ?? null,\n cursor,\n format: \"json\",\n indexScope: this.indexScope,\n kind: \"search\",\n ...(options.backlinks === undefined\n ? {}\n : { backlinks: options.backlinks }),\n ...(options.evidenceLimit === undefined\n ? {}\n : { evidenceLimit: options.evidenceLimit }),\n ...(options.match === undefined ? {} : { match: options.match }),\n ...(options.order === undefined ? {} : { order: options.order }),\n query,\n ...(options.queryMode === undefined\n ? {}\n : { queryMode: options.queryMode }),\n ...(options.skipUnindexed === undefined\n ? {}\n : { skipUnindexed: options.skipUnindexed }),\n ...(options.sourceContext === undefined\n ? {}\n : { sourceContext: options.sourceContext }),\n ...(options.triplePattern === undefined\n ? {}\n : { triplePattern: options.triplePattern }),\n types: options.types ?? null,\n }),\n (token) => this.#releaseCursor(token),\n );\n }\n\n public async list(\n options: WikiGraphArchiveListOptions = {},\n ): Promise<ArchiveCollectionPage | ArchiveSourceLocatorPage> {\n const result = await this.#readDocument(async (document) => {\n if (isSourceLocatorScopeUri(this.objectUri)) {\n return await listArchiveSourceLocators(document, this.objectUri, {\n ...(options.cursor === undefined ? {} : { cursor: options.cursor }),\n ...(options.limit === undefined ? {} : { limit: options.limit }),\n });\n }\n const chapters = await this.#resolveScope(document, options);\n return await listArchiveCollection(document, {\n ...withoutOperationAndScope(options),\n ...(chapters === undefined ? {} : { chapters }),\n });\n }, options);\n if (isSourceLocatorScopeUri(this.objectUri)) {\n return createArchiveSourceLocatorPage(\n result as ArchiveSourceLocatorResult,\n async (cursor, nextOptions) =>\n (await this.list({\n ...options,\n cursor,\n ...(nextOptions.limit === undefined\n ? {}\n : { limit: nextOptions.limit }),\n ...(nextOptions.signal === undefined\n ? {}\n : { signal: nextOptions.signal }),\n })) as ArchiveSourceLocatorPage,\n (cursor) =>\n this.#persistCursor({\n archiveKey: this.archiveKey,\n archivePath: this.path,\n cursor,\n format: \"json\",\n indexScope: this.indexScope,\n kind: \"source-locators\",\n targetUri: this.objectUri,\n }),\n (token) => this.#releaseCursor(token),\n );\n }\n return createArchiveCollectionPage(\n result as ArchiveCollectionResult,\n async (cursor, nextOptions) =>\n (await this.list({\n ...options,\n cursor,\n ...(nextOptions.limit === undefined\n ? {}\n : { limit: nextOptions.limit }),\n ...(nextOptions.signal === undefined\n ? {}\n : { signal: nextOptions.signal }),\n })) as ArchiveCollectionPage,\n (cursor) =>\n this.#persistCursor({\n archiveKey: this.archiveKey,\n archivePath: this.path,\n ...(options.backlinks === undefined\n ? {}\n : { backlinks: options.backlinks }),\n chapters: options.chapters ?? null,\n cursor,\n ...(options.evidenceLimit === undefined\n ? {}\n : { evidenceLimit: options.evidenceLimit }),\n format: \"json\",\n ids: options.ids ?? null,\n indexScope: this.indexScope,\n kind: \"collection\",\n order: options.order ?? \"doc-asc\",\n ...(options.sourceContext === undefined\n ? {}\n : { sourceContext: options.sourceContext }),\n ...(options.triplePattern === undefined\n ? {}\n : { triplePattern: options.triplePattern }),\n types: options.types ?? null,\n }),\n (token) => this.#releaseCursor(token),\n );\n }\n\n public async ensureSearchIndex(\n options: WikiGraphArchiveScopeOptions & WikiGraphOperationOptions = {},\n ): Promise<void> {\n const embeddingProvider = await this.#runtime.run(\n createConfiguredEmbeddingProvider,\n options.signal,\n );\n await this.#writeDocument(\n async (document) => {\n const chapters = await this.#resolveScope(document, options);\n await ensureArchiveSearchIndex(document, {\n rebuild: true,\n ...(chapters === undefined ? {} : { chapters }),\n ...(embeddingProvider === undefined ? {} : { embeddingProvider }),\n });\n },\n {\n searchIndexWritebackPolicy: \"cache\",\n ...(options.signal === undefined ? {} : { signal: options.signal }),\n },\n );\n }\n\n public async getSearchIndexStatus(\n options: WikiGraphOperationOptions = {},\n ): Promise<WikiGraphArchiveIndexStatus> {\n return await this.#readDocument(\n async (document) => ({\n capabilities: await readSearchIndexCapabilityStatus(document),\n current: await isArchiveSearchIndexCurrent(document),\n }),\n options,\n );\n }\n\n public async syncSearchIndex(\n options: WikiGraphArchiveIndexSyncOptions = {},\n ): Promise<{ readonly rebuilt: boolean }> {\n const rebuilt = await this.#writeDocument(\n async (document) => {\n const scope =\n options.skipUnindexed === true\n ? { chapters: await listArchiveQueryableChapterIds(document) }\n : {};\n if (scope.chapters?.length === 0) {\n throw new Error(\n \"Wiki Graph index cache is not ready. No chapters have a current FTS artifact or source embedding artifact.\",\n );\n }\n if (await isArchiveSearchIndexCurrent(document, scope)) return false;\n await rebuildArchiveSearchIndex(document, options.onProgress, scope);\n return true;\n },\n {\n searchIndexWritebackPolicy: \"cache\",\n ...(options.signal === undefined ? {} : { signal: options.signal }),\n },\n );\n await this.#runtime.run(\n async () => await deleteArchiveSearchSessions(this.path),\n options.signal,\n );\n return { rebuilt };\n }\n\n public async cleanSearchIndex(\n options: WikiGraphOperationOptions = {},\n ): Promise<WikiGraphArchiveIndexStatus> {\n const status = await this.#writeDocument(\n async (document) => {\n await document.deleteSearchIndexDatabase();\n return {\n capabilities: {\n dense: { current: false },\n indexes: \"missing\" as const,\n },\n current: false,\n };\n },\n {\n searchIndexWritebackPolicy: \"cache\",\n ...(options.signal === undefined ? {} : { signal: options.signal }),\n },\n );\n await this.#runtime.run(\n async () => await deleteArchiveSearchSessions(this.path),\n options.signal,\n );\n return status;\n }\n\n /** Clear cached search sessions without changing the archive index. */\n public async clearSearchSessions(\n options: WikiGraphOperationOptions = {},\n ): Promise<void> {\n await this.#runtime.run(\n async () => await deleteArchiveSearchSessions(this.path),\n options.signal,\n );\n }\n\n public async listChapters(\n options: WikiGraphOperationOptions = {},\n ): Promise<readonly ChapterEntry[]> {\n return await this.#readDocument(\n async (document) => await listChapters(document),\n options,\n );\n }\n\n public async getChapter(\n path: string,\n options: WikiGraphOperationOptions = {},\n ): Promise<ChapterEntry> {\n return await this.#readDocument(async (document) => {\n const chapterId = await resolveChapterPathReadonly(document, path);\n return requireChapter(await listChapters(document), chapterId);\n }, options);\n }\n\n public async addChapter(options: {\n readonly parentPath?: string;\n readonly source?: string;\n readonly title?: string;\n }): Promise<ChapterDetails> {\n return await this.#writeDocument(async (document) => {\n const parentChapterId = await resolveOptionalChapterPath(\n document,\n options.parentPath,\n );\n await assertNoActiveBuildJobConflicts({\n archive: this.#location.archiveFile,\n operation: \"Adding chapter\",\n scope: { kind: \"archive\" },\n });\n let details = await addChapter(document, {\n ...(parentChapterId === undefined ? {} : { parentChapterId }),\n ...(options.title === undefined ? {} : { title: options.title }),\n });\n if (options.source !== undefined) {\n details = await setChapterSource(\n document,\n details.chapterId,\n asTextStream(options.source),\n );\n }\n return details;\n });\n }\n\n public async getChapterArtifact(\n path: string,\n kind: IndexArtifactKind,\n ): Promise<WikiGraphChapterArtifactStatus> {\n return await this.#readDocument(async (document) => {\n const chapterId = await resolveChapterPathReadonly(document, path);\n const [artifact, revision] = await Promise.all([\n document.indexArtifacts.get(chapterId, kind),\n document.serials.getRevision(chapterId),\n ]);\n return {\n ...(artifact === undefined\n ? {}\n : {\n artifact: {\n createdAt: artifact.createdAt,\n metadata: artifact.metadata,\n sourceRevision: artifact.sourceRevision,\n },\n }),\n chapterId,\n current: artifact?.sourceRevision === revision,\n kind,\n missing: artifact === undefined,\n revision,\n };\n });\n }\n\n public async deleteChapterArtifact(\n path: string,\n kind: IndexArtifactKind,\n ): Promise<{\n readonly chapterId: number;\n readonly deleted: true;\n readonly kind: IndexArtifactKind;\n }> {\n return await this.#writeDocument(async (document) => {\n const chapterId = await resolveChapterPathReadonly(document, path);\n await document.indexArtifacts.delete(chapterId, kind);\n return { chapterId, deleted: true, kind };\n });\n }\n\n public async moveChapter(\n path: string,\n options: WikiGraphChapterMoveOptions,\n ): Promise<ChapterDetails> {\n return await this.#writeDocument(async (document) => {\n const chapterId = await resolveChapterPathReadonly(document, path);\n const [afterChapterId, beforeChapterId, parentChapterId] =\n await Promise.all([\n resolveOptionalChapterPath(document, options.afterPath),\n resolveOptionalChapterPath(document, options.beforePath),\n resolveOptionalChapterPath(document, options.parentPath),\n ]);\n await assertNoActiveBuildJobConflicts({\n archive: this.#location.archiveFile,\n operation: \"Moving chapter\",\n scope: { kind: \"archive\" },\n });\n return await moveChapter(document, chapterId, {\n ...(afterChapterId === undefined ? {} : { afterChapterId }),\n ...(beforeChapterId === undefined ? {} : { beforeChapterId }),\n ...(parentChapterId === undefined ? {} : { parentChapterId }),\n ...(options.first === undefined ? {} : { first: options.first }),\n ...(options.last === undefined ? {} : { last: options.last }),\n ...(options.root === undefined ? {} : { root: options.root }),\n });\n });\n }\n\n public async removeChapter(path: string, recursive = false): Promise<void> {\n await this.#writeDocument(async (document) => {\n const chapterId = await resolveChapterPathReadonly(document, path);\n await assertNoActiveBuildJobConflicts({\n archive: this.#location.archiveFile,\n operation: \"Removing chapter\",\n scope: { kind: \"archive\" },\n });\n await removeChapter(document, chapterId, { recursive });\n });\n }\n\n public async resetChapter(\n path: string,\n stage: WikiGraphChapterResetStage,\n ): Promise<ChapterDetails> {\n return await this.#writeDocument(async (document) => {\n const chapterId = await resolveChapterPathReadonly(document, path);\n await assertChapterResetAllowed(\n requireWikiGraphArchiveFile(this.#location),\n chapterId,\n stage,\n );\n return await resetChapter(document, chapterId, stage);\n });\n }\n\n public async setChapterSource(\n path: string,\n source: string,\n options: WikiGraphChapterSourceOptions = {},\n ): Promise<ChapterDetails> {\n return await this.#writeDocument(async (document) => {\n const chapterId = await resolveChapterPathReadonly(document, path);\n await assertNoActiveBuildJobs({\n archive: this.#location.archiveFile,\n chapterIds: [chapterId],\n operation: \"Setting chapter source\",\n });\n return await setChapterSource(\n document,\n chapterId,\n asTextStream(source),\n options,\n );\n });\n }\n\n public async setChapterSummary(\n path: string,\n summary: string,\n ): Promise<ChapterDetails> {\n return await this.#writeDocument(async (document) => {\n const chapterId = await resolveChapterPathReadonly(document, path);\n await assertNoActiveBuildJobs({\n archive: this.#location.archiveFile,\n chapterIds: [chapterId],\n operation: \"Setting chapter summary\",\n requiresTarget: \"reading-summary\",\n });\n return await setChapterSummary(document, chapterId, summary);\n });\n }\n\n public async setChapterTitle(\n path: string,\n title: Parameters<typeof setChapterTitle>[2],\n ): Promise<ChapterDetails> {\n return await this.#writeDocument(async (document) => {\n const chapterId = await resolveChapterPathReadonly(document, path);\n await assertNoActiveBuildJobs({\n archive: this.#location.archiveFile,\n chapterIds: [chapterId],\n operation: \"Setting chapter title\",\n });\n return await setChapterTitle(document, chapterId, title);\n });\n }\n\n public async getChapterTree(): Promise<ChapterTree> {\n return await this.#readDocument(\n async (document) => await getChapterTree(document),\n );\n }\n\n public async applyChapterTree(\n tree: WikiGraphChapterTreeInput,\n options: { readonly dryRun?: boolean } = {},\n ): Promise<ChapterTreeApplyResult> {\n return await this.#writeDocument(\n async (document) => {\n if (options.dryRun !== true) {\n await assertNoActiveBuildJobConflicts({\n archive: this.#location.archiveFile,\n operation: \"Changing chapter tree\",\n scope: { kind: \"archive\" },\n });\n }\n return await applyChapterTree(document, tree, {\n dryRun: options.dryRun ?? false,\n });\n },\n { refreshLibraryIndex: options.dryRun !== true },\n );\n }\n\n public async page(\n objectUri = this.objectUri,\n options: WikiGraphArchivePageOptions = {},\n ): Promise<ArchivePage> {\n return await this.#runtime.run(\n async () =>\n await withConfiguredWikimediaResolver(\n objectUri,\n async (wikimediaOptions) =>\n await this.#readDocument(\n async (document) =>\n await readArchivePage(document, objectUri, {\n ...options,\n ...wikimediaOptions,\n }),\n options,\n ),\n ),\n options.signal,\n );\n }\n\n public async related(\n objectUri = this.objectUri,\n options: WikiGraphArchiveRelatedOptions = {},\n ): Promise<ArchiveRelatedPage> {\n if (options.query === undefined) {\n if (options.queryMode !== undefined) {\n throw new Error(\"`queryMode` requires `query`.\");\n }\n const result = await this.#readDocument(async (document) => {\n const chapters = await this.#resolveScope(document, {});\n return await listRelatedArchiveObjects(document, objectUri, {\n ...withoutOperation(options),\n ...(chapters === undefined ? {} : { chapters }),\n });\n }, options);\n return createArchiveRelatedPage(\n result,\n async (cursor, nextOptions) =>\n await this.related(objectUri, {\n ...options,\n cursor,\n ...(nextOptions.limit === undefined\n ? {}\n : { limit: nextOptions.limit }),\n ...(nextOptions.signal === undefined\n ? {}\n : { signal: nextOptions.signal }),\n }),\n (cursor) => Promise.resolve(cursor),\n () => Promise.resolve(),\n );\n }\n const embeddingProvider = await this.#resolveQueryEmbeddingProvider(\n options.queryMode,\n options.signal,\n );\n const result = await this.#readDocument(\n async (document) => {\n const chapters = await this.#resolveQueryChapters(document, options, {\n embeddingProvider,\n });\n return await listRelatedArchiveObjects(document, objectUri, {\n ...withoutOperation(options),\n ...(embeddingProvider === undefined ? {} : { embeddingProvider }),\n ...(chapters === undefined ? {} : { chapters }),\n });\n },\n {\n ...(options.signal === undefined ? {} : { signal: options.signal }),\n },\n );\n return createArchiveRelatedPage(\n result,\n async (cursor, nextOptions) =>\n await this.related(objectUri, {\n ...options,\n cursor,\n ...(nextOptions.limit === undefined\n ? {}\n : { limit: nextOptions.limit }),\n ...(nextOptions.signal === undefined\n ? {}\n : { signal: nextOptions.signal }),\n }),\n (cursor) => Promise.resolve(cursor),\n () => Promise.resolve(),\n );\n }\n\n public async evidence(\n objectUri = this.objectUri,\n options: WikiGraphArchiveEvidenceOptions = {},\n ): Promise<ArchiveEvidencePage> {\n if (options.query === undefined) {\n if (options.queryMode !== undefined) {\n throw new Error(\"`queryMode` requires `query`.\");\n }\n const result = await this.#readDocument(async (document) => {\n const chapters = await this.#resolveScope(document, {});\n return await listArchiveEvidence(document, objectUri, {\n ...withoutOperation(options),\n ...(chapters === undefined ? {} : { chapters }),\n });\n }, options);\n return createArchiveEvidencePage(\n result,\n async (cursor, nextOptions) =>\n await this.evidence(objectUri, {\n ...options,\n cursor,\n ...(nextOptions.limit === undefined\n ? {}\n : { limit: nextOptions.limit }),\n ...(nextOptions.signal === undefined\n ? {}\n : { signal: nextOptions.signal }),\n }),\n (cursor) => Promise.resolve(cursor),\n () => Promise.resolve(),\n );\n }\n const embeddingProvider = await this.#resolveQueryEmbeddingProvider(\n options.queryMode,\n options.signal,\n );\n const result = await this.#readDocument(\n async (document) => {\n const chapters = await this.#resolveQueryChapters(document, options, {\n embeddingProvider,\n });\n return await listArchiveEvidence(document, objectUri, {\n ...withoutOperation(options),\n ...(embeddingProvider === undefined ? {} : { embeddingProvider }),\n ...(chapters === undefined ? {} : { chapters }),\n });\n },\n {\n ...(options.signal === undefined ? {} : { signal: options.signal }),\n },\n );\n return createArchiveEvidencePage(\n result,\n async (cursor, nextOptions) =>\n await this.evidence(objectUri, {\n ...options,\n cursor,\n ...(nextOptions.limit === undefined\n ? {}\n : { limit: nextOptions.limit }),\n ...(nextOptions.signal === undefined\n ? {}\n : { signal: nextOptions.signal }),\n }),\n (cursor) => Promise.resolve(cursor),\n () => Promise.resolve(),\n );\n }\n\n public async pack(\n objectUri = this.objectUri,\n budget = 5_000,\n options: WikiGraphOperationOptions = {},\n ): Promise<ArchivePack> {\n return await this.#readDocument(\n async (document) => await packArchiveContext(document, objectUri, budget),\n options,\n );\n }\n\n public async getMetadata(\n objectPath: string,\n options: WikiGraphOperationOptions = {},\n ): Promise<Readonly<Record<string, unknown>>> {\n return await this.#readDocument(\n async (document) => await document.metadata.getMap(objectPath),\n options,\n );\n }\n\n public async readBookMeta(\n options: WikiGraphOperationOptions = {},\n ): Promise<BookMeta | undefined> {\n return await this.#readDocument(\n async (document) => await document.readBookMeta(),\n options,\n );\n }\n\n public async replaceBookMeta(\n meta: BookMeta,\n options: WikiGraphArchiveWriteOptions = {},\n ): Promise<BookMeta> {\n return await this.#writeDocument(async (document) => {\n await document.replaceBookMeta(meta);\n return meta;\n }, options);\n }\n\n public async setArchiveTitle(\n title: string | null,\n options: WikiGraphArchiveWriteOptions = {},\n ): Promise<string | null> {\n const normalized = title?.trim() ?? null;\n\n if (title !== null && normalized === \"\") {\n throw new Error(\"Archive title cannot be empty.\");\n }\n return await this.#writeDocument(async (document) => {\n if (normalized === null) {\n await document.metadata.deleteKey(\"\", \"title\");\n } else {\n await document.metadata.put(\n { kind: ObjectMetadataKind.Archive, objectPath: \"\" },\n \"title\",\n normalized,\n );\n }\n return normalized;\n }, options);\n }\n\n public async readCover(\n options: WikiGraphOperationOptions = {},\n ): Promise<WikiGraphArchiveCover | undefined> {\n return await this.#runtime.run(async () => {\n if (this.#location.archiveFile.kind === \"directory\") {\n return await this.#readDocument(\n async (document) => await document.readCover(),\n );\n }\n const app = new WikiGraph({});\n return await app.openSession(\n this.#location.archiveFile,\n async (archive) => await archive.readCover(),\n );\n }, options.signal);\n }\n\n public async replaceMetadata(\n objectPath: string,\n value: Readonly<Record<string, unknown>>,\n options: WikiGraphArchiveWriteOptions = {},\n ): Promise<Readonly<Record<string, unknown>>> {\n return await this.#writeDocument(async (document) => {\n await document.metadata.replaceMap(\n parseObjectMetadataTarget(objectPath),\n value,\n );\n return await document.metadata.getMap(objectPath);\n }, options);\n }\n\n public async putMetadata(\n objectPath: string,\n key: string,\n value: unknown,\n options: WikiGraphArchiveWriteOptions = {},\n ): Promise<Readonly<Record<string, unknown>>> {\n return await this.#writeDocument(async (document) => {\n await document.metadata.put(\n parseObjectMetadataTarget(objectPath),\n key,\n value,\n );\n return await document.metadata.getMap(objectPath);\n }, options);\n }\n\n public async deleteMetadata(\n objectPath: string,\n key: string,\n options: WikiGraphArchiveWriteOptions = {},\n ): Promise<Readonly<Record<string, unknown>>> {\n return await this.#writeDocument(async (document) => {\n await document.metadata.deleteKey(objectPath, key);\n return await document.metadata.getMap(objectPath);\n }, options);\n }\n\n public async clearMetadata(\n objectPath: string,\n options: WikiGraphArchiveWriteOptions = {},\n ): Promise<Readonly<Record<string, unknown>>> {\n return await this.#writeDocument(async (document) => {\n await document.metadata.clear(objectPath);\n return await document.metadata.getMap(objectPath);\n }, options);\n }\n\n public async resolveScope(\n options: WikiGraphArchiveScopeOptions & WikiGraphOperationOptions = {},\n ): Promise<WikiGraphArchiveScope | undefined> {\n return await this.#readDocument(\n async (document) =>\n await resolveArchiveScope(document, this.objectUri, options.depth),\n options,\n );\n }\n\n async #readDocument<T>(\n operation: (document: ReadonlyDocument) => Promise<T> | T,\n options: WikiGraphOperationOptions = {},\n ): Promise<T> {\n return await this.#runtime\n .run(\n async () =>\n this.#location.archiveFile.kind === \"directory\"\n ? await new WikiGraphDirectoryFile(\n this.#location.archiveFile,\n ).readDocument(operation)\n : await new WikiGraphArchiveFile(\n this.#location.archiveFile,\n ).readDocument(operation),\n options.signal,\n )\n .catch((error: unknown) =>\n rethrowArchiveSchemaError(error, this.#location.target),\n );\n }\n\n async #writeDocument<T>(\n operation: (document: DirectoryDocument) => Promise<T> | T,\n options: WikiGraphArchiveWriteOptions = {},\n ): Promise<T> {\n return await this.#runtime\n .run(async () => {\n return await writeWikiGraphArchiveLocation(this.#location, operation, {\n ...(options.onIndexSyncError === undefined\n ? {}\n : { onIndexSyncError: options.onIndexSyncError }),\n ...(options.refreshLibraryIndex === undefined\n ? {}\n : { refreshLibraryIndex: options.refreshLibraryIndex }),\n ...(options.searchIndexWritebackPolicy === undefined\n ? {}\n : {\n searchIndexWritebackPolicy: options.searchIndexWritebackPolicy,\n }),\n });\n }, options.signal)\n .catch((error: unknown) =>\n rethrowArchiveSchemaError(error, this.#location.target),\n );\n }\n\n async #resolveScope(\n document: ReadonlyDocument,\n options: WikiGraphArchiveScopeOptions,\n ): Promise<readonly number[] | undefined> {\n if (options.chapters !== undefined) return options.chapters;\n return (await resolveArchiveScope(document, this.objectUri, options.depth))\n ?.chapterIds;\n }\n\n async #resolveQueryChapters(\n document: ReadonlyDocument,\n options: WikiGraphArchiveScopeOptions & {\n readonly queryMode?: SearchIndexQueryMode;\n readonly skipUnindexed?: boolean;\n },\n capabilities: {\n readonly embeddingProvider: SearchIndexEmbeddingProvider | undefined;\n },\n ): Promise<readonly number[] | undefined> {\n const parsed = parseChapterScopePath(this.objectUri);\n const chapters =\n options.chapters ??\n (parsed === undefined ||\n (parsed.kind === \"collection\" && options.depth === undefined)\n ? undefined\n : await resolveIndexedArchiveChapterScope(\n document,\n parsed.kind === \"chapter\" ? parsed.chapterPath : undefined,\n options.depth,\n ));\n const coverageOptions = {\n ...(chapters === undefined ? {} : { chapters }),\n ...(capabilities.embeddingProvider === undefined\n ? {}\n : { embeddingProvider: capabilities.embeddingProvider }),\n requireEmbeddingProvider: true,\n ...(options.queryMode === undefined\n ? {}\n : { queryMode: options.queryMode }),\n };\n await assertArchiveQueryReady(document, {\n ...coverageOptions,\n ...(options.skipUnindexed === undefined\n ? {}\n : { skipUnindexed: options.skipUnindexed }),\n });\n return chapters;\n }\n\n async #resolveQueryEmbeddingProvider(\n queryMode: SearchIndexQueryMode | undefined,\n signal: AbortSignal | undefined,\n ): Promise<SearchIndexEmbeddingProvider | undefined> {\n if (queryMode === \"fts\") return undefined;\n const provider = await this.#runtime.run(\n createConfiguredEmbeddingProvider,\n signal,\n );\n if (queryMode === \"embedding\" && provider === undefined) {\n throw new Error(\n \"Embedding query mode requires embeddings configuration at `wikg://local/config/embeddings`.\",\n );\n }\n return provider;\n }\n}\n\nasync function ensureArchiveSearchIndex(\n document: DirectoryDocument,\n options: {\n readonly rebuild?: boolean;\n readonly chapters?: readonly number[];\n readonly embeddingProvider?: SearchIndexEmbeddingProvider;\n } = {},\n): Promise<void> {\n const scope =\n options.chapters === undefined ? {} : { chapters: options.chapters };\n if (await isArchiveSearchIndexCurrent(document, scope)) return;\n if (options.rebuild !== true)\n throw new Error(\n \"Archive search index is missing or dirty. Run `wg <archive-uri>/index sync` explicitly before querying.\",\n );\n await rebuildArchiveSearchIndex(document, undefined, {\n ...scope,\n ...(options.embeddingProvider === undefined\n ? {}\n : { embeddingProvider: options.embeddingProvider }),\n });\n}\n\nasync function resolveArchiveScope(\n document: ReadonlyDocument,\n objectUri: string,\n depth: number | undefined,\n): Promise<WikiGraphArchiveScope | undefined> {\n const parsed = parseChapterScopePath(objectUri);\n if (\n parsed === undefined ||\n (parsed.kind === \"collection\" && depth === undefined)\n ) {\n return undefined;\n }\n const chapters = await listChapters(document);\n const entries =\n parsed.kind === \"collection\"\n ? chapters.filter((chapter) => chapter.depth <= depth!)\n : selectChapterSubtree(\n chapters,\n await resolveChapterPathReadonly(document, parsed.chapterPath),\n depth,\n );\n return { chapterIds: entries.map((entry) => entry.chapterId), entries };\n}\n\nfunction parseChapterScopePath(\n objectUri: string,\n):\n | { readonly kind: \"collection\" }\n | { readonly chapterPath: string; readonly kind: \"chapter\" }\n | undefined {\n if (objectUri === \"wikg://chapter\" || objectUri === \"wikg://chapter/\") {\n return { kind: \"collection\" };\n }\n const match = /^wikg:\\/\\/chapter\\/([^/].*?)(?:\\/)?$/u.exec(objectUri);\n return match?.[1] === undefined\n ? undefined\n : { chapterPath: decodeURIComponent(match[1]), kind: \"chapter\" };\n}\n\nfunction selectChapterSubtree(\n chapters: readonly ChapterEntry[],\n rootChapterId: number,\n depth: number | undefined,\n): readonly ChapterEntry[] {\n const root = chapters.find((chapter) => chapter.chapterId === rootChapterId);\n if (root === undefined) {\n throw new Error(`Chapter ${rootChapterId} does not exist.`);\n }\n const prefix = `${root.path}/`;\n return chapters.filter(\n (chapter) =>\n chapter.chapterId === root.chapterId ||\n (chapter.path.startsWith(prefix) &&\n (depth === undefined || chapter.depth - root.depth <= depth)),\n );\n}\n\nasync function createEmptyArchiveFile(path: string): Promise<void> {\n const directoryPath = await mkdtemp(\n join(tmpdir(), \"wikigraph-archive-write-\"),\n );\n try {\n const directory = new NodeDirectory(directoryPath);\n const document = await DirectoryDocument.open(directory);\n try {\n await document.openSession(async (openedDocument) => {\n await openedDocument.writeToc({ items: [], version: TOC_FILE_VERSION });\n });\n } finally {\n await document.release();\n }\n await writeWikgArchive(directory, new NodeFile(path));\n } finally {\n await rm(directoryPath, { force: true, recursive: true });\n }\n}\n\nfunction isNodeEEXISTError(error: unknown): error is NodeJS.ErrnoException {\n return (\n error instanceof Error &&\n \"code\" in error &&\n (error as NodeJS.ErrnoException).code === \"EEXIST\"\n );\n}\n\nasync function nodePathExists(path: string): Promise<boolean> {\n try {\n await stat(path);\n return true;\n } catch (error) {\n if (isNodeENOENTError(error)) return false;\n throw error;\n }\n}\n\nfunction isNodeENOENTError(error: unknown): error is NodeJS.ErrnoException {\n return (\n error instanceof Error &&\n \"code\" in error &&\n (error as NodeJS.ErrnoException).code === \"ENOENT\"\n );\n}\n\nfunction parseObjectMetadataTarget(objectPath: string): ObjectMetadataTarget {\n if (objectPath === \"\") {\n return { kind: ObjectMetadataKind.Archive, objectPath };\n }\n const chapter = /^chapter\\/([1-9][0-9]*)(?:\\/.*)?$/u.exec(objectPath);\n if (chapter?.[1] !== undefined) {\n return {\n chapterId: Number(chapter[1]),\n kind: ObjectMetadataKind.Chapter,\n objectPath,\n };\n }\n const chunk = /^chunk\\/([1-9][0-9]*)$/u.exec(objectPath);\n if (chunk?.[1] !== undefined) {\n return {\n chunkId: Number(chunk[1]),\n kind: ObjectMetadataKind.Chunk,\n objectPath,\n };\n }\n const entity = /^entity\\/(Q[1-9][0-9]*)$/u.exec(objectPath);\n if (entity?.[1] !== undefined) {\n return {\n entityQid: entity[1],\n kind: ObjectMetadataKind.Entity,\n objectPath,\n };\n }\n const triple = /^triple\\/(Q[1-9][0-9]*)\\/([^/]+)\\/(Q[1-9][0-9]*)$/u.exec(\n objectPath,\n );\n if (triple?.[1] !== undefined) {\n return {\n kind: ObjectMetadataKind.Triple,\n objectPath,\n tripleObjectQid: triple[3]!,\n triplePredicate: decodeURIComponent(triple[2]!),\n tripleSubjectQid: triple[1],\n };\n }\n return { kind: ObjectMetadataKind.Object, objectPath };\n}\n\nfunction withoutOperation<T extends WikiGraphOperationOptions>(\n options: T,\n): Omit<T, \"signal\"> {\n const { signal: _signal, ...rest } = options;\n return rest;\n}\n\nfunction withoutOperationAndScope<\n T extends WikiGraphOperationOptions & WikiGraphArchiveScopeOptions,\n>(options: T): Omit<T, \"chapters\" | \"depth\" | \"signal\"> {\n const {\n chapters: _chapters,\n depth: _depth,\n signal: _signal,\n ...rest\n } = options;\n return rest;\n}\n\nasync function resolveOptionalChapterPath(\n document: ReadonlyDocument,\n path: string | undefined,\n): Promise<number | undefined> {\n return path === undefined\n ? undefined\n : await resolveChapterPathReadonly(document, path);\n}\n\nfunction requireChapter(\n chapters: readonly ChapterEntry[],\n chapterId: number,\n): ChapterEntry {\n const chapter = chapters.find((entry) => entry.chapterId === chapterId);\n if (chapter === undefined) {\n throw new Error(`Chapter internal id ${chapterId} does not exist.`);\n }\n return chapter;\n}\n\nfunction asTextStream(text: string): AsyncIterable<string> {\n return Readable.from([text]);\n}\n\nasync function assertChapterResetAllowed(\n archive: File | Directory,\n chapterId: number,\n stage: WikiGraphChapterResetStage,\n): Promise<void> {\n if (stage === \"planned\") {\n await assertNoActiveBuildJobs({\n archive,\n chapterIds: [chapterId],\n operation: \"Resetting chapter to planned\",\n });\n return;\n }\n if (stage === \"sourced\") {\n await assertNoActiveBuildJobs({\n archive,\n chapterIds: [chapterId],\n operation: \"Resetting chapter graph\",\n requiresTarget: \"reading-graph\",\n });\n }\n await assertNoActiveBuildJobs({\n archive,\n chapterIds: [chapterId],\n operation: \"Resetting chapter summary\",\n requiresTarget: \"reading-summary\",\n });\n}\n","import { createHash } from \"crypto\";\nimport { createReadStream } from \"fs\";\nimport { rm } from \"fs/promises\";\nimport { basename } from \"path\";\n\nimport {\n WikiGraph,\n type ChapterStage,\n type WikiGraphArchive,\n type WikiGraphProgressCallback,\n type SourceArtifactInput,\n} from \"wiki-graph-core\";\n\nimport { buildWikiGraphLLMOptions } from \"./llm.js\";\nimport { NodeDirectory, NodeFile } from \"./node-platform.js\";\nimport { loadWikiGraphRuntimeConfig } from \"./runtime-config.js\";\nimport { resolveWikiGraphLLMJSON } from \"./providers.js\";\nimport type { WikiGraphLLMConfig } from \"./runtime-config.js\";\nimport { getWikiGraphSDKProviders } from \"./runtime-context.js\";\nimport type { WikiGraphJobRuntime } from \"./jobs.js\";\nimport { resolveWikiGraphRuntimePath } from \"./runtime-path.js\";\nimport {\n assertStandaloneWikiGraphArchivePath,\n rethrowArchiveSchemaError,\n} from \"./archive/target.js\";\n\nexport type WikiGraphConversionFormat =\n | \"epub\"\n | \"markdown\"\n | \"pcex\"\n | \"txt\"\n | \"wikg\";\nexport type WikiGraphSourceFormat = Exclude<WikiGraphConversionFormat, \"wikg\">;\n\nexport type WikiGraphConversionInput =\n | {\n readonly format: Exclude<WikiGraphConversionFormat, \"pcex\">;\n readonly path: string;\n }\n | {\n readonly format: \"pcex\";\n readonly path: string;\n readonly sourcePdf: { readonly digest: string; readonly name?: string };\n }\n | {\n readonly format: Extract<WikiGraphSourceFormat, \"markdown\" | \"txt\">;\n readonly stream: AsyncIterable<string> | Iterable<string>;\n };\n\nexport interface WikiGraphConversionOptions {\n readonly digestDirectory?: string;\n readonly input: WikiGraphConversionInput;\n readonly llm?: WikiGraphLLMConfig;\n /** @deprecated Prefer the typed llm option. */\n readonly llmJSON?: string;\n readonly onProgress?: WikiGraphProgressCallback;\n readonly onSourceImported?: () => void | Promise<void>;\n readonly output: {\n readonly format: WikiGraphConversionFormat;\n readonly path: string;\n };\n readonly prompt?: string;\n readonly targetStage?: ChapterStage;\n readonly verbose?: boolean;\n}\n\nexport interface WikiGraphConversionResult {\n readonly chapterCount?: number;\n readonly chapterPaths?: readonly string[];\n readonly inputFormat: WikiGraphConversionFormat;\n readonly outputFormat: WikiGraphConversionFormat;\n readonly outputPath: string;\n readonly sourceArtifact?: SourceArtifactInput;\n}\n\nexport class WikiGraphConversionManager {\n readonly #runtime: WikiGraphJobRuntime;\n\n public constructor(runtime: WikiGraphJobRuntime) {\n this.#runtime = runtime;\n }\n\n public async convert(\n options: WikiGraphConversionOptions,\n ): Promise<WikiGraphConversionResult> {\n return await this.#runtime.run(async () => await this.#convert(options));\n }\n\n async #convert(\n options: WikiGraphConversionOptions,\n ): Promise<WikiGraphConversionResult> {\n const targetStage = options.targetStage ?? \"summarized\";\n if (options.targetStage !== undefined && options.output.format !== \"wikg\") {\n throw new Error(\"targetStage is only supported for wikg output.\");\n }\n if (options.output.format === \"pcex\") {\n throw new Error(\"pcex is supported only as a conversion input.\");\n }\n if (options.targetStage !== undefined && options.input.format === \"wikg\") {\n throw new Error(\n \"targetStage is only supported when creating a wikg archive.\",\n );\n }\n\n const requiresDigest = options.input.format !== \"wikg\";\n const requiresLLM =\n requiresDigest && targetStage !== \"planned\" && targetStage !== \"sourced\";\n const llmJSON = resolveWikiGraphLLMJSON(options);\n const injectedLLM =\n llmJSON === undefined ? getWikiGraphSDKProviders().llm : undefined;\n const config = await loadWikiGraphRuntimeConfig({\n ...(llmJSON === undefined ? {} : { llmJSON }),\n ...(injectedLLM === undefined ? {} : { skipLLMConfig: true }),\n ...(getWikiGraphSDKProviders().embedding === undefined\n ? {}\n : { skipEmbeddingConfig: true }),\n });\n const app = new WikiGraph({\n ...(options.verbose === true ? { verbose: true } : {}),\n ...(requiresLLM\n ? {\n llm:\n injectedLLM === undefined\n ? buildWikiGraphLLMOptions(config)\n : { streamProvider: injectedLLM },\n }\n : {}),\n });\n const documentDirectory = await prepareDigestDirectory(\n options.digestDirectory,\n requiresDigest,\n );\n let chapterCount: number | undefined;\n let chapterPaths: readonly string[] | undefined;\n const write = async (archive: WikiGraphArchive): Promise<void> => {\n if (requiresDigest) await options.onSourceImported?.();\n if (typeof archive.readToc === \"function\") {\n const toc = await archive.readToc();\n chapterCount =\n toc === undefined ? undefined : countTocChapters(toc.items);\n if (options.output.format === \"wikg\") {\n chapterPaths =\n toc === undefined ? [] : collectTocChapterPaths(toc.items);\n }\n }\n await writeArchive(archive, options.output.path, options.output.format);\n };\n\n if (options.input.format === \"wikg\") {\n if (!(\"path\" in options.input)) {\n throw new Error(\"wikg input requires a file path.\");\n }\n const inputPath = options.input.path;\n await app\n .openSession(\n new NodeFile(await assertStandaloneWikiGraphArchivePath(inputPath)),\n write,\n )\n .catch((error: unknown) =>\n rethrowArchiveSchemaError(error, {\n kind: \"standalone\",\n path: inputPath,\n }),\n );\n } else if (\"stream\" in options.input) {\n await app.digestTextStreamSession(\n {\n ...(documentDirectory === undefined ? {} : { documentDirectory }),\n ...(options.onProgress === undefined\n ? {}\n : { onProgress: options.onProgress }),\n sourceFormat: options.input.format,\n stream: options.input.stream,\n ...((options.prompt ?? config.prompt) === undefined\n ? {}\n : { extractionPrompt: options.prompt ?? config.prompt }),\n targetStage,\n },\n write,\n );\n } else {\n const digestOptions = {\n ...(documentDirectory === undefined ? {} : { documentDirectory }),\n file: new NodeFile(resolveWikiGraphRuntimePath(options.input.path)),\n ...(options.onProgress === undefined\n ? {}\n : { onProgress: options.onProgress }),\n ...((options.prompt ?? config.prompt) === undefined\n ? {}\n : { extractionPrompt: options.prompt ?? config.prompt }),\n targetStage,\n };\n if (options.input.format === \"epub\") {\n await app.digestEpubSession(digestOptions, write);\n } else if (options.input.format === \"pcex\") {\n await app.digestPcexSession(\n {\n ...digestOptions,\n pdfDigest: options.input.sourcePdf.digest,\n ...(options.input.sourcePdf.name === undefined\n ? {}\n : { pdfName: options.input.sourcePdf.name }),\n },\n write,\n );\n } else if (options.input.format === \"markdown\") {\n await app.digestMarkdownSession(digestOptions, write);\n } else {\n await app.digestTxtSession(digestOptions, write);\n }\n }\n\n const sourceArtifact = await resolveSourceArtifact(options.input);\n return {\n ...(chapterCount === undefined ? {} : { chapterCount }),\n ...(chapterPaths === undefined ? {} : { chapterPaths }),\n inputFormat: options.input.format,\n outputFormat: options.output.format,\n outputPath: options.output.path,\n ...(sourceArtifact === undefined ? {} : { sourceArtifact }),\n };\n }\n}\n\nasync function prepareDigestDirectory(\n path: string | undefined,\n required: boolean,\n): Promise<NodeDirectory | undefined> {\n const normalized = path?.trim();\n if (!required || normalized === undefined || normalized === \"\")\n return undefined;\n const resolved = resolveWikiGraphRuntimePath(normalized);\n await rm(resolved, { force: true, recursive: true });\n return new NodeDirectory(resolved);\n}\n\nasync function writeArchive(\n archive: WikiGraphArchive,\n path: string,\n format: WikiGraphConversionFormat,\n): Promise<void> {\n const outputPath =\n format === \"wikg\"\n ? await assertStandaloneWikiGraphArchivePath(path)\n : resolveWikiGraphRuntimePath(path);\n const file = new NodeFile(outputPath);\n if (format === \"epub\") await archive.exportEpub(file);\n else if (format === \"wikg\") await archive.saveAs(file);\n else if (format === \"pcex\") throw new Error(\"pcex output is not supported.\");\n else await archive.exportText(file);\n}\n\nasync function resolveSourceArtifact(\n input: WikiGraphConversionInput,\n): Promise<SourceArtifactInput | undefined> {\n if (!(\"path\" in input) || input.format === \"wikg\") return undefined;\n if (input.format === \"pcex\") {\n return {\n digest: input.sourcePdf.digest.trim().toLowerCase(),\n mediaType: \"application/pdf\",\n ...(input.sourcePdf.name === undefined\n ? {}\n : { name: input.sourcePdf.name }),\n };\n }\n if (input.format !== \"epub\") return undefined;\n const path = resolveWikiGraphRuntimePath(input.path);\n const hash = createHash(\"sha256\");\n try {\n for await (const chunk of createReadStream(path)) {\n hash.update(chunk as Buffer);\n }\n } catch (error) {\n if (isNodeErrorCode(error, \"ENOENT\")) return undefined;\n throw error;\n }\n return {\n digest: hash.digest(\"hex\"),\n mediaType: \"application/epub+zip\",\n name: basename(path),\n };\n}\n\nfunction isNodeErrorCode(error: unknown, code: string): boolean {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === code\n );\n}\n\nfunction countTocChapters(\n items: readonly {\n readonly children: readonly unknown[];\n readonly serialId?: number | undefined;\n }[],\n): number {\n let count = 0;\n for (const item of items) {\n if (item.serialId !== undefined) count += 1;\n count += countTocChapters(\n item.children as readonly {\n readonly children: readonly unknown[];\n readonly serialId?: number | undefined;\n }[],\n );\n }\n return count;\n}\n\nfunction collectTocChapterPaths(\n items: readonly {\n readonly children: readonly unknown[];\n readonly key?: string | undefined;\n readonly serialId?: number | undefined;\n }[],\n ancestorKeys: readonly string[] = [],\n): readonly string[] {\n const paths: string[] = [];\n for (const item of items) {\n const key = item.key ?? `chapter-${item.serialId ?? \"group\"}`;\n const chapterPath = [...ancestorKeys, key];\n if (item.serialId !== undefined) paths.push(chapterPath.join(\"/\"));\n paths.push(\n ...collectTocChapterPaths(\n item.children as readonly {\n readonly children: readonly unknown[];\n readonly key?: string | undefined;\n readonly serialId?: number | undefined;\n }[],\n chapterPath,\n ),\n );\n }\n return paths;\n}\n","import type { WikiGraphLLMOptions } from \"wiki-graph-core\";\n\nimport { createAnthropic } from \"@ai-sdk/anthropic\";\nimport { createGoogleGenerativeAI } from \"@ai-sdk/google\";\nimport { createOpenAI } from \"@ai-sdk/openai\";\nimport { createOpenAICompatible } from \"@ai-sdk/openai-compatible\";\n\nimport type {\n WikiGraphProvider,\n WikiGraphRuntimeConfig,\n} from \"./runtime-config.js\";\n\nexport function buildWikiGraphLLMOptions(\n config: WikiGraphRuntimeConfig,\n): WikiGraphLLMOptions {\n const llm = config.llm;\n\n if (llm?.provider === undefined || llm.model === undefined) {\n throw new Error(\n \"Missing LLM configuration. Set --llm for one run, or configure `wikg://local/config/llm` with provider and model.\",\n );\n }\n\n return {\n model: createLanguageModel(llm.provider, llm.model, {\n apiKey: llm.apiKey,\n baseURL: llm.baseURL,\n name: llm.name,\n }),\n ...(config.concurrent?.request === undefined\n ? {}\n : { concurrent: config.concurrent.request }),\n };\n}\n\nfunction createLanguageModel(\n provider: WikiGraphProvider,\n model: string,\n options: {\n readonly apiKey: string | undefined;\n readonly baseURL: string | undefined;\n readonly name: string | undefined;\n },\n) {\n switch (provider) {\n case \"anthropic\": {\n const anthropic = createAnthropic({\n ...(options.apiKey === undefined ? {} : { apiKey: options.apiKey }),\n ...(options.name === undefined ? {} : { name: options.name }),\n });\n\n return anthropic(model);\n }\n case \"google\": {\n const google = createGoogleGenerativeAI({\n ...(options.apiKey === undefined ? {} : { apiKey: options.apiKey }),\n ...(options.name === undefined ? {} : { name: options.name }),\n });\n\n return google(model);\n }\n case \"openai\": {\n if (options.baseURL !== undefined) {\n throw new Error(\n \"openai does not accept llm.baseURL or baseURL in --llm JSON. Use openai-compatible for third-party OpenAI-style APIs.\",\n );\n }\n\n const openai = createOpenAI({\n ...(options.apiKey === undefined ? {} : { apiKey: options.apiKey }),\n ...(options.name === undefined ? {} : { name: options.name }),\n });\n\n return openai(model);\n }\n case \"openai-compatible\": {\n if (options.baseURL === undefined) {\n throw new Error(\n \"openai-compatible requires llm.baseURL or baseURL in --llm JSON.\",\n );\n }\n\n const openaiCompatible = createOpenAICompatible({\n baseURL: options.baseURL,\n name: options.name ?? createOpenAICompatibleName(options.baseURL),\n ...(options.apiKey === undefined ? {} : { apiKey: options.apiKey }),\n });\n\n return openaiCompatible(model);\n }\n }\n}\n\nfunction createOpenAICompatibleName(baseURL: string): string {\n try {\n return new URL(baseURL).hostname;\n } catch {\n return \"openai-compatible\";\n }\n}\n","/* eslint-disable no-restricted-syntax, @typescript-eslint/parameter-properties */\nimport * as asyncHooks from \"node:async_hooks\";\nimport * as crypto from \"node:crypto\";\nimport * as fs from \"node:fs\";\nimport * as fsPromises from \"node:fs/promises\";\nimport * as os from \"node:os\";\nimport * as pathModule from \"node:path\";\nimport * as process from \"node:process\";\nimport { Readable, Writable } from \"node:stream\";\nimport { pipeline } from \"node:stream/promises\";\nimport * as sqlite3 from \"sqlite3\";\nimport * as yauzl from \"yauzl\";\nimport * as yazl from \"yazl\";\nimport { Environment, Loader, type LoaderSource } from \"nunjucks\";\n\nconst nodeProcess =\n (process as unknown as { default?: typeof process }).default ?? process;\nconst nodeSqlite3 =\n (sqlite3 as unknown as { default?: typeof sqlite3 }).default ?? sqlite3;\n\nimport {\n getWikiGraphPlatform,\n getWikiGraphStorage,\n installWikiGraphPlatform,\n installWikiGraphStorage,\n withWikiGraphStorage,\n type Directory,\n type File,\n type FileReader,\n type ReadonlyFile,\n type FileWriter,\n type HostDatabaseConnection,\n type HostDatabaseOpenOptions,\n type HostDatabaseRow,\n type HostDatabaseValue,\n type HostLifecycleProvider,\n type HostZipWriteEntry,\n type HostZipReader,\n type WikiGraphPlatform,\n type WikiGraphStorage,\n normalizeTemplateName,\n} from \"wiki-graph-core/platform\";\n\n/** Stable across independently bundled SDK entry points. */\nconst NODE_RESOURCE_KIND = Symbol.for(\"wiki-graph-sdk.node-resource.v1\");\n\n/** Install the Node implementation used by the CLI and its workers. */\nexport class NodeFile implements File {\n public async getPhysicalIdentity(): Promise<string | undefined> {\n const value = await fsPromises.stat(this.path).catch((error: unknown) => {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n )\n return undefined;\n throw error;\n });\n if (value === undefined) return undefined;\n return `${value.dev}:${value.ino}`;\n }\n public readonly kind = \"file\" as const;\n public readonly [NODE_RESOURCE_KIND] = \"file\" as const;\n public readonly identity: string;\n public readonly name: string;\n\n public constructor(\n public readonly path: string,\n name = pathModule.basename(path),\n ) {\n this.identity = encodeNodeResourceIdentity(\"file\", path);\n this.name = name;\n }\n\n public async openReader(): Promise<FileReader> {\n const handle = await fsPromises.open(this.path, \"r\");\n let closed = false;\n try {\n const stats = await handle.stat();\n if (!stats.isFile())\n throw new Error(\"File reader requires a regular file\");\n const { size } = stats;\n return {\n size,\n close: async () => {\n if (!closed) await handle.close();\n closed = true;\n },\n read: async (offset, length) => {\n if (closed) throw new Error(\"Cannot read from a closed FileReader\");\n assertFileRange(offset, length, size);\n const buffer = Buffer.allocUnsafe(length);\n let bytesRead = 0;\n while (bytesRead < length) {\n const result = await handle.read(\n buffer,\n bytesRead,\n length - bytesRead,\n offset + bytesRead,\n );\n if (result.bytesRead === 0) {\n throw new Error(\"File changed while reading its byte range\");\n }\n bytesRead += result.bytesRead;\n }\n return new Uint8Array(buffer.buffer, buffer.byteOffset, bytesRead);\n },\n };\n } catch (error) {\n await handle.close();\n throw error;\n }\n }\n\n public async getLastModified(): Promise<number | undefined> {\n try {\n return (await fsPromises.stat(this.path)).mtimeMs;\n } catch (error) {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n ) {\n return undefined;\n }\n throw error;\n }\n }\n\n public async openWriter(): Promise<FileWriter> {\n await fsPromises.mkdir(pathModule.dirname(this.path), { recursive: true });\n const temporary = `${this.path}.tmp-${crypto.randomUUID()}`;\n const handle = await fsPromises.open(temporary, \"wx\");\n let closed = false;\n return {\n write: async (data) => {\n if (closed) throw new Error(\"Cannot write to a closed FileWriter\");\n await writeNodeFileHandle(handle, data);\n },\n writeAt: async (offset, data) => {\n if (closed) throw new Error(\"Cannot write to a closed FileWriter\");\n assertFileOffset(offset);\n await writeNodeFileHandle(handle, data, offset);\n },\n commit: async () => {\n if (!closed) {\n await handle.close();\n await fsPromises.rename(temporary, this.path);\n }\n closed = true;\n },\n abort: async () => {\n if (!closed) {\n await handle.close();\n await fsPromises.rm(temporary, { force: true });\n }\n closed = true;\n },\n };\n }\n}\n\n/** @internal Completes writes even when the Node file handle reports a short write. */\nexport async function writeNodeFileHandle(\n handle: Pick<fsPromises.FileHandle, \"write\">,\n data: Uint8Array | string,\n position?: number,\n): Promise<void> {\n const buffer = Buffer.from(data);\n let written = 0;\n while (written < buffer.byteLength) {\n const result = await handle.write(\n buffer,\n written,\n buffer.byteLength - written,\n position === undefined ? null : position + written,\n );\n if (result.bytesWritten === 0) {\n throw new Error(\"File writer made no progress\");\n }\n written += result.bytesWritten;\n }\n}\n\nfunction assertFileRange(offset: number, length: number, size: number): void {\n assertFileOffset(offset);\n if (!Number.isSafeInteger(length) || length < 0) {\n throw new RangeError(\n \"File read length must be a non-negative safe integer\",\n );\n }\n if (offset > size || length > size - offset) {\n throw new RangeError(\"File read range exceeds the file size\");\n }\n}\n\nfunction assertFileOffset(offset: number): void {\n if (!Number.isSafeInteger(offset) || offset < 0) {\n throw new RangeError(\"File offset must be a non-negative safe integer\");\n }\n}\n\nexport class NodeDirectory implements Directory {\n public async getPhysicalIdentity(): Promise<string | undefined> {\n const value = await fsPromises.stat(this.path).catch((error: unknown) => {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n )\n return undefined;\n throw error;\n });\n if (value === undefined) return undefined;\n return `${value.dev}:${value.ino}`;\n }\n public readonly kind = \"directory\" as const;\n public readonly [NODE_RESOURCE_KIND] = \"directory\" as const;\n public readonly identity: string;\n public readonly name: string;\n\n public constructor(public readonly path: string) {\n this.identity = encodeNodeResourceIdentity(\"directory\", path);\n this.name = pathModule.basename(path);\n }\n\n public async getFile(name: string): Promise<File | undefined> {\n assertChildName(name);\n const file = new NodeFile(pathModule.join(this.path, name));\n try {\n return (await fsPromises.stat(file.path)).isFile() ? file : undefined;\n } catch (error) {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n (error.code === \"ENOENT\" || error.code === \"ENOTDIR\")\n )\n return undefined;\n throw error;\n }\n }\n\n public async getLastModified(): Promise<number | undefined> {\n try {\n return (await fsPromises.stat(this.path)).mtimeMs;\n } catch (error) {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n ) {\n return undefined;\n }\n throw error;\n }\n }\n\n public async getDirectory(name: string): Promise<Directory | undefined> {\n assertChildName(name);\n const directory = new NodeDirectory(pathModule.join(this.path, name));\n try {\n return (await fsPromises.stat(directory.path)).isDirectory()\n ? directory\n : undefined;\n } catch (error) {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n (error.code === \"ENOENT\" || error.code === \"ENOTDIR\")\n )\n return undefined;\n throw error;\n }\n }\n\n public async list(): Promise<ReadonlyArray<File | Directory>> {\n const entries = await fsPromises.readdir(this.path, {\n withFileTypes: true,\n });\n return entries.map((entry) =>\n entry.isDirectory()\n ? new NodeDirectory(pathModule.join(this.path, entry.name))\n : new NodeFile(pathModule.join(this.path, entry.name), entry.name),\n );\n }\n\n public async createFile(name: string): Promise<File> {\n assertChildName(name);\n await fsPromises.mkdir(this.path, { recursive: true });\n const file = new NodeFile(pathModule.join(this.path, name));\n await fsPromises.writeFile(file.path, \"\", { flag: \"wx\" });\n return file;\n }\n\n public async createDirectory(name: string): Promise<Directory> {\n assertChildName(name);\n await fsPromises.mkdir(this.path, { recursive: true });\n const directory = new NodeDirectory(pathModule.join(this.path, name));\n await fsPromises.mkdir(directory.path);\n return directory;\n }\n\n public async remove(\n name: string,\n options?: { readonly recursive?: boolean },\n ): Promise<void> {\n assertChildName(name);\n await fsPromises.rm(pathModule.join(this.path, name), {\n force: true,\n recursive: options?.recursive === true,\n });\n }\n}\n\nfunction encodeNodeResourceIdentity(\n kind: \"directory\" | \"file\",\n path: string,\n): string {\n return `node-${kind}:${Buffer.from(pathModule.resolve(path), \"utf8\").toString(\"base64url\")}`;\n}\n\nfunction decodeNodeResourceIdentity(\n identity: string,\n kind: \"directory\" | \"file\",\n): string | undefined {\n const prefix = `node-${kind}:`;\n if (!identity.startsWith(prefix)) {\n // State created before opaque resource identities stored native paths.\n return pathModule.isAbsolute(identity) ? identity : undefined;\n }\n try {\n return Buffer.from(identity.slice(prefix.length), \"base64url\").toString(\n \"utf8\",\n );\n } catch {\n return undefined;\n }\n}\n\nexport function getNodeResourcePath(resource: File | Directory): string {\n const brandedPath = getBrandedNodeResourcePath(resource, resource.kind);\n if (brandedPath !== undefined) return brandedPath;\n if (\n typeof resource === \"object\" &&\n resource !== null &&\n \"path\" in resource &&\n typeof resource.path === \"string\"\n ) {\n return resource.path;\n }\n throw new TypeError(\"Expected a Node File or Directory resource\");\n}\n\nfunction assertChildName(name: string): void {\n if (\n name.length === 0 ||\n name === \".\" ||\n name === \"..\" ||\n pathModule.isAbsolute(name) ||\n name.includes(\"/\") ||\n name.includes(\"\\\\\")\n ) {\n throw new TypeError(`Directory child must be a relative name: ${name}`);\n }\n}\n\nclass NodeDatabaseConnection implements HostDatabaseConnection {\n public constructor(private readonly database: sqlite3.Database) {}\n\n public async close(): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n this.database.close((error) => {\n if (error) reject(error);\n else resolve();\n });\n });\n }\n\n public async execute(sql: string): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n this.database.exec(sql, (error) => {\n if (error) reject(error);\n else resolve();\n });\n });\n }\n\n public async queryAll(\n sql: string,\n params: readonly HostDatabaseValue[] = [],\n ): Promise<readonly HostDatabaseRow[]> {\n return await new Promise((resolve, reject) => {\n this.database.all(sql, [...params], (error, rows: HostDatabaseRow[]) => {\n if (error) reject(error);\n else resolve(rows);\n });\n });\n }\n\n public async queryOne(\n sql: string,\n params: readonly HostDatabaseValue[] = [],\n ): Promise<HostDatabaseRow | undefined> {\n return await new Promise((resolve, reject) => {\n this.database.get(sql, [...params], (error, row: HostDatabaseRow) => {\n if (error) reject(error);\n else resolve(row);\n });\n });\n }\n\n public async run(\n sql: string,\n params: readonly HostDatabaseValue[] = [],\n ): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n this.database.run(sql, [...params], (error) => {\n if (error) reject(error);\n else resolve();\n });\n });\n }\n}\n\nasync function openNodeDatabase(\n file: ReadonlyFile,\n options: HostDatabaseOpenOptions,\n): Promise<NodeDatabaseConnection> {\n const flags =\n (options.mode === \"readonly\"\n ? nodeSqlite3.OPEN_READONLY\n : nodeSqlite3.OPEN_READWRITE |\n (options.create ? nodeSqlite3.OPEN_CREATE : 0)) |\n nodeSqlite3.OPEN_FULLMUTEX;\n return new NodeDatabaseConnection(await openNativeNodeDatabase(file, flags));\n}\n\nasync function openNativeNodeDatabase(\n file: ReadonlyFile,\n flags: number,\n): Promise<sqlite3.Database> {\n const path = getBrandedNodeResourcePath(file, \"file\");\n if (path === undefined) {\n throw new TypeError(\"The Node database adapter requires a NodeFile\");\n }\n return await new Promise((resolve, reject) => {\n const database = new nodeSqlite3.Database(path, flags, (error) => {\n if (error) reject(error);\n else resolve(database);\n });\n });\n}\n\nasync function openNodeZip(\n file: ReadonlyFile,\n options: { readonly entryNameMode?: \"raw\" | \"normalized\" } = {},\n): Promise<HostZipReader> {\n const path = getBrandedNodeResourcePath(file, \"file\");\n if (path === undefined) {\n throw new TypeError(\"The Node ZIP adapter requires a NodeFile\");\n }\n const handle = await fsPromises.open(path, \"r\");\n let size: number;\n try {\n size = (await handle.stat()).size;\n } catch (error) {\n await handle.close();\n throw error;\n }\n const open = () =>\n new Promise<yauzl.ZipFile>((resolve, reject) => {\n yauzl.fromRandomAccessReader(\n new NodeZipSource(handle),\n size,\n { autoClose: false, lazyEntries: true },\n (error, opened) => {\n if (error || opened === undefined)\n reject(error ?? new Error(\"Cannot open ZIP\"));\n else resolve(opened);\n },\n );\n });\n // Validate the ZIP envelope without enumerating its entries. Keep the same\n // file descriptor across lookups, even if the path is replaced meanwhile.\n try {\n (await open()).close();\n } catch (error) {\n await handle.close();\n throw error;\n }\n let closed = false;\n let pending: Promise<unknown> = Promise.resolve();\n let closing: Promise<void> | undefined;\n const run = <T>(\n operation: (zip: yauzl.ZipFile) => Promise<T>,\n ): Promise<T> => {\n if (closed)\n return Promise.reject(new Error(\"Cannot read a closed ZIP archive\"));\n const result = pending.then(async () => {\n const zip = await open();\n try {\n return await operation(zip);\n } finally {\n zip.close();\n }\n });\n pending = result.then(\n () => undefined,\n () => undefined,\n );\n return result;\n };\n const withEntry = <T>(\n name: string,\n operation: (\n zip: yauzl.ZipFile,\n entry: yauzl.Entry | undefined,\n ) => Promise<T>,\n ) =>\n run(async (zip) => {\n let exact: yauzl.Entry | undefined;\n let alias: yauzl.Entry | undefined;\n let aliasCollision = false;\n // Retain only matches, not a directory index. Scan through the end so\n // duplicate raw names keep their existing last-entry-wins behavior.\n await scanNodeZip(zip, (entry) => {\n if (entry.fileName === name) exact = entry;\n if (normalizeNodeZipName(entry.fileName) === name) {\n if (alias !== undefined && alias.fileName !== entry.fileName)\n aliasCollision = true;\n alias = entry;\n }\n });\n if (\n (exact === undefined || options.entryNameMode === \"normalized\") &&\n aliasCollision\n ) {\n // The former Map ordered aliases by the first occurrence of each raw\n // name, but used its last duplicate's contents. Resolve this uncommon\n // ambiguity with rescans instead of retaining a set of all raw names.\n let bestPosition = -1;\n const candidates = await open();\n try {\n await scanNodeZip(candidates, async (entry) => {\n if (normalizeNodeZipName(entry.fileName) !== name) return;\n const probe = await open();\n let position = 0;\n try {\n await scanNodeZip(probe, (candidate) => {\n if (candidate.fileName === entry.fileName) return false;\n position++;\n });\n } finally {\n probe.close();\n }\n if (position >= bestPosition) {\n bestPosition = position;\n alias = entry;\n }\n });\n return await operation(candidates, alias);\n } finally {\n candidates.close();\n }\n }\n return await operation(\n zip,\n options.entryNameMode === \"normalized\" ? alias : (exact ?? alias),\n );\n });\n return {\n close: () => {\n closed = true;\n closing ??= pending.then(() => handle.close());\n return closing;\n },\n copyEntry: (name, target) =>\n withEntry(name, async (zip, entry) => {\n if (entry === undefined) return false;\n await copyNodeZipEntry(zip, entry, target);\n return true;\n }),\n getEntrySize: (name) =>\n withEntry(name, (_zip, entry) =>\n Promise.resolve(entry?.uncompressedSize),\n ),\n listEntries: () =>\n run(async (zip) => {\n const names = new Set<string>();\n await scanNodeZip(zip, (entry) => {\n names.add(entry.fileName);\n });\n return [...names];\n }),\n readEntryRange: (name, offset, length) =>\n withEntry(name, async (zip, entry) => {\n if (entry === undefined) return undefined;\n return await readNodeZipEntryRange(zip, entry, offset, length);\n }),\n readEntry: (name) =>\n withEntry(name, async (zip, entry) => {\n if (entry === undefined) return undefined;\n return await readNodeZipEntry(zip, entry);\n }),\n };\n}\n\n/** yauzl owns ZIP parsing; this source only provides positioned file reads. */\nclass NodeZipSource extends yauzl.RandomAccessReader {\n public constructor(private readonly handle: fsPromises.FileHandle) {\n super();\n }\n public override read(\n buffer: Buffer,\n offset: number,\n length: number,\n position: number,\n callback: (error: Error | null) => void,\n ): void {\n // Central-directory reads are small. Avoid creating a stream pipeline for\n // each header; yauzl still owns parsing and requests the exact byte range.\n const read = (written: number): void => {\n if (written === length) {\n callback(null);\n return;\n }\n fs.read(\n this.handle.fd,\n buffer,\n offset + written,\n length - written,\n position + written,\n (error, bytesRead) => {\n if (error) callback(error);\n else if (bytesRead === 0)\n callback(new Error(\"Unexpected end of ZIP file\"));\n else read(written + bytesRead);\n },\n );\n };\n read(0);\n }\n public override _readStreamForRange(start: number, end: number): Readable {\n const handle = this.handle;\n return Readable.from(\n (async function* () {\n for (let position = start; position < end; ) {\n const buffer = Buffer.allocUnsafe(\n Math.min(64 * 1024, end - position),\n );\n const { bytesRead } = await handle.read(\n buffer,\n 0,\n buffer.length,\n position,\n );\n if (bytesRead === 0) return;\n position += bytesRead;\n yield buffer.subarray(0, bytesRead);\n }\n })(),\n );\n }\n}\n\nfunction normalizeNodeZipName(name: string): string | undefined {\n const normalized = name\n .replaceAll(\"\\\\\", \"/\")\n .trim()\n .split(\"/\")\n .filter((part) => part !== \"\" && part !== \".\")\n .join(\"/\");\n return normalized.split(\"/\").includes(\"..\") ? undefined : normalized;\n}\n\nasync function scanNodeZip(\n zip: yauzl.ZipFile,\n visit: (entry: yauzl.Entry) => void | boolean | Promise<void | boolean>,\n): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n const cleanup = () => {\n zip.off(\"entry\", onEntry);\n zip.off(\"end\", onEnd);\n zip.off(\"error\", onError);\n };\n const onError = (error: Error) => {\n cleanup();\n reject(error);\n };\n const onEnd = () => {\n cleanup();\n resolve();\n };\n const onEntry = (entry: yauzl.Entry) => {\n void Promise.resolve()\n .then(() => (entry.fileName.endsWith(\"/\") ? undefined : visit(entry)))\n .then((keepReading) => {\n if (keepReading === false) onEnd();\n else zip.readEntry();\n })\n .catch((error: unknown) =>\n onError(\n error instanceof Error\n ? error\n : new Error(\"Cannot scan ZIP\", { cause: error }),\n ),\n );\n };\n zip.on(\"entry\", onEntry);\n zip.once(\"end\", onEnd);\n zip.once(\"error\", onError);\n zip.readEntry();\n });\n}\n\nasync function copyNodeZipEntry(\n zipFile: yauzl.ZipFile,\n entry: yauzl.Entry,\n target: File,\n): Promise<void> {\n const writer = await target.openWriter();\n try {\n const stream = await openNodeZipEntryStream(zipFile, entry);\n await writeNodeStream(stream, writer);\n await writer.commit();\n } catch (error) {\n await writer.abort().catch(() => undefined);\n throw error;\n }\n}\n\nasync function readNodeZipEntry(\n zipFile: yauzl.ZipFile,\n entry: yauzl.Entry,\n): Promise<Uint8Array> {\n return await collectNodeStream(await openNodeZipEntryStream(zipFile, entry));\n}\n\nasync function readNodeZipEntryRange(\n zipFile: yauzl.ZipFile,\n entry: yauzl.Entry,\n offset: number,\n length: number,\n): Promise<Uint8Array> {\n assertFileRange(offset, length, entry.uncompressedSize);\n if (length === 0) return new Uint8Array();\n if (entry.compressionMethod !== 0) {\n const content = await collectDecodedNodeStreamRange(\n await openNodeZipEntryStream(zipFile, entry),\n offset,\n length,\n );\n return new Uint8Array(\n content.buffer,\n content.byteOffset,\n content.byteLength,\n );\n }\n const content = await collectNodeStream(\n await openNodeZipEntryStream(zipFile, entry, {\n decompress: null,\n decrypt: null,\n end: offset + length,\n start: offset,\n }),\n );\n return new Uint8Array(content.buffer, content.byteOffset, content.byteLength);\n}\n\nasync function collectDecodedNodeStreamRange(\n input: NodeJS.ReadableStream,\n offset: number,\n length: number,\n): Promise<Buffer> {\n const chunks: Buffer[] = [];\n const end = offset + length;\n let position = 0;\n let collected = 0;\n for await (const value of input) {\n const chunk = Buffer.isBuffer(value) ? value : Buffer.from(value);\n const chunkEnd = position + chunk.byteLength;\n if (chunkEnd > offset && position < end) {\n const selected = chunk.subarray(\n Math.max(0, offset - position),\n Math.min(chunk.byteLength, end - position),\n );\n chunks.push(selected);\n collected += selected.byteLength;\n }\n position = chunkEnd;\n if (position >= end) break;\n }\n if (collected !== length) {\n throw new Error(\"ZIP entry changed while reading its byte range\");\n }\n return Buffer.concat(chunks, collected);\n}\n\nasync function openNodeZipEntryStream(\n zipFile: yauzl.ZipFile,\n entry: yauzl.Entry,\n options?: yauzl.ZipFileOptions,\n): Promise<NodeJS.ReadableStream> {\n return await new Promise<NodeJS.ReadableStream>((resolve, reject) => {\n const callback = (error: Error | null, opened: Readable) => {\n if (error || opened === undefined) {\n reject(error ?? new Error(`Cannot read ZIP entry: ${entry.fileName}`));\n } else {\n resolve(opened);\n }\n };\n if (options === undefined) zipFile.openReadStream(entry, callback);\n else zipFile.openReadStream(entry, options, callback);\n });\n}\n\nasync function writeNodeZip(\n file: File,\n entries: Iterable<HostZipWriteEntry> | AsyncIterable<HostZipWriteEntry>,\n): Promise<void> {\n const zipFile = new yazl.ZipFile();\n const writer = await file.openWriter();\n const outputStream = zipFile.outputStream as Readable;\n const outputDone = writeNodeStream(outputStream, writer);\n const entryState = { cancelled: false, complete: false };\n let iterator:\n | Iterator<HostZipWriteEntry>\n | AsyncIterator<HostZipWriteEntry>\n | undefined;\n\n try {\n iterator = getNodeZipEntryIterator(entries);\n const entriesDone = addNodeZipEntries(zipFile, iterator, entryState);\n await Promise.race([entriesDone, outputDone]);\n if (!entryState.complete) {\n throw new Error(\"ZIP output ended before entry production completed\");\n }\n zipFile.end();\n await outputDone;\n await writer.commit();\n } catch (error) {\n entryState.cancelled = true;\n if (!entryState.complete && iterator !== undefined) {\n closeNodeZipEntryIterator(iterator);\n }\n if (!outputStream.destroyed) {\n outputStream.destroy(\n error instanceof Error ? error : new Error(\"Cannot write ZIP archive\"),\n );\n }\n await outputDone.catch(() => undefined);\n await writer.abort().catch(() => undefined);\n throw error;\n }\n}\n\nasync function addNodeZipEntries(\n zipFile: yazl.ZipFile,\n iterator: Iterator<HostZipWriteEntry> | AsyncIterator<HostZipWriteEntry>,\n state: { cancelled: boolean; complete: boolean },\n): Promise<void> {\n while (!state.cancelled) {\n const result = await iterator.next();\n if (state.cancelled) return;\n if (result.done) {\n state.complete = true;\n return;\n }\n if (\"file\" in result.value) {\n zipFile.addReadStream(\n createNodeFileReadStream(result.value.file),\n result.value.name,\n { compress: false },\n );\n } else if (\"data\" in result.value) {\n zipFile.addBuffer(Buffer.from(result.value.data), result.value.name, {\n compress: false,\n });\n } else {\n zipFile.addReadStream(\n createNodeRangeReadStream(result.value),\n result.value.name,\n { compress: false, size: result.value.size },\n );\n }\n }\n}\n\nfunction createNodeFileReadStream(file: ReadonlyFile): Readable {\n return Readable.from(\n (async function* () {\n const reader = await file.openReader();\n try {\n for (let offset = 0; offset < reader.size; ) {\n const chunk = await reader.read(\n offset,\n Math.min(64 * 1024, reader.size - offset),\n );\n offset += chunk.byteLength;\n yield chunk;\n }\n } finally {\n await reader.close();\n }\n })(),\n );\n}\n\nfunction getBrandedNodeResourcePath(\n resource: unknown,\n kind: \"directory\" | \"file\",\n): string | undefined {\n if (typeof resource !== \"object\" || resource === null) return undefined;\n const candidate = resource as {\n readonly [NODE_RESOURCE_KIND]?: unknown;\n readonly path?: unknown;\n };\n return candidate[NODE_RESOURCE_KIND] === kind &&\n typeof candidate.path === \"string\"\n ? candidate.path\n : undefined;\n}\n\nfunction createNodeRangeReadStream(\n entry: Extract<HostZipWriteEntry, { readonly size: number }>,\n): Readable {\n return Readable.from(\n (async function* () {\n for (let offset = 0; offset < entry.size; ) {\n const chunk = await entry.read(\n offset,\n Math.min(64 * 1024, entry.size - offset),\n );\n offset += chunk.byteLength;\n yield chunk;\n }\n })(),\n );\n}\n\nfunction getNodeZipEntryIterator(\n entries: Iterable<HostZipWriteEntry> | AsyncIterable<HostZipWriteEntry>,\n): Iterator<HostZipWriteEntry> | AsyncIterator<HostZipWriteEntry> {\n const asyncIterator = (entries as AsyncIterable<HostZipWriteEntry>)[\n Symbol.asyncIterator\n ];\n return asyncIterator === undefined\n ? (entries as Iterable<HostZipWriteEntry>)[Symbol.iterator]()\n : asyncIterator.call(entries);\n}\n\nfunction closeNodeZipEntryIterator(\n iterator: Iterator<HostZipWriteEntry> | AsyncIterator<HostZipWriteEntry>,\n): void {\n if (iterator.return === undefined) return;\n try {\n void Promise.resolve(iterator.return()).catch(() => undefined);\n } catch {\n // Preserve the failure that caused iteration to stop.\n }\n}\n\nasync function writeNodeStream(\n input: NodeJS.ReadableStream,\n writer: FileWriter,\n): Promise<void> {\n await pipeline(\n input,\n new Writable({\n write: (chunk: Buffer, _encoding, callback) => {\n void writer.write(chunk).then(\n () => callback(),\n (error: unknown) =>\n callback(\n error instanceof Error\n ? error\n : new Error(\"Cannot stream ZIP archive\"),\n ),\n );\n },\n }),\n );\n}\n\nasync function collectNodeStream(\n input: NodeJS.ReadableStream,\n): Promise<Buffer> {\n return await new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n input.on(\"data\", (chunk: Buffer) => chunks.push(chunk));\n input.once(\"error\", reject);\n input.once(\"end\", () => resolve(Buffer.concat(chunks)));\n });\n}\n\nexport const nodeWikiGraphPlatform: WikiGraphPlatform = {\n asyncContext: {\n create: <T>() => new asyncHooks.AsyncLocalStorage<T>(),\n },\n database: { open: openNodeDatabase },\n lifecycle: {\n instanceId: `node-process:${nodeProcess.pid}`,\n isInstanceAlive: (instanceId) => {\n const match = /^node-process:(\\d+)$/u.exec(instanceId);\n if (match === null) return Promise.resolve(undefined);\n try {\n nodeProcess.kill(Number(match[1]), 0);\n return Promise.resolve(true);\n } catch (error) {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === \"ESRCH\"\n ) {\n return Promise.resolve(false);\n }\n return Promise.resolve(true);\n }\n },\n },\n resources: {\n getDirectory: (identity) => {\n const path = decodeNodeResourceIdentity(identity, \"directory\");\n return Promise.resolve(\n path === undefined ? undefined : new NodeDirectory(path),\n );\n },\n getFile: (identity) => {\n const path = decodeNodeResourceIdentity(identity, \"file\");\n return Promise.resolve(\n path === undefined ? undefined : new NodeFile(path),\n );\n },\n resolveLegacyDirectory: (reference) => {\n const path = decodeNodeResourceIdentity(reference, \"directory\");\n return Promise.resolve(\n path === undefined ? undefined : new NodeDirectory(path),\n );\n },\n },\n templates: {\n createEnvironment: (options) =>\n new Environment(new NodeTemplateLoader(), options),\n },\n zip: {\n open: openNodeZip,\n write: writeNodeZip,\n },\n};\n\nexport interface NodeWikiGraphPlatformOptions {\n readonly lifecycle?: HostLifecycleProvider;\n}\n\n/** Create the Node platform with an optional host-owned lifecycle identity. */\nexport function createNodeWikiGraphPlatform(\n options: NodeWikiGraphPlatformOptions = {},\n): WikiGraphPlatform {\n return options.lifecycle === undefined\n ? nodeWikiGraphPlatform\n : { ...nodeWikiGraphPlatform, lifecycle: options.lifecycle };\n}\n\nclass NodeTemplateLoader extends Loader {\n readonly #dataDirectory: string | undefined;\n\n public constructor(dataDirectory?: string) {\n super();\n this.#dataDirectory = dataDirectory;\n }\n\n public getSource(templateName: string): LoaderSource {\n const name = normalizeTemplateName(templateName);\n const filePath = pathModule.join(\n this.#dataDirectory ?? resolveNodeDataDirectory(),\n name,\n );\n return {\n noCache: false,\n path: name,\n src: fs.readFileSync(filePath, \"utf8\"),\n };\n }\n}\n\nexport function createNodeTemplateEnvironment(\n dataDirectory: string,\n options: {\n readonly autoescape?: boolean;\n readonly trimBlocks?: boolean;\n } = {},\n): Environment {\n return new Environment(new NodeTemplateLoader(dataDirectory), {\n autoescape: options.autoescape ?? true,\n trimBlocks: options.trimBlocks ?? true,\n });\n}\n\nfunction resolveNodeDataDirectory(): string {\n const injected = (globalThis as { __WIKIGRAPH_DATA_DIR__?: unknown })\n .__WIKIGRAPH_DATA_DIR__;\n if (typeof injected === \"string\" && injected !== \"\") return injected;\n let directory = nodeProcess.cwd();\n while (true) {\n for (const candidate of [\n pathModule.join(directory, \"data\"),\n pathModule.join(directory, \"packages\", \"core\", \"data\"),\n ]) {\n try {\n if (fs.statSync(candidate).isDirectory()) return candidate;\n } catch {\n // Keep looking toward the filesystem root.\n }\n }\n const parent = pathModule.dirname(directory);\n if (parent === directory)\n throw new Error(\"Could not locate data directory\");\n directory = parent;\n }\n}\n\nexport interface NodeWikiGraphStorageOptions {\n readonly documentStoreRoot: string;\n readonly libraryRoot: string;\n}\n\nexport function createNodeWikiGraphStorage(\n stateRootOrOptions: string | NodeWikiGraphStorageOptions = pathModule.join(\n os.homedir(),\n \".wikigraph\",\n ),\n): WikiGraphStorage {\n const libraryRoot =\n typeof stateRootOrOptions === \"string\"\n ? stateRootOrOptions\n : stateRootOrOptions.libraryRoot;\n const documentStoreRoot =\n typeof stateRootOrOptions === \"string\"\n ? pathModule.join(stateRootOrOptions, \"documents\")\n : stateRootOrOptions.documentStoreRoot;\n return {\n library: new NodeDirectory(libraryRoot),\n documentStore: new NodeDirectory(documentStoreRoot),\n };\n}\n\nexport function installNodeWikiGraphPlatform(stateRoot?: string): void {\n installWikiGraphPlatform(nodeWikiGraphPlatform);\n installWikiGraphStorage(createNodeWikiGraphStorage(stateRoot));\n}\n\nexport function ensureNodeWikiGraphPlatform(): void {\n try {\n getWikiGraphPlatform();\n } catch {\n installWikiGraphPlatform(nodeWikiGraphPlatform);\n }\n try {\n getWikiGraphStorage();\n } catch {\n installWikiGraphStorage(createNodeWikiGraphStorage());\n }\n}\n\nexport async function withNodeWikiGraphStorage<T>(\n stateRoot: string | undefined,\n operation: () => Promise<T> | T,\n): Promise<T> {\n return await withWikiGraphStorage(\n stateRoot === undefined ? undefined : createNodeWikiGraphStorage(stateRoot),\n operation,\n );\n}\n","import { z } from \"zod\";\n\nimport { readLocalConfigSection } from \"./local-config.js\";\nimport { getWikiGraphSDKRuntimeContext } from \"./runtime-context.js\";\n\nconst WIKI_GRAPH_PROVIDER_VALUES = [\n \"anthropic\",\n \"google\",\n \"openai\",\n \"openai-compatible\",\n] as const;\n\nconst wikiGraphProviderSchema = z.enum(WIKI_GRAPH_PROVIDER_VALUES);\nconst inlineLLMConfigSchema = z.object({\n apiKey: z.string().min(1).optional(),\n baseURL: z.string().min(1).optional(),\n baseUrl: z.string().min(1).optional(),\n chatCompletionsUrl: z.string().min(1).optional(),\n llm: z\n .object({\n apiKey: z.string().min(1).optional(),\n baseURL: z.string().min(1).optional(),\n baseUrl: z.string().min(1).optional(),\n chatCompletionsUrl: z.string().min(1).optional(),\n model: z.string().min(1).optional(),\n name: z.string().min(1).optional(),\n provider: wikiGraphProviderSchema.optional(),\n })\n .optional(),\n model: z.string().min(1).optional(),\n name: z.string().min(1).optional(),\n provider: wikiGraphProviderSchema.optional(),\n});\n\nexport type WikiGraphProvider = z.infer<typeof wikiGraphProviderSchema>;\n\nexport interface WikiGraphRuntimeConfig {\n readonly embedding?: {\n readonly apiKey?: string;\n readonly baseURL?: string;\n readonly dimensions?: number;\n readonly model?: string;\n readonly name?: string;\n readonly provider?: \"openai\" | \"openai-compatible\";\n };\n readonly llm?: {\n readonly apiKey?: string;\n readonly baseURL?: string;\n readonly model?: string;\n readonly name?: string;\n readonly provider?: WikiGraphProvider;\n };\n readonly prompt?: string;\n readonly concurrent?: {\n readonly job?: number;\n readonly request?: number;\n };\n readonly wikispine?:\n | { readonly provider: \"cli\" }\n | {\n readonly endpoint: string;\n readonly provider: \"fetch\";\n readonly token: string;\n };\n readonly wikimedia?: {\n readonly endpoint: string;\n readonly token: string;\n };\n}\n\nexport type WikiGraphLLMConfig = NonNullable<WikiGraphRuntimeConfig[\"llm\"]>;\n\nexport type HostedProviderScope = \"wg-wikimedia\" | \"wikispine\";\n\ntype InlineLLMConfig = WikiGraphLLMConfig;\n\nexport async function loadWikiGraphRuntimeConfig(options?: {\n readonly llmJSON?: string;\n readonly skipEmbeddingConfig?: boolean;\n readonly skipLLMConfig?: boolean;\n}): Promise<WikiGraphRuntimeConfig> {\n const [embedding, localLLM, concurrent, wikimedia, wikispine] =\n await Promise.all([\n options?.skipEmbeddingConfig === true\n ? Promise.resolve({} as Record<string, unknown>)\n : readLocalConfigSection(\"embeddings\"),\n options?.skipLLMConfig === true\n ? Promise.resolve({} as Record<string, unknown>)\n : readLocalConfigSection(\"llm\"),\n readLocalConfigSection(\"concurrent\"),\n readLocalConfigSection(\"wikimedia\"),\n readLocalConfigSection(\"wikispine\"),\n ]);\n const inlineLLMConfig =\n options?.llmJSON === undefined\n ? undefined\n : parseInlineLLMConfig(options.llmJSON);\n const llm = createLLMConfig({\n apiKey: firstDefined(inlineLLMConfig?.apiKey, readString(localLLM.apiKey)),\n baseURL: firstDefined(\n inlineLLMConfig?.baseURL,\n readString(localLLM.baseURL),\n ),\n model: firstDefined(inlineLLMConfig?.model, readString(localLLM.model)),\n name: firstDefined(inlineLLMConfig?.name, readString(localLLM.name)),\n provider: firstDefined(\n inlineLLMConfig?.provider,\n readProvider(localLLM.provider),\n ),\n });\n const requestConcurrent = readPositiveInteger(concurrent.request);\n const jobConcurrent = readPositiveInteger(concurrent.job);\n const envPolicy = getWikiGraphSDKRuntimeContext().envPolicy;\n const wikispineConfig = resolveWikispineConfig(wikispine, envPolicy);\n const wikimediaConfig = createWikimediaConfig(wikimedia, envPolicy);\n const embeddingConfig = createEmbeddingConfig(embedding);\n\n return {\n ...(jobConcurrent === undefined && requestConcurrent === undefined\n ? {}\n : {\n concurrent: {\n ...(jobConcurrent === undefined ? {} : { job: jobConcurrent }),\n ...(requestConcurrent === undefined\n ? {}\n : { request: requestConcurrent }),\n },\n }),\n ...(embeddingConfig === undefined ? {} : { embedding: embeddingConfig }),\n ...(llm === undefined ? {} : { llm }),\n ...(wikimediaConfig === undefined ? {} : { wikimedia: wikimediaConfig }),\n ...(wikispineConfig === undefined ? {} : { wikispine: wikispineConfig }),\n };\n}\n\nfunction createWikimediaConfig(\n input: Record<string, unknown> | undefined,\n envPolicy: \"development\" | \"production\",\n): WikiGraphRuntimeConfig[\"wikimedia\"] | undefined {\n const endpoint = readString(input?.endpoint);\n const token = readString(input?.token);\n\n if (endpoint === undefined && token === undefined) return undefined;\n if (token === undefined) {\n throw new Error(\n \"Remote Wikimedia access requires an API key. Configure `wikg://local/config/wikimedia` token with `put token --secret`.\",\n );\n }\n return {\n endpoint:\n endpoint ?? resolveHostedProviderEndpoint(\"wg-wikimedia\", envPolicy),\n token,\n };\n}\n\nfunction createEmbeddingConfig(\n input: Record<string, unknown> | undefined,\n): WikiGraphRuntimeConfig[\"embedding\"] | undefined {\n const value = input ?? {};\n const provider = readEmbeddingProvider(value.provider);\n const apiKey = readString(value.apiKey);\n const baseURL = readString(value.baseURL);\n const dimensions =\n typeof value.dimensions === \"number\" &&\n Number.isInteger(value.dimensions) &&\n value.dimensions > 0\n ? value.dimensions\n : undefined;\n const model = readString(value.model);\n const name = readString(value.name);\n\n if (\n provider === undefined ||\n model === undefined ||\n (provider === \"openai-compatible\" && baseURL === undefined) ||\n (provider === \"openai\" && baseURL !== undefined)\n ) {\n return undefined;\n }\n\n return {\n ...(apiKey === undefined ? {} : { apiKey }),\n ...(baseURL === undefined ? {} : { baseURL }),\n ...(dimensions === undefined ? {} : { dimensions }),\n ...(model === undefined ? {} : { model }),\n ...(name === undefined ? {} : { name }),\n ...(provider === undefined ? {} : { provider }),\n };\n}\n\nfunction parseInlineLLMConfig(value: string): InlineLLMConfig | undefined {\n const normalized = normalizeString(value);\n\n if (normalized === undefined) {\n throw new Error(\"--llm must be a non-empty JSON object.\");\n }\n\n let parsedJson: unknown;\n\n try {\n parsedJson = JSON.parse(normalized);\n } catch (error) {\n throw new Error(`Invalid --llm JSON: ${formatError(error)}`);\n }\n\n const parsed = inlineLLMConfigSchema.safeParse(parsedJson);\n\n if (!parsed.success) {\n throw new Error(\n `Invalid --llm config: ${parsed.error.issues\n .map((issue) => `${issue.path.join(\".\") || \"<root>\"}: ${issue.message}`)\n .join(\"; \")}`,\n );\n }\n\n const input = parsed.data.llm ?? parsed.data;\n const provider = input.provider ?? inferInlineProvider(input);\n const baseURL = resolveInlineBaseURL(input);\n const config = createLLMConfig({\n apiKey: input.apiKey,\n baseURL,\n model: input.model,\n name: input.name,\n provider,\n });\n\n if (config === undefined) {\n throw new Error(\"--llm must contain at least one supported LLM field.\");\n }\n\n return config;\n}\n\nfunction inferInlineProvider(input: {\n readonly baseURL?: string | undefined;\n readonly baseUrl?: string | undefined;\n readonly chatCompletionsUrl?: string | undefined;\n readonly provider?: WikiGraphProvider | undefined;\n}): WikiGraphProvider | undefined {\n if (\n input.provider === undefined &&\n (input.baseURL !== undefined ||\n input.baseUrl !== undefined ||\n input.chatCompletionsUrl !== undefined)\n ) {\n return \"openai-compatible\";\n }\n\n return input.provider;\n}\n\nfunction inferBaseURLFromChatCompletionsURL(input: {\n readonly chatCompletionsUrl?: string | undefined;\n}): string | undefined {\n if (input.chatCompletionsUrl === undefined) {\n return undefined;\n }\n\n const suffix = \"/chat/completions\";\n\n if (!input.chatCompletionsUrl.endsWith(suffix)) {\n throw new Error(\n \"--llm chatCompletionsUrl must end with /chat/completions when baseURL is not provided.\",\n );\n }\n\n return input.chatCompletionsUrl.slice(0, -suffix.length);\n}\n\nfunction resolveInlineBaseURL(input: {\n readonly baseURL?: string | undefined;\n readonly baseUrl?: string | undefined;\n readonly chatCompletionsUrl?: string | undefined;\n}): string | undefined {\n if (input.baseURL !== undefined) {\n return input.baseURL;\n }\n if (input.baseUrl !== undefined) {\n return input.baseUrl;\n }\n\n return inferBaseURLFromChatCompletionsURL(input);\n}\n\nfunction createLLMConfig(input: {\n readonly apiKey: string | undefined;\n readonly baseURL: string | undefined;\n readonly model: string | undefined;\n readonly name: string | undefined;\n readonly provider: WikiGraphProvider | undefined;\n}): WikiGraphRuntimeConfig[\"llm\"] {\n if (\n input.apiKey === undefined &&\n input.baseURL === undefined &&\n input.model === undefined &&\n input.name === undefined &&\n input.provider === undefined\n ) {\n return undefined;\n }\n\n return {\n ...(input.apiKey === undefined ? {} : { apiKey: input.apiKey }),\n ...(input.baseURL === undefined ? {} : { baseURL: input.baseURL }),\n ...(input.model === undefined ? {} : { model: input.model }),\n ...(input.name === undefined ? {} : { name: input.name }),\n ...(input.provider === undefined ? {} : { provider: input.provider }),\n };\n}\n\nfunction readProvider(value: unknown): WikiGraphProvider | undefined {\n if (typeof value !== \"string\") {\n return undefined;\n }\n\n const parsed = wikiGraphProviderSchema.safeParse(value);\n\n return parsed.success ? parsed.data : undefined;\n}\n\nexport function resolveWikispineConfig(\n value: Record<string, unknown>,\n envPolicy: \"development\" | \"production\" = getWikiGraphSDKRuntimeContext()\n .envPolicy,\n): WikiGraphRuntimeConfig[\"wikispine\"] | undefined {\n const provider = readWikispineProvider(value.provider);\n const endpoint = readString(value.endpoint);\n const token = readString(value.token);\n\n if (provider === undefined) {\n return undefined;\n }\n\n if (provider === \"cli\") return { provider };\n if (token === undefined) {\n throw new Error(\n \"Remote WikiSpine access requires an API key. Configure `wikg://local/config/wikispine` token with `put token --secret`.\",\n );\n }\n\n return {\n endpoint: endpoint ?? resolveHostedProviderEndpoint(\"wikispine\", envPolicy),\n provider,\n token,\n };\n}\n\nexport function resolveHostedProviderEndpoint(\n scope: HostedProviderScope,\n envPolicy: \"development\" | \"production\" = getWikiGraphSDKRuntimeContext()\n .envPolicy,\n): string {\n const origin =\n envPolicy === \"development\"\n ? \"https://pdf-craft-api.oomol.dev\"\n : \"https://api.pdfcraft.ai\";\n return `${origin}/v1/${scope}`;\n}\n\nfunction readWikispineProvider(value: unknown): \"cli\" | \"fetch\" | undefined {\n return value === \"cli\" || value === \"fetch\" ? value : undefined;\n}\n\nfunction readEmbeddingProvider(\n value: unknown,\n): \"openai\" | \"openai-compatible\" | undefined {\n return value === \"openai\" || value === \"openai-compatible\"\n ? value\n : undefined;\n}\n\nfunction readString(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction readPositiveInteger(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isInteger(value) && value > 0\n ? value\n : undefined;\n}\n\nfunction firstDefined<T>(\n first: T | undefined,\n second: T | undefined,\n): T | undefined {\n return first ?? second;\n}\n\nfunction normalizeString(value: string | undefined): string | undefined {\n const normalized = value?.trim();\n\n return normalized === undefined || normalized === \"\" ? undefined : normalized;\n}\n\nfunction formatError(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n","import { openSharedStateDatabase } from \"wiki-graph-core\";\nimport { getWikiGraphSDKStateDir } from \"./runtime-context.js\";\nimport { NodeFile } from \"./node-platform.js\";\nimport { mkdir } from \"fs/promises\";\nimport { join } from \"path\";\nimport { homedir } from \"os\";\nimport type { Database } from \"wiki-graph-core\";\n\nexport const LOCAL_CONFIG_SECTIONS = [\n \"concurrent\",\n \"embeddings\",\n \"llm\",\n \"wikimedia\",\n \"wikispine\",\n] as const;\n\nexport type LocalConfigSection = (typeof LOCAL_CONFIG_SECTIONS)[number];\n\nexport type LocalConfigObject = Readonly<Record<string, unknown>>;\n\nconst LOCAL_CONFIG_SCHEMA_SQL = `\nCREATE TABLE IF NOT EXISTS config_sections (\n section TEXT PRIMARY KEY,\n value_json TEXT NOT NULL,\n updated_at INTEGER NOT NULL\n);\n`;\n\nexport async function readLocalConfigSection(\n section: LocalConfigSection,\n): Promise<LocalConfigObject> {\n return await withLocalConfigDatabase(async (database) => {\n return await readLocalConfigSectionInDatabase(database, section);\n });\n}\n\nexport async function replaceLocalConfigSection(\n section: LocalConfigSection,\n value: LocalConfigObject,\n): Promise<LocalConfigObject> {\n const normalized = validateLocalConfigSection(section, value);\n\n return await withLocalConfigDatabase(async (database) => {\n await writeLocalConfigSectionInDatabase(database, section, normalized);\n return normalized;\n });\n}\n\nexport async function putLocalConfigValue(\n section: LocalConfigSection,\n key: string,\n value: unknown,\n): Promise<LocalConfigObject> {\n return await withLocalConfigDatabase(async (database) => {\n const current = await readLocalConfigSectionInDatabase(database, section);\n const next = validateLocalConfigSection(section, {\n ...current,\n [normalizeLocalConfigKey(section, key)]: value,\n });\n\n await writeLocalConfigSectionInDatabase(database, section, next);\n return next;\n });\n}\n\nexport async function deleteLocalConfigValue(\n section: LocalConfigSection,\n key: string,\n): Promise<LocalConfigObject> {\n return await withLocalConfigDatabase(async (database) => {\n const current = await readLocalConfigSectionInDatabase(database, section);\n const normalizedKey = normalizeLocalConfigKey(section, key);\n const { [normalizedKey]: _removed, ...nextInput } = current;\n const next = validateLocalConfigSection(section, nextInput);\n\n await writeLocalConfigSectionInDatabase(database, section, next);\n return next;\n });\n}\n\nexport async function clearLocalConfigSection(\n section: LocalConfigSection,\n): Promise<LocalConfigObject> {\n return await replaceLocalConfigSection(section, {});\n}\n\nexport function parseLocalConfigSection(\n value: string | undefined,\n): LocalConfigSection | undefined {\n if (value === \"embedding\") {\n return \"embeddings\";\n }\n\n return LOCAL_CONFIG_SECTIONS.find((section) => section === value);\n}\n\nexport function maskLocalConfigSection(\n section: LocalConfigSection,\n value: LocalConfigObject,\n): LocalConfigObject {\n if (\n (section !== \"llm\" &&\n section !== \"embeddings\" &&\n section !== \"wikimedia\" &&\n section !== \"wikispine\") ||\n (value.apiKey === undefined && value.token === undefined)\n ) {\n return value;\n }\n\n return {\n ...value,\n ...(value.apiKey === undefined ? {} : { apiKey: \"****\" }),\n ...(value.token === undefined ? {} : { token: \"****\" }),\n };\n}\n\nexport function normalizeLocalConfigKey(\n section: LocalConfigSection,\n key: string,\n): string {\n const normalized = key.trim();\n\n if (normalized === \"\") {\n throw new Error(\"Config key cannot be empty.\");\n }\n\n if (section === \"llm\" || section === \"embeddings\") {\n switch (normalized) {\n case \"api-key\":\n return \"apiKey\";\n case \"base-url\":\n return \"baseURL\";\n default:\n return normalized;\n }\n }\n return normalized;\n}\n\nexport function validateLocalConfigSection(\n section: LocalConfigSection,\n value: LocalConfigObject,\n): LocalConfigObject {\n switch (section) {\n case \"embeddings\":\n return validateEmbeddingsConfig(value);\n case \"llm\":\n return validateLLMConfig(value);\n case \"concurrent\":\n return validateConcurrentConfig(value);\n case \"wikimedia\":\n return validateWikimediaConfig(value);\n case \"wikispine\":\n return validateWikispineConfig(value);\n }\n}\n\nasync function withLocalConfigDatabase<T>(\n operation: (database: Database) => Promise<T>,\n): Promise<T> {\n const stateDir = getWikiGraphSDKStateDir() ?? join(homedir(), \".wikigraph\");\n await mkdir(stateDir, { recursive: true });\n const database = await openSharedStateDatabase(\n new NodeFile(join(stateDir, \"core.sqlite\")),\n LOCAL_CONFIG_SCHEMA_SQL,\n );\n\n try {\n return await operation(database);\n } finally {\n await database.close();\n }\n}\n\nasync function readLocalConfigSectionInDatabase(\n database: Database,\n section: LocalConfigSection,\n): Promise<LocalConfigObject> {\n const value = await database.queryOne(\n \"SELECT value_json FROM config_sections WHERE section = ?\",\n [section],\n (row) => String(row.value_json),\n );\n\n return value === undefined ? {} : parseSectionJSON(section, value);\n}\n\nasync function writeLocalConfigSectionInDatabase(\n database: Database,\n section: LocalConfigSection,\n value: LocalConfigObject,\n): Promise<void> {\n await database.run(\n `\nINSERT INTO config_sections (section, value_json, updated_at)\nVALUES (?, ?, ?)\nON CONFLICT(section) DO UPDATE SET\n value_json = excluded.value_json,\n updated_at = excluded.updated_at\n`,\n [section, JSON.stringify(value), Date.now()],\n );\n}\n\nfunction parseSectionJSON(\n section: LocalConfigSection,\n value: string,\n): LocalConfigObject {\n let parsed: unknown;\n\n try {\n parsed = JSON.parse(value);\n } catch (error) {\n throw new Error(\n `Invalid local config JSON for ${section}: ${formatError(error)}`,\n );\n }\n\n if (parsed === null || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n throw new Error(\n `Invalid local config section ${section}: expected object.`,\n );\n }\n\n return validateLocalConfigSection(section, parsed as LocalConfigObject);\n}\n\nfunction validateEmbeddingsConfig(value: LocalConfigObject): LocalConfigObject {\n const allowedKeys = new Set([\n \"apiKey\",\n \"baseURL\",\n \"dimensions\",\n \"model\",\n \"name\",\n \"provider\",\n ]);\n const allowedProviders = new Set([\"openai\", \"openai-compatible\"]);\n const next: Record<string, unknown> = {};\n\n for (const [key, entry] of Object.entries(value)) {\n if (!allowedKeys.has(key)) {\n throw new Error(`Unknown embeddings config key: ${key}`);\n }\n if (key === \"dimensions\") {\n const parsed =\n typeof entry === \"number\"\n ? entry\n : typeof entry === \"string\"\n ? Number(entry)\n : NaN;\n\n if (!Number.isInteger(parsed) || parsed <= 0) {\n throw new Error(\"embeddings.dimensions must be a positive integer.\");\n }\n next[key] = parsed;\n continue;\n }\n if (typeof entry !== \"string\" || entry.trim() === \"\") {\n throw new Error(`embeddings.${key} must be a non-empty string.`);\n }\n const normalized = entry.trim();\n\n if (key === \"provider\" && !allowedProviders.has(normalized)) {\n throw new Error(`Unknown embeddings.provider: ${normalized}`);\n }\n\n next[key] = normalized;\n }\n\n return next;\n}\n\nfunction validateLLMConfig(value: LocalConfigObject): LocalConfigObject {\n const allowedKeys = new Set([\n \"apiKey\",\n \"baseURL\",\n \"model\",\n \"name\",\n \"provider\",\n ]);\n const allowedProviders = new Set([\n \"anthropic\",\n \"google\",\n \"openai\",\n \"openai-compatible\",\n ]);\n const next: Record<string, unknown> = {};\n\n for (const [key, entry] of Object.entries(value)) {\n if (!allowedKeys.has(key)) {\n throw new Error(`Unknown llm config key: ${key}`);\n }\n if (typeof entry !== \"string\" || entry.trim() === \"\") {\n throw new Error(`llm.${key} must be a non-empty string.`);\n }\n const normalized = entry.trim();\n\n if (key === \"provider\" && !allowedProviders.has(normalized)) {\n throw new Error(`Unknown llm.provider: ${normalized}`);\n }\n\n next[key] = normalized;\n }\n\n return next;\n}\n\nfunction validateConcurrentConfig(value: LocalConfigObject): LocalConfigObject {\n const allowedKeys = new Set([\"job\", \"request\"]);\n const next: Record<string, unknown> = {};\n\n for (const [key, entry] of Object.entries(value)) {\n if (!allowedKeys.has(key)) {\n throw new Error(`Unknown concurrent config key: ${key}`);\n }\n const parsed =\n typeof entry === \"number\"\n ? entry\n : typeof entry === \"string\"\n ? Number(entry)\n : NaN;\n\n if (!Number.isInteger(parsed) || parsed <= 0) {\n throw new Error(`concurrent.${key} must be a positive integer.`);\n }\n next[key] = parsed;\n }\n\n return next;\n}\n\nfunction validateWikispineConfig(value: LocalConfigObject): LocalConfigObject {\n const allowedKeys = new Set([\"endpoint\", \"provider\", \"token\"]);\n const allowedProviders = new Set([\"cli\", \"fetch\"]);\n const next: Record<string, unknown> = {};\n\n for (const [key, entry] of Object.entries(value)) {\n if (!allowedKeys.has(key)) {\n throw new Error(`Unknown wikispine config key: ${key}`);\n }\n if (typeof entry !== \"string\" || entry.trim() === \"\") {\n throw new Error(`wikispine.${key} must be a non-empty string.`);\n }\n const normalized = entry.trim();\n\n if (key === \"provider\" && !allowedProviders.has(normalized)) {\n throw new Error(`Unknown wikispine.provider: ${normalized}`);\n }\n\n next[key] = normalized;\n }\n\n return next;\n}\n\nfunction validateWikimediaConfig(value: LocalConfigObject): LocalConfigObject {\n return validateEndpointConfig(\"wikimedia\", value);\n}\n\nfunction validateEndpointConfig(\n section: \"wikimedia\",\n value: LocalConfigObject,\n): LocalConfigObject {\n const allowedKeys = new Set([\"endpoint\", \"token\"]);\n const next: Record<string, unknown> = {};\n\n for (const [key, entry] of Object.entries(value)) {\n if (!allowedKeys.has(key)) {\n throw new Error(`Unknown ${section} config key: ${key}`);\n }\n if (typeof entry !== \"string\" || entry.trim() === \"\") {\n throw new Error(`${section}.${key} must be a non-empty string.`);\n }\n next[key] = entry.trim();\n }\n\n return next;\n}\n\nfunction formatError(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n","import { AsyncLocalStorage } from \"async_hooks\";\n\nimport type { WikiGraphSDKProviders } from \"./providers.js\";\nimport type { WikiGraphSDKHost } from \"./host.js\";\n\nexport type WikiGraphSDKEnvPolicy = \"development\" | \"production\";\n\nexport interface WikiGraphSDKRuntimeContext {\n readonly cwd: string;\n readonly env: NodeJS.ProcessEnv;\n readonly envPolicy: WikiGraphSDKEnvPolicy;\n readonly host?: WikiGraphSDKHost;\n readonly providers?: WikiGraphSDKProviders;\n readonly stateDir?: string | undefined;\n}\n\n/** Shared by independently bundled SDK entry points in the same process. */\nconst RUNTIME_CONTEXT_KEY = Symbol.for(\"wiki-graph-sdk.runtime-context.v1\");\nconst runtimeContext = getRuntimeContextStorage();\n\nfunction getRuntimeContextStorage(): AsyncLocalStorage<WikiGraphSDKRuntimeContext> {\n const runtimeGlobal = globalThis as unknown as Record<PropertyKey, unknown>;\n const existing = runtimeGlobal[RUNTIME_CONTEXT_KEY];\n if (existing !== undefined) {\n return existing as AsyncLocalStorage<WikiGraphSDKRuntimeContext>;\n }\n\n const storage = new AsyncLocalStorage<WikiGraphSDKRuntimeContext>();\n Object.defineProperty(runtimeGlobal, RUNTIME_CONTEXT_KEY, {\n configurable: false,\n enumerable: false,\n value: storage,\n writable: false,\n });\n return storage;\n}\n\nexport async function withWikiGraphSDKRuntimeContext<T>(\n context: WikiGraphSDKRuntimeContext,\n operation: () => Promise<T> | T,\n): Promise<T> {\n return await runtimeContext.run(context, operation);\n}\n\nexport function getWikiGraphSDKRuntimeContext(): WikiGraphSDKRuntimeContext {\n return (\n runtimeContext.getStore() ?? {\n cwd: process.cwd(),\n env: process.env,\n envPolicy: \"production\",\n providers: {},\n }\n );\n}\n\nexport function getWikiGraphSDKStateDir(): string | undefined {\n const context = getWikiGraphSDKRuntimeContext();\n return context.host?.stateDir ?? context.stateDir;\n}\n\nexport function getWikiGraphSDKProviders(): WikiGraphSDKProviders {\n return getWikiGraphSDKRuntimeContext().providers ?? {};\n}\n","import type {\n LLMessage,\n LLMRequestOptions,\n LLMStreamProviderEvent,\n SearchIndexEmbeddingProvider,\n WikiGraphScope,\n} from \"wiki-graph-core\";\nimport type { WikiGraphLLMConfig } from \"./runtime-config.js\";\n\nexport type WikiGraphLLMMessage = LLMessage;\nexport type WikiGraphLLMProviderEvent = LLMStreamProviderEvent;\nexport type WikiGraphLLMProviderOptions = LLMRequestOptions<WikiGraphScope>;\n\nexport interface WikiGraphLLMProvider {\n readonly identity?: string;\n readonly model: string;\n stream(\n messages: readonly WikiGraphLLMMessage[],\n options: WikiGraphLLMProviderOptions,\n ): AsyncIterable<WikiGraphLLMProviderEvent>;\n}\n\nexport type WikiGraphEmbeddingProvider = SearchIndexEmbeddingProvider;\n\nexport interface WikiGraphSDKProviders {\n readonly embedding?: WikiGraphEmbeddingProvider;\n readonly llm?: WikiGraphLLMProvider;\n}\n\nexport function resolveWikiGraphLLMJSON(options: {\n readonly llm?: WikiGraphLLMConfig;\n readonly llmJSON?: string;\n}): string | undefined {\n if (options.llm !== undefined && options.llmJSON !== undefined) {\n throw new Error(\"Pass either llm or llmJSON, not both.\");\n }\n return options.llm === undefined\n ? options.llmJSON\n : JSON.stringify(options.llm);\n}\n","import { homedir } from \"os\";\nimport { isAbsolute, resolve } from \"path\";\n\nimport { getWikiGraphSDKRuntimeContext } from \"./runtime-context.js\";\n\nexport function resolveWikiGraphRuntimePath(path: string): string {\n const context = getWikiGraphSDKRuntimeContext();\n const environmentHome = context.env.HOME?.trim();\n const home =\n environmentHome === undefined || environmentHome === \"\"\n ? homedir()\n : environmentHome;\n if (path === \"~\") return home;\n if (path.startsWith(\"~/\")) return resolve(home, path.slice(2));\n return isAbsolute(path) ? path : resolve(context.cwd, path);\n}\n","import { realpath, stat } from \"fs/promises\";\nimport { basename, dirname, join, resolve } from \"path\";\n\nimport {\n formatLocatedWikiGraphUri,\n formatWikiGraphLibraryUri,\n findWikiGraphLibraryByPhysicalIdentity,\n type listWikiGraphLibraryArchives,\n findWikiGraphLibraryArchivePhysicalAliases,\n parseLocatedWikiGraphUri,\n parseWikiGraphLibraryUri,\n resolveWikiGraphLibrary,\n resolveWikiGraphLibraryArchiveFile,\n isWikiGraphSchemaVersionError,\n WikiGraphSchemaVersionError,\n type ParsedWikiGraphLibraryUri,\n type QueryIndexScope,\n type File,\n type Directory,\n} from \"wiki-graph-core\";\n\nimport {\n getNodeResourcePath,\n NodeFile,\n NodeDirectory,\n} from \"../node-platform.js\";\nimport { resolveWikiGraphRuntimePath } from \"../runtime-path.js\";\n\nexport type WikiGraphArchiveTarget =\n | {\n readonly kind: \"standalone\";\n readonly objectUri?: string;\n readonly path: string;\n }\n | {\n readonly kind: \"library\";\n readonly uri: string;\n };\n\nexport interface WikiGraphArchiveLocation {\n readonly archiveFile: File | Directory;\n readonly archiveKey: string;\n /** Logical archive locator. Never contains a managed archive's physical path. */\n readonly archivePath: string;\n readonly indexScope: QueryIndexScope;\n readonly libraryArchiveTarget?: ParsedWikiGraphLibraryUri;\n readonly locatedUri: string;\n readonly publicArchiveUri?: string;\n readonly target: WikiGraphArchiveTarget;\n}\n\nexport function rethrowArchiveSchemaError(\n error: unknown,\n target: WikiGraphArchiveTarget,\n): never {\n if (isWikiGraphSchemaVersionError(error) && error.target.kind === \"archive\") {\n throw new WikiGraphSchemaVersionError(\n target.kind === \"standalone\"\n ? { kind: \"archive\", path: resolveWikiGraphRuntimePath(target.path) }\n : { kind: \"library\", uri: target.uri.split(\"/arc/\")[0]! },\n error.actualVersion,\n error.supportedVersion,\n );\n }\n throw error;\n}\n\nexport function requireWikiGraphArchiveFile(\n location: WikiGraphArchiveLocation,\n): File | Directory {\n return location.archiveFile;\n}\n\nexport class WikiGraphArchiveOwnershipError extends Error {\n public readonly code = \"WIKI_GRAPH_ARCHIVE_OWNERSHIP_MISMATCH\";\n\n public constructor(message: string) {\n super(message);\n this.name = \"WikiGraphArchiveOwnershipError\";\n }\n}\n\nexport async function resolveWikiGraphArchiveLocation(\n target: WikiGraphArchiveTarget,\n): Promise<WikiGraphArchiveLocation> {\n if (target.kind === \"standalone\") {\n return await resolveStandaloneLocation(target);\n }\n return await resolveLibraryLocation(target);\n}\n\nexport async function assertStandaloneWikiGraphArchivePath(\n inputPath: string,\n): Promise<string> {\n const path = resolveWikiGraphRuntimePath(inputPath);\n const candidate = await canonicalPath(path);\n const candidateIdentity = await readFileIdentity(path);\n const matches = await findMatchingMembers(candidate, candidateIdentity);\n if (matches.length > 0) {\n const match = requireUnambiguousManagedMatch(path, matches);\n throw new WikiGraphArchiveOwnershipError(\n `Standalone archive path belongs to registered library ${formatWikiGraphLibraryUri(\n match.library.isDefault ? undefined : match.library.publicId,\n )}: ${path}. Use the library UUID URI ${match.archive.uri} instead.`,\n );\n }\n const ancestors = new Set<string>();\n for (const start of [candidate, resolve(path)]) {\n for (let parent = dirname(start); ; parent = dirname(parent)) {\n ancestors.add(parent);\n if (dirname(parent) === parent) break;\n }\n }\n for (const parent of ancestors) {\n const identity = await readFileIdentity(parent);\n const library = await findWikiGraphLibraryByPhysicalIdentity(\n identity,\n new NodeDirectory(parent).identity,\n );\n if (library !== undefined) {\n throw new WikiGraphArchiveOwnershipError(\n `Standalone archive path belongs to registered library ${formatWikiGraphLibraryUri(\n library.isDefault ? undefined : library.publicId,\n )}: ${path}. Scan the library, then address the archive by its library UUID URI.`,\n );\n }\n }\n return path;\n}\n\nexport function archiveTargetFromLogicalLocator(\n locator: string,\n objectUri?: string,\n): WikiGraphArchiveTarget {\n if (locator.startsWith(\"wikg://lib/\")) {\n return { kind: \"library\", uri: withObjectUri(locator, objectUri) };\n }\n return {\n kind: \"standalone\",\n path: locator,\n ...(objectUri === undefined ? {} : { objectUri }),\n };\n}\n\nexport async function resolveWikiGraphArchiveTarget(\n file: File | Directory,\n): Promise<WikiGraphArchiveTarget> {\n const path = getNodeResourcePath(file);\n const candidate = await canonicalPath(path);\n const candidateIdentity = await readFileIdentity(path);\n const matches = await findMatchingMembers(candidate, candidateIdentity);\n if (matches.length > 0) {\n const match = requireUnambiguousManagedMatch(path, matches);\n return { kind: \"library\", uri: match.archive.uri };\n }\n return { kind: \"standalone\", path: getNodeResourcePath(file) };\n}\n\nasync function resolveStandaloneLocation(\n target: Extract<WikiGraphArchiveTarget, { readonly kind: \"standalone\" }>,\n): Promise<WikiGraphArchiveLocation> {\n if (target.path.startsWith(\"wikg://lib/\")) {\n throw new WikiGraphArchiveOwnershipError(\n `A library archive URI cannot be used as a standalone path: ${target.path}`,\n );\n }\n const path = await assertStandaloneWikiGraphArchivePath(target.path);\n const normalized: WikiGraphArchiveTarget = {\n kind: \"standalone\",\n path,\n ...(target.objectUri === undefined ? {} : { objectUri: target.objectUri }),\n };\n return {\n archiveFile: new NodeFile(path),\n archiveKey: path,\n archivePath: path,\n indexScope: { archiveKey: path, archivePath: path, kind: \"archive-index\" },\n locatedUri: formatLocatedWikiGraphUri(path, target.objectUri),\n target: normalized,\n };\n}\n\nasync function resolveLibraryLocation(\n target: Extract<WikiGraphArchiveTarget, { readonly kind: \"library\" }>,\n): Promise<WikiGraphArchiveLocation> {\n const parsedLocated = parseLocatedWikiGraphUri(target.uri);\n const archiveUri = parsedLocated.archivePath ?? target.uri;\n const parsed = parseWikiGraphLibraryUri(archiveUri);\n if (parsed?.kind !== \"archive\") {\n throw new WikiGraphArchiveOwnershipError(\n `Library archive target must be a UUID archive URI: ${target.uri}`,\n );\n }\n // Resolving the library first distinguishes a missing membership database\n // from an ordinary file path and prevents path fallback.\n await resolveWikiGraphLibrary(parsed);\n const archiveFile = await resolveWikiGraphLibraryArchiveFile(archiveUri);\n const normalized: WikiGraphArchiveTarget = {\n kind: \"library\",\n uri: target.uri,\n };\n return {\n archiveFile,\n archiveKey: archiveUri,\n archivePath: archiveUri,\n indexScope: {\n archiveKey: archiveUri,\n archivePath: archiveUri,\n kind: \"archive-index\",\n },\n libraryArchiveTarget: parsed,\n locatedUri: target.uri,\n publicArchiveUri: archiveUri,\n target: normalized,\n };\n}\n\nfunction withObjectUri(archiveLocator: string, objectUri?: string): string {\n if (objectUri === undefined) return archiveLocator;\n const path = objectUri.replace(/^wikg:\\/\\//u, \"\");\n return `${archiveLocator.replace(/\\/$/u, \"\")}/${path}`;\n}\n\nasync function canonicalPath(path: string): Promise<string> {\n try {\n return await realpath(path);\n } catch (error) {\n if (\n !(\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n (error.code === \"ENOENT\" || error.code === \"ENOTDIR\")\n )\n )\n throw error;\n const absolute = resolve(path);\n const parent = dirname(absolute);\n return parent === absolute\n ? absolute\n : join(await canonicalPath(parent), basename(absolute));\n }\n}\n\ntype ListedLibrary = Awaited<ReturnType<typeof resolveWikiGraphLibrary>>;\ntype ListedArchive = Awaited<\n ReturnType<typeof listWikiGraphLibraryArchives>\n>[number];\n\ninterface ManagedArchiveMatch {\n readonly archive: ListedArchive;\n readonly library: ListedLibrary;\n readonly memberPath: string;\n}\n\nasync function findMatchingMembers(\n candidate: string,\n candidateIdentity?: string,\n): Promise<readonly ManagedArchiveMatch[]> {\n if (candidateIdentity === undefined) return [];\n const archives =\n await findWikiGraphLibraryArchivePhysicalAliases(candidateIdentity);\n const members: ManagedArchiveMatch[] = [];\n for (const archive of archives) {\n const parsed = parseWikiGraphLibraryUri(archive.libraryUri)!;\n const library = await resolveWikiGraphLibrary(parsed);\n const physical = archive.file ?? archive.directory;\n if (library !== undefined && physical !== undefined)\n members.push({\n archive,\n library,\n memberPath: getNodeResourcePath(physical),\n });\n }\n const exact: ManagedArchiveMatch[] = [];\n for (const member of members) {\n if ((await canonicalPath(member.memberPath)) === candidate)\n exact.push(member);\n }\n return exact.length > 0 ? exact : members;\n}\n\nfunction requireUnambiguousManagedMatch(\n path: string,\n matches: readonly ManagedArchiveMatch[],\n): ManagedArchiveMatch {\n if (matches.length === 1) return matches[0]!;\n throw new WikiGraphArchiveOwnershipError(\n `Archive file identity is ambiguous across managed archives: ${path}. Use an explicit library UUID URI (${matches\n .map((match) => match.archive.uri)\n .join(\", \")}).`,\n );\n}\n\nasync function readFileIdentity(path: string): Promise<string | undefined> {\n try {\n const value = await stat(path);\n return `${value.dev}:${value.ino}`;\n } catch (error) {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n (error.code === \"ENOENT\" || error.code === \"ENOTDIR\")\n )\n return undefined;\n throw error;\n }\n}\n","import {\n openWikimediaResolver,\n type SearchIndexEmbeddingProvider,\n} from \"wiki-graph-core\";\n\nimport {\n buildSearchIndexEmbeddingProvider,\n readWikiGraphEmbeddingConfig,\n} from \"./embedding.js\";\nimport { loadWikiGraphRuntimeConfig } from \"./runtime-config.js\";\nimport { getWikiGraphSDKProviders } from \"./runtime-context.js\";\n\nexport async function createConfiguredEmbeddingProvider(): Promise<\n SearchIndexEmbeddingProvider | undefined\n> {\n const injected = getWikiGraphSDKProviders().embedding;\n if (injected !== undefined) return injected;\n const config = await readWikiGraphEmbeddingConfig();\n if (\n config.provider === undefined ||\n config.model === undefined ||\n (config.provider === \"openai-compatible\" && config.baseURL === undefined) ||\n (config.provider === \"openai\" && config.baseURL !== undefined)\n ) {\n return undefined;\n }\n return buildSearchIndexEmbeddingProvider(config);\n}\n\nexport async function withConfiguredWikimediaResolver<T>(\n objectUri: string,\n operation: (\n options:\n | Record<string, never>\n | {\n readonly wikimediaResolver: Awaited<\n ReturnType<typeof openWikimediaResolver>\n >;\n },\n ) => Promise<T>,\n): Promise<T> {\n if (!objectUri.endsWith(\"/wikipage\")) return await operation({});\n\n const config = await loadWikiGraphRuntimeConfig();\n const resolver = await openWikimediaResolver(\n config.wikimedia === undefined\n ? { kind: \"local\" }\n : {\n endpoint: config.wikimedia.endpoint,\n kind: \"remote\",\n token: config.wikimedia.token,\n },\n );\n try {\n return await operation({ wikimediaResolver: resolver });\n } finally {\n await resolver.close();\n }\n}\n","import type { SearchIndexEmbeddingProvider } from \"wiki-graph-core\";\n\nimport { embed, embedMany } from \"ai\";\nimport { createOpenAI } from \"@ai-sdk/openai\";\nimport { createOpenAICompatible } from \"@ai-sdk/openai-compatible\";\n\nimport { readLocalConfigSection } from \"./local-config.js\";\n\nexport type WikiGraphEmbeddingProviderName = \"openai\" | \"openai-compatible\";\n\nexport interface WikiGraphEmbeddingConfig {\n readonly apiKey?: string;\n readonly baseURL?: string;\n readonly dimensions?: number;\n readonly model?: string;\n readonly name?: string;\n readonly provider?: WikiGraphEmbeddingProviderName;\n}\n\nexport interface QueryEmbeddingResult {\n readonly dimensions: number;\n readonly embedding: readonly number[];\n readonly model: string;\n readonly provider: WikiGraphEmbeddingProviderName;\n readonly usage?: {\n readonly tokens?: number;\n };\n}\n\nconst EMBEDDING_BATCH_SIZE = 10;\n\nexport async function readWikiGraphEmbeddingConfig(): Promise<WikiGraphEmbeddingConfig> {\n const config = await readLocalConfigSection(\"embeddings\");\n\n return {\n ...(typeof config.apiKey === \"string\" ? { apiKey: config.apiKey } : {}),\n ...(typeof config.baseURL === \"string\" ? { baseURL: config.baseURL } : {}),\n ...(typeof config.dimensions === \"number\"\n ? { dimensions: config.dimensions }\n : {}),\n ...(typeof config.model === \"string\" ? { model: config.model } : {}),\n ...(typeof config.name === \"string\" ? { name: config.name } : {}),\n ...(typeof config.provider === \"string\"\n ? { provider: parseEmbeddingProvider(config.provider) }\n : {}),\n };\n}\n\nexport async function embedQueryText(\n value: string,\n config: WikiGraphEmbeddingConfig = {},\n): Promise<QueryEmbeddingResult> {\n const normalized = value.trim();\n\n if (normalized === \"\") {\n throw new Error(\"Query text cannot be empty.\");\n }\n\n const provider = requireEmbeddingProvider(config.provider);\n const model = requireEmbeddingModel(config.model);\n const embeddingModel = createEmbeddingModel(provider, model, config);\n const providerOptions = createEmbeddingProviderOptions(provider, config);\n const result = await embed({\n model: embeddingModel,\n ...(providerOptions === undefined ? {} : { providerOptions }),\n value: normalized,\n });\n\n return {\n dimensions: result.embedding.length,\n embedding: result.embedding,\n model,\n provider,\n ...(result.usage.tokens === undefined\n ? {}\n : { usage: { tokens: result.usage.tokens } }),\n };\n}\n\nexport function buildSearchIndexEmbeddingProvider(\n config: WikiGraphEmbeddingConfig,\n): SearchIndexEmbeddingProvider {\n const provider = requireEmbeddingProvider(config.provider);\n const model = requireEmbeddingModel(config.model);\n const embeddingModel = createEmbeddingModel(provider, model, config);\n const providerOptions = createEmbeddingProviderOptions(provider, config);\n\n return {\n ...(config.dimensions === undefined\n ? {}\n : { dimensions: config.dimensions }),\n identity: createEmbeddingIdentity(provider, model, config),\n model,\n embedTexts: async (texts, options) => {\n const embeddings: number[][] = [];\n let tokens = 0;\n\n for (const batch of chunkTexts(texts, EMBEDDING_BATCH_SIZE)) {\n options?.signal?.throwIfAborted();\n const result = await embedMany({\n ...(options?.signal === undefined\n ? {}\n : { abortSignal: options.signal }),\n model: embeddingModel,\n ...(providerOptions === undefined ? {} : { providerOptions }),\n values: [...batch],\n });\n\n embeddings.push(...result.embeddings);\n tokens += result.usage.tokens ?? 0;\n }\n return {\n embeddings,\n ...(tokens === 0 ? {} : { tokens }),\n };\n },\n };\n}\n\nfunction createEmbeddingIdentity(\n provider: WikiGraphEmbeddingProviderName,\n model: string,\n config: WikiGraphEmbeddingConfig,\n): string {\n return JSON.stringify({\n ...(config.baseURL === undefined ? {} : { baseURL: config.baseURL }),\n ...(config.dimensions === undefined\n ? {}\n : { dimensions: config.dimensions }),\n model,\n provider,\n });\n}\n\nfunction* chunkTexts(\n texts: readonly string[],\n size: number,\n): Iterable<readonly string[]> {\n for (let index = 0; index < texts.length; index += size) {\n yield texts.slice(index, index + size);\n }\n}\n\nexport async function embedQueryTextWithLocalConfig(\n value: string,\n): Promise<QueryEmbeddingResult> {\n return await embedQueryText(value, await readWikiGraphEmbeddingConfig());\n}\n\nfunction createEmbeddingModel(\n provider: WikiGraphEmbeddingProviderName,\n model: string,\n config: WikiGraphEmbeddingConfig,\n) {\n switch (provider) {\n case \"openai\": {\n if (config.baseURL !== undefined) {\n throw new Error(\n \"openai does not accept embeddings.baseURL. Use openai-compatible for third-party OpenAI-style embeddings APIs.\",\n );\n }\n\n return createOpenAI({\n ...(config.apiKey === undefined ? {} : { apiKey: config.apiKey }),\n ...(config.name === undefined ? {} : { name: config.name }),\n }).embeddingModel(model);\n }\n case \"openai-compatible\": {\n if (config.baseURL === undefined) {\n throw new Error(\"openai-compatible requires embeddings.baseURL.\");\n }\n\n return createOpenAICompatible({\n baseURL: config.baseURL,\n name: config.name ?? createOpenAICompatibleName(config.baseURL),\n ...(config.apiKey === undefined ? {} : { apiKey: config.apiKey }),\n }).embeddingModel(model);\n }\n }\n}\n\nfunction createEmbeddingProviderOptions(\n provider: WikiGraphEmbeddingProviderName,\n config: WikiGraphEmbeddingConfig,\n): Record<string, { readonly dimensions: number }> | undefined {\n if (config.dimensions === undefined) {\n return undefined;\n }\n\n return {\n [getEmbeddingProviderOptionsName(provider, config)]: {\n dimensions: config.dimensions,\n },\n };\n}\n\nfunction getEmbeddingProviderOptionsName(\n provider: WikiGraphEmbeddingProviderName,\n _config: WikiGraphEmbeddingConfig,\n): string {\n if (provider === \"openai\") {\n return \"openai\";\n }\n return \"openaiCompatible\";\n}\n\nfunction requireEmbeddingProvider(\n provider: WikiGraphEmbeddingProviderName | undefined,\n): WikiGraphEmbeddingProviderName {\n if (provider !== undefined) {\n return provider;\n }\n\n throw new Error(\n \"Missing embeddings configuration. Configure `wikg://local/config/embeddings` with provider and model.\",\n );\n}\n\nfunction requireEmbeddingModel(model: string | undefined): string {\n if (model !== undefined) {\n return model;\n }\n\n throw new Error(\n \"Missing embeddings.model. Configure `wikg://local/config/embeddings` before using Dense search.\",\n );\n}\n\nfunction parseEmbeddingProvider(value: string): WikiGraphEmbeddingProviderName {\n switch (value) {\n case \"openai\":\n case \"openai-compatible\":\n return value;\n default:\n throw new Error(\n `Invalid embeddings.provider: ${value}. Expected openai or openai-compatible.`,\n );\n }\n}\n\nfunction createOpenAICompatibleName(baseURL: string): string {\n try {\n return new URL(baseURL).hostname;\n } catch {\n return \"openai-compatible\";\n }\n}\n","import {\n isArchiveSearchIndexCurrent,\n listChapters,\n type ChapterEntry,\n type IndexArtifactCoverageRecord,\n type IndexArtifactKind,\n type ReadonlyDocument,\n} from \"wiki-graph-core\";\n\nexport interface WikiGraphArchiveIndexArtifactInspection {\n readonly current: boolean;\n readonly exists: boolean;\n readonly kind: IndexArtifactKind;\n readonly sourceRevision?: number;\n}\n\nexport interface WikiGraphArchiveChapterInspection {\n readonly capabilities: {\n readonly knowledgeGraph: { readonly completed: boolean };\n readonly readingGraph: { readonly completed: boolean };\n readonly readingSummary: { readonly completed: boolean };\n };\n readonly chapter: ChapterEntry;\n readonly indexes: {\n readonly fts: WikiGraphArchiveIndexArtifactInspection;\n readonly sourceEmbedding: WikiGraphArchiveIndexArtifactInspection;\n readonly summaryEmbedding: WikiGraphArchiveIndexArtifactInspection;\n };\n readonly revision: number;\n readonly summaryWords: number;\n}\n\nexport interface WikiGraphArchiveInspection {\n readonly archiveUri: string;\n readonly chapters: readonly WikiGraphArchiveChapterInspection[];\n readonly localIndexCache: { readonly current: boolean };\n readonly scope: {\n readonly chapterId?: number;\n readonly type: \"archive\" | \"chapter\";\n };\n readonly uri: string;\n}\n\nexport async function inspectWikiGraphArchive(\n document: ReadonlyDocument,\n options: {\n readonly archiveUri: string;\n readonly chapterId?: number;\n },\n): Promise<WikiGraphArchiveInspection> {\n const [allChapters, indexCacheCurrent, summaryWords, ...coverage] =\n await Promise.all([\n listChapters(document),\n isArchiveSearchIndexCurrent(document),\n readSummaryWords(document),\n document.indexArtifacts.listCoverage(\"fts\"),\n document.indexArtifacts.listCoverage(\"embedding-source\"),\n document.indexArtifacts.listCoverage(\"embedding-summary\"),\n ]);\n const chapters = selectChapters(allChapters, options.chapterId);\n const coverageByKind = {\n fts: byChapterId(coverage[0]),\n sourceEmbedding: byChapterId(coverage[1]),\n summaryEmbedding: byChapterId(coverage[2]),\n };\n const inspections = await Promise.all(\n chapters.map(async (chapter) => {\n const serial = await document.serials.getById(chapter.chapterId);\n return {\n capabilities: {\n knowledgeGraph: {\n completed: serial?.knowledgeGraphReady === true,\n },\n readingGraph: { completed: serial?.topologyReady === true },\n readingSummary: { completed: chapter.stage === \"summarized\" },\n },\n chapter,\n indexes: {\n fts: inspectArtifact(\n \"fts\",\n coverageByKind.fts.get(chapter.chapterId),\n ),\n sourceEmbedding: inspectArtifact(\n \"embedding-source\",\n coverageByKind.sourceEmbedding.get(chapter.chapterId),\n ),\n summaryEmbedding: inspectArtifact(\n \"embedding-summary\",\n coverageByKind.summaryEmbedding.get(chapter.chapterId),\n ),\n },\n revision: serial?.revision ?? 0,\n summaryWords: summaryWords.get(chapter.chapterId) ?? 0,\n } satisfies WikiGraphArchiveChapterInspection;\n }),\n );\n const selected = inspections[0];\n return {\n archiveUri: options.archiveUri,\n chapters: inspections,\n localIndexCache: { current: indexCacheCurrent },\n scope:\n options.chapterId === undefined\n ? { type: \"archive\" }\n : { chapterId: options.chapterId, type: \"chapter\" },\n uri:\n selected === undefined || options.chapterId === undefined\n ? options.archiveUri\n : formatLocatedChapterUri(options.archiveUri, selected.chapter),\n };\n}\n\nfunction selectChapters(\n chapters: readonly ChapterEntry[],\n chapterId: number | undefined,\n): readonly ChapterEntry[] {\n if (chapterId === undefined) return chapters;\n const selected = chapters.filter(\n (chapter) => chapter.chapterId === chapterId,\n );\n if (selected.length === 0) {\n throw new Error(`Chapter ${chapterId} does not exist.`);\n }\n return selected;\n}\n\nfunction byChapterId(\n coverage: readonly IndexArtifactCoverageRecord[],\n): ReadonlyMap<number, IndexArtifactCoverageRecord> {\n return new Map(coverage.map((item) => [item.serialId, item]));\n}\n\nfunction inspectArtifact(\n kind: IndexArtifactKind,\n coverage: IndexArtifactCoverageRecord | undefined,\n): WikiGraphArchiveIndexArtifactInspection {\n return {\n current: coverage?.current === true,\n exists: coverage?.sourceRevision !== undefined,\n kind,\n ...(coverage?.sourceRevision === undefined\n ? {}\n : { sourceRevision: coverage.sourceRevision }),\n };\n}\n\nasync function readSummaryWords(\n document: ReadonlyDocument,\n): Promise<ReadonlyMap<number, number>> {\n const rows = await document.readDatabase(\n async (database) =>\n await database.queryAll(\n `\n SELECT chapter_id, COALESCE(SUM(words_count), 0) AS words\n FROM text_sentence_records\n WHERE kind = 2\n GROUP BY chapter_id\n `,\n undefined,\n (row) => ({\n chapterId: Number(row.chapter_id),\n words: Number(row.words),\n }),\n ),\n );\n return new Map(rows.map((row) => [row.chapterId, row.words]));\n}\n\nfunction formatLocatedChapterUri(\n archiveUri: string,\n chapter: Pick<ChapterEntry, \"uri\">,\n): string {\n return `${archiveUri.replace(/\\/+$/u, \"\")}/${chapter.uri.replace(/^wikg:\\/\\//u, \"\")}`;\n}\n","import {\n WikiGraphArchiveFile,\n WikiGraphDirectoryFile,\n writeWikiGraphLibraryArchive,\n type DirectoryDocument,\n type Directory,\n type File,\n} from \"wiki-graph-core\";\n\nimport type { WikiGraphArchiveLocation } from \"./target.js\";\n\nexport interface WriteWikiGraphArchiveLocationOptions {\n readonly invalidateContinuationCursors?: boolean;\n readonly onIndexSyncError?: (error: unknown) => void;\n readonly refreshLibraryIndex?: boolean;\n readonly searchIndexWritebackPolicy?: \"archive\" | \"cache\";\n}\n\nexport async function writeWikiGraphArchiveLocation<T>(\n location: WikiGraphArchiveLocation,\n operation: (document: DirectoryDocument) => Promise<T> | T,\n options: WriteWikiGraphArchiveLocationOptions = {},\n): Promise<T> {\n const cacheOnly = options.searchIndexWritebackPolicy === \"cache\";\n const write = async (\n archiveFile: File | Directory = location.archiveFile,\n ) => {\n if (cacheOnly) {\n return await new WikiGraphArchiveFile(archiveFile).readDocument(\n operation,\n { searchIndexWritebackPolicy: \"cache\" },\n );\n }\n const writeOptions = {\n ...(cacheOnly\n ? {}\n : { derivedStateKeys: [location.archiveKey, location.archivePath] }),\n ...(options.invalidateContinuationCursors === undefined\n ? {}\n : {\n invalidateContinuationCursors:\n options.invalidateContinuationCursors,\n }),\n ...(options.searchIndexWritebackPolicy === undefined\n ? {}\n : { searchIndexWritebackPolicy: options.searchIndexWritebackPolicy }),\n };\n if (archiveFile.kind === \"directory\") {\n return await new WikiGraphDirectoryFile(archiveFile).write(\n operation,\n writeOptions,\n );\n }\n return await new WikiGraphArchiveFile(archiveFile).write(\n operation,\n writeOptions,\n );\n };\n\n if (\n location.libraryArchiveTarget === undefined ||\n cacheOnly ||\n options.refreshLibraryIndex === false\n ) {\n return await write();\n }\n return await writeWikiGraphLibraryArchive({\n additionalDerivedStateKeys: [location.archiveKey, location.archivePath],\n ...(options.invalidateContinuationCursors === undefined\n ? {}\n : {\n invalidateContinuationCursors: options.invalidateContinuationCursors,\n }),\n ...(options.onIndexSyncError === undefined\n ? {}\n : { onIndexSyncError: options.onIndexSyncError }),\n operation: async (archiveFile) => await write(archiveFile),\n target: location.libraryArchiveTarget,\n });\n}\n","/** Options that may be changed while advancing an existing cursor. */\nexport interface CursorNextOptions {\n readonly limit?: number;\n readonly signal?: AbortSignal;\n}\n\n/** A runtime page constructor used for page-type identity and reconstruction. */\nexport type PageClass<P> = abstract new (...args: never[]) => P;\n\n/** The common, deliberately small surface shared by SDK result pages. */\nexport interface IPage<T> extends Iterable<T> {\n nextCursor(): ICursor<this> | null;\n}\n\n/** A lazy continuation associated with a concrete page class. */\nexport interface ICursor<P extends IPage<unknown>> {\n readonly pageClass: PageClass<P>;\n next(options?: CursorNextOptions): Promise<P>;\n token(): Promise<string>;\n release(): Promise<void>;\n}\n\nexport interface CursorImplementation<P extends IPage<unknown>> {\n readonly pageClass: PageClass<P>;\n readonly next: (options: CursorNextOptions) => Promise<P>;\n readonly token: () => Promise<string>;\n readonly release?: () => Promise<void> | void;\n}\n\nexport interface PageCursorImplementation<P extends IPage<unknown>> {\n readonly pageClass: PageClass<P>;\n readonly rawCursor: string;\n readonly next: (rawCursor: string, options: CursorNextOptions) => Promise<P>;\n readonly createToken: (rawCursor: string) => Promise<string>;\n readonly releaseToken?: (token: string) => Promise<void> | void;\n}\n\n/**\n * Creates a cursor without retaining the page that created it. The callbacks\n * are deliberately supplied by the SDK operation that owns continuation\n * persistence; this type is only the lifecycle/typing facade.\n */\nexport function createCursor<P extends IPage<unknown>>(\n implementation: CursorImplementation<P>,\n): ICursor<P> {\n let released = false;\n\n const assertLive = (): void => {\n if (released) throw new Error(\"Cursor has been released.\");\n };\n\n return {\n pageClass: implementation.pageClass,\n async next(options: CursorNextOptions = {}): Promise<P> {\n assertLive();\n return await implementation.next(options);\n },\n async token(): Promise<string> {\n assertLive();\n return await implementation.token();\n },\n async release(): Promise<void> {\n if (released) return;\n released = true;\n await implementation.release?.();\n },\n };\n}\n\n/** Adapts an existing raw cursor while creating durable state only on demand. */\nexport function createPageCursor<P extends IPage<unknown>>(\n implementation: PageCursorImplementation<P>,\n): ICursor<P> {\n let token: string | undefined;\n return createCursor({\n pageClass: implementation.pageClass,\n next: async (options) =>\n await implementation.next(implementation.rawCursor, options),\n token: async () => {\n token ??= await implementation.createToken(implementation.rawCursor);\n return token;\n },\n release: async () => {\n if (token !== undefined) await implementation.releaseToken?.(token);\n token = undefined;\n },\n });\n}\n\n/** Iterates concrete pages and releases each page cursor after advancing. */\nexport async function* iteratePages<P extends IPage<T>, T>(\n firstPage: P,\n options: CursorNextOptions = {},\n): AsyncIterable<P> {\n let page = firstPage;\n\n while (true) {\n yield page;\n const cursor = page.nextCursor();\n if (cursor === null) return;\n\n try {\n const nextPage = await cursor.next(options);\n await cursor.release();\n page = nextPage;\n } catch (error) {\n await cursor.release();\n throw error;\n }\n }\n}\n\n/** Iterates items across all pages while managing every continuation cursor. */\nexport async function* iterateItems<P extends IPage<T>, T>(\n firstPage: P,\n options: CursorNextOptions = {},\n): AsyncIterable<T> {\n for await (const page of iteratePages(firstPage, options)) {\n yield* page;\n }\n}\n","import type {\n ArchiveCollectionResult,\n ArchiveEvidence,\n ArchiveFindHit,\n ArchiveFindResult,\n ArchiveListItem,\n ArchiveRelatedResult,\n ArchiveSourceLocator,\n ArchiveSourceLocatorResult,\n WikiGraphLibrarySearchBucketPage,\n} from \"wiki-graph-core\";\n\nimport {\n createPageCursor,\n type CursorNextOptions,\n type ICursor,\n type IPage,\n type PageClass,\n} from \"./pages.js\";\n\nexport class ArchiveFindPage implements IPage<ArchiveFindHit> {\n public readonly result: ArchiveFindResult;\n public readonly chapters: ArchiveFindResult[\"chapters\"];\n public readonly items: ArchiveFindResult[\"items\"];\n public readonly lens: ArchiveFindResult[\"lens\"];\n public readonly lensHint: ArchiveFindResult[\"lensHint\"];\n public readonly limit: number;\n public readonly match: ArchiveFindResult[\"match\"];\n public readonly rawNextCursor: string | null;\n public readonly order: ArchiveFindResult[\"order\"];\n public readonly query: string;\n public readonly terms: readonly string[];\n public readonly types: ArchiveFindResult[\"types\"];\n readonly #cursor: ICursor<this> | null;\n\n public constructor(\n result: ArchiveFindResult,\n cursor: ICursor<ArchiveFindPage> | null = null,\n ) {\n this.result = result;\n this.chapters = result.chapters;\n this.items = result.items;\n this.lens = result.lens;\n this.lensHint = result.lensHint;\n this.limit = result.limit;\n this.match = result.match;\n this.rawNextCursor = result.nextCursor;\n this.order = result.order;\n this.query = result.query;\n this.terms = result.terms;\n this.types = result.types;\n this.#cursor = cursor as ICursor<this> | null;\n }\n\n public static readonly pageClass: PageClass<ArchiveFindPage> =\n ArchiveFindPage;\n public [Symbol.iterator](): Iterator<ArchiveFindHit> {\n return this.items[Symbol.iterator]();\n }\n public nextCursor(): ICursor<this> | null {\n return this.#cursor;\n }\n}\n\nexport class ArchiveCollectionPage implements IPage<ArchiveFindHit> {\n public readonly result: ArchiveCollectionResult;\n public readonly chapters: ArchiveCollectionResult[\"chapters\"];\n public readonly ids: ArchiveCollectionResult[\"ids\"];\n public readonly items: ArchiveCollectionResult[\"items\"];\n public readonly limit: number;\n public readonly rawNextCursor: string | null;\n public readonly order: ArchiveCollectionResult[\"order\"];\n public readonly types: ArchiveCollectionResult[\"types\"];\n readonly #cursor: ICursor<this> | null;\n\n public constructor(\n result: ArchiveCollectionResult,\n cursor: ICursor<ArchiveCollectionPage> | null = null,\n ) {\n this.result = result;\n this.chapters = result.chapters;\n this.ids = result.ids;\n this.items = result.items;\n this.limit = result.limit;\n this.rawNextCursor = result.nextCursor;\n this.order = result.order;\n this.types = result.types;\n this.#cursor = cursor as ICursor<this> | null;\n }\n\n public static readonly pageClass: PageClass<ArchiveCollectionPage> =\n ArchiveCollectionPage;\n public [Symbol.iterator](): Iterator<ArchiveFindHit> {\n return this.items[Symbol.iterator]();\n }\n public nextCursor(): ICursor<this> | null {\n return this.#cursor;\n }\n}\n\nexport class ArchiveEvidencePage implements IPage<\n ArchiveEvidence[\"items\"][number]\n> {\n public readonly result: ArchiveEvidence;\n public readonly items: ArchiveEvidence[\"items\"];\n public readonly limit: number;\n public readonly rawNextCursor: string | null;\n readonly #cursor: ICursor<this> | null;\n\n public constructor(\n result: ArchiveEvidence,\n cursor: ICursor<ArchiveEvidencePage> | null = null,\n ) {\n this.result = result;\n this.items = result.items;\n this.limit = result.limit;\n this.rawNextCursor = result.nextCursor;\n this.#cursor = cursor as ICursor<this> | null;\n }\n\n public static readonly pageClass: PageClass<ArchiveEvidencePage> =\n ArchiveEvidencePage;\n public [Symbol.iterator](): Iterator<ArchiveEvidence[\"items\"][number]> {\n return this.items[Symbol.iterator]();\n }\n public nextCursor(): ICursor<this> | null {\n return this.#cursor;\n }\n}\n\nexport class ArchiveRelatedPage implements IPage<ArchiveListItem> {\n public readonly result: ArchiveRelatedResult;\n public readonly items: ArchiveRelatedResult[\"items\"];\n public readonly limit: number;\n public readonly rawNextCursor: string | null;\n readonly #cursor: ICursor<this> | null;\n\n public constructor(\n result: ArchiveRelatedResult,\n cursor: ICursor<ArchiveRelatedPage> | null = null,\n ) {\n this.result = result;\n this.items = result.items;\n this.limit = result.limit;\n this.rawNextCursor = result.nextCursor;\n this.#cursor = cursor as ICursor<this> | null;\n }\n\n public static readonly pageClass: PageClass<ArchiveRelatedPage> =\n ArchiveRelatedPage;\n public [Symbol.iterator](): Iterator<ArchiveListItem> {\n return this.items[Symbol.iterator]();\n }\n public nextCursor(): ICursor<this> | null {\n return this.#cursor;\n }\n}\n\nexport class ArchiveSourceLocatorPage implements IPage<ArchiveSourceLocator> {\n public readonly result: ArchiveSourceLocatorResult;\n public readonly items: ArchiveSourceLocatorResult[\"items\"];\n public readonly limit: number;\n public readonly rawNextCursor: string | null;\n readonly #cursor: ICursor<this> | null;\n\n public constructor(\n result: ArchiveSourceLocatorResult,\n cursor: ICursor<ArchiveSourceLocatorPage> | null = null,\n ) {\n this.result = result;\n this.items = result.items;\n this.limit = result.limit;\n this.rawNextCursor = result.nextCursor;\n this.#cursor = cursor as ICursor<this> | null;\n }\n\n public static readonly pageClass: PageClass<ArchiveSourceLocatorPage> =\n ArchiveSourceLocatorPage;\n public [Symbol.iterator](): Iterator<ArchiveSourceLocator> {\n return this.items[Symbol.iterator]();\n }\n public nextCursor(): ICursor<this> | null {\n return this.#cursor;\n }\n}\n\nexport function createArchiveFindPage(\n result: ArchiveFindResult,\n next: (\n cursor: string,\n options: CursorNextOptions,\n ) => Promise<ArchiveFindPage>,\n createToken: (cursor: string) => Promise<string>,\n releaseToken: (token: string) => Promise<void>,\n): ArchiveFindPage {\n return new ArchiveFindPage(\n result,\n result.nextCursor === null\n ? null\n : createPageCursor({\n pageClass: ArchiveFindPage,\n rawCursor: result.nextCursor,\n next,\n createToken,\n releaseToken,\n }),\n );\n}\n\nexport function createArchiveCollectionPage(\n result: ArchiveCollectionResult,\n next: (\n cursor: string,\n options: CursorNextOptions,\n ) => Promise<ArchiveCollectionPage>,\n createToken: (cursor: string) => Promise<string>,\n releaseToken: (token: string) => Promise<void>,\n): ArchiveCollectionPage {\n return new ArchiveCollectionPage(\n result,\n result.nextCursor === null\n ? null\n : createPageCursor({\n pageClass: ArchiveCollectionPage,\n rawCursor: result.nextCursor,\n next,\n createToken,\n releaseToken,\n }),\n );\n}\n\nexport function createArchiveEvidencePage(\n result: ArchiveEvidence,\n next: (\n cursor: string,\n options: CursorNextOptions,\n ) => Promise<ArchiveEvidencePage>,\n createToken: (cursor: string) => Promise<string>,\n releaseToken: (token: string) => Promise<void>,\n): ArchiveEvidencePage {\n return new ArchiveEvidencePage(\n result,\n result.nextCursor === null\n ? null\n : createPageCursor({\n pageClass: ArchiveEvidencePage,\n rawCursor: result.nextCursor,\n next,\n createToken,\n releaseToken,\n }),\n );\n}\n\nexport function createArchiveRelatedPage(\n result: ArchiveRelatedResult,\n next: (\n cursor: string,\n options: CursorNextOptions,\n ) => Promise<ArchiveRelatedPage>,\n createToken: (cursor: string) => Promise<string>,\n releaseToken: (token: string) => Promise<void>,\n): ArchiveRelatedPage {\n return new ArchiveRelatedPage(\n result,\n result.nextCursor === null\n ? null\n : createPageCursor({\n pageClass: ArchiveRelatedPage,\n rawCursor: result.nextCursor,\n next,\n createToken,\n releaseToken,\n }),\n );\n}\n\nexport function createArchiveSourceLocatorPage(\n result: ArchiveSourceLocatorResult,\n next: (\n cursor: string,\n options: CursorNextOptions,\n ) => Promise<ArchiveSourceLocatorPage>,\n createToken: (cursor: string) => Promise<string>,\n releaseToken: (token: string) => Promise<void>,\n): ArchiveSourceLocatorPage {\n return new ArchiveSourceLocatorPage(\n result,\n result.nextCursor === null\n ? null\n : createPageCursor({\n pageClass: ArchiveSourceLocatorPage,\n rawCursor: result.nextCursor,\n next,\n createToken,\n releaseToken,\n }),\n );\n}\n\nexport class LibraryBucketPage implements IPage<ArchiveFindHit> {\n public readonly id: string;\n public readonly items: readonly ArchiveFindHit[];\n public readonly rawNextCursor: string | null;\n public readonly query: string;\n public readonly terms: readonly string[];\n public readonly types: WikiGraphLibrarySearchBucketPage[\"types\"];\n readonly #cursor: ICursor<this> | null;\n\n public constructor(\n result: WikiGraphLibrarySearchBucketPage,\n cursor: ICursor<LibraryBucketPage> | null = null,\n ) {\n this.id = result.id;\n this.items = result.items;\n this.rawNextCursor = result.nextCursor;\n this.query = result.query;\n this.terms = result.terms;\n this.types = result.types;\n this.#cursor = cursor as ICursor<this> | null;\n }\n\n public static readonly pageClass: PageClass<LibraryBucketPage> =\n LibraryBucketPage;\n public [Symbol.iterator](): Iterator<ArchiveFindHit> {\n return this.items[Symbol.iterator]();\n }\n public nextCursor(): ICursor<this> | null {\n return this.#cursor;\n }\n}\n\nexport function createLibraryBucketPage(\n result: WikiGraphLibrarySearchBucketPage,\n next: (\n cursor: string,\n options: CursorNextOptions,\n ) => Promise<LibraryBucketPage>,\n createToken: (cursor: string) => Promise<string>,\n releaseToken: (token: string) => Promise<void>,\n): LibraryBucketPage {\n return new LibraryBucketPage(\n result,\n result.nextCursor === null\n ? null\n : createPageCursor({\n pageClass: LibraryBucketPage,\n rawCursor: result.nextCursor,\n next,\n createToken,\n releaseToken,\n }),\n );\n}\n","import { spawn } from \"child_process\";\n\nimport type { WikispineCommandRunner } from \"wiki-graph-core\";\n\n/** Node host implementation for Core's optional WikiSpine command capability. */\nexport const nodeWikispineCommandRunner: WikispineCommandRunner = {\n run: async ({ args, command, input, onStdout, signal }) =>\n await new Promise((resolve, reject) => {\n signal?.throwIfAborted();\n const child = spawn(command, [...args], {\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n const stderr: Uint8Array[] = [];\n let stdoutQueue = Promise.resolve();\n let settled = false;\n const settle = (operation: () => void): void => {\n if (settled) return;\n settled = true;\n signal?.removeEventListener(\"abort\", abort);\n operation();\n };\n const abort = (): void => {\n child.kill();\n settle(() => reject(abortError(signal)));\n };\n signal?.addEventListener(\"abort\", abort, { once: true });\n\n child.stdout.setEncoding(\"utf8\");\n child.stdout.on(\"data\", (chunk: string) => {\n if (settled) return;\n child.stdout.pause();\n stdoutQueue = stdoutQueue\n .then(async () => await onStdout(chunk))\n .then(() => {\n child.stdout.resume();\n })\n .catch((error: unknown) => {\n child.kill();\n settle(() =>\n reject(error instanceof Error ? error : new Error(String(error))),\n );\n });\n });\n child.stderr.on(\"data\", (chunk: Uint8Array) => stderr.push(chunk));\n child.on(\"error\", (error) => {\n settle(() =>\n reject(\n new Error(`Failed to start wikispine command: ${error.message}`),\n ),\n );\n });\n child.on(\"close\", (exitCode) => {\n void stdoutQueue.then(() => {\n settle(() =>\n resolve({\n exitCode,\n stderr: Buffer.concat(stderr).toString(\"utf8\"),\n }),\n );\n });\n });\n child.stdin.end(input);\n }),\n};\n\nfunction abortError(signal: AbortSignal | undefined): Error {\n return signal?.reason instanceof Error\n ? signal.reason\n : new Error(\"WikiSpine command aborted.\");\n}\n","import {\n clearLocalConfigSection,\n deleteLocalConfigValue,\n maskLocalConfigSection,\n putLocalConfigValue,\n readLocalConfigSection,\n replaceLocalConfigSection,\n type LocalConfigObject,\n type LocalConfigSection,\n} from \"./local-config.js\";\nimport type { WikiGraphJobRuntime } from \"./jobs.js\";\nimport { embedQueryText, readWikiGraphEmbeddingConfig } from \"./embedding.js\";\nimport { buildWikiGraphLLMOptions } from \"./llm.js\";\nimport {\n resolveWikispineConfig,\n type WikiGraphProvider,\n} from \"./runtime-config.js\";\nimport { nodeWikispineCommandRunner } from \"./wikispine.js\";\n\nexport interface WikiGraphProviderTestResult {\n readonly durationMs: number;\n readonly model?: string;\n readonly provider?: string;\n readonly response?: string;\n readonly dimensions?: number;\n readonly tokens?: number;\n readonly endpoint?: string;\n readonly metadata?: {\n readonly format: string;\n readonly qid_count: number;\n readonly surface_count: number;\n };\n}\n\nexport class WikiGraphConfigManager {\n readonly #runtime: WikiGraphJobRuntime;\n\n public constructor(runtime: WikiGraphJobRuntime) {\n this.#runtime = runtime;\n }\n\n public async get(\n section: LocalConfigSection,\n options: { readonly maskSecrets?: boolean } = {},\n ): Promise<LocalConfigObject> {\n const value = await this.#runtime.run(\n async () => await readLocalConfigSection(section),\n );\n return options.maskSecrets === true\n ? maskLocalConfigSection(section, value)\n : value;\n }\n\n public async replace(\n section: LocalConfigSection,\n value: LocalConfigObject,\n ): Promise<LocalConfigObject> {\n return await this.#runtime.run(\n async () => await replaceLocalConfigSection(section, value),\n );\n }\n\n public async put(\n section: LocalConfigSection,\n key: string,\n value: unknown,\n ): Promise<LocalConfigObject> {\n return await this.#runtime.run(\n async () => await putLocalConfigValue(section, key, value),\n );\n }\n\n public async delete(\n section: LocalConfigSection,\n key: string,\n ): Promise<LocalConfigObject> {\n return await this.#runtime.run(\n async () => await deleteLocalConfigValue(section, key),\n );\n }\n\n public async clear(section: LocalConfigSection): Promise<LocalConfigObject> {\n return await this.#runtime.run(\n async () => await clearLocalConfigSection(section),\n );\n }\n\n public async testLLM(): Promise<WikiGraphProviderTestResult> {\n return await this.#runtime.run(async () => {\n const startedAt = Date.now();\n const llm = await readLocalConfigSection(\"llm\");\n const config = {\n ...(typeof llm.apiKey === \"string\" ? { apiKey: llm.apiKey } : {}),\n ...(typeof llm.baseURL === \"string\" ? { baseURL: llm.baseURL } : {}),\n ...(typeof llm.model === \"string\" ? { model: llm.model } : {}),\n ...(typeof llm.name === \"string\" ? { name: llm.name } : {}),\n ...(typeof llm.provider === \"string\"\n ? { provider: parseProvider(llm.provider) }\n : {}),\n };\n const options = buildWikiGraphLLMOptions({ llm: config });\n const result = streamText({\n maxRetries: 0,\n messages: [{ content: \"Reply with exactly: ok\", role: \"user\" }],\n model: options.model!,\n temperature: 0,\n });\n const chunks: string[] = [];\n for await (const chunk of result.textStream) chunks.push(chunk);\n return {\n durationMs: Date.now() - startedAt,\n ...(config.model === undefined ? {} : { model: config.model }),\n ...(config.provider === undefined ? {} : { provider: config.provider }),\n response: chunks.join(\"\").trim(),\n };\n });\n }\n\n public async testEmbedding(): Promise<WikiGraphProviderTestResult> {\n return await this.#runtime.run(async () => {\n const startedAt = Date.now();\n const result = await embedQueryText(\n \"Wiki Graph embedding connectivity test.\",\n await readWikiGraphEmbeddingConfig(),\n );\n return {\n dimensions: result.dimensions,\n durationMs: Date.now() - startedAt,\n model: result.model,\n provider: result.provider,\n ...(result.usage?.tokens === undefined\n ? {}\n : { tokens: result.usage.tokens }),\n };\n });\n }\n\n public async testWikispine(): Promise<WikiGraphProviderTestResult> {\n return await this.#runtime.run(async () => {\n const value = await readLocalConfigSection(\"wikispine\");\n const resolved = resolveWikispineConfig(value);\n if (resolved === undefined) {\n throw new Error(\"WikiSpine provider is not configured.\");\n }\n const result = await testWikispineRuntime({\n ...resolved,\n ...(resolved.provider === \"cli\"\n ? { commandRunner: nodeWikispineCommandRunner }\n : {}),\n });\n return {\n durationMs: result.durationMs,\n ...(resolved.provider === \"fetch\"\n ? { endpoint: resolved.endpoint }\n : {}),\n ...(result.metadata === undefined ? {} : { metadata: result.metadata }),\n provider: resolved.provider,\n };\n });\n }\n}\n\nfunction parseProvider(value: string): WikiGraphProvider {\n if (\n value === \"anthropic\" ||\n value === \"google\" ||\n value === \"openai\" ||\n value === \"openai-compatible\"\n ) {\n return value;\n }\n throw new Error(\n `Invalid llm.provider: ${value}. Expected anthropic, google, openai, or openai-compatible.`,\n );\n}\nimport { streamText } from \"ai\";\nimport { testWikispineRuntime } from \"wiki-graph-core\";\n","import {\n createContinuationCursor,\n findArchiveObjects,\n findWikiGraphLibraryArchiveMembers,\n findWikiGraphLibraryObjects,\n listArchiveCollection,\n listArchiveEvidence,\n listArchiveSourceLocators,\n listRelatedArchiveObjects,\n listRelatedWikiGraphLibraryObjects,\n listWikiGraphLibraryArchiveMembers,\n listWikiGraphLibraryEvidence,\n listWikiGraphLibraryObjects,\n readContinuationCursor,\n resolveWikiGraphLibraryQueryTargetById,\n WikiGraphArchiveFile,\n WikiGraphDirectoryFile,\n type ArchiveCollectionOptions,\n type ArchiveCollectionResult,\n type ArchiveEvidence,\n type ArchiveFindOptions,\n type ArchiveFindResult,\n type ArchiveRelatedResult,\n type ArchiveSourceLocatorResult,\n type ContinuationCursor,\n type QueryIndexScope,\n type ReadonlyDocument,\n type SearchIndexEmbeddingProvider,\n type SearchIndexQueryMode,\n} from \"wiki-graph-core\";\n\nimport { type WikiGraphArchiveTarget } from \"./archive/index.js\";\nimport {\n archiveTargetFromLogicalLocator,\n rethrowArchiveSchemaError,\n resolveWikiGraphArchiveLocation,\n} from \"./archive/target.js\";\nimport type { WikiGraphJobRuntime } from \"./jobs.js\";\nimport { createConfiguredEmbeddingProvider } from \"./query-runtime.js\";\n\nexport interface WikiGraphContinuationOptions {\n /** Optional archive locator used to verify that the cursor belongs to it. */\n readonly archive?: WikiGraphArchiveTarget;\n readonly cursor: string;\n readonly format?: ContinuationCursor[\"format\"];\n readonly limit?: number;\n readonly signal?: AbortSignal;\n}\n\nexport interface WikiGraphContinuationContext {\n readonly archiveKey: string;\n readonly archivePath: string;\n readonly backlinks?: boolean;\n readonly chapters?: readonly number[];\n readonly continuationKind?: ContinuationCursor[\"kind\"];\n readonly evidenceLimit?: number;\n readonly format: ContinuationCursor[\"format\"];\n readonly ids?: readonly string[];\n readonly indexScope: QueryIndexScope;\n readonly libraryQuery?: \"archive-members\" | \"objects\";\n readonly match?: \"all\" | \"any\";\n readonly order?: \"doc-asc\" | \"doc-desc\";\n readonly query?: string;\n readonly queryMode?: SearchIndexQueryMode;\n readonly role?: \"any\" | \"object\" | \"self\" | \"subject\" | undefined;\n readonly skipUnindexed?: boolean;\n readonly sourceContext?: number;\n readonly targetUri?: string;\n readonly triplePattern?:\n | {\n readonly objectQid?: string;\n readonly predicate?: string;\n readonly subjectQid?: string;\n }\n | undefined;\n readonly types: readonly string[] | null;\n}\n\ntype ContinuationPageBase<TCursor extends ContinuationCursor> = {\n readonly cursor: TCursor;\n readonly format: TCursor[\"format\"];\n readonly limit: number;\n};\n\nexport type WikiGraphContinuationPage =\n | (ContinuationPageBase<\n Extract<ContinuationCursor, { readonly kind: \"source-locators\" }>\n > & {\n readonly kind: \"source-locators\";\n readonly result: ArchiveSourceLocatorResult;\n })\n | (ContinuationPageBase<\n Extract<ContinuationCursor, { readonly kind: \"collection\" }>\n > & {\n readonly kind: \"collection\";\n readonly result: ArchiveCollectionResult;\n })\n | (ContinuationPageBase<\n Extract<ContinuationCursor, { readonly kind: \"search\" }>\n > & {\n readonly kind: \"search\";\n readonly result: ArchiveFindResult;\n })\n | (ContinuationPageBase<\n Extract<ContinuationCursor, { readonly kind: \"evidence\" }>\n > & {\n readonly kind: \"evidence\";\n readonly result: ArchiveEvidence;\n })\n | (ContinuationPageBase<\n Extract<ContinuationCursor, { readonly kind: \"related\" }>\n > & {\n readonly kind: \"related\";\n readonly result: ArchiveRelatedResult;\n });\n\nexport class WikiGraphContinuationManager {\n readonly #runtime: WikiGraphJobRuntime;\n\n public constructor(runtime: WikiGraphJobRuntime) {\n this.#runtime = runtime;\n }\n\n public async next(\n options: WikiGraphContinuationOptions,\n ): Promise<WikiGraphContinuationPage> {\n return await this.#runtime.run(\n async () => await this.#next(options),\n options.signal,\n );\n }\n\n public async create(\n context: WikiGraphContinuationContext,\n cursor: string | null | undefined,\n ): Promise<string | null> {\n if (cursor === null || cursor === undefined) return null;\n return await this.#runtime.run(\n async () =>\n await createContinuationCursor(\n createContinuationPayload(context, cursor),\n ),\n );\n }\n\n async #next(\n options: WikiGraphContinuationOptions,\n ): Promise<WikiGraphContinuationPage> {\n const cursor = await readContinuationCursor(options.cursor);\n const continuationCursor =\n options.format === undefined\n ? cursor\n : ({ ...cursor, format: options.format } as ContinuationCursor);\n const limit = options.limit ?? 20;\n if (options.archive !== undefined) {\n const explicit = await resolveWikiGraphArchiveLocation(options.archive);\n const cursorArchivePath = getCursorArchivePath(cursor);\n if (explicit.archivePath !== cursorArchivePath) {\n throw new Error(\n `Continuation cursor ${options.cursor} belongs to ${cursorArchivePath}, not ${explicit.archivePath}.`,\n );\n }\n }\n\n const result =\n cursor.indexScope.kind === \"library-index\"\n ? await continueLibraryCursor(cursor, limit)\n : await continueArchiveCursor(cursor, limit);\n const durableResult = await persistResultCursor(continuationCursor, result);\n return {\n cursor: continuationCursor,\n format: continuationCursor.format,\n kind: cursor.kind,\n limit,\n result: durableResult,\n } as WikiGraphContinuationPage;\n }\n}\n\nasync function continueArchiveCursor(\n cursor: ContinuationCursor,\n limit: number,\n): Promise<\n | ArchiveCollectionResult\n | ArchiveEvidence\n | ArchiveFindResult\n | ArchiveRelatedResult\n | ArchiveSourceLocatorResult\n> {\n const embeddingProvider =\n cursor.kind === \"evidence\" || cursor.kind === \"related\"\n ? await resolveCursorEmbeddingProvider(cursor)\n : undefined;\n const location = await resolveWikiGraphArchiveLocation(\n archiveTargetFromLogicalLocator(getCursorArchivePath(cursor)),\n );\n const read = async (document: ReadonlyDocument) => {\n switch (cursor.kind) {\n case \"source-locators\":\n return await listArchiveSourceLocators(document, cursor.targetUri, {\n cursor: cursor.cursor,\n limit,\n });\n case \"collection\":\n return await listArchiveCollection(\n document,\n createCollectionOptions(cursor, limit),\n );\n case \"search\":\n return await findArchiveObjects(\n document,\n cursor.query ?? \"\",\n await createFindOptions(cursor, limit),\n );\n case \"evidence\":\n return await listArchiveEvidence(document, cursor.targetUri, {\n ...(cursor.chapters === null ? {} : { chapters: cursor.chapters }),\n cursor: cursor.cursor,\n limit,\n order: cursor.order,\n ...(cursor.query === undefined ? {} : { query: cursor.query }),\n ...(cursor.queryMode === undefined\n ? {}\n : { queryMode: cursor.queryMode }),\n ...(embeddingProvider === undefined ? {} : { embeddingProvider }),\n ...(cursor.skipUnindexed === undefined\n ? {}\n : { skipUnindexed: cursor.skipUnindexed }),\n ...(cursor.sourceContext === undefined\n ? {}\n : { sourceContext: cursor.sourceContext }),\n });\n case \"related\":\n return await listRelatedArchiveObjects(document, cursor.targetUri, {\n ...(cursor.chapters === null ? {} : { chapters: cursor.chapters }),\n cursor: cursor.cursor,\n ...(cursor.evidenceLimit === undefined\n ? {}\n : { evidenceLimit: cursor.evidenceLimit }),\n limit,\n order: cursor.order,\n ...(cursor.query === undefined ? {} : { query: cursor.query }),\n ...(cursor.queryMode === undefined\n ? {}\n : { queryMode: cursor.queryMode }),\n ...(embeddingProvider === undefined ? {} : { embeddingProvider }),\n ...(cursor.role === undefined ? {} : { role: cursor.role }),\n ...(cursor.skipUnindexed === undefined\n ? {}\n : { skipUnindexed: cursor.skipUnindexed }),\n ...(cursor.sourceContext === undefined\n ? {}\n : { sourceContext: cursor.sourceContext }),\n });\n }\n };\n return await (\n location.archiveFile.kind === \"directory\"\n ? new WikiGraphDirectoryFile(location.archiveFile).readDocument(read)\n : new WikiGraphArchiveFile(location.archiveFile).readDocument(read)\n ).catch((error: unknown) =>\n rethrowArchiveSchemaError(error, location.target),\n );\n}\n\nasync function continueLibraryCursor(\n cursor: ContinuationCursor,\n limit: number,\n): Promise<\n | ArchiveCollectionResult\n | ArchiveEvidence\n | ArchiveFindResult\n | ArchiveRelatedResult\n> {\n const embeddingProvider =\n cursor.kind === \"evidence\" || cursor.kind === \"related\"\n ? await resolveCursorEmbeddingProvider(cursor)\n : undefined;\n if (cursor.kind === \"source-locators\") {\n throw new Error(\n \"Source locator cursors do not use the aggregate library index.\",\n );\n }\n if (cursor.indexScope.kind !== \"library-index\") {\n throw new Error(\"Internal error: expected a library index cursor.\");\n }\n const target = await resolveWikiGraphLibraryQueryTargetById(\n cursor.indexScope.libraryId,\n );\n switch (cursor.kind) {\n case \"collection\":\n return await (requireLibraryQuery(cursor) === \"archive-members\"\n ? listWikiGraphLibraryArchiveMembers(\n target,\n createCollectionOptions(cursor, limit),\n )\n : listWikiGraphLibraryObjects(\n target,\n createCollectionOptions(cursor, limit),\n ));\n case \"search\":\n return await (requireLibraryQuery(cursor) === \"archive-members\"\n ? findWikiGraphLibraryArchiveMembers(\n target,\n cursor.query ?? \"\",\n await createFindOptions(cursor, limit),\n )\n : findWikiGraphLibraryObjects(\n target,\n cursor.query ?? \"\",\n await createFindOptions(cursor, limit),\n ));\n case \"evidence\":\n return await listWikiGraphLibraryEvidence(target, cursor.targetUri, {\n cursor: cursor.cursor,\n limit,\n order: cursor.order,\n ...(cursor.query === undefined ? {} : { query: cursor.query }),\n ...(cursor.queryMode === undefined\n ? {}\n : { queryMode: cursor.queryMode }),\n ...(embeddingProvider === undefined ? {} : { embeddingProvider }),\n ...(cursor.skipUnindexed === undefined\n ? {}\n : { skipUnindexed: cursor.skipUnindexed }),\n ...(cursor.sourceContext === undefined\n ? {}\n : { sourceContext: cursor.sourceContext }),\n });\n case \"related\":\n return await listRelatedWikiGraphLibraryObjects(\n target,\n cursor.targetUri,\n {\n cursor: cursor.cursor,\n ...(cursor.evidenceLimit === undefined\n ? {}\n : { evidenceLimit: cursor.evidenceLimit }),\n limit,\n order: cursor.order,\n ...(cursor.query === undefined ? {} : { query: cursor.query }),\n ...(cursor.queryMode === undefined\n ? {}\n : { queryMode: cursor.queryMode }),\n ...(embeddingProvider === undefined ? {} : { embeddingProvider }),\n ...(cursor.role === undefined ? {} : { role: cursor.role }),\n ...(cursor.skipUnindexed === undefined\n ? {}\n : { skipUnindexed: cursor.skipUnindexed }),\n ...(cursor.sourceContext === undefined\n ? {}\n : { sourceContext: cursor.sourceContext }),\n },\n );\n }\n}\n\nfunction createCollectionOptions(\n cursor: Extract<ContinuationCursor, { readonly kind: \"collection\" }>,\n limit: number,\n): ArchiveCollectionOptions {\n return {\n ...(cursor.backlinks === undefined ? {} : { backlinks: cursor.backlinks }),\n ...(cursor.chapters === null ? {} : { chapters: cursor.chapters }),\n cursor: cursor.cursor,\n ...(cursor.evidenceLimit === undefined\n ? {}\n : { evidenceLimit: cursor.evidenceLimit }),\n ...(cursor.ids === null ? {} : { ids: cursor.ids }),\n limit,\n order: cursor.order,\n ...(cursor.sourceContext === undefined\n ? {}\n : { sourceContext: cursor.sourceContext }),\n ...(cursor.triplePattern === undefined\n ? {}\n : { triplePattern: cursor.triplePattern }),\n ...(cursor.types === null\n ? {}\n : {\n types: cursor.types as NonNullable<ArchiveCollectionOptions[\"types\"]>,\n }),\n };\n}\n\nasync function createFindOptions(\n cursor: Extract<ContinuationCursor, { readonly kind: \"search\" }>,\n limit: number,\n): Promise<ArchiveFindOptions> {\n const embeddingProvider = await resolveCursorEmbeddingProvider(cursor);\n return {\n archiveKey: cursor.archiveKey,\n ...(cursor.backlinks === undefined ? {} : { backlinks: cursor.backlinks }),\n ...(cursor.chapters == null ? {} : { chapters: cursor.chapters }),\n cursor: cursor.cursor,\n ...(cursor.evidenceLimit === undefined\n ? {}\n : { evidenceLimit: cursor.evidenceLimit }),\n limit,\n ...(cursor.match === undefined ? {} : { match: cursor.match }),\n ...(cursor.order === undefined ? {} : { order: cursor.order }),\n ...(cursor.queryMode === undefined ? {} : { queryMode: cursor.queryMode }),\n ...(cursor.skipUnindexed === undefined\n ? {}\n : { skipUnindexed: cursor.skipUnindexed }),\n ...(cursor.sourceContext === undefined\n ? {}\n : { sourceContext: cursor.sourceContext }),\n ...(cursor.triplePattern === undefined\n ? {}\n : { triplePattern: cursor.triplePattern }),\n ...(cursor.types === null\n ? {}\n : { types: cursor.types as NonNullable<ArchiveFindOptions[\"types\"]> }),\n ...(embeddingProvider === undefined ? {} : { embeddingProvider }),\n };\n}\n\nfunction requireLibraryQuery(\n cursor: ContinuationCursor,\n): \"archive-members\" | \"objects\" {\n if (\n (cursor.kind === \"collection\" || cursor.kind === \"search\") &&\n cursor.libraryQuery !== undefined\n ) {\n return cursor.libraryQuery;\n }\n throw new Error(\n \"Library continuation cursor is missing its typed query variant.\",\n );\n}\n\nfunction getCursorArchivePath(cursor: ContinuationCursor): string {\n return cursor.indexScope.kind === \"archive-index\"\n ? cursor.indexScope.archivePath\n : cursor.archivePath;\n}\n\nasync function persistResultCursor<\n T extends { readonly nextCursor: string | null },\n>(cursor: ContinuationCursor, result: T): Promise<T> {\n if (result.nextCursor === null) return result;\n const nextCursor = await createContinuationCursor({\n ...cursor,\n cursor: result.nextCursor,\n });\n return { ...result, nextCursor };\n}\n\nfunction createContinuationPayload(\n context: WikiGraphContinuationContext,\n cursor: string,\n): ContinuationCursor {\n switch (context.continuationKind ?? \"search\") {\n case \"source-locators\":\n return {\n archiveKey: context.archiveKey,\n archivePath: context.archivePath,\n cursor,\n format: context.format,\n indexScope: context.indexScope,\n kind: \"source-locators\",\n targetUri: requireTargetUri(context, \"Source locator\"),\n };\n case \"evidence\":\n return {\n archiveKey: context.archiveKey,\n archivePath: context.archivePath,\n chapters: context.chapters ?? null,\n cursor,\n format: context.format,\n indexScope: context.indexScope,\n kind: \"evidence\",\n order: context.order ?? \"doc-asc\",\n ...(context.query === undefined ? {} : { query: context.query }),\n ...(context.queryMode === undefined\n ? {}\n : { queryMode: context.queryMode }),\n ...(context.skipUnindexed === undefined\n ? {}\n : { skipUnindexed: context.skipUnindexed }),\n ...(context.sourceContext === undefined\n ? {}\n : { sourceContext: context.sourceContext }),\n targetUri: requireTargetUri(context, \"Evidence\"),\n };\n case \"related\":\n return {\n archiveKey: context.archiveKey,\n archivePath: context.archivePath,\n chapters: context.chapters ?? null,\n cursor,\n ...(context.evidenceLimit === undefined\n ? {}\n : { evidenceLimit: context.evidenceLimit }),\n format: context.format,\n indexScope: context.indexScope,\n kind: \"related\",\n order: context.order ?? \"doc-asc\",\n ...(context.query === undefined ? {} : { query: context.query }),\n ...(context.queryMode === undefined\n ? {}\n : { queryMode: context.queryMode }),\n ...(context.role === undefined ? {} : { role: context.role }),\n ...(context.skipUnindexed === undefined\n ? {}\n : { skipUnindexed: context.skipUnindexed }),\n ...(context.sourceContext === undefined\n ? {}\n : { sourceContext: context.sourceContext }),\n targetUri: requireTargetUri(context, \"Related\"),\n };\n case \"collection\":\n return {\n archiveKey: context.archiveKey,\n archivePath: context.archivePath,\n ...(context.backlinks === undefined\n ? {}\n : { backlinks: context.backlinks }),\n chapters: context.chapters ?? null,\n cursor,\n ...(context.evidenceLimit === undefined\n ? {}\n : { evidenceLimit: context.evidenceLimit }),\n format: context.format,\n ids: context.ids ?? null,\n indexScope: context.indexScope,\n kind: \"collection\",\n ...createLibraryQueryPayload(context),\n order: context.order ?? \"doc-asc\",\n ...(context.sourceContext === undefined\n ? {}\n : { sourceContext: context.sourceContext }),\n ...(context.triplePattern === undefined\n ? {}\n : { triplePattern: context.triplePattern }),\n types: context.types,\n };\n case \"search\":\n return {\n archiveKey: context.archiveKey,\n archivePath: context.archivePath,\n ...(context.backlinks === undefined\n ? {}\n : { backlinks: context.backlinks }),\n ...(context.chapters === undefined\n ? {}\n : { chapters: context.chapters }),\n cursor,\n ...(context.evidenceLimit === undefined\n ? {}\n : { evidenceLimit: context.evidenceLimit }),\n format: context.format,\n indexScope: context.indexScope,\n kind: \"search\",\n ...createLibraryQueryPayload(context),\n ...(context.match === undefined ? {} : { match: context.match }),\n ...(context.order === undefined ? {} : { order: context.order }),\n ...(context.query === undefined ? {} : { query: context.query }),\n ...(context.queryMode === undefined\n ? {}\n : { queryMode: context.queryMode }),\n ...(context.skipUnindexed === undefined\n ? {}\n : { skipUnindexed: context.skipUnindexed }),\n ...(context.sourceContext === undefined\n ? {}\n : { sourceContext: context.sourceContext }),\n ...(context.triplePattern === undefined\n ? {}\n : { triplePattern: context.triplePattern }),\n types: context.types,\n };\n }\n}\n\nasync function resolveCursorEmbeddingProvider(\n cursor: Pick<ContinuationCursor, \"kind\" | \"queryMode\"> & {\n readonly query?: string;\n },\n): Promise<SearchIndexEmbeddingProvider | undefined> {\n if (cursor.kind !== \"search\" && cursor.query === undefined) return undefined;\n if (cursor.queryMode === \"fts\") return undefined;\n const provider = await createConfiguredEmbeddingProvider();\n if (cursor.queryMode === \"embedding\" && provider === undefined) {\n throw new Error(\n \"Embedding query mode requires embeddings configuration at `wikg://local/config/embeddings`.\",\n );\n }\n return provider;\n}\n\nfunction requireTargetUri(\n context: WikiGraphContinuationContext,\n label: string,\n): string {\n if (context.targetUri !== undefined) return context.targetUri;\n throw new Error(`${label} continuation cursors require a target URI.`);\n}\n\nfunction createLibraryQueryPayload(context: WikiGraphContinuationContext): {\n readonly libraryQuery?: \"archive-members\" | \"objects\";\n} {\n if (context.indexScope.kind !== \"library-index\") return {};\n if (context.libraryQuery !== undefined) {\n return { libraryQuery: context.libraryQuery };\n }\n throw new Error(\n \"Library collection and search continuations require an explicit query variant.\",\n );\n}\n","import {\n getBuildJob,\n getChapterDetails,\n openWikimediaResolver,\n recordBuildJobInputRevision,\n WikiGraphArchiveFile,\n WikiGraphScope,\n withLoggingContext,\n type BuildJob,\n type BuildJobExecutionContext,\n type BuildJobProgressReporter,\n type Directory,\n type GuaranteedRequest,\n type GuaranteedRequestController,\n type LLMessage,\n} from \"wiki-graph-core\";\nimport {\n applyChapterJobArtifactFile,\n createLocalChapterJobFileExecutor,\n writeChapterJobInputFile,\n type ChapterJobFileExecutor,\n type ChapterJobInputOptions,\n type ChapterJobKind,\n} from \"wiki-graph-core/worker\";\n\nimport { buildSearchIndexEmbeddingProvider } from \"./embedding.js\";\nimport {\n loadWikiGraphRuntimeConfig,\n type WikiGraphRuntimeConfig,\n} from \"./runtime-config.js\";\nimport {\n createStageLLM,\n loadRequiredStageConfig,\n resolveExtractionPrompt,\n resolveKnowledgeGraphRecallPrompt,\n} from \"./stage.js\";\nimport { DEFAULT_GENERATION_JOB_CONCURRENCY } from \"./planning.js\";\nimport { nodeWikispineCommandRunner } from \"./wikispine.js\";\nimport { runBuildJobWorker } from \"./worker.js\";\nimport { getWikiGraphSDKProviders } from \"./runtime-context.js\";\nimport {\n resolveWikiGraphArchiveTarget,\n resolveWikiGraphArchiveLocation,\n} from \"./archive/target.js\";\nimport { writeWikiGraphArchiveLocation } from \"./archive/write.js\";\n\nexport interface WikiGraphQueueWorkerOptions {\n readonly idleTimeoutMs?: number;\n readonly signal?: AbortSignal;\n}\n\nexport async function runWikiGraphQueueWorker(\n options: WikiGraphQueueWorkerOptions = {},\n): Promise<void> {\n const providers = getWikiGraphSDKProviders();\n const config = await loadWikiGraphRuntimeConfig({\n ...(providers.embedding === undefined ? {} : { skipEmbeddingConfig: true }),\n ...(providers.llm === undefined ? {} : { skipLLMConfig: true }),\n });\n await runBuildJobWorker({\n concurrency: config.concurrent?.job ?? DEFAULT_GENERATION_JOB_CONCURRENCY,\n executeJob: async (job, reporter, context) => {\n await withLoggingContext(\n { logDirectory: job.log, operation: \"build-job\" },\n async () => await executeBuildJob(job, reporter, context),\n );\n },\n ...(options.idleTimeoutMs === undefined\n ? {}\n : { idleTimeoutMs: options.idleTimeoutMs }),\n ...(options.signal === undefined ? {} : { signal: options.signal }),\n });\n}\n\nasync function executeBuildJob(\n job: BuildJob,\n reporter: BuildJobProgressReporter,\n context: BuildJobExecutionContext,\n): Promise<void> {\n const providers = getWikiGraphSDKProviders();\n const config = await loadWikiGraphRuntimeConfig({\n ...(job.llmJSON === undefined ? {} : { llmJSON: job.llmJSON }),\n ...(providers.embedding === undefined ? {} : { skipEmbeddingConfig: true }),\n ...(job.llmJSON === undefined && providers.llm !== undefined\n ? { skipLLMConfig: true }\n : {}),\n });\n const execution = await openJobExecutor(\n job,\n config,\n context.signal,\n reporter,\n );\n try {\n if (job.target === \"reading-summary\") {\n let stage = await readChapterStage(job);\n if (stage === \"sourced\") {\n await executeStep(job, \"reading-graph\", execution, reporter, context, {\n ...(execution.extractionPrompt === undefined\n ? {}\n : { prompt: execution.extractionPrompt }),\n });\n stage = await readChapterStage(job);\n }\n if (stage === \"summarized\") return;\n if (stage !== \"graphed\") {\n throw new Error(\n `Chapter ${job.chapterId} is ${stage}. Cannot generate summary.`,\n );\n }\n await executeStep(job, \"reading-summary\", execution, reporter, context, {\n ...(job.prompt === undefined ? {} : { prompt: job.prompt }),\n });\n return;\n }\n\n if (job.target === \"reading-graph\") {\n const stage = await readChapterStage(job);\n if (stage === \"graphed\" || stage === \"summarized\") return;\n if (stage !== \"sourced\") {\n throw new Error(\n `Chapter ${job.chapterId} is ${stage}. Cannot generate Reading Graph.`,\n );\n }\n }\n if (job.target === \"knowledge-graph\") {\n const stage = await readChapterStage(job);\n if (stage === \"planned\") {\n throw new Error(\n `Chapter ${job.chapterId} is planned. Set source before generating Knowledge Graph.`,\n );\n }\n }\n\n await executeStep(job, job.target, execution, reporter, context, {\n ...(job.target === \"reading-graph\"\n ? { prompt: execution.extractionPrompt }\n : {}),\n ...(job.target === \"knowledge-graph\"\n ? { prompt: execution.knowledgeGraphPrompt }\n : {}),\n });\n } finally {\n await execution.close();\n }\n}\n\nasync function executeStep(\n job: BuildJob,\n kind: ChapterJobKind,\n execution: OpenedExecutor,\n reporter: BuildJobProgressReporter,\n context: BuildJobExecutionContext,\n inputOptions: ChapterJobInputOptions,\n): Promise<void> {\n await reporter.throwIfStopped();\n await reporter.stepStarted(kind);\n if (kind === \"reading-graph\" || kind === \"knowledge-graph\") {\n await assertCurrentFtsArtifact(job);\n }\n\n const stepWorkspace = await resetStepWorkspace(job.workspace, kind);\n const inputFile = await stepWorkspace.createFile(\"input.jsonl\");\n const outputWorkspace = await stepWorkspace.createDirectory(\"output\");\n const revision = await new WikiGraphArchiveFile(job.archive).readDocument(\n async (document) => {\n await getChapterDetails(document, job.chapterId);\n return await writeChapterJobInputFile(\n document,\n job.chapterId,\n kind,\n inputFile,\n inputOptions,\n );\n },\n );\n await recordBuildJobInputRevision({\n currentRevision: revision,\n jobId: job.jobId,\n ownerId: requireRunningJobOwnerId(job),\n });\n await reporter.updatePhase({\n done: 0,\n phase: kind.startsWith(\"index-\") ? \"indexing\" : \"grounding\",\n total: 1,\n unit: \"item\",\n });\n\n const result = await execution.executor({\n inputFile,\n kind,\n progress: reporter,\n revision,\n signal: context.signal,\n workspace: outputWorkspace,\n });\n if (result.revision !== revision) {\n throw new Error(\n `Chapter job returned revision ${result.revision}; expected ${revision}.`,\n );\n }\n await reporter.updatePhase({\n done: 0,\n phase: \"committing\",\n total: 1,\n unit: \"item\",\n });\n const target = await resolveWikiGraphArchiveTarget(job.archive);\n const resolvedLocation = await resolveWikiGraphArchiveLocation(target);\n const location =\n target.kind === \"standalone\"\n ? { ...resolvedLocation, archiveFile: job.archive }\n : resolvedLocation;\n await writeWikiGraphArchiveLocation(\n location,\n async (document) => {\n assertJobStillRunning(await getBuildJob(job.jobId));\n await applyChapterJobArtifactFile(\n document,\n job.chapterId,\n kind,\n revision,\n result.artifactFile,\n );\n },\n { invalidateContinuationCursors: true },\n );\n await reporter.updatePhase({\n done: 1,\n phase: \"committing\",\n total: 1,\n unit: \"item\",\n });\n await reporter.stepCompleted(kind);\n assertJobStillRunning(await getBuildJob(job.jobId));\n}\n\ninterface OpenedExecutor {\n readonly close: () => Promise<void>;\n readonly executor: ChapterJobFileExecutor;\n readonly extractionPrompt?: string;\n readonly knowledgeGraphPrompt?: string;\n}\n\nasync function openJobExecutor(\n job: BuildJob,\n config: WikiGraphRuntimeConfig,\n signal: AbortSignal,\n reporter: BuildJobProgressReporter,\n): Promise<OpenedExecutor> {\n const generation = !job.target.startsWith(\"index-\");\n const stageConfig = generation\n ? await loadRequiredStageConfig({\n ...(job.llmJSON === undefined ? {} : { llmJSON: job.llmJSON }),\n })\n : undefined;\n const injectedLLM =\n job.llmJSON === undefined ? getWikiGraphSDKProviders().llm : undefined;\n const llm =\n stageConfig === undefined\n ? undefined\n : createStageLLM(stageConfig, {\n cacheDirectory: job.cache,\n logDirectory: job.log,\n onTokenUsage: async (usage) => {\n await reporter.addTokenUsage(usage);\n },\n onStreamProgress: async ({ outputCharacters }) => {\n await reporter.addOutputCharacters(outputCharacters);\n },\n ...(injectedLLM === undefined ? {} : { provider: injectedLLM }),\n });\n const promptSource = job.prompt ?? stageConfig?.prompt;\n const wikispine =\n job.target === \"knowledge-graph\"\n ? requireKnowledgeGraphWikispineConfig(config)\n : undefined;\n const request: GuaranteedRequestController | undefined =\n llm === undefined\n ? undefined\n : async (\n messages: readonly LLMessage[],\n index: number,\n maxRetries: number,\n ) =>\n await llm.request(messages, {\n retryIndex: index,\n retryMax: maxRetries,\n scope: WikiGraphScope.ReaderExtraction,\n signal,\n });\n if (request !== undefined && llm !== undefined) {\n request.lazy = async <T>(\n operation: (request: GuaranteedRequest) => Promise<T>,\n ): Promise<T> => await llm.request(async () => await operation(request));\n }\n const wikimediaResolver =\n job.target !== \"knowledge-graph\"\n ? undefined\n : await openWikimediaResolver(\n config.wikimedia === undefined\n ? {\n kind: \"local\",\n llmRequest: requireValue(\n request,\n \"Local Wikimedia resolution requires an LLM.\",\n ),\n llmModelId: requireValue(\n stageConfig?.llm?.model ?? injectedLLM?.model,\n \"Local Wikimedia resolution requires an LLM model.\",\n ),\n }\n : {\n endpoint: config.wikimedia.endpoint,\n kind: \"remote\",\n token: config.wikimedia.token,\n },\n );\n const embeddingProvider =\n job.target === \"index-embedding-source\" ||\n job.target === \"index-embedding-summary\"\n ? (getWikiGraphSDKProviders().embedding ??\n buildSearchIndexEmbeddingProvider(requireEmbeddingConfig(config)))\n : undefined;\n\n return {\n async close() {\n await wikimediaResolver?.close();\n },\n executor: createLocalChapterJobFileExecutor({\n ...(embeddingProvider === undefined ? {} : { embeddingProvider }),\n ...(llm === undefined ? {} : { llm }),\n ...(wikimediaResolver === undefined ? {} : { wikimediaResolver }),\n ...(wikispine === undefined\n ? {}\n : {\n wikispine: {\n ...wikispine,\n ...(wikispine.provider === \"cli\"\n ? { commandRunner: nodeWikispineCommandRunner }\n : {}),\n },\n }),\n }),\n ...(promptSource === undefined\n ? {}\n : { extractionPrompt: resolveExtractionPrompt(promptSource) }),\n ...(promptSource === undefined\n ? {}\n : {\n knowledgeGraphPrompt: resolveKnowledgeGraphRecallPrompt(promptSource),\n }),\n };\n}\n\nasync function resetStepWorkspace(\n workspace: Directory,\n kind: ChapterJobKind,\n): Promise<Directory> {\n const name = `chapter-job-${kind}`;\n if ((await workspace.getDirectory(name)) !== undefined) {\n await workspace.remove(name, { recursive: true });\n }\n return await workspace.createDirectory(name);\n}\n\nasync function readChapterStage(job: BuildJob) {\n return await new WikiGraphArchiveFile(job.archive).readDocument(\n async (document) =>\n (await getChapterDetails(document, job.chapterId)).stage,\n );\n}\n\nasync function assertCurrentFtsArtifact(job: BuildJob): Promise<void> {\n await new WikiGraphArchiveFile(job.archive).readDocument(async (document) => {\n const revision = await document.serials.getRevision(job.chapterId);\n const artifact = await document.indexArtifacts.get(job.chapterId, \"fts\");\n if (artifact?.sourceRevision !== revision) {\n throw new Error(\n `Chapter ${job.chapterId} needs a current FTS index artifact before running ${job.target}.`,\n );\n }\n });\n}\n\nfunction requireEmbeddingConfig(config: WikiGraphRuntimeConfig) {\n if (config.embedding !== undefined) return config.embedding;\n throw new Error(\n \"Missing embeddings configuration. Configure `wikg://local/config/embeddings` before building embedding index artifacts.\",\n );\n}\n\nexport function requireKnowledgeGraphWikispineConfig(\n config: WikiGraphRuntimeConfig,\n): NonNullable<WikiGraphRuntimeConfig[\"wikispine\"]> {\n if (config.wikispine?.provider !== undefined) return config.wikispine;\n throw new Error(\n \"Knowledge Graph requires WikiSpine. Configure `wikg://local/config/wikispine` with provider `cli` or `fetch` and test the provider before running the worker.\",\n );\n}\n\nfunction requireRunningJobOwnerId(job: BuildJob): string {\n if (job.ownerId === undefined) {\n throw new Error(`Build job ${job.jobId} has no running owner.`);\n }\n return job.ownerId;\n}\n\nfunction assertJobStillRunning(job: BuildJob): void {\n if (job.state !== \"running\") {\n throw new Error(`Job ${job.jobId} is ${job.state}. Stop before flushing.`);\n }\n}\n\nfunction requireValue<T>(value: T | undefined, message: string): T {\n if (value === undefined) throw new Error(message);\n return value;\n}\n","export {\n DEFAULT_EXTRACTION_PROMPT,\n DEFAULT_KNOWLEDGE_GRAPH_RECALL_PROMPT,\n resolveExtractionPrompt,\n resolveKnowledgeGraphRecallPrompt,\n} from \"wiki-graph-core\";\nimport type { WikiGraphScope } from \"wiki-graph-core\";\nimport { createDefaultWikiGraphSampling } from \"wiki-graph-core\";\nimport { LLM } from \"wiki-graph-core\";\nimport type {\n Directory,\n LLMStreamProgressCallback,\n LLMTokenUsageCallback,\n} from \"wiki-graph-core\";\nimport type { WikiGraphLLMProvider } from \"./providers.js\";\nimport { getWikiGraphSDKProviders } from \"./runtime-context.js\";\n\nimport {\n loadWikiGraphRuntimeConfig,\n type WikiGraphRuntimeConfig,\n} from \"./runtime-config.js\";\nimport { buildWikiGraphLLMOptions } from \"./llm.js\";\n\nexport function createStageLLM(\n config: WikiGraphRuntimeConfig,\n options?: {\n readonly cacheDirectory?: Directory;\n readonly logDirectory?: Directory;\n readonly onStreamProgress?: LLMStreamProgressCallback;\n readonly onTokenUsage?: LLMTokenUsageCallback;\n readonly provider?: WikiGraphLLMProvider;\n },\n): LLM<WikiGraphScope> {\n const llmOptions =\n options?.provider === undefined\n ? buildWikiGraphLLMOptions(config)\n : {\n ...(config.concurrent?.request === undefined\n ? {}\n : { concurrent: config.concurrent.request }),\n streamProvider: options.provider,\n };\n\n return new LLM<WikiGraphScope>({\n sampling: createDefaultWikiGraphSampling({\n ...(llmOptions.temperature === undefined\n ? {}\n : { temperature: llmOptions.temperature }),\n ...(llmOptions.topP === undefined ? {} : { topP: llmOptions.topP }),\n }),\n ...llmOptions,\n ...(options?.cacheDirectory === undefined\n ? {}\n : { cacheDirectory: options.cacheDirectory }),\n ...(options?.logDirectory === undefined\n ? {}\n : { logDirectory: options.logDirectory }),\n ...(options?.onStreamProgress === undefined\n ? {}\n : { onStreamProgress: options.onStreamProgress }),\n ...(options?.onTokenUsage === undefined\n ? {}\n : { onTokenUsage: options.onTokenUsage }),\n });\n}\n\nexport async function loadRequiredStageConfig(options: {\n readonly llmJSON?: string;\n}): Promise<WikiGraphRuntimeConfig> {\n const injected =\n options.llmJSON === undefined ? getWikiGraphSDKProviders().llm : undefined;\n const config = await loadWikiGraphRuntimeConfig({\n ...(options.llmJSON === undefined ? {} : { llmJSON: options.llmJSON }),\n ...(options.llmJSON === undefined && injected !== undefined\n ? { skipLLMConfig: true }\n : {}),\n ...(getWikiGraphSDKProviders().embedding === undefined\n ? {}\n : { skipEmbeddingConfig: true }),\n });\n\n if (\n injected === undefined &&\n (config.llm?.provider === undefined || config.llm.model === undefined)\n ) {\n throw new Error(\n \"Missing LLM configuration. Set --llm for one run, or configure `wikg://local/config/llm` with provider and model.\",\n );\n }\n\n return config;\n}\n","import type { BuildJobTarget } from \"wiki-graph-core\";\n\n/** Cost estimate returned before a durable build job is accepted. */\n\nexport interface GenerationConcurrency {\n readonly job: number;\n readonly request: number;\n}\n\nexport const DEFAULT_GENERATION_JOB_CONCURRENCY = 3;\nexport const DEFAULT_GENERATION_REQUEST_CONCURRENCY = 6;\n\nexport interface GenerationPlanningCost {\n readonly model: string;\n readonly timeSeconds: {\n readonly max: number;\n readonly min: number;\n };\n readonly tokens: {\n readonly cacheableInput: number;\n readonly input: number;\n readonly output: number;\n };\n}\n\nexport interface GenerationPerformanceHint {\n readonly configKey: \"job\" | \"request\";\n readonly configValue: number;\n readonly current: number;\n readonly kind: \"job\" | \"request\";\n readonly message: string;\n readonly recommended: number;\n}\n\nexport function planGenerationTask(\n task: BuildJobTarget,\n words: number,\n chapters: number,\n concurrent: GenerationConcurrency,\n model: string,\n): GenerationPlanningCost {\n const profile = getGenerationPlanningProfile(task);\n const calls = Math.max(chapters, Math.ceil(words / profile.wordsPerCall));\n const effectiveConcurrency = Math.max(\n 1,\n task === \"reading-graph\" ? 1 : concurrent.request,\n );\n const callBatches = Math.ceil(calls / effectiveConcurrency);\n const wordSeconds = words * profile.secondsPerWord;\n\n return {\n model,\n timeSeconds: {\n max: Math.ceil(callBatches * profile.maxSecondsPerCall + wordSeconds),\n min: Math.ceil(callBatches * profile.minSecondsPerCall + wordSeconds),\n },\n tokens: {\n cacheableInput: Math.ceil(words * profile.cacheableInputTokenPerWord),\n input: Math.ceil(words * profile.inputTokenPerWord),\n output: Math.ceil(words * profile.outputTokenPerWord),\n },\n };\n}\n\nexport function createGenerationPerformanceHints(input: {\n readonly chapters: number;\n readonly concurrent: GenerationConcurrency;\n readonly hasJobWork: boolean;\n readonly hasRequestWork: boolean;\n}): readonly GenerationPerformanceHint[] {\n if (!input.hasJobWork) {\n return [];\n }\n\n const hints: GenerationPerformanceHint[] = [];\n\n const recommendedRequest =\n input.concurrent.request < 4\n ? DEFAULT_GENERATION_REQUEST_CONCURRENCY\n : input.concurrent.request < 8\n ? 8\n : undefined;\n\n if (input.hasRequestWork && recommendedRequest !== undefined) {\n hints.push({\n configKey: \"request\",\n configValue: recommendedRequest,\n current: input.concurrent.request,\n kind: \"request\",\n message:\n \"LLM request concurrency can often be higher. Use at least 4; 6-8 is usually faster when the provider allows it.\",\n recommended: recommendedRequest,\n });\n }\n\n if (input.concurrent.job < 4 && input.chapters > 1) {\n hints.push({\n configKey: \"job\",\n configValue: 4,\n current: input.concurrent.job,\n kind: \"job\",\n message:\n \"Multiple chapters need work and job concurrency is below 4. Raising it lets chapter jobs run in parallel.\",\n recommended: 4,\n });\n }\n\n return hints;\n}\n\nexport function formatGenerationPlanningModel(\n llm: { readonly model?: string; readonly provider?: string } | undefined,\n): string {\n if (llm?.model === undefined) {\n return \"not configured\";\n }\n\n return llm.provider === undefined\n ? llm.model\n : `${llm.provider}/${llm.model}`;\n}\n\nexport function formatGenerationPlanningDuration(seconds: number): string {\n if (seconds < 60) {\n return `${seconds}s`;\n }\n\n const minutes = Math.round(seconds / 60);\n\n if (minutes < 60) {\n return `${minutes}m`;\n }\n\n return `${Math.round(minutes / 60)}h`;\n}\n\nfunction getGenerationPlanningProfile(task: BuildJobTarget): {\n readonly inputTokenPerWord: number;\n readonly cacheableInputTokenPerWord: number;\n readonly maxSecondsPerCall: number;\n readonly minSecondsPerCall: number;\n readonly outputTokenPerWord: number;\n readonly secondsPerWord: number;\n readonly wordsPerCall: number;\n} {\n switch (task) {\n case \"index-fts\":\n return {\n cacheableInputTokenPerWord: 0,\n inputTokenPerWord: 0,\n maxSecondsPerCall: 1,\n minSecondsPerCall: 0,\n outputTokenPerWord: 0,\n secondsPerWord: 0.0005,\n wordsPerCall: 100_000,\n };\n case \"index-embedding-source\":\n case \"index-embedding-summary\":\n return {\n cacheableInputTokenPerWord: 0,\n inputTokenPerWord: 0,\n maxSecondsPerCall: 10,\n minSecondsPerCall: 1,\n outputTokenPerWord: 0,\n secondsPerWord: 0.002,\n wordsPerCall: 10_000,\n };\n case \"knowledge-graph\":\n return {\n cacheableInputTokenPerWord: 60,\n inputTokenPerWord: 80,\n maxSecondsPerCall: 35,\n minSecondsPerCall: 15,\n outputTokenPerWord: 25,\n secondsPerWord: 0.02,\n wordsPerCall: 35,\n };\n case \"reading-graph\":\n return {\n cacheableInputTokenPerWord: 20,\n inputTokenPerWord: 25,\n maxSecondsPerCall: 45,\n minSecondsPerCall: 15,\n outputTokenPerWord: 4,\n secondsPerWord: 0.01,\n wordsPerCall: 160,\n };\n case \"reading-summary\":\n return {\n cacheableInputTokenPerWord: 45,\n inputTokenPerWord: 55,\n maxSecondsPerCall: 25,\n minSecondsPerCall: 10,\n outputTokenPerWord: 4,\n secondsPerWord: 0.01,\n wordsPerCall: 110,\n };\n }\n}\n","import {\n applyChapterJobArtifactFile,\n runBuildJobWorker as runCoreBuildJobWorker,\n writeChapterJobInputFile,\n type ChapterJobInputOptions,\n type BuildJobWorkerOptions as CoreBuildJobWorkerOptions,\n} from \"wiki-graph-core/worker\";\nimport {\n resolveChapterPathReadonly,\n WikiGraphArchiveFile,\n} from \"wiki-graph-core\";\nimport type { ChapterJobKind } from \"wiki-graph-job\";\n\nimport { NodeFile } from \"./node-platform.js\";\nimport { withWikiGraphSDKHost, type WikiGraphSDKHost } from \"./host.js\";\nimport {\n resolveWikiGraphArchiveLocation,\n type WikiGraphArchiveTarget,\n} from \"./archive/target.js\";\nimport { writeWikiGraphArchiveLocation } from \"./archive/write.js\";\n\nexport {\n applyChapterJobArtifactFile,\n createLocalChapterJobFileExecutor,\n writeChapterJobInputFile,\n} from \"wiki-graph-core/worker\";\nexport type {\n BuildJob,\n BuildJobExecutionContext,\n BuildJobProgressReporter,\n BuildJobWorkerOptions,\n ChapterJobInputOptions,\n LocalChapterJobFileExecutorOptions,\n} from \"wiki-graph-core/worker\";\nexport type { ChapterJobFileExecutor, ChapterJobKind } from \"wiki-graph-job\";\n\nexport interface WikiGraphJobArtifactInput {\n readonly artifactPath: string;\n readonly chapterId: number;\n readonly kind: ChapterJobKind;\n}\n\nexport interface WikiGraphJobSnapshotInput {\n readonly chapterPath: string;\n readonly kind: ChapterJobKind;\n readonly options?: ChapterJobInputOptions;\n readonly outputPath: string;\n}\n\nexport interface WikiGraphJobSnapshotResult extends WikiGraphJobSnapshotInput {\n readonly chapterId: number;\n readonly revision: number;\n}\n\nexport interface ExtractWikiGraphJobSnapshotsOptions {\n readonly host?: WikiGraphSDKHost;\n readonly onSnapshot?: (\n snapshot: WikiGraphJobSnapshotResult,\n ) => void | Promise<void>;\n readonly requests: readonly WikiGraphJobSnapshotInput[];\n readonly signal?: AbortSignal;\n readonly stateDir?: string;\n readonly wikgPath: string;\n}\n\nexport async function extractWikiGraphJobSnapshots(\n options: ExtractWikiGraphJobSnapshotsOptions,\n): Promise<readonly WikiGraphJobSnapshotResult[]> {\n return await withWikiGraphSDKHost(\n {\n ...(options.host === undefined ? {} : { host: options.host }),\n ...(options.stateDir === undefined ? {} : { stateDir: options.stateDir }),\n },\n async () =>\n await new WikiGraphArchiveFile(\n new NodeFile(options.wikgPath),\n ).readDocument(async (document) => {\n const results: WikiGraphJobSnapshotResult[] = [];\n for (const request of options.requests) {\n options.signal?.throwIfAborted();\n const chapterId = await resolveChapterPathReadonly(\n document,\n request.chapterPath,\n );\n const revision = await writeChapterJobInputFile(\n document,\n chapterId,\n request.kind,\n new NodeFile(request.outputPath),\n request.options,\n );\n const result = { ...request, chapterId, revision };\n results.push(result);\n await options.onSnapshot?.(result);\n }\n options.signal?.throwIfAborted();\n return results;\n }),\n );\n}\n\nexport interface ApplyWikiGraphJobArtifactsOptions {\n readonly archive: WikiGraphArchiveTarget;\n readonly artifacts: AsyncIterable<WikiGraphJobArtifactInput>;\n readonly host?: WikiGraphSDKHost;\n readonly signal?: AbortSignal;\n readonly stateDir?: string;\n}\n\nexport async function applyWikiGraphJobArtifacts(\n options: ApplyWikiGraphJobArtifactsOptions,\n): Promise<{ readonly applied: number }> {\n return await withWikiGraphSDKHost(\n {\n ...(options.host === undefined ? {} : { host: options.host }),\n ...(options.stateDir === undefined ? {} : { stateDir: options.stateDir }),\n },\n async () => {\n const location = await resolveWikiGraphArchiveLocation(options.archive);\n let applied = 0;\n await writeWikiGraphArchiveLocation(\n location,\n async (document) => {\n for await (const artifact of options.artifacts) {\n options.signal?.throwIfAborted();\n const revision = await document.serials.getRevision(\n artifact.chapterId,\n );\n await applyChapterJobArtifactFile(\n document,\n artifact.chapterId,\n artifact.kind,\n revision,\n new NodeFile(artifact.artifactPath),\n );\n applied += 1;\n }\n },\n { invalidateContinuationCursors: true },\n );\n options.signal?.throwIfAborted();\n return { applied };\n },\n );\n}\n\nexport interface WikiGraphBuildJobWorkerOptions extends CoreBuildJobWorkerOptions {\n readonly host?: WikiGraphSDKHost;\n /** Wiki Graph state root. Defaults to `~/.wikigraph`. */\n readonly stateDir?: string;\n}\n\n/** Run the persistent build worker with invocation-scoped Node storage. */\nexport async function runBuildJobWorker(\n options: WikiGraphBuildJobWorkerOptions,\n): Promise<void> {\n const { host, stateDir, ...coreOptions } = options;\n await withWikiGraphSDKHost(\n {\n ...(host === undefined ? {} : { host }),\n ...(stateDir === undefined ? {} : { stateDir }),\n },\n async () => await runCoreBuildJobWorker(coreOptions),\n );\n}\n","import {\n installWikiGraphPlatform,\n withWikiGraphStorage,\n type WikiGraphPlatform,\n type WikiGraphStorage,\n} from \"wiki-graph-core/platform\";\n\nimport {\n ensureNodeWikiGraphPlatform,\n withNodeWikiGraphStorage,\n} from \"./node-platform.js\";\nimport {\n getWikiGraphSDKRuntimeContext,\n withWikiGraphSDKRuntimeContext,\n} from \"./runtime-context.js\";\n\ninterface WikiGraphSDKHostBase {\n /** Process-wide runtime services. Concurrent SDKs must use one compatible platform. */\n readonly platform?: WikiGraphPlatform;\n}\n\nexport type WikiGraphSDKHost = WikiGraphSDKHostBase &\n (\n | {\n /** Node state root for SDK configuration and other host-local state. */\n readonly stateDir: string;\n /** Storage roots scoped to this SDK instance or standalone operation. */\n readonly storage: WikiGraphStorage;\n }\n | {\n /** Node state root used by the default Node storage layout. */\n readonly stateDir?: string;\n readonly storage?: undefined;\n }\n );\n\nexport interface WikiGraphSDKHostOptions {\n readonly host?: WikiGraphSDKHost;\n readonly stateDir?: string;\n}\n\nexport function prepareWikiGraphSDKHost(host?: WikiGraphSDKHost): void {\n if (host?.platform === undefined) {\n ensureNodeWikiGraphPlatform();\n return;\n }\n installWikiGraphPlatform(host.platform);\n}\n\nexport function assertWikiGraphSDKHostOptions(\n options: WikiGraphSDKHostOptions,\n): void {\n if (\n options.host?.storage !== undefined &&\n options.host.stateDir === undefined\n ) {\n throw new TypeError(\n \"Wiki Graph SDK host.storage requires host.stateDir so SDK configuration cannot fall back to the default user state directory.\",\n );\n }\n if (\n options.stateDir !== undefined &&\n (options.host?.stateDir !== undefined ||\n options.host?.storage !== undefined)\n ) {\n throw new TypeError(\n \"Wiki Graph SDK host state/storage and top-level stateDir cannot be used together. Put the state directory in host.stateDir when providing host.storage.\",\n );\n }\n}\n\nexport async function withWikiGraphSDKHost<T>(\n options: WikiGraphSDKHostOptions,\n operation: () => Promise<T> | T,\n): Promise<T> {\n const current = getWikiGraphSDKRuntimeContext();\n const effective = {\n ...(options.host === undefined\n ? current.host === undefined\n ? {}\n : { host: current.host }\n : { host: options.host }),\n ...(options.stateDir === undefined\n ? current.stateDir === undefined\n ? {}\n : { stateDir: current.stateDir }\n : { stateDir: options.stateDir }),\n };\n assertWikiGraphSDKHostOptions(effective);\n prepareWikiGraphSDKHost(effective.host);\n const runWithContext = async (): Promise<T> =>\n await withWikiGraphSDKRuntimeContext(\n {\n ...current,\n ...(effective.host === undefined ? {} : { host: effective.host }),\n ...(effective.stateDir === undefined\n ? {}\n : { stateDir: effective.stateDir }),\n },\n operation,\n );\n if (effective.host?.storage !== undefined) {\n return await withWikiGraphStorage(effective.host.storage, runWithContext);\n }\n return await withNodeWikiGraphStorage(\n effective.host?.stateDir ?? effective.stateDir,\n runWithContext,\n );\n}\n","/** Controls whether development-only environment overrides are accepted. */\nexport type WikiGraphEntryEnvPolicy = \"development\" | \"production\";\n\nexport interface WikiGraphEntryRuntimeOptions {\n readonly argv?: readonly string[] | undefined;\n readonly cwd?: string | undefined;\n readonly devProjectRoot?: string | undefined;\n readonly env?: NodeJS.ProcessEnv | undefined;\n readonly envPolicy: WikiGraphEntryEnvPolicy;\n readonly stateDir?: string | undefined;\n}\n\nexport interface WikiGraphEntryRuntimeContext {\n readonly devProjectRoot?: string | undefined;\n readonly env: NodeJS.ProcessEnv;\n readonly envPolicy: WikiGraphEntryEnvPolicy;\n readonly stateDir?: string | undefined;\n}\n\nexport const DANGEROUS_RUNTIME_ENV_NAMES = [\n \"WIKIGRAPH_DEV\",\n \"WIKIGRAPH_ENV_POLICY\",\n \"WIKIGRAPH_QUEUE_DISABLE_AUTOSTART\",\n \"WIKIGRAPH_STATE_DIR\",\n] as const;\n\nexport function createEntryRuntimeContext(\n options: WikiGraphEntryRuntimeOptions,\n): WikiGraphEntryRuntimeContext {\n const environment = createMergedEnvironment(options.env);\n\n if (options.envPolicy === \"production\") {\n const blocked = DANGEROUS_RUNTIME_ENV_NAMES.filter(\n (name) => environment[name] !== undefined,\n );\n\n if (blocked.length > 0) {\n throw new Error(\n `Wiki Graph production entries do not support runtime env overrides: ${blocked.join(\", \")}. Use the development entry or explicit SDK options instead.`,\n );\n }\n\n return {\n env: environment,\n envPolicy: options.envPolicy,\n stateDir: options.stateDir,\n };\n }\n\n const envStateDir =\n environment.WIKIGRAPH_DEV ?? environment.WIKIGRAPH_STATE_DIR;\n const stateDir = normalizeOptionalPath(options.stateDir ?? envStateDir);\n\n if (stateDir === undefined) {\n throw new Error(\n \"Wiki Graph development entries require an explicit runtime state directory.\",\n );\n }\n\n const devProjectRoot = normalizeOptionalPath(options.devProjectRoot);\n\n if (devProjectRoot === undefined) {\n throw new Error(\n \"Wiki Graph development entries require an explicit project root.\",\n );\n }\n\n return {\n devProjectRoot,\n env: environment,\n envPolicy: options.envPolicy,\n stateDir,\n };\n}\n\nfunction createMergedEnvironment(\n environment: NodeJS.ProcessEnv | undefined,\n): NodeJS.ProcessEnv {\n if (environment === undefined) {\n return { ...process.env };\n }\n\n return {\n ...process.env,\n ...environment,\n };\n}\n\nfunction normalizeOptionalPath(path: string | undefined): string | undefined {\n if (path === undefined || path.trim() === \"\") {\n return undefined;\n }\n\n return path;\n}\n","import {\n addBuildJob,\n boostBuildJob,\n cancelBuildJob,\n cleanBuildJobs,\n formatLocatedChapterUri,\n getBuildJob,\n listBuildJobs,\n listChapters,\n pauseBuildJob,\n readBuildJobEvents,\n resolveBuildJobId,\n resumeBuildJob,\n updateBuildJobTarget,\n withArchiveBuildJobCreationLock,\n resolveChapterPathReadonly,\n WikiGraphArchiveFile,\n type AddBuildJobOptions,\n type BuildJob,\n type BuildJobEvent,\n type BuildJobEventChunk,\n type BuildJobListOptions,\n type BuildJobTarget,\n type ChapterEntry,\n} from \"wiki-graph-core\";\n\nimport { getNodeResourcePath } from \"./node-platform.js\";\nimport { type WikiGraphArchiveTarget } from \"./archive/index.js\";\nimport {\n archiveTargetFromLogicalLocator,\n resolveWikiGraphArchiveLocation,\n resolveWikiGraphArchiveTarget,\n requireWikiGraphArchiveFile,\n} from \"./archive/target.js\";\nimport {\n requireKnowledgeGraphWikispineConfig,\n runWikiGraphQueueWorker,\n type WikiGraphQueueWorkerOptions,\n} from \"./default-worker.js\";\nimport { getWikiGraphSDKProviders } from \"./runtime-context.js\";\nimport { resolveWikiGraphLLMJSON } from \"./providers.js\";\nimport type { WikiGraphLLMConfig } from \"./runtime-config.js\";\nimport { loadWikiGraphRuntimeConfig } from \"./runtime-config.js\";\nimport { loadRequiredStageConfig } from \"./stage.js\";\n\nconst TERMINAL_STATES = new Set([\"canceled\", \"failed\", \"succeeded\"]);\nconst TERMINAL_EVENT_GRACE_READS = 3;\n\nexport interface WikiGraphJobBackend {\n add(options: AddBuildJobOptions): Promise<BuildJob>;\n boost(jobId: string): Promise<BuildJob>;\n cancel(jobId: string): Promise<BuildJob>;\n get(jobId: string): Promise<BuildJob>;\n list(options: BuildJobListOptions): Promise<readonly BuildJob[]>;\n pause(jobId: string): Promise<BuildJob>;\n readEventChunk?(job: BuildJob, cursor: number): Promise<BuildJobEventChunk>;\n readEvents?(job: BuildJob): Promise<readonly BuildJobEvent[]>;\n resume(jobId: string): Promise<BuildJob>;\n setTarget(jobId: string, target: BuildJobTarget): Promise<BuildJob>;\n}\n\nconst CORE_BUILD_JOB_BACKEND: WikiGraphJobBackend = {\n add: async (options) => await addBuildJob(options),\n boost: async (jobId) => await boostBuildJob(jobId),\n cancel: async (jobId) => await cancelBuildJob(jobId),\n get: async (jobId) => await getBuildJob(jobId),\n list: async (options) => await listBuildJobs(options),\n pause: async (jobId) => await pauseBuildJob(jobId),\n readEventChunk: async (job, cursor) =>\n await readIncrementalBuildJobEvents(job, cursor),\n readEvents: async (job) => await readBuildJobEvents(job),\n resume: async (jobId) => await resumeBuildJob(jobId),\n setTarget: async (jobId, target) => await updateBuildJobTarget(jobId, target),\n};\n\nasync function readIncrementalBuildJobEvents(\n job: BuildJob,\n cursor: number,\n): Promise<BuildJobEventChunk> {\n let reader: Awaited<ReturnType<BuildJob[\"events\"][\"openReader\"]>>;\n try {\n reader = await job.events.openReader();\n } catch {\n return { cursor, events: await readBuildJobEvents(job) };\n }\n try {\n const offset = cursor <= reader.size ? cursor : 0;\n const content = new TextDecoder().decode(\n await reader.read(offset, reader.size - offset),\n );\n return {\n cursor: reader.size,\n events: content\n .split(\"\\n\")\n .filter((line) => line.trim() !== \"\")\n .map((line) => JSON.parse(line) as BuildJobEvent),\n };\n } finally {\n await reader.close();\n }\n}\n\nexport interface WikiGraphJobCreateOptions extends Omit<\n AddBuildJobOptions,\n \"archive\"\n> {\n readonly archive: WikiGraphArchiveTarget;\n}\n\nexport interface WikiGraphJobListOptions extends Omit<\n BuildJobListOptions,\n \"archive\"\n> {\n readonly archive?: WikiGraphArchiveTarget;\n}\n\nexport interface WikiGraphJobChapterReference {\n readonly locatedUri: string;\n readonly title: string | null;\n readonly uri: string;\n}\n\nexport interface WikiGraphJobSnapshot extends Omit<\n BuildJob,\n \"archive\" | \"cache\" | \"events\" | \"log\" | \"workspace\"\n> {\n readonly archive: WikiGraphArchiveTarget;\n readonly cachePath?: string;\n readonly eventsPath?: string;\n readonly logPath?: string;\n readonly workspacePath?: string;\n}\n\nexport interface WikiGraphJobEnqueueOptions {\n readonly archive: WikiGraphArchiveTarget;\n readonly boost?: boolean;\n readonly chapterId?: number;\n readonly chapterIds?: readonly number[];\n readonly chapterPath?: string;\n readonly depth?: number;\n readonly llm?: WikiGraphLLMConfig;\n /** @deprecated Prefer the typed llm option. */\n readonly llmJSON?: string;\n readonly prompt?: string;\n readonly target?: BuildJobTarget;\n}\n\nexport interface WikiGraphJobEnqueueResult {\n readonly created: readonly {\n readonly chapter: ChapterEntry;\n readonly job: WikiGraphJob;\n }[];\n readonly skipped: readonly {\n readonly chapter: ChapterEntry;\n readonly reason: string;\n }[];\n}\n\nexport interface WikiGraphJobEnqueuePlan {\n readonly ready: readonly ChapterEntry[];\n readonly skipped: readonly {\n readonly chapter: ChapterEntry;\n readonly reason: string;\n }[];\n}\n\nexport interface WikiGraphJobEventsOptions {\n readonly from?: \"beginning\" | \"now\";\n readonly pollIntervalMs?: number;\n readonly signal?: AbortSignal;\n}\n\nexport type WikiGraphJobEventListener = (\n event: BuildJobEvent,\n) => void | Promise<void>;\n\nexport interface WikiGraphJobSubscriptionOptions extends WikiGraphJobEventsOptions {\n readonly onError?: (error: unknown) => void;\n}\n\nexport interface WikiGraphJobRuntime {\n run<T>(\n operation: () => Promise<T> | T,\n signal?: AbortSignal,\n options?: { readonly skipHomeBootstrap?: boolean },\n ): Promise<T>;\n}\n\nexport class WikiGraphJobManager {\n readonly #runtime: WikiGraphJobRuntime;\n readonly #backend: WikiGraphJobBackend;\n readonly #subscriptions = new Set<AbortController>();\n\n public constructor(\n runtime: WikiGraphJobRuntime,\n backend: WikiGraphJobBackend = CORE_BUILD_JOB_BACKEND,\n ) {\n this.#runtime = runtime;\n this.#backend = backend;\n }\n\n public async create(\n options: WikiGraphJobCreateOptions,\n ): Promise<WikiGraphJob> {\n const resolved = await this.#runtime.run(async () => {\n const location = await resolveWikiGraphArchiveLocation(options.archive);\n return {\n job: await this.#backend.add({\n ...options,\n archive: requireWikiGraphArchiveFile(location),\n }),\n target: location.target,\n };\n });\n return await this.#createHandle(resolved.job, resolved.target);\n }\n\n public async clean(): Promise<number> {\n return await this.#runtime.run(async () => await cleanBuildJobs());\n }\n\n public async runWorker(\n options: WikiGraphQueueWorkerOptions = {},\n ): Promise<void> {\n await this.#runtime.run(\n async () => await runWikiGraphQueueWorker(options),\n options.signal,\n );\n }\n\n public async get(jobId: string): Promise<WikiGraphJob> {\n return await this.#runtime.run(\n async () => await this.#createHandle(await this.#backend.get(jobId)),\n );\n }\n\n public async resolveId(reference: string): Promise<string> {\n return await this.#runtime.run(\n async () => await resolveBuildJobId(reference),\n );\n }\n\n public async list(\n options: WikiGraphJobListOptions = {},\n ): Promise<readonly WikiGraphJob[]> {\n return await this.#runtime.run(async () => {\n const normalized: BuildJobListOptions = {\n ...(options.activeOnly === undefined\n ? {}\n : { activeOnly: options.activeOnly }),\n ...(options.all === undefined ? {} : { all: options.all }),\n ...(options.archive === undefined\n ? {}\n : {\n archive: requireWikiGraphArchiveFile(\n await resolveWikiGraphArchiveLocation(options.archive),\n ),\n }),\n };\n const jobs = await this.#backend.list(normalized);\n return await Promise.all(\n jobs.map(async (job) => await this.#createHandle(job)),\n );\n });\n }\n\n public async resolveChapters(\n jobs: readonly WikiGraphJobSnapshot[],\n ): Promise<ReadonlyMap<string, WikiGraphJobChapterReference>> {\n return await this.#runtime.run(async () => {\n const jobsByArchive = new Map<string, WikiGraphJobSnapshot[]>();\n for (const job of jobs) {\n const archivePath = getJobArchiveLocator(job);\n const grouped = jobsByArchive.get(archivePath) ?? [];\n grouped.push(job);\n jobsByArchive.set(archivePath, grouped);\n }\n const entries = (\n await Promise.all(\n [...jobsByArchive].map(async ([archivePath, archiveJobs]) => {\n try {\n const location = await resolveWikiGraphArchiveLocation(\n archiveJobs[0]!.archive,\n );\n const chapters = await new WikiGraphArchiveFile(\n requireWikiGraphArchiveFile(location),\n ).readDocument(async (document) => await listChapters(document));\n const chaptersById = new Map(\n chapters.map((chapter) => [chapter.chapterId, chapter]),\n );\n return archiveJobs.flatMap((job) => {\n const chapter = chaptersById.get(job.chapterId);\n return chapter === undefined\n ? []\n : [\n [\n job.jobId,\n {\n locatedUri: formatLocatedChapterUri(\n archivePath,\n chapter.path,\n ),\n title: chapter.title,\n uri: chapter.uri,\n },\n ] as const,\n ];\n });\n } catch {\n return [];\n }\n }),\n )\n ).flat();\n return new Map(entries);\n });\n }\n\n public async resolveChapter(\n job: WikiGraphJobSnapshot,\n ): Promise<WikiGraphJobChapterReference | undefined> {\n return (await this.resolveChapters([job])).get(job.jobId);\n }\n\n public async enqueue(\n options: WikiGraphJobEnqueueOptions,\n ): Promise<WikiGraphJobEnqueueResult> {\n return await this.#runtime.run(async () => {\n const llmJSON = resolveWikiGraphLLMJSON(options);\n const location = await resolveWikiGraphArchiveLocation(options.archive);\n return await withArchiveBuildJobCreationLock(\n location.archiveFile,\n async () => {\n const target = options.target ?? \"reading-summary\";\n await validateQueueTargetConfig(target, llmJSON);\n const selectedExplicitly =\n options.chapterId !== undefined ||\n options.chapterIds !== undefined ||\n options.chapterPath !== undefined ||\n options.depth !== undefined;\n const candidates = await new WikiGraphArchiveFile(\n requireWikiGraphArchiveFile(location),\n ).readDocument(async (document) => {\n const chapters = await listChapters(document);\n const selected = await selectQueueChapters(\n document,\n chapters,\n options,\n );\n const checked = await Promise.all(\n selected.map(async (chapter) => ({\n chapter,\n reason: await readQueueReadinessReason(\n document,\n chapter,\n target,\n ),\n })),\n );\n return checked;\n });\n const created: Array<{ chapter: ChapterEntry; job: WikiGraphJob }> =\n [];\n const skipped: Array<{ chapter: ChapterEntry; reason: string }> = [];\n for (const candidate of candidates) {\n if (candidate.reason !== undefined) {\n if (selectedExplicitly && candidates.length === 1) {\n throw new Error(\n formatQueueReadinessError(\n candidate.chapter,\n target,\n candidate.reason,\n ),\n );\n }\n skipped.push({\n chapter: candidate.chapter,\n reason: candidate.reason,\n });\n continue;\n }\n try {\n created.push({\n chapter: candidate.chapter,\n job: await this.#createHandle(\n await this.#backend.add({\n archive: requireWikiGraphArchiveFile(location),\n boost: options.boost ?? false,\n chapterId: candidate.chapter.chapterId,\n ...(llmJSON === undefined ? {} : { llmJSON }),\n ...(options.prompt === undefined\n ? {}\n : { prompt: options.prompt }),\n target,\n }),\n location.target,\n ),\n });\n } catch (error) {\n if (selectedExplicitly && candidates.length === 1) throw error;\n skipped.push({\n chapter: candidate.chapter,\n reason: error instanceof Error ? error.message : String(error),\n });\n }\n }\n return { created, skipped };\n },\n );\n });\n }\n\n public async planEnqueue(\n options: WikiGraphJobEnqueueOptions,\n ): Promise<WikiGraphJobEnqueuePlan> {\n return await this.#runtime.run(async () => {\n const llmJSON = resolveWikiGraphLLMJSON(options);\n const location = await resolveWikiGraphArchiveLocation(options.archive);\n const target = options.target ?? \"reading-summary\";\n await validateQueueTargetConfig(target, llmJSON);\n const selectedExplicitly =\n options.chapterId !== undefined ||\n options.chapterIds !== undefined ||\n options.chapterPath !== undefined ||\n options.depth !== undefined;\n const candidates = await new WikiGraphArchiveFile(\n requireWikiGraphArchiveFile(location),\n ).readDocument(async (document) => {\n const chapters = await listChapters(document);\n const selected = await selectQueueChapters(document, chapters, options);\n return await Promise.all(\n selected.map(async (chapter) => ({\n chapter,\n reason: await readQueueReadinessReason(document, chapter, target),\n })),\n );\n });\n if (\n selectedExplicitly &&\n candidates.length === 1 &&\n candidates[0]?.reason !== undefined\n ) {\n throw new Error(\n formatQueueReadinessError(\n candidates[0].chapter,\n target,\n candidates[0].reason,\n ),\n );\n }\n return {\n ready: candidates\n .filter((item) => item.reason === undefined)\n .map((item) => item.chapter),\n skipped: candidates.flatMap((item) =>\n item.reason === undefined\n ? []\n : [{ chapter: item.chapter, reason: item.reason }],\n ),\n };\n });\n }\n\n public close(): void {\n for (const controller of this.#subscriptions) controller.abort();\n this.#subscriptions.clear();\n }\n\n public trackSubscription(controller: AbortController): () => void {\n this.#subscriptions.add(controller);\n return () => this.#subscriptions.delete(controller);\n }\n\n async #createHandle(\n snapshot: BuildJob,\n target?: WikiGraphArchiveTarget,\n ): Promise<WikiGraphJob> {\n const legacy = snapshot as BuildJob & { readonly archivePath?: string };\n const resolvedTarget =\n target ??\n (snapshot.archive === undefined\n ? archiveTargetFromLogicalLocator(legacy.archivePath ?? \"unknown.wikg\")\n : await resolveWikiGraphArchiveTarget(snapshot.archive));\n return new WikiGraphJob(\n this,\n this.#runtime,\n this.#backend,\n snapshot,\n cloneWikiGraphArchiveTarget(resolvedTarget),\n );\n }\n}\n\nfunction getJobArchiveLocator(job: WikiGraphJobSnapshot): string {\n return job.archive.kind === \"library\" ? job.archive.uri : job.archive.path;\n}\n\nexport class WikiGraphJob {\n readonly #manager: WikiGraphJobManager;\n readonly #runtime: WikiGraphJobRuntime;\n readonly #backend: WikiGraphJobBackend;\n readonly #archiveTarget: WikiGraphArchiveTarget;\n #snapshot: BuildJob;\n\n public constructor(\n manager: WikiGraphJobManager,\n runtime: WikiGraphJobRuntime,\n backend: WikiGraphJobBackend,\n snapshot: BuildJob,\n archiveTarget: WikiGraphArchiveTarget,\n ) {\n this.#manager = manager;\n this.#runtime = runtime;\n this.#backend = backend;\n this.#snapshot = snapshot;\n this.#archiveTarget = archiveTarget;\n }\n\n public get id(): string {\n return this.#snapshot.jobId;\n }\n\n public get snapshot(): WikiGraphJobSnapshot {\n return toPublicJobSnapshot(this.#snapshot, this.#archiveTarget);\n }\n\n public async status(): Promise<WikiGraphJobSnapshot> {\n return await this.#update(async () => await this.#backend.get(this.id));\n }\n\n public async pause(): Promise<WikiGraphJobSnapshot> {\n return await this.#update(async () => await this.#backend.pause(this.id));\n }\n\n public async resume(): Promise<WikiGraphJobSnapshot> {\n return await this.#update(async () => await this.#backend.resume(this.id));\n }\n\n public async cancel(): Promise<WikiGraphJobSnapshot> {\n return await this.#update(async () => await this.#backend.cancel(this.id));\n }\n\n public async boost(): Promise<WikiGraphJobSnapshot> {\n return await this.#update(async () => await this.#backend.boost(this.id));\n }\n\n public async setTarget(\n target: BuildJobTarget,\n ): Promise<WikiGraphJobSnapshot> {\n return await this.#update(\n async () => await this.#backend.setTarget(this.id, target),\n );\n }\n\n public async *events(\n options: WikiGraphJobEventsOptions = {},\n ): AsyncIterable<BuildJobEvent> {\n let seenSeq = 0;\n let cursor = 0;\n let job = this.#snapshot;\n if (options.from === \"now\") {\n await this.status();\n job = this.#snapshot;\n const chunk = await this.#readEventChunkSafely(job, cursor);\n const events = chunk.events;\n cursor = chunk.cursor;\n seenSeq = events.at(-1)?.seq ?? 0;\n if (isTerminalState(job.state)) return;\n }\n\n let terminalReadsWithoutEvent = 0;\n while (options.signal?.aborted !== true) {\n const chunk = await this.#readEventChunkSafely(job, cursor);\n const events = chunk.events;\n cursor = chunk.cursor;\n let sawTerminalEvent = false;\n for (const event of events) {\n if (event.seq <= seenSeq) continue;\n seenSeq = event.seq;\n sawTerminalEvent ||= isTerminalEvent(event);\n yield event;\n }\n if (sawTerminalEvent) return;\n\n await this.status();\n job = this.#snapshot;\n if (isTerminalState(job.state)) {\n terminalReadsWithoutEvent += 1;\n if (terminalReadsWithoutEvent >= TERMINAL_EVENT_GRACE_READS) return;\n } else {\n terminalReadsWithoutEvent = 0;\n }\n await wait(options.pollIntervalMs ?? 1_000, options.signal);\n }\n }\n\n public subscribe(\n listener: WikiGraphJobEventListener,\n options: WikiGraphJobSubscriptionOptions = {},\n ): () => void {\n const controller = new AbortController();\n const untrack = this.#manager.trackSubscription(controller);\n const stopForwarding = forwardAbort(options.signal, controller);\n void (async () => {\n try {\n for await (const event of this.events({\n ...options,\n signal: controller.signal,\n })) {\n try {\n await listener(event);\n } catch (error) {\n options.onError?.(error);\n }\n }\n } catch (error) {\n if (!controller.signal.aborted) options.onError?.(error);\n } finally {\n stopForwarding();\n untrack();\n }\n })();\n return () => controller.abort();\n }\n\n async #update(\n operation: () => Promise<BuildJob>,\n ): Promise<WikiGraphJobSnapshot> {\n this.#snapshot = await this.#runtime.run(operation);\n return this.snapshot;\n }\n\n async #readEventChunk(\n job: BuildJob,\n cursor: number,\n ): Promise<BuildJobEventChunk> {\n return await this.#runtime.run(async () => {\n if (this.#backend.readEventChunk !== undefined) {\n return await this.#backend.readEventChunk(job, cursor);\n }\n const events = await this.#backend.readEvents?.(job);\n return { cursor: 0, events: events ?? [] };\n });\n }\n\n async #readEventChunkSafely(\n job: BuildJob,\n cursor: number,\n ): Promise<BuildJobEventChunk> {\n try {\n return await this.#readEventChunk(job, cursor);\n } catch {\n return { cursor, events: [] };\n }\n }\n}\n\nfunction toPublicJobSnapshot(\n job: BuildJob,\n archive: WikiGraphArchiveTarget,\n): WikiGraphJobSnapshot {\n const legacy = job as BuildJob & {\n readonly cachePath?: string;\n readonly eventsPath?: string;\n readonly logPath?: string;\n readonly workspacePath?: string;\n };\n return {\n archive: cloneWikiGraphArchiveTarget(archive),\n archiveKey: archive.kind === \"library\" ? archive.uri : job.archiveKey,\n ...(getJobResourcePath(job.cache, legacy.cachePath) === undefined\n ? {}\n : { cachePath: getJobResourcePath(job.cache, legacy.cachePath)! }),\n chapterId: job.chapterId,\n createdAt: job.createdAt,\n ...(job.currentStep === undefined ? {} : { currentStep: job.currentStep }),\n ...(job.errorJSON === undefined ? {} : { errorJSON: job.errorJSON }),\n ...(getJobResourcePath(job.events, legacy.eventsPath) === undefined\n ? {}\n : { eventsPath: getJobResourcePath(job.events, legacy.eventsPath)! }),\n ...(job.finishedAt === undefined ? {} : { finishedAt: job.finishedAt }),\n jobId: job.jobId,\n ...(job.inputRevision === undefined\n ? {}\n : { inputRevision: job.inputRevision }),\n ...(getJobResourcePath(job.log, legacy.logPath) === undefined\n ? {}\n : { logPath: getJobResourcePath(job.log, legacy.logPath)! }),\n ...(job.llmJSON === undefined ? {} : { llmJSON: job.llmJSON }),\n ...(job.ownerId === undefined ? {} : { ownerId: job.ownerId }),\n ...(job.prompt === undefined ? {} : { prompt: job.prompt }),\n queueRank: job.queueRank,\n ...(job.readingSummaryStartedAt === undefined\n ? {}\n : { readingSummaryStartedAt: job.readingSummaryStartedAt }),\n state: job.state,\n target: job.target,\n updatedAt: job.updatedAt,\n ...(getJobResourcePath(job.workspace, legacy.workspacePath) === undefined\n ? {}\n : {\n workspacePath: getJobResourcePath(\n job.workspace,\n legacy.workspacePath,\n )!,\n }),\n };\n}\n\nfunction cloneWikiGraphArchiveTarget(\n target: WikiGraphArchiveTarget,\n): WikiGraphArchiveTarget {\n return target.kind === \"library\"\n ? Object.freeze({ kind: \"library\", uri: target.uri })\n : Object.freeze({\n kind: \"standalone\",\n path: target.path,\n ...(target.objectUri === undefined\n ? {}\n : { objectUri: target.objectUri }),\n });\n}\n\nfunction getJobResourcePath(\n resource: Parameters<typeof getNodeResourcePath>[0] | undefined,\n legacy: string | undefined,\n): string | undefined {\n if (resource === undefined) return legacy;\n try {\n return getNodeResourcePath(resource);\n } catch {\n const identity = (resource as { readonly identity?: unknown }).identity;\n if (typeof identity === \"string\") return identity;\n throw new TypeError(\"Expected a Node File or Directory resource\");\n }\n}\n\nasync function selectQueueChapters(\n document: Parameters<typeof listChapters>[0],\n chapters: readonly ChapterEntry[],\n options: WikiGraphJobEnqueueOptions,\n): Promise<readonly ChapterEntry[]> {\n const ids =\n options.chapterIds ??\n (options.chapterId === undefined ? undefined : [options.chapterId]);\n if (ids !== undefined) {\n const selected = new Set(ids);\n for (const id of selected) requireQueueChapter(chapters, id);\n return chapters.filter((chapter) => selected.has(chapter.chapterId));\n }\n if (options.chapterPath === undefined) {\n return options.depth === undefined\n ? chapters\n : chapters.filter((chapter) => chapter.depth <= options.depth!);\n }\n const rootId = await resolveChapterPathReadonly(\n document,\n options.chapterPath,\n );\n const root = requireQueueChapter(chapters, rootId);\n const prefix = `${root.path}/`;\n return chapters.filter(\n (chapter) =>\n chapter.chapterId === rootId ||\n (chapter.path.startsWith(prefix) &&\n (options.depth === undefined ||\n chapter.depth - root.depth <= options.depth)),\n );\n}\n\nasync function validateQueueTargetConfig(\n target: BuildJobTarget,\n llmJSON: string | undefined,\n): Promise<void> {\n const providers = getWikiGraphSDKProviders();\n const config =\n target === \"knowledge-graph\" ||\n target === \"reading-graph\" ||\n target === \"reading-summary\"\n ? await loadRequiredStageConfig({\n ...(llmJSON === undefined ? {} : { llmJSON }),\n })\n : await loadWikiGraphRuntimeConfig({\n ...(llmJSON === undefined ? {} : { llmJSON }),\n ...(providers.embedding === undefined\n ? {}\n : { skipEmbeddingConfig: true }),\n ...(llmJSON === undefined && providers.llm !== undefined\n ? { skipLLMConfig: true }\n : {}),\n });\n if (\n (target === \"index-embedding-source\" ||\n target === \"index-embedding-summary\") &&\n config.embedding === undefined &&\n providers.embedding === undefined\n ) {\n throw new Error(\n \"Missing embeddings configuration. Configure `wikg://local/config/embeddings` before queueing embedding index artifact jobs.\",\n );\n }\n if (target === \"knowledge-graph\")\n requireKnowledgeGraphWikispineConfig(config);\n}\n\nfunction requireQueueChapter(\n chapters: readonly ChapterEntry[],\n chapterId: number,\n): ChapterEntry {\n const chapter = chapters.find((entry) => entry.chapterId === chapterId);\n if (chapter === undefined)\n throw new Error(`Chapter ${chapterId} does not exist.`);\n return chapter;\n}\n\nasync function readQueueReadinessReason(\n document: Parameters<typeof listChapters>[0],\n chapter: ChapterEntry,\n target: BuildJobTarget,\n): Promise<string | undefined> {\n if (chapter.stage === \"planned\") {\n return \"planned\";\n }\n if (target === \"index-embedding-summary\") {\n const summary = await document.readSummary(chapter.chapterId);\n if (summary === undefined || summary.trim() === \"\") {\n return \"missing summary\";\n }\n }\n if (target === \"knowledge-graph\" || target === \"reading-graph\") {\n const [artifact, revision] = await Promise.all([\n document.indexArtifacts.get(chapter.chapterId, \"fts\"),\n document.serials.getRevision(chapter.chapterId),\n ]);\n if (artifact?.sourceRevision !== revision) {\n return \"missing current FTS index artifact\";\n }\n }\n return undefined;\n}\n\nfunction formatQueueReadinessError(\n chapter: ChapterEntry,\n target: BuildJobTarget,\n reason: string,\n): string {\n if (reason === \"planned\") {\n return `Chapter ${chapter.uri} is planned. Set source before queueing a build job.`;\n }\n if (reason === \"missing summary\") {\n return `Chapter ${chapter.uri} has no summary. Build a reading summary before queueing a summary embedding index artifact job.`;\n }\n if (reason === \"missing current FTS index artifact\") {\n return `Chapter ${chapter.uri} needs a current FTS index artifact before queueing ${target}.`;\n }\n return reason;\n}\n\nasync function wait(milliseconds: number, signal?: AbortSignal): Promise<void> {\n if (signal?.aborted === true) return;\n await new Promise<void>((resolve) => {\n let settled = false;\n const complete = (): void => {\n if (settled) return;\n settled = true;\n clearTimeout(timeout);\n signal?.removeEventListener(\"abort\", complete);\n resolve();\n };\n const timeout = setTimeout(complete, milliseconds);\n signal?.addEventListener(\"abort\", complete, { once: true });\n if (signal?.aborted === true) complete();\n });\n}\n\nfunction isTerminalState(state: BuildJob[\"state\"]): boolean {\n return TERMINAL_STATES.has(state);\n}\n\nfunction isTerminalEvent(event: BuildJobEvent): boolean {\n return (\n event.type === \"canceled\" ||\n event.type === \"failed\" ||\n event.type === \"succeeded\"\n );\n}\n\nfunction forwardAbort(\n source: AbortSignal | undefined,\n target: AbortController,\n): () => void {\n if (source === undefined) return () => undefined;\n const abort = (): void => target.abort(source.reason);\n if (source.aborted) abort();\n else source.addEventListener(\"abort\", abort, { once: true });\n return () => source.removeEventListener(\"abort\", abort);\n}\n","import {\n addWikiGraphLibraryArchive,\n ensureWikiGraphArchiveSchemaCurrent,\n assertWikiGraphLibrarySchemaCurrent,\n cleanWikiGraphLibraryIndex,\n clearWikiGraphLibraryMetadata,\n continueWikiGraphLibraryObjectBucket,\n createWikiGraphLibrary,\n deleteWikiGraphLibraryMetadataKey,\n findWikiGraphLibraryObjects,\n findWikiGraphLibraryObjectBuckets,\n findWikiGraphLibraryArchiveMembers,\n formatWikiGraphLibraryUri,\n getWikiGraphLibraryArchive,\n getWikiGraphLibraryMetadata,\n listRelatedWikiGraphLibraryObjects,\n listWikiGraphLibraries,\n listWikiGraphLibraryArchives,\n listWikiGraphLibraryArchiveMembers,\n listWikiGraphLibraryEvidence,\n listWikiGraphLibraryObjects,\n moveWikiGraphLibraryArchive,\n packWikiGraphLibraryContext,\n parseWikiGraphLibraryUri,\n putWikiGraphLibraryMetadata,\n readWikiGraphLibraryIndexState,\n readWikiGraphLibraryPage,\n rebuildWikiGraphLibraryIndex,\n rebindWikiGraphLibrary,\n removeWikiGraphLibrary,\n removeWikiGraphLibraryArchive,\n replaceWikiGraphLibraryArchive,\n replaceWikiGraphLibraryMetadata,\n resolveWikiGraphLibrary,\n scanWikiGraphLibrary,\n withWikiGraphLibraryLock,\n writeWikgArchive,\n type ArchiveCollectionOptions,\n type ArchiveFindOptions,\n type ArchivePack,\n type ArchivePage,\n type ParsedWikiGraphLibraryUri,\n type SearchIndexEmbeddingProvider,\n type SearchIndexQueryMode,\n type WikiGraphLibraryArchiveRecord,\n type WikiGraphLibraryBucketContinuationOptions as CoreWikiGraphLibraryBucketContinuationOptions,\n type WikiGraphLibraryBucketSearchOptions as CoreWikiGraphLibraryBucketSearchOptions,\n type WikiGraphLibraryIndexState,\n type WikiGraphLibraryRecord,\n type WikiGraphLibraryScanResult,\n type FileReader,\n} from \"wiki-graph-core\";\nimport { mkdir, mkdtemp, rm } from \"fs/promises\";\nimport { tmpdir } from \"os\";\nimport { join } from \"path\";\n\nimport type { WikiGraphJobRuntime } from \"./jobs.js\";\nimport {\n getNodeResourcePath,\n NodeDirectory,\n NodeFile,\n} from \"./node-platform.js\";\nimport { resolveWikiGraphRuntimePath } from \"./runtime-path.js\";\nimport {\n createConfiguredEmbeddingProvider,\n withConfiguredWikimediaResolver,\n} from \"./query-runtime.js\";\nimport {\n assertStandaloneWikiGraphArchivePath,\n rethrowArchiveSchemaError,\n} from \"./archive/target.js\";\nimport {\n createArchiveCollectionPage,\n createArchiveEvidencePage,\n createArchiveFindPage,\n createArchiveRelatedPage,\n createLibraryBucketPage,\n type ArchiveCollectionPage,\n type ArchiveEvidencePage,\n type ArchiveFindPage,\n type ArchiveRelatedPage,\n type LibraryBucketPage,\n} from \"./result-pages.js\";\n\nexport type WikiGraphLibraryTarget = ParsedWikiGraphLibraryUri | string;\n\nasync function resolveQueryEmbeddingProvider(\n queryMode: SearchIndexQueryMode | undefined,\n): Promise<SearchIndexEmbeddingProvider | undefined> {\n if (queryMode === \"fts\") return undefined;\n const provider = await createConfiguredEmbeddingProvider();\n if (queryMode === \"embedding\" && provider === undefined) {\n throw new Error(\n \"Embedding query mode requires embeddings configuration at `wikg://local/config/embeddings`.\",\n );\n }\n return provider;\n}\n\nexport type WikiGraphLibrarySearchOptions = Omit<\n ArchiveFindOptions,\n \"embeddingProvider\"\n>;\nexport type WikiGraphLibraryBucketSearchOptions = Omit<\n CoreWikiGraphLibraryBucketSearchOptions,\n \"embeddingProvider\"\n>;\nexport type WikiGraphLibraryBucketContinuationOptions = Omit<\n CoreWikiGraphLibraryBucketContinuationOptions,\n \"embeddingProvider\"\n>;\nexport type {\n WikiGraphLibraryBucketSearchResult,\n WikiGraphLibrarySearchBucketDefinition,\n WikiGraphLibrarySearchBucketPage,\n} from \"wiki-graph-core\";\nexport type WikiGraphLibraryRelatedOptions = Omit<\n NonNullable<Parameters<typeof listRelatedWikiGraphLibraryObjects>[2]>,\n \"embeddingProvider\"\n>;\nexport type WikiGraphLibraryEvidenceOptions = Omit<\n NonNullable<Parameters<typeof listWikiGraphLibraryEvidence>[2]>,\n \"embeddingProvider\"\n>;\nexport type WikiGraphLibraryPageOptions = Omit<\n Parameters<typeof readWikiGraphLibraryPage>[2],\n \"wikimediaResolver\"\n> & { readonly signal?: AbortSignal };\n\nexport interface WikiGraphLibraryAddArchiveOptions {\n readonly inputPath: string;\n readonly target: WikiGraphLibraryTarget;\n readonly to?: string;\n}\n\nexport interface WikiGraphLibraryMoveArchiveOptions {\n readonly target: WikiGraphLibraryTarget;\n readonly to: string;\n}\n\nexport interface WikiGraphLibraryReplaceArchiveOptions {\n readonly inputPath: string;\n readonly target: WikiGraphLibraryTarget;\n}\n\nexport interface WikiGraphLibraryArchiveContent {\n readonly mediaType: \"application/vnd.wiki-graph.archive\";\n readonly size: number;\n readonly stream: AsyncIterable<Uint8Array>;\n readonly uri: string;\n}\n\nexport interface WikiGraphLibraryArchiveReadOptions {\n readonly signal?: AbortSignal;\n}\n\nexport interface WikiGraphLibrarySnapshot extends Omit<\n WikiGraphLibraryRecord,\n \"folder\" | \"staging\"\n> {\n readonly folderPath: string;\n}\n\nexport type WikiGraphLibraryArchiveSnapshot = Omit<\n WikiGraphLibraryArchiveRecord,\n \"file\"\n>;\n\nexport interface WikiGraphLibraryScanSnapshot {\n readonly archives: readonly WikiGraphLibraryArchiveSnapshot[];\n readonly library?: WikiGraphLibrarySnapshot;\n}\n\nexport class WikiGraphLibraryManager {\n readonly #runtime: WikiGraphJobRuntime;\n\n public constructor(runtime: WikiGraphJobRuntime) {\n this.#runtime = runtime;\n }\n\n public async create(folder: string): Promise<WikiGraphLibrary> {\n const record = await this.#runtime.run(async () => {\n const path = resolveWikiGraphRuntimePath(folder);\n await mkdir(path);\n return await createWikiGraphLibrary({ folder: new NodeDirectory(path) });\n });\n return new WikiGraphLibrary(this.#runtime, record);\n }\n\n public async get(\n uri = formatWikiGraphLibraryUri(),\n ): Promise<WikiGraphLibrary> {\n const target = requireLibraryTarget(uri);\n const record = await this.#runtime.run(\n async () => await resolveWikiGraphLibrary(target),\n );\n return new WikiGraphLibrary(this.#runtime, record);\n }\n\n public async addArchive(\n options: WikiGraphLibraryAddArchiveOptions,\n ): Promise<WikiGraphLibraryArchiveSnapshot> {\n return toArchiveSnapshot(\n await this.#runtime.run(\n async () =>\n await addWikiGraphLibraryArchive({\n inputFile: new NodeFile(\n await assertStandaloneWikiGraphArchivePath(options.inputPath),\n ),\n target: requireLibraryTarget(options.target),\n ...(options.to === undefined ? {} : { to: options.to }),\n }),\n ),\n );\n }\n\n public async assertCurrent(target: WikiGraphLibraryTarget): Promise<void> {\n await this.#runtime.run(\n async () =>\n await assertWikiGraphLibrarySchemaCurrent(requireLibraryTarget(target)),\n );\n }\n\n public async rebind(\n target: WikiGraphLibraryTarget,\n folder: string,\n ): Promise<WikiGraphLibraryScanSnapshot> {\n return toScanSnapshot(\n await this.#runtime.run(\n async () =>\n await rebindWikiGraphLibrary({\n folder: new NodeDirectory(resolveWikiGraphRuntimePath(folder)),\n target: requireLibraryTarget(target),\n }),\n ),\n );\n }\n\n public async remove(\n target: WikiGraphLibraryTarget,\n ): Promise<WikiGraphLibrarySnapshot> {\n return toLibrarySnapshot(\n await this.#runtime.run(\n async () => await removeWikiGraphLibrary(requireLibraryTarget(target)),\n ),\n );\n }\n\n public async scan(\n target: WikiGraphLibraryTarget,\n ): Promise<WikiGraphLibraryScanSnapshot> {\n return toScanSnapshot(\n await this.#runtime.run(\n async () => await scanWikiGraphLibrary(requireLibraryTarget(target)),\n ),\n );\n }\n\n public async getArchive(\n target: WikiGraphLibraryTarget,\n ): Promise<WikiGraphLibraryArchiveSnapshot> {\n return toArchiveSnapshot(\n await this.#runtime.run(\n async () =>\n await getWikiGraphLibraryArchive(requireLibraryTarget(target)),\n ),\n );\n }\n\n public async readArchive<T>(\n target: WikiGraphLibraryTarget,\n consume: (content: WikiGraphLibraryArchiveContent) => Promise<T> | T,\n options: WikiGraphLibraryArchiveReadOptions = {},\n ): Promise<T> {\n return await this.#runtime.run(async () => {\n const parsedTarget = requireLibraryArchiveTarget(target);\n const library = await resolveWikiGraphLibrary(parsedTarget);\n\n return await withWikiGraphLibraryLock(\n library.id,\n \"read\",\n async () => {\n throwIfAborted(options.signal);\n const archive = await getWikiGraphLibraryArchive(parsedTarget);\n const source = requireReadableLibraryArchiveFile(archive);\n await ensureWikiGraphArchiveSchemaCurrent(source).catch(\n (error: unknown) =>\n rethrowArchiveSchemaError(error, {\n kind: \"library\",\n uri: archive.uri,\n }),\n );\n let temporaryDirectory: string | undefined;\n let reader: FileReader | undefined;\n let active = true;\n try {\n const file =\n source.kind === \"directory\"\n ? await (async () => {\n temporaryDirectory = await mkdtemp(\n join(tmpdir(), \"wikigraph-library-read-\"),\n );\n const output = new NodeFile(\n join(temporaryDirectory, \"archive.wikg\"),\n );\n await writeWikgArchive(source, output);\n return output;\n })()\n : source;\n reader = await file.openReader();\n const content: WikiGraphLibraryArchiveContent = {\n mediaType: \"application/vnd.wiki-graph.archive\",\n size: reader.size,\n stream: createCallbackScopedArchiveStream(\n reader,\n () => active,\n options.signal,\n ),\n uri: archive.uri,\n };\n return await runAbortableCallback(\n async () => await consume(content),\n options.signal,\n );\n } finally {\n active = false;\n try {\n await reader?.close();\n } finally {\n if (temporaryDirectory !== undefined)\n await rm(temporaryDirectory, { force: true, recursive: true });\n }\n }\n },\n options.signal === undefined ? {} : { signal: options.signal },\n );\n }, options.signal);\n }\n\n public async moveArchive(\n options: WikiGraphLibraryMoveArchiveOptions,\n ): Promise<WikiGraphLibraryArchiveSnapshot> {\n return toArchiveSnapshot(\n await this.#runtime.run(\n async () =>\n await moveWikiGraphLibraryArchive({\n target: requireLibraryTarget(options.target),\n to: options.to,\n }),\n ),\n );\n }\n\n public async removeArchive(\n target: WikiGraphLibraryTarget,\n ): Promise<WikiGraphLibraryArchiveSnapshot> {\n return toArchiveSnapshot(\n await this.#runtime.run(\n async () =>\n await removeWikiGraphLibraryArchive({\n target: requireLibraryTarget(target),\n }),\n ),\n );\n }\n\n public async replaceArchive(\n options: WikiGraphLibraryReplaceArchiveOptions,\n ): Promise<WikiGraphLibraryArchiveSnapshot> {\n return toArchiveSnapshot(\n await this.#runtime.run(async () => {\n const target = requireLibraryTarget(options.target);\n const current = await getWikiGraphLibraryArchive(target);\n return await replaceWikiGraphLibraryArchive({\n additionalDerivedStateKeys:\n current.file === undefined\n ? []\n : [getNodeResourcePath(current.file)],\n inputFile: new NodeFile(\n await assertStandaloneWikiGraphArchivePath(options.inputPath),\n ),\n target,\n });\n }),\n );\n }\n\n public async indexState(\n target: WikiGraphLibraryTarget,\n ): Promise<WikiGraphLibraryIndexState> {\n return await this.#runtime.run(\n async () =>\n await readWikiGraphLibraryIndexState(requireLibraryTarget(target)),\n );\n }\n\n public async rebuildIndex(\n target: WikiGraphLibraryTarget,\n onProgress?: Parameters<typeof rebuildWikiGraphLibraryIndex>[1],\n ): Promise<WikiGraphLibraryIndexState> {\n return await this.#runtime.run(\n async () =>\n await rebuildWikiGraphLibraryIndex(\n requireLibraryTarget(target),\n onProgress,\n ),\n );\n }\n\n public async cleanIndex(\n target: WikiGraphLibraryTarget,\n ): Promise<WikiGraphLibraryIndexState> {\n return await this.#runtime.run(\n async () =>\n await cleanWikiGraphLibraryIndex(requireLibraryTarget(target)),\n );\n }\n\n public async getMetadata(\n target: WikiGraphLibraryTarget,\n ): Promise<Readonly<Record<string, unknown>>> {\n return await this.#runtime.run(\n async () =>\n await getWikiGraphLibraryMetadata(requireLibraryTarget(target)),\n );\n }\n\n public async replaceMetadata(\n target: WikiGraphLibraryTarget,\n value: Readonly<Record<string, unknown>>,\n ): Promise<Readonly<Record<string, unknown>>> {\n return await this.#runtime.run(\n async () =>\n await replaceWikiGraphLibraryMetadata(\n requireLibraryTarget(target),\n value,\n ),\n );\n }\n\n public async putMetadata(\n target: WikiGraphLibraryTarget,\n key: string,\n value: unknown,\n ): Promise<Readonly<Record<string, unknown>>> {\n return await this.#runtime.run(\n async () =>\n await putWikiGraphLibraryMetadata(\n requireLibraryTarget(target),\n key,\n value,\n ),\n );\n }\n\n public async deleteMetadata(\n target: WikiGraphLibraryTarget,\n key: string,\n ): Promise<Readonly<Record<string, unknown>>> {\n return await this.#runtime.run(\n async () =>\n await deleteWikiGraphLibraryMetadataKey(\n requireLibraryTarget(target),\n key,\n ),\n );\n }\n\n public async clearMetadata(\n target: WikiGraphLibraryTarget,\n ): Promise<Readonly<Record<string, unknown>>> {\n return await this.#runtime.run(\n async () =>\n await clearWikiGraphLibraryMetadata(requireLibraryTarget(target)),\n );\n }\n\n public async search(\n target: WikiGraphLibraryTarget,\n query: string,\n options: WikiGraphLibrarySearchOptions = {},\n ): Promise<ArchiveFindPage> {\n const result = await this.#runtime.run(async () => {\n const embeddingProvider = await resolveQueryEmbeddingProvider(\n options.queryMode,\n );\n return await findWikiGraphLibraryObjects(\n requireLibraryTarget(target),\n query,\n {\n ...options,\n ...(embeddingProvider === undefined ? {} : { embeddingProvider }),\n },\n );\n });\n return createArchiveFindPage(\n result,\n async (cursor, nextOptions) =>\n await this.search(target, query, {\n ...options,\n cursor,\n ...(nextOptions.limit === undefined\n ? {}\n : { limit: nextOptions.limit }),\n ...(nextOptions.signal === undefined\n ? {}\n : { signal: nextOptions.signal }),\n }),\n (cursor) => Promise.resolve(cursor),\n () => Promise.resolve(),\n );\n }\n\n public async searchBuckets(\n target: WikiGraphLibraryTarget,\n query: string,\n options: WikiGraphLibraryBucketSearchOptions,\n ): Promise<{\n readonly buckets: readonly LibraryBucketPage[];\n readonly query: string;\n }> {\n const result = await this.#runtime.run(async () => {\n const embeddingProvider = await resolveQueryEmbeddingProvider(\n options.queryMode,\n );\n return await findWikiGraphLibraryObjectBuckets(\n requireLibraryTarget(target),\n query,\n {\n ...options,\n ...(embeddingProvider === undefined ? {} : { embeddingProvider }),\n },\n );\n });\n return {\n buckets: result.buckets.map((bucket) =>\n createLibraryBucketPage(\n bucket,\n async (cursor, nextOptions) =>\n await this.continueSearchBucket(target, cursor, {\n ...(nextOptions.limit === undefined\n ? {}\n : { limit: nextOptions.limit }),\n }),\n (cursor) => Promise.resolve(cursor),\n () => Promise.resolve(),\n ),\n ),\n query: result.query,\n };\n }\n\n public async continueSearchBucket(\n target: WikiGraphLibraryTarget,\n cursor: string,\n options: WikiGraphLibraryBucketContinuationOptions = {},\n ): Promise<LibraryBucketPage> {\n const result = await this.#runtime.run(async () => {\n const embeddingProvider = await resolveQueryEmbeddingProvider(undefined);\n return await continueWikiGraphLibraryObjectBucket(\n requireLibraryTarget(target),\n cursor,\n {\n ...options,\n ...(embeddingProvider === undefined ? {} : { embeddingProvider }),\n },\n );\n });\n return createLibraryBucketPage(\n result,\n async (nextCursor, nextOptions) =>\n await this.continueSearchBucket(target, nextCursor, {\n ...options,\n ...(nextOptions.limit === undefined\n ? {}\n : { limit: nextOptions.limit }),\n }),\n (cursor) => Promise.resolve(cursor),\n () => Promise.resolve(),\n );\n }\n\n public async searchArchiveMembers(\n target: WikiGraphLibraryTarget,\n query: string,\n options: WikiGraphLibrarySearchOptions = {},\n ): Promise<ArchiveFindPage> {\n const result = await this.#runtime.run(async () => {\n const embeddingProvider = await resolveQueryEmbeddingProvider(\n options.queryMode,\n );\n return await findWikiGraphLibraryArchiveMembers(\n requireLibraryTarget(target),\n query,\n {\n ...options,\n ...(embeddingProvider === undefined ? {} : { embeddingProvider }),\n },\n );\n });\n return createArchiveFindPage(\n result,\n async (cursor, nextOptions) =>\n await this.searchArchiveMembers(target, query, {\n ...options,\n cursor,\n ...(nextOptions.limit === undefined\n ? {}\n : { limit: nextOptions.limit }),\n ...(nextOptions.signal === undefined\n ? {}\n : { signal: nextOptions.signal }),\n }),\n (cursor) => Promise.resolve(cursor),\n () => Promise.resolve(),\n );\n }\n\n public async objects(\n target: WikiGraphLibraryTarget,\n options: ArchiveCollectionOptions = {},\n ): Promise<ArchiveCollectionPage> {\n const result = await this.#runtime.run(\n async () =>\n await listWikiGraphLibraryObjects(\n requireLibraryTarget(target),\n options,\n ),\n );\n return createArchiveCollectionPage(\n result,\n async (cursor, nextOptions) =>\n await this.objects(target, {\n ...options,\n cursor,\n ...(nextOptions.limit === undefined\n ? {}\n : { limit: nextOptions.limit }),\n }),\n (cursor) => Promise.resolve(cursor),\n () => Promise.resolve(),\n );\n }\n\n public async archiveMembers(\n target: WikiGraphLibraryTarget,\n options: ArchiveCollectionOptions = {},\n ): Promise<ArchiveCollectionPage> {\n const result = await this.#runtime.run(\n async () =>\n await listWikiGraphLibraryArchiveMembers(\n requireLibraryTarget(target),\n options,\n ),\n );\n return createArchiveCollectionPage(\n result,\n async (cursor, nextOptions) =>\n await this.archiveMembers(target, {\n ...options,\n cursor,\n ...(nextOptions.limit === undefined\n ? {}\n : { limit: nextOptions.limit }),\n }),\n (cursor) => Promise.resolve(cursor),\n () => Promise.resolve(),\n );\n }\n\n public async page(\n target: WikiGraphLibraryTarget,\n objectUri: string,\n options: WikiGraphLibraryPageOptions = {},\n ): Promise<ArchivePage> {\n return await this.#runtime.run(\n async () =>\n await withConfiguredWikimediaResolver(\n objectUri,\n async (wikimediaOptions) =>\n await readWikiGraphLibraryPage(\n requireLibraryTarget(target),\n objectUri,\n { ...options, ...wikimediaOptions },\n ),\n ),\n options.signal,\n );\n }\n\n public async related(\n target: WikiGraphLibraryTarget,\n objectUri: string,\n options: WikiGraphLibraryRelatedOptions = {},\n ): Promise<ArchiveRelatedPage> {\n const result = await this.#runtime.run(async () => {\n if (options.query === undefined && options.queryMode !== undefined) {\n throw new Error(\"`queryMode` requires `query`.\");\n }\n const embeddingProvider =\n options.query === undefined\n ? undefined\n : await resolveQueryEmbeddingProvider(options.queryMode);\n return await listRelatedWikiGraphLibraryObjects(\n requireLibraryTarget(target),\n objectUri,\n {\n ...options,\n ...(embeddingProvider === undefined ? {} : { embeddingProvider }),\n },\n );\n });\n return createArchiveRelatedPage(\n result,\n async (cursor, nextOptions) =>\n await this.related(target, objectUri, {\n ...options,\n cursor,\n ...(nextOptions.limit === undefined\n ? {}\n : { limit: nextOptions.limit }),\n ...(nextOptions.signal === undefined\n ? {}\n : { signal: nextOptions.signal }),\n }),\n (cursor) => Promise.resolve(cursor),\n () => Promise.resolve(),\n );\n }\n\n public async evidence(\n target: WikiGraphLibraryTarget,\n objectUri: string,\n options: WikiGraphLibraryEvidenceOptions = {},\n ): Promise<ArchiveEvidencePage> {\n const result = await this.#runtime.run(async () => {\n if (options.query === undefined && options.queryMode !== undefined) {\n throw new Error(\"`queryMode` requires `query`.\");\n }\n const embeddingProvider =\n options.query === undefined\n ? undefined\n : await resolveQueryEmbeddingProvider(options.queryMode);\n return await listWikiGraphLibraryEvidence(\n requireLibraryTarget(target),\n objectUri,\n {\n ...options,\n ...(embeddingProvider === undefined ? {} : { embeddingProvider }),\n },\n );\n });\n return createArchiveEvidencePage(\n result,\n async (cursor, nextOptions) =>\n await this.evidence(target, objectUri, {\n ...options,\n cursor,\n ...(nextOptions.limit === undefined\n ? {}\n : { limit: nextOptions.limit }),\n ...(nextOptions.signal === undefined\n ? {}\n : { signal: nextOptions.signal }),\n }),\n (cursor) => Promise.resolve(cursor),\n () => Promise.resolve(),\n );\n }\n\n public async pack(\n target: WikiGraphLibraryTarget,\n objectUri: string,\n budget = 5_000,\n ): Promise<ArchivePack> {\n return await this.#runtime.run(\n async () =>\n await packWikiGraphLibraryContext(\n requireLibraryTarget(target),\n objectUri,\n budget,\n ),\n );\n }\n\n public async list(): Promise<readonly WikiGraphLibrary[]> {\n const records = await this.#runtime.run(\n async () => await listWikiGraphLibraries(),\n );\n return records.map((record) => new WikiGraphLibrary(this.#runtime, record));\n }\n}\n\nexport class WikiGraphLibrary {\n readonly #runtime: WikiGraphJobRuntime;\n readonly #record: WikiGraphLibraryRecord;\n\n public constructor(\n runtime: WikiGraphJobRuntime,\n record: WikiGraphLibraryRecord,\n ) {\n this.#runtime = runtime;\n this.#record = record;\n }\n\n public get snapshot(): WikiGraphLibrarySnapshot {\n return toLibrarySnapshot(this.#record);\n }\n\n public get uri(): string {\n return formatWikiGraphLibraryUri(\n this.#record.isDefault ? undefined : this.#record.publicId,\n );\n }\n\n public async archives(): Promise<readonly WikiGraphLibraryArchiveSnapshot[]> {\n const target = requireLibraryTarget(this.uri);\n return (\n await this.#runtime.run(\n async () => await listWikiGraphLibraryArchives(target),\n )\n ).map(toArchiveSnapshot);\n }\n\n public async scan(): Promise<WikiGraphLibraryScanSnapshot> {\n const target = requireLibraryTarget(this.uri);\n return toScanSnapshot(\n await this.#runtime.run(async () => await scanWikiGraphLibrary(target)),\n );\n }\n\n public async remove(): Promise<WikiGraphLibrarySnapshot> {\n const target = requireLibraryTarget(this.uri);\n return toLibrarySnapshot(\n await this.#runtime.run(async () => await removeWikiGraphLibrary(target)),\n );\n }\n}\n\nfunction toLibrarySnapshot(\n record: WikiGraphLibraryRecord,\n): WikiGraphLibrarySnapshot {\n const compatible = record as WikiGraphLibraryRecord & {\n readonly folderPath?: string;\n };\n return {\n id: record.id,\n publicId: record.publicId,\n uri: record.uri,\n folderPath:\n compatible.folderPath ??\n (record.folder === undefined ? \"\" : getNodeResourcePath(record.folder)),\n isDefault: record.isDefault,\n createdAt: record.createdAt,\n updatedAt: record.updatedAt,\n };\n}\n\nfunction toArchiveSnapshot(\n record: WikiGraphLibraryArchiveRecord,\n): WikiGraphLibraryArchiveSnapshot {\n const { file: _file, directory: _directory, ...snapshot } = record;\n return snapshot;\n}\n\nfunction toScanSnapshot(\n result: WikiGraphLibraryScanResult,\n): WikiGraphLibraryScanSnapshot {\n return {\n ...(result.library === undefined\n ? {}\n : { library: toLibrarySnapshot(result.library) }),\n archives: result.archives.map(toArchiveSnapshot),\n };\n}\n\nfunction requireLibraryTarget(\n value: WikiGraphLibraryTarget,\n): ParsedWikiGraphLibraryUri {\n if (typeof value !== \"string\") return value;\n const target = parseWikiGraphLibraryUri(value);\n if (target === undefined) {\n throw new TypeError(`Invalid Wiki Graph library URI: ${value}`);\n }\n return target;\n}\n\nfunction requireLibraryArchiveTarget(\n value: WikiGraphLibraryTarget,\n): ParsedWikiGraphLibraryUri & { readonly kind: \"archive\" } {\n const target = requireLibraryTarget(value);\n if (\n target.kind !== \"archive\" ||\n target.archivePublicId === undefined ||\n target.objectUri !== undefined\n ) {\n throw new TypeError(\"Expected a Wiki Graph library archive URI.\");\n }\n return target as ParsedWikiGraphLibraryUri & { readonly kind: \"archive\" };\n}\n\nfunction requireReadableLibraryArchiveFile(\n archive: WikiGraphLibraryArchiveRecord,\n): NonNullable<\n | WikiGraphLibraryArchiveRecord[\"file\"]\n | WikiGraphLibraryArchiveRecord[\"directory\"]\n> {\n if (!archive.exists || archive.status === \"missing\") {\n throw new Error(`Wiki Graph library archive is missing: ${archive.uri}`);\n }\n if (archive.status === \"conflict\") {\n throw new Error(\n `Wiki Graph library archive has a conflict and cannot be read: ${archive.uri}`,\n );\n }\n if (archive.file === undefined && archive.directory === undefined) {\n throw new Error(\n `Wiki Graph library archive is unavailable: ${archive.uri}`,\n );\n }\n return archive.file ?? archive.directory!;\n}\n\nconst ARCHIVE_STREAM_CHUNK_SIZE = 64 * 1024;\n\nfunction createCallbackScopedArchiveStream(\n reader: FileReader,\n isActive: () => boolean,\n signal: AbortSignal | undefined,\n): AsyncIterable<Uint8Array> {\n let consumed = false;\n\n return {\n [Symbol.asyncIterator]() {\n assertArchiveReadSessionActive(isActive, signal);\n if (consumed) {\n throw new Error(\n \"The library archive stream has already been consumed.\",\n );\n }\n consumed = true;\n let offset = 0;\n let finished = false;\n\n return {\n async next(): Promise<IteratorResult<Uint8Array>> {\n if (finished) return { done: true, value: undefined };\n assertArchiveReadSessionActive(isActive, signal);\n if (offset >= reader.size) {\n finished = true;\n return { done: true, value: undefined };\n }\n\n const length = Math.min(\n ARCHIVE_STREAM_CHUNK_SIZE,\n reader.size - offset,\n );\n const chunk = await reader.read(offset, length);\n assertArchiveReadSessionActive(isActive, signal);\n offset += chunk.byteLength;\n return { done: false, value: chunk };\n },\n return(): Promise<IteratorResult<Uint8Array>> {\n finished = true;\n return Promise.resolve({ done: true, value: undefined });\n },\n };\n },\n };\n}\n\nfunction assertArchiveReadSessionActive(\n isActive: () => boolean,\n signal: AbortSignal | undefined,\n): void {\n if (!isActive()) {\n throw new Error(\n \"The library archive stream cannot be read after its callback has finished.\",\n );\n }\n throwIfAborted(signal);\n}\n\nasync function runAbortableCallback<T>(\n operation: () => Promise<T>,\n signal: AbortSignal | undefined,\n): Promise<T> {\n if (signal === undefined) return await operation();\n throwIfAborted(signal);\n\n let rejectAbort!: (reason: unknown) => void;\n const aborted = new Promise<never>((_resolve, reject) => {\n rejectAbort = reject;\n });\n const onAbort = (): void => rejectAbort(abortReason(signal));\n signal.addEventListener(\"abort\", onAbort, { once: true });\n try {\n return await Promise.race([operation(), aborted]);\n } finally {\n signal.removeEventListener(\"abort\", onAbort);\n }\n}\n\nfunction throwIfAborted(signal: AbortSignal | undefined): void {\n if (signal?.aborted === true) throw abortReason(signal);\n}\n\nfunction abortReason(signal: AbortSignal): unknown {\n return (\n signal.reason ??\n new DOMException(\"The operation was aborted.\", \"AbortError\")\n );\n}\n","import {\n migrateLegacySdpubToWikg,\n parseWikiGraphLibraryUri,\n upgradeWikiGraphMaintenanceTarget,\n type WikiGraphMaintenanceUpgradeResult,\n} from \"wiki-graph-core\";\nimport { basename } from \"path\";\n\nimport type { WikiGraphJobRuntime } from \"./jobs.js\";\nimport { NodeFile } from \"./node-platform.js\";\nimport { resolveWikiGraphRuntimePath } from \"./runtime-path.js\";\nimport {\n assertStandaloneWikiGraphArchivePath,\n rethrowArchiveSchemaError,\n} from \"./archive/target.js\";\n\nexport type WikiGraphMaintenanceTarget =\n | { readonly kind: \"archive\"; readonly path: string }\n | { readonly kind: \"home\" }\n | { readonly kind: \"library\"; readonly uri: string };\n\nexport interface WikiGraphLegacyMigrationResult {\n readonly inputPath: string;\n readonly outputPath: string;\n}\n\nexport class WikiGraphMaintenanceManager {\n readonly #runtime: WikiGraphJobRuntime;\n\n public constructor(runtime: WikiGraphJobRuntime) {\n this.#runtime = runtime;\n }\n\n public async upgrade(\n target: WikiGraphMaintenanceTarget,\n ): Promise<WikiGraphMaintenanceUpgradeResult> {\n return await this.#runtime.run(\n async () => {\n if (target.kind === \"home\") {\n return await upgradeWikiGraphMaintenanceTarget({ kind: \"home\" });\n }\n if (target.kind === \"library\") {\n const parsed = parseWikiGraphLibraryUri(target.uri);\n if (parsed === undefined || parsed.kind === \"archive\") {\n throw new Error(\n `Invalid Wiki Graph library upgrade target: ${target.uri}`,\n );\n }\n return await upgradeWikiGraphMaintenanceTarget({\n kind: \"library\",\n target: parsed,\n });\n }\n const path = await assertStandaloneWikiGraphArchivePath(target.path);\n return await upgradeWikiGraphMaintenanceTarget({\n file: new NodeFile(path),\n kind: \"archive\",\n }).catch((error: unknown) =>\n rethrowArchiveSchemaError(error, { kind: \"standalone\", path }),\n );\n },\n undefined,\n { skipHomeBootstrap: target.kind === \"home\" },\n );\n }\n\n public async migrateLegacy(\n inputPath: string,\n outputPath = defaultWikgOutputPath(inputPath),\n ): Promise<WikiGraphLegacyMigrationResult> {\n return await this.#runtime.run(async () => {\n const resolvedInputPath = resolveWikiGraphRuntimePath(inputPath);\n const resolvedOutputPath = resolveWikiGraphRuntimePath(outputPath);\n await migrateLegacySdpubToWikg(\n new NodeFile(resolvedInputPath),\n new NodeFile(resolvedOutputPath, basename(resolvedOutputPath)),\n );\n return {\n inputPath: resolvedInputPath,\n outputPath: resolvedOutputPath,\n };\n });\n }\n}\n\nfunction defaultWikgOutputPath(inputPath: string): string {\n return inputPath.toLowerCase().endsWith(\".sdpub\")\n ? `${inputPath.slice(0, -\".sdpub\".length)}.wikg`\n : `${inputPath}.wikg`;\n}\n","import { ensureWikiGraphHomeSchemaCurrent } from \"wiki-graph-core\";\n\nimport { WikiGraphArchiveManager } from \"./archive/index.js\";\nimport { WikiGraphConversionManager } from \"./conversions.js\";\nimport { WikiGraphConfigManager } from \"./config.js\";\nimport { WikiGraphContinuationManager } from \"./continuations.js\";\nimport { WikiGraphJobManager, type WikiGraphJobRuntime } from \"./jobs.js\";\nimport { WikiGraphLibraryManager } from \"./libraries.js\";\nimport { WikiGraphMaintenanceManager } from \"./maintenance.js\";\nimport {\n assertWikiGraphSDKHostOptions,\n prepareWikiGraphSDKHost,\n withWikiGraphSDKHost,\n type WikiGraphSDKHost,\n} from \"./host.js\";\nimport {\n withWikiGraphSDKRuntimeContext,\n type WikiGraphSDKEnvPolicy,\n type WikiGraphSDKRuntimeContext,\n} from \"./runtime-context.js\";\nimport type { WikiGraphSDKProviders } from \"./providers.js\";\n\nexport interface WikiGraphSDKOptions {\n readonly cwd?: string;\n readonly env?: NodeJS.ProcessEnv;\n readonly envPolicy?: WikiGraphSDKEnvPolicy;\n readonly host?: WikiGraphSDKHost;\n readonly providers?: WikiGraphSDKProviders;\n readonly stateDir?: string;\n}\n\nexport class WikiGraphSDK implements WikiGraphJobRuntime {\n readonly #context: WikiGraphSDKRuntimeContext;\n public readonly archives: WikiGraphArchiveManager;\n public readonly conversions: WikiGraphConversionManager;\n public readonly config: WikiGraphConfigManager;\n public readonly continuations: WikiGraphContinuationManager;\n public readonly jobs: WikiGraphJobManager;\n public readonly libraries: WikiGraphLibraryManager;\n public readonly maintenance: WikiGraphMaintenanceManager;\n\n public constructor(options: WikiGraphSDKOptions = {}) {\n assertWikiGraphSDKHostOptions(options);\n prepareWikiGraphSDKHost(options.host);\n this.#context = {\n cwd: options.cwd ?? process.cwd(),\n env: { ...process.env, ...options.env },\n envPolicy: options.envPolicy ?? \"production\",\n ...(options.host === undefined ? {} : { host: options.host }),\n providers: { ...options.providers },\n ...(options.stateDir === undefined ? {} : { stateDir: options.stateDir }),\n };\n this.archives = new WikiGraphArchiveManager(this);\n this.conversions = new WikiGraphConversionManager(this);\n this.config = new WikiGraphConfigManager(this);\n this.continuations = new WikiGraphContinuationManager(this);\n this.jobs = new WikiGraphJobManager(this);\n this.libraries = new WikiGraphLibraryManager(this);\n this.maintenance = new WikiGraphMaintenanceManager(this);\n }\n\n public async run<T>(\n operation: () => Promise<T> | T,\n signal?: AbortSignal,\n options: { readonly skipHomeBootstrap?: boolean } = {},\n ): Promise<T> {\n throwIfAborted(signal);\n const runWithContext = async (): Promise<T> =>\n await withWikiGraphSDKRuntimeContext(this.#context, async () => {\n if (options.skipHomeBootstrap !== true) {\n await ensureWikiGraphHomeSchemaCurrent();\n }\n return await operation();\n });\n const result = await withWikiGraphSDKHost(\n {\n ...(this.#context.host === undefined\n ? {}\n : { host: this.#context.host }),\n ...(this.#context.stateDir === undefined\n ? {}\n : { stateDir: this.#context.stateDir }),\n },\n runWithContext,\n );\n throwIfAborted(signal);\n return result;\n }\n\n public close(): void {\n this.jobs.close();\n }\n}\n\nfunction throwIfAborted(signal: AbortSignal | undefined): void {\n if (signal?.aborted !== true) return;\n throw signal.reason instanceof Error\n ? signal.reason\n : new Error(\"The Wiki Graph SDK operation was aborted.\");\n}\n\nexport function createWikiGraphSDK(\n options: WikiGraphSDKOptions = {},\n): WikiGraphSDK {\n return new WikiGraphSDK(options);\n}\n","export * from \"./archive/index.js\";\nexport * from \"./config.js\";\nexport * from \"./continuations.js\";\nexport * from \"./conversions.js\";\nexport * from \"./default-worker.js\";\nexport * from \"./entry-context.js\";\nexport * from \"./embedding.js\";\nexport * from \"./jobs.js\";\nexport type { WikiGraphSDKHost } from \"./host.js\";\nexport * from \"./libraries.js\";\nexport * from \"./local-config.js\";\nexport * from \"./pages.js\";\nexport * from \"./result-pages.js\";\nexport * from \"./llm.js\";\nexport * from \"./maintenance.js\";\nexport * from \"./node-platform.js\";\nexport * from \"./planning.js\";\nexport * from \"./providers.js\";\nexport * from \"./runtime-context.js\";\nexport * from \"./runtime-config.js\";\nexport * from \"./sdk.js\";\nexport * from \"./stage.js\";\nexport * from \"./wikispine.js\";\n// Curated Core surface used by the Node delivery API. Keep this list explicit:\n// the SDK is not a second wildcard entry point for wiki-graph-core.\nexport {\n LLMPaymentRequiredError,\n WIKI_GRAPH_URI_PREFIX,\n WikiGraphError,\n WikiGraphSchemaVersionError,\n type WikiGraphSchemaVersionErrorInfo,\n type SchemaVersionTarget,\n isWikiGraphSchemaVersionError,\n formatError,\n formatLocatedChapterResourceUri,\n formatLocatedChapterSourceCollectionUri,\n formatLocatedChapterUri,\n formatLocatedWikiGraphUri,\n formatSourceArtifactUri,\n formatSourceLocatorFragment,\n formatWikiGraphCommandUri,\n formatWikiGraphLibraryUri,\n isWikiGraphJobUri,\n isWikiGraphUri,\n isSourceLocatorScopeUri,\n isWikiGraphLibraryUri,\n parseChapterPath,\n parseChapterTreeInput,\n parseChapterUriPath,\n parseLocatedWikiGraphUri,\n parseSourceTextJsonl,\n parseSourceLocatorFragment,\n parseWikiGraphLibraryUri,\n parseWikiGraphUriSyntax,\n requireArchiveUri,\n requireLocatedObjectOrArchiveUri,\n requireLocatedObjectUri,\n} from \"wiki-graph-core\";\nexport type {\n ArchiveBacklinkBucket,\n ArchiveBacklinks,\n ArchiveCollectionOptions,\n ArchiveCollectionResult,\n ArchiveEvidence,\n ArchiveEvidenceItem,\n ArchiveFindEvidencePreview,\n ArchiveFindHit,\n ArchiveSearchMatch,\n ArchiveFindOptions,\n ArchiveFindResult,\n ArchiveListItem,\n ArchivePack,\n ArchivePage,\n ArchiveRelatedResult,\n ArchiveSourceLocator,\n ArchiveSourceLocatorResult,\n ArchiveTriplePattern,\n BookMeta,\n SourceArtifactInput,\n BuildJobEvent,\n BuildJobProgressCounter,\n BuildJobTarget,\n ChapterDetails,\n ChapterEntry,\n ChapterStage,\n ChapterTree,\n ChapterTreeApplyResult,\n ContinuationCursor,\n IndexArtifactKind,\n LocatedWikiGraphUri,\n ParsedWikiGraphLibraryUri,\n ParsedWikiGraphUri,\n QueryIndexScope,\n SearchIndexEmbeddingProvider,\n SearchIndexQueryMode,\n ParsedSourceLocatorFragment,\n Directory,\n File,\n FileReader,\n FileWriter,\n ReadonlyFile,\n WikiGraphPlatform,\n WikiGraphStorage,\n WikiGraphLLMOptions,\n WikiGraphLibraryIndexState,\n WikiGraphMaintenanceUpgradeResult,\n WikiGraphProgressCallback,\n WikiGraphProgressEvent,\n WikispineProvider,\n} from \"wiki-graph-core\";\nexport type {\n WikiGraphObjectIdentity,\n WikiGraphScopeIdentity,\n WikiGraphObjectKind,\n WikiGraphObjectSummary,\n WikiGraphChunkSummary,\n WikiGraphEntitySummary,\n WikiGraphTripleSummary,\n WikiGraphSearchableKind,\n WikiGraphSearchableSummary,\n WikiGraphRetrievalSignals,\n} from \"wiki-graph-core\";\nexport type {\n WikiGraphObjectListItem,\n WikiGraphObjectDetails,\n} from \"wiki-graph-core\";\nexport type {\n WikiGraphScopeSummary,\n WikiGraphSourceSentenceSummary,\n WikiGraphSummarySentenceSummary,\n} from \"wiki-graph-core\";\nexport type {\n WikiGraphObject,\n WikiGraphArtifactDetails,\n WikiGraphChunkDetails,\n WikiGraphEntityDetails,\n WikiGraphTripleDetails,\n} from \"wiki-graph-core\";\nexport type {\n WikiGraphLibrarySource,\n WikiGraphLibrarySourceFields,\n WikiGraphChapterStateTarget,\n WikiGraphChapterStateValue,\n WikiGraphChapterState,\n} from \"wiki-graph-core\";\n"],"mappings":"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","names":["randomUUID","rename","rm","stat","basename","dirname","join","Readable","formatLocatedWikiGraphUri","isArchiveSearchIndexCurrent","listChapters","parseLocatedWikiGraphUri","WikiGraph","WikiGraphArchiveFile","WikiGraphDirectoryFile","rm","basename","process","resolve","open","read","content","AsyncLocalStorage","mkdir","join","homedir","formatError","homedir","isAbsolute","resolve","homedir","resolve","isAbsolute","stat","basename","dirname","join","resolve","resolve","dirname","join","basename","stat","rm","basename","createOpenAI","createOpenAICompatible","createOpenAI","createOpenAICompatible","createOpenAICompatibleName","join","dirname","basename","randomUUID","rename","formatLocatedWikiGraphUri","rm","location","parseLocatedWikiGraphUri","isArchiveSearchIndexCurrent","listChapters","result","WikiGraph","WikiGraphDirectoryFile","WikiGraphArchiveFile","stat","Readable","resolve","createContinuationCursor","findArchiveObjects","listArchiveCollection","listArchiveEvidence","listArchiveSourceLocators","listRelatedArchiveObjects","WikiGraphArchiveFile","WikiGraphDirectoryFile","createContinuationCursor","read","listArchiveSourceLocators","listArchiveCollection","findArchiveObjects","listArchiveEvidence","listRelatedArchiveObjects","WikiGraphDirectoryFile","WikiGraphArchiveFile","openWikimediaResolver","WikiGraphArchiveFile","applyChapterJobArtifactFile","createLocalChapterJobFileExecutor","writeChapterJobInputFile","resolveChapterPathReadonly","WikiGraphArchiveFile","installWikiGraphPlatform","withWikiGraphStorage","installWikiGraphPlatform","withWikiGraphStorage","applyChapterJobArtifactFile","writeChapterJobInputFile","WikiGraphArchiveFile","writeChapterJobInputFile","applyChapterJobArtifactFile","openWikimediaResolver","createLocalChapterJobFileExecutor","formatLocatedChapterUri","getBuildJob","listChapters","resolveChapterPathReadonly","WikiGraphArchiveFile","getBuildJob","WikiGraphArchiveFile","listChapters","formatLocatedChapterUri","resolveChapterPathReadonly","resolve","ensureWikiGraphArchiveSchemaCurrent","findWikiGraphLibraryObjects","findWikiGraphLibraryArchiveMembers","formatWikiGraphLibraryUri","listRelatedWikiGraphLibraryObjects","listWikiGraphLibraryArchiveMembers","listWikiGraphLibraryEvidence","listWikiGraphLibraryObjects","parseWikiGraphLibraryUri","resolveWikiGraphLibrary","writeWikgArchive","mkdir","mkdtemp","rm","tmpdir","join","mkdir","formatWikiGraphLibraryUri","resolveWikiGraphLibrary","ensureWikiGraphArchiveSchemaCurrent","mkdtemp","join","tmpdir","writeWikgArchive","rm","findWikiGraphLibraryObjects","cursor","findWikiGraphLibraryArchiveMembers","listWikiGraphLibraryObjects","listWikiGraphLibraryArchiveMembers","listRelatedWikiGraphLibraryObjects","listWikiGraphLibraryEvidence","parseWikiGraphLibraryUri","parseWikiGraphLibraryUri","basename","parseWikiGraphLibraryUri","basename","throwIfAborted","WikiGraphSchemaVersionError","isWikiGraphSchemaVersionError","formatError","formatLocatedChapterUri","formatLocatedWikiGraphUri","formatWikiGraphLibraryUri","isSourceLocatorScopeUri","parseLocatedWikiGraphUri","parseWikiGraphLibraryUri"]}
|