wiki-graph-sdk 0.7.0 → 0.7.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.
@@ -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/runtime-path.ts","../src/query-runtime.ts","../src/embedding.ts","../src/archive/inspect.ts","../src/planning.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 assertNoActiveBuildJobConflicts,\n assertNoActiveBuildJobs,\n deleteArchiveSearchSessions,\n DirectoryDocument,\n finalizeWikiGraphLibraryArchiveWrite,\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 parseWikiGraphLibraryUri,\n readArchivePage,\n readSearchIndexCapabilityStatus,\n readWikiGraphLibraryIndexState,\n rebuildArchiveSearchIndex,\n rebuildWikiGraphLibraryIndex,\n removeChapter,\n resetChapter,\n resolveChapterPathReadonly,\n resolveWikiGraphLibraryArchiveFile,\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 ArchiveEvidence,\n type ArchiveFindOptions,\n type ArchiveFindResult,\n type ArchivePack,\n type ArchivePage,\n type ArchiveRelatedResult,\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 ParsedWikiGraphLibraryUri,\n type QueryIndexScope,\n type ReadonlyDocument,\n type SearchIndexEmbeddingProvider,\n type WikiGraphProgressCallback,\n} from \"wiki-graph-core\";\n\nimport type { WikiGraphJobRuntime } from \"../jobs.js\";\nimport { WikiGraphConversionManager } from \"../conversions.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 createWikiGraphArchiveInspectReport,\n type WikiGraphArchiveInspectReport,\n} from \"./inspect.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 WikiGraphArchiveLocation {\n readonly archiveFile: File;\n readonly archiveKey: string;\n readonly archivePath: string;\n readonly indexScope: QueryIndexScope;\n readonly libraryArchiveTarget?: ParsedWikiGraphLibraryUri;\n readonly libraryDirtyTarget?: ParsedWikiGraphLibraryUri;\n readonly locatedUri: string;\n readonly publicArchiveUri?: string;\n}\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 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 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 = resolveWikiGraphRuntimePath(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 uriOrPath: string,\n options: WikiGraphOperationOptions = {},\n ): Promise<WikiGraphArchiveHandle> {\n const location = await this.#runtime.run(\n async () => await resolveWikiGraphArchiveLocation(uriOrPath),\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(\n runtime: WikiGraphJobRuntime,\n location: WikiGraphArchiveLocation,\n ) {\n this.#runtime = runtime;\n this.#location = location;\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 async inspect(\n options: WikiGraphOperationOptions & { readonly chapterId?: number } = {},\n ): Promise<WikiGraphArchiveInspectReport> {\n return await this.#readDocument(\n async (document) =>\n await createWikiGraphArchiveInspectReport(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<ArchiveFindResult> {\n const embeddingProvider = await this.#runtime.run(\n createConfiguredEmbeddingProvider,\n options.signal,\n );\n return await this.#writeDocument(\n async (document) => {\n const chapters = await this.#resolveQueryChapters(document, options);\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 }\n\n public async list(\n options: WikiGraphArchiveListOptions = {},\n ): Promise<ArchiveCollectionResult | ArchiveSourceLocatorResult> {\n return 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 }\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 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 ...withoutOperation(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<ArchiveRelatedResult> {\n if (options.query === undefined) {\n return 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 }\n const embeddingProvider = await this.#runtime.run(\n createConfiguredEmbeddingProvider,\n options.signal,\n );\n return await this.#writeDocument(\n async (document) => {\n const chapters = await this.#resolveQueryChapters(document, options);\n await ensureArchiveSearchIndex(document, {\n ...(chapters === undefined ? {} : { chapters }),\n ...(embeddingProvider === undefined ? {} : { embeddingProvider }),\n });\n return await listRelatedArchiveObjects(document, objectUri, {\n ...withoutOperation(options),\n ...(chapters === undefined ? {} : { chapters }),\n });\n },\n {\n searchIndexWritebackPolicy: \"cache\",\n ...(options.signal === undefined ? {} : { signal: options.signal }),\n },\n );\n }\n\n public async evidence(\n objectUri = this.objectUri,\n options: WikiGraphArchiveEvidenceOptions = {},\n ): Promise<ArchiveEvidence> {\n if (options.query === undefined) {\n return 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 }\n const embeddingProvider = await this.#runtime.run(\n createConfiguredEmbeddingProvider,\n options.signal,\n );\n return await this.#writeDocument(\n async (document) => {\n const chapters = await this.#resolveQueryChapters(document, options);\n await ensureArchiveSearchIndex(document, {\n ...(chapters === undefined ? {} : { chapters }),\n ...(embeddingProvider === undefined ? {} : { embeddingProvider }),\n });\n return await listArchiveEvidence(document, objectUri, {\n ...withoutOperation(options),\n ...(chapters === undefined ? {} : { chapters }),\n });\n },\n {\n searchIndexWritebackPolicy: \"cache\",\n ...(options.signal === undefined ? {} : { signal: options.signal }),\n },\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 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 const result = await new WikiGraphArchiveFile(\n this.#location.archiveFile,\n ).write(operation, {\n ...(options.searchIndexWritebackPolicy === undefined\n ? {}\n : {\n searchIndexWritebackPolicy: options.searchIndexWritebackPolicy,\n }),\n });\n if (options.refreshLibraryIndex !== false) {\n await this.#refreshLibraryIndex(options.onIndexSyncError);\n }\n return result;\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 skipUnindexed?: boolean;\n },\n ): Promise<readonly number[] | undefined> {\n const chapters = await this.#resolveScope(document, options);\n if (options.skipUnindexed !== true) return chapters;\n const queryable = await listArchiveQueryableChapterIds(document, {\n ...(chapters === undefined ? {} : { chapters }),\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 #refreshLibraryIndex(\n onError: ((error: unknown) => void) | undefined,\n ): Promise<void> {\n if (this.#location.libraryDirtyTarget === undefined) return;\n if (this.#location.libraryArchiveTarget !== undefined) {\n await finalizeWikiGraphLibraryArchiveWrite({\n target: this.#location.libraryArchiveTarget,\n });\n }\n try {\n const state = await readWikiGraphLibraryIndexState(\n this.#location.libraryDirtyTarget,\n );\n if (state.status !== \"missing\") {\n await rebuildWikiGraphLibraryIndex(this.#location.libraryDirtyTarget);\n }\n } catch (error) {\n onError?.(error);\n }\n }\n}\n\nexport async function resolveWikiGraphArchiveLocation(\n uriOrPath: string,\n): Promise<WikiGraphArchiveLocation> {\n if (!uriOrPath.startsWith(\"wikg://\")) {\n return createPathLocation(resolveWikiGraphRuntimePath(uriOrPath));\n }\n const parsed = parseLocatedWikiGraphUri(uriOrPath);\n const portableArchiveLocator = parsed.archivePath ?? uriOrPath;\n const archiveLocator = portableArchiveLocator.startsWith(\"wikg://lib/\")\n ? portableArchiveLocator\n : resolveWikiGraphRuntimePath(portableArchiveLocator);\n const libraryArchiveTarget = archiveLocator.startsWith(\"wikg://lib/\")\n ? parseWikiGraphLibraryUri(archiveLocator)\n : undefined;\n const archiveFile =\n libraryArchiveTarget?.kind === \"archive\"\n ? await resolveWikiGraphLibraryArchiveFile(archiveLocator)\n : new NodeFile(archiveLocator);\n const archivePath = getNodeResourcePath(archiveFile);\n return {\n archiveFile,\n archiveKey: archivePath,\n archivePath,\n indexScope: { archiveKey: archivePath, archivePath, kind: \"archive-index\" },\n ...(libraryArchiveTarget?.kind === \"archive\"\n ? {\n libraryArchiveTarget,\n libraryDirtyTarget: {\n isDefault: libraryArchiveTarget.isDefault,\n kind: \"scope\" as const,\n ...(libraryArchiveTarget.publicId === undefined\n ? {}\n : { publicId: libraryArchiveTarget.publicId }),\n },\n publicArchiveUri: portableArchiveLocator,\n }\n : {}),\n locatedUri: formatLocatedWikiGraphUri(archivePath, parsed.objectUri),\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\nfunction createPathLocation(path: string): WikiGraphArchiveLocation {\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),\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 { rm } from \"fs/promises\";\n\nimport {\n WikiGraph,\n type ChapterStage,\n type WikiGraphArchive,\n type WikiGraphProgressCallback,\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 type { WikiGraphJobRuntime } from \"./jobs.js\";\nimport { resolveWikiGraphRuntimePath } from \"./runtime-path.js\";\n\nexport type WikiGraphConversionFormat = \"epub\" | \"markdown\" | \"txt\" | \"wikg\";\nexport type WikiGraphSourceFormat = Exclude<WikiGraphConversionFormat, \"wikg\">;\n\nexport type WikiGraphConversionInput =\n | { readonly format: WikiGraphConversionFormat; readonly path: string }\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 llmJSON?: string;\n readonly onProgress?: WikiGraphProgressCallback;\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 inputFormat: WikiGraphConversionFormat;\n readonly outputFormat: WikiGraphConversionFormat;\n readonly outputPath: string;\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.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 config = await loadWikiGraphRuntimeConfig({\n ...(options.llmJSON === undefined ? {} : { llmJSON: options.llmJSON }),\n });\n const app = new WikiGraph({\n ...(options.verbose === true ? { verbose: true } : {}),\n ...(requiresLLM ? { llm: buildWikiGraphLLMOptions(config) } : {}),\n });\n const documentDirectory = await prepareDigestDirectory(\n options.digestDirectory,\n requiresDigest,\n );\n const write = async (archive: WikiGraphArchive): Promise<void> => {\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(resolveWikiGraphRuntimePath(options.input.path)),\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 === \"markdown\") {\n await app.digestMarkdownSession(digestOptions, write);\n } else {\n await app.digestTxtSession(digestOptions, write);\n }\n }\n\n return {\n inputFormat: options.input.format,\n outputFormat: options.output.format,\n outputPath: options.output.path,\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 file = new NodeFile(resolveWikiGraphRuntimePath(path));\n if (format === \"epub\") await archive.exportEpub(file);\n else if (format === \"wikg\") await archive.saveAs(file);\n else await archive.exportText(file);\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 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 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\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 function createNodeWikiGraphStorage(\n stateRoot = pathModule.join(os.homedir(), \".wikigraph\"),\n): WikiGraphStorage {\n return {\n library: new NodeDirectory(stateRoot),\n documentStore: new NodeDirectory(pathModule.join(stateRoot, \"documents\")),\n };\n}\n\nexport function installNodeWikiGraphPlatform(stateRoot?: string): void {\n installWikiGraphPlatform(nodeWikiGraphPlatform);\n installWikiGraphStorage(createNodeWikiGraphStorage(stateRoot));\n}\n\nexport function ensureNodeWikiGraphPlatform(): void {\n installWikiGraphPlatform(nodeWikiGraphPlatform);\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 HostedProviderScope = \"wg-wikimedia\" | \"wikispine\";\n\ntype InlineLLMConfig = NonNullable<WikiGraphRuntimeConfig[\"llm\"]>;\n\nexport async function loadWikiGraphRuntimeConfig(options?: {\n readonly llmJSON?: string;\n}): Promise<WikiGraphRuntimeConfig> {\n const [embedding, localLLM, concurrent, wikimedia, wikispine] =\n await Promise.all([\n readLocalConfigSection(\"embeddings\"),\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 { 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 database = await openSharedStateDatabase(\n new NodeFile(\n join(\n getWikiGraphSDKStateDir() ?? join(homedir(), \".wikigraph\"),\n \"core.sqlite\",\n ),\n ),\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\nexport type WikiGraphSDKEnvPolicy = \"development\" | \"production\";\n\nexport interface WikiGraphSDKRuntimeContext {\n readonly cwd: string;\n readonly env: NodeJS.ProcessEnv;\n readonly envPolicy: WikiGraphSDKEnvPolicy;\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 }\n );\n}\n\nexport function getWikiGraphSDKStateDir(): string | undefined {\n return getWikiGraphSDKRuntimeContext().stateDir;\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 {\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\";\n\nexport async function createConfiguredEmbeddingProvider(): Promise<\n SearchIndexEmbeddingProvider | undefined\n> {\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 WikiGraphEmbeddingProvider = \"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?: WikiGraphEmbeddingProvider;\n}\n\nexport interface QueryEmbeddingResult {\n readonly dimensions: number;\n readonly embedding: readonly number[];\n readonly model: string;\n readonly provider: WikiGraphEmbeddingProvider;\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: WikiGraphEmbeddingProvider,\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: WikiGraphEmbeddingProvider,\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: WikiGraphEmbeddingProvider,\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: WikiGraphEmbeddingProvider,\n _config: WikiGraphEmbeddingConfig,\n): string {\n if (provider === \"openai\") {\n return \"openai\";\n }\n return \"openaiCompatible\";\n}\n\nfunction requireEmbeddingProvider(\n provider: WikiGraphEmbeddingProvider | undefined,\n): WikiGraphEmbeddingProvider {\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): WikiGraphEmbeddingProvider {\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 BuildJobTarget,\n type ChapterEntry,\n type IndexArtifactCoverageRecord,\n type ReadonlyDocument,\n} from \"wiki-graph-core\";\nimport {\n createGenerationPerformanceHints,\n DEFAULT_GENERATION_JOB_CONCURRENCY,\n DEFAULT_GENERATION_REQUEST_CONCURRENCY,\n formatGenerationPlanningModel,\n planGenerationTask,\n type GenerationPerformanceHint,\n type GenerationPlanningCost,\n} from \"../planning.js\";\nimport { loadWikiGraphRuntimeConfig } from \"../runtime-config.js\";\n\ninterface InspectChapter extends ChapterEntry {\n readonly knowledgeGraphReady: boolean;\n readonly readingGraphReady: boolean;\n readonly summaryReady: boolean;\n}\n\nexport interface WikiGraphArchiveInspectImprovement {\n readonly kind: \"add-source\" | \"build\" | \"sync-index\";\n readonly missingChapters?: number;\n readonly missingWords?: number;\n readonly planning?: GenerationPlanningCost;\n readonly recommendation: string;\n readonly task?: BuildJobTarget;\n readonly title: string;\n}\n\nexport interface WikiGraphArchiveInspectCoverage {\n readonly coveredChapters: number;\n readonly coveredWords: number;\n readonly percent: string;\n readonly totalChapters: number;\n readonly totalWords: number;\n}\n\nexport interface WikiGraphArchiveInspectChapterReference {\n readonly chapterId: number;\n readonly locatedUri: string;\n readonly title: string | null;\n readonly uri: string;\n}\n\nexport interface WikiGraphArchiveInspectReport {\n readonly archiveUri: string;\n readonly uri: string;\n readonly scope: {\n readonly chapterId?: number;\n readonly type: \"archive\" | \"chapter\";\n };\n readonly content: {\n readonly chapters: {\n readonly content: number;\n readonly planned: number;\n readonly total: number;\n };\n readonly sourceWords: number;\n readonly summaryWords: number;\n };\n readonly localIndexCache: {\n readonly blockedBy?: \"missing-search-artifacts\";\n readonly current: boolean;\n readonly impact?: string;\n readonly resource?: string;\n readonly status: \"blocked\" | \"current\" | \"missing-or-outdated\";\n readonly syncAvailable: boolean;\n };\n readonly coverage: {\n readonly ftsIndexArtifact: WikiGraphArchiveInspectCoverage;\n readonly knowledgeGraph: WikiGraphArchiveInspectCoverage;\n readonly readingGraph: WikiGraphArchiveInspectCoverage;\n readonly summary: WikiGraphArchiveInspectCoverage;\n readonly summaryEmbeddingIndexArtifact: WikiGraphArchiveInspectCoverage;\n readonly sourceEmbeddingIndexArtifact: WikiGraphArchiveInspectCoverage;\n };\n readonly query: {\n readonly ready: boolean;\n };\n readonly searchArtifacts: {\n readonly blockedChapters: readonly WikiGraphArchiveInspectChapterReference[];\n readonly ready: boolean;\n readonly resource?: string;\n readonly status: \"incomplete\" | \"ready\";\n };\n readonly retrievalGuidance: readonly string[];\n readonly improvements: readonly WikiGraphArchiveInspectImprovement[];\n readonly performanceHints: readonly GenerationPerformanceHint[];\n readonly summaryCoverageNote: string;\n}\n\nexport async function createWikiGraphArchiveInspectReport(\n document: ReadonlyDocument,\n options: {\n readonly archiveUri: string;\n readonly chapterId?: number;\n },\n): Promise<WikiGraphArchiveInspectReport> {\n const { archiveUri } = options;\n const [\n chapters,\n summaryWords,\n indexCacheCurrent,\n config,\n ftsArtifactCoverage,\n sourceEmbeddingArtifactCoverage,\n summaryEmbeddingArtifactCoverage,\n ] = await Promise.all([\n readInspectChapters(document, options.chapterId),\n readSummaryWords(document, options.chapterId),\n isArchiveSearchIndexCurrent(document),\n loadWikiGraphRuntimeConfig(),\n readIndexArtifactCoverage(document, \"fts\", options.chapterId),\n readIndexArtifactCoverage(document, \"embedding-source\", options.chapterId),\n readIndexArtifactCoverage(document, \"embedding-summary\", options.chapterId),\n ]);\n const selectedChapter =\n options.chapterId === undefined ? undefined : chapters[0];\n const scopeUri =\n selectedChapter === undefined\n ? archiveUri\n : formatInspectLocatedChapterUri(archiveUri, selectedChapter);\n const concurrent = {\n job: config.concurrent?.job ?? DEFAULT_GENERATION_JOB_CONCURRENCY,\n request:\n config.concurrent?.request ?? DEFAULT_GENERATION_REQUEST_CONCURRENCY,\n };\n const planningModel = formatGenerationPlanningModel(config.llm);\n const contentChapters = chapters.filter(\n (chapter) => chapter.stage !== \"planned\",\n );\n const sourceWords = sumWords(contentChapters);\n const readingGraphCovered = contentChapters.filter(\n (chapter) => chapter.readingGraphReady,\n );\n const knowledgeGraphCovered = contentChapters.filter(\n (chapter) => chapter.knowledgeGraphReady,\n );\n const summaryCovered = contentChapters.filter(\n (chapter) => chapter.summaryReady,\n );\n const ftsArtifactCovered = filterChaptersByCurrentIndexArtifact(\n contentChapters,\n ftsArtifactCoverage,\n );\n const sourceEmbeddingArtifactCovered = filterChaptersByCurrentIndexArtifact(\n contentChapters,\n sourceEmbeddingArtifactCoverage,\n );\n const summaryEmbeddingArtifactCovered = filterChaptersByCurrentIndexArtifact(\n contentChapters,\n summaryEmbeddingArtifactCoverage,\n );\n const queryBlockedContentChapters = contentChapters.filter(\n (chapter) =>\n !ftsArtifactCovered.includes(chapter) &&\n !sourceEmbeddingArtifactCovered.includes(chapter),\n );\n const queryBlockedChapters = queryBlockedContentChapters.map((chapter) =>\n createInspectChapterReference(archiveUri, chapter),\n );\n const queryReady = queryBlockedChapters.length === 0;\n const improvements = createInspectImprovements({\n concurrent,\n contentChapters,\n indexCacheCurrent,\n planningModel,\n queryBlockedChapters: queryBlockedContentChapters,\n summaryCovered,\n knowledgeGraphCovered,\n readingGraphCovered,\n });\n const performanceHints = createGenerationPerformanceHints({\n chapters: Math.max(\n 0,\n ...improvements.map((improvement) => improvement.missingChapters ?? 0),\n ),\n concurrent,\n hasJobWork: improvements.some(\n (improvement) => improvement.planning !== undefined,\n ),\n hasRequestWork: improvements.some(\n (improvement) => improvement.planning !== undefined,\n ),\n });\n\n return {\n archiveUri,\n uri: scopeUri,\n scope:\n options.chapterId === undefined\n ? { type: \"archive\" }\n : { chapterId: options.chapterId, type: \"chapter\" },\n content: {\n chapters: {\n content: contentChapters.length,\n planned: chapters.length - contentChapters.length,\n total: chapters.length,\n },\n sourceWords,\n summaryWords,\n },\n localIndexCache: {\n current: indexCacheCurrent,\n ...(!queryReady\n ? {\n blockedBy: \"missing-search-artifacts\" as const,\n impact:\n \"The cache cannot be built until every content chapter has a current FTS or source embedding artifact.\",\n }\n : indexCacheCurrent\n ? {}\n : {\n impact:\n \"The next archive query may need to sync index cache first.\",\n resource: \"local CPU/disk time only; no provider calls.\",\n }),\n status: !queryReady\n ? \"blocked\"\n : indexCacheCurrent\n ? \"current\"\n : \"missing-or-outdated\",\n syncAvailable: queryReady && !indexCacheCurrent,\n },\n coverage: {\n ftsIndexArtifact: createInspectCoverage(\n ftsArtifactCovered,\n contentChapters,\n ),\n knowledgeGraph: createInspectCoverage(\n knowledgeGraphCovered,\n contentChapters,\n ),\n readingGraph: createInspectCoverage(readingGraphCovered, contentChapters),\n summary: createInspectCoverage(summaryCovered, contentChapters),\n sourceEmbeddingIndexArtifact: createInspectCoverage(\n sourceEmbeddingArtifactCovered,\n contentChapters,\n ),\n summaryEmbeddingIndexArtifact: createInspectCoverage(\n summaryEmbeddingArtifactCovered,\n contentChapters,\n ),\n },\n query: {\n ready: queryReady,\n },\n searchArtifacts: {\n blockedChapters: queryBlockedChapters,\n ...(!queryReady\n ? {\n resource: \"local CPU/disk time only; no provider calls.\",\n }\n : {}),\n ready: queryReady,\n status: queryReady ? \"ready\" : \"incomplete\",\n },\n retrievalGuidance: formatRetrievalGuidance({\n indexCacheCurrent,\n knowledgeGraphCovered,\n readingGraphCovered,\n contentChapters,\n queryReady,\n sourceWords,\n }),\n improvements,\n performanceHints,\n summaryCoverageNote:\n \"Summary coverage means a current summary artifact exists for the chapter; it does not guarantee that every source topic is represented in the summary text.\",\n };\n}\n\nfunction createInspectChapterReference(\n archiveUri: string,\n chapter: ChapterEntry,\n): WikiGraphArchiveInspectChapterReference {\n return {\n chapterId: chapter.chapterId,\n locatedUri: formatInspectLocatedChapterUri(archiveUri, chapter),\n title: chapter.title,\n uri: chapter.uri,\n };\n}\n\nfunction formatInspectLocatedChapterUri(\n archiveUri: string,\n chapter: Pick<ChapterEntry, \"uri\">,\n): string {\n return `${archiveUri.replace(/\\/+$/u, \"\")}/${chapter.uri.replace(/^wikg:\\/\\//u, \"\")}`;\n}\n\nasync function readInspectChapters(\n document: ReadonlyDocument,\n chapterId: number | undefined,\n): Promise<readonly InspectChapter[]> {\n const chapters =\n chapterId === undefined\n ? await listChapters(document)\n : (await listChapters(document)).filter(\n (chapter) => chapter.chapterId === chapterId,\n );\n\n if (chapterId !== undefined && chapters.length === 0) {\n throw new Error(`Chapter ${chapterId} does not exist.`);\n }\n\n return await Promise.all(\n chapters.map(async (chapter) => {\n const serial = await document.serials.getById(chapter.chapterId);\n\n return {\n ...chapter,\n knowledgeGraphReady: serial?.knowledgeGraphReady === true,\n readingGraphReady: serial?.topologyReady === true,\n summaryReady: chapter.stage === \"summarized\",\n };\n }),\n );\n}\n\nasync function readSummaryWords(\n document: ReadonlyDocument,\n chapterId: number | undefined,\n): Promise<number> {\n return await document.readDatabase(\n async (database) =>\n (await database.queryOne(\n `\n SELECT COALESCE(SUM(words_count), 0) AS words\n FROM text_sentence_records\n WHERE kind = 2\n ${chapterId === undefined ? \"\" : \"AND chapter_id = ?\"}\n `,\n chapterId === undefined ? undefined : [chapterId],\n (row) => Number(row.words),\n )) ?? 0,\n );\n}\n\nasync function readIndexArtifactCoverage(\n document: ReadonlyDocument,\n kind: \"embedding-source\" | \"embedding-summary\" | \"fts\",\n chapterId: number | undefined,\n): Promise<readonly IndexArtifactCoverageRecord[]> {\n const coverage = await document.indexArtifacts.listCoverage(kind);\n\n return chapterId === undefined\n ? coverage\n : coverage.filter((item) => item.serialId === chapterId);\n}\n\nfunction filterChaptersByCurrentIndexArtifact(\n chapters: readonly InspectChapter[],\n coverage: readonly IndexArtifactCoverageRecord[],\n): readonly InspectChapter[] {\n const currentChapterIds = new Set(\n coverage.filter((item) => item.current).map((item) => item.serialId),\n );\n\n return chapters.filter((chapter) => currentChapterIds.has(chapter.chapterId));\n}\n\nfunction createInspectCoverage(\n covered: readonly InspectChapter[],\n total: readonly InspectChapter[],\n): WikiGraphArchiveInspectCoverage {\n const coveredWords = sumWords(covered);\n const totalWords = sumWords(total);\n\n return {\n coveredChapters: covered.length,\n coveredWords,\n percent: formatPercent(coveredWords, totalWords),\n totalChapters: total.length,\n totalWords,\n };\n}\n\nfunction formatRetrievalGuidance(input: {\n readonly contentChapters: readonly InspectChapter[];\n readonly indexCacheCurrent: boolean;\n readonly knowledgeGraphCovered: readonly InspectChapter[];\n readonly queryReady: boolean;\n readonly readingGraphCovered: readonly InspectChapter[];\n readonly sourceWords: number;\n}): readonly string[] {\n if (input.sourceWords === 0 || input.contentChapters.length === 0) {\n return [\n \"Source content: empty.\",\n \"Add source text before using query coverage or graph-based retrieval.\",\n ];\n }\n\n const lines = [\n input.queryReady\n ? `Query: available; local index cache is ${input.indexCacheCurrent ? \"current\" : \"missing or outdated and can be synced from artifacts\"}.`\n : \"Query: unavailable until every content chapter has a current FTS or source embedding artifact.\",\n ];\n\n lines.push(\n formatObjectSearchGuidance(\n \"Reading Graph object retrieval\",\n input.readingGraphCovered,\n input.contentChapters,\n ),\n );\n lines.push(\n formatObjectSearchGuidance(\n \"Entity/triple retrieval\",\n input.knowledgeGraphCovered,\n input.contentChapters,\n ),\n );\n\n return lines;\n}\n\nfunction formatObjectSearchGuidance(\n label: string,\n covered: readonly InspectChapter[],\n total: readonly InspectChapter[],\n): string {\n const coveredWords = sumWords(covered);\n const totalWords = sumWords(total);\n const ratio = totalWords === 0 ? 0 : coveredWords / totalWords;\n const coverage = formatPercent(coveredWords, totalWords);\n\n if (ratio >= 1) {\n return `${label}: covers all source content; it can represent the full scope for object retrieval.`;\n }\n if (ratio >= 0.9) {\n return `${label}: covers ${coverage}; use it as the main path, but source --query is needed for uncovered content.`;\n }\n if (ratio >= 0.5) {\n return `${label}: covers ${coverage}; use it as leads, not as a full-scope substitute for source --query.`;\n }\n\n return `${label}: covers ${coverage}; build missing graph coverage before relying on object retrieval.`;\n}\n\nfunction createInspectImprovements(input: {\n readonly concurrent: { readonly job: number; readonly request: number };\n readonly contentChapters: readonly InspectChapter[];\n readonly indexCacheCurrent: boolean;\n readonly knowledgeGraphCovered: readonly InspectChapter[];\n readonly planningModel: string;\n readonly queryBlockedChapters: readonly InspectChapter[];\n readonly readingGraphCovered: readonly InspectChapter[];\n readonly summaryCovered: readonly InspectChapter[];\n}): readonly WikiGraphArchiveInspectImprovement[] {\n const improvements: WikiGraphArchiveInspectImprovement[] = [];\n\n if (input.contentChapters.length === 0) {\n improvements.push({\n kind: \"add-source\",\n recommendation:\n \"No source content is available yet; add or import source text before graph or summary generation.\",\n title: \"Add source content\",\n });\n return improvements;\n }\n\n if (input.queryBlockedChapters.length > 0) {\n improvements.push({\n kind: \"build\",\n missingChapters: input.queryBlockedChapters.length,\n missingWords: sumWords(input.queryBlockedChapters),\n recommendation:\n \"Build local FTS artifacts to make this scope queryable. This does not call a provider.\",\n task: \"index-fts\",\n title: \"Enable query with local FTS\",\n });\n } else if (!input.indexCacheCurrent) {\n improvements.push({\n kind: \"sync-index\",\n recommendation:\n \"Sync the index cache from chapter index artifacts so query starts without a lazy cache rebuild.\",\n title: \"Sync index cache\",\n });\n }\n\n improvements.push(\n ...createGraphImprovement({\n concurrent: input.concurrent,\n covered: input.readingGraphCovered,\n planningModel: input.planningModel,\n task: \"reading-graph\",\n title: \"Complete Reading Graph coverage\",\n total: input.contentChapters,\n }),\n );\n improvements.push(\n ...createGraphImprovement({\n concurrent: input.concurrent,\n covered: input.knowledgeGraphCovered,\n planningModel: input.planningModel,\n task: \"knowledge-graph\",\n title: \"Complete Knowledge Graph coverage\",\n total: input.contentChapters,\n }),\n );\n improvements.push(\n ...createGraphImprovement({\n concurrent: input.concurrent,\n covered: input.summaryCovered,\n planningModel: input.planningModel,\n task: \"reading-summary\",\n title: \"Complete Summary coverage\",\n total: input.contentChapters,\n }),\n );\n\n return improvements;\n}\n\nfunction createGraphImprovement(input: {\n readonly concurrent: { readonly job: number; readonly request: number };\n readonly covered: readonly InspectChapter[];\n readonly planningModel: string;\n readonly task: \"knowledge-graph\" | \"reading-graph\" | \"reading-summary\";\n readonly title: string;\n readonly total: readonly InspectChapter[];\n}): readonly WikiGraphArchiveInspectImprovement[] {\n const coveredIds = new Set(input.covered.map((chapter) => chapter.chapterId));\n const missing = input.total.filter(\n (chapter) => !coveredIds.has(chapter.chapterId),\n );\n\n if (missing.length === 0) {\n return [];\n }\n\n const missingWords = sumWords(missing);\n\n return [\n {\n kind: \"build\",\n missingChapters: missing.length,\n missingWords,\n planning: planGenerationTask(\n input.task,\n missingWords,\n missing.length,\n input.concurrent,\n input.planningModel,\n ),\n recommendation: formatImprovementRecommendation(\n input.covered,\n input.total,\n missingWords,\n ),\n task: input.task,\n title: input.title,\n },\n ];\n}\n\nfunction formatImprovementRecommendation(\n covered: readonly InspectChapter[],\n total: readonly InspectChapter[],\n missingWords: number,\n): string {\n const totalWords = sumWords(total);\n const coveredWords = sumWords(covered);\n\n if (totalWords === 0) {\n return \"No source content is available.\";\n }\n if (\n total.length === 1 ||\n coveredWords / totalWords >= 0.9 ||\n missingWords <= 1000\n ) {\n return \"Queue the full scope to finish the remaining gap.\";\n }\n\n return \"Queue selected chapters first if only part of the scope matters.\";\n}\n\nfunction sumWords(chapters: readonly Pick<InspectChapter, \"words\">[]): number {\n return chapters.reduce((total, chapter) => total + chapter.words, 0);\n}\n\nfunction formatPercent(numerator: number, denominator: number): string {\n if (denominator === 0) {\n return \"n/a\";\n }\n\n const percent = (numerator / denominator) * 100;\n\n return `${Number.isInteger(percent) ? percent.toFixed(0) : percent.toFixed(1)}%`;\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"],"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,+BAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,gBAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;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;AAAA,EACA;AAAA,EACA;AAAA,EAkBA;AAAA,OAOK;;;ACrEP,SAAS,MAAAC,WAAU;AAEnB;AAAA,EACE;AAAA,OAIK;;;ACLP,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,OACK;AAxBP,IAAM,cACiD,oBAAWA;AAClE,IAAM,cACiD,mBAAW;AAwBlE,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;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;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;;;ACr3BA,SAAS,SAAS;;;ACAlB,SAAS,+BAA+B;;;ACAxC,SAAS,qBAAAE,0BAAyB;AAYlC,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;AASO,SAAS,gCAA4D;AAC1E,SACE,eAAe,SAAS,KAAK;AAAA,IAC3B,KAAK,QAAQ,IAAI;AAAA,IACjB,KAAK,QAAQ;AAAA,IACb,WAAW;AAAA,EACb;AAEJ;AAEO,SAAS,0BAA8C;AAC5D,SAAO,8BAA8B,EAAE;AACzC;;;ADhDA,SAAS,QAAAC,aAAY;AACrB,SAAS,WAAAC,gBAAe;AAexB,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;AA0GO,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,MAAM;AAAA,IACrB,IAAI;AAAA,MACFC;AAAA,QACE,wBAAwB,KAAKA,MAAKC,SAAQ,GAAG,YAAY;AAAA,QACzD;AAAA,MACF;AAAA,IACF;AAAA,IACA;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;AAmBA,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;;;AD3XA,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;AA0CD,eAAsB,2BAA2B,SAEb;AAClC,QAAM,CAAC,WAAW,UAAU,YAAY,WAAW,SAAS,IAC1D,MAAM,QAAQ,IAAI;AAAA,IAChB,uBAAuB,YAAY;AAAA,IACnC,uBAAuB,KAAK;AAAA,IAC5B,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,uBAAuBC,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;;;AGpYA,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;;;AN8BO,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,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,SAAS,MAAM,2BAA2B;AAAA,MAC9C,GAAI,QAAQ,YAAY,SAAY,CAAC,IAAI,EAAE,SAAS,QAAQ,QAAQ;AAAA,IACtE,CAAC;AACD,UAAM,MAAM,IAAI,UAAU;AAAA,MACxB,GAAI,QAAQ,YAAY,OAAO,EAAE,SAAS,KAAK,IAAI,CAAC;AAAA,MACpD,GAAI,cAAc,EAAE,KAAK,yBAAyB,MAAM,EAAE,IAAI,CAAC;AAAA,IACjE,CAAC;AACD,UAAM,oBAAoB,MAAM;AAAA,MAC9B,QAAQ;AAAA,MACR;AAAA,IACF;AACA,UAAM,QAAQ,OAAO,YAA6C;AAChE,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,SAAS,4BAA4B,QAAQ,MAAM,IAAI,CAAC;AAAA,QAC5D;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,YAAY;AAC9C,cAAM,IAAI,sBAAsB,eAAe,KAAK;AAAA,MACtD,OAAO;AACL,cAAM,IAAI,iBAAiB,eAAe,KAAK;AAAA,MACjD;AAAA,IACF;AAEA,WAAO;AAAA,MACL,aAAa,QAAQ,MAAM;AAAA,MAC3B,cAAc,QAAQ,OAAO;AAAA,MAC7B,YAAY,QAAQ,OAAO;AAAA,IAC7B;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,QAAME,IAAG,UAAU,EAAE,OAAO,MAAM,WAAW,KAAK,CAAC;AACnD,SAAO,IAAI,cAAc,QAAQ;AACnC;AAEA,eAAe,aACb,SACA,MACA,QACe;AACf,QAAM,OAAO,IAAI,SAAS,4BAA4B,IAAI,CAAC;AAC3D,MAAI,WAAW,OAAQ,OAAM,QAAQ,WAAW,IAAI;AAAA,WAC3C,WAAW,OAAQ,OAAM,QAAQ,OAAO,IAAI;AAAA,MAChD,OAAM,QAAQ,WAAW,IAAI;AACpC;;;AOnKA;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;AAiCO,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;AAQA,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,UAC4B;AAC5B,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,OAA2C;AACzE,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;;;AD3OA,eAAsB,oCAEpB;AACA,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;;;AEvDA;AAAA,EACE;AAAA,EACA;AAAA,OAKK;;;ACEA,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;AAgBA,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;;;ADrGA,eAAsB,oCACpB,UACA,SAIwC;AACxC,QAAM,EAAE,WAAW,IAAI;AACvB,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,MAAM,QAAQ,IAAI;AAAA,IACpB,oBAAoB,UAAU,QAAQ,SAAS;AAAA,IAC/C,iBAAiB,UAAU,QAAQ,SAAS;AAAA,IAC5C,4BAA4B,QAAQ;AAAA,IACpC,2BAA2B;AAAA,IAC3B,0BAA0B,UAAU,OAAO,QAAQ,SAAS;AAAA,IAC5D,0BAA0B,UAAU,oBAAoB,QAAQ,SAAS;AAAA,IACzE,0BAA0B,UAAU,qBAAqB,QAAQ,SAAS;AAAA,EAC5E,CAAC;AACD,QAAM,kBACJ,QAAQ,cAAc,SAAY,SAAY,SAAS,CAAC;AAC1D,QAAM,WACJ,oBAAoB,SAChB,aACA,+BAA+B,YAAY,eAAe;AAChE,QAAM,aAAa;AAAA,IACjB,KAAK,OAAO,YAAY,OAAO;AAAA,IAC/B,SACE,OAAO,YAAY,WAAW;AAAA,EAClC;AACA,QAAM,gBAAgB,8BAA8B,OAAO,GAAG;AAC9D,QAAM,kBAAkB,SAAS;AAAA,IAC/B,CAAC,YAAY,QAAQ,UAAU;AAAA,EACjC;AACA,QAAM,cAAc,SAAS,eAAe;AAC5C,QAAM,sBAAsB,gBAAgB;AAAA,IAC1C,CAAC,YAAY,QAAQ;AAAA,EACvB;AACA,QAAM,wBAAwB,gBAAgB;AAAA,IAC5C,CAAC,YAAY,QAAQ;AAAA,EACvB;AACA,QAAM,iBAAiB,gBAAgB;AAAA,IACrC,CAAC,YAAY,QAAQ;AAAA,EACvB;AACA,QAAM,qBAAqB;AAAA,IACzB;AAAA,IACA;AAAA,EACF;AACA,QAAM,iCAAiC;AAAA,IACrC;AAAA,IACA;AAAA,EACF;AACA,QAAM,kCAAkC;AAAA,IACtC;AAAA,IACA;AAAA,EACF;AACA,QAAM,8BAA8B,gBAAgB;AAAA,IAClD,CAAC,YACC,CAAC,mBAAmB,SAAS,OAAO,KACpC,CAAC,+BAA+B,SAAS,OAAO;AAAA,EACpD;AACA,QAAM,uBAAuB,4BAA4B;AAAA,IAAI,CAAC,YAC5D,8BAA8B,YAAY,OAAO;AAAA,EACnD;AACA,QAAM,aAAa,qBAAqB,WAAW;AACnD,QAAM,eAAe,0BAA0B;AAAA,IAC7C;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,sBAAsB;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACD,QAAM,mBAAmB,iCAAiC;AAAA,IACxD,UAAU,KAAK;AAAA,MACb;AAAA,MACA,GAAG,aAAa,IAAI,CAAC,gBAAgB,YAAY,mBAAmB,CAAC;AAAA,IACvE;AAAA,IACA;AAAA,IACA,YAAY,aAAa;AAAA,MACvB,CAAC,gBAAgB,YAAY,aAAa;AAAA,IAC5C;AAAA,IACA,gBAAgB,aAAa;AAAA,MAC3B,CAAC,gBAAgB,YAAY,aAAa;AAAA,IAC5C;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL;AAAA,IACA,KAAK;AAAA,IACL,OACE,QAAQ,cAAc,SAClB,EAAE,MAAM,UAAU,IAClB,EAAE,WAAW,QAAQ,WAAW,MAAM,UAAU;AAAA,IACtD,SAAS;AAAA,MACP,UAAU;AAAA,QACR,SAAS,gBAAgB;AAAA,QACzB,SAAS,SAAS,SAAS,gBAAgB;AAAA,QAC3C,OAAO,SAAS;AAAA,MAClB;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,iBAAiB;AAAA,MACf,SAAS;AAAA,MACT,GAAI,CAAC,aACD;AAAA,QACE,WAAW;AAAA,QACX,QACE;AAAA,MACJ,IACA,oBACE,CAAC,IACD;AAAA,QACE,QACE;AAAA,QACF,UAAU;AAAA,MACZ;AAAA,MACN,QAAQ,CAAC,aACL,YACA,oBACE,YACA;AAAA,MACN,eAAe,cAAc,CAAC;AAAA,IAChC;AAAA,IACA,UAAU;AAAA,MACR,kBAAkB;AAAA,QAChB;AAAA,QACA;AAAA,MACF;AAAA,MACA,gBAAgB;AAAA,QACd;AAAA,QACA;AAAA,MACF;AAAA,MACA,cAAc,sBAAsB,qBAAqB,eAAe;AAAA,MACxE,SAAS,sBAAsB,gBAAgB,eAAe;AAAA,MAC9D,8BAA8B;AAAA,QAC5B;AAAA,QACA;AAAA,MACF;AAAA,MACA,+BAA+B;AAAA,QAC7B;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,IACA,OAAO;AAAA,MACL,OAAO;AAAA,IACT;AAAA,IACA,iBAAiB;AAAA,MACf,iBAAiB;AAAA,MACjB,GAAI,CAAC,aACD;AAAA,QACE,UAAU;AAAA,MACZ,IACA,CAAC;AAAA,MACL,OAAO;AAAA,MACP,QAAQ,aAAa,UAAU;AAAA,IACjC;AAAA,IACA,mBAAmB,wBAAwB;AAAA,MACzC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,IACD;AAAA,IACA;AAAA,IACA,qBACE;AAAA,EACJ;AACF;AAEA,SAAS,8BACP,YACA,SACyC;AACzC,SAAO;AAAA,IACL,WAAW,QAAQ;AAAA,IACnB,YAAY,+BAA+B,YAAY,OAAO;AAAA,IAC9D,OAAO,QAAQ;AAAA,IACf,KAAK,QAAQ;AAAA,EACf;AACF;AAEA,SAAS,+BACP,YACA,SACQ;AACR,SAAO,GAAG,WAAW,QAAQ,SAAS,EAAE,CAAC,IAAI,QAAQ,IAAI,QAAQ,eAAe,EAAE,CAAC;AACrF;AAEA,eAAe,oBACb,UACA,WACoC;AACpC,QAAM,WACJ,cAAc,SACV,MAAM,aAAa,QAAQ,KAC1B,MAAM,aAAa,QAAQ,GAAG;AAAA,IAC7B,CAAC,YAAY,QAAQ,cAAc;AAAA,EACrC;AAEN,MAAI,cAAc,UAAa,SAAS,WAAW,GAAG;AACpD,UAAM,IAAI,MAAM,WAAW,SAAS,kBAAkB;AAAA,EACxD;AAEA,SAAO,MAAM,QAAQ;AAAA,IACnB,SAAS,IAAI,OAAO,YAAY;AAC9B,YAAM,SAAS,MAAM,SAAS,QAAQ,QAAQ,QAAQ,SAAS;AAE/D,aAAO;AAAA,QACL,GAAG;AAAA,QACH,qBAAqB,QAAQ,wBAAwB;AAAA,QACrD,mBAAmB,QAAQ,kBAAkB;AAAA,QAC7C,cAAc,QAAQ,UAAU;AAAA,MAClC;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAEA,eAAe,iBACb,UACA,WACiB;AACjB,SAAO,MAAM,SAAS;AAAA,IACpB,OAAO,aACJ,MAAM,SAAS;AAAA,MACd;AAAA;AAAA;AAAA;AAAA,cAIM,cAAc,SAAY,KAAK,oBAAoB;AAAA;AAAA,MAEzD,cAAc,SAAY,SAAY,CAAC,SAAS;AAAA,MAChD,CAAC,QAAQ,OAAO,IAAI,KAAK;AAAA,IAC3B,KAAM;AAAA,EACV;AACF;AAEA,eAAe,0BACb,UACA,MACA,WACiD;AACjD,QAAM,WAAW,MAAM,SAAS,eAAe,aAAa,IAAI;AAEhE,SAAO,cAAc,SACjB,WACA,SAAS,OAAO,CAAC,SAAS,KAAK,aAAa,SAAS;AAC3D;AAEA,SAAS,qCACP,UACA,UAC2B;AAC3B,QAAM,oBAAoB,IAAI;AAAA,IAC5B,SAAS,OAAO,CAAC,SAAS,KAAK,OAAO,EAAE,IAAI,CAAC,SAAS,KAAK,QAAQ;AAAA,EACrE;AAEA,SAAO,SAAS,OAAO,CAAC,YAAY,kBAAkB,IAAI,QAAQ,SAAS,CAAC;AAC9E;AAEA,SAAS,sBACP,SACA,OACiC;AACjC,QAAM,eAAe,SAAS,OAAO;AACrC,QAAM,aAAa,SAAS,KAAK;AAEjC,SAAO;AAAA,IACL,iBAAiB,QAAQ;AAAA,IACzB;AAAA,IACA,SAAS,cAAc,cAAc,UAAU;AAAA,IAC/C,eAAe,MAAM;AAAA,IACrB;AAAA,EACF;AACF;AAEA,SAAS,wBAAwB,OAOX;AACpB,MAAI,MAAM,gBAAgB,KAAK,MAAM,gBAAgB,WAAW,GAAG;AACjE,WAAO;AAAA,MACL;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,QAAQ;AAAA,IACZ,MAAM,aACF,0CAA0C,MAAM,oBAAoB,YAAY,sDAAsD,MACtI;AAAA,EACN;AAEA,QAAM;AAAA,IACJ;AAAA,MACE;AAAA,MACA,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AAAA,EACF;AACA,QAAM;AAAA,IACJ;AAAA,MACE;AAAA,MACA,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,2BACP,OACA,SACA,OACQ;AACR,QAAM,eAAe,SAAS,OAAO;AACrC,QAAM,aAAa,SAAS,KAAK;AACjC,QAAM,QAAQ,eAAe,IAAI,IAAI,eAAe;AACpD,QAAM,WAAW,cAAc,cAAc,UAAU;AAEvD,MAAI,SAAS,GAAG;AACd,WAAO,GAAG,KAAK;AAAA,EACjB;AACA,MAAI,SAAS,KAAK;AAChB,WAAO,GAAG,KAAK,YAAY,QAAQ;AAAA,EACrC;AACA,MAAI,SAAS,KAAK;AAChB,WAAO,GAAG,KAAK,YAAY,QAAQ;AAAA,EACrC;AAEA,SAAO,GAAG,KAAK,YAAY,QAAQ;AACrC;AAEA,SAAS,0BAA0B,OASe;AAChD,QAAM,eAAqD,CAAC;AAE5D,MAAI,MAAM,gBAAgB,WAAW,GAAG;AACtC,iBAAa,KAAK;AAAA,MAChB,MAAM;AAAA,MACN,gBACE;AAAA,MACF,OAAO;AAAA,IACT,CAAC;AACD,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,qBAAqB,SAAS,GAAG;AACzC,iBAAa,KAAK;AAAA,MAChB,MAAM;AAAA,MACN,iBAAiB,MAAM,qBAAqB;AAAA,MAC5C,cAAc,SAAS,MAAM,oBAAoB;AAAA,MACjD,gBACE;AAAA,MACF,MAAM;AAAA,MACN,OAAO;AAAA,IACT,CAAC;AAAA,EACH,WAAW,CAAC,MAAM,mBAAmB;AACnC,iBAAa,KAAK;AAAA,MAChB,MAAM;AAAA,MACN,gBACE;AAAA,MACF,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AAEA,eAAa;AAAA,IACX,GAAG,uBAAuB;AAAA,MACxB,YAAY,MAAM;AAAA,MAClB,SAAS,MAAM;AAAA,MACf,eAAe,MAAM;AAAA,MACrB,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO,MAAM;AAAA,IACf,CAAC;AAAA,EACH;AACA,eAAa;AAAA,IACX,GAAG,uBAAuB;AAAA,MACxB,YAAY,MAAM;AAAA,MAClB,SAAS,MAAM;AAAA,MACf,eAAe,MAAM;AAAA,MACrB,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO,MAAM;AAAA,IACf,CAAC;AAAA,EACH;AACA,eAAa;AAAA,IACX,GAAG,uBAAuB;AAAA,MACxB,YAAY,MAAM;AAAA,MAClB,SAAS,MAAM;AAAA,MACf,eAAe,MAAM;AAAA,MACrB,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO,MAAM;AAAA,IACf,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEA,SAAS,uBAAuB,OAOkB;AAChD,QAAM,aAAa,IAAI,IAAI,MAAM,QAAQ,IAAI,CAAC,YAAY,QAAQ,SAAS,CAAC;AAC5E,QAAM,UAAU,MAAM,MAAM;AAAA,IAC1B,CAAC,YAAY,CAAC,WAAW,IAAI,QAAQ,SAAS;AAAA,EAChD;AAEA,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,eAAe,SAAS,OAAO;AAErC,SAAO;AAAA,IACL;AAAA,MACE,MAAM;AAAA,MACN,iBAAiB,QAAQ;AAAA,MACzB;AAAA,MACA,UAAU;AAAA,QACR,MAAM;AAAA,QACN;AAAA,QACA,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA,gBAAgB;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,QACN;AAAA,MACF;AAAA,MACA,MAAM,MAAM;AAAA,MACZ,OAAO,MAAM;AAAA,IACf;AAAA,EACF;AACF;AAEA,SAAS,gCACP,SACA,OACA,cACQ;AACR,QAAM,aAAa,SAAS,KAAK;AACjC,QAAM,eAAe,SAAS,OAAO;AAErC,MAAI,eAAe,GAAG;AACpB,WAAO;AAAA,EACT;AACA,MACE,MAAM,WAAW,KACjB,eAAe,cAAc,OAC7B,gBAAgB,KAChB;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,SAAS,UAA4D;AAC5E,SAAO,SAAS,OAAO,CAAC,OAAO,YAAY,QAAQ,QAAQ,OAAO,CAAC;AACrE;AAEA,SAAS,cAAc,WAAmB,aAA6B;AACrE,MAAI,gBAAgB,GAAG;AACrB,WAAO;AAAA,EACT;AAEA,QAAM,UAAW,YAAY,cAAe;AAE5C,SAAO,GAAG,OAAO,UAAU,OAAO,IAAI,QAAQ,QAAQ,CAAC,IAAI,QAAQ,QAAQ,CAAC,CAAC;AAC/E;;;AVtdO,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;AAiGO,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,4BAA4B,QAAQ,IAAI;AACrD,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,YAAY,0BAA0B,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,WACA,UAAqC,CAAC,GACL;AACjC,UAAM,WAAW,MAAM,KAAK,SAAS;AAAA,MACnC,YAAY,MAAM,gCAAgC,SAAS;AAAA,MAC3D,QAAQ;AAAA,IACV;AACA,WAAO,IAAI,uBAAuB,KAAK,UAAU,QAAQ;AAAA,EAC3D;AACF;AAEO,IAAM,yBAAN,MAA6B;AAAA,EACzB;AAAA,EACA;AAAA,EAEF,YACL,SACA,UACA;AACA,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,WACE,yBAAyB,KAAK,UAAU,UAAU,EAAE,aAAa;AAAA,EAErE;AAAA,EAEA,IAAW,OAAe;AACxB,WAAO,KAAK,UAAU;AAAA,EACxB;AAAA,EAEA,MAAa,QACX,UAAuE,CAAC,GAChC;AACxC,WAAO,MAAM,KAAK;AAAA,MAChB,OAAO,aACL,MAAM,oCAAoC,UAAU;AAAA,QAClD,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,GACd;AAC5B,UAAM,oBAAoB,MAAM,KAAK,SAAS;AAAA,MAC5C;AAAA,MACA,QAAQ;AAAA,IACV;AACA,WAAO,MAAM,KAAK;AAAA,MAChB,OAAO,aAAa;AAClB,cAAM,WAAW,MAAM,KAAK,sBAAsB,UAAU,OAAO;AACnE,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;AAAA,EACF;AAAA,EAEA,MAAa,KACX,UAAuC,CAAC,GACuB;AAC/D,WAAO,MAAM,KAAK,cAAc,OAAO,aAAa;AAClD,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;AAAA,EACZ;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,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,iBAAiB,OAAO;AAAA,YAC3B,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,GACZ;AAC/B,QAAI,QAAQ,UAAU,QAAW;AAC/B,aAAO,MAAM,KAAK,cAAc,OAAO,aAAa;AAClD,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;AAAA,IACZ;AACA,UAAM,oBAAoB,MAAM,KAAK,SAAS;AAAA,MAC5C;AAAA,MACA,QAAQ;AAAA,IACV;AACA,WAAO,MAAM,KAAK;AAAA,MAChB,OAAO,aAAa;AAClB,cAAM,WAAW,MAAM,KAAK,sBAAsB,UAAU,OAAO;AACnE,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,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;AAAA,EACF;AAAA,EAEA,MAAa,SACX,YAAY,KAAK,WACjB,UAA2C,CAAC,GAClB;AAC1B,QAAI,QAAQ,UAAU,QAAW;AAC/B,aAAO,MAAM,KAAK,cAAc,OAAO,aAAa;AAClD,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;AAAA,IACZ;AACA,UAAM,oBAAoB,MAAM,KAAK,SAAS;AAAA,MAC5C;AAAA,MACA,QAAQ;AAAA,IACV;AACA,WAAO,MAAM,KAAK;AAAA,MAChB,OAAO,aAAa;AAClB,cAAM,WAAW,MAAM,KAAK,sBAAsB,UAAU,OAAO;AACnE,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,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;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,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,IAAI,qBAAqB,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,YAAM,SAAS,MAAM,IAAI;AAAA,QACvB,KAAK,UAAU;AAAA,MACjB,EAAE,MAAM,WAAW;AAAA,QACjB,GAAI,QAAQ,+BAA+B,SACvC,CAAC,IACD;AAAA,UACE,4BAA4B,QAAQ;AAAA,QACtC;AAAA,MACN,CAAC;AACD,UAAI,QAAQ,wBAAwB,OAAO;AACzC,cAAM,KAAK,qBAAqB,QAAQ,gBAAgB;AAAA,MAC1D;AACA,aAAO;AAAA,IACT,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,SAGwC;AACxC,UAAM,WAAW,MAAM,KAAK,cAAc,UAAU,OAAO;AAC3D,QAAI,QAAQ,kBAAkB,KAAM,QAAO;AAC3C,UAAM,YAAY,MAAM,+BAA+B,UAAU;AAAA,MAC/D,GAAI,aAAa,SAAY,CAAC,IAAI,EAAE,SAAS;AAAA,IAC/C,CAAC;AACD,QAAI,UAAU,WAAW,GAAG;AAC1B,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,qBACJ,SACe;AACf,QAAI,KAAK,UAAU,uBAAuB,OAAW;AACrD,QAAI,KAAK,UAAU,yBAAyB,QAAW;AACrD,YAAM,qCAAqC;AAAA,QACzC,QAAQ,KAAK,UAAU;AAAA,MACzB,CAAC;AAAA,IACH;AACA,QAAI;AACF,YAAM,QAAQ,MAAM;AAAA,QAClB,KAAK,UAAU;AAAA,MACjB;AACA,UAAI,MAAM,WAAW,WAAW;AAC9B,cAAM,6BAA6B,KAAK,UAAU,kBAAkB;AAAA,MACtE;AAAA,IACF,SAAS,OAAO;AACd,gBAAU,KAAK;AAAA,IACjB;AAAA,EACF;AACF;AAEA,eAAsB,gCACpB,WACmC;AACnC,MAAI,CAAC,UAAU,WAAW,SAAS,GAAG;AACpC,WAAO,mBAAmB,4BAA4B,SAAS,CAAC;AAAA,EAClE;AACA,QAAM,SAAS,yBAAyB,SAAS;AACjD,QAAM,yBAAyB,OAAO,eAAe;AACrD,QAAM,iBAAiB,uBAAuB,WAAW,aAAa,IAClE,yBACA,4BAA4B,sBAAsB;AACtD,QAAM,uBAAuB,eAAe,WAAW,aAAa,IAChE,yBAAyB,cAAc,IACvC;AACJ,QAAM,cACJ,sBAAsB,SAAS,YAC3B,MAAM,mCAAmC,cAAc,IACvD,IAAI,SAAS,cAAc;AACjC,QAAM,cAAc,oBAAoB,WAAW;AACnD,SAAO;AAAA,IACL;AAAA,IACA,YAAY;AAAA,IACZ;AAAA,IACA,YAAY,EAAE,YAAY,aAAa,aAAa,MAAM,gBAAgB;AAAA,IAC1E,GAAI,sBAAsB,SAAS,YAC/B;AAAA,MACE;AAAA,MACA,oBAAoB;AAAA,QAClB,WAAW,qBAAqB;AAAA,QAChC,MAAM;AAAA,QACN,GAAI,qBAAqB,aAAa,SAClC,CAAC,IACD,EAAE,UAAU,qBAAqB,SAAS;AAAA,MAChD;AAAA,MACA,kBAAkB;AAAA,IACpB,IACA,CAAC;AAAA,IACL,YAAY,0BAA0B,aAAa,OAAO,SAAS;AAAA,EACrE;AACF;AAEA,eAAe,yBACb,UACA,UAGI,CAAC,GACU;AACf,QAAM,QACJ,QAAQ,aAAa,SAAY,CAAC,IAAI,EAAE,UAAU,QAAQ,SAAS;AACrE,MAAI,MAAMF,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,SAAS,mBAAmB,MAAwC;AAClE,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,IAAI;AAAA,EAC5C;AACF;AAEA,eAAe,uBAAuB,MAA6B;AACjE,QAAM,gBAAgB,MAAM;AAAA,IAC1BP,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,UAAMK,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,UAAMI,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;","names":["randomUUID","rename","rm","stat","basename","dirname","join","Readable","isArchiveSearchIndexCurrent","listChapters","WikiGraph","rm","process","resolve","content","AsyncLocalStorage","join","homedir","join","homedir","formatError","homedir","isAbsolute","resolve","homedir","resolve","isAbsolute","rm","createOpenAI","createOpenAICompatible","createOpenAI","createOpenAICompatible","createOpenAICompatibleName","join","dirname","basename","randomUUID","rename","rm","isArchiveSearchIndexCurrent","listChapters","WikiGraph","stat","Readable"]}
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/runtime-path.ts","../src/query-runtime.ts","../src/embedding.ts","../src/archive/inspect.ts","../src/planning.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 assertNoActiveBuildJobConflicts,\n assertNoActiveBuildJobs,\n deleteArchiveSearchSessions,\n DirectoryDocument,\n finalizeWikiGraphLibraryArchiveWrite,\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 parseWikiGraphLibraryUri,\n readArchivePage,\n readSearchIndexCapabilityStatus,\n readWikiGraphLibraryIndexState,\n rebuildArchiveSearchIndex,\n rebuildWikiGraphLibraryIndex,\n removeChapter,\n resetChapter,\n resolveChapterPathReadonly,\n resolveWikiGraphLibraryArchiveFile,\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 ArchiveEvidence,\n type ArchiveFindOptions,\n type ArchiveFindResult,\n type ArchivePack,\n type ArchivePage,\n type ArchiveRelatedResult,\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 ParsedWikiGraphLibraryUri,\n type QueryIndexScope,\n type ReadonlyDocument,\n type SearchIndexEmbeddingProvider,\n type WikiGraphProgressCallback,\n} from \"wiki-graph-core\";\n\nimport type { WikiGraphJobRuntime } from \"../jobs.js\";\nimport { WikiGraphConversionManager } from \"../conversions.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 createWikiGraphArchiveInspectReport,\n type WikiGraphArchiveInspectReport,\n} from \"./inspect.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 WikiGraphArchiveLocation {\n readonly archiveFile: File;\n readonly archiveKey: string;\n readonly archivePath: string;\n readonly indexScope: QueryIndexScope;\n readonly libraryArchiveTarget?: ParsedWikiGraphLibraryUri;\n readonly libraryDirtyTarget?: ParsedWikiGraphLibraryUri;\n readonly locatedUri: string;\n readonly publicArchiveUri?: string;\n}\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 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 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 = resolveWikiGraphRuntimePath(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 uriOrPath: string,\n options: WikiGraphOperationOptions = {},\n ): Promise<WikiGraphArchiveHandle> {\n const location = await this.#runtime.run(\n async () => await resolveWikiGraphArchiveLocation(uriOrPath),\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(\n runtime: WikiGraphJobRuntime,\n location: WikiGraphArchiveLocation,\n ) {\n this.#runtime = runtime;\n this.#location = location;\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 async inspect(\n options: WikiGraphOperationOptions & { readonly chapterId?: number } = {},\n ): Promise<WikiGraphArchiveInspectReport> {\n return await this.#readDocument(\n async (document) =>\n await createWikiGraphArchiveInspectReport(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<ArchiveFindResult> {\n const embeddingProvider = await this.#runtime.run(\n createConfiguredEmbeddingProvider,\n options.signal,\n );\n return await this.#writeDocument(\n async (document) => {\n const chapters = await this.#resolveQueryChapters(document, options);\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 }\n\n public async list(\n options: WikiGraphArchiveListOptions = {},\n ): Promise<ArchiveCollectionResult | ArchiveSourceLocatorResult> {\n return 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 }\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 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 ...withoutOperation(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<ArchiveRelatedResult> {\n if (options.query === undefined) {\n return 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 }\n const embeddingProvider = await this.#runtime.run(\n createConfiguredEmbeddingProvider,\n options.signal,\n );\n return await this.#writeDocument(\n async (document) => {\n const chapters = await this.#resolveQueryChapters(document, options);\n await ensureArchiveSearchIndex(document, {\n ...(chapters === undefined ? {} : { chapters }),\n ...(embeddingProvider === undefined ? {} : { embeddingProvider }),\n });\n return await listRelatedArchiveObjects(document, objectUri, {\n ...withoutOperation(options),\n ...(chapters === undefined ? {} : { chapters }),\n });\n },\n {\n searchIndexWritebackPolicy: \"cache\",\n ...(options.signal === undefined ? {} : { signal: options.signal }),\n },\n );\n }\n\n public async evidence(\n objectUri = this.objectUri,\n options: WikiGraphArchiveEvidenceOptions = {},\n ): Promise<ArchiveEvidence> {\n if (options.query === undefined) {\n return 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 }\n const embeddingProvider = await this.#runtime.run(\n createConfiguredEmbeddingProvider,\n options.signal,\n );\n return await this.#writeDocument(\n async (document) => {\n const chapters = await this.#resolveQueryChapters(document, options);\n await ensureArchiveSearchIndex(document, {\n ...(chapters === undefined ? {} : { chapters }),\n ...(embeddingProvider === undefined ? {} : { embeddingProvider }),\n });\n return await listArchiveEvidence(document, objectUri, {\n ...withoutOperation(options),\n ...(chapters === undefined ? {} : { chapters }),\n });\n },\n {\n searchIndexWritebackPolicy: \"cache\",\n ...(options.signal === undefined ? {} : { signal: options.signal }),\n },\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 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 const result = await new WikiGraphArchiveFile(\n this.#location.archiveFile,\n ).write(operation, {\n ...(options.searchIndexWritebackPolicy === undefined\n ? {}\n : {\n searchIndexWritebackPolicy: options.searchIndexWritebackPolicy,\n }),\n });\n if (options.refreshLibraryIndex !== false) {\n await this.#refreshLibraryIndex(options.onIndexSyncError);\n }\n return result;\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 skipUnindexed?: boolean;\n },\n ): Promise<readonly number[] | undefined> {\n const chapters = await this.#resolveScope(document, options);\n if (options.skipUnindexed !== true) return chapters;\n const queryable = await listArchiveQueryableChapterIds(document, {\n ...(chapters === undefined ? {} : { chapters }),\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 #refreshLibraryIndex(\n onError: ((error: unknown) => void) | undefined,\n ): Promise<void> {\n if (this.#location.libraryDirtyTarget === undefined) return;\n if (this.#location.libraryArchiveTarget !== undefined) {\n await finalizeWikiGraphLibraryArchiveWrite({\n target: this.#location.libraryArchiveTarget,\n });\n }\n try {\n const state = await readWikiGraphLibraryIndexState(\n this.#location.libraryDirtyTarget,\n );\n if (state.status !== \"missing\") {\n await rebuildWikiGraphLibraryIndex(this.#location.libraryDirtyTarget);\n }\n } catch (error) {\n onError?.(error);\n }\n }\n}\n\nexport async function resolveWikiGraphArchiveLocation(\n uriOrPath: string,\n): Promise<WikiGraphArchiveLocation> {\n if (!uriOrPath.startsWith(\"wikg://\")) {\n return createPathLocation(resolveWikiGraphRuntimePath(uriOrPath));\n }\n const parsed = parseLocatedWikiGraphUri(uriOrPath);\n const portableArchiveLocator = parsed.archivePath ?? uriOrPath;\n const archiveLocator = portableArchiveLocator.startsWith(\"wikg://lib/\")\n ? portableArchiveLocator\n : resolveWikiGraphRuntimePath(portableArchiveLocator);\n const libraryArchiveTarget = archiveLocator.startsWith(\"wikg://lib/\")\n ? parseWikiGraphLibraryUri(archiveLocator)\n : undefined;\n const archiveFile =\n libraryArchiveTarget?.kind === \"archive\"\n ? await resolveWikiGraphLibraryArchiveFile(archiveLocator)\n : new NodeFile(archiveLocator);\n const archivePath = getNodeResourcePath(archiveFile);\n return {\n archiveFile,\n archiveKey: archivePath,\n archivePath,\n indexScope: { archiveKey: archivePath, archivePath, kind: \"archive-index\" },\n ...(libraryArchiveTarget?.kind === \"archive\"\n ? {\n libraryArchiveTarget,\n libraryDirtyTarget: {\n isDefault: libraryArchiveTarget.isDefault,\n kind: \"scope\" as const,\n ...(libraryArchiveTarget.publicId === undefined\n ? {}\n : { publicId: libraryArchiveTarget.publicId }),\n },\n publicArchiveUri: portableArchiveLocator,\n }\n : {}),\n locatedUri: formatLocatedWikiGraphUri(archivePath, parsed.objectUri),\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\nfunction createPathLocation(path: string): WikiGraphArchiveLocation {\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),\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 type { WikiGraphJobRuntime } from \"./jobs.js\";\nimport { resolveWikiGraphRuntimePath } from \"./runtime-path.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 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 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 config = await loadWikiGraphRuntimeConfig({\n ...(options.llmJSON === undefined ? {} : { llmJSON: options.llmJSON }),\n });\n const app = new WikiGraph({\n ...(options.verbose === true ? { verbose: true } : {}),\n ...(requiresLLM ? { llm: buildWikiGraphLLMOptions(config) } : {}),\n });\n const documentDirectory = await prepareDigestDirectory(\n options.digestDirectory,\n requiresDigest,\n );\n let chapterCount: number | 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 }\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(resolveWikiGraphRuntimePath(options.input.path)),\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 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 file = new NodeFile(resolveWikiGraphRuntimePath(path));\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","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 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 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\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 function createNodeWikiGraphStorage(\n stateRoot = pathModule.join(os.homedir(), \".wikigraph\"),\n): WikiGraphStorage {\n return {\n library: new NodeDirectory(stateRoot),\n documentStore: new NodeDirectory(pathModule.join(stateRoot, \"documents\")),\n };\n}\n\nexport function installNodeWikiGraphPlatform(stateRoot?: string): void {\n installWikiGraphPlatform(nodeWikiGraphPlatform);\n installWikiGraphStorage(createNodeWikiGraphStorage(stateRoot));\n}\n\nexport function ensureNodeWikiGraphPlatform(): void {\n installWikiGraphPlatform(nodeWikiGraphPlatform);\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 HostedProviderScope = \"wg-wikimedia\" | \"wikispine\";\n\ntype InlineLLMConfig = NonNullable<WikiGraphRuntimeConfig[\"llm\"]>;\n\nexport async function loadWikiGraphRuntimeConfig(options?: {\n readonly llmJSON?: string;\n}): Promise<WikiGraphRuntimeConfig> {\n const [embedding, localLLM, concurrent, wikimedia, wikispine] =\n await Promise.all([\n readLocalConfigSection(\"embeddings\"),\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 { 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 database = await openSharedStateDatabase(\n new NodeFile(\n join(\n getWikiGraphSDKStateDir() ?? join(homedir(), \".wikigraph\"),\n \"core.sqlite\",\n ),\n ),\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\nexport type WikiGraphSDKEnvPolicy = \"development\" | \"production\";\n\nexport interface WikiGraphSDKRuntimeContext {\n readonly cwd: string;\n readonly env: NodeJS.ProcessEnv;\n readonly envPolicy: WikiGraphSDKEnvPolicy;\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 }\n );\n}\n\nexport function getWikiGraphSDKStateDir(): string | undefined {\n return getWikiGraphSDKRuntimeContext().stateDir;\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 {\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\";\n\nexport async function createConfiguredEmbeddingProvider(): Promise<\n SearchIndexEmbeddingProvider | undefined\n> {\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 WikiGraphEmbeddingProvider = \"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?: WikiGraphEmbeddingProvider;\n}\n\nexport interface QueryEmbeddingResult {\n readonly dimensions: number;\n readonly embedding: readonly number[];\n readonly model: string;\n readonly provider: WikiGraphEmbeddingProvider;\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: WikiGraphEmbeddingProvider,\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: WikiGraphEmbeddingProvider,\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: WikiGraphEmbeddingProvider,\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: WikiGraphEmbeddingProvider,\n _config: WikiGraphEmbeddingConfig,\n): string {\n if (provider === \"openai\") {\n return \"openai\";\n }\n return \"openaiCompatible\";\n}\n\nfunction requireEmbeddingProvider(\n provider: WikiGraphEmbeddingProvider | undefined,\n): WikiGraphEmbeddingProvider {\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): WikiGraphEmbeddingProvider {\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 BuildJobTarget,\n type ChapterEntry,\n type IndexArtifactCoverageRecord,\n type ReadonlyDocument,\n} from \"wiki-graph-core\";\nimport {\n createGenerationPerformanceHints,\n DEFAULT_GENERATION_JOB_CONCURRENCY,\n DEFAULT_GENERATION_REQUEST_CONCURRENCY,\n formatGenerationPlanningModel,\n planGenerationTask,\n type GenerationPerformanceHint,\n type GenerationPlanningCost,\n} from \"../planning.js\";\nimport { loadWikiGraphRuntimeConfig } from \"../runtime-config.js\";\n\ninterface InspectChapter extends ChapterEntry {\n readonly knowledgeGraphReady: boolean;\n readonly readingGraphReady: boolean;\n readonly summaryReady: boolean;\n}\n\nexport interface WikiGraphArchiveInspectImprovement {\n readonly kind: \"add-source\" | \"build\" | \"sync-index\";\n readonly missingChapters?: number;\n readonly missingWords?: number;\n readonly planning?: GenerationPlanningCost;\n readonly recommendation: string;\n readonly task?: BuildJobTarget;\n readonly title: string;\n}\n\nexport interface WikiGraphArchiveInspectCoverage {\n readonly coveredChapters: number;\n readonly coveredWords: number;\n readonly percent: string;\n readonly totalChapters: number;\n readonly totalWords: number;\n}\n\nexport interface WikiGraphArchiveInspectChapterReference {\n readonly chapterId: number;\n readonly locatedUri: string;\n readonly title: string | null;\n readonly uri: string;\n}\n\nexport interface WikiGraphArchiveInspectReport {\n readonly archiveUri: string;\n readonly uri: string;\n readonly scope: {\n readonly chapterId?: number;\n readonly type: \"archive\" | \"chapter\";\n };\n readonly content: {\n readonly chapters: {\n readonly content: number;\n readonly planned: number;\n readonly total: number;\n };\n readonly sourceWords: number;\n readonly summaryWords: number;\n };\n readonly localIndexCache: {\n readonly blockedBy?: \"missing-search-artifacts\";\n readonly current: boolean;\n readonly impact?: string;\n readonly resource?: string;\n readonly status: \"blocked\" | \"current\" | \"missing-or-outdated\";\n readonly syncAvailable: boolean;\n };\n readonly coverage: {\n readonly ftsIndexArtifact: WikiGraphArchiveInspectCoverage;\n readonly knowledgeGraph: WikiGraphArchiveInspectCoverage;\n readonly readingGraph: WikiGraphArchiveInspectCoverage;\n readonly summary: WikiGraphArchiveInspectCoverage;\n readonly summaryEmbeddingIndexArtifact: WikiGraphArchiveInspectCoverage;\n readonly sourceEmbeddingIndexArtifact: WikiGraphArchiveInspectCoverage;\n };\n readonly query: {\n readonly ready: boolean;\n };\n readonly searchArtifacts: {\n readonly blockedChapters: readonly WikiGraphArchiveInspectChapterReference[];\n readonly ready: boolean;\n readonly resource?: string;\n readonly status: \"incomplete\" | \"ready\";\n };\n readonly retrievalGuidance: readonly string[];\n readonly improvements: readonly WikiGraphArchiveInspectImprovement[];\n readonly performanceHints: readonly GenerationPerformanceHint[];\n readonly summaryCoverageNote: string;\n}\n\nexport async function createWikiGraphArchiveInspectReport(\n document: ReadonlyDocument,\n options: {\n readonly archiveUri: string;\n readonly chapterId?: number;\n },\n): Promise<WikiGraphArchiveInspectReport> {\n const { archiveUri } = options;\n const [\n chapters,\n summaryWords,\n indexCacheCurrent,\n config,\n ftsArtifactCoverage,\n sourceEmbeddingArtifactCoverage,\n summaryEmbeddingArtifactCoverage,\n ] = await Promise.all([\n readInspectChapters(document, options.chapterId),\n readSummaryWords(document, options.chapterId),\n isArchiveSearchIndexCurrent(document),\n loadWikiGraphRuntimeConfig(),\n readIndexArtifactCoverage(document, \"fts\", options.chapterId),\n readIndexArtifactCoverage(document, \"embedding-source\", options.chapterId),\n readIndexArtifactCoverage(document, \"embedding-summary\", options.chapterId),\n ]);\n const selectedChapter =\n options.chapterId === undefined ? undefined : chapters[0];\n const scopeUri =\n selectedChapter === undefined\n ? archiveUri\n : formatInspectLocatedChapterUri(archiveUri, selectedChapter);\n const concurrent = {\n job: config.concurrent?.job ?? DEFAULT_GENERATION_JOB_CONCURRENCY,\n request:\n config.concurrent?.request ?? DEFAULT_GENERATION_REQUEST_CONCURRENCY,\n };\n const planningModel = formatGenerationPlanningModel(config.llm);\n const contentChapters = chapters.filter(\n (chapter) => chapter.stage !== \"planned\",\n );\n const sourceWords = sumWords(contentChapters);\n const readingGraphCovered = contentChapters.filter(\n (chapter) => chapter.readingGraphReady,\n );\n const knowledgeGraphCovered = contentChapters.filter(\n (chapter) => chapter.knowledgeGraphReady,\n );\n const summaryCovered = contentChapters.filter(\n (chapter) => chapter.summaryReady,\n );\n const ftsArtifactCovered = filterChaptersByCurrentIndexArtifact(\n contentChapters,\n ftsArtifactCoverage,\n );\n const sourceEmbeddingArtifactCovered = filterChaptersByCurrentIndexArtifact(\n contentChapters,\n sourceEmbeddingArtifactCoverage,\n );\n const summaryEmbeddingArtifactCovered = filterChaptersByCurrentIndexArtifact(\n contentChapters,\n summaryEmbeddingArtifactCoverage,\n );\n const queryBlockedContentChapters = contentChapters.filter(\n (chapter) =>\n !ftsArtifactCovered.includes(chapter) &&\n !sourceEmbeddingArtifactCovered.includes(chapter),\n );\n const queryBlockedChapters = queryBlockedContentChapters.map((chapter) =>\n createInspectChapterReference(archiveUri, chapter),\n );\n const queryReady = queryBlockedChapters.length === 0;\n const improvements = createInspectImprovements({\n concurrent,\n contentChapters,\n indexCacheCurrent,\n planningModel,\n queryBlockedChapters: queryBlockedContentChapters,\n summaryCovered,\n knowledgeGraphCovered,\n readingGraphCovered,\n });\n const performanceHints = createGenerationPerformanceHints({\n chapters: Math.max(\n 0,\n ...improvements.map((improvement) => improvement.missingChapters ?? 0),\n ),\n concurrent,\n hasJobWork: improvements.some(\n (improvement) => improvement.planning !== undefined,\n ),\n hasRequestWork: improvements.some(\n (improvement) => improvement.planning !== undefined,\n ),\n });\n\n return {\n archiveUri,\n uri: scopeUri,\n scope:\n options.chapterId === undefined\n ? { type: \"archive\" }\n : { chapterId: options.chapterId, type: \"chapter\" },\n content: {\n chapters: {\n content: contentChapters.length,\n planned: chapters.length - contentChapters.length,\n total: chapters.length,\n },\n sourceWords,\n summaryWords,\n },\n localIndexCache: {\n current: indexCacheCurrent,\n ...(!queryReady\n ? {\n blockedBy: \"missing-search-artifacts\" as const,\n impact:\n \"The cache cannot be built until every content chapter has a current FTS or source embedding artifact.\",\n }\n : indexCacheCurrent\n ? {}\n : {\n impact:\n \"The next archive query may need to sync index cache first.\",\n resource: \"local CPU/disk time only; no provider calls.\",\n }),\n status: !queryReady\n ? \"blocked\"\n : indexCacheCurrent\n ? \"current\"\n : \"missing-or-outdated\",\n syncAvailable: queryReady && !indexCacheCurrent,\n },\n coverage: {\n ftsIndexArtifact: createInspectCoverage(\n ftsArtifactCovered,\n contentChapters,\n ),\n knowledgeGraph: createInspectCoverage(\n knowledgeGraphCovered,\n contentChapters,\n ),\n readingGraph: createInspectCoverage(readingGraphCovered, contentChapters),\n summary: createInspectCoverage(summaryCovered, contentChapters),\n sourceEmbeddingIndexArtifact: createInspectCoverage(\n sourceEmbeddingArtifactCovered,\n contentChapters,\n ),\n summaryEmbeddingIndexArtifact: createInspectCoverage(\n summaryEmbeddingArtifactCovered,\n contentChapters,\n ),\n },\n query: {\n ready: queryReady,\n },\n searchArtifacts: {\n blockedChapters: queryBlockedChapters,\n ...(!queryReady\n ? {\n resource: \"local CPU/disk time only; no provider calls.\",\n }\n : {}),\n ready: queryReady,\n status: queryReady ? \"ready\" : \"incomplete\",\n },\n retrievalGuidance: formatRetrievalGuidance({\n indexCacheCurrent,\n knowledgeGraphCovered,\n readingGraphCovered,\n contentChapters,\n queryReady,\n sourceWords,\n }),\n improvements,\n performanceHints,\n summaryCoverageNote:\n \"Summary coverage means a current summary artifact exists for the chapter; it does not guarantee that every source topic is represented in the summary text.\",\n };\n}\n\nfunction createInspectChapterReference(\n archiveUri: string,\n chapter: ChapterEntry,\n): WikiGraphArchiveInspectChapterReference {\n return {\n chapterId: chapter.chapterId,\n locatedUri: formatInspectLocatedChapterUri(archiveUri, chapter),\n title: chapter.title,\n uri: chapter.uri,\n };\n}\n\nfunction formatInspectLocatedChapterUri(\n archiveUri: string,\n chapter: Pick<ChapterEntry, \"uri\">,\n): string {\n return `${archiveUri.replace(/\\/+$/u, \"\")}/${chapter.uri.replace(/^wikg:\\/\\//u, \"\")}`;\n}\n\nasync function readInspectChapters(\n document: ReadonlyDocument,\n chapterId: number | undefined,\n): Promise<readonly InspectChapter[]> {\n const chapters =\n chapterId === undefined\n ? await listChapters(document)\n : (await listChapters(document)).filter(\n (chapter) => chapter.chapterId === chapterId,\n );\n\n if (chapterId !== undefined && chapters.length === 0) {\n throw new Error(`Chapter ${chapterId} does not exist.`);\n }\n\n return await Promise.all(\n chapters.map(async (chapter) => {\n const serial = await document.serials.getById(chapter.chapterId);\n\n return {\n ...chapter,\n knowledgeGraphReady: serial?.knowledgeGraphReady === true,\n readingGraphReady: serial?.topologyReady === true,\n summaryReady: chapter.stage === \"summarized\",\n };\n }),\n );\n}\n\nasync function readSummaryWords(\n document: ReadonlyDocument,\n chapterId: number | undefined,\n): Promise<number> {\n return await document.readDatabase(\n async (database) =>\n (await database.queryOne(\n `\n SELECT COALESCE(SUM(words_count), 0) AS words\n FROM text_sentence_records\n WHERE kind = 2\n ${chapterId === undefined ? \"\" : \"AND chapter_id = ?\"}\n `,\n chapterId === undefined ? undefined : [chapterId],\n (row) => Number(row.words),\n )) ?? 0,\n );\n}\n\nasync function readIndexArtifactCoverage(\n document: ReadonlyDocument,\n kind: \"embedding-source\" | \"embedding-summary\" | \"fts\",\n chapterId: number | undefined,\n): Promise<readonly IndexArtifactCoverageRecord[]> {\n const coverage = await document.indexArtifacts.listCoverage(kind);\n\n return chapterId === undefined\n ? coverage\n : coverage.filter((item) => item.serialId === chapterId);\n}\n\nfunction filterChaptersByCurrentIndexArtifact(\n chapters: readonly InspectChapter[],\n coverage: readonly IndexArtifactCoverageRecord[],\n): readonly InspectChapter[] {\n const currentChapterIds = new Set(\n coverage.filter((item) => item.current).map((item) => item.serialId),\n );\n\n return chapters.filter((chapter) => currentChapterIds.has(chapter.chapterId));\n}\n\nfunction createInspectCoverage(\n covered: readonly InspectChapter[],\n total: readonly InspectChapter[],\n): WikiGraphArchiveInspectCoverage {\n const coveredWords = sumWords(covered);\n const totalWords = sumWords(total);\n\n return {\n coveredChapters: covered.length,\n coveredWords,\n percent: formatPercent(coveredWords, totalWords),\n totalChapters: total.length,\n totalWords,\n };\n}\n\nfunction formatRetrievalGuidance(input: {\n readonly contentChapters: readonly InspectChapter[];\n readonly indexCacheCurrent: boolean;\n readonly knowledgeGraphCovered: readonly InspectChapter[];\n readonly queryReady: boolean;\n readonly readingGraphCovered: readonly InspectChapter[];\n readonly sourceWords: number;\n}): readonly string[] {\n if (input.sourceWords === 0 || input.contentChapters.length === 0) {\n return [\n \"Source content: empty.\",\n \"Add source text before using query coverage or graph-based retrieval.\",\n ];\n }\n\n const lines = [\n input.queryReady\n ? `Query: available; local index cache is ${input.indexCacheCurrent ? \"current\" : \"missing or outdated and can be synced from artifacts\"}.`\n : \"Query: unavailable until every content chapter has a current FTS or source embedding artifact.\",\n ];\n\n lines.push(\n formatObjectSearchGuidance(\n \"Reading Graph object retrieval\",\n input.readingGraphCovered,\n input.contentChapters,\n ),\n );\n lines.push(\n formatObjectSearchGuidance(\n \"Entity/triple retrieval\",\n input.knowledgeGraphCovered,\n input.contentChapters,\n ),\n );\n\n return lines;\n}\n\nfunction formatObjectSearchGuidance(\n label: string,\n covered: readonly InspectChapter[],\n total: readonly InspectChapter[],\n): string {\n const coveredWords = sumWords(covered);\n const totalWords = sumWords(total);\n const ratio = totalWords === 0 ? 0 : coveredWords / totalWords;\n const coverage = formatPercent(coveredWords, totalWords);\n\n if (ratio >= 1) {\n return `${label}: covers all source content; it can represent the full scope for object retrieval.`;\n }\n if (ratio >= 0.9) {\n return `${label}: covers ${coverage}; use it as the main path, but source --query is needed for uncovered content.`;\n }\n if (ratio >= 0.5) {\n return `${label}: covers ${coverage}; use it as leads, not as a full-scope substitute for source --query.`;\n }\n\n return `${label}: covers ${coverage}; build missing graph coverage before relying on object retrieval.`;\n}\n\nfunction createInspectImprovements(input: {\n readonly concurrent: { readonly job: number; readonly request: number };\n readonly contentChapters: readonly InspectChapter[];\n readonly indexCacheCurrent: boolean;\n readonly knowledgeGraphCovered: readonly InspectChapter[];\n readonly planningModel: string;\n readonly queryBlockedChapters: readonly InspectChapter[];\n readonly readingGraphCovered: readonly InspectChapter[];\n readonly summaryCovered: readonly InspectChapter[];\n}): readonly WikiGraphArchiveInspectImprovement[] {\n const improvements: WikiGraphArchiveInspectImprovement[] = [];\n\n if (input.contentChapters.length === 0) {\n improvements.push({\n kind: \"add-source\",\n recommendation:\n \"No source content is available yet; add or import source text before graph or summary generation.\",\n title: \"Add source content\",\n });\n return improvements;\n }\n\n if (input.queryBlockedChapters.length > 0) {\n improvements.push({\n kind: \"build\",\n missingChapters: input.queryBlockedChapters.length,\n missingWords: sumWords(input.queryBlockedChapters),\n recommendation:\n \"Build local FTS artifacts to make this scope queryable. This does not call a provider.\",\n task: \"index-fts\",\n title: \"Enable query with local FTS\",\n });\n } else if (!input.indexCacheCurrent) {\n improvements.push({\n kind: \"sync-index\",\n recommendation:\n \"Sync the index cache from chapter index artifacts so query starts without a lazy cache rebuild.\",\n title: \"Sync index cache\",\n });\n }\n\n improvements.push(\n ...createGraphImprovement({\n concurrent: input.concurrent,\n covered: input.readingGraphCovered,\n planningModel: input.planningModel,\n task: \"reading-graph\",\n title: \"Complete Reading Graph coverage\",\n total: input.contentChapters,\n }),\n );\n improvements.push(\n ...createGraphImprovement({\n concurrent: input.concurrent,\n covered: input.knowledgeGraphCovered,\n planningModel: input.planningModel,\n task: \"knowledge-graph\",\n title: \"Complete Knowledge Graph coverage\",\n total: input.contentChapters,\n }),\n );\n improvements.push(\n ...createGraphImprovement({\n concurrent: input.concurrent,\n covered: input.summaryCovered,\n planningModel: input.planningModel,\n task: \"reading-summary\",\n title: \"Complete Summary coverage\",\n total: input.contentChapters,\n }),\n );\n\n return improvements;\n}\n\nfunction createGraphImprovement(input: {\n readonly concurrent: { readonly job: number; readonly request: number };\n readonly covered: readonly InspectChapter[];\n readonly planningModel: string;\n readonly task: \"knowledge-graph\" | \"reading-graph\" | \"reading-summary\";\n readonly title: string;\n readonly total: readonly InspectChapter[];\n}): readonly WikiGraphArchiveInspectImprovement[] {\n const coveredIds = new Set(input.covered.map((chapter) => chapter.chapterId));\n const missing = input.total.filter(\n (chapter) => !coveredIds.has(chapter.chapterId),\n );\n\n if (missing.length === 0) {\n return [];\n }\n\n const missingWords = sumWords(missing);\n\n return [\n {\n kind: \"build\",\n missingChapters: missing.length,\n missingWords,\n planning: planGenerationTask(\n input.task,\n missingWords,\n missing.length,\n input.concurrent,\n input.planningModel,\n ),\n recommendation: formatImprovementRecommendation(\n input.covered,\n input.total,\n missingWords,\n ),\n task: input.task,\n title: input.title,\n },\n ];\n}\n\nfunction formatImprovementRecommendation(\n covered: readonly InspectChapter[],\n total: readonly InspectChapter[],\n missingWords: number,\n): string {\n const totalWords = sumWords(total);\n const coveredWords = sumWords(covered);\n\n if (totalWords === 0) {\n return \"No source content is available.\";\n }\n if (\n total.length === 1 ||\n coveredWords / totalWords >= 0.9 ||\n missingWords <= 1000\n ) {\n return \"Queue the full scope to finish the remaining gap.\";\n }\n\n return \"Queue selected chapters first if only part of the scope matters.\";\n}\n\nfunction sumWords(chapters: readonly Pick<InspectChapter, \"words\">[]): number {\n return chapters.reduce((total, chapter) => total + chapter.words, 0);\n}\n\nfunction formatPercent(numerator: number, denominator: number): string {\n if (denominator === 0) {\n return \"n/a\";\n }\n\n const percent = (numerator / denominator) * 100;\n\n return `${Number.isInteger(percent) ? percent.toFixed(0) : percent.toFixed(1)}%`;\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"],"mappings":"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","names":["randomUUID","rename","rm","stat","basename","dirname","join","Readable","isArchiveSearchIndexCurrent","listChapters","WikiGraph","rm","basename","process","resolve","content","AsyncLocalStorage","join","homedir","join","homedir","formatError","homedir","isAbsolute","resolve","homedir","resolve","isAbsolute","rm","basename","createOpenAI","createOpenAICompatible","createOpenAI","createOpenAICompatible","createOpenAICompatibleName","join","dirname","basename","randomUUID","rename","rm","isArchiveSearchIndexCurrent","listChapters","WikiGraph","stat","Readable"]}