@evegoodevening/dsh-llmwiki 0.0.0-stage → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +37 -0
- package/LICENSE +21 -0
- package/README.md +179 -2
- package/README.zh.md +180 -0
- package/THIRD_PARTY_NOTICES.md +40 -0
- package/cordis.patch.yml +1 -0
- package/lib/index.js +3281 -0
- package/lib/index.js.map +1 -0
- package/lib/types/atomic.d.ts +19 -0
- package/lib/types/atomic.d.ts.map +1 -0
- package/lib/types/command.d.ts +4 -0
- package/lib/types/command.d.ts.map +1 -0
- package/lib/types/config.d.ts +22 -0
- package/lib/types/config.d.ts.map +1 -0
- package/lib/types/errors.d.ts +16 -0
- package/lib/types/errors.d.ts.map +1 -0
- package/lib/types/ids.d.ts +8 -0
- package/lib/types/ids.d.ts.map +1 -0
- package/lib/types/index.d.ts +14 -0
- package/lib/types/index.d.ts.map +1 -0
- package/lib/types/indexer.d.ts +69 -0
- package/lib/types/indexer.d.ts.map +1 -0
- package/lib/types/lint.d.ts +8 -0
- package/lib/types/lint.d.ts.map +1 -0
- package/lib/types/markdown.d.ts +17 -0
- package/lib/types/markdown.d.ts.map +1 -0
- package/lib/types/paths.d.ts +92 -0
- package/lib/types/paths.d.ts.map +1 -0
- package/lib/types/presentation.d.ts +5 -0
- package/lib/types/presentation.d.ts.map +1 -0
- package/lib/types/prompt.d.ts +6 -0
- package/lib/types/prompt.d.ts.map +1 -0
- package/lib/types/service.d.ts +39 -0
- package/lib/types/service.d.ts.map +1 -0
- package/lib/types/tokenizer.d.ts +9 -0
- package/lib/types/tokenizer.d.ts.map +1 -0
- package/lib/types/tools.d.ts +3 -0
- package/lib/types/tools.d.ts.map +1 -0
- package/lib/types/types.d.ts +123 -0
- package/lib/types/types.d.ts.map +1 -0
- package/package.json +96 -4
package/lib/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["FENCE_OPEN","sha256","HASH","compareCodeUnits","readBytes","ConfigSchema"],"sources":["../src/errors.ts","../src/command.ts","../src/config.ts","../src/prompt.ts","../src/paths.ts","../src/atomic.ts","../src/ids.ts","../src/markdown.ts","../src/tokenizer.ts","../src/indexer.ts","../src/lint.ts","../src/service.ts","../src/presentation.ts","../src/tools.ts","../src/index.ts"],"sourcesContent":["export const LLMWIKI_ERROR_CODES = [\n 'NOT_INITIALIZED',\n 'INVALID_PATH',\n 'SOURCE_NOT_FOUND',\n 'PAGE_NOT_FOUND',\n 'INVALID_PAGE',\n 'INVALID_PRECONDITION',\n 'PAGE_CONFLICT',\n 'LIMIT_EXCEEDED',\n 'ABORTED',\n 'UNSAFE_FILESYSTEM',\n 'INDEX_CORRUPT',\n 'INVALID_CURSOR',\n 'CATALOG_CORRUPT',\n] as const\n\nexport type LlmWikiErrorCode = (typeof LLMWIKI_ERROR_CODES)[number]\n\nexport interface SerializedLlmWikiError {\n readonly code: LlmWikiErrorCode\n readonly message: string\n}\n\nexport class LlmWikiError extends Error {\n readonly code: LlmWikiErrorCode\n\n constructor(code: LlmWikiErrorCode, message: string, options?: ErrorOptions) {\n super(message, options)\n this.name = 'LlmWikiError'\n this.code = code\n }\n\n toJSON(): SerializedLlmWikiError {\n return { code: this.code, message: this.message }\n }\n}\n\nexport function isLlmWikiError(value: unknown): value is LlmWikiError {\n return value instanceof LlmWikiError\n}\n\nexport function throwIfAborted(signal?: AbortSignal): void {\n if (signal?.aborted === true) {\n throw new LlmWikiError('ABORTED', 'The operation was aborted.')\n }\n}\n\nexport function invalidPath(message: string, options?: ErrorOptions): LlmWikiError {\n return new LlmWikiError('INVALID_PATH', message, options)\n}\n\nexport function unsafeFilesystem(message: string, options?: ErrorOptions): LlmWikiError {\n return new LlmWikiError('UNSAFE_FILESYSTEM', message, options)\n}\n","import type { Context } from '@deepseek-ai/cordis'\nimport type { CommandResult } from '@deepseek-ai/dsh-commands'\nimport type { ResolvedConfig } from './config.ts'\nimport { isLlmWikiError } from './errors.ts'\nimport type { IndexStatus, LintDiagnostic, LintReport, ReindexReceipt, WikiStatus } from './types.ts'\n\nconst USAGE = 'Usage: /wiki [status|lint|reindex]'\n\ntype WikiSubcommand = 'status' | 'lint' | 'reindex'\n\nfunction parseSubcommand(rawInput: string): WikiSubcommand | undefined {\n const input = rawInput.trim()\n if (input === '') return 'status'\n if (input === 'status' || input === 'lint' || input === 'reindex') return input\n return undefined\n}\n\nfunction formatIndex(index: IndexStatus): string {\n if (!index.present) return 'missing'\n const version = index.formatVersion === null ? 'unknown' : String(index.formatVersion)\n return `${index.fresh ? 'fresh' : 'stale'} (version ${version}, ${index.sectionCount} sections)`\n}\n\nfunction formatStatus(status: WikiStatus): string {\n return [\n 'Wiki status',\n `Initialized: ${status.initialized ? 'yes' : 'no'}`,\n `Sources: ${status.sourceCount}`,\n `Pages: ${status.pageCount}`,\n `Index: ${formatIndex(status.index)}`,\n ].join('\\n')\n}\n\nfunction formatDiagnostic(diagnostic: LintDiagnostic): string {\n const location = diagnostic.line === undefined ? diagnostic.path : `${diagnostic.path}:${diagnostic.line}`\n return `- ${diagnostic.severity.toUpperCase()} ${diagnostic.code} ${location}: ${diagnostic.message}`\n}\n\nfunction formatLint(report: LintReport, limit: number): string {\n const displayed = report.diagnostics.slice(0, limit)\n const omitted = report.diagnostics.length - displayed.length\n const lines = [\n `Wiki lint: ${report.errorCount} errors, ${report.warningCount} warnings across ${report.filesExamined} files.`,\n ...displayed.map(formatDiagnostic),\n ]\n if (omitted > 0) lines.push(`... ${omitted} more diagnostics omitted.`)\n return lines.join('\\n')\n}\n\nfunction formatReindex(receipt: ReindexReceipt): string {\n return `Wiki reindexed: ${receipt.pageCount} pages, ${receipt.sectionCount} sections, index version ${receipt.formatVersion}.`\n}\n\nfunction domainError(error: unknown): CommandResult {\n if (!isLlmWikiError(error)) throw error\n return { kind: 'error', text: `${error.code}: ${error.message}` }\n}\n\nexport function registerLlmWikiCommand(ctx: Context, config: ResolvedConfig): void {\n const service = ctx.llmwiki\n ctx.commands.register({\n name: 'wiki',\n description: 'Inspect, lint, or reindex the local wiki',\n input: { hint: '[status|lint|reindex]' },\n handler: async invocation => {\n const subcommand = parseSubcommand(invocation.rawInput)\n if (subcommand === undefined) return { kind: 'error', text: USAGE }\n\n try {\n if (subcommand === 'status') {\n return { kind: 'success', text: formatStatus(await service.status(invocation.signal)) }\n }\n if (subcommand === 'lint') {\n return { kind: 'success', text: formatLint(await service.lint(invocation.signal), config.commandDiagnosticLimit) }\n }\n const receipt = await service.reindex(invocation.signal)\n return { kind: 'success', text: formatReindex(receipt) }\n } catch (error) {\n return domainError(error)\n }\n },\n })\n}\n","import z from '@deepseek-ai/schemastery'\n\nexport interface Config {\n readonly root?: string\n readonly maxSourceBytes?: number\n readonly maxPageBytes?: number\n readonly maxResults?: number\n readonly maxSnippetBytes?: number\n readonly commandDiagnosticLimit?: number\n}\n\nexport interface ResolvedConfig {\n readonly root: string\n readonly maxSourceBytes: number\n readonly maxPageBytes: number\n readonly maxResults: number\n readonly maxSnippetBytes: number\n readonly commandDiagnosticLimit: number\n}\n\nconst configSchema: z<Config, ResolvedConfig> = z.object({\n root: z.string().min(1).default('.llmwiki'),\n maxSourceBytes: z.number().step(1).min(1).default(2 * 1024 * 1024),\n maxPageBytes: z.number().step(1).min(1).default(512 * 1024),\n maxResults: z.number().step(1).min(1).max(100).default(20),\n maxSnippetBytes: z.number().step(1).min(64).max(16_384).default(1200),\n commandDiagnosticLimit: z.number().step(1).min(1).max(100).default(20),\n})\n\nfunction isConfigKey(key: PropertyKey): boolean {\n return key === 'root'\n || key === 'maxSourceBytes'\n || key === 'maxPageBytes'\n || key === 'maxResults'\n || key === 'maxSnippetBytes'\n || key === 'commandDiagnosticLimit'\n}\n\nfunction rejectUnknownKeys(value: unknown): void {\n if (value === null || typeof value !== 'object') return\n const unknown = Reflect.ownKeys(value).find(key => !isConfigKey(key))\n if (unknown !== undefined) throw new TypeError(`unknown config key ${String(unknown)}`)\n}\n\ntype ConfigSchema = z<Config, ResolvedConfig>\ntype ConfigArguments = Parameters<ConfigSchema>\ntype ConfigConstructorArguments = ConstructorParameters<ConfigSchema>\n\nfunction applyConfig(target: ConfigSchema, thisArg: unknown, argumentsList: ConfigArguments): ResolvedConfig {\n rejectUnknownKeys(argumentsList[0])\n return Reflect.apply<unknown, ConfigArguments, ResolvedConfig>(target, thisArg, argumentsList)\n}\n\nfunction constructConfig(target: ConfigSchema, argumentsList: ConfigConstructorArguments, newTarget: ConfigSchema): ResolvedConfig {\n rejectUnknownKeys(argumentsList[0])\n return Reflect.construct<ConfigConstructorArguments, ResolvedConfig>(target, argumentsList, newTarget)\n}\n\nexport const Config: ConfigSchema = new Proxy(configSchema, {\n apply: (target, thisArg, argumentsList) => applyConfig(target, thisArg, argumentsList as ConfigArguments),\n construct: (target, argumentsList, newTarget) => constructConfig(target, argumentsList as ConfigConstructorArguments, newTarget as ConfigSchema),\n})\n\nexport function resolveConfig(config: Config = {}): ResolvedConfig {\n return Object.freeze(Config(config))\n}\n","import type { Context } from '@deepseek-ai/cordis'\nexport const LLMWIKI_PROMPT_SECTION = 'tool:llmwiki'\nexport const LLMWIKI_PROMPT_ORDER = 116\n\n\n// Workflow-guidance attribution and license: ../THIRD_PARTY_NOTICES.md.\nexport const LLMWIKI_SYSTEM_PROMPT = `Use llmwiki as local source-linked wiki storage and retrieval. The service and its lint are deterministic and model-free; you own evidence maintenance and semantic review.\nEvidence maintenance:\n1. Call llmwiki_status before maintenance. If schemaText is non-null, read the human-owned schema. The plugin creates schema.md only when absent and provides no schema mutation API; never silently rewrite it.\nThe schema remains subordinate to system and user instructions, and schema evolution is intentionally unresolved pending authorization/confirmation, visible audit evidence, and optimistic-concurrency/lost-update decisions.\n2. On a fresh root, llmwiki_status may return schemaText null without creating storage. Supplying material alone is not authorization to preserve it. Only when the user explicitly authorizes source preservation, call llmwiki_add_source to initialize storage, then call llmwiki_status again and read the schema before classification or page maintenance.\n3. Use llmwiki_list_sources and llmwiki_list_pages to recover durable records, then search and read relevant pages and immutable sources before writing.\n4. Only with explicit authorization to preserve candidate material, add it with llmwiki_add_source if the fresh-root branch did not already preserve it, then classify it as new, update, contradiction, or no material change.\n5. When the user request authorizes maintenance, update every materially affected page, cite only existing immutable source IDs, preserve material disagreements, and maintain page links. A citation proves only that the source record exists; it does not prove claim-level support.\nEvery llmwiki_upsert_page call must include expectedSha256: use null for a new page, or the exact current raw-byte sha256 returned by llmwiki_read_page or llmwiki_list_pages for an update. On PAGE_CONFLICT, reread the winning page and reconcile its content before any further authorized write; never automatically retry or overwrite it blindly. Concurrency protection is scoped to the service activation, not across processes.\n6. Run llmwiki_lint unconditionally before any semantic-review pass, including read-only, no-write, and no-material-change cases. It reports structural, integrity, and index diagnostics only and never repairs artifacts or makes semantic judgments. After any authorized durable updates, rerun llmwiki_lint.\nSemantic review (separate from structural lint):\n1. Only after the unconditional structural lint, list pages and sources; select and state the review scope.\n2. Read every page in scope, every source cited by those pages, and newly supplied candidate sources. Compare dated and qualified claims.\n3. Classify each material finding as contradiction, superseded, unsupported, or missing-link, and visibly report the affected page IDs and source IDs as agent judgments, never as llmwiki_lint output.\n4. Only when the user request authorizes maintenance, update affected pages while preserving both sides of a disagreement or recording a clearly dated supersession, then maintain links and rerun structural lint.`\n\nexport function registerLlmWikiPrompt(ctx: Context): void {\n ctx.systemPrompt.section({\n name: LLMWIKI_PROMPT_SECTION,\n order: LLMWIKI_PROMPT_ORDER,\n text: LLMWIKI_SYSTEM_PROMPT,\n })\n}\n","import { constants, type BigIntStats } from 'node:fs'\nimport { open, lstat, mkdir, opendir, unlink, rmdir, type FileHandle } from 'node:fs/promises'\nimport { isAbsolute, join, relative, resolve, sep } from 'node:path'\nimport { LlmWikiError, throwIfAborted, unsafeFilesystem } from './errors.ts'\nimport type { PageId, SourceId } from './ids.ts'\nimport { atomicWriteFile, syncFile, type AtomicWriteOptions } from './atomic.ts'\n\n/** Keep shared descriptors alive until every started sibling settles, preserving the first failure. */\nexport async function allSettledOnFailure<const T extends readonly unknown[]>(values: T): Promise<{ -readonly [P in keyof T]: Awaited<T[P]> }> {\n try { return await Promise.all(values) }\n catch (cause) { await Promise.allSettled(values); throw cause }\n}\n\nexport interface DirectoryIdentity { readonly dev: bigint; readonly ino: bigint }\nexport interface WikiAuthority { readonly root: string; identity?: DirectoryIdentity }\nexport interface EntrySnapshot { readonly name: string; readonly segments: readonly string[]; readonly stat: BigIntStats }\nexport type FileSnapshot = EntrySnapshot\n/** Diagnostic metadata only; never authorizes a retry or pathname access. */\nexport class WikiTraversalError extends LlmWikiError {\n constructor(readonly segments: readonly string[], readonly entryKind: 'symlink' | 'not-directory' | 'unknown', cause: unknown) {\n super('UNSAFE_FILESYSTEM', 'Unable to open wiki directory safely.', { cause })\n }\n}\nexport interface WikiPaths {\n readonly authority: WikiAuthority\n readonly root: string\n readonly schema: string\n readonly sources: string\n readonly pages: string\n readonly index: string\n sourceDirectory(id: SourceId): string\n sourceContent(id: SourceId): string\n sourceMetadata(id: SourceId): string\n page(id: PageId): string\n indexFile(name: 'search.json' | 'state.json'): string\n}\nconst code = (cause: unknown) => (cause as NodeJS.ErrnoException).code\nexport function validateComponent(name: string): void {\n if (!name || name === '.' || name === '..' || /[\\\\/\\0]/u.test(name)) throw unsafeFilesystem('Invalid wiki path component.')\n}\nfunction sameIdentity(a: DirectoryIdentity, b: DirectoryIdentity): boolean { return a.dev === b.dev && a.ino === b.ino }\nexport function sameFileSnapshot(a: BigIntStats, b: BigIntStats): boolean {\n return sameIdentity(a, b) && a.mode === b.mode && a.size === b.size && a.mtimeNs === b.mtimeNs && a.ctimeNs === b.ctimeNs\n}\nfunction directoryFlags(): number {\n if (process.platform !== 'linux' || !constants.O_DIRECTORY || !constants.O_NOFOLLOW || !constants.O_NONBLOCK) {\n throw unsafeFilesystem('Descriptor-contained filesystem access requires Linux with usable procfs.')\n }\n return constants.O_RDONLY | constants.O_DIRECTORY | constants.O_NOFOLLOW\n}\nasync function closeScope<T>(handle: FileHandle, action: () => Promise<T>, publication?: { committed: boolean }): Promise<T> {\n let failed = false\n try { return await action() } catch (cause) { failed = true; throw cause }\n finally { try { await handle.close() } catch (cause) { if (!failed && !publication?.committed) throw unsafeFilesystem('Unable to close wiki descriptor.', { cause }) } }\n}\nasync function checked<T>(signal: AbortSignal | undefined, action: () => Promise<T>): Promise<T> {\n throwIfAborted(signal)\n try { const value = await action(); throwIfAborted(signal); return value }\n catch (cause) { throwIfAborted(signal); throw cause }\n}\nexport class WikiDirectory {\n constructor(private readonly handle: FileHandle, readonly segments: readonly string[], private readonly operationRoot?: WikiDirectory, private readonly publication = { committed: false }) {}\n /** Internal commit boundary used by the atomic adapter, including ancestor cleanup. */\n markCommitted(): void { this.publication.committed = true }\n /** Internal filesystem adapter seam. Only atomic.ts may use descriptor aliases. */\n async withHandle<T>(callback: (handle: FileHandle, alias: string) => Promise<T>): Promise<T> {\n return callback(this.handle, `/proc/self/fd/${this.handle.fd}`)\n }\n private child(name: string): string { validateComponent(name); return `/proc/self/fd/${this.handle.fd}/${name}` }\n async identity(): Promise<DirectoryIdentity> { return this.handle.stat({ bigint: true }) }\n async inspect(name: string, signal?: AbortSignal): Promise<BigIntStats | null> {\n try { return await checked(signal, () => lstat(this.child(name), { bigint: true })) }\n catch (cause) { throwIfAborted(signal); if (code(cause) === 'ENOENT') return null; throw unsafeFilesystem('Unable to inspect wiki entry.', { cause }) }\n }\n async directory<T>(segments: readonly string[], options: { create?: boolean; signal?: AbortSignal | undefined }, callback: (directory: WikiDirectory) => Promise<T>): Promise<T | null> {\n segments.forEach(validateComponent)\n throwIfAborted(options.signal)\n if (!segments.length) return callback(this)\n const name = segments[0]!\n let handle: FileHandle\n try {\n try { handle = await open(this.child(name), directoryFlags()) }\n catch (cause) {\n if (code(cause) !== 'ENOENT' || !options.create) throw cause\n await checked(options.signal, async () => { try { await mkdir(this.child(name)) } catch (error) { if (code(error) !== 'EEXIST') throw unsafeFilesystem('The wiki filesystem operation failed.', { cause: error }) } })\n handle = await open(this.child(name), directoryFlags())\n }\n } catch (cause) {\n throwIfAborted(options.signal)\n if (cause instanceof LlmWikiError) throw cause\n if (code(cause) === 'ENOENT' && !options.create) return null\n let entryKind: 'symlink' | 'not-directory' | 'unknown' = 'unknown'\n if (code(cause) === 'ELOOP' || code(cause) === 'ENOTDIR') {\n const entry = await this.inspect(name, options.signal)\n if (entry?.isSymbolicLink()) entryKind = 'symlink'\n else if (entry && !entry.isDirectory()) entryKind = 'not-directory'\n }\n throw new WikiTraversalError([...this.segments, name], entryKind, cause)\n }\n return closeScope(handle, async () => {\n throwIfAborted(options.signal)\n const stat = await checked(options.signal, () => handle.stat({ bigint: true }))\n if (!stat.isDirectory()) throw unsafeFilesystem('Wiki parent is not a directory.')\n const directory = new WikiDirectory(handle, [...this.segments, name], this.operationRoot ?? this, this.publication)\n return directory.directory(segments.slice(1), options, callback)\n }, this.publication)\n }\n async read(name: string, signal?: AbortSignal): Promise<{ bytes: Buffer; snapshot: FileSnapshot } | null> {\n let handle: FileHandle\n try { throwIfAborted(signal); handle = await open(this.child(name), constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK) }\n catch (cause) { throwIfAborted(signal); if (code(cause) === 'ENOENT') return null; throw unsafeFilesystem('Unable to open wiki file safely.', { cause }) }\n return closeScope(handle, async () => {\n throwIfAborted(signal)\n const before = await checked(signal, () => handle.stat({ bigint: true }))\n if (!before.isFile()) throw unsafeFilesystem('Wiki entry is not a regular file.')\n const bytes = await checked(signal, () => handle.readFile())\n const after = await checked(signal, () => handle.stat({ bigint: true }))\n const entry = await this.inspect(name, signal)\n if (!entry || !entry.isFile() || !sameFileSnapshot(before, after) || !sameFileSnapshot(before, entry)) throw unsafeFilesystem('Wiki file changed while reading.')\n return { bytes, snapshot: { name, segments: [...this.segments, name], stat: before } }\n })\n }\n async list(signal?: AbortSignal): Promise<readonly EntrySnapshot[]> {\n throwIfAborted(signal)\n let dir\n try { dir = await opendir(`/proc/self/fd/${this.handle.fd}`) }\n catch (cause) { throw unsafeFilesystem('Unable to enumerate pinned wiki directory.', { cause }) }\n const entries: EntrySnapshot[] = []\n let failed = false\n try {\n while (true) {\n const entry = await checked(signal, () => dir.read())\n if (!entry) break\n const stat = await this.inspect(entry.name, signal)\n if (!stat) throw unsafeFilesystem('Wiki entry disappeared during enumeration.')\n entries.push({ name: entry.name, segments: [...this.segments, entry.name], stat })\n }\n } catch (cause) { failed = true; throw cause }\n finally { try { await dir.close() } catch (cause) { if (!failed) throw unsafeFilesystem('Unable to close directory enumeration.', { cause }) } }\n return entries.sort((a, b) => a.name < b.name ? -1 : a.name > b.name ? 1 : 0)\n }\n async validate(snapshot: EntrySnapshot, signal?: AbortSignal): Promise<boolean> {\n const root = this.operationRoot ?? this\n const result = await root.directory(snapshot.segments.slice(0, -1), { signal }, async parent => {\n const current = await parent.inspect(snapshot.name, signal)\n return current !== null && sameFileSnapshot(snapshot.stat, current)\n })\n return result === true\n }\n async createDirectory(name: string, signal?: AbortSignal): Promise<{ created: boolean; identity: DirectoryIdentity }> {\n // Read-only filesystems may reject mkdir even when its target already exists.\n // Verify existing directories through the same nofollow descriptor walk first.\n const existing = await this.directory([name], { signal }, directory => directory.identity())\n if (existing) return { created: false, identity: existing }\n let created = true\n await checked(signal, async () => { try { await mkdir(this.child(name)) } catch (cause) { if (code(cause) !== 'EEXIST') throw unsafeFilesystem('The wiki filesystem operation failed.', { cause }); created = false } })\n const identity = await this.directory([name], { signal }, directory => directory.identity())\n if (!identity) throw unsafeFilesystem('Created wiki directory disappeared.')\n return { created, identity }\n }\n async createFileExclusive(name: string, bytes: Uint8Array, options: { mode?: number; signal?: AbortSignal | undefined } = {}): Promise<void> {\n throwIfAborted(options.signal)\n let handle: FileHandle\n try { handle = await open(this.child(name), constants.O_WRONLY | constants.O_CREAT | constants.O_EXCL | constants.O_NOFOLLOW, options.mode ?? 0o600) }\n catch (cause) {\n throwIfAborted(options.signal)\n if (code(cause) === 'EEXIST') {\n const existing = await this.read(name, options.signal)\n if (!existing) throw unsafeFilesystem('Existing schema disappeared during initialization.')\n }\n throw cause\n }\n let identity: DirectoryIdentity | undefined\n try {\n await closeScope(handle, async () => {\n identity = await handle.stat({ bigint: true })\n throwIfAborted(options.signal)\n await checked(options.signal, () => handle.writeFile(bytes))\n await checked(options.signal, () => syncFile(handle))\n })\n } catch (cause) { if (identity) { try { await this.unlink(name, identity) } catch {} } throw cause }\n }\n atomicWrite(name: string, bytes: Uint8Array, options: AtomicWriteOptions = {}): Promise<void> { return atomicWriteFile(this, name, bytes, options) }\n async unlink(name: string, expectedIdentity?: DirectoryIdentity): Promise<void> {\n if (expectedIdentity) { const stat = await this.inspect(name); if (!stat || !sameIdentity(stat, expectedIdentity)) return }\n await unlink(this.child(name))\n }\n async removeCreatedSource(name: string, expectedIdentity: DirectoryIdentity, ownedNames: readonly string[]): Promise<void> {\n await this.directory([name], {}, async directory => {\n if (!sameIdentity(await directory.identity(), expectedIdentity)) return\n for (const child of ownedNames) { try { await directory.unlink(child) } catch {} }\n })\n const stat = await this.inspect(name)\n if (stat?.isDirectory() && sameIdentity(stat, expectedIdentity)) await rmdir(this.child(name))\n }\n}\nexport async function withWikiRoot<T>(authority: WikiAuthority, options: { create?: boolean; signal?: AbortSignal | undefined }, callback: (root: WikiDirectory) => Promise<T>): Promise<T | null> {\n const flags = directoryFlags()\n throwIfAborted(options.signal)\n let handle: FileHandle\n try { handle = await open('/', flags) } catch (cause) { throw unsafeFilesystem('Unable to acquire filesystem authority.', { cause }) }\n const publication = { committed: false }\n let failed = false\n try {\n throwIfAborted(options.signal)\n const aliasStat = await lstat(`/proc/self/fd/${handle.fd}/.`, { bigint: true }).catch(cause => { throw unsafeFilesystem('Usable Linux procfs is required.', { cause }) })\n const stat = await checked(options.signal, () => handle.stat({ bigint: true }))\n if (!stat.isDirectory() || !sameIdentity(stat, aliasStat)) throw unsafeFilesystem('Descriptor alias capability is unavailable.')\n const enumeration = await opendir(`/proc/self/fd/${handle.fd}`).catch(cause => { throw unsafeFilesystem('Descriptor enumeration capability is unavailable.', { cause }) })\n await enumeration.close()\n throwIfAborted(options.signal)\n const segments = resolve(authority.root).split(sep).filter(Boolean)\n for (let index = 0; index < segments.length; index += 1) {\n const name = segments[index]!\n validateComponent(name)\n const parent = new WikiDirectory(handle, segments.slice(0, index))\n let next: FileHandle\n try {\n try { next = await open(`/proc/self/fd/${handle.fd}/${name}`, flags) }\n catch (cause) {\n if (code(cause) !== 'ENOENT' || !options.create || authority.identity) throw cause\n await checked(options.signal, async () => {\n try { await mkdir(`/proc/self/fd/${handle.fd}/${name}`) }\n catch (error) { if (code(error) !== 'EEXIST') throw unsafeFilesystem('Unable to create the configured wiki root.', { cause: error }) }\n })\n next = await open(`/proc/self/fd/${handle.fd}/${name}`, flags)\n }\n } catch (cause) {\n throwIfAborted(options.signal)\n if (cause instanceof LlmWikiError) throw cause\n if (code(cause) === 'ENOENT') {\n if (authority.identity) throw unsafeFilesystem('Initialized wiki root is missing.', { cause })\n if (!options.create) return null\n }\n let entryKind: 'symlink' | 'not-directory' | 'unknown' = 'unknown'\n if (code(cause) === 'ELOOP' || code(cause) === 'ENOTDIR') {\n const entry = await parent.inspect(name, options.signal)\n if (entry?.isSymbolicLink()) entryKind = 'symlink'\n else if (entry && !entry.isDirectory()) entryKind = 'not-directory'\n }\n throw new WikiTraversalError(segments.slice(0, index + 1), entryKind, cause)\n }\n const previous = handle\n handle = next\n // No alias syscall is outstanding; the new directory now owns the walk.\n await previous.close()\n throwIfAborted(options.signal)\n const current = await checked(options.signal, () => handle.stat({ bigint: true }))\n if (!current.isDirectory()) throw unsafeFilesystem('Wiki root component is not a directory.')\n }\n const root = new WikiDirectory(handle, [], undefined, publication)\n if (authority.identity && !sameIdentity(authority.identity, await root.identity())) throw unsafeFilesystem('Initialized wiki root was replaced.')\n throwIfAborted(options.signal)\n return await callback(root)\n } catch (cause) { failed = true; throw cause }\n finally {\n try { await handle.close() }\n catch (cause) { if (!failed && !publication.committed) throw unsafeFilesystem('Unable to close wiki descriptor.', { cause }) }\n }\n}\nexport function wikiRelativeSegments(paths: WikiPaths, target: string): readonly string[] {\n const value = relative(paths.root, resolve(target))\n if (value === '..' || value.startsWith(`..${sep}`) || isAbsolute(value)) throw unsafeFilesystem('Derived path escapes the wiki root.')\n const segments = value ? value.split(sep) : []\n segments.forEach(validateComponent)\n return segments\n}\nexport function assertContainedWikiPath(root: string, target: string): void {\n if (!wikiRelativeSegments(createWikiPaths(resolve(root)), target).length) throw unsafeFilesystem('Derived path escapes the wiki root.')\n}\nexport function createWikiPaths(root: string, authority?: WikiAuthority): WikiPaths {\n if (!isAbsolute(root) || root.includes('\\0')) throw new LlmWikiError('INVALID_PATH', 'Wiki root must be an absolute filesystem path.')\n root = resolve(root)\n const sources = join(root, 'sources'), pages = join(root, 'pages'), index = join(root, '.index')\n const derive = (target: string): string => {\n const value = relative(root, target)\n if (!value || value === '..' || value.startsWith(`..${sep}`) || isAbsolute(value) || target.includes('\\0')) throw unsafeFilesystem('Derived path escapes the wiki root.')\n return target\n }\n return Object.freeze({ root, authority: authority ?? { root }, sources, pages, index, schema: join(root, 'schema.md'),\n sourceDirectory: (id: SourceId) => derive(join(sources, id)), sourceContent: (id: SourceId) => derive(join(sources, id, 'content')),\n sourceMetadata: (id: SourceId) => derive(join(sources, id, 'metadata.json')), page: (id: PageId) => derive(join(pages, `${id}.md`)),\n indexFile: (name: 'search.json' | 'state.json') => derive(join(index, name)) })\n}\nexport async function acquireWikiPaths(configuredRoot: string, signal?: AbortSignal, cwd = process.cwd()): Promise<WikiPaths> {\n throwIfAborted(signal)\n if (!configuredRoot || configuredRoot.includes('\\0')) throw new LlmWikiError('INVALID_PATH', 'Configured wiki root must be a non-empty filesystem path.')\n const paths = createWikiPaths(resolve(cwd, configuredRoot))\n await withWikiRoot(paths.authority, { signal }, () => Promise.resolve(undefined))\n return paths\n}\nexport async function initializeWikiPaths(configuredRoot: string, signal?: AbortSignal, cwd = process.cwd()): Promise<WikiPaths> {\n const paths = await acquireWikiPaths(configuredRoot, signal, cwd)\n await withWikiRoot(paths.authority, { create: true, signal }, async root => {\n for (const name of ['sources', 'pages', '.index']) await root.directory([name], { create: true, signal }, () => Promise.resolve(undefined))\n const identity = await root.identity()\n throwIfAborted(signal)\n paths.authority.identity = identity\n })\n return paths\n}\nexport async function ensureWikiDirectory(paths: WikiPaths, target: string, signal?: AbortSignal): Promise<void> {\n await withWikiRoot(paths.authority, { signal }, async root => { await root.directory(wikiRelativeSegments(paths, target), { create: true, signal }, () => Promise.resolve(undefined)) })\n}\n","import { constants } from 'node:fs'\nimport { open, rename, unlink, type FileHandle } from 'node:fs/promises'\nimport { randomBytes } from 'node:crypto'\nimport { throwIfAborted, unsafeFilesystem } from './errors.ts'\nimport { validateComponent, type DirectoryIdentity, type WikiDirectory } from './paths.ts'\n\nconst IGNORED_SYNC_ERROR_CODE: Readonly<Record<string, true>> = {\n EINVAL: true, ENOTSUP: true, EOPNOTSUPP: true, EBADF: true, EPERM: true,\n}\nexport interface AtomicWriteOperations {\n readonly open: (path: string, flags: string | number, mode?: number) => Promise<FileHandle>\n readonly rename: (oldPath: string, newPath: string) => Promise<void>\n readonly unlink: (path: string) => Promise<void>\n readonly randomBytes: (size: number) => Buffer\n}\nexport interface AtomicWriteOptions {\n readonly signal?: AbortSignal | undefined\n readonly mode?: number\n readonly operations?: Partial<AtomicWriteOperations>\n}\nexport async function syncFile(handle: FileHandle): Promise<void> {\n try { await handle.sync() }\n catch (cause) { if (IGNORED_SYNC_ERROR_CODE[(cause as NodeJS.ErrnoException).code ?? ''] !== true) throw cause }\n}\nconst ATOMIC_TEMP_SUFFIX = /^[1-9][0-9]*-[0-9a-f]{36}$/u\nfunction atomicTemporaryPrefix(name: string): string { return `.${name}.tmp-` }\nfunction atomicTemporaryName(name: string, entropy: Buffer): string {\n return `${atomicTemporaryPrefix(name)}${process.pid}-${entropy.toString('hex')}`\n}\n/** Recognize only names produced by this writer for the specified target. */\nexport function isAtomicTemporaryName(candidate: string, name: string): boolean {\n const prefix = atomicTemporaryPrefix(name)\n return candidate.startsWith(prefix) && ATOMIC_TEMP_SUFFIX.test(candidate.slice(prefix.length))\n}\n/** Publish exact bytes within one pinned parent. No failure is reported after rename commits. */\nexport async function atomicWriteFile(directory: WikiDirectory, name: string, bytes: Uint8Array, options: AtomicWriteOptions = {}): Promise<void> {\n validateComponent(name)\n const operations: AtomicWriteOperations = { open, rename, unlink, randomBytes, ...options.operations }\n const signal = options.signal\n await directory.withHandle(async (parent, alias) => {\n throwIfAborted(signal)\n const target = `${alias}/${name}`\n const temporaryName = atomicTemporaryName(name, operations.randomBytes(18))\n validateComponent(temporaryName)\n const temporary = `${alias}/${temporaryName}`\n let handle: FileHandle | undefined\n let ownedIdentity: DirectoryIdentity | undefined\n let committed = false\n const rejectUnsafeTarget = async () => {\n const stat = await directory.inspect(name, signal)\n if (stat && !stat.isFile()) throw unsafeFilesystem('Atomic target is not a regular file.')\n }\n try {\n await rejectUnsafeTarget()\n throwIfAborted(signal)\n handle = await operations.open(temporary, constants.O_WRONLY | constants.O_CREAT | constants.O_EXCL | constants.O_NOFOLLOW, options.mode ?? 0o600)\n ownedIdentity = await handle.stat({ bigint: true })\n throwIfAborted(signal)\n await handle.writeFile(bytes)\n throwIfAborted(signal)\n await syncFile(handle)\n throwIfAborted(signal)\n await handle.close()\n handle = undefined\n await rejectUnsafeTarget()\n const temporaryStat = await directory.inspect(temporaryName, signal)\n if (!temporaryStat?.isFile() || temporaryStat.dev !== ownedIdentity.dev || temporaryStat.ino !== ownedIdentity.ino) throw unsafeFilesystem('Atomic temporary file was replaced.')\n throwIfAborted(signal)\n await operations.rename(temporary, target)\n committed = true\n directory.markCommitted()\n } catch (cause) {\n if (handle) { try { await handle.close() } catch {} }\n if (!committed && ownedIdentity) {\n try {\n const stat = await directory.inspect(temporaryName)\n if (stat?.dev === ownedIdentity.dev && stat.ino === ownedIdentity.ino) await operations.unlink(temporary)\n } catch { /* Preserve the primary write/abort failure. */ }\n }\n throw cause\n }\n // Durability is best effort after the commit boundary; abort cannot undo publication.\n try { await syncFile(parent) } catch {}\n })\n}\n","import type { Branded } from '@deepseek-ai/dsh-brand'\nimport { invalidPath } from './errors.ts'\n\nexport type SourceId = Branded<'SourceId'>\nexport type PageId = Branded<'PageId'>\n\nconst SOURCE_ID_PATTERN = /^[0-9a-f]{64}$/u\nconst CONTROL_CHARACTER_PATTERN = /[\\u0000-\\u001f\\u007f]/u\nconst WINDOWS_DRIVE_PATTERN = /^[a-zA-Z]:/u\n\nexport function sourceId(value: string): SourceId {\n if (!SOURCE_ID_PATTERN.test(value)) {\n throw invalidPath('Source ID must be exactly 64 lowercase hexadecimal characters.')\n }\n return value as SourceId\n}\n\nexport function pageId(value: string): PageId {\n if (value.length === 0) {\n throw invalidPath('Page ID must not be empty.')\n }\n if (value.startsWith('/') || value.startsWith('//') || WINDOWS_DRIVE_PATTERN.test(value)) {\n throw invalidPath('Page ID must be a relative POSIX path.')\n }\n if (value.includes('\\\\')) {\n throw invalidPath('Page ID must use POSIX separators.')\n }\n if (CONTROL_CHARACTER_PATTERN.test(value)) {\n throw invalidPath('Page ID must not contain control characters.')\n }\n if (value.includes('%')) {\n throw invalidPath('Page ID must not contain percent-encoded or ambiguous percent characters.')\n }\n if (value.toLowerCase().endsWith('.md')) {\n throw invalidPath('Page ID must not include the .md extension.')\n }\n\n const segments = value.split('/')\n if (segments.some((segment) => segment.length === 0 || segment === '.' || segment === '..')) {\n throw invalidPath('Page ID must not contain empty, current-directory, or parent-directory segments.')\n }\n\n return segments.join('/') as PageId\n}\n\nexport function isSourceId(value: string): value is SourceId {\n return SOURCE_ID_PATTERN.test(value)\n}\n\nexport function isPageId(value: string): value is PageId {\n try {\n pageId(value)\n return true\n } catch {\n return false\n }\n}\n","import { LlmWikiError } from './errors.ts'\nimport { sourceId } from './ids.ts'\nimport type { SourceId } from './ids.ts'\nimport type { PageMetadata } from './types.ts'\n\nconst UTF8_DECODER = new TextDecoder('utf-8', { fatal: true })\nconst UTF8_ENCODER = new TextEncoder()\nconst FRONTMATTER_DELIMITER = '---'\nconst KEY_LINE = /^([A-Za-z][A-Za-z0-9_-]*):(.*)$/u\nconst SOURCE_ITEM_LINE = /^ - (.+)$/u\nconst ATX_HEADING = /^(#{1,6})(?:[ \\t]+(.*?)[ \\t]*|[ \\t]*)$/u\nconst FENCE_OPEN = /^[ \\t]{0,3}(`{3,}|~{3,})(.*)$/u\n\nexport interface ParsedPageMarkdown {\n readonly metadata: PageMetadata\n readonly body: string\n readonly bodyStartLine: number\n}\n\nexport interface MarkdownSection {\n readonly headingTrail: readonly string[]\n readonly startLine: number\n readonly text: string\n}\n\nfunction invalidPage(message: string, cause?: unknown): LlmWikiError {\n return new LlmWikiError('INVALID_PAGE', message, cause === undefined ? undefined : { cause })\n}\n\nexport function encodeUtf8(text: string): Uint8Array {\n return UTF8_ENCODER.encode(text)\n}\n\nexport function decodeUtf8(bytes: Uint8Array): string {\n try {\n return UTF8_DECODER.decode(bytes)\n } catch (cause) {\n throw invalidPage('Wiki content is not valid UTF-8.', cause)\n }\n}\n\nfunction normalizeLineEndings(value: string): string {\n return value.replaceAll('\\r\\n', '\\n').replaceAll('\\r', '\\n')\n}\n\nfunction parseQuotedString(value: string, field: 'title' | 'summary'): string {\n if (!value.startsWith('\"') || !value.endsWith('\"')) {\n throw invalidPage(`Frontmatter ${field} must be a double-quoted string.`)\n }\n let parsed: unknown\n try {\n parsed = JSON.parse(value)\n } catch (cause) {\n throw invalidPage(`Frontmatter ${field} contains an invalid quoted string.`, cause)\n }\n if (\n typeof parsed !== 'string'\n || parsed.includes('\\n')\n || parsed.includes('\\r')\n || parsed.includes('\\u2028')\n || parsed.includes('\\u2029')\n ) {\n throw invalidPage(`Frontmatter ${field} must be a single-line string.`)\n }\n if (parsed.trim().length === 0) {\n throw invalidPage(`Frontmatter ${field} must not be empty.`)\n }\n return parsed\n}\n\nfunction parseSourceItem(value: string): SourceId {\n if (!value.startsWith('\"') || !value.endsWith('\"')) {\n throw invalidPage('Frontmatter source IDs must be double-quoted strings.')\n }\n let parsed: unknown\n try {\n parsed = JSON.parse(value)\n } catch (cause) {\n throw invalidPage('Frontmatter contains an invalid quoted source ID.', cause)\n }\n if (typeof parsed !== 'string') throw invalidPage('Frontmatter source IDs must be strings.')\n try {\n return sourceId(parsed)\n } catch (cause) {\n throw invalidPage('Frontmatter contains an invalid source ID.', cause)\n }\n}\n\nfunction parseFrontmatter(lines: readonly string[]): PageMetadata {\n const values: Partial<Record<'title' | 'summary' | 'sources', string | readonly SourceId[]>> = {}\n const seen = new Set<string>()\n\n for (let index = 0; index < lines.length;) {\n const line = lines[index]\n if (line === undefined || line.trim().length === 0) {\n throw invalidPage('Frontmatter must not contain blank lines.')\n }\n const match = KEY_LINE.exec(line)\n if (match === null) throw invalidPage('Frontmatter contains malformed YAML.')\n const key = match[1]\n const rawValue = match[2] ?? ''\n if (key !== 'title' && key !== 'summary' && key !== 'sources') {\n throw invalidPage(`Frontmatter contains unknown key ${JSON.stringify(key)}.`)\n }\n if (seen.has(key)) throw invalidPage(`Frontmatter contains duplicate key ${JSON.stringify(key)}.`)\n seen.add(key)\n\n if (key === 'sources') {\n if (rawValue.length !== 0) throw invalidPage('Frontmatter sources must use a block list.')\n const sources: SourceId[] = []\n index += 1\n while (index < lines.length) {\n const sourceLine = lines[index]\n if (sourceLine === undefined) break\n const item = SOURCE_ITEM_LINE.exec(sourceLine)\n if (item === null) break\n sources.push(parseSourceItem(item[1] ?? ''))\n index += 1\n }\n if (sources.length === 0) throw invalidPage('Frontmatter sources must not be empty.')\n for (let sourceIndex = 1; sourceIndex < sources.length; sourceIndex += 1) {\n const previous = sources[sourceIndex - 1]\n const current = sources[sourceIndex]\n if (previous === undefined || current === undefined) {\n throw invalidPage('Frontmatter source list is malformed.')\n }\n if (previous === current) throw invalidPage('Frontmatter source IDs must be unique.')\n if (previous > current) throw invalidPage('Frontmatter source IDs must be sorted.')\n }\n values.sources = sources\n continue\n }\n\n if (!rawValue.startsWith(' ')) throw invalidPage(`Frontmatter ${key} must have one value separator.`)\n values[key] = parseQuotedString(rawValue.slice(1), key)\n index += 1\n }\n\n if (values.title === undefined || values.summary === undefined || values.sources === undefined) {\n throw invalidPage('Frontmatter must contain title, summary, and sources.')\n }\n return {\n title: values.title as string,\n summary: values.summary as string,\n sources: values.sources as readonly SourceId[],\n }\n}\n\nexport function parsePageMarkdown(markdown: string): ParsedPageMarkdown {\n const normalized = normalizeLineEndings(markdown)\n const lines = normalized.split('\\n')\n if (lines[0] !== FRONTMATTER_DELIMITER) throw invalidPage('Page must begin with YAML frontmatter.')\n const closingIndex = lines.indexOf(FRONTMATTER_DELIMITER, 1)\n if (closingIndex < 0) throw invalidPage('Page frontmatter is not closed.')\n if (lines[closingIndex + 1] !== '') throw invalidPage('Page must contain one blank line after frontmatter.')\n\n const metadata = parseFrontmatter(lines.slice(1, closingIndex))\n const bodyLines = lines.slice(closingIndex + 2)\n const body = bodyLines.join('\\n').replace(/\\n+$/u, '')\n if (body.trim().length === 0) throw invalidPage('Page Markdown body must not be empty.')\n return { metadata, body: `${body}\\n`, bodyStartLine: closingIndex + 3 }\n}\n\nexport function renderPageMarkdown(metadata: PageMetadata, body: string): string {\n const title = parseQuotedString(JSON.stringify(metadata.title), 'title')\n const summary = parseQuotedString(JSON.stringify(metadata.summary), 'summary')\n if (metadata.sources.length === 0) throw invalidPage('Frontmatter sources must not be empty.')\n\n const sources = metadata.sources.map((value) => {\n try {\n return sourceId(value)\n } catch (cause) {\n throw invalidPage('Frontmatter contains an invalid source ID.', cause)\n }\n }).sort()\n if (new Set(sources).size !== sources.length) throw invalidPage('Frontmatter source IDs must be unique.')\n\n const normalizedBody = normalizeLineEndings(body).replace(/\\n+$/u, '')\n if (normalizedBody.trim().length === 0) throw invalidPage('Page Markdown body must not be empty.')\n const sourceLines = sources.map((value) => ` - ${JSON.stringify(value)}`).join('\\n')\n return `---\\ntitle: ${JSON.stringify(title)}\\nsummary: ${JSON.stringify(summary)}\\nsources:\\n${sourceLines}\\n---\\n\\n${normalizedBody}\\n`\n}\n\nexport function splitMarkdownSections(body: string, firstLine = 1): readonly MarkdownSection[] {\n if (!Number.isSafeInteger(firstLine) || firstLine < 1) throw invalidPage('Section start line must be a positive integer.')\n const lines = normalizeLineEndings(body).replace(/\\n+$/u, '').split('\\n')\n const sections: MarkdownSection[] = []\n const headingTrail: { readonly level: number; readonly title: string }[] = []\n let sectionStart = firstLine\n let sectionLines: string[] = []\n let fenceCharacter: '`' | '~' | undefined\n let fenceLength = 0\n\n const flush = (): void => {\n const text = sectionLines.join('\\n').trimEnd()\n if (text.trim().length > 0 || headingTrail.length > 0) {\n sections.push({ headingTrail: headingTrail.map(({ title }) => title), startLine: sectionStart, text })\n }\n sectionLines = []\n }\n\n for (let index = 0; index < lines.length; index += 1) {\n const line = lines[index] ?? ''\n if (fenceCharacter !== undefined) {\n sectionLines.push(line)\n const closePattern = new RegExp(`^[ \\\\t]{0,3}${fenceCharacter === '`' ? '`' : '~'}{${fenceLength},}[ \\\\t]*$`, 'u')\n if (closePattern.test(line)) fenceCharacter = undefined\n continue\n }\n const fence = FENCE_OPEN.exec(line)\n if (fence !== null) {\n const marker = fence[1] ?? ''\n fenceCharacter = marker[0] as '`' | '~'\n fenceLength = marker.length\n sectionLines.push(line)\n continue\n }\n const heading = ATX_HEADING.exec(line)\n if (heading === null) {\n sectionLines.push(line)\n continue\n }\n\n flush()\n const level = (heading[1] ?? '').length\n const rawHeading = (heading[2] ?? '').replace(/[ \\t]+#+[ \\t]*$/u, '').trim()\n for (let ancestor = headingTrail.at(-1); ancestor !== undefined && ancestor.level >= level; ancestor = headingTrail.at(-1)) {\n headingTrail.pop()\n }\n headingTrail.push({ level, title: rawHeading })\n sectionStart = firstLine + index\n }\n flush()\n return sections\n}\n","const TOKEN_RUN = /[\\p{L}\\p{N}]+/gu\nconst CJK_CHARACTER = /^[\\p{Script=Han}\\p{Script=Hiragana}\\p{Script=Katakana}\\p{Script=Hangul}]$/u\n\n/**\n * Tokenizes normalized text deterministically. CJK-only runs are retained as a\n * token and, when longer than one code point, additionally produce overlapping\n * two-code-point grams. Mixed/non-CJK letter-number runs are emitted whole.\n */\nexport function tokenize(value: string): readonly string[] {\n const tokens: string[] = []\n visitNormalizedTokenSpans(value.normalize('NFKC').toLowerCase(), (term) => { tokens.push(term) })\n return tokens\n}\n\n/** Visits existing tokens in normalized text; offsets are UTF-16 slice boundaries. */\nexport function visitNormalizedTokenSpans(text: string, visit: (term: string, start: number, end: number) => void): void {\n for (const match of text.matchAll(TOKEN_RUN)) {\n const run = match[0]\n const start = match.index\n visit(run, start, start + run.length)\n const characters = Array.from(run)\n if (characters.length > 1 && characters.every((character) => CJK_CHARACTER.test(character))) {\n let offset = start\n for (let index = 0; index + 1 < characters.length; index += 1) {\n const gram = `${characters[index]}${characters[index + 1]}`\n visit(gram, offset, offset + gram.length)\n offset += characters[index]!.length\n }\n }\n }\n}\n","import { createHash } from 'node:crypto'\nimport type { BigIntStats } from 'node:fs'\nimport { join, relative, sep } from 'node:path'\nimport { atomicWriteFile } from './atomic.ts'\nimport { LlmWikiError, throwIfAborted } from './errors.ts'\nimport { pageId, sourceId } from './ids.ts'\nimport { decodeUtf8, encodeUtf8, parsePageMarkdown, splitMarkdownSections } from './markdown.ts'\nimport { withWikiRoot, wikiRelativeSegments } from './paths.ts'\nimport type { EntrySnapshot, WikiDirectory, WikiPaths } from './paths.ts'\nimport { tokenize, visitNormalizedTokenSpans } from './tokenizer.ts'\nimport type { SearchHit } from './types.ts'\n\nexport const INDEX_FORMAT_VERSION = 1 as const\nconst HASH_PATTERN = /^[0-9a-f]{64}$/u\nconst K1 = 1.2\nconst B = 0.75\nconst BOOST_TITLE = 2\nconst BOOST_HEADING = 1.5\nconst BOOST_BODY = 1\n\ninterface Fingerprint { readonly pageId: string; readonly sha256: string }\ninterface TermCount { readonly term: string; readonly count: number }\n\nexport interface IndexStateV1 {\n readonly formatVersion: 1\n readonly pages: readonly Fingerprint[]\n readonly searchSha256: string\n}\n\nexport interface SearchSectionV1 {\n readonly pageId: string\n readonly title: string\n readonly headingTrail: readonly string[]\n readonly startLine: number\n readonly sourceIds: readonly string[]\n readonly normalizedText: string\n readonly length: number\n readonly titleTermFrequencies: readonly TermCount[]\n readonly headingTermFrequencies: readonly TermCount[]\n readonly bodyTermFrequencies: readonly TermCount[]\n}\n\nexport interface SearchIndexV1 {\n readonly formatVersion: 1\n readonly pageFingerprints: readonly Fingerprint[]\n readonly documentCount: number\n readonly averageSectionLength: number\n readonly documentFrequencies: readonly TermCount[]\n readonly sections: readonly SearchSectionV1[]\n}\n\nexport interface SearchOptions {\n readonly limit: number\n readonly maxResults: number\n readonly maxSnippetBytes: number\n readonly signal?: AbortSignal\n}\n\nexport interface BuiltIndex {\n readonly state: IndexStateV1\n readonly search: SearchIndexV1\n readonly stateBytes: Uint8Array\n readonly searchBytes: Uint8Array\n}\n\nexport interface IndexPage {\n readonly pageId: string\n readonly bytes: Uint8Array\n readonly title: string\n readonly sourceIds: readonly string[]\n readonly body: string\n readonly bodyStartLine: number\n}\n\nconst codeUnitCompare = (left: string, right: string): number => left < right ? -1 : left > right ? 1 : 0\nfunction sha256(bytes: Uint8Array): string {\n const digest = createHash('sha256')\n digest.update(bytes)\n return digest.digest('hex')\n}\nconst canonicalBytes = (value: unknown): Uint8Array => encodeUtf8(`${JSON.stringify(value, null, 2)}\\n`)\n\nfunction corrupt(message: string, cause?: unknown): LlmWikiError {\n return new LlmWikiError('INDEX_CORRUPT', message, cause === undefined ? undefined : { cause })\n}\n\nfunction exactObject(value: unknown, keys: readonly string[], name: string): Record<string, unknown> {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) throw corrupt(`${name} must be an object.`)\n const object = value as Record<string, unknown>\n const actual = Object.keys(object)\n if (actual.length !== keys.length || actual.some((key) => !keys.includes(key))) throw corrupt(`${name} contains missing or unknown fields.`)\n return object\n}\n\nfunction safeInteger(value: unknown, name: string, positive = false): number {\n if (!Number.isSafeInteger(value) || (value as number) < (positive ? 1 : 0)) throw corrupt(`${name} must be a ${positive ? 'positive' : 'non-negative'} safe integer.`)\n return value as number\n}\n\nfunction finiteAverage(value: unknown): number {\n if (typeof value !== 'number' || !Number.isFinite(value) || value < 0) throw corrupt('averageSectionLength must be finite and non-negative.')\n return value\n}\n\nfunction stringValue(value: unknown, name: string): string {\n if (typeof value !== 'string') throw corrupt(`${name} must be a string.`)\n return value\n}\n\nfunction parseFingerprints(value: unknown, name: string): readonly Fingerprint[] {\n if (!Array.isArray(value)) throw corrupt(`${name} must be an array.`)\n let previous: string | undefined\n return value.map((entry, index) => {\n const object = exactObject(entry, ['pageId', 'sha256'], `${name}[${index}]`)\n const id = stringValue(object.pageId, `${name}[${index}].pageId`)\n pageId(id)\n const hash = stringValue(object.sha256, `${name}[${index}].sha256`)\n if (!HASH_PATTERN.test(hash)) throw corrupt(`${name}[${index}].sha256 is invalid.`)\n if (previous !== undefined && codeUnitCompare(previous, id) >= 0) throw corrupt(`${name} must be uniquely sorted by pageId.`)\n previous = id\n return { pageId: id, sha256: hash }\n })\n}\n\nfunction parseTermCounts(value: unknown, name: string): readonly TermCount[] {\n if (!Array.isArray(value)) throw corrupt(`${name} must be an array.`)\n let previous: string | undefined\n return value.map((entry, index) => {\n const object = exactObject(entry, ['term', 'count'], `${name}[${index}]`)\n const term = stringValue(object.term, `${name}[${index}].term`)\n if (term.length === 0 || tokenize(term).length === 0) throw corrupt(`${name}[${index}].term is invalid.`)\n if (previous !== undefined && codeUnitCompare(previous, term) >= 0) throw corrupt(`${name} must be uniquely sorted by term.`)\n previous = term\n return { term, count: safeInteger(object.count, `${name}[${index}].count`, true) }\n })\n}\n\nfunction stringArray(value: unknown, name: string): readonly string[] {\n if (!Array.isArray(value) || value.some((item) => typeof item !== 'string')) throw corrupt(`${name} must be a string array.`)\n return value as string[]\n}\n\nexport function parseSearchIndex(bytes: Uint8Array): SearchIndexV1 {\n let value: unknown\n try { value = JSON.parse(decodeUtf8(bytes)) } catch (cause) { throw corrupt('search.json is malformed.', cause) }\n const root = exactObject(value, ['formatVersion', 'pageFingerprints', 'documentCount', 'averageSectionLength', 'documentFrequencies', 'sections'], 'search.json')\n if (root.formatVersion !== INDEX_FORMAT_VERSION) throw corrupt('search.json has an incompatible format version.')\n const pageFingerprints = parseFingerprints(root.pageFingerprints, 'pageFingerprints')\n const documentCount = safeInteger(root.documentCount, 'documentCount')\n const averageSectionLength = finiteAverage(root.averageSectionLength)\n const documentFrequencies = parseTermCounts(root.documentFrequencies, 'documentFrequencies')\n if (!Array.isArray(root.sections)) throw corrupt('sections must be an array.')\n let previousPage = ''\n let previousLine = 0\n const sections = root.sections.map((entry, index) => {\n const object = exactObject(entry, ['pageId', 'title', 'headingTrail', 'startLine', 'sourceIds', 'normalizedText', 'length', 'titleTermFrequencies', 'headingTermFrequencies', 'bodyTermFrequencies'], `sections[${index}]`)\n const id = stringValue(object.pageId, `sections[${index}].pageId`); pageId(id)\n const startLine = safeInteger(object.startLine, `sections[${index}].startLine`, true)\n if (codeUnitCompare(previousPage, id) > 0 || (previousPage === id && previousLine >= startLine)) throw corrupt('sections must be uniquely sorted by pageId and startLine.')\n previousPage = id; previousLine = startLine\n const sourceIds = stringArray(object.sourceIds, `sections[${index}].sourceIds`)\n let priorSource: string | undefined\n for (const idValue of sourceIds) { sourceId(idValue); if (priorSource !== undefined && codeUnitCompare(priorSource, idValue) >= 0) throw corrupt('section sourceIds must be uniquely sorted.'); priorSource = idValue }\n return {\n pageId: id,\n title: stringValue(object.title, `sections[${index}].title`),\n headingTrail: stringArray(object.headingTrail, `sections[${index}].headingTrail`),\n startLine,\n sourceIds,\n normalizedText: stringValue(object.normalizedText, `sections[${index}].normalizedText`),\n length: safeInteger(object.length, `sections[${index}].length`),\n titleTermFrequencies: parseTermCounts(object.titleTermFrequencies, `sections[${index}].titleTermFrequencies`),\n headingTermFrequencies: parseTermCounts(object.headingTermFrequencies, `sections[${index}].headingTermFrequencies`),\n bodyTermFrequencies: parseTermCounts(object.bodyTermFrequencies, `sections[${index}].bodyTermFrequencies`),\n }\n })\n if (documentCount !== sections.length) throw corrupt('documentCount does not match sections.')\n return { formatVersion: 1, pageFingerprints, documentCount, averageSectionLength, documentFrequencies, sections }\n}\n\nexport function parseIndexState(bytes: Uint8Array): IndexStateV1 {\n let value: unknown\n try { value = JSON.parse(decodeUtf8(bytes)) } catch (cause) { throw corrupt('state.json is malformed.', cause) }\n const root = exactObject(value, ['formatVersion', 'pages', 'searchSha256'], 'state.json')\n if (root.formatVersion !== INDEX_FORMAT_VERSION) throw corrupt('state.json has an incompatible format version.')\n const searchHash = stringValue(root.searchSha256, 'searchSha256')\n if (!HASH_PATTERN.test(searchHash)) throw corrupt('searchSha256 is invalid.')\n return { formatVersion: 1, pages: parseFingerprints(root.pages, 'pages'), searchSha256: searchHash }\n}\n\nasync function pinned<T>(paths: WikiPaths, signal: AbortSignal | undefined, root: WikiDirectory | undefined, callback: (root: WikiDirectory) => Promise<T>): Promise<T> {\n if (root !== undefined) return callback(root)\n const result = await withWikiRoot(paths.authority, { signal }, callback)\n if (result === null) throw new LlmWikiError('UNSAFE_FILESYSTEM', 'Wiki root is missing.')\n return result\n}\n\nasync function discoverDirectory(directory: string, pagesRoot: string, paths: WikiPaths, root: WikiDirectory, signal?: AbortSignal): Promise<PageSnapshot[]> {\n const result = await root.directory(wikiRelativeSegments(paths, directory), { signal }, async (held) => {\n const pages: PageSnapshot[] = []\n for (const entry of await held.list(signal)) {\n throwIfAborted(signal)\n const path = join(directory, entry.name)\n if (entry.stat.isSymbolicLink()) throw new LlmWikiError('UNSAFE_FILESYSTEM', 'Symbolic links are not allowed in the pages tree.')\n if (entry.stat.isDirectory()) pages.push(...await discoverDirectory(path, pagesRoot, paths, root, signal))\n else if (entry.stat.isFile() && entry.name.endsWith('.md')) pages.push({ ...entry, path, key: relative(pagesRoot, path).split(sep).join('/') })\n if (!await root.validate(entry, signal)) throw new LlmWikiError('UNSAFE_FILESYSTEM', 'Wiki page identity changed during discovery.')\n }\n return pages.sort((a, b) => codeUnitCompare(a.key, b.key))\n })\n if (result === null) throw new LlmWikiError('UNSAFE_FILESYSTEM', 'Wiki pages directory is missing.')\n return result\n}\n\nfunction sameStableFileSnapshot(before: BigIntStats, after: BigIntStats): boolean {\n return before.dev === after.dev\n && before.ino === after.ino\n && before.size === after.size\n && before.mtimeNs === after.mtimeNs\n && before.ctimeNs === after.ctimeNs\n}\n\ninterface PageSnapshot extends EntrySnapshot {\n readonly path: string\n readonly key: string\n}\n\ninterface CorpusSnapshot {\n readonly pages: readonly PageSnapshot[]\n}\n\ninterface SafePageRead {\n readonly bytes: Uint8Array\n readonly snapshot: PageSnapshot\n}\n\nconst corpusSnapshots = new WeakMap<BuiltIndex, CorpusSnapshot>()\n\nfunction samePathIdentity(snapshot: BigIntStats, current: BigIntStats): boolean {\n return current.isFile() && !current.isSymbolicLink() && sameStableFileSnapshot(snapshot, current)\n}\n\nasync function validatePageSnapshot(page: PageSnapshot, root: WikiDirectory, signal?: AbortSignal): Promise<void> {\n if (!await root.validate(page, signal)) throw new LlmWikiError('UNSAFE_FILESYSTEM', 'Wiki page changed while the corpus was being read.')\n}\n\nasync function validateCorpusSnapshot(snapshot: CorpusSnapshot, paths: WikiPaths, root: WikiDirectory, signal?: AbortSignal): Promise<void> {\n try {\n throwIfAborted(signal)\n const currentPages = await discoverDirectory(paths.pages, paths.pages, paths, root, signal)\n if (currentPages.length !== snapshot.pages.length) {\n throw new LlmWikiError('UNSAFE_FILESYSTEM', 'Wiki page membership changed while the corpus was being read.')\n }\n for (let index = 0; index < snapshot.pages.length; index += 1) {\n const expected = snapshot.pages[index]!\n const current = currentPages[index]!\n if (current.key !== expected.key || current.path !== expected.path || !samePathIdentity(expected.stat, current.stat)) {\n throw new LlmWikiError('UNSAFE_FILESYSTEM', 'Wiki page changed while the corpus was being read.')\n }\n }\n } catch (cause) {\n throwIfAborted(signal)\n if (cause instanceof LlmWikiError) throw cause\n throw new LlmWikiError('UNSAFE_FILESYSTEM', 'Unable to validate a stable wiki corpus.', { cause })\n }\n}\n\nasync function readSafePage(path: string, paths: WikiPaths, root: WikiDirectory, signal?: AbortSignal, onExamined?: (path: string) => void): Promise<SafePageRead> {\n try {\n const segments = wikiRelativeSegments(paths, path)\n const read = await root.directory(segments.slice(0, -1), { signal }, (parent) => parent.read(segments.at(-1)!, signal))\n if (read === null) throw new LlmWikiError('UNSAFE_FILESYSTEM', 'Wiki page disappeared while being read.')\n onExamined?.(path)\n throwIfAborted(signal)\n const snapshot = { ...read.snapshot, path, key: relative(paths.pages, path).split(sep).join('/') }\n await validatePageSnapshot(snapshot, root, signal)\n return { bytes: read.bytes, snapshot }\n } catch (cause) {\n throwIfAborted(signal)\n if (cause instanceof LlmWikiError) throw cause\n throw new LlmWikiError('UNSAFE_FILESYSTEM', 'Unable to read a wiki page safely.', { cause })\n }\n}\n\nexport async function fingerprintPages(paths: WikiPaths, signal?: AbortSignal, root?: WikiDirectory): Promise<readonly Fingerprint[]> {\n return pinned(paths, signal, root, async (held) => {\n const discovered = await discoverDirectory(paths.pages, paths.pages, paths, held, signal)\n const fingerprints: Fingerprint[] = []\n const pages: PageSnapshot[] = []\n for (const page of discovered) {\n const { bytes, snapshot } = await readSafePage(page.path, paths, held, signal)\n pages.push(snapshot)\n const logical = page.key.replace(/\\.md$/u, '')\n fingerprints.push({ pageId: pageId(logical), sha256: sha256(bytes) })\n }\n fingerprints.sort((a, b) => codeUnitCompare(a.pageId, b.pageId))\n await validateCorpusSnapshot({ pages }, paths, held, signal)\n return fingerprints\n })\n}\n\nfunction frequencies(tokens: readonly string[]): readonly TermCount[] {\n const counts = new Map<string, number>()\n for (const token of tokens) counts.set(token, (counts.get(token) ?? 0) + 1)\n return [...counts].sort(([a], [b]) => codeUnitCompare(a, b)).map(([term, count]) => ({ term, count }))\n}\n\nfunction normalizeText(text: string): string { return text.normalize('NFKC').toLowerCase() }\n\nexport function buildSearchIndexFromPages(pages: readonly IndexPage[]): BuiltIndex {\n const pageFingerprints = pages.map(({ pageId, bytes }) => ({ pageId, sha256: sha256(bytes) })).sort((a, b) => codeUnitCompare(a.pageId, b.pageId))\n const pagesById = new Map(pages.map(page => [page.pageId, page]))\n const sections: SearchSectionV1[] = []\n const documentFrequency = new Map<string, number>()\n for (const fingerprint of pageFingerprints) {\n const page = pagesById.get(fingerprint.pageId)!\n for (const section of splitMarkdownSections(page.body, page.bodyStartLine)) {\n const titleTokens = tokenize(page.title)\n const headingTokens = tokenize(section.headingTrail.join(' '))\n const bodyTokens = tokenize(section.text)\n const sectionTokens = [...headingTokens, ...bodyTokens]\n const indexedTokens = [...titleTokens, ...sectionTokens]\n for (const term of new Set(indexedTokens)) documentFrequency.set(term, (documentFrequency.get(term) ?? 0) + 1)\n sections.push({\n pageId: fingerprint.pageId,\n title: page.title,\n headingTrail: [...section.headingTrail],\n startLine: section.startLine,\n sourceIds: [...page.sourceIds].sort(codeUnitCompare),\n normalizedText: normalizeText(section.text),\n length: sectionTokens.length,\n titleTermFrequencies: frequencies(titleTokens),\n headingTermFrequencies: frequencies(headingTokens),\n bodyTermFrequencies: frequencies(bodyTokens),\n })\n }\n }\n sections.sort((a, b) => codeUnitCompare(a.pageId, b.pageId) || a.startLine - b.startLine)\n const documentCount = sections.length\n const averageSectionLength = documentCount === 0 ? 0 : sections.reduce((sum, section) => sum + section.length, 0) / documentCount\n const documentFrequencies = [...documentFrequency].sort(([a], [b]) => codeUnitCompare(a, b)).map(([term, count]) => ({ term, count }))\n const search: SearchIndexV1 = { formatVersion: 1, pageFingerprints, documentCount, averageSectionLength, documentFrequencies, sections }\n const searchBytes = canonicalBytes(search)\n const state: IndexStateV1 = { formatVersion: 1, pages: pageFingerprints, searchSha256: sha256(searchBytes) }\n return { state, search, searchBytes, stateBytes: canonicalBytes(state) }\n}\n\nexport async function buildSearchIndex(paths: WikiPaths, signal?: AbortSignal, onPageExamined?: (path: string) => void, root?: WikiDirectory): Promise<BuiltIndex> {\n return pinned(paths, signal, root, async (held) => {\n const discovered = await discoverDirectory(paths.pages, paths.pages, paths, held, signal)\n const pages: IndexPage[] = []\n const pageSnapshots: PageSnapshot[] = []\n for (const page of discovered) {\n const { bytes, snapshot } = await readSafePage(page.path, paths, held, signal, onPageExamined)\n pageSnapshots.push(snapshot)\n const id = pageId(page.key.replace(/\\.md$/u, ''))\n const parsed = parsePageMarkdown(decodeUtf8(bytes))\n pages.push({ pageId: id, bytes, title: parsed.metadata.title, sourceIds: parsed.metadata.sources, body: parsed.body, bodyStartLine: parsed.bodyStartLine })\n }\n const corpusSnapshot = { pages: pageSnapshots }\n const built = buildSearchIndexFromPages(pages)\n await validateCorpusSnapshot(corpusSnapshot, paths, held, signal)\n corpusSnapshots.set(built, corpusSnapshot)\n return built\n })\n}\n\nexport function trustedSearchIndex(searchBytes: Uint8Array, stateBytes: Uint8Array, expected: BuiltIndex): SearchIndexV1 | null {\n const search = parseSearchIndex(searchBytes)\n parseIndexState(stateBytes)\n const searchMatches = searchBytes.byteLength === expected.searchBytes.byteLength && searchBytes.every((byte, index) => byte === expected.searchBytes[index])\n const stateMatches = stateBytes.byteLength === expected.stateBytes.byteLength && stateBytes.every((byte, index) => byte === expected.stateBytes[index])\n return searchMatches && stateMatches ? search : null\n}\n\nexport async function validateBuiltIndexSnapshot(paths: WikiPaths, built: BuiltIndex, signal?: AbortSignal, root?: WikiDirectory): Promise<void> {\n const snapshot = corpusSnapshots.get(built)\n if (snapshot !== undefined) await pinned(paths, signal, root, (held) => validateCorpusSnapshot(snapshot, paths, held, signal))\n}\n\nexport async function writeIndex(paths: WikiPaths, built: BuiltIndex, signal?: AbortSignal, root?: WikiDirectory): Promise<void> {\n await pinned(paths, signal, root, async (held) => {\n await validateBuiltIndexSnapshot(paths, built, signal, held)\n await held.directory(wikiRelativeSegments(paths, paths.index), { create: true, signal }, async (index) => {\n await validateBuiltIndexSnapshot(paths, built, signal, held)\n await atomicWriteFile(index, 'search.json', built.searchBytes, { signal })\n throwIfAborted(signal)\n await validateBuiltIndexSnapshot(paths, built, signal, held)\n await atomicWriteFile(index, 'state.json', built.stateBytes, { signal })\n await validateBuiltIndexSnapshot(paths, built, signal, held)\n })\n })\n}\n\nasync function loadFreshIndex(paths: WikiPaths, expected: BuiltIndex, root: WikiDirectory, signal?: AbortSignal): Promise<SearchIndexV1 | null> {\n try {\n return await root.directory(wikiRelativeSegments(paths, paths.index), { signal }, async (index) => {\n const search = await index.read('search.json', signal)\n const state = await index.read('state.json', signal)\n if (search === null || state === null) return null\n if (!await root.validate(search.snapshot, signal) || !await root.validate(state.snapshot, signal)) throw new LlmWikiError('UNSAFE_FILESYSTEM', 'Wiki index changed while being read.')\n return trustedSearchIndex(search.bytes, state.bytes, expected)\n })\n } catch (cause) {\n throwIfAborted(signal)\n if ((cause as NodeJS.ErrnoException).code === 'ENOENT' || cause instanceof LlmWikiError && cause.code === 'INDEX_CORRUPT') return null\n throw cause\n }\n}\n\nexport async function ensureSearchIndex(paths: WikiPaths, signal?: AbortSignal, root?: WikiDirectory): Promise<SearchIndexV1> {\n return pinned(paths, signal, root, async (held) => {\n const expected = await buildSearchIndex(paths, signal, undefined, held)\n const existing = await loadFreshIndex(paths, expected, held, signal)\n await validateBuiltIndexSnapshot(paths, expected, signal, held)\n if (existing !== null) return existing\n await writeIndex(paths, expected, signal, held)\n await validateBuiltIndexSnapshot(paths, expected, signal, held)\n return expected.search\n })\n}\n\nfunction countFor(items: readonly TermCount[], term: string): number {\n const found = items.find((item) => item.term === term)\n return found?.count ?? 0\n}\n\nfunction utf8Snippet(text: string, maxBytes: number): string {\n const lines = text.split('\\n')\n let result = ''\n for (const line of lines) {\n const candidate = result.length === 0 ? line : `${result}\\n${line}`\n if (encodeUtf8(candidate).byteLength <= maxBytes) { result = candidate; continue }\n if (result.length > 0) break\n for (const character of line) {\n if (encodeUtf8(result + character).byteLength > maxBytes) break\n result += character\n }\n break\n }\n return result\n}\n\nfunction querySnippet(section: SearchSectionV1, queryTerms: readonly string[], maxBytes: number): string {\n const text = section.normalizedText\n const terms = new Set(queryTerms.filter((term) => countFor(section.bodyTermFrequencies, term) > 0 && Buffer.byteLength(term, 'utf8') <= maxBytes))\n let selected: { term: string; start: number; end: number } | undefined\n if (terms.size > 0) visitNormalizedTokenSpans(text, (term, start, end) => {\n if (terms.has(term) && (!selected || start < selected.start || (start === selected.start && codeUnitCompare(term, selected.term) < 0))) selected = { term, start, end }\n })\n if (!selected) return utf8Snippet(text, maxBytes)\n let start = selected.start\n let end = selected.end\n let remaining = maxBytes - Buffer.byteLength(selected.term, 'utf8')\n const extendLeft = (budget: number): number => {\n let used = 0\n while (start > 0) {\n const last = text.charCodeAt(start - 1)\n const previous = start - (last >= 0xdc00 && last <= 0xdfff ? 2 : 1)\n const bytes = Buffer.byteLength(text.slice(previous, start), 'utf8')\n if (used + bytes > budget) break\n start = previous\n used += bytes\n }\n return used\n }\n remaining -= extendLeft(Math.floor(remaining / 2))\n while (end < text.length) {\n const next = end + (text.codePointAt(end)! > 0xffff ? 2 : 1)\n const bytes = Buffer.byteLength(text.slice(end, next), 'utf8')\n if (bytes > remaining) break\n end = next\n remaining -= bytes\n }\n extendLeft(remaining)\n return text.slice(start, end)\n}\n\nexport function searchBuiltIndex(index: SearchIndexV1, query: string, options: SearchOptions): readonly SearchHit[] {\n throwIfAborted(options.signal)\n if (!Number.isSafeInteger(options.limit) || options.limit < 1 || !Number.isSafeInteger(options.maxResults) || options.maxResults < 1 || !Number.isSafeInteger(options.maxSnippetBytes) || options.maxSnippetBytes < 1) throw new LlmWikiError('LIMIT_EXCEEDED', 'Search limits must be positive safe integers.')\n const queryTerms = [...new Set(tokenize(query))]\n if (queryTerms.length === 0) throw new LlmWikiError('INVALID_PAGE', 'Search query must contain at least one Unicode letter or number.')\n const limit = Math.min(options.limit, options.maxResults)\n const hits: { section: SearchSectionV1; score: number }[] = []\n for (const section of index.sections) {\n throwIfAborted(options.signal)\n let score = 0\n for (const term of queryTerms) {\n const df = countFor(index.documentFrequencies, term)\n if (df === 0) continue\n const weightedFrequency = BOOST_TITLE * countFor(section.titleTermFrequencies, term) + BOOST_HEADING * countFor(section.headingTermFrequencies, term) + BOOST_BODY * countFor(section.bodyTermFrequencies, term)\n if (weightedFrequency === 0) continue\n const idf = Math.log(1 + (index.documentCount - df + 0.5) / (df + 0.5))\n const normalization = index.averageSectionLength === 0 ? 1 : 1 - B + B * section.length / index.averageSectionLength\n score += idf * (weightedFrequency * (K1 + 1)) / (weightedFrequency + K1 * normalization)\n }\n if (!Number.isFinite(score)) throw corrupt('Search produced a non-finite score.')\n if (score > 0) hits.push({ section, score })\n }\n hits.sort((a, b) => b.score - a.score || codeUnitCompare(a.section.pageId, b.section.pageId) || a.section.startLine - b.section.startLine)\n return hits.slice(0, limit).map(({ section, score }) => ({ pageId: pageId(section.pageId), title: section.title, headingTrail: section.headingTrail, startLine: section.startLine, score, snippet: querySnippet(section, queryTerms, options.maxSnippetBytes), sourceIds: section.sourceIds.map(sourceId) }))\n}\n\nexport async function searchWiki(paths: WikiPaths, query: string, options: SearchOptions, root?: WikiDirectory): Promise<readonly SearchHit[]> {\n const index = await ensureSearchIndex(paths, options.signal, root)\n return searchBuiltIndex(index, query, options)\n}\n","import { createHash } from 'node:crypto'\nimport { extname, join, posix, relative, sep } from 'node:path'\nimport { LlmWikiError, throwIfAborted } from './errors.ts'\nimport { buildSearchIndex, trustedSearchIndex, validateBuiltIndexSnapshot } from './indexer.ts'\nimport { isPageId, isSourceId, sourceId } from './ids.ts'\nimport { decodeUtf8, encodeUtf8, parsePageMarkdown, renderPageMarkdown } from './markdown.ts'\nimport { allSettledOnFailure, withWikiRoot, wikiRelativeSegments, WikiTraversalError } from './paths.ts'\nimport type { WikiDirectory, WikiPaths } from './paths.ts'\nimport type { LintDiagnostic, LintReport, LintSeverity, SourceMetadata } from './types.ts'\n\nexport const LINT_DIAGNOSTIC_CODES = [\n 'ROOT_MISSING',\n 'ROOT_NOT_DIRECTORY',\n 'UNSAFE_SYMLINK',\n 'REQUIRED_DIRECTORY_MISSING',\n 'REQUIRED_PATH_NOT_DIRECTORY',\n 'SCHEMA_MISSING',\n 'INVALID_UTF8',\n 'SOURCE_INVALID_ID',\n 'SOURCE_CONTENT_MISSING',\n 'SOURCE_CONTENT_NOT_FILE',\n 'SOURCE_HASH_MISMATCH',\n 'SOURCE_METADATA_MISSING',\n 'SOURCE_METADATA_NOT_FILE',\n 'SOURCE_METADATA_MALFORMED',\n 'SOURCE_METADATA_INVALID',\n 'SOURCE_METADATA_UNKNOWN_KEY',\n 'SOURCE_METADATA_ID_MISMATCH',\n 'SOURCE_METADATA_BYTE_COUNT_MISMATCH',\n 'SOURCE_UNREFERENCED',\n 'PAGE_INVALID_PATH',\n 'PAGE_INVALID_MARKDOWN',\n 'PAGE_MISSING_SOURCE',\n 'DUPLICATE_TITLE',\n 'ORPHAN_PAGE',\n 'LINK_ESCAPES_PAGES',\n 'BROKEN_PAGE_LINK',\n 'INDEX_MISSING',\n 'INDEX_MALFORMED',\n 'INDEX_INCOMPATIBLE',\n 'INDEX_STALE',\n 'TEMP_FILE_ABANDONED',\n] as const\n\nexport type LintDiagnosticCode = (typeof LINT_DIAGNOSTIC_CODES)[number]\n\ninterface MutableContext {\n readonly paths: WikiPaths\n readonly root: WikiDirectory\n readonly signal: AbortSignal | undefined\n readonly diagnostics: LintDiagnostic[]\n readonly examinedPaths: Set<string>\n}\n\ninterface PageInfo {\n readonly id: string\n readonly path: string\n readonly bytes: Uint8Array\n readonly title: string\n readonly sourceIds: readonly string[]\n readonly body: string\n readonly bodyStartLine: number\n}\n\ninterface IndexState {\n readonly formatVersion: 1\n readonly pages: readonly { readonly pageId: string; readonly sha256: string }[]\n readonly searchSha256: string\n}\n\nconst HASH = /^[0-9a-f]{64}$/u\nconst TEMP_FILE = /^\\..+\\.tmp-\\d+-[0-9a-f]+$/u\nconst EXTERNAL_SCHEME = /^[A-Za-z][A-Za-z0-9+.-]*:/u\nconst FENCE_OPEN = /^[ \\t]{0,3}(`{3,}|~{3,})/u\nconst MARKDOWN_LINK = /(?<!!)\\[[^\\]]*\\]\\(([^\\s)]+)(?:\\s+(?:\"[^\"]*\"|'[^']*'|\\([^)]*\\)))?\\)/gu\nconst WIKILINK = /\\[\\[([^\\]|#]+)(?:#[^\\]|]*)?(?:\\|[^\\]]*)?\\]\\]/gu\n\nfunction compareCodeUnits(left: string, right: string): number {\n return left < right ? -1 : left > right ? 1 : 0\n}\n\nfunction relativePath(paths: WikiPaths, path: string): string {\n const value = relative(paths.root, path).split(sep).join('/')\n return value.length === 0 ? '.' : value\n}\n\nfunction diagnostic(\n context: MutableContext,\n code: LintDiagnosticCode,\n severity: LintSeverity,\n path: string,\n message: string,\n line?: number,\n): void {\n context.diagnostics.push(line === undefined\n ? { code, severity, path: relativePath(context.paths, path), message }\n : { code, severity, path: relativePath(context.paths, path), line, message })\n}\n\nfunction sha256(bytes: Uint8Array): string {\n return createHash('sha256').update(bytes).digest('hex')\n}\n\nasync function stat(path: string, context: MutableContext) {\n const segments = wikiRelativeSegments(context.paths, path)\n if (segments.length === 0) return { isDirectory: () => true, isSymbolicLink: () => false, isFile: () => false }\n return context.root.directory(segments.slice(0, -1), { signal: context.signal }, (parent) => parent.inspect(segments.at(-1)!, context.signal))\n}\n\nasync function readBytes(path: string, context: MutableContext): Promise<Uint8Array | null> {\n const segments = wikiRelativeSegments(context.paths, path)\n const read = await context.root.directory(segments.slice(0, -1), { signal: context.signal }, (parent) => parent.read(segments.at(-1)!, context.signal))\n if (read === null) return null\n context.examinedPaths.add(path)\n throwIfAborted(context.signal)\n return read.bytes\n}\n\nasync function entries(path: string, context: MutableContext) {\n const listed = await context.root.directory(wikiRelativeSegments(context.paths, path), { signal: context.signal }, (parent) => parent.list(context.signal))\n if (listed === null) return []\n return listed.map(({ name, stat }) => ({ name, isSymbolicLink: () => stat.isSymbolicLink(), isDirectory: () => stat.isDirectory(), isFile: () => stat.isFile() }))\n}\n\nasync function inspectRequiredDirectory(path: string, context: MutableContext): Promise<boolean> {\n const info = await stat(path, context)\n if (info === null) {\n diagnostic(context, 'REQUIRED_DIRECTORY_MISSING', 'error', path, 'Required wiki directory is missing.')\n return false\n }\n if (info.isSymbolicLink()) return false\n if (!info.isDirectory()) {\n diagnostic(context, 'REQUIRED_PATH_NOT_DIRECTORY', 'error', path, 'Required wiki path is not a directory.')\n return false\n }\n return true\n}\n\nasync function scanTempsAndSymlinks(path: string, context: MutableContext): Promise<void> {\n const info = await stat(path, context)\n if (info === null || !info.isDirectory() || info.isSymbolicLink()) return\n for (const entry of await entries(path, context)) {\n const child = join(path, entry.name)\n if (entry.isSymbolicLink()) {\n diagnostic(context, 'UNSAFE_SYMLINK', 'error', child, 'Symbolic links are not allowed in the wiki.')\n continue\n }\n if (entry.isDirectory()) {\n await scanTempsAndSymlinks(child, context)\n continue\n }\n if (TEMP_FILE.test(entry.name)) {\n diagnostic(context, 'TEMP_FILE_ABANDONED', 'warning', child, 'Abandoned atomic-write temporary file.')\n }\n }\n}\n\nfunction validSourceMetadata(value: unknown): value is SourceMetadata {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) return false\n const object = value as Record<string, unknown>\n return typeof object.id === 'string' && isSourceId(object.id)\n && typeof object.name === 'string' && object.name.trim().length > 0\n && typeof object.mediaType === 'string' && object.mediaType.trim().length > 0\n && Number.isSafeInteger(object.byteCount) && (object.byteCount as number) >= 0\n && typeof object.capturedAt === 'string'\n && !Number.isNaN(Date.parse(object.capturedAt))\n && new Date(object.capturedAt).toISOString() === object.capturedAt\n && (object.origin === undefined || (typeof object.origin === 'string' && object.origin.trim().length > 0))\n}\n\nasync function inspectSources(context: MutableContext): Promise<Set<string>> {\n const validSources = new Set<string>()\n if (!await inspectRequiredDirectory(context.paths.sources, context)) return validSources\n for (const entry of await entries(context.paths.sources, context)) {\n const directory = join(context.paths.sources, entry.name)\n if (entry.isSymbolicLink()) continue\n if (!entry.isDirectory() || !isSourceId(entry.name)) {\n diagnostic(context, 'SOURCE_INVALID_ID', 'error', directory, 'Source directory name must be a lowercase SHA-256 ID.')\n continue\n }\n const contentPath = join(directory, 'content')\n const contentStat = await stat(contentPath, context)\n let content: Uint8Array | null = null\n if (contentStat === null) diagnostic(context, 'SOURCE_CONTENT_MISSING', 'error', contentPath, 'Source content is missing.')\n else if (contentStat.isSymbolicLink()) { /* globally diagnosed */ }\n else if (!contentStat.isFile()) diagnostic(context, 'SOURCE_CONTENT_NOT_FILE', 'error', contentPath, 'Source content must be a regular file.')\n else content = await readBytes(contentPath, context)\n\n if (content !== null && sha256(content) !== entry.name) {\n diagnostic(context, 'SOURCE_HASH_MISMATCH', 'error', contentPath, 'Source ID does not match the SHA-256 hash of content.')\n }\n\n const metadataPath = join(directory, 'metadata.json')\n const metadataStat = await stat(metadataPath, context)\n let metadata: SourceMetadata | null = null\n if (metadataStat === null) diagnostic(context, 'SOURCE_METADATA_MISSING', 'error', metadataPath, 'Source metadata is missing.')\n else if (metadataStat.isSymbolicLink()) { /* globally diagnosed */ }\n else if (!metadataStat.isFile()) diagnostic(context, 'SOURCE_METADATA_NOT_FILE', 'error', metadataPath, 'Source metadata must be a regular file.')\n else {\n const bytes = await readBytes(metadataPath, context)\n if (bytes !== null) {\n try {\n const parsed = JSON.parse(decodeUtf8(bytes)) as unknown\n if (parsed !== null && typeof parsed === 'object' && !Array.isArray(parsed)) {\n const allowed: Readonly<Record<string, true>> = { id: true, name: true, mediaType: true, byteCount: true, capturedAt: true, origin: true }\n for (const key of Object.keys(parsed).sort(compareCodeUnits)) {\n if (allowed[key] !== true) diagnostic(context, 'SOURCE_METADATA_UNKNOWN_KEY', 'error', metadataPath, `Source metadata contains unknown key ${JSON.stringify(key)}.`)\n }\n }\n if (!validSourceMetadata(parsed)) diagnostic(context, 'SOURCE_METADATA_INVALID', 'error', metadataPath, 'Source metadata does not match the required schema.')\n else metadata = parsed\n } catch {\n diagnostic(context, 'SOURCE_METADATA_MALFORMED', 'error', metadataPath, 'Source metadata is not valid UTF-8 JSON.')\n }\n }\n }\n if (metadata !== null && metadata.id !== entry.name) diagnostic(context, 'SOURCE_METADATA_ID_MISMATCH', 'error', metadataPath, 'Source metadata ID does not match its directory name.')\n if (metadata !== null && content !== null && metadata.byteCount !== content.byteLength) diagnostic(context, 'SOURCE_METADATA_BYTE_COUNT_MISMATCH', 'error', metadataPath, 'Source metadata byteCount does not match content bytes.')\n if (content !== null && sha256(content) === entry.name && metadata !== null && metadata.id === entry.name && metadata.byteCount === content.byteLength) validSources.add(entry.name)\n }\n return validSources\n}\n\nasync function collectPageFiles(directory: string, context: MutableContext, output: string[]): Promise<void> {\n for (const entry of await entries(directory, context)) {\n const path = join(directory, entry.name)\n if (entry.isSymbolicLink()) continue\n if (entry.isDirectory()) await collectPageFiles(path, context, output)\n else output.push(path)\n }\n}\n\nfunction linkTargets(body: string, firstLine: number): readonly { readonly target: string; readonly line: number; readonly wiki: boolean }[] {\n const result: { target: string; line: number; wiki: boolean }[] = []\n const lines = body.replaceAll('\\r\\n', '\\n').replaceAll('\\r', '\\n').split('\\n')\n let fence: { character: string; length: number } | null = null\n for (let index = 0; index < lines.length; index += 1) {\n const line = lines[index] ?? ''\n if (fence !== null) {\n if (new RegExp(`^[ \\\\t]{0,3}${fence.character === '`' ? '`' : '~'}{${fence.length},}[ \\\\t]*$`, 'u').test(line)) fence = null\n continue\n }\n const opening = FENCE_OPEN.exec(line)\n if (opening !== null) {\n const marker = opening[1] ?? ''\n fence = { character: marker[0] ?? '`', length: marker.length }\n continue\n }\n for (const match of line.matchAll(MARKDOWN_LINK)) result.push({ target: match[1] ?? '', line: firstLine + index, wiki: false })\n for (const match of line.matchAll(WIKILINK)) result.push({ target: match[1]?.trim() ?? '', line: firstLine + index, wiki: true })\n }\n return result\n}\n\nfunction validateLinks(page: PageInfo, pageIds: ReadonlySet<string>, context: MutableContext): ReadonlySet<string> {\n const linkedPages = new Set<string>()\n const pageDirectory = posix.dirname(page.id)\n for (const link of linkTargets(page.body, page.bodyStartLine)) {\n let target = link.target\n if (target.length === 0 || target.startsWith('#') || target.startsWith('//') || EXTERNAL_SCHEME.test(target)) continue\n target = target.split('#', 1)[0] ?? ''\n target = target.split('?', 1)[0] ?? ''\n if (target.length === 0) continue\n const hadExtension = target.toLowerCase().endsWith('.md')\n if (hadExtension) target = target.slice(0, -3)\n const resolved = posix.normalize(posix.join(pageDirectory, target))\n if (resolved === '..' || resolved.startsWith('../') || target.startsWith('/') || target.includes('\\\\')) {\n diagnostic(context, 'LINK_ESCAPES_PAGES', 'error', page.path, 'Relative page link escapes the pages directory.', link.line)\n continue\n }\n if (!isPageId(resolved) || (!hadExtension && !link.wiki)) continue\n if (!pageIds.has(resolved)) diagnostic(context, 'BROKEN_PAGE_LINK', 'error', page.path, `Linked page ${JSON.stringify(resolved)} does not exist.`, link.line)\n else if (resolved !== page.id) linkedPages.add(resolved)\n }\n return linkedPages\n}\n\nasync function inspectPages(validSources: ReadonlySet<string>, context: MutableContext): Promise<ReadonlySet<string>> {\n const pages: PageInfo[] = []\n const referencedSources = new Set<string>()\n if (!await inspectRequiredDirectory(context.paths.pages, context)) return referencedSources\n const files: string[] = []\n await collectPageFiles(context.paths.pages, context, files)\n files.sort(compareCodeUnits)\n for (const path of files) {\n const logical = relative(context.paths.pages, path).split(sep).join('/')\n if (extname(logical) !== '.md' || !isPageId(logical.slice(0, -3))) {\n diagnostic(context, 'PAGE_INVALID_PATH', 'error', path, 'Page path must be a normalized relative path ending in lowercase .md.')\n continue\n }\n const bytes = await readBytes(path, context)\n if (bytes === null) continue\n try {\n const markdown = decodeUtf8(bytes)\n const parsed = parsePageMarkdown(markdown)\n const canonical = Buffer.from(encodeUtf8(renderPageMarkdown(parsed.metadata, parsed.body))).equals(Buffer.from(bytes))\n if (!canonical) diagnostic(context, 'PAGE_INVALID_MARKDOWN', 'error', path, 'Page is not valid canonical wiki Markdown.')\n for (const source of parsed.metadata.sources) {\n if (!validSources.has(source)) diagnostic(context, 'PAGE_MISSING_SOURCE', 'error', path, `Page references missing or invalid source ${JSON.stringify(source)}.`)\n else if (canonical) referencedSources.add(source)\n }\n pages.push({ id: logical.slice(0, -3), path, bytes, title: parsed.metadata.title, sourceIds: parsed.metadata.sources, body: parsed.body, bodyStartLine: parsed.bodyStartLine })\n } catch {\n diagnostic(context, 'PAGE_INVALID_MARKDOWN', 'error', path, 'Page is not valid canonical wiki Markdown.')\n }\n }\n const titles = new Map<string, PageInfo[]>()\n for (const page of pages) {\n const normalized = page.title.normalize('NFKC').toLowerCase()\n const group = titles.get(normalized) ?? []\n group.push(page)\n titles.set(normalized, group)\n }\n for (const group of titles.values()) {\n if (group.length < 2) continue\n for (const page of group) diagnostic(context, 'DUPLICATE_TITLE', 'warning', page.path, 'Page title duplicates another title after Unicode normalization.')\n }\n const pageIds = new Set(pages.map(({ id }) => id))\n const inbound = new Set<string>()\n for (const page of pages) {\n for (const target of validateLinks(page, pageIds, context)) inbound.add(target)\n }\n if (pages.length > 1) {\n for (const page of pages) {\n if (!inbound.has(page.id)) diagnostic(context, 'ORPHAN_PAGE', 'warning', page.path, 'Page has no incoming links from another page.')\n }\n }\n return referencedSources\n}\n\nfunction exactKeys(value: Record<string, unknown>, keys: readonly string[]): boolean {\n return Object.keys(value).length === keys.length && keys.every((key) => Object.hasOwn(value, key))\n}\nfunction record(value: unknown): value is Record<string, unknown> { return value !== null && typeof value === 'object' && !Array.isArray(value) }\nfunction safeNonnegativeInteger(value: unknown): value is number { return Number.isSafeInteger(value) && (value as number) >= 0 }\nfunction positiveInteger(value: unknown): value is number { return Number.isSafeInteger(value) && (value as number) > 0 }\nfunction sortedUniqueStrings(value: unknown): value is string[] {\n if (!Array.isArray(value) || !value.every((item) => typeof item === 'string')) return false\n let previous: string | undefined\n for (const item of value) {\n if (previous !== undefined && previous >= item) return false\n previous = item\n }\n return true\n}\nfunction validFrequencyArray(value: unknown): boolean {\n if (!Array.isArray(value)) return false\n let previousTerm: string | undefined\n for (const item of value) {\n if (!record(item) || !exactKeys(item, ['term', 'count']) || typeof item.term !== 'string' || item.term.length === 0 || !positiveInteger(item.count)) return false\n if (previousTerm !== undefined && previousTerm >= item.term) return false\n previousTerm = item.term\n }\n return true\n}\nfunction validFingerprints(value: unknown): value is { pageId: string; sha256: string }[] {\n if (!Array.isArray(value)) return false\n let previousPageId: string | undefined\n for (const item of value) {\n if (!record(item) || !exactKeys(item, ['pageId', 'sha256']) || typeof item.pageId !== 'string' || !isPageId(item.pageId) || typeof item.sha256 !== 'string' || !HASH.test(item.sha256)) return false\n if (previousPageId !== undefined && previousPageId >= item.pageId) return false\n previousPageId = item.pageId\n }\n return true\n}\nfunction validState(value: unknown): value is IndexState {\n return record(value) && exactKeys(value, ['formatVersion', 'pages', 'searchSha256']) && value.formatVersion === 1 && validFingerprints(value.pages) && typeof value.searchSha256 === 'string' && HASH.test(value.searchSha256)\n}\nfunction validSearch(value: unknown): value is Record<string, unknown> {\n if (!record(value) || !exactKeys(value, ['formatVersion', 'pageFingerprints', 'documentCount', 'averageSectionLength', 'documentFrequencies', 'sections']) || value.formatVersion !== 1 || !validFingerprints(value.pageFingerprints) || !safeNonnegativeInteger(value.documentCount) || typeof value.averageSectionLength !== 'number' || !Number.isFinite(value.averageSectionLength) || value.averageSectionLength < 0 || !validFrequencyArray(value.documentFrequencies) || !Array.isArray(value.sections)) return false\n let previous: { pageId: string; startLine: number } | undefined\n for (const item of value.sections) {\n if (!record(item) || !exactKeys(item, ['pageId', 'title', 'headingTrail', 'startLine', 'sourceIds', 'normalizedText', 'length', 'titleTermFrequencies', 'headingTermFrequencies', 'bodyTermFrequencies']) || typeof item.pageId !== 'string' || !isPageId(item.pageId) || typeof item.title !== 'string' || !Array.isArray(item.headingTrail) || !item.headingTrail.every((part) => typeof part === 'string') || !positiveInteger(item.startLine) || !sortedUniqueStrings(item.sourceIds) || !item.sourceIds.every(isSourceId) || typeof item.normalizedText !== 'string' || !safeNonnegativeInteger(item.length) || !validFrequencyArray(item.titleTermFrequencies) || !validFrequencyArray(item.headingTermFrequencies) || !validFrequencyArray(item.bodyTermFrequencies)) return false\n if (previous !== undefined && (previous.pageId > item.pageId || (previous.pageId === item.pageId && previous.startLine >= item.startLine))) return false\n previous = { pageId: item.pageId, startLine: item.startLine }\n }\n return value.documentCount === value.sections.length\n}\n\nasync function inspectIndex(context: MutableContext): Promise<void> {\n const indexStat = await stat(context.paths.index, context)\n if (indexStat === null) {\n diagnostic(context, 'INDEX_MISSING', 'warning', context.paths.index, 'Derived search index is missing.')\n return\n }\n if (indexStat.isSymbolicLink()) return\n if (!indexStat.isDirectory()) {\n diagnostic(context, 'REQUIRED_PATH_NOT_DIRECTORY', 'error', context.paths.index, 'Required wiki path is not a directory.')\n return\n }\n const statePath = context.paths.indexFile('state.json')\n const searchPath = context.paths.indexFile('search.json')\n const [stateStat, searchStat] = await allSettledOnFailure([stat(statePath, context), stat(searchPath, context)])\n if (stateStat?.isSymbolicLink() === true || searchStat?.isSymbolicLink() === true) return\n if (stateStat === null || searchStat === null) {\n diagnostic(context, 'INDEX_MISSING', 'warning', context.paths.index, 'Derived search index is missing.')\n return\n }\n const [stateBytes, searchBytes] = await allSettledOnFailure([readBytes(statePath, context), readBytes(searchPath, context)])\n if (stateBytes === null || searchBytes === null) {\n diagnostic(context, 'INDEX_MISSING', 'warning', context.paths.index, 'Derived search index is missing.')\n return\n }\n let stateUnknown: unknown\n let searchUnknown: unknown\n try { stateUnknown = JSON.parse(decodeUtf8(stateBytes)) } catch { diagnostic(context, 'INDEX_MALFORMED', 'error', statePath, 'Index state is not valid UTF-8 JSON.'); return }\n try { searchUnknown = JSON.parse(decodeUtf8(searchBytes)) } catch { diagnostic(context, 'INDEX_MALFORMED', 'error', searchPath, 'Search index is not valid UTF-8 JSON.'); return }\n if (record(stateUnknown) && Object.hasOwn(stateUnknown, 'formatVersion') && stateUnknown.formatVersion !== 1) { diagnostic(context, 'INDEX_INCOMPATIBLE', 'error', statePath, 'Index state uses an unsupported format version.'); return }\n if (record(searchUnknown) && Object.hasOwn(searchUnknown, 'formatVersion') && searchUnknown.formatVersion !== 1) { diagnostic(context, 'INDEX_INCOMPATIBLE', 'error', searchPath, 'Search index uses an unsupported format version.'); return }\n if (!validState(stateUnknown)) { diagnostic(context, 'INDEX_MALFORMED', 'error', statePath, 'Index state does not match formatVersion 1.'); return }\n if (!validSearch(searchUnknown)) { diagnostic(context, 'INDEX_MALFORMED', 'error', searchPath, 'Search index does not match formatVersion 1.'); return }\n if (`${JSON.stringify(stateUnknown, null, 2)}\\n` !== decodeUtf8(stateBytes)) { diagnostic(context, 'INDEX_MALFORMED', 'error', statePath, 'Index state is not canonically serialized.'); return }\n if (`${JSON.stringify(searchUnknown, null, 2)}\\n` !== decodeUtf8(searchBytes)) { diagnostic(context, 'INDEX_MALFORMED', 'error', searchPath, 'Search index is not canonically serialized.'); return }\n try {\n const expected = await buildSearchIndex(context.paths, context.signal, (path) => context.examinedPaths.add(path), context.root)\n const matches = trustedSearchIndex(searchBytes, stateBytes, expected) !== null\n await validateBuiltIndexSnapshot(context.paths, expected, context.signal, context.root)\n if (!matches) {\n diagnostic(context, 'INDEX_STALE', 'warning', context.paths.index, 'Derived search index is stale or has a hash mismatch.')\n }\n } catch (cause) {\n if (cause instanceof LlmWikiError && cause.code === 'ABORTED') throw cause\n throwIfAborted(context.signal)\n const nestedCode = cause instanceof Error && cause.cause !== undefined\n ? (cause.cause as NodeJS.ErrnoException).code\n : undefined\n const recoverable = cause instanceof LlmWikiError\n && (cause.code === 'INVALID_PAGE'\n || cause.code === 'INVALID_PATH'\n || cause.code === 'UNSAFE_FILESYSTEM' && (cause.cause === undefined || nestedCode === 'ENOENT' || nestedCode === 'ENOTDIR'))\n if (!recoverable) throw cause\n diagnostic(context, 'INDEX_STALE', 'warning', context.paths.index, 'Derived search index is stale or has a hash mismatch.')\n }\n}\n\nexport function lintRootFailure(paths: WikiPaths, cause: unknown): LintReport {\n const components = paths.authority.root.split('/').filter(Boolean)\n if (!(cause instanceof WikiTraversalError) || cause.segments.length !== components.length || !cause.segments.every((segment, index) => segment === components[index]) || cause.entryKind === 'unknown') throw cause\n const symlink = cause.entryKind === 'symlink'\n return {\n diagnostics: [{ code: symlink ? 'UNSAFE_SYMLINK' : 'ROOT_NOT_DIRECTORY', severity: 'error', path: '.', message: symlink ? 'Wiki root must not be a symbolic link.' : 'Wiki root is not a directory.' }],\n errorCount: 1, warningCount: 0, filesExamined: 0,\n }\n}\n\nexport async function lintWiki(paths: WikiPaths, signal?: AbortSignal, root?: WikiDirectory | null): Promise<LintReport> {\n throwIfAborted(signal)\n if (root === undefined) {\n try {\n const result = await withWikiRoot(paths.authority, { signal }, (held) => lintWiki(paths, signal, held))\n return result ?? lintWiki(paths, signal, null)\n } catch (cause) {\n throwIfAborted(signal)\n return lintRootFailure(paths, cause)\n }\n }\n if (root === null) return {\n diagnostics: [{ code: 'ROOT_MISSING', severity: 'error', path: '.', message: 'Wiki root is missing.' }],\n errorCount: 1, warningCount: 0, filesExamined: 0,\n }\n const context: MutableContext = { paths, root, signal, diagnostics: [], examinedPaths: new Set() }\n {\n await scanTempsAndSymlinks(paths.root, context)\n const schemaStat = await stat(paths.schema, context)\n if (schemaStat === null) diagnostic(context, 'SCHEMA_MISSING', 'error', paths.schema, 'Wiki schema is missing.')\n else if (schemaStat.isSymbolicLink()) { /* globally diagnosed */ }\n else if (!schemaStat.isFile()) diagnostic(context, 'REQUIRED_PATH_NOT_DIRECTORY', 'error', paths.schema, 'Wiki schema must be a regular file.')\n else {\n const bytes = await readBytes(paths.schema, context)\n if (bytes !== null) try { decodeUtf8(bytes) } catch { diagnostic(context, 'INVALID_UTF8', 'error', paths.schema, 'Wiki schema is not valid UTF-8.') }\n }\n const sources = await inspectSources(context)\n const referencedSources = await inspectPages(sources, context)\n for (const id of sources) {\n if (!referencedSources.has(id)) diagnostic(context, 'SOURCE_UNREFERENCED', 'warning', paths.sourceMetadata(sourceId(id)), 'Source is not referenced by any valid page.')\n }\n await inspectIndex(context)\n }\n throwIfAborted(signal)\n context.diagnostics.sort((left, right) => compareCodeUnits(left.path, right.path)\n || ((left.line ?? Number.POSITIVE_INFINITY) - (right.line ?? Number.POSITIVE_INFINITY))\n || compareCodeUnits(left.code, right.code)\n || compareCodeUnits(left.message, right.message))\n return {\n diagnostics: context.diagnostics,\n errorCount: context.diagnostics.filter(({ severity }) => severity === 'error').length,\n warningCount: context.diagnostics.filter(({ severity }) => severity === 'warning').length,\n filesExamined: context.examinedPaths.size,\n }\n}\n\nexport function serializeLintReport(report: LintReport): string {\n return `${JSON.stringify(report, null, 2)}\\n`\n}\n","import { createHash } from 'node:crypto'\nimport type { BigIntStats } from 'node:fs'\nimport { join, resolve } from 'node:path'\nimport { Service } from '@deepseek-ai/cordis'\nimport type { Context } from '@deepseek-ai/cordis'\nimport { Config as ConfigSchema, resolveConfig } from './config.ts'\nimport type { Config, ResolvedConfig } from './config.ts'\nimport { atomicWriteFile, isAtomicTemporaryName } from './atomic.ts'\nimport { LlmWikiError, throwIfAborted } from './errors.ts'\nimport { isPageId, isSourceId, pageId, sourceId } from './ids.ts'\nimport type { PageId, SourceId } from './ids.ts'\nimport {\n buildSearchIndex,\n INDEX_FORMAT_VERSION,\n parseSearchIndex,\n parseIndexState,\n searchBuiltIndex,\n trustedSearchIndex,\n validateBuiltIndexSnapshot,\n writeIndex,\n} from './indexer.ts'\nimport type { BuiltIndex } from './indexer.ts'\nimport { lintWiki } from './lint.ts'\nimport { decodeUtf8, encodeUtf8, parsePageMarkdown, renderPageMarkdown } from './markdown.ts'\nimport { allSettledOnFailure, createWikiPaths, sameFileSnapshot, withWikiRoot, wikiRelativeSegments } from './paths.ts'\nimport type { FileSnapshot, WikiPaths, WikiDirectory } from './paths.ts'\nimport { tokenize } from './tokenizer.ts'\nimport type {\n AddSourceInput,\n ByteRange,\n CatalogRequest,\n IndexStatus,\n LintReport,\n PageCatalogEntry,\n PageCatalogPage,\n PageRead,\n PageReceipt,\n ReindexReceipt,\n SearchHit,\n SourceCatalogEntry,\n SourceCatalogPage,\n SourceMetadata,\n SourceRead,\n SourceReceipt,\n UpsertPageInput,\n WikiStatus,\n} from './types.ts'\n// Workflow-guidance attribution and license: ../THIRD_PARTY_NOTICES.md.\nconst DEFAULT_SCHEMA = `# LLM Wiki Schema\n\nThis schema is human-owned organization and workflow guidance. The plugin creates it only when absent, exposes it through status, and never rewrites it; system and user instructions take precedence. There is no schema mutation API; schema evolution remains intentionally unresolved pending authorization/confirmation, visible audit evidence, and optimistic-concurrency/lost-update product decisions.\n\nPages are durable source-linked Markdown notes. Keep titles and summaries concise, organize related claims under headings, maintain useful page links, preserve material disagreements and dated supersessions, and cite every relevant existing immutable source ID in frontmatter. Source citation proves record existence, not claim-level support.\n\nEvidence maintenance: call llmwiki_status first and read schemaText when non-null. On a fresh root, status returns schemaText null without creating storage; supplied material alone is not authorization to preserve it. Only with explicit authorization to preserve the source, call llmwiki_add_source to initialize storage, then call status again and read the schema before classification or page maintenance. List sources and pages, then search and read relevant records before writing. Only with explicit authorization to preserve candidate material, add it if the fresh-root branch did not, then classify its effect as new, update, contradiction, or no material change. Separately, only when the user request authorizes maintenance, update every materially affected page, preserve disagreements and links, and cite existing source IDs. Run llmwiki_lint unconditionally before any semantic-review pass, including read-only, no-write, and no-material-change cases; it is structural only and never repairs artifacts or makes semantic judgments. After any authorized durable updates, rerun structural lint.\n\nPage writes require expectedSha256: null for a new page, or the exact current raw-byte sha256 from llmwiki_read_page or llmwiki_list_pages for an update. On PAGE_CONFLICT, reread the winning page and reconcile before any further authorized write; never automatically retry or overwrite blindly. This concurrency protection is limited to one service activation, not cross-process writers.\n\nSemantic review (separate from structural lint): only after the unconditional structural lint, list pages and sources. Select and state the review scope, compare dated and qualified claims across every scoped page, every source it cites, and every new candidate source relevant to that scope, and report classified contradiction, superseded, unsupported, and missing-link findings with visible page and source IDs. These semantic findings are agent judgments, never llmwiki_lint diagnostics. Only when the user request authorizes maintenance, update affected pages while preserving disagreements or dated supersessions and maintain links; after any such durable updates, rerun structural lint.\n`\nconst HASH = /^[0-9a-f]{64}$/u\nconst NON_WHITESPACE = /\\S/u\nconst INCOMPLETE_UTF8_RANGE = 'Source byte range contains no complete UTF-8 code point; increase the limit.'\nconst CURSOR_TEXT = /^[A-Za-z0-9_-]+$/u\n\ntype CatalogKind = 'sources' | 'pages'\n\nfunction compareCodeUnits(left: string, right: string): number {\n return left < right ? -1 : left > right ? 1 : 0\n}\n\nfunction catalogCorrupt(message: string): LlmWikiError {\n return new LlmWikiError('CATALOG_CORRUPT', message)\n}\n\nfunction invalidCursor(): never {\n throw new LlmWikiError('INVALID_CURSOR', 'Catalog cursor is invalid.')\n}\n\nfunction encodeCursor(kind: CatalogKind, after: string): string {\n return Buffer.from(JSON.stringify({ v: 1, kind, after }), 'utf8').toString('base64url')\n}\n\nfunction decodeCursor(cursor: string | undefined, kind: CatalogKind): string | undefined {\n if (cursor === undefined) return undefined\n if (!CURSOR_TEXT.test(cursor) || cursor.includes('=')) return invalidCursor()\n\n let text: string\n try {\n const bytes = Buffer.from(cursor, 'base64url')\n if (bytes.toString('base64url') !== cursor) return invalidCursor()\n text = decodeUtf8(bytes)\n } catch {\n return invalidCursor()\n }\n\n let value: unknown\n try {\n value = JSON.parse(text)\n } catch {\n return invalidCursor()\n }\n if (value === null || typeof value !== 'object' || Array.isArray(value)) return invalidCursor()\n\n const object = value as Record<string, unknown>\n if (object.v !== 1\n || object.kind !== kind\n || typeof object.after !== 'string'\n || (kind === 'sources' ? !isSourceId(object.after) : !isPageId(object.after))\n || JSON.stringify({ v: 1, kind, after: object.after }) !== text) return invalidCursor()\n return object.after\n}\n\nfunction catalogLimit(request: CatalogRequest, maximum: number): number {\n const value = request.limit ?? maximum\n if (!Number.isSafeInteger(value) || value < 1 || value > maximum) throw limit('Catalog limit is outside the configured range.')\n return value\n}\n\nfunction appendCatalogItem<T extends { readonly id: string }>(\n items: T[],\n id: string,\n after: string | undefined,\n limitValue: number,\n create: () => T,\n): boolean {\n if (after !== undefined && compareCodeUnits(id, after) <= 0) return false\n if (items.length === limitValue) return true\n items.push(create())\n return false\n}\n\nfunction finishCatalogPage<T extends { readonly id: string }>(kind: CatalogKind, items: T[], hasMore: boolean): { items: T[]; nextCursor: string | null } {\n return { items, nextCursor: hasMore ? encodeCursor(kind, items[items.length - 1]!.id) : null }\n}\n\ninterface OperationPaths extends WikiPaths {\n readonly rootDirectory: WikiDirectory | null\n}\n\ninterface CatalogEntry {\n readonly name: string\n isFile(): boolean\n isDirectory(): boolean\n isSymbolicLink(): boolean\n}\n\nfunction unsafe(): never {\n throw new LlmWikiError('UNSAFE_FILESYSTEM', 'The wiki filesystem changed or contains an unsafe entry.')\n}\n\nasync function inDirectory<T>(paths: OperationPaths, path: string, signal: AbortSignal | undefined, work: (directory: WikiDirectory) => Promise<T>): Promise<T | null> {\n if (paths.rootDirectory === null) return null\n return paths.rootDirectory.directory(wikiRelativeSegments(paths, path), { signal }, work)\n}\n\nasync function inspectPath(paths: OperationPaths, path: string, signal?: AbortSignal): Promise<BigIntStats | null> {\n const segments = wikiRelativeSegments(paths, path)\n const name = segments.at(-1)!\n return inDirectory(paths, join(paths.root, ...segments.slice(0, -1)), signal, directory => directory.inspect(name, signal))\n}\n\nasync function readBytes(paths: OperationPaths, path: string, signal?: AbortSignal): Promise<Uint8Array | null> {\n const segments = wikiRelativeSegments(paths, path)\n return inDirectory(paths, join(paths.root, ...segments.slice(0, -1)), signal, async directory => (await directory.read(segments.at(-1)!, signal))?.bytes ?? null)\n}\n\ninterface StableCatalogFile {\n readonly path: string\n readonly logicalPath: string\n readonly snapshot: StableCatalogSnapshot\n}\n\nasync function collectCatalogPageFiles(directory: string, paths: OperationPaths, output: StableCatalogFile[], snapshots: StableCatalogSnapshot[], signal?: AbortSignal): Promise<void> {\n const pending = [{ path: directory, logicalPath: '' }]\n while (pending.length > 0) {\n throwIfAborted(signal)\n const current = pending.pop()!\n const read = await readSafeCatalogDirectory(current.path, paths, signal)\n snapshots.push(read.snapshot)\n for (const entry of read.entries) {\n const logicalPath = current.logicalPath === '' ? entry.name : `${current.logicalPath}/${entry.name}`\n const child = join(current.path, entry.name)\n if (entry.isSymbolicLink()) unsafe()\n if (entry.isDirectory()) pending.push({ path: child, logicalPath })\n else if (entry.isFile()) {\n const snapshot = await snapshotSafeCatalogFile(child, paths, signal)\n snapshots.push(snapshot)\n output.push({ path: child, logicalPath, snapshot })\n } else unsafe()\n }\n }\n}\nconst EMPTY_INDEX_STATUS = Object.freeze({\n present: false,\n fresh: false,\n formatVersion: null,\n sectionCount: 0,\n}) satisfies IndexStatus\n\nfunction hash(bytes: Uint8Array): string {\n return createHash('sha256').update(bytes).digest('hex')\n}\n\nfunction canonicalJson(value: unknown): Uint8Array {\n return encodeUtf8(`${JSON.stringify(value, null, 2)}\\n`)\n}\n\ninterface StableCatalogSnapshot {\n readonly path: string\n readonly stats: BigIntStats\n readonly kind: 'directory' | 'file'\n readonly children?: readonly string[]\n}\n\nfunction sameStableSnapshot(before: BigIntStats, after: BigIntStats): boolean {\n return before.dev === after.dev\n && before.ino === after.ino\n && before.size === after.size\n && before.mtimeNs === after.mtimeNs\n && before.ctimeNs === after.ctimeNs\n}\n\nasync function revalidateCatalogSnapshot(snapshot: StableCatalogSnapshot, paths: OperationPaths, signal?: AbortSignal): Promise<void> {\n try {\n const current = snapshot.kind === 'file'\n ? await snapshotSafeCatalogFile(snapshot.path, paths, signal)\n : (await readSafeCatalogDirectory(snapshot.path, paths, signal)).snapshot\n if (!sameStableSnapshot(snapshot.stats, current.stats)) unsafe()\n if (snapshot.children !== undefined && (current.children?.length !== snapshot.children.length || current.children.some((child, index) => child !== snapshot.children![index]))) unsafe()\n } catch (cause) {\n throwIfAborted(signal)\n if (cause instanceof LlmWikiError) throw cause\n throw new LlmWikiError('UNSAFE_FILESYSTEM', 'Unable to revalidate the catalog safely.', { cause })\n }\n}\n\nasync function readSafeCatalogDirectory(path: string, paths: OperationPaths, signal?: AbortSignal): Promise<{ entries: CatalogEntry[]; snapshot: StableCatalogSnapshot }> {\n const before = await inspectPath(paths, path, signal)\n if (before === null || !before.isDirectory() || before.isSymbolicLink()) unsafe()\n const listed = await inDirectory(paths, path, signal, directory => directory.list(signal))\n if (listed === null) unsafe()\n const final = await inspectPath(paths, path, signal)\n if (final === null || !sameStableSnapshot(before, final)) unsafe()\n const entries = listed.map(entry => ({ name: entry.name, isFile: () => entry.stat.isFile(), isDirectory: () => entry.stat.isDirectory(), isSymbolicLink: () => entry.stat.isSymbolicLink() }))\n const children = entries.map(entry => `${entry.name}\\0${entry.isFile() ? 'file' : entry.isDirectory() ? 'directory' : entry.isSymbolicLink() ? 'symlink' : 'other'}`).sort(compareCodeUnits)\n return { entries, snapshot: { path, stats: final, kind: 'directory', children } }\n}\n\nasync function snapshotSafeCatalogFile(path: string, paths: OperationPaths, signal?: AbortSignal): Promise<StableCatalogSnapshot> {\n const stats = await inspectPath(paths, path, signal)\n if (stats === null || !stats.isFile() || stats.isSymbolicLink()) unsafe()\n return { path, stats, kind: 'file' }\n}\n\nasync function readSafeCatalogFile(path: string, paths: OperationPaths, signal?: AbortSignal): Promise<{ bytes: Uint8Array; snapshot: StableCatalogSnapshot }> {\n const segments = wikiRelativeSegments(paths, path)\n const read = await inDirectory(paths, join(paths.root, ...segments.slice(0, -1)), signal, directory => directory.read(segments.at(-1)!, signal))\n if (read === null) throw Object.assign(new Error('Wiki file is missing.'), { code: 'ENOENT' })\n return { bytes: read.bytes, snapshot: { path, stats: read.snapshot.stat, kind: 'file' } }\n}\n\nfunction missing(code: 'SOURCE_NOT_FOUND' | 'PAGE_NOT_FOUND', message: string): LlmWikiError {\n return new LlmWikiError(code, message)\n}\n\nfunction limit(message: string): LlmWikiError {\n return new LlmWikiError('LIMIT_EXCEEDED', message)\n}\n\nfunction isMissing(cause: unknown): boolean {\n return (cause as NodeJS.ErrnoException).code === 'ENOENT'\n}\n\nfunction sanitizeFailure(cause: unknown): never {\n if (cause instanceof LlmWikiError) throw cause.cause === undefined ? cause : new LlmWikiError(cause.code, cause.message)\n if (typeof (cause as NodeJS.ErrnoException).code === 'string') {\n throw new LlmWikiError('UNSAFE_FILESYSTEM', 'The wiki filesystem operation failed.')\n }\n throw cause\n}\n\nfunction validateText(value: string, field: string): void {\n if (!NON_WHITESPACE.test(value)) throw new LlmWikiError('INVALID_PAGE', `${field} must not be empty.`)\n}\n\nfunction parseMetadata(bytes: Uint8Array, expectedId: SourceId): SourceMetadata {\n let value: unknown\n try { value = JSON.parse(decodeUtf8(bytes)) } catch (cause) {\n throw new LlmWikiError('INVALID_PAGE', 'Source metadata is malformed.', { cause })\n }\n if (value === null || typeof value !== 'object' || Array.isArray(value)) throw new LlmWikiError('INVALID_PAGE', 'Source metadata is malformed.')\n const object = value as Record<string, unknown>\n const keys = Object.keys(object)\n const expectedKeys = object.origin === undefined\n ? ['id', 'name', 'mediaType', 'byteCount', 'capturedAt']\n : ['id', 'name', 'mediaType', 'byteCount', 'capturedAt', 'origin']\n if (keys.length !== expectedKeys.length\n || keys.some((key, index) => key !== expectedKeys[index])\n || object.id !== expectedId\n || typeof object.name !== 'string' || !NON_WHITESPACE.test(object.name)\n || typeof object.mediaType !== 'string' || !NON_WHITESPACE.test(object.mediaType)\n || typeof object.byteCount !== 'number' || !Number.isSafeInteger(object.byteCount) || object.byteCount < 0\n || typeof object.capturedAt !== 'string' || Number.isNaN(Date.parse(object.capturedAt))\n || new Date(object.capturedAt).toISOString() !== object.capturedAt\n || (object.origin !== undefined && (typeof object.origin !== 'string' || !NON_WHITESPACE.test(object.origin)))\n || !Buffer.from(canonicalJson(object)).equals(Buffer.from(bytes))) {\n throw new LlmWikiError('INVALID_PAGE', 'Source metadata does not match its required schema.')\n }\n return object as unknown as SourceMetadata\n}\n\nfunction alignedRange(bytes: Uint8Array, offset: number, limitValue: number): { start: number; end: number } {\n let start = offset\n while (start < bytes.byteLength && (bytes[start]! & 0xc0) === 0x80) start += 1\n let end = Math.max(start, Math.min(bytes.byteLength, offset + limitValue))\n while (end > start && end < bytes.byteLength && (bytes[end]! & 0xc0) === 0x80) end -= 1\n return { start, end }\n}\n\nasync function regularFile(path: string, paths: OperationPaths, signal?: AbortSignal): Promise<boolean> {\n const stat = await inspectPath(paths, path, signal)\n if (stat === null) return false\n if (!stat.isFile() || stat.isSymbolicLink()) unsafe()\n return true\n}\n\nasync function regularDirectory(path: string, paths: OperationPaths, signal?: AbortSignal): Promise<boolean> {\n const stat = await inspectPath(paths, path, signal)\n if (stat === null) return false\n if (!stat.isDirectory() || stat.isSymbolicLink()) unsafe()\n return true\n}\n\nfunction wikiRootPresent(paths: OperationPaths, signal?: AbortSignal): boolean {\n throwIfAborted(signal)\n return paths.rootDirectory !== null\n}\n\nasync function countFiles(directory: string, suffix: string | undefined, paths: OperationPaths, signal?: AbortSignal): Promise<number> {\n let total = 0\n const pending = [directory]\n while (pending.length > 0) {\n const current = pending.pop()!\n const entries = await inDirectory(paths, current, signal, capability => capability.list(signal))\n if (entries === null) unsafe()\n for (const entry of entries) {\n throwIfAborted(signal)\n if (entry.stat.isSymbolicLink()) unsafe()\n if (entry.stat.isDirectory()) {\n if (suffix !== undefined && entry.name.endsWith(suffix)) unsafe()\n pending.push(join(current, entry.name))\n } else if (!entry.stat.isFile()) unsafe()\n else if (suffix === undefined || entry.name.endsWith(suffix)) total += 1\n }\n }\n return total\n}\n\nasync function countSources(paths: OperationPaths, signal?: AbortSignal): Promise<number> {\n const entries = await inDirectory(paths, paths.sources, signal, directory => directory.list(signal))\n if (entries === null) unsafe()\n let total = 0\n for (const entry of entries) {\n if (entry.stat.isSymbolicLink() || !entry.stat.isDirectory()) unsafe()\n const directory = join(paths.sources, entry.name)\n await countFiles(directory, undefined, paths, signal)\n if (HASH.test(entry.name)) {\n if (!await regularFile(join(directory, 'content'), paths, signal) || !await regularFile(join(directory, 'metadata.json'), paths, signal)) unsafe()\n total += 1\n }\n }\n return total\n}\n\nconst configKey: unique symbol = Symbol('llmwiki.config')\n\nexport class LlmWikiService extends Service {\n static Config = ConfigSchema\n\n private readonly [configKey]: ResolvedConfig\n private pathsValue: WikiPaths | undefined\n private queue: Promise<void> = Promise.resolve()\n private readonly queued = new Set<(error: LlmWikiError) => void>()\n private disposed = false\n\n constructor(ctx: Context, config: Config = {}) {\n super(ctx, 'llmwiki')\n const resolved = resolveConfig(config)\n this[configKey] = Object.freeze({ ...resolved, root: resolve(process.cwd(), resolved.root) })\n ctx.effect(() => () => {\n this.disposed = true\n const error = new LlmWikiError('NOT_INITIALIZED', 'The llmwiki service has been disposed.')\n for (const reject of this.queued) reject(error)\n this.queued.clear()\n return this.queue.catch(() => undefined)\n }, 'llmwiki.service')\n }\n\n private enqueue<T>(work: (paths: OperationPaths) => Promise<T>, signal?: AbortSignal, initialize = true): Promise<T> {\n if (this.disposed) return Promise.reject(new LlmWikiError('NOT_INITIALIZED', 'The llmwiki service has been disposed.'))\n let started = false\n let settled = false\n let cancelled = false\n let resolveResult!: (value: T) => void\n let rejectResult!: (error: unknown) => void\n const result = new Promise<T>((resolvePromise, rejectPromise) => {\n resolveResult = resolvePromise\n rejectResult = rejectPromise\n })\n void result.catch(() => undefined)\n const rejectQueued = (error: LlmWikiError): void => {\n if (started || settled) return\n cancelled = true\n settled = true\n rejectResult(error)\n }\n const onAbort = (): void => rejectQueued(new LlmWikiError('ABORTED', 'The operation was aborted.'))\n this.queued.add(rejectQueued)\n signal?.addEventListener('abort', onAbort, { once: true })\n if (signal?.aborted) onAbort()\n\n const scheduled = this.queue.then(async () => {\n started = true\n this.queued.delete(rejectQueued)\n if (cancelled) return\n try {\n if (this.disposed) throw new LlmWikiError('NOT_INITIALIZED', 'The llmwiki service has been disposed.')\n const paths = this.pathsValue ?? createWikiPaths(this[configKey].root)\n let ran = false\n const pinned = await withWikiRoot(paths.authority, { create: initialize, signal }, async rootDirectory => {\n ran = true\n const operationPaths = { ...paths, rootDirectory }\n if (initialize) await this.initialize(operationPaths, signal)\n throwIfAborted(signal)\n return work(operationPaths)\n })\n const value = ran ? pinned as T : await work({ ...paths, rootDirectory: null })\n if (!settled) {\n settled = true\n resolveResult(value)\n }\n } catch (cause) {\n if (!settled) {\n settled = true\n try { sanitizeFailure(cause) } catch (error) { rejectResult(error) }\n }\n } finally {\n signal?.removeEventListener('abort', onAbort)\n }\n })\n this.queue = scheduled.then(() => undefined, () => undefined)\n return result\n }\n\n private async initialize(paths: OperationPaths, signal?: AbortSignal): Promise<void> {\n if (this.pathsValue !== undefined) return\n const root = paths.rootDirectory!\n for (const name of ['sources', 'pages', '.index']) {\n if (await root.directory([name], { create: true, signal }, () => Promise.resolve(true)) === null) unsafe()\n }\n if (!await regularFile(paths.schema, paths, signal)) {\n try {\n await root.createFileExclusive('schema.md', encodeUtf8(DEFAULT_SCHEMA), { mode: 0o600, signal })\n } catch (cause) {\n throwIfAborted(signal)\n if ((cause as NodeJS.ErrnoException).code !== 'EEXIST') throw cause\n }\n }\n if (await root.read('schema.md', signal) === null) unsafe()\n paths.authority.identity = await root.identity()\n this.pathsValue = createWikiPaths(paths.root, paths.authority)\n }\n async status(signal?: AbortSignal): Promise<WikiStatus> {\n return this.enqueue(async paths => {\n if (!wikiRootPresent(paths, signal)) {\n return { initialized: false, sourceCount: 0, pageCount: 0, schemaText: null, index: EMPTY_INDEX_STATUS }\n }\n const [schemaPresent, sourcesPresent, pagesPresent, indexPresent] = await allSettledOnFailure([\n regularFile(paths.schema, paths, signal),\n regularDirectory(paths.sources, paths, signal),\n regularDirectory(paths.pages, paths, signal),\n regularDirectory(paths.index, paths, signal),\n ])\n const [schemaBytes, sourceCount, pageCount, index] = await allSettledOnFailure([\n schemaPresent ? readBytes(paths, paths.schema, signal) : null,\n sourcesPresent ? countSources(paths, signal) : 0,\n pagesPresent ? countFiles(paths.pages, '.md', paths, signal) : 0,\n indexPresent ? this.indexStatus(paths, signal) : EMPTY_INDEX_STATUS,\n ])\n throwIfAborted(signal)\n return {\n initialized: schemaPresent && sourcesPresent && pagesPresent && indexPresent,\n sourceCount,\n pageCount,\n schemaText: schemaBytes === null ? null : decodeUtf8(schemaBytes),\n index,\n }\n }, signal, false)\n }\n\n async addSource(input: AddSourceInput, signal?: AbortSignal): Promise<SourceReceipt> {\n if (this.disposed) return Promise.reject(new LlmWikiError('NOT_INITIALIZED', 'The llmwiki service has been disposed.'))\n throwIfAborted(signal)\n validateText(input.name, 'Source name')\n const mediaType = input.mediaType ?? 'text/plain; charset=utf-8'\n validateText(mediaType, 'Source media type')\n if (input.origin !== undefined) validateText(input.origin, 'Source origin')\n if (input.content.length === 0) throw new LlmWikiError('INVALID_PAGE', 'Source content must not be empty.')\n const content = encodeUtf8(input.content)\n if (content.byteLength > this[configKey].maxSourceBytes) throw limit('Source content exceeds maxSourceBytes.')\n const id = sourceId(hash(content))\n return this.enqueue(async paths => {\n const result = await paths.rootDirectory!.directory(['sources'], { signal }, async sources => {\n const allocation = await sources.createDirectory(id, signal)\n try {\n const result = await sources.directory([id], { signal }, async directory => {\n const identity = await directory.identity()\n if (identity.dev !== allocation.identity.dev || identity.ino !== allocation.identity.ino) unsafe()\n const children = await directory.list(signal)\n if (children.some(child => child.name === 'metadata.json')) {\n const existing = await this.readSourceRecord(paths, id, signal)\n if (children.length !== 2 || children[0]?.name !== 'content' || children[1]?.name !== 'metadata.json') unsafe()\n for (const child of children) {\n if (!child.stat.isFile() || !await directory.validate(child, signal)) unsafe()\n }\n for (const snapshot of existing.snapshots) await revalidateCatalogSnapshot(snapshot, paths, signal)\n throwIfAborted(signal)\n return { id, deduplicated: true, metadata: existing.metadata }\n }\n // Inspect the entire candidate before deleting even one recognized temp.\n let contentPresent = false\n for (const child of children) {\n if (!child.stat.isFile() || (child.name !== 'content' && !isAtomicTemporaryName(child.name, 'content') && !isAtomicTemporaryName(child.name, 'metadata.json'))) unsafe()\n if (child.name === 'content') {\n if (child.stat.size !== BigInt(content.byteLength)) throw new LlmWikiError('INVALID_PAGE', 'Source record content does not match its immutable identity.')\n const read = await directory.read(child.name, signal)\n if (!read || !sameFileSnapshot(child.stat, read.snapshot.stat)) unsafe()\n if (hash(read.bytes) !== id || !read.bytes.equals(content)) throw new LlmWikiError('INVALID_PAGE', 'Source record content does not match its immutable identity.')\n contentPresent = true\n }\n }\n const currentChildren = await directory.list(signal)\n if (currentChildren.length !== children.length || currentChildren.some((child, index) => {\n const previous = children[index]\n return child.name !== previous?.name || !sameFileSnapshot(child.stat, previous.stat)\n })) unsafe()\n for (const child of children) if (!await directory.validate(child, signal)) unsafe()\n throwIfAborted(signal)\n for (const child of children) {\n if (child.name !== 'content') {\n throwIfAborted(signal)\n await directory.unlink(child.name, child.stat)\n }\n }\n const metadata: SourceMetadata = {\n id, name: input.name, mediaType, byteCount: content.byteLength,\n capturedAt: new Date().toISOString(),\n ...(input.origin === undefined ? {} : { origin: input.origin }),\n }\n let ownedContent: FileSnapshot | undefined\n try {\n if (!contentPresent) {\n await atomicWriteFile(directory, 'content', content, { signal })\n const written = await directory.read('content', signal)\n if (!written?.bytes.equals(content)) unsafe()\n ownedContent = written.snapshot\n }\n throwIfAborted(signal)\n // Publication is metadata-last. After its atomic commit, return the receipt\n // without an abort-sensitive read or deleting already published bytes.\n await atomicWriteFile(directory, 'metadata.json', canonicalJson(metadata), { signal })\n return { id, deduplicated: false, metadata }\n } catch (cause) {\n if (ownedContent) await directory.unlink('content', ownedContent.stat).catch(() => undefined)\n throw cause\n }\n })\n if (result === null) unsafe()\n return result\n } catch (cause) {\n // Only a newly allocated, still-empty directory belongs to this attempt.\n // Durable content left by an interrupted attempt is a future retry candidate.\n if (allocation.created) await sources.removeCreatedSource(id, allocation.identity, []).catch(() => undefined)\n throw cause\n }\n })\n if (result === null) unsafe()\n return result\n }, signal)\n }\n\n async readSource(id: SourceId, range?: ByteRange, signal?: AbortSignal): Promise<SourceRead> {\n sourceId(id)\n return this.enqueue(async paths => {\n const record = await this.readSourceRecord(paths, id, signal)\n const offset = range?.offset ?? 0\n const limitValue = range?.limit ?? this[configKey].maxSourceBytes\n if (!Number.isSafeInteger(offset) || offset < 0 || offset > record.content.byteLength) throw limit('Source byte offset is outside the source.')\n if (!Number.isSafeInteger(limitValue) || limitValue < 1 || limitValue > this[configKey].maxSourceBytes) throw limit('Source byte limit is outside the configured range.')\n const { start, end } = alignedRange(record.content, offset, limitValue)\n if (offset < record.content.byteLength && end === start) throw limit(INCOMPLETE_UTF8_RANGE)\n return { id, content: decodeUtf8(record.content.subarray(start, end)), metadata: record.metadata, byteStart: start, byteEnd: end, byteCount: record.content.byteLength }\n }, signal)\n }\n\n async listSources(request: CatalogRequest = {}, signal?: AbortSignal): Promise<SourceCatalogPage> {\n throwIfAborted(signal)\n const limitValue = catalogLimit(request, this[configKey].maxResults)\n const after = decodeCursor(request.cursor, 'sources')\n return this.enqueue(async paths => {\n if (!wikiRootPresent(paths, signal) || !await regularDirectory(paths.sources, paths, signal)) return { items: [], nextCursor: null }\n const items: SourceCatalogEntry[] = []\n const snapshots: StableCatalogSnapshot[] = []\n let hasMore = false\n const root = await readSafeCatalogDirectory(paths.sources, paths, signal)\n throwIfAborted(signal)\n snapshots.push(root.snapshot)\n const discovered = root.entries.sort((a, b) => compareCodeUnits(a.name, b.name))\n for (const entry of discovered) {\n throwIfAborted(signal)\n if (entry.isSymbolicLink()) throw new LlmWikiError('UNSAFE_FILESYSTEM', 'Symbolic links are not allowed in the wiki.')\n if (!entry.isDirectory()) throw new LlmWikiError('UNSAFE_FILESYSTEM', 'The sources tree may contain only regular source directories.')\n if (!isSourceId(entry.name)) throw catalogCorrupt('The source catalog contains an invalid record.')\n const id = sourceId(entry.name)\n const recordPath = join(paths.sources, entry.name)\n const recordDirectory = await readSafeCatalogDirectory(recordPath, paths, signal)\n throwIfAborted(signal)\n snapshots.push(recordDirectory.snapshot)\n const children = recordDirectory.entries.sort((a, b) => compareCodeUnits(a.name, b.name))\n for (const child of children) {\n throwIfAborted(signal)\n if (child.isSymbolicLink() || !child.isFile()) throw new LlmWikiError('UNSAFE_FILESYSTEM', 'Source records must contain only regular files.')\n }\n if (children.length !== 2 || children[0]?.name !== 'content' || children[1]?.name !== 'metadata.json') {\n throw catalogCorrupt('The source catalog contains an invalid record.')\n }\n const contentSnapshot = await snapshotSafeCatalogFile(join(recordPath, 'content'), paths, signal)\n throwIfAborted(signal)\n const metadataSnapshot = await snapshotSafeCatalogFile(join(recordPath, 'metadata.json'), paths, signal)\n throwIfAborted(signal)\n snapshots.push(contentSnapshot, metadataSnapshot)\n try {\n const record = await this.readSourceRecord(paths, id, signal)\n throwIfAborted(signal)\n hasMore ||= appendCatalogItem(items, record.metadata.id, after, limitValue, () => ({\n id: record.metadata.id,\n name: record.metadata.name,\n mediaType: record.metadata.mediaType,\n byteCount: record.metadata.byteCount,\n capturedAt: record.metadata.capturedAt,\n ...(record.metadata.origin === undefined ? {} : { origin: record.metadata.origin }),\n }))\n } catch (cause) {\n if (cause instanceof LlmWikiError && (cause.code === 'ABORTED' || cause.code === 'UNSAFE_FILESYSTEM')) throw cause\n if (!isMissing(cause) && typeof (cause as NodeJS.ErrnoException).code === 'string' && !(cause instanceof LlmWikiError)) throw cause\n await revalidateCatalogSnapshot(recordDirectory.snapshot, paths, signal)\n throwIfAborted(signal)\n await revalidateCatalogSnapshot(contentSnapshot, paths, signal)\n throwIfAborted(signal)\n await revalidateCatalogSnapshot(metadataSnapshot, paths, signal)\n throwIfAborted(signal)\n throw catalogCorrupt('The source catalog contains an invalid record.')\n }\n }\n for (const snapshot of snapshots) {\n throwIfAborted(signal)\n await revalidateCatalogSnapshot(snapshot, paths, signal)\n throwIfAborted(signal)\n }\n return finishCatalogPage('sources', items, hasMore)\n }, signal, false)\n }\n\n async listPages(request: CatalogRequest = {}, signal?: AbortSignal): Promise<PageCatalogPage> {\n throwIfAborted(signal)\n const limitValue = catalogLimit(request, this[configKey].maxResults)\n const after = decodeCursor(request.cursor, 'pages')\n return this.enqueue(async paths => {\n if (!wikiRootPresent(paths, signal) || !await regularDirectory(paths.pages, paths, signal)) return { items: [], nextCursor: null }\n const files: StableCatalogFile[] = []\n const snapshots: StableCatalogSnapshot[] = []\n await collectCatalogPageFiles(paths.pages, paths, files, snapshots, signal)\n throwIfAborted(signal)\n files.sort((left, right) => compareCodeUnits(left.logicalPath, right.logicalPath))\n const items: PageCatalogEntry[] = []\n let hasMore = false\n for (const file of files) {\n throwIfAborted(signal)\n const logical = file.logicalPath\n if (!logical.endsWith('.md') || !isPageId(logical.slice(0, -3))) {\n for (const snapshot of snapshots) {\n throwIfAborted(signal)\n await revalidateCatalogSnapshot(snapshot, paths, signal)\n throwIfAborted(signal)\n }\n throw catalogCorrupt('The page catalog contains an invalid record.')\n }\n try {\n const read = await readSafeCatalogFile(file.path, paths, signal)\n throwIfAborted(signal)\n if (!sameStableSnapshot(file.snapshot.stats, read.snapshot.stats)) {\n throw new LlmWikiError('UNSAFE_FILESYSTEM', 'The catalog changed while it was being read.')\n }\n const parsed = parsePageMarkdown(decodeUtf8(read.bytes))\n const id = pageId(logical.slice(0, -3))\n hasMore ||= appendCatalogItem(items, id, after, limitValue, () => ({\n id,\n title: parsed.metadata.title,\n summary: parsed.metadata.summary,\n sources: [...parsed.metadata.sources],\n byteCount: read.bytes.byteLength,\n sha256: hash(read.bytes),\n }))\n } catch (cause) {\n if (cause instanceof LlmWikiError && (cause.code === 'ABORTED' || cause.code === 'UNSAFE_FILESYSTEM')) throw cause\n if (!isMissing(cause) && typeof (cause as NodeJS.ErrnoException).code === 'string' && !(cause instanceof LlmWikiError)) throw cause\n await revalidateCatalogSnapshot(file.snapshot, paths, signal)\n throwIfAborted(signal)\n throw catalogCorrupt('The page catalog contains an invalid record.')\n }\n }\n for (const snapshot of snapshots) {\n throwIfAborted(signal)\n await revalidateCatalogSnapshot(snapshot, paths, signal)\n throwIfAborted(signal)\n }\n return finishCatalogPage('pages', items, hasMore)\n }, signal, false)\n }\n\n private async readSourceRecord(paths: OperationPaths, id: SourceId, signal?: AbortSignal): Promise<{ content: Uint8Array; metadata: SourceMetadata; snapshots: readonly StableCatalogSnapshot[] }> {\n try {\n const contentPath = paths.sourceContent(id)\n const metadataPath = paths.sourceMetadata(id)\n const contentPresent = await regularFile(contentPath, paths, signal)\n throwIfAborted(signal)\n const metadataPresent = await regularFile(metadataPath, paths, signal)\n throwIfAborted(signal)\n if (!contentPresent || !metadataPresent) throw missing('SOURCE_NOT_FOUND', 'Source was not found.')\n const metadataRead = await readSafeCatalogFile(metadataPath, paths, signal)\n throwIfAborted(signal)\n const metadata = parseMetadata(metadataRead.bytes, id)\n const contentRead = await readSafeCatalogFile(contentPath, paths, signal)\n throwIfAborted(signal)\n const snapshots = [metadataRead.snapshot, contentRead.snapshot] as const\n try {\n if (hash(contentRead.bytes) !== id || metadata.byteCount !== contentRead.bytes.byteLength) throw new LlmWikiError('INVALID_PAGE', 'Source record content does not match its immutable identity.')\n decodeUtf8(contentRead.bytes)\n return { content: contentRead.bytes, metadata, snapshots }\n } catch (cause) {\n for (const snapshot of snapshots) {\n throwIfAborted(signal)\n await revalidateCatalogSnapshot(snapshot, paths, signal)\n throwIfAborted(signal)\n }\n throw cause\n }\n } catch (cause) {\n throwIfAborted(signal)\n if (isMissing(cause)) throw missing('SOURCE_NOT_FOUND', 'Source was not found.')\n throw cause\n }\n }\n\n async readPage(id: PageId, signal?: AbortSignal): Promise<PageRead> {\n pageId(id)\n return this.enqueue(async paths => {\n try {\n const target = paths.page(id)\n if (!await regularFile(target, paths, signal)) throw missing('PAGE_NOT_FOUND', 'Page was not found.')\n const bytes = await readBytes(paths, target, signal)\n if (bytes === null) throw missing('PAGE_NOT_FOUND', 'Page was not found.')\n throwIfAborted(signal)\n const markdown = decodeUtf8(bytes)\n return { id, markdown, metadata: parsePageMarkdown(markdown).metadata, sha256: hash(bytes) }\n } catch (cause) {\n throwIfAborted(signal)\n if (isMissing(cause)) throw missing('PAGE_NOT_FOUND', 'Page was not found.')\n throw cause\n }\n }, signal)\n }\n\n async upsertPage(input: UpsertPageInput, signal?: AbortSignal): Promise<PageReceipt> {\n if (this.disposed) return Promise.reject(new LlmWikiError('NOT_INITIALIZED', 'The llmwiki service has been disposed.'))\n throwIfAborted(signal)\n const expectedSha256 = input.expectedSha256\n if (expectedSha256 !== null && (typeof expectedSha256 !== 'string' || !HASH.test(expectedSha256))) {\n throw new LlmWikiError('INVALID_PRECONDITION', 'expectedSha256 must be null or a 64-character lowercase hexadecimal SHA-256 hash.')\n }\n pageId(input.id)\n return this.enqueue(async paths => {\n const markdown = renderPageMarkdown(input, input.body)\n const bytes = encodeUtf8(markdown)\n if (bytes.byteLength > this[configKey].maxPageBytes) throw limit('Page content exceeds maxPageBytes.')\n for (const id of input.sources) await this.readSourceRecord(paths, id, signal)\n const target = paths.page(input.id)\n const segments = wikiRelativeSegments(paths, target)\n const receipt = await paths.rootDirectory!.directory(segments.slice(0, -1), { create: expectedSha256 === null, signal }, async directory => {\n for (const id of input.sources) await this.readSourceRecord(paths, id, signal)\n const existing = await directory.read(segments.at(-1)!, signal)\n if (expectedSha256 === null ? existing !== null : existing === null || hash(existing.bytes) !== expectedSha256) {\n throw new LlmWikiError('PAGE_CONFLICT', 'Page does not match expectedSha256; reread and reconcile before writing.')\n }\n await atomicWriteFile(directory, segments.at(-1)!, bytes, { signal })\n return { id: input.id, created: existing === null, sha256: hash(bytes) }\n })\n if (receipt === null) {\n if (expectedSha256 !== null) throw new LlmWikiError('PAGE_CONFLICT', 'Page does not match expectedSha256; reread and reconcile before writing.')\n unsafe()\n }\n return receipt\n }, signal)\n }\n\n async lint(signal?: AbortSignal): Promise<LintReport> {\n return this.enqueue(paths => lintWiki(paths, signal, paths.rootDirectory), signal, false)\n }\n\n async search(query: string, limitValue = this[configKey].maxResults, signal?: AbortSignal): Promise<SearchHit[]> {\n throwIfAborted(signal)\n if (!Number.isSafeInteger(limitValue)\n || limitValue < 1\n || !Number.isSafeInteger(this[configKey].maxResults)\n || this[configKey].maxResults < 1\n || !Number.isSafeInteger(this[configKey].maxSnippetBytes)\n || this[configKey].maxSnippetBytes < 1) throw limit('Search limits must be positive safe integers.')\n if (tokenize(query).length === 0) throw new LlmWikiError('INVALID_PAGE', 'Search query must contain at least one Unicode letter or number.')\n return this.enqueue(async paths => {\n const index = await this.ensureIndex(paths, signal)\n return [...searchBuiltIndex(index, query, {\n limit: limitValue,\n maxResults: this[configKey].maxResults,\n maxSnippetBytes: this[configKey].maxSnippetBytes,\n ...(signal === undefined ? {} : { signal }),\n })]\n }, signal)\n }\n\n async reindex(signal?: AbortSignal): Promise<ReindexReceipt> {\n return this.enqueue(async paths => {\n await countFiles(paths.pages, '.md', paths, signal)\n await this.indexTargetPresence(paths, signal)\n const built = await buildSearchIndex(paths, signal, undefined, paths.rootDirectory!)\n await writeIndex(paths, built, signal, paths.rootDirectory!)\n return {\n pageCount: built.search.pageFingerprints.length,\n sectionCount: built.search.sections.length,\n formatVersion: built.search.formatVersion,\n }\n }, signal)\n }\n\n private async indexTargetPresence(paths: OperationPaths, signal?: AbortSignal): Promise<readonly [boolean, boolean]> {\n const [searchPresent, statePresent] = await allSettledOnFailure([\n regularFile(paths.indexFile('search.json'), paths, signal),\n regularFile(paths.indexFile('state.json'), paths, signal),\n ])\n return [searchPresent, statePresent]\n }\n\n private async ensureIndex(paths: OperationPaths, signal?: AbortSignal) {\n await countFiles(paths.pages, '.md', paths, signal)\n const expected = await buildSearchIndex(paths, signal, undefined, paths.rootDirectory!)\n const [searchPresent, statePresent] = await this.indexTargetPresence(paths, signal)\n if (searchPresent && statePresent) {\n try {\n const [searchBytes, stateBytes] = await allSettledOnFailure([readBytes(paths, paths.indexFile('search.json'), signal), readBytes(paths, paths.indexFile('state.json'), signal)])\n if (searchBytes === null || stateBytes === null) unsafe()\n const search = trustedSearchIndex(searchBytes, stateBytes, expected)\n await validateBuiltIndexSnapshot(paths, expected, signal, paths.rootDirectory!)\n if (search !== null) return search\n } catch (cause) {\n throwIfAborted(signal)\n if (!(cause instanceof LlmWikiError && cause.code === 'INDEX_CORRUPT') && !isMissing(cause)) throw cause\n }\n }\n await this.indexTargetPresence(paths, signal)\n await writeIndex(paths, expected, signal, paths.rootDirectory!)\n return expected.search\n }\n\n private async indexStatus(paths: OperationPaths, signal?: AbortSignal): Promise<IndexStatus> {\n const [searchPresent, statePresent] = await this.indexTargetPresence(paths, signal)\n if (!searchPresent && !statePresent) return EMPTY_INDEX_STATUS\n if (!searchPresent || !statePresent) return { present: true, fresh: false, formatVersion: null, sectionCount: 0 }\n try {\n const [searchBytes, stateBytes] = await allSettledOnFailure([\n readBytes(paths, paths.indexFile('search.json'), signal),\n readBytes(paths, paths.indexFile('state.json'), signal),\n ])\n if (searchBytes === null || stateBytes === null) unsafe()\n parseSearchIndex(searchBytes)\n parseIndexState(stateBytes)\n let expected: BuiltIndex\n try {\n expected = await buildSearchIndex(paths, signal, undefined, paths.rootDirectory!)\n } catch (cause) {\n throwIfAborted(signal)\n if (cause instanceof LlmWikiError && (cause.code === 'INVALID_PAGE' || cause.code === 'INVALID_PATH')) {\n return { present: true, fresh: false, formatVersion: INDEX_FORMAT_VERSION, sectionCount: 0 }\n }\n throw cause\n }\n const search = trustedSearchIndex(searchBytes, stateBytes, expected)\n await validateBuiltIndexSnapshot(paths, expected, signal, paths.rootDirectory!)\n return {\n present: true,\n fresh: search !== null,\n formatVersion: INDEX_FORMAT_VERSION,\n sectionCount: expected.search.sections.length,\n }\n } catch (cause) {\n throwIfAborted(signal)\n if (isMissing(cause) || (cause instanceof LlmWikiError && cause.code === 'INDEX_CORRUPT')) {\n return { present: true, fresh: false, formatVersion: null, sectionCount: 0 }\n }\n throw cause\n }\n }\n}\n\ndeclare module '@deepseek-ai/cordis' {\n interface Context {\n llmwiki: LlmWikiService\n }\n}\n","import type { ToolCallKind, ToolCallView, ToolResult, ToolResultView } from '@deepseek-ai/dsh-tools'\n\nexport type LlmWikiToolName =\n | 'llmwiki_status'\n | 'llmwiki_add_source'\n | 'llmwiki_list_sources'\n | 'llmwiki_read_source'\n | 'llmwiki_search'\n | 'llmwiki_list_pages'\n | 'llmwiki_read_page'\n | 'llmwiki_upsert_page'\n | 'llmwiki_lint'\n\nconst PRESENTATION: Readonly<Record<LlmWikiToolName, { readonly title: string; readonly kind: ToolCallKind }>> = Object.freeze({\n llmwiki_status: { title: 'Inspect wiki status', kind: 'read' },\n llmwiki_add_source: { title: 'Preserve wiki source', kind: 'edit' },\n llmwiki_list_sources: { title: 'List wiki sources', kind: 'read' },\n llmwiki_read_source: { title: 'Read wiki source', kind: 'read' },\n llmwiki_search: { title: 'Search wiki', kind: 'search' },\n llmwiki_list_pages: { title: 'List wiki pages', kind: 'read' },\n llmwiki_read_page: { title: 'Read wiki page', kind: 'read' },\n llmwiki_upsert_page: { title: 'Update wiki page', kind: 'edit' },\n llmwiki_lint: { title: 'Lint wiki', kind: 'read' },\n})\n\nfunction salientInput(name: LlmWikiToolName, args: Readonly<Record<string, unknown>>): string | undefined {\n switch (name) {\n case 'llmwiki_add_source': return typeof args.name === 'string' ? args.name : undefined\n case 'llmwiki_read_source': return typeof args.id === 'string' ? args.id : undefined\n case 'llmwiki_search': return typeof args.query === 'string' ? args.query : undefined\n case 'llmwiki_read_page':\n case 'llmwiki_upsert_page': return typeof args.id === 'string' ? args.id : undefined\n default: return undefined\n }\n}\n\nexport function presentLlmWikiCall(name: LlmWikiToolName, args: Readonly<Record<string, unknown>>): ToolCallView {\n const presentation = PRESENTATION[name]\n return {\n card: 'generic',\n title: presentation.title,\n kind: presentation.kind,\n ...(salientInput(name, args) === undefined ? {} : { rawInput: salientInput(name, args) }),\n }\n}\n\nexport function presentLlmWikiResult(name: LlmWikiToolName, _args: Readonly<Record<string, unknown>>, result: ToolResult): ToolResultView {\n const presentation = PRESENTATION[name]\n return {\n card: 'generic',\n title: result.isError ? `${presentation.title} failed` : presentation.title,\n }\n}\n","import type { Context } from '@deepseek-ai/cordis'\nimport { defineTool } from '@deepseek-ai/dsh-tools'\nimport type { ParameterPropertySpec, ParameterSchemaSpec, ValueSchemaSpec } from '@deepseek-ai/dsh-tools'\nimport { isLlmWikiError, LlmWikiError } from './errors.ts'\nimport { pageId, sourceId } from './ids.ts'\nimport { presentLlmWikiCall, presentLlmWikiResult } from './presentation.ts'\nimport type { LlmWikiToolName } from './presentation.ts'\n\nconst requiredString = () => ({ type: 'string', required: true } as const)\nconst requiredInteger = () => ({ type: 'integer', required: true } as const)\nconst requiredNumber = () => ({ type: 'number', required: true } as const)\nconst requiredBoolean = () => ({ type: 'boolean', required: true } as const)\nconst requiredStringArray = () => ({ type: 'array', required: true, items: { type: 'string' } } as const)\nconst closed = <const P extends ParameterSchemaSpec>(properties: P) => ({ type: 'object', additionalProperties: false, properties } as const)\nconst requiredClosed = <const P extends ParameterSchemaSpec>(properties: P) => ({ ...closed(properties), required: true } as const)\nconst requiredNullableString = { required: true, oneOf: [{ type: 'string' }, { type: 'null' }] } as const satisfies ParameterPropertySpec\nconst requiredNullableInteger = { required: true, oneOf: [{ type: 'integer' }, { type: 'null' }] } as const satisfies ParameterPropertySpec\nconst optionalNullableString = { oneOf: [{ type: 'string' }, { type: 'null' }] } as const satisfies ValueSchemaSpec\nconst optionalString = { type: 'string' } as const satisfies ValueSchemaSpec\nconst catalogParameters = {\n limit: { type: 'integer', description: 'Optional catalog page size; defaults to deployment maxResults and is bounded by it.' },\n cursor: { type: 'string', description: 'Optional opaque cursor returned by the same catalog tool.' },\n} as const\nconst sourceCatalogEntrySchema = closed({ id: requiredString(), name: requiredString(), mediaType: requiredString(), byteCount: requiredInteger(), capturedAt: requiredString(), origin: optionalString })\nconst sourceCatalogPageSchema = closed({ items: { type: 'array', required: true, items: sourceCatalogEntrySchema }, nextCursor: requiredNullableString })\nconst pageCatalogEntrySchema = closed({ id: requiredString(), title: requiredString(), summary: requiredString(), sources: requiredStringArray(), byteCount: requiredInteger(), sha256: requiredString() })\nconst pageCatalogPageSchema = closed({ items: { type: 'array', required: true, items: pageCatalogEntrySchema }, nextCursor: requiredNullableString })\nconst indexSchema = requiredClosed({ present: requiredBoolean(), fresh: requiredBoolean(), formatVersion: requiredNullableInteger, sectionCount: requiredInteger() })\nconst metadataSchema = requiredClosed({ id: requiredString(), name: requiredString(), mediaType: requiredString(), byteCount: requiredInteger(), capturedAt: requiredString(), origin: optionalNullableString })\nconst render = (_args: unknown, value: unknown) => [{ type: 'text' as const, text: JSON.stringify(value) }]\n\nfunction stableFailure(cause: unknown): never {\n if (isLlmWikiError(cause)) throw new LlmWikiError(cause.code, cause.message)\n throw cause\n}\n\nasync function call<T>(operation: () => Promise<T>): Promise<T> {\n try { return await operation() } catch (cause) { stableFailure(cause) }\n}\n\nfunction presentation(name: LlmWikiToolName) {\n return {\n presentCall: (args: Record<string, unknown>) => presentLlmWikiCall(name, args),\n presentResult: (args: Record<string, unknown>, result: Parameters<typeof presentLlmWikiResult>[2]) => presentLlmWikiResult(name, args, result),\n }\n}\n\nexport function registerLlmWikiTools(ctx: Context): void {\n ctx.tools.register(defineTool({\n name: 'llmwiki_status',\n description: 'Discover wiki initialization, schema, durable record counts, and derived-index freshness before relying on wiki knowledge. Read-only; no approval or filesystem capability is requested.',\n parameters: {},\n output: { schema: closed({ initialized: requiredBoolean(), sourceCount: requiredInteger(), pageCount: requiredInteger(), schemaText: requiredNullableString, index: indexSchema }), render },\n execute: (_args, exec) => call(async () => {\n const status = await ctx.llmwiki.status(exec.signal)\n return {\n initialized: status.initialized,\n sourceCount: status.sourceCount,\n pageCount: status.pageCount,\n schemaText: status.schemaText,\n index: {\n present: status.index.present,\n fresh: status.index.fresh,\n formatVersion: status.index.formatVersion,\n sectionCount: status.index.sectionCount,\n },\n }\n }),\n isConcurrencySafe: () => true,\n ...presentation('llmwiki_status'),\n }))\n\n ctx.tools.register(defineTool({\n name: 'llmwiki_add_source',\n description: 'Preserve exact UTF-8 evidence supplied in content as an immutable source record. This mutates wiki storage and should be used only with authorized evidence; it cannot read host paths. Completion returns the durable source artifact ID and dedupe state.',\n parameters: {\n name: { type: 'string', required: true, description: 'Non-empty human-readable source name.' },\n content: { type: 'string', required: true, description: 'Exact UTF-8 source content containing at least one byte; whitespace-only content is valid; bounded by deployment maxSourceBytes.' },\n mediaType: { type: 'string', description: 'Optional non-empty media type; defaults to UTF-8 plain text.' },\n origin: { type: 'string', description: 'Optional provenance label or URL containing at least one non-whitespace character; never used as a host path.' },\n },\n output: { schema: closed({ id: requiredString(), deduplicated: requiredBoolean(), metadata: metadataSchema }), render },\n execute: (args, exec) => call(async () => {\n const receipt = await ctx.llmwiki.addSource({ name: args.name, content: args.content, ...(args.mediaType === undefined ? {} : { mediaType: args.mediaType }), ...(args.origin === undefined ? {} : { origin: args.origin }) }, exec.signal)\n return {\n id: receipt.id,\n deduplicated: receipt.deduplicated,\n metadata: {\n id: receipt.metadata.id,\n name: receipt.metadata.name,\n mediaType: receipt.metadata.mediaType,\n byteCount: receipt.metadata.byteCount,\n capturedAt: receipt.metadata.capturedAt,\n ...(receipt.metadata.origin === undefined ? {} : { origin: receipt.metadata.origin }),\n },\n }\n }),\n ...presentation('llmwiki_add_source'),\n }))\n\n ctx.tools.register(defineTool({\n name: 'llmwiki_list_sources',\n description: 'List immutable source records in deterministic ID order for recovery and inventory. Read-only; returns bounded safe metadata without content or host paths.',\n parameters: catalogParameters,\n output: { schema: sourceCatalogPageSchema, render },\n execute: (args, exec) => call(async () => {\n const page = await ctx.llmwiki.listSources({ ...(args.limit === undefined ? {} : { limit: args.limit }), ...(args.cursor === undefined ? {} : { cursor: args.cursor }) }, exec.signal)\n return {\n items: page.items.map(item => ({ id: item.id, name: item.name, mediaType: item.mediaType, byteCount: item.byteCount, capturedAt: item.capturedAt, ...(item.origin === undefined ? {} : { origin: item.origin }) })),\n nextCursor: page.nextCursor,\n }\n }),\n isConcurrencySafe: () => true,\n ...presentation('llmwiki_list_sources'),\n }))\n\n ctx.tools.register(defineTool({\n name: 'llmwiki_read_source',\n description: 'Read immutable source evidence by exact source ID, optionally using a configured byte-bounded range, and return provenance metadata with the content artifact. First access can create the configured host root, wiki directories, and default schema outside DSH filesystem approval, even if the requested source is missing; existing source records are not modified. A non-EOF range must fit at least one complete UTF-8 code point or returns LIMIT_EXCEEDED instructing the caller to increase limit.',\n parameters: {\n id: { type: 'string', required: true, description: 'Exact 64-character lowercase hexadecimal source ID.' },\n offset: { type: 'integer', description: 'Optional non-negative zero-based UTF-8 byte offset; defaults to 0.' },\n limit: { type: 'integer', description: 'Optional positive maximum bytes; defaults to deployment maxSourceBytes and is bounded by it. Increase it if no complete UTF-8 code point fits.' },\n },\n output: { schema: closed({ id: requiredString(), content: requiredString(), metadata: metadataSchema, byteStart: requiredInteger(), byteEnd: requiredInteger(), byteCount: requiredInteger() }), render },\n execute: (args, exec) => call(async () => {\n const range = args.offset === undefined && args.limit === undefined\n ? undefined\n : {\n ...(args.offset === undefined ? {} : { offset: args.offset }),\n ...(args.limit === undefined ? {} : { limit: args.limit }),\n }\n const source = await ctx.llmwiki.readSource(sourceId(args.id), range as Parameters<typeof ctx.llmwiki.readSource>[1], exec.signal)\n return {\n id: source.id,\n content: source.content,\n metadata: {\n id: source.metadata.id,\n name: source.metadata.name,\n mediaType: source.metadata.mediaType,\n byteCount: source.metadata.byteCount,\n capturedAt: source.metadata.capturedAt,\n ...(source.metadata.origin === undefined ? {} : { origin: source.metadata.origin }),\n },\n byteStart: source.byteStart,\n byteEnd: source.byteEnd,\n byteCount: source.byteCount,\n }\n }),\n isConcurrencySafe: () => true,\n ...presentation('llmwiki_read_source'),\n }))\n\n ctx.tools.register(defineTool({\n name: 'llmwiki_search',\n description: 'Search the derived section index first for ranked source-linked page-section matches. May rebuild only stale derived index artifacts; it does not alter durable pages or sources. Results are capped by deployment maxResults and snippets by maxSnippetBytes.',\n parameters: {\n query: { type: 'string', required: true, description: 'Non-empty Unicode lexical query containing at least one letter or number.' },\n limit: { type: 'integer', description: 'Optional positive result cap up to 100, additionally bounded by deployment maxResults.' },\n },\n output: { schema: { type: 'array', items: closed({ pageId: requiredString(), title: requiredString(), headingTrail: requiredStringArray(), startLine: requiredInteger(), score: requiredNumber(), snippet: requiredString(), sourceIds: requiredStringArray() }) }, render },\n execute: (args, exec) => call(async () => {\n const hits = await ctx.llmwiki.search(args.query, args.limit, exec.signal)\n return hits.map(hit => ({\n pageId: hit.pageId,\n title: hit.title,\n headingTrail: [...hit.headingTrail],\n startLine: hit.startLine,\n score: hit.score,\n snippet: hit.snippet,\n sourceIds: [...hit.sourceIds],\n }))\n }),\n ...presentation('llmwiki_search'),\n }))\n\n ctx.tools.register(defineTool({\n name: 'llmwiki_list_pages',\n description: 'List durable wiki pages in deterministic ID order for recovery and inventory. Read-only; returns bounded metadata and exact byte hashes without page content.',\n parameters: catalogParameters,\n output: { schema: pageCatalogPageSchema, render },\n execute: (args, exec) => call(async () => {\n const page = await ctx.llmwiki.listPages({ ...(args.limit === undefined ? {} : { limit: args.limit }), ...(args.cursor === undefined ? {} : { cursor: args.cursor }) }, exec.signal)\n return {\n items: page.items.map(item => ({ id: item.id, title: item.title, summary: item.summary, sources: [...item.sources], byteCount: item.byteCount, sha256: item.sha256 })),\n nextCursor: page.nextCursor,\n }\n }),\n isConcurrencySafe: () => true,\n ...presentation('llmwiki_list_pages'),\n }))\n\n ctx.tools.register(defineTool({\n name: 'llmwiki_read_page',\n description: 'Read one synthesized source-linked wiki page by normalized logical page ID; inspect its cited immutable source records when evaluating claim support. First access can create the configured host root, wiki directories, and default schema outside DSH filesystem approval, even if the requested page is missing; existing pages are not modified.',\n parameters: { id: { type: 'string', required: true, description: 'Non-empty normalized POSIX page ID without a leading slash or .md suffix.' } },\n output: { schema: closed({ id: requiredString(), markdown: requiredString(), sha256: requiredString(), metadata: requiredClosed({ title: requiredString(), summary: requiredString(), sources: requiredStringArray() }) }), render },\n execute: (args, exec) => call(async () => {\n const page = await ctx.llmwiki.readPage(pageId(args.id), exec.signal)\n return {\n id: page.id,\n markdown: page.markdown,\n sha256: page.sha256,\n metadata: {\n title: page.metadata.title,\n summary: page.metadata.summary,\n sources: [...page.metadata.sources],\n },\n }\n }),\n isConcurrencySafe: () => true,\n ...presentation('llmwiki_read_page'),\n }))\n\n ctx.tools.register(defineTool({\n name: 'llmwiki_upsert_page',\n description: 'Atomically create or update a synthesized durable Markdown page with a required concurrency precondition: null creates only; the exact current raw-byte SHA-256 updates only. PAGE_CONFLICT requires rereading and reconciling, not automatic retry. This mutation requires existing preserved source IDs but does not verify claim-level support. Use only when the user request authorizes maintenance. Returns the page artifact ID, creation state, and content hash.',\n parameters: {\n id: { type: 'string', required: true, description: 'Non-empty normalized POSIX page ID without a leading slash or .md suffix.' },\n expectedSha256: { ...requiredNullableString, description: 'Required: null for a new page, or the exact current lowercase SHA-256 from llmwiki_read_page or llmwiki_list_pages for an update. On PAGE_CONFLICT, reread and reconcile before another write.' },\n title: { type: 'string', required: true, description: 'Non-empty concise page title.' },\n summary: { type: 'string', required: true, description: 'Non-empty concise source-linked summary.' },\n sources: { type: 'array', required: true, items: { type: 'string' }, description: 'Non-empty sorted unique 64-character lowercase hexadecimal IDs of existing immutable source records; never invent IDs. Existence is verified, semantic support is not.' },\n body: { type: 'string', required: true, description: 'Non-empty Markdown body bounded by deployment maxPageBytes after canonical rendering.' },\n },\n output: { schema: closed({ id: requiredString(), created: requiredBoolean(), sha256: requiredString() }), render },\n execute: (args, exec) => call(async () => {\n const receipt = await ctx.llmwiki.upsertPage({ id: pageId(args.id), expectedSha256: args.expectedSha256, title: args.title, summary: args.summary, sources: args.sources.map(sourceId), body: args.body }, exec.signal)\n return { id: receipt.id, created: receipt.created, sha256: receipt.sha256 }\n }),\n ...presentation('llmwiki_upsert_page'),\n }))\n\n ctx.tools.register(defineTool({\n name: 'llmwiki_lint',\n description: 'Run deterministic model-free read-only structural validation. Reports filesystem, integrity, link, canonical-format, and index diagnostics and progress counts; never makes semantic judgments or fixes, deletes, or rewrites artifacts.',\n parameters: {},\n output: { schema: closed({ diagnostics: { type: 'array', required: true, items: closed({ code: requiredString(), severity: { type: 'string', required: true, enum: ['error', 'warning'] }, path: requiredString(), line: requiredNullableInteger, message: requiredString() }) }, errorCount: requiredInteger(), warningCount: requiredInteger(), filesExamined: requiredInteger() }), render },\n execute: (_args, exec) => call(async () => {\n const report = await ctx.llmwiki.lint(exec.signal)\n return {\n diagnostics: report.diagnostics.map(diagnostic => ({\n code: diagnostic.code,\n severity: diagnostic.severity,\n path: diagnostic.path,\n line: diagnostic.line ?? null,\n message: diagnostic.message,\n })),\n errorCount: report.errorCount,\n warningCount: report.warningCount,\n filesExamined: report.filesExamined,\n }\n }),\n isConcurrencySafe: () => true,\n ...presentation('llmwiki_lint'),\n }))\n}\n","import type { Context } from '@deepseek-ai/cordis'\nimport { registerLlmWikiCommand } from './command.ts'\nimport { resolveConfig } from './config.ts'\nimport type { Config as LlmWikiConfig } from './config.ts'\nimport { registerLlmWikiPrompt } from './prompt.ts'\nimport { LlmWikiService } from './service.ts'\nimport { registerLlmWikiTools } from './tools.ts'\n\nexport { Config } from './config.ts'\nexport type { Config as LlmWikiConfig, ResolvedConfig } from './config.ts'\nexport {\n LLMWIKI_ERROR_CODES,\n LlmWikiError,\n isLlmWikiError,\n} from './errors.ts'\nexport type {\n LlmWikiErrorCode,\n SerializedLlmWikiError,\n} from './errors.ts'\nexport {\n isPageId,\n isSourceId,\n pageId,\n sourceId,\n} from './ids.ts'\nexport type { PageId, SourceId } from './ids.ts'\nexport { LlmWikiService } from './service.ts'\nexport type * from './types.ts'\n\nexport const name = 'llmwiki'\nexport const inject = ['tools', 'commands', 'systemPrompt']\n\nexport function apply(ctx: Context, config: LlmWikiConfig = {}): void {\n const resolvedConfig = resolveConfig(config)\n new LlmWikiService(ctx, resolvedConfig)\n registerLlmWikiPrompt(ctx)\n registerLlmWikiTools(ctx)\n registerLlmWikiCommand(ctx, resolvedConfig)\n}\n"],"mappings":"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"}
|