@tangle-network/agent-knowledge 3.1.0 → 3.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tangle-network/agent-knowledge",
3
- "version": "3.1.0",
3
+ "version": "3.2.1",
4
4
  "description": "Source-grounded, eval-gated knowledge growth primitives for agents.",
5
5
  "homepage": "https://github.com/tangle-network/agent-knowledge#readme",
6
6
  "repository": {
@@ -69,8 +69,8 @@
69
69
  "verify:package": "node scripts/verify-package.mjs"
70
70
  },
71
71
  "dependencies": {
72
- "@tangle-network/agent-eval": "^0.122.1",
73
- "@tangle-network/agent-interface": "^0.30.0",
72
+ "@tangle-network/agent-eval": "^0.122.7",
73
+ "@tangle-network/agent-interface": "^0.31.0",
74
74
  "proper-lockfile": "4.1.2",
75
75
  "zod": "^4.3.6"
76
76
  },
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/adapters.ts","../src/wikilinks.ts","../src/graph.ts","../src/mutation-lock.ts","../src/durable-fs.ts","../src/file-transaction.ts","../src/schemas.ts","../src/frontmatter.ts","../src/store.ts","../src/sources.ts","../src/indexer.ts","../src/lint.ts","../src/validate.ts","../src/write-protocol.ts","../src/proposals.ts","../src/metadata.ts","../src/inspect.ts"],"sourcesContent":["import type { SourceRecord } from './types'\n\nexport interface SourceAdapterInput {\n uri: string\n bytes?: Uint8Array\n text?: string\n metadata?: Record<string, unknown>\n}\n\nexport interface SourceAdapterOutput {\n title?: string\n mediaType?: string\n text?: string\n anchors?: SourceRecord['anchors']\n metadata?: Record<string, unknown>\n}\n\nexport interface SourceAdapter {\n id: string\n canLoad(input: SourceAdapterInput): boolean\n load(input: SourceAdapterInput): Promise<SourceAdapterOutput> | SourceAdapterOutput\n}\n\nexport const textSourceAdapter: SourceAdapter = {\n id: 'text',\n canLoad: (input) => Boolean(input.text) || /\\.(md|txt|json|csv)$/i.test(input.uri),\n load: (input) => ({\n title: input.uri.split('/').pop(),\n mediaType: mediaTypeFor(input.uri),\n text: decodeText(input),\n anchors: anchorsForText(input.uri, decodeText(input)),\n metadata: input.metadata,\n }),\n}\n\nexport function mediaTypeFor(uri: string): string {\n const lower = uri.toLowerCase()\n if (lower.endsWith('.md')) return 'text/markdown'\n if (lower.endsWith('.txt')) return 'text/plain'\n if (lower.endsWith('.json')) return 'application/json'\n if (lower.endsWith('.csv')) return 'text/csv'\n if (lower.endsWith('.pdf')) return 'application/pdf'\n return 'application/octet-stream'\n}\n\nfunction decodeText(input: SourceAdapterInput): string | undefined {\n return (\n input.text ??\n (input.bytes ? new TextDecoder().decode(input.bytes).slice(0, 200_000) : undefined)\n )\n}\n\nfunction anchorsForText(uri: string, text: string | undefined): SourceAdapterOutput['anchors'] {\n if (!text) return []\n const lines = text.split('\\n')\n const anchors: NonNullable<SourceAdapterOutput['anchors']> = [\n { id: 'all', sourceId: '', label: 'Full source', lineStart: 1, lineEnd: lines.length },\n ]\n for (let i = 0; i < lines.length; i += 50) {\n anchors.push({\n id: `l${i + 1}`,\n sourceId: '',\n label: `${uri}:${i + 1}`,\n lineStart: i + 1,\n lineEnd: Math.min(lines.length, i + 50),\n })\n }\n return anchors\n}\n","export const WIKILINK_REGEX = /\\[\\[([^\\]|]+?)(?:\\|[^\\]]+?)?\\]\\]/g\n\nexport function extractWikilinks(content: string): string[] {\n const links: string[] = []\n const regex = new RegExp(WIKILINK_REGEX.source, 'g')\n let match: RegExpExecArray | null\n match = regex.exec(content)\n while (match !== null) {\n links.push(match[1]!.trim())\n match = regex.exec(content)\n }\n return [...new Set(links)]\n}\n\nexport function normalizeLinkTarget(target: string): string {\n return target.trim().replace(/\\.md$/i, '').toLowerCase().replace(/\\s+/g, '-')\n}\n","import type { KnowledgeGraph, KnowledgeGraphEdge, KnowledgeGraphNode, KnowledgePage } from './types'\nimport { normalizeLinkTarget } from './wikilinks'\n\nexport function buildKnowledgeGraph(pages: KnowledgePage[]): KnowledgeGraph {\n const byId = new Map<string, KnowledgePage>()\n const bySlug = new Map<string, KnowledgePage>()\n for (const page of pages) {\n byId.set(page.id, page)\n bySlug.set(normalizeLinkTarget(page.id), page)\n bySlug.set(normalizeLinkTarget(page.title), page)\n bySlug.set(normalizeLinkTarget(page.path.split('/').pop()!.replace(/\\.md$/, '')), page)\n }\n\n const incoming = new Map<string, number>()\n const outgoing = new Map<string, number>()\n const edgesByKey = new Map<string, KnowledgeGraphEdge>()\n for (const page of pages) {\n outgoing.set(page.id, 0)\n incoming.set(page.id, 0)\n }\n\n for (const page of pages) {\n for (const raw of page.outLinks) {\n const target = bySlug.get(normalizeLinkTarget(raw))\n if (!target || target.id === page.id) continue\n const key = `${page.id}->${target.id}`\n const edge = edgesByKey.get(key)\n if (edge) edge.weight += 1\n else\n edgesByKey.set(key, {\n source: page.id,\n target: target.id,\n weight: 1,\n reasons: ['wikilink'],\n })\n outgoing.set(page.id, (outgoing.get(page.id) ?? 0) + 1)\n incoming.set(target.id, (incoming.get(target.id) ?? 0) + 1)\n }\n }\n\n addSourceOverlapEdges(pages, edgesByKey)\n\n const nodes: KnowledgeGraphNode[] = pages.map((page) => ({\n id: page.id,\n title: page.title,\n path: page.path,\n tags: page.tags,\n sourceIds: page.sourceIds,\n outDegree: outgoing.get(page.id) ?? 0,\n inDegree: incoming.get(page.id) ?? 0,\n }))\n return { nodes, edges: [...edgesByKey.values()].sort((a, b) => b.weight - a.weight) }\n}\n\nfunction addSourceOverlapEdges(\n pages: KnowledgePage[],\n edges: Map<string, KnowledgeGraphEdge>,\n): void {\n for (let i = 0; i < pages.length; i++) {\n for (let j = i + 1; j < pages.length; j++) {\n const a = pages[i]!\n const b = pages[j]!\n const overlap = a.sourceIds.filter((source) => b.sourceIds.includes(source))\n if (overlap.length === 0) continue\n const key = `${a.id}->${b.id}`\n const edge = edges.get(key)\n if (edge) {\n edge.weight += overlap.length * 0.5\n edge.reasons.push('shared-source')\n } else {\n edges.set(key, {\n source: a.id,\n target: b.id,\n weight: overlap.length * 0.5,\n reasons: ['shared-source'],\n })\n }\n }\n }\n}\n","import { AsyncLocalStorage } from 'node:async_hooks'\nimport { mkdir, readFile } from 'node:fs/promises'\nimport { dirname, join, resolve } from 'node:path'\nimport { check, type LockOptions, lock } from 'proper-lockfile'\nimport {\n isMissingFile,\n withSafeDescendant,\n withSafeDirectory,\n writeJsonDurableWithinRoot,\n} from './durable-fs'\nimport {\n inspectKnowledgeFileTransaction,\n type KnowledgeFileTransaction,\n loadKnowledgeFileTransaction,\n recoverKnowledgeFileTransaction,\n} from './file-transaction'\n\nconst DEFAULT_STALE_MS = 15 * 60 * 1000\nconst DEFAULT_READ_RETRIES = 100\nconst DEFAULT_READ_WAIT_MS = 25\n\ninterface KnowledgeMutationScope {\n active: boolean\n lock: KnowledgeMutationLock\n}\n\nconst activeRoots = new AsyncLocalStorage<ReadonlyMap<string, KnowledgeMutationScope>>()\nconst activeReadRoots = new AsyncLocalStorage<ReadonlySet<string>>()\n\nexport interface KnowledgeMutationLock {\n readonly transactionRoot: string\n assertOwned(): void\n}\n\nexport class KnowledgeLockLostError extends Error {\n constructor(message: string, options?: { cause?: unknown }) {\n super(message, options)\n this.name = 'KnowledgeLockLostError'\n }\n}\n\ninterface DurableFileLock {\n assertOwned(): void\n release(): Promise<void>\n}\n\nexport interface KnowledgeMutationOptions {\n staleMs?: number\n resumeTransaction?: {\n purpose: string\n validate?: (transaction: KnowledgeFileTransaction) => void\n direction?: 'apply' | 'rollback'\n }\n retries?: LockOptions['retries']\n}\n\nexport interface PendingKnowledgeMutation {\n transactionId: string\n purpose: string\n createdAt: string\n direction: 'apply' | 'rollback'\n paths: string[]\n}\n\nexport interface RecoverPendingKnowledgeMutationOptions {\n transactionId: string\n action: 'apply' | 'rollback'\n}\n\nexport interface KnowledgeReadOptions {\n staleMs?: number\n retries?: number\n waitMs?: number\n}\n\nexport async function withKnowledgeMutation<T>(\n root: string,\n mutate: (lock: KnowledgeMutationLock) => Promise<T> | T,\n options: KnowledgeMutationOptions = {},\n): Promise<T> {\n const resolvedRoot = resolve(root)\n const active = activeRoots.getStore()\n const existing = active?.get(resolvedRoot)\n if (existing?.active) {\n existing.lock.assertOwned()\n const result = await mutate(existing.lock)\n existing.lock.assertOwned()\n return result\n }\n\n return withSafeDirectory(resolvedRoot, '.agent-knowledge', true, async (cacheDir) => {\n const acquired = await acquireDurableFileLock(resolvedRoot, {\n lockfilePath: join(cacheDir, 'mutation.lock.durable'),\n staleMs: options.staleMs,\n retries:\n options.retries ??\n ({ retries: 100, factor: 1.1, minTimeout: 10, maxTimeout: 200, randomize: true } as const),\n })\n const mutationLock: KnowledgeMutationLock = {\n transactionRoot: join(cacheDir, 'file-transactions'),\n assertOwned: acquired.assertOwned,\n }\n const scope: KnowledgeMutationScope = { active: true, lock: mutationLock }\n try {\n const pending = await loadKnowledgeFileTransaction({\n root: resolvedRoot,\n transactionRoot: mutationLock.transactionRoot,\n })\n if (pending) {\n const resume = options.resumeTransaction\n if (!resume || pending.purpose !== resume.purpose) {\n throw new Error(`knowledge transaction '${pending.purpose}' requires its owner to resume`)\n }\n }\n const locks = new Map(active)\n locks.set(resolvedRoot, scope)\n return await activeRoots.run(locks, async () => {\n const epoch = await beginMutationEpoch(cacheDir)\n let completed = false\n try {\n if (pending) {\n const resume = options.resumeTransaction\n if (!resume)\n throw new Error(\n `knowledge transaction '${pending.purpose}' requires its owner to resume`,\n )\n await recoverKnowledgeFileTransaction({\n root: resolvedRoot,\n transactionRoot: mutationLock.transactionRoot,\n expectedPurpose: resume.purpose,\n direction: resume.direction,\n validate: resume.validate,\n assertOwned: acquired.assertOwned,\n })\n }\n mutationLock.assertOwned()\n const result = await mutate(mutationLock)\n mutationLock.assertOwned()\n completed = true\n return result\n } finally {\n mutationLock.assertOwned()\n const stillPending = await loadKnowledgeFileTransaction({\n root: resolvedRoot,\n transactionRoot: mutationLock.transactionRoot,\n })\n if (completed || !stillPending) await finishMutationEpoch(cacheDir, epoch)\n }\n })\n } finally {\n scope.active = false\n await acquired.release()\n }\n })\n}\n\nexport async function inspectPendingKnowledgeMutation(\n root: string,\n): Promise<PendingKnowledgeMutation | null> {\n const resolvedRoot = resolve(root)\n const pending = await inspectKnowledgeFileTransaction({\n root: resolvedRoot,\n transactionRoot: join(resolvedRoot, '.agent-knowledge', 'file-transactions'),\n })\n if (!pending) return null\n const { transaction, direction } = pending\n return {\n transactionId: transaction.transactionId,\n purpose: transaction.purpose,\n createdAt: transaction.createdAt,\n direction,\n paths: transaction.entries.map((entry) => entry.path),\n }\n}\n\nexport async function recoverPendingKnowledgeMutation(\n root: string,\n options: RecoverPendingKnowledgeMutationOptions,\n): Promise<void> {\n const pending = await inspectPendingKnowledgeMutation(root)\n if (!pending) throw new Error('knowledge base has no pending mutation')\n\n let matched = false\n await withKnowledgeMutation(\n root,\n () => {\n if (!matched) throw new Error('pending knowledge mutation changed before recovery')\n },\n {\n resumeTransaction: {\n purpose: pending.purpose,\n direction: options.action,\n validate(transaction) {\n if (transaction.transactionId !== options.transactionId) {\n throw new Error(`pending knowledge mutation does not match '${options.transactionId}'`)\n }\n matched = true\n },\n },\n },\n )\n}\n\nexport async function withKnowledgeRead<T>(\n root: string,\n read: () => Promise<T> | T,\n options: KnowledgeReadOptions = {},\n): Promise<T> {\n const resolvedRoot = resolve(root)\n if (activeRoots.getStore()?.get(resolvedRoot)?.active) return await read()\n if (activeReadRoots.getStore()?.has(resolvedRoot)) return await read()\n\n const readRoots = new Set(activeReadRoots.getStore())\n readRoots.add(resolvedRoot)\n return activeReadRoots.run(readRoots, async () => {\n const retries = options.retries ?? DEFAULT_READ_RETRIES\n for (let attempt = 0; attempt <= retries; attempt += 1) {\n const before = await readMutationEpoch(resolvedRoot)\n if (isOdd(before)) {\n await waitForActiveMutationEpoch(resolvedRoot, before, options)\n continue\n }\n\n const result = await read()\n const after = await readMutationEpoch(resolvedRoot)\n if (before === after && !isOdd(after)) return result\n if (isOdd(after)) await waitForActiveMutationEpoch(resolvedRoot, after, options)\n }\n throw new Error('knowledge read could not observe a stable mutation epoch')\n })\n}\n\nexport async function acquireDurableFileLock(\n target: string,\n options: { lockfilePath: string; staleMs?: number; retries?: LockOptions['retries'] },\n): Promise<DurableFileLock> {\n const stale = Math.max(5_000, options.staleMs ?? DEFAULT_STALE_MS)\n const update = Math.max(1_000, Math.floor(stale / 3))\n let compromised: Error | undefined\n let released = false\n await mkdir(dirname(options.lockfilePath), { recursive: true })\n const release = await lock(target, {\n lockfilePath: options.lockfilePath,\n realpath: false,\n stale,\n update,\n retries: options.retries,\n onCompromised(error) {\n compromised = error\n },\n })\n\n return {\n assertOwned() {\n if (released) throw new KnowledgeLockLostError('knowledge filesystem lock is no longer owned')\n if (compromised)\n throw new KnowledgeLockLostError('knowledge filesystem lock was compromised', {\n cause: compromised,\n })\n },\n async release() {\n if (released) return\n released = true\n let releaseError: unknown\n try {\n await release()\n } catch (error) {\n releaseError = error\n }\n if (releaseError && compromised) {\n throw new AggregateError(\n [releaseError, compromised],\n 'knowledge filesystem lock was compromised and could not be released',\n )\n }\n if (releaseError) throw releaseError\n if (compromised) {\n throw new KnowledgeLockLostError('knowledge filesystem lock was compromised', {\n cause: compromised,\n })\n }\n },\n }\n}\n\nasync function beginMutationEpoch(cacheDir: string): Promise<number> {\n const current = await readMutationEpochFromCache(cacheDir)\n const odd = isOdd(current) ? current : current + 1\n await writeMutationEpoch(cacheDir, odd)\n return odd\n}\n\nasync function finishMutationEpoch(cacheDir: string, odd: number): Promise<void> {\n await writeMutationEpoch(cacheDir, isOdd(odd) ? odd + 1 : odd)\n}\n\nasync function readMutationEpoch(root: string): Promise<number> {\n try {\n return await withSafeDirectory(root, '.agent-knowledge', false, readMutationEpochFromCache)\n } catch (error) {\n if (isMissingFile(error)) return 0\n throw error\n }\n}\n\nasync function readMutationEpochFromCache(cacheDir: string): Promise<number> {\n try {\n const text = await withSafeDescendant(cacheDir, 'mutation-epoch.json', (path) =>\n readFile(path, 'utf8'),\n )\n const parsed = JSON.parse(text) as { epoch?: unknown }\n const epoch = parsed.epoch\n if (typeof epoch !== 'number' || !Number.isSafeInteger(epoch) || epoch < 0) {\n throw new Error('knowledge mutation epoch is invalid')\n }\n return epoch\n } catch (error) {\n if (isMissingFile(error)) return 0\n throw error\n }\n}\n\nasync function writeMutationEpoch(cacheDir: string, epoch: number): Promise<void> {\n await writeJsonDurableWithinRoot(cacheDir, 'mutation-epoch.json', {\n epoch,\n updatedAt: new Date().toISOString(),\n })\n}\n\nasync function waitForActiveMutationEpoch(\n root: string,\n epoch: number,\n options: KnowledgeReadOptions,\n): Promise<void> {\n if (!(await hasActiveMutationLock(root, options))) {\n throw new Error(`knowledge mutation epoch ${epoch} is odd with no active writer`)\n }\n await new Promise((resolve) => setTimeout(resolve, options.waitMs ?? DEFAULT_READ_WAIT_MS))\n}\n\nasync function hasActiveMutationLock(\n root: string,\n options: Pick<KnowledgeReadOptions, 'staleMs'>,\n): Promise<boolean> {\n try {\n return await withSafeDirectory(root, '.agent-knowledge', false, (cacheDir) =>\n check(root, {\n lockfilePath: join(cacheDir, 'mutation.lock.durable'),\n realpath: false,\n stale: Math.max(5_000, options.staleMs ?? DEFAULT_STALE_MS),\n }),\n )\n } catch (error) {\n if (isMissingFile(error)) return false\n throw error\n }\n}\n\nfunction isOdd(value: number): boolean {\n return value % 2 === 1\n}\n","import { randomUUID } from 'node:crypto'\nimport { constants } from 'node:fs'\nimport {\n type FileHandle,\n lstat,\n mkdir,\n open,\n readdir,\n realpath,\n rename,\n rm,\n} from 'node:fs/promises'\nimport { basename, dirname, isAbsolute, resolve } from 'node:path'\n\nconst DIRECTORY_FLAGS = constants.O_RDONLY | constants.O_DIRECTORY | constants.O_NOFOLLOW\nconst CREATE_FILE_FLAGS =\n constants.O_WRONLY | constants.O_CREAT | constants.O_EXCL | constants.O_NOFOLLOW\nconst READ_FILE_FLAGS = constants.O_RDONLY | constants.O_NOFOLLOW\n\nexport interface RegularFileSnapshot {\n bytes: Buffer\n mode: number\n}\n\nexport async function writeFileDurable(\n path: string,\n data: string | Buffer,\n options: { encoding?: BufferEncoding; mode?: number } = {},\n): Promise<void> {\n const directory = dirname(path)\n await mkdir(directory, { recursive: true })\n await withDirectoryHandle(directory, async (handle, anchoredDirectory) => {\n const target = resolve(anchoredDirectory, basename(path))\n const existingMode = await regularFileModeOrUndefined(target)\n const requestedMode = options.mode ?? existingMode\n const temporary = resolve(anchoredDirectory, `.${basename(path)}.${randomUUID()}.tmp`)\n let temporaryHandle: FileHandle | undefined\n try {\n temporaryHandle = await open(temporary, CREATE_FILE_FLAGS, requestedMode ?? 0o666)\n await temporaryHandle.writeFile(\n data,\n options.encoding === undefined ? undefined : { encoding: options.encoding },\n )\n if (requestedMode !== undefined) await temporaryHandle.chmod(requestedMode)\n await temporaryHandle.sync()\n await temporaryHandle.close()\n temporaryHandle = undefined\n await rename(temporary, target)\n await syncDirectoryHandle(handle)\n } finally {\n await temporaryHandle?.close().catch(() => undefined)\n await rm(temporary, { force: true }).catch(() => undefined)\n }\n })\n}\n\nexport async function writeJsonDurable(path: string, value: unknown): Promise<void> {\n await writeFileDurable(path, `${JSON.stringify(value, null, 2)}\\n`, { encoding: 'utf8' })\n}\n\nexport async function writeFileDurableWithinRoot(\n root: string,\n relativePath: string,\n data: string | Buffer,\n options: { encoding?: BufferEncoding; mode?: number } = {},\n): Promise<void> {\n await withSafeDescendant(root, relativePath, (path) => writeFileDurable(path, data, options))\n}\n\nexport async function writeJsonDurableWithinRoot(\n root: string,\n relativePath: string,\n value: unknown,\n): Promise<void> {\n await writeFileDurableWithinRoot(root, relativePath, `${JSON.stringify(value, null, 2)}\\n`, {\n encoding: 'utf8',\n })\n}\n\nexport async function renameDurable(source: string, target: string): Promise<void> {\n const sourceDir = dirname(source)\n const targetDir = dirname(target)\n await withDirectoryHandle(sourceDir, async (sourceHandle, anchoredSourceDir) => {\n await withDirectoryHandle(targetDir, async (targetHandle, anchoredTargetDir) => {\n await rename(\n resolve(anchoredSourceDir, basename(source)),\n resolve(anchoredTargetDir, basename(target)),\n )\n await syncDirectoryHandle(sourceHandle)\n if (targetDir !== sourceDir) await syncDirectoryHandle(targetHandle)\n })\n })\n}\n\nexport async function removeDurable(path: string): Promise<void> {\n await withDirectoryHandle(dirname(path), async (handle, anchoredDirectory) => {\n await rm(resolve(anchoredDirectory, basename(path)), { force: true })\n await syncDirectoryHandle(handle)\n })\n}\n\nexport async function syncDirectory(path: string): Promise<void> {\n await withDirectoryHandle(path, syncDirectoryHandle)\n}\n\n/**\n * Keeps the target's parent directory open while the operation runs. On Linux,\n * `/proc/self/fd` anchors every lookup to that directory even if an ancestor is\n * renamed concurrently.\n */\nexport async function withSafeDescendant<T>(\n root: string,\n relativePath: string,\n use: (path: string) => Promise<T> | T,\n): Promise<T> {\n const normalized = normalizeRelativePath(relativePath)\n const parts = normalized.split('/')\n const filename = parts.pop()!\n const directory = await openSafeDirectoryTree(root, parts.join('/'), true)\n try {\n const target = resolve(anchoredDirectoryPath(directory.handle, directory.path), filename)\n await regularFileModeOrUndefined(target)\n return await use(target)\n } finally {\n await directory.handle.close()\n }\n}\n\nexport async function withSafeDirectory<T>(\n root: string,\n relativePath: string,\n create: boolean,\n use: (path: string) => Promise<T> | T,\n): Promise<T> {\n const directory = await openSafeDirectoryTree(root, relativePath, create)\n try {\n return await use(anchoredDirectoryPath(directory.handle, directory.path))\n } finally {\n await directory.handle.close()\n }\n}\n\nexport async function readRegularFileNoFollow(path: string): Promise<RegularFileSnapshot> {\n let handle: FileHandle | undefined\n try {\n handle = await open(path, READ_FILE_FLAGS)\n const entry = await handle.stat()\n if (!entry.isFile()) throw new Error(`knowledge path is not a regular file: ${path}`)\n return { bytes: await handle.readFile(), mode: entry.mode & 0o777 }\n } catch (error) {\n const code = (error as NodeJS.ErrnoException | null)?.code\n if (code === 'ELOOP' || code === 'ENOTDIR') {\n throw new Error(`knowledge path is not a regular file: ${path}`, { cause: error })\n }\n throw error\n } finally {\n await handle?.close().catch(() => undefined)\n }\n}\n\nexport async function readRegularFileWithinRoot(\n root: string,\n relativePath: string,\n): Promise<RegularFileSnapshot> {\n const normalized = normalizeRelativePath(relativePath)\n const parts = normalized.split('/')\n const filename = parts.pop()!\n const directory = await openSafeDirectoryTree(root, parts.join('/'), false)\n try {\n return await readRegularFileNoFollow(\n resolve(anchoredDirectoryPath(directory.handle, directory.path), filename),\n )\n } finally {\n await directory.handle.close()\n }\n}\n\nexport async function listRegularFilesWithinRoot(\n root: string,\n relativeDirectory: string,\n): Promise<Array<RegularFileSnapshot & { path: string }>> {\n const normalized = normalizeRelativePath(relativeDirectory)\n return withSafeDirectory(root, normalized, false, (directory) =>\n listRegularFilesFromOpenDirectory(directory, normalized),\n )\n}\n\nexport function isMissingFile(error: unknown): boolean {\n return (error as NodeJS.ErrnoException | null)?.code === 'ENOENT'\n}\n\nasync function withDirectoryHandle<T>(\n path: string,\n use: (handle: FileHandle, anchoredPath: string) => Promise<T> | T,\n): Promise<T> {\n const handle = await openDirectory(path)\n try {\n return await use(handle, anchoredDirectoryPath(handle, path))\n } finally {\n await handle.close()\n }\n}\n\nasync function listRegularFilesFromOpenDirectory(\n directory: string,\n relativeDirectory: string,\n): Promise<Array<RegularFileSnapshot & { path: string }>> {\n const out: Array<RegularFileSnapshot & { path: string }> = []\n for (const entry of await readdir(directory, { withFileTypes: true })) {\n const relativePath = `${relativeDirectory}/${entry.name}`\n if (entry.isDirectory()) {\n out.push(\n ...(await withSafeDirectory(directory, entry.name, false, (child) =>\n listRegularFilesFromOpenDirectory(child, relativePath),\n )),\n )\n } else if (entry.isFile()) {\n out.push({\n path: relativePath,\n ...(await readRegularFileNoFollow(resolve(directory, entry.name))),\n })\n } else {\n throw new Error(`knowledge tree contains an unsupported filesystem entry: ${relativePath}`)\n }\n }\n return out\n}\n\nasync function openSafeDirectoryTree(\n root: string,\n relativePath: string,\n create: boolean,\n): Promise<{ handle: FileHandle; path: string }> {\n if (create) await mkdir(root, { recursive: true })\n const resolvedRoot = isKernelAnchoredPath(root) ? root : await realpath(root)\n const normalized = relativePath === '' ? '' : normalizeRelativePath(relativePath)\n let currentPath = resolvedRoot\n let currentHandle = await openDirectory(resolvedRoot)\n try {\n for (const part of normalized.split('/').filter(Boolean)) {\n const anchoredParent = anchoredDirectoryPath(currentHandle, currentPath)\n const childPath = resolve(anchoredParent, part)\n let childHandle: FileHandle\n try {\n childHandle = await openDirectory(childPath)\n } catch (error) {\n if (!create || !isMissingFile(error)) throw unsafeDirectoryError(childPath, error)\n let created = false\n try {\n await mkdir(childPath)\n created = true\n } catch (mkdirError) {\n if ((mkdirError as NodeJS.ErrnoException | null)?.code !== 'EEXIST') throw mkdirError\n }\n childHandle = await openDirectory(childPath).catch((openError: unknown) => {\n throw unsafeDirectoryError(childPath, openError)\n })\n if (created) await syncDirectoryHandle(currentHandle)\n }\n await currentHandle.close()\n currentHandle = childHandle\n currentPath = resolve(currentPath, part)\n }\n return { handle: currentHandle, path: currentPath }\n } catch (error) {\n await currentHandle.close().catch(() => undefined)\n throw error\n }\n}\n\nasync function openDirectory(path: string): Promise<FileHandle> {\n const isKernelDescriptor = /^\\/proc\\/self\\/fd\\/\\d+$/.test(path)\n if (!isKernelDescriptor) {\n const entry = await lstat(path)\n if (entry.isSymbolicLink() || !entry.isDirectory()) {\n throw new Error(`knowledge path has an unsafe directory: ${path}`)\n }\n }\n const flags = isKernelDescriptor ? constants.O_RDONLY | constants.O_DIRECTORY : DIRECTORY_FLAGS\n const handle = await open(path, flags)\n const entry = await handle.stat()\n if (!entry.isDirectory()) {\n await handle.close()\n throw new Error(`knowledge path has an unsafe directory: ${path}`)\n }\n return handle\n}\n\nexport function isKernelAnchoredPath(path: string): boolean {\n return process.platform === 'linux' && /^\\/proc\\/self\\/fd\\/\\d+(?:\\/|$)/.test(path)\n}\n\nfunction anchoredDirectoryPath(handle: FileHandle, fallback: string): string {\n return process.platform === 'linux' ? `/proc/self/fd/${handle.fd}` : fallback\n}\n\nasync function regularFileModeOrUndefined(path: string): Promise<number | undefined> {\n try {\n const entry = await lstat(path)\n if (entry.isSymbolicLink() || !entry.isFile()) {\n throw new Error(`knowledge path is not a regular file: ${path}`)\n }\n return entry.mode & 0o777\n } catch (error) {\n if (isMissingFile(error)) return undefined\n throw error\n }\n}\n\nasync function syncDirectoryHandle(handle: FileHandle): Promise<void> {\n if (process.platform === 'win32') return\n await handle.sync()\n}\n\nfunction unsafeDirectoryError(path: string, cause: unknown): Error {\n const code = (cause as NodeJS.ErrnoException | null)?.code\n if (code === 'ELOOP' || code === 'ENOTDIR') {\n return new Error(`knowledge path has an unsafe directory: ${path}`, { cause })\n }\n return cause instanceof Error ? cause : new Error(`could not open knowledge directory: ${path}`)\n}\n\nfunction normalizeRelativePath(path: string): string {\n if (path.length === 0 || isAbsolute(path)) {\n throw new Error(`knowledge path must be a non-empty relative path: ${path}`)\n }\n const normalized = path.replace(/\\\\/g, '/')\n if (normalized.split('/').some((part) => part === '' || part === '.' || part === '..')) {\n throw new Error(`knowledge path contains an unsafe segment: ${path}`)\n }\n return normalized\n}\n","import { createHash, randomUUID } from 'node:crypto'\nimport { mkdtemp, readdir, rm } from 'node:fs/promises'\nimport { join, relative, resolve, sep } from 'node:path'\nimport { contentHash } from '@tangle-network/agent-eval'\nimport { z } from 'zod'\nimport {\n isKernelAnchoredPath,\n isMissingFile,\n readRegularFileNoFollow,\n removeDurable,\n renameDurable,\n syncDirectory,\n withSafeDescendant,\n withSafeDirectory,\n writeFileDurable,\n writeJsonDurable,\n} from './durable-fs'\n\nconst digestSchema = z.string().regex(/^[a-f0-9]{64}$/)\nconst fileModeSchema = z.number().int().min(0).max(0o777)\nconst DEFAULT_FILE_MODE = 0o644\nconst transactionEntrySchema = z\n .object({\n index: z.number().int().nonnegative(),\n path: z.string().min(1),\n beforeHash: digestSchema.nullable(),\n afterHash: digestSchema.nullable(),\n beforeMode: fileModeSchema.optional(),\n afterMode: fileModeSchema.optional(),\n })\n .strict()\nconst transactionSchema = z\n .object({\n kind: z.literal('knowledge-file-transaction'),\n transactionId: z.string().uuid(),\n purpose: z.string().min(1),\n createdAt: z.string().min(1),\n entries: z.array(transactionEntrySchema).min(1),\n })\n .strict()\nconst transactionDirectionSchema = z\n .object({\n transactionId: z.string().uuid(),\n direction: z.literal('rollback'),\n })\n .strict()\n\nexport type KnowledgeFileTransaction = z.infer<typeof transactionSchema>\n\nexport interface KnowledgeFileTransactionState {\n transaction: KnowledgeFileTransaction\n direction: 'apply' | 'rollback'\n}\n\nexport interface KnowledgeFileTransactionPlanEntry {\n path: string\n beforeHash: string | null\n afterHash: string | null\n beforeMode?: number\n afterMode?: number\n}\n\nexport function knowledgeFileTransactionPlanHash(\n entries: readonly KnowledgeFileTransactionPlanEntry[],\n): string {\n const normalized = entries\n .map((entry) => normalizePlanEntry(entry))\n .sort((left, right) => left.path.localeCompare(right.path))\n if (new Set(normalized.map((entry) => entry.path)).size !== normalized.length) {\n throw new Error('knowledge transaction plan repeats a path')\n }\n return contentHash(normalized)\n}\n\nexport interface KnowledgeFileMutation {\n path: string\n content: string | Buffer | null\n mode?: number\n}\n\nexport async function prepareKnowledgeFileTransaction(input: {\n root: string\n transactionRoot: string\n purpose: string\n mutations: readonly KnowledgeFileMutation[]\n includeUnchanged?: boolean\n now?: () => Date\n}): Promise<KnowledgeFileTransaction | null> {\n if (input.mutations.length === 0) throw new Error('knowledge file transaction has no mutations')\n return withTransactionRoot(input.root, input.transactionRoot, true, async (transactionRoot) => {\n const activeTransactions = await activeTransactionDirectoryNames(transactionRoot)\n if (activeTransactions.length > 0) {\n throw new Error(\n `knowledge file transaction is already active: ${activeTransactions.join(', ')}`,\n )\n }\n\n const paths = new Set<string>()\n const prepared = await Promise.all(\n input.mutations.map(async (mutation, index) => {\n const path = assertKnowledgeMutationPath(mutation.path)\n if (paths.has(path)) throw new Error(`knowledge file transaction repeats path: ${path}`)\n if (mutation.content === null && mutation.mode !== undefined) {\n throw new Error(`deleted knowledge file cannot declare a mode: ${path}`)\n }\n paths.add(path)\n const before = await withSafeDescendant(input.root, path, readRegularFile)\n const after =\n mutation.content === null\n ? null\n : Buffer.isBuffer(mutation.content)\n ? mutation.content\n : Buffer.from(mutation.content, 'utf8')\n const afterMode = after\n ? fileModeSchema.parse(mutation.mode ?? before?.mode ?? DEFAULT_FILE_MODE)\n : undefined\n if (\n !input.includeUnchanged &&\n sameBytes(before?.bytes ?? null, after) &&\n before?.mode === afterMode\n ) {\n return null\n }\n return {\n entry: {\n index,\n path,\n beforeHash: before ? hashBytes(before.bytes) : null,\n afterHash: after ? hashBytes(after) : null,\n ...(before ? { beforeMode: before.mode } : {}),\n ...(afterMode === undefined ? {} : { afterMode }),\n },\n before: before?.bytes ?? null,\n after,\n }\n }),\n )\n const changed = prepared.filter((entry): entry is NonNullable<typeof entry> => entry !== null)\n if (changed.length === 0) return null\n\n const preparationDir = await mkdtemp(join(transactionRoot, 'prepare-'))\n let activated = false\n try {\n for (const item of changed) {\n if (item.before) {\n await writeFileDurable(\n snapshotPath(preparationDir, 'before', item.entry.index),\n item.before,\n )\n }\n if (item.after) {\n await writeFileDurable(\n snapshotPath(preparationDir, 'after', item.entry.index),\n item.after,\n )\n }\n }\n const transaction = transactionSchema.parse({\n kind: 'knowledge-file-transaction',\n transactionId: randomUUID(),\n purpose: input.purpose,\n createdAt: (input.now ?? (() => new Date()))().toISOString(),\n entries: changed.map((item) => item.entry),\n })\n await writeJsonDurable(join(preparationDir, 'transaction.json'), transaction)\n const activeDir = join(\n transactionRoot,\n activeTransactionDirectoryName(transaction.transactionId),\n )\n await renameDurable(preparationDir, activeDir)\n activated = true\n const competingTransactions = await activeTransactionDirectoryNames(transactionRoot)\n if (competingTransactions.length > 1) {\n await rm(activeDir, { recursive: true, force: true })\n await syncDirectory(transactionRoot)\n throw new Error('multiple knowledge file transactions became active concurrently')\n }\n return transaction\n } finally {\n if (!activated) await rm(preparationDir, { recursive: true, force: true })\n }\n })\n}\n\nexport async function commitKnowledgeFileMutations(input: {\n root: string\n transactionRoot: string\n purpose: string\n mutations: readonly KnowledgeFileMutation[]\n assertOwned?: () => void\n now?: () => Date\n}): Promise<boolean> {\n if (\n await loadKnowledgeFileTransaction({\n root: input.root,\n transactionRoot: input.transactionRoot,\n })\n ) {\n throw new Error('recover the pending knowledge transaction before planning another write')\n }\n const transaction = await prepareKnowledgeFileTransaction({\n root: input.root,\n transactionRoot: input.transactionRoot,\n purpose: input.purpose,\n mutations: input.mutations,\n now: input.now,\n })\n if (!transaction) return false\n input.assertOwned?.()\n await applyKnowledgeFileTransaction({\n root: input.root,\n transactionRoot: input.transactionRoot,\n transaction,\n beforeCommit: input.assertOwned,\n })\n await finishKnowledgeFileTransaction({\n root: input.root,\n transactionRoot: input.transactionRoot,\n transaction,\n assertOwned: input.assertOwned,\n })\n return true\n}\n\nexport async function recoverKnowledgeFileTransaction(input: {\n root: string\n transactionRoot: string\n expectedPurpose: string\n direction?: 'apply' | 'rollback'\n validate?: (transaction: KnowledgeFileTransaction) => void\n assertOwned?: () => void\n}): Promise<boolean> {\n const pending = await inspectKnowledgeFileTransaction({\n root: input.root,\n transactionRoot: input.transactionRoot,\n })\n if (!pending) return false\n const { transaction, direction } = pending\n if (transaction.purpose !== input.expectedPurpose) {\n throw new Error(`knowledge transaction '${transaction.purpose}' requires its owner to resume`)\n }\n input.validate?.(transaction)\n input.assertOwned?.()\n if (input.direction === 'apply' && direction === 'rollback') {\n throw new Error(`knowledge transaction '${transaction.transactionId}' is already rolling back`)\n }\n const requestedDirection = input.direction ?? direction\n if (requestedDirection === 'rollback') {\n await rollbackKnowledgeFileTransaction({\n root: input.root,\n transactionRoot: input.transactionRoot,\n transaction,\n beforeCommit: input.assertOwned,\n })\n } else {\n await applyKnowledgeFileTransaction({\n root: input.root,\n transactionRoot: input.transactionRoot,\n transaction,\n beforeCommit: input.assertOwned,\n })\n }\n await finishKnowledgeFileTransaction({\n root: input.root,\n transactionRoot: input.transactionRoot,\n transaction,\n assertOwned: input.assertOwned,\n })\n return true\n}\n\nexport async function loadKnowledgeFileTransaction(input: {\n root: string\n transactionRoot: string\n}): Promise<KnowledgeFileTransaction | null> {\n return (await inspectKnowledgeFileTransaction(input))?.transaction ?? null\n}\n\nexport async function inspectKnowledgeFileTransaction(input: {\n root: string\n transactionRoot: string\n}): Promise<KnowledgeFileTransactionState | null> {\n return loadKnowledgeFileTransactionState(input)\n}\n\nexport async function applyKnowledgeFileTransaction(input: {\n root: string\n transactionRoot: string\n transaction: KnowledgeFileTransaction\n beforeCommit?: (entry: KnowledgeFileTransaction['entries'][number]) => Promise<void> | void\n}): Promise<void> {\n const transaction = transactionSchema.parse(input.transaction)\n assertTransactionEntries(transaction)\n await withTransactionDirectory(\n input.root,\n input.transactionRoot,\n transaction,\n async (transactionDir) => {\n await assertActiveTransaction(transactionDir, transaction)\n if ((await readTransactionDirection(transactionDir, transaction)) === 'rollback') {\n throw new Error(`knowledge transaction '${transaction.transactionId}' is rolling back`)\n }\n for (const entry of transaction.entries) {\n await withSafeDescendant(input.root, entry.path, async (target) => {\n const current = await readRegularFile(target)\n if (fileMatches(current, entry.afterHash, entry.afterMode)) return\n if (!fileMatches(current, entry.beforeHash, entry.beforeMode)) {\n throw new Error(`knowledge file changed outside transaction: ${entry.path}`)\n }\n await input.beforeCommit?.(entry)\n if (entry.afterHash === null) {\n await removeDurable(target)\n return\n }\n const after = (\n await readRegularFileNoFollow(snapshotPath(transactionDir, 'after', entry.index))\n ).bytes\n if (hashBytes(after) !== entry.afterHash) {\n throw new Error(`knowledge transaction snapshot changed: ${entry.path}`)\n }\n await writeFileDurable(target, after, { mode: entry.afterMode! })\n })\n }\n await assertKnowledgeFileTransactionApplied(input.root, transaction)\n },\n )\n}\n\nexport async function assertKnowledgeFileTransactionApplied(\n root: string,\n transaction: KnowledgeFileTransaction,\n): Promise<void> {\n for (const entry of transaction.entries) {\n await withSafeDescendant(root, entry.path, async (target) => {\n const current = await readRegularFile(target)\n if (!fileMatches(current, entry.afterHash, entry.afterMode)) {\n throw new Error(`knowledge file transaction did not commit: ${entry.path}`)\n }\n })\n }\n}\n\nexport async function finishKnowledgeFileTransaction(input: {\n root: string\n transactionRoot: string\n transaction: KnowledgeFileTransaction\n assertOwned?: () => void\n}): Promise<void> {\n const transaction = transactionSchema.parse(input.transaction)\n assertTransactionEntries(transaction)\n await withTransactionRoot(input.root, input.transactionRoot, false, async (transactionRoot) => {\n const activeName = activeTransactionDirectoryName(transaction.transactionId)\n await withTransactionDirectory(\n input.root,\n input.transactionRoot,\n transaction,\n async (transactionDir) => {\n await assertActiveTransaction(transactionDir, transaction)\n input.assertOwned?.()\n const direction = await readTransactionDirection(transactionDir, transaction)\n await assertKnowledgeFileTransactionTerminal(input.root, transaction, direction)\n await withSafeDirectory(transactionRoot, activeName, false, async (currentDir) => {\n await assertActiveTransaction(currentDir, transaction)\n const currentDirection = await readTransactionDirection(currentDir, transaction)\n if (currentDirection !== direction) {\n throw new Error(\n `knowledge transaction '${transaction.transactionId}' changed direction`,\n )\n }\n await assertKnowledgeFileTransactionTerminal(input.root, transaction, currentDirection)\n })\n },\n )\n await rm(join(transactionRoot, activeName), { recursive: true, force: false })\n await syncDirectory(transactionRoot)\n })\n}\n\nexport async function rollbackKnowledgeFileTransaction(input: {\n root: string\n transactionRoot: string\n transaction: KnowledgeFileTransaction\n beforeCommit?: (entry: KnowledgeFileTransaction['entries'][number]) => Promise<void> | void\n}): Promise<void> {\n await withTransactionDirectory(\n input.root,\n input.transactionRoot,\n input.transaction,\n async (transactionDir) => {\n const transaction = transactionSchema.parse(input.transaction)\n assertTransactionEntries(transaction)\n await assertActiveTransaction(transactionDir, transaction)\n await input.beforeCommit?.(transaction.entries.at(-1)!)\n const direction = await readTransactionDirection(transactionDir, transaction)\n if (direction !== 'rollback') {\n await writeJsonDurable(join(transactionDir, 'direction.json'), {\n transactionId: transaction.transactionId,\n direction: 'rollback',\n })\n }\n for (const entry of [...transaction.entries].reverse()) {\n await withSafeDescendant(input.root, entry.path, async (target) => {\n const current = await readRegularFile(target)\n if (fileMatches(current, entry.beforeHash, entry.beforeMode)) return\n if (!fileMatches(current, entry.afterHash, entry.afterMode)) {\n throw new Error(`knowledge file changed outside rollback: ${entry.path}`)\n }\n await input.beforeCommit?.(entry)\n if (entry.beforeHash === null) {\n await removeDurable(target)\n return\n }\n const before = (\n await readRegularFileNoFollow(snapshotPath(transactionDir, 'before', entry.index))\n ).bytes\n if (hashBytes(before) !== entry.beforeHash) {\n throw new Error(`knowledge rollback snapshot changed: ${entry.path}`)\n }\n await writeFileDurable(target, before, { mode: entry.beforeMode! })\n })\n }\n await input.beforeCommit?.(transaction.entries[0]!)\n for (const entry of transaction.entries) {\n await withSafeDescendant(input.root, entry.path, async (target) => {\n const current = await readRegularFile(target)\n if (!fileMatches(current, entry.beforeHash, entry.beforeMode)) {\n throw new Error(`knowledge file transaction did not roll back: ${entry.path}`)\n }\n })\n }\n },\n )\n}\n\nasync function loadKnowledgeFileTransactionState(input: {\n root: string\n transactionRoot: string\n}): Promise<KnowledgeFileTransactionState | null> {\n try {\n return await withTransactionRoot(input.root, input.transactionRoot, false, async (root) => {\n const activeTransactions = await activeTransactionDirectoryNames(root)\n if (activeTransactions.length === 0) return null\n if (activeTransactions.length > 1) {\n throw new Error('multiple knowledge file transactions are active')\n }\n return withSafeDirectory(root, activeTransactions[0]!, false, async (transactionDir) => {\n const transaction = await readActiveTransaction(transactionDir)\n return {\n transaction,\n direction: await readTransactionDirection(transactionDir, transaction),\n }\n })\n })\n } catch (error) {\n if (isMissingFile(error)) return null\n throw error\n }\n}\n\nasync function readActiveTransaction(transactionDir: string): Promise<KnowledgeFileTransaction> {\n const transaction = transactionSchema.parse(\n JSON.parse(\n (await readRegularFileNoFollow(join(transactionDir, 'transaction.json'))).bytes.toString(\n 'utf8',\n ),\n ),\n )\n assertTransactionEntries(transaction)\n return transaction\n}\n\nasync function assertActiveTransaction(\n transactionDir: string,\n expected: KnowledgeFileTransaction,\n): Promise<void> {\n const active = await readActiveTransaction(transactionDir)\n if (\n active.transactionId !== expected.transactionId ||\n contentHash(active) !== contentHash(transactionSchema.parse(expected))\n ) {\n throw new Error(`active knowledge transaction does not match '${expected.transactionId}'`)\n }\n}\n\nasync function readTransactionDirection(\n transactionDir: string,\n transaction: KnowledgeFileTransaction,\n): Promise<'apply' | 'rollback'> {\n try {\n const direction = transactionDirectionSchema.parse(\n JSON.parse(\n (await readRegularFileNoFollow(join(transactionDir, 'direction.json'))).bytes.toString(\n 'utf8',\n ),\n ),\n )\n if (direction.transactionId !== transaction.transactionId) {\n throw new Error('knowledge transaction direction belongs to another transaction')\n }\n return direction.direction\n } catch (error) {\n if (isMissingFile(error)) return 'apply'\n throw error\n }\n}\n\nfunction snapshotPath(root: string, side: 'before' | 'after', index: number): string {\n return join(root, side, `${index}.bin`)\n}\n\nasync function withTransactionDirectory<T>(\n root: string,\n transactionRoot: string,\n transaction: KnowledgeFileTransaction,\n use: (transactionDir: string) => Promise<T> | T,\n): Promise<T> {\n const parsed = transactionSchema.parse(transaction)\n try {\n return await withTransactionRoot(root, transactionRoot, false, (safeRoot) =>\n withSafeDirectory(safeRoot, activeTransactionDirectoryName(parsed.transactionId), false, use),\n )\n } catch (error) {\n if (isMissingFile(error)) {\n throw new Error(`active knowledge transaction does not match '${parsed.transactionId}'`, {\n cause: error,\n })\n }\n throw error\n }\n}\n\nasync function activeTransactionDirectoryNames(transactionRoot: string): Promise<string[]> {\n const active: string[] = []\n for (const entry of await readdir(transactionRoot, { withFileTypes: true })) {\n if (entry.name === 'active') {\n throw new Error('knowledge transaction store contains an unsupported active journal')\n }\n if (!entry.name.startsWith('active-')) continue\n if (!entry.isDirectory()) {\n throw new Error(`knowledge transaction journal is not a directory: ${entry.name}`)\n }\n activeTransactionDirectoryName(entry.name.slice('active-'.length))\n active.push(entry.name)\n }\n return active.sort()\n}\n\nfunction activeTransactionDirectoryName(transactionId: string): string {\n return `active-${z.string().uuid().parse(transactionId)}`\n}\n\nasync function assertKnowledgeFileTransactionTerminal(\n root: string,\n transaction: KnowledgeFileTransaction,\n direction: 'apply' | 'rollback',\n): Promise<void> {\n if (direction === 'apply') {\n await assertKnowledgeFileTransactionApplied(root, transaction)\n return\n }\n for (const entry of transaction.entries) {\n await withSafeDescendant(root, entry.path, async (target) => {\n const current = await readRegularFile(target)\n if (!fileMatches(current, entry.beforeHash, entry.beforeMode)) {\n throw new Error(`knowledge file transaction did not roll back: ${entry.path}`)\n }\n })\n }\n}\n\nasync function withTransactionRoot<T>(\n root: string,\n transactionRoot: string,\n create: boolean,\n use: (transactionRoot: string) => Promise<T> | T,\n): Promise<T> {\n if (isKernelAnchoredPath(transactionRoot)) {\n const match = transactionRoot.match(/^(\\/proc\\/self\\/fd\\/\\d+)(?:\\/(.*))?$/)\n if (!match?.[1]) throw new Error('knowledge transaction directory has an invalid anchor')\n return withSafeDirectory(match[1], match[2] ?? '', create, use)\n }\n const resolvedRoot = resolve(root)\n const resolvedTransactionRoot = resolve(transactionRoot)\n if (!resolvedTransactionRoot.startsWith(`${resolvedRoot}${sep}`)) {\n throw new Error('knowledge transaction directory escaped its root')\n }\n return withSafeDirectory(\n root,\n relative(resolvedRoot, resolvedTransactionRoot).replace(/\\\\/g, '/'),\n create,\n use,\n )\n}\n\nfunction assertTransactionEntries(transaction: KnowledgeFileTransaction): void {\n const indexes = new Set<number>()\n const paths = new Set<string>()\n for (const entry of transaction.entries) {\n const normalized = assertKnowledgeMutationPath(entry.path)\n if (entry.path !== normalized || indexes.has(entry.index) || paths.has(entry.path)) {\n throw new Error('knowledge file transaction has duplicate or unsafe entries')\n }\n assertHashModePair(entry.path, 'before', entry.beforeHash, entry.beforeMode)\n assertHashModePair(entry.path, 'after', entry.afterHash, entry.afterMode)\n indexes.add(entry.index)\n paths.add(entry.path)\n }\n}\n\nfunction normalizePlanEntry(entry: KnowledgeFileTransactionPlanEntry) {\n const path = assertKnowledgeMutationPath(entry.path)\n assertHashModePair(path, 'before', entry.beforeHash, entry.beforeMode)\n assertHashModePair(path, 'after', entry.afterHash, entry.afterMode)\n return {\n path,\n beforeHash: entry.beforeHash,\n afterHash: entry.afterHash,\n ...(entry.beforeMode === undefined\n ? {}\n : { beforeMode: fileModeSchema.parse(entry.beforeMode) }),\n ...(entry.afterMode === undefined ? {} : { afterMode: fileModeSchema.parse(entry.afterMode) }),\n }\n}\n\nfunction assertHashModePair(\n path: string,\n side: 'before' | 'after',\n hash: string | null,\n mode: number | undefined,\n): void {\n if ((hash === null) !== (mode === undefined)) {\n throw new Error(`knowledge transaction ${side} hash and mode disagree: ${path}`)\n }\n if (mode !== undefined) fileModeSchema.parse(mode)\n}\n\nexport function assertKnowledgeMutationPath(path: string): string {\n const normalized = normalizeTransactionPath(path)\n if (\n normalized === '.agent-knowledge/sources.json' ||\n normalized.startsWith('knowledge/') ||\n normalized.startsWith('raw/')\n ) {\n return normalized\n }\n throw new Error(`knowledge transaction contains an unsupported path: ${path}`)\n}\n\nfunction normalizeTransactionPath(path: string): string {\n const normalized = path.replace(/\\\\/g, '/')\n if (\n normalized.length === 0 ||\n normalized.startsWith('/') ||\n /^[A-Za-z]:/.test(normalized) ||\n normalized.split('/').some((part) => part === '' || part === '.' || part === '..')\n ) {\n throw new Error(`knowledge file transaction has an unsafe path: ${path}`)\n }\n return normalized\n}\n\nasync function readRegularFile(path: string): Promise<{ bytes: Buffer; mode: number } | null> {\n try {\n return await readRegularFileNoFollow(path)\n } catch (error) {\n if (isMissingFile(error)) return null\n throw error\n }\n}\n\nfunction hashBytes(bytes: Buffer): string {\n return createHash('sha256').update(bytes).digest('hex')\n}\n\nfunction sameBytes(left: Buffer | null, right: Buffer | null): boolean {\n if (left === null || right === null) return left === right\n return left.equals(right)\n}\n\nfunction fileMatches(\n file: { bytes: Buffer; mode: number } | null,\n hash: string | null,\n mode: number | undefined,\n): boolean {\n return (file ? hashBytes(file.bytes) : null) === hash && file?.mode === mode\n}\n","import { z } from 'zod'\n\nexport const SourceAnchorSchema = z.object({\n id: z.string().min(1),\n sourceId: z.string().min(1),\n label: z.string().optional(),\n page: z.number().int().positive().optional(),\n lineStart: z.number().int().positive().optional(),\n lineEnd: z.number().int().positive().optional(),\n charStart: z.number().int().nonnegative().optional(),\n charEnd: z.number().int().nonnegative().optional(),\n timestampMs: z.number().nonnegative().optional(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n})\n\nexport const SourceRecordSchema = z.object({\n id: z.string().min(1),\n uri: z.string().min(1),\n title: z.string().optional(),\n mediaType: z.string().optional(),\n contentHash: z.string().min(16),\n text: z.string().optional(),\n anchors: z.array(SourceAnchorSchema).optional(),\n validUntil: z.iso.datetime().optional(),\n lastVerifiedAt: z.iso.datetime().optional(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n createdAt: z.string().min(1),\n})\n\nexport const KnowledgePageSchema = z.object({\n id: z.string().min(1),\n path: z.string().min(1),\n title: z.string().min(1),\n text: z.string(),\n frontmatter: z.record(z.string(), z.unknown()),\n sourceIds: z.array(z.string()),\n tags: z.array(z.string()),\n outLinks: z.array(z.string()),\n})\n\nexport const KnowledgeGraphNodeSchema = z.object({\n id: z.string(),\n title: z.string(),\n path: z.string(),\n tags: z.array(z.string()),\n sourceIds: z.array(z.string()),\n outDegree: z.number().int().nonnegative(),\n inDegree: z.number().int().nonnegative(),\n})\n\nexport const KnowledgeGraphEdgeSchema = z.object({\n source: z.string(),\n target: z.string(),\n weight: z.number(),\n reasons: z.array(z.string()),\n})\n\nexport const KnowledgeIndexSchema = z.object({\n root: z.string(),\n generatedAt: z.string(),\n sources: z.array(SourceRecordSchema),\n pages: z.array(KnowledgePageSchema),\n graph: z.object({\n nodes: z.array(KnowledgeGraphNodeSchema),\n edges: z.array(KnowledgeGraphEdgeSchema),\n }),\n})\n\nexport const KnowledgeEventSchema = z.object({\n id: z.string().min(1),\n type: z.enum([\n 'source.added',\n 'proposal.applied',\n 'index.built',\n 'lint.run',\n 'optimization.run',\n 'release.promoted',\n 'release.rejected',\n ]),\n createdAt: z.string().min(1),\n actor: z.string().optional(),\n target: z.string().optional(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n})\n\nexport const KnowledgeBaseCandidateSchema = z.object({\n id: z.string().min(1),\n units: z.array(\n z.object({\n id: z.string().min(1),\n title: z.string().min(1),\n text: z.string(),\n claims: z\n .array(\n z.object({\n id: z.string().min(1),\n text: z.string().min(1),\n refs: z.array(\n z.object({\n sourceId: z.string().min(1),\n anchorId: z.string().optional(),\n quote: z.string().optional(),\n }),\n ),\n confidence: z.number().min(0).max(1).optional(),\n status: z.enum(['draft', 'active', 'superseded', 'rejected']).optional(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n }),\n )\n .optional(),\n relations: z\n .array(\n z.object({\n sourceId: z.string(),\n targetId: z.string(),\n predicate: z.string(),\n weight: z.number().optional(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n }),\n )\n .optional(),\n sourceIds: z.array(z.string()).optional(),\n tags: z.array(z.string()).optional(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n updatedAt: z.string().optional(),\n }),\n ),\n retrievalPolicy: z.string().optional(),\n synthesisPolicy: z.string().optional(),\n questionPolicy: z.string().optional(),\n updatePolicy: z.string().optional(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n})\n","export interface ParsedFrontmatter {\n frontmatter: Record<string, unknown>\n body: string\n}\n\nexport function parseFrontmatter(content: string): ParsedFrontmatter {\n const normalized = content.replace(/\\r\\n/g, '\\n')\n if (!normalized.startsWith('---\\n')) return { frontmatter: {}, body: normalized }\n const end = normalized.indexOf('\\n---', 4)\n if (end < 0) return { frontmatter: {}, body: normalized }\n const raw = normalized.slice(4, end)\n const after = normalized.slice(end).replace(/^\\n---\\s*\\n?/, '')\n return { frontmatter: parseSimpleYaml(raw), body: after }\n}\n\nexport function formatFrontmatter(frontmatter: Record<string, unknown>, body: string): string {\n const lines = Object.entries(frontmatter)\n .filter(([, value]) => value !== undefined)\n .flatMap(([key, value]) => formatYamlField(key, value))\n if (lines.length === 0) return body\n return `---\\n${lines.join('\\n')}\\n---\\n${body.replace(/^\\n+/, '')}`\n}\n\nfunction parseSimpleYaml(raw: string): Record<string, unknown> {\n const out: Record<string, unknown> = {}\n const lines = raw.split('\\n')\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]!\n const scalar = /^([A-Za-z0-9_-]+):\\s*(.*)$/.exec(line)\n if (!scalar) continue\n const key = scalar[1]!\n const rest = scalar[2]!.trim()\n if (rest === '') {\n const items: string[] = []\n while (i + 1 < lines.length) {\n const item = /^\\s*-\\s*(.+?)\\s*$/.exec(lines[i + 1]!)\n if (!item) break\n items.push(unquote(item[1]!))\n i++\n }\n out[key] = items\n continue\n }\n if (rest.startsWith('[') && rest.endsWith(']')) {\n out[key] = rest\n .slice(1, -1)\n .split(',')\n .map((part) => unquote(part.trim()))\n .filter(Boolean)\n } else if (rest === 'true' || rest === 'false') {\n out[key] = rest === 'true'\n } else if (/^-?\\d+(?:\\.\\d+)?$/.test(rest)) {\n out[key] = Number(rest)\n } else {\n out[key] = unquote(rest)\n }\n }\n return out\n}\n\nfunction formatYamlField(key: string, value: unknown): string[] {\n if (Array.isArray(value)) {\n return [`${key}:`, ...value.map((item) => ` - ${String(item)}`)]\n }\n if (typeof value === 'string') return [`${key}: ${value}`]\n if (typeof value === 'number' || typeof value === 'boolean') return [`${key}: ${String(value)}`]\n return [`${key}: ${JSON.stringify(value)}`]\n}\n\nfunction unquote(value: string): string {\n return value.replace(/^['\"]|['\"]$/g, '')\n}\n","import { join } from 'node:path'\nimport {\n isMissingFile,\n listRegularFilesWithinRoot,\n readRegularFileWithinRoot,\n withSafeDirectory,\n writeFileDurableWithinRoot,\n writeJsonDurable,\n} from './durable-fs'\nimport { parseFrontmatter } from './frontmatter'\nimport { slugify } from './ids'\nimport { withKnowledgeMutation, withKnowledgeRead } from './mutation-lock'\nimport type { KnowledgePage } from './types'\nimport { extractWikilinks, normalizeLinkTarget } from './wikilinks'\n\nexport interface KnowledgeLayout {\n root: string\n knowledgeDir: string\n rawSourcesDir: string\n sourceRegistryPath: string\n indexPath: string\n logPath: string\n cacheDir: string\n}\n\nexport function layoutFor(root: string): KnowledgeLayout {\n return {\n root,\n knowledgeDir: join(root, 'knowledge'),\n rawSourcesDir: join(root, 'raw', 'sources'),\n sourceRegistryPath: join(root, '.agent-knowledge', 'sources.json'),\n indexPath: join(root, 'knowledge', 'index.md'),\n logPath: join(root, 'knowledge', 'log.md'),\n cacheDir: join(root, '.agent-knowledge'),\n }\n}\n\n/**\n * Filenames that `initKnowledgeBase` writes as human-navigation scaffolding.\n * These are excluded from the page index — they exist on disk so authors can\n * curate their vault, but they are not searchable content.\n *\n * Add new scaffold filenames here (and only here) to keep lint, validate, viz,\n * and the indexer consistent.\n */\nexport const SCAFFOLD_PAGE_BASENAMES: readonly string[] = ['index.md', 'log.md']\n\n/**\n * True when a knowledge-relative path points at a scaffold file rather than\n * authored content. Accepts both repo-relative paths (`knowledge/index.md`)\n * and any nested `<dir>/index.md` or `<dir>/log.md` (for example\n * `knowledge/concepts/index.md`) so subdirectory README-style scaffolds are\n * also excluded.\n */\nexport function isScaffoldPath(path: string): boolean {\n const normalized = path.replace(/\\\\/g, '/')\n for (const basename of SCAFFOLD_PAGE_BASENAMES) {\n if (normalized === `knowledge/${basename}`) return true\n if (normalized.endsWith(`/${basename}`)) return true\n }\n return false\n}\n\nexport async function initKnowledgeBase(root: string): Promise<KnowledgeLayout> {\n const layout = layoutFor(root)\n if (await knowledgeBaseInitialized(layout)) return layout\n return withKnowledgeMutation(root, () => initKnowledgeBaseUnlocked(root))\n}\n\nasync function initKnowledgeBaseUnlocked(root: string): Promise<KnowledgeLayout> {\n const layout = layoutFor(root)\n await withSafeDirectory(root, 'knowledge', true, () => undefined)\n await withSafeDirectory(root, 'raw/sources', true, () => undefined)\n await withSafeDirectory(root, '.agent-knowledge', true, () => undefined)\n await writeIfMissing(root, 'knowledge/index.md', '# Knowledge Index\\n\\n')\n await writeIfMissing(root, 'knowledge/log.md', '# Knowledge Log\\n\\n')\n await writeIfMissing(\n root,\n '.agent-knowledge/sources.json',\n '{\\n \"generatedAt\": \"1970-01-01T00:00:00.000Z\",\\n \"sources\": []\\n}\\n',\n )\n return layout\n}\n\nexport async function loadKnowledgePages(root: string): Promise<KnowledgePage[]> {\n return withKnowledgeRead(root, () => loadKnowledgePagesUnlocked(root))\n}\n\nasync function loadKnowledgePagesUnlocked(root: string): Promise<KnowledgePage[]> {\n let files: Awaited<ReturnType<typeof listRegularFilesWithinRoot>>\n try {\n files = await listRegularFilesWithinRoot(root, 'knowledge')\n } catch (error) {\n if (isMissingFile(error)) return []\n throw error\n }\n const pages: KnowledgePage[] = []\n for (const file of files) {\n const rel = file.path\n if (!rel.endsWith('.md')) continue\n if (isScaffoldPath(rel)) continue\n const content = file.bytes.toString('utf8')\n const { frontmatter, body } = parseFrontmatter(content)\n const title =\n stringField(frontmatter.title) ??\n firstHeading(body) ??\n rel.split('/').pop()!.replace(/\\.md$/, '')\n const sourceIds = arrayField(frontmatter.sources)\n const tags = arrayField(frontmatter.tags)\n pages.push({\n id:\n stringField(frontmatter.id) ??\n slugify(rel.replace(/^knowledge\\//, '').replace(/\\.md$/, '')),\n path: rel,\n title,\n text: body,\n frontmatter,\n sourceIds,\n tags,\n outLinks: extractWikilinks(body).map(normalizeLinkTarget),\n })\n }\n pages.sort((a, b) => a.path.localeCompare(b.path))\n return pages\n}\n\nexport async function writeJson(path: string, value: unknown): Promise<void> {\n await writeJsonDurable(path, value)\n}\n\nasync function writeIfMissing(root: string, relativePath: string, content: string): Promise<void> {\n try {\n await readRegularFileWithinRoot(root, relativePath)\n } catch (error) {\n if (!isMissingFile(error)) throw error\n await writeFileDurableWithinRoot(root, relativePath, content, { encoding: 'utf8' })\n }\n}\n\nasync function knowledgeBaseInitialized(layout: KnowledgeLayout): Promise<boolean> {\n try {\n await withSafeDirectory(layout.root, 'knowledge', false, () => undefined)\n await withSafeDirectory(layout.root, 'raw/sources', false, () => undefined)\n await withSafeDirectory(layout.root, '.agent-knowledge', false, () => undefined)\n await readRegularFileWithinRoot(layout.root, 'knowledge/index.md')\n await readRegularFileWithinRoot(layout.root, 'knowledge/log.md')\n await readRegularFileWithinRoot(layout.root, '.agent-knowledge/sources.json')\n return true\n } catch (error) {\n if (isMissingFile(error)) return false\n throw error\n }\n}\n\nfunction stringField(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim() !== '' ? value.trim() : undefined\n}\n\nfunction arrayField(value: unknown): string[] {\n return Array.isArray(value)\n ? value.filter((item): item is string => typeof item === 'string')\n : []\n}\n\nfunction firstHeading(body: string): string | undefined {\n return /^#\\s+(.+)$/m.exec(body)?.[1]?.trim()\n}\n","import { lstat, readdir, readFile } from 'node:fs/promises'\nimport { basename, join, relative } from 'node:path'\nimport { z } from 'zod'\nimport { type SourceAdapter, textSourceAdapter } from './adapters'\nimport { readRegularFileWithinRoot, writeJsonDurableWithinRoot } from './durable-fs'\nimport { commitKnowledgeFileMutations, type KnowledgeFileMutation } from './file-transaction'\nimport { sha256, slugify, stableId } from './ids'\nimport { withKnowledgeMutation, withKnowledgeRead } from './mutation-lock'\nimport { SourceRecordSchema } from './schemas'\nimport { layoutFor } from './store'\nimport type { SourceRecord, SourceRegistry } from './types'\n\nconst sourceRegistrySchema = z\n .object({\n generatedAt: z.string().min(1),\n sources: z.array(SourceRecordSchema.passthrough()),\n })\n .strict()\n\nexport interface AddSourceOptions {\n copyIntoRaw?: boolean\n adapters?: SourceAdapter[]\n now?: () => Date\n}\n\nexport interface AddSourceTextInput {\n uri: string\n text: string\n title?: string\n mediaType?: string\n validUntil?: string\n lastVerifiedAt?: string\n metadata?: Record<string, unknown>\n}\n\nexport async function loadSourceRegistry(root: string): Promise<SourceRegistry> {\n return withKnowledgeRead(root, () => loadSourceRegistryUnlocked(root))\n}\n\nasync function loadSourceRegistryUnlocked(root: string): Promise<SourceRegistry> {\n try {\n const file = await readRegularFileWithinRoot(root, '.agent-knowledge/sources.json')\n return sourceRegistrySchema.parse(JSON.parse(file.bytes.toString('utf8'))) as SourceRegistry\n } catch (error) {\n if ((error as NodeJS.ErrnoException | null)?.code === 'ENOENT') {\n return { generatedAt: new Date(0).toISOString(), sources: [] }\n }\n throw error\n }\n}\n\nexport async function writeSourceRegistry(root: string, registry: SourceRegistry): Promise<void> {\n await withKnowledgeMutation(root, async () => {\n await writeJsonDurableWithinRoot(\n root,\n '.agent-knowledge/sources.json',\n sourceRegistrySchema.parse(registry),\n )\n })\n}\n\nexport async function addSourcePath(\n root: string,\n sourcePath: string,\n options: AddSourceOptions = {},\n): Promise<SourceRecord[]> {\n const sourceStat = await lstat(sourcePath)\n if (sourceStat.isDirectory()) {\n const files = await listSourceFiles(sourcePath)\n const prepared = await Promise.all(\n files.map((file) => preparePathSource(root, file.path, file.mode, options)),\n )\n return commitSourceBatch(root, prepared, options)\n }\n if (!sourceStat.isFile()) throw new Error(`unsupported source path: ${sourcePath}`)\n\n return commitSourceBatch(\n root,\n [await preparePathSource(root, sourcePath, sourceStat.mode & 0o777, options)],\n options,\n )\n}\n\nasync function preparePathSource(\n root: string,\n sourcePath: string,\n mode: number,\n options: AddSourceOptions,\n): Promise<PreparedSourceImport> {\n const bytes = await readFile(sourcePath)\n const contentHash = sha256(bytes.toString('base64'))\n const fileName = basename(sourcePath)\n const adapters = options.adapters ?? [textSourceAdapter]\n const adapter = adapters.find((candidate) => candidate.canLoad({ uri: sourcePath, bytes }))\n const loaded = adapter ? await adapter.load({ uri: sourcePath, bytes }) : {}\n const id = stableId('src', `${contentHash}:${fileName}`)\n const targetRel = rawSourcePath(fileName, contentHash, ext(fileName))\n const copyIntoRaw = options.copyIntoRaw ?? true\n\n return {\n record: {\n id,\n uri: copyIntoRaw ? targetRel : sourcePath,\n title: loaded.title ?? fileName,\n mediaType: loaded.mediaType ?? mediaTypeFor(fileName),\n contentHash,\n text: loaded.text ?? textPreview(fileName, bytes),\n anchors: (loaded.anchors ?? []).map((anchor) => ({ ...anchor, sourceId: id })),\n createdAt: (options.now ?? (() => new Date()))().toISOString(),\n metadata: {\n ...(loaded.metadata ?? {}),\n originalPath: sourcePath,\n sizeBytes: bytes.length,\n projectRelativePath: relative(root, sourcePath).replace(/\\\\/g, '/'),\n },\n },\n mutation: copyIntoRaw ? { path: targetRel, content: bytes, mode } : null,\n purposeParts: [sourcePath, contentHash, copyIntoRaw, mode],\n }\n}\n\nexport async function addSourceText(\n root: string,\n input: AddSourceTextInput,\n options: Pick<AddSourceOptions, 'adapters' | 'now'> = {},\n): Promise<SourceRecord> {\n const [record] = await commitSourceBatch(root, [await prepareTextSource(input, options)], options)\n return record!\n}\n\nasync function prepareTextSource(\n input: AddSourceTextInput,\n options: Pick<AddSourceOptions, 'adapters' | 'now'>,\n): Promise<PreparedSourceImport> {\n const text = input.text\n const contentHash = sha256(text)\n const fileName = basename(input.uri) || `${slugify(input.title ?? input.uri)}.txt`\n const adapterInput = { uri: input.uri, text, metadata: input.metadata }\n const adapter = (options.adapters ?? [textSourceAdapter]).find((candidate) =>\n candidate.canLoad(adapterInput),\n )\n const loaded = adapter ? await adapter.load(adapterInput) : {}\n const id = stableId('src', `${contentHash}:${input.uri}`)\n const targetRel = rawSourcePath(fileName, contentHash, '.txt')\n const rawContent = text.endsWith('\\n') ? text : `${text}\\n`\n\n return {\n record: {\n id,\n uri: targetRel,\n title: input.title ?? loaded.title ?? fileName,\n mediaType: input.mediaType ?? loaded.mediaType ?? 'text/plain',\n contentHash,\n text: loaded.text ?? text.slice(0, 200_000),\n anchors: (loaded.anchors ?? []).map((anchor) => ({ ...anchor, sourceId: id })),\n ...(input.validUntil === undefined ? {} : { validUntil: input.validUntil }),\n ...(input.lastVerifiedAt === undefined ? {} : { lastVerifiedAt: input.lastVerifiedAt }),\n createdAt: (options.now ?? (() => new Date()))().toISOString(),\n metadata: {\n ...(loaded.metadata ?? {}),\n ...(input.metadata ?? {}),\n originalUri: input.uri,\n sizeBytes: Buffer.byteLength(text, 'utf8'),\n },\n },\n mutation: { path: targetRel, content: rawContent },\n purposeParts: [input.uri, contentHash],\n }\n}\n\ninterface PreparedSourceImport {\n record: SourceRecord\n mutation: KnowledgeFileMutation | null\n purposeParts: readonly unknown[]\n}\n\nasync function commitSourceBatch(\n root: string,\n prepared: readonly PreparedSourceImport[],\n options: Pick<AddSourceOptions, 'now'>,\n): Promise<SourceRecord[]> {\n if (prepared.length === 0) return []\n const purpose = `source-import:${sha256(JSON.stringify(prepared.map((item) => item.purposeParts)))}`\n return withKnowledgeMutation(\n root,\n async (lock) => {\n const existing = await loadSourceRegistry(root)\n const records = uniqueSources(prepared.map((item) => item.record))\n const next = sourceRegistrySchema.parse({\n generatedAt: (options.now ?? (() => new Date()))().toISOString(),\n sources: [\n ...records,\n ...existing.sources.filter(\n (source) => !records.some((record) => record.id === source.id),\n ),\n ],\n }) as SourceRegistry\n await commitKnowledgeFileMutations({\n root,\n transactionRoot: lock.transactionRoot,\n purpose,\n mutations: [\n ...uniqueMutations(prepared.flatMap((item) => (item.mutation ? [item.mutation] : []))),\n {\n path: relative(root, sourceRegistryPath(root)).replace(/\\\\/g, '/'),\n content: `${JSON.stringify(next, null, 2)}\\n`,\n },\n ],\n assertOwned: lock.assertOwned,\n })\n return records\n },\n { resumeTransaction: { purpose } },\n )\n}\n\nexport function sourceRegistryPath(root: string): string {\n return join(layoutFor(root).cacheDir, 'sources.json')\n}\n\nfunction uniqueSources(records: readonly SourceRecord[]): SourceRecord[] {\n const byId = new Map<string, SourceRecord>()\n for (const record of records) byId.set(record.id, record)\n return [...byId.values()]\n}\n\nfunction uniqueMutations(mutations: readonly KnowledgeFileMutation[]): KnowledgeFileMutation[] {\n const byPath = new Map<string, KnowledgeFileMutation>()\n for (const mutation of mutations) {\n const existing = byPath.get(mutation.path)\n if (existing && !sameMutation(existing, mutation)) {\n throw new Error(`source import produced conflicting raw path: ${mutation.path}`)\n }\n byPath.set(mutation.path, mutation)\n }\n return [...byPath.values()]\n}\n\nfunction sameMutation(left: KnowledgeFileMutation, right: KnowledgeFileMutation): boolean {\n if (left.mode !== right.mode) return false\n if (Buffer.isBuffer(left.content) && Buffer.isBuffer(right.content)) {\n return left.content.equals(right.content)\n }\n return left.content === right.content\n}\n\nasync function listSourceFiles(root: string): Promise<Array<{ path: string; mode: number }>> {\n const entries = await readdir(root, { withFileTypes: true })\n const out: Array<{ path: string; mode: number }> = []\n for (const entry of entries) {\n const full = join(root, entry.name)\n const entryStat = await lstat(full)\n if (entryStat.isDirectory()) out.push(...(await listSourceFiles(full)))\n else if (entryStat.isFile()) out.push({ path: full, mode: entryStat.mode & 0o777 })\n else throw new Error(`unsupported directory entry in source import: ${full}`)\n }\n return out\n}\n\nfunction rawSourcePath(fileName: string, contentHash: string, extension: string): string {\n return join(\n 'raw',\n 'sources',\n `${slugify(fileName.replace(/\\.[^.]+$/, ''))}-${contentHash.slice(0, 8)}${extension}`,\n ).replace(/\\\\/g, '/')\n}\n\nfunction ext(fileName: string): string {\n const idx = fileName.lastIndexOf('.')\n return idx >= 0 ? fileName.slice(idx) : ''\n}\n\nfunction mediaTypeFor(fileName: string): string {\n const lower = fileName.toLowerCase()\n if (lower.endsWith('.md')) return 'text/markdown'\n if (lower.endsWith('.txt')) return 'text/plain'\n if (lower.endsWith('.json')) return 'application/json'\n if (lower.endsWith('.csv')) return 'text/csv'\n if (lower.endsWith('.pdf')) return 'application/pdf'\n return 'application/octet-stream'\n}\n\nfunction textPreview(fileName: string, bytes: Buffer): string | undefined {\n const mediaType = mediaTypeFor(fileName)\n if (!mediaType.startsWith('text/') && mediaType !== 'application/json') return undefined\n return bytes.toString('utf8').slice(0, 200_000)\n}\n","import { writeJsonDurableWithinRoot } from './durable-fs'\nimport { buildKnowledgeGraph } from './graph'\nimport { withKnowledgeMutation, withKnowledgeRead } from './mutation-lock'\nimport { loadSourceRegistry } from './sources'\nimport { loadKnowledgePages } from './store'\nimport type { KnowledgeIndex } from './types'\n\nexport async function buildKnowledgeIndex(root: string): Promise<KnowledgeIndex> {\n return withKnowledgeRead(root, () => buildKnowledgeIndexUnlocked(root))\n}\n\nasync function buildKnowledgeIndexUnlocked(root: string): Promise<KnowledgeIndex> {\n const [pages, sourceRegistry] = await Promise.all([\n loadKnowledgePages(root),\n loadSourceRegistry(root),\n ])\n const index: KnowledgeIndex = {\n root,\n generatedAt: new Date().toISOString(),\n sources: sourceRegistry.sources,\n pages,\n graph: buildKnowledgeGraph(pages),\n }\n return index\n}\n\nexport async function writeKnowledgeIndex(root: string): Promise<KnowledgeIndex> {\n return withKnowledgeMutation(root, async () => {\n const index = await buildKnowledgeIndexUnlocked(root)\n await writeJsonDurableWithinRoot(root, '.agent-knowledge/index.json', index)\n return index\n })\n}\n","import { isScaffoldPath } from './store'\nimport type { KnowledgeIndex, KnowledgeLintFinding } from './types'\nimport { normalizeLinkTarget } from './wikilinks'\n\nexport function lintKnowledgeIndex(index: KnowledgeIndex): KnowledgeLintFinding[] {\n const findings: KnowledgeLintFinding[] = []\n const byTarget = new Set<string>()\n const titles = new Map<string, string[]>()\n const sourceIds = new Set(index.sources.map((source) => source.id))\n const anchorIds = new Map(\n index.sources.map((source) => [\n source.id,\n new Set((source.anchors ?? []).map((anchor) => anchor.id)),\n ]),\n )\n const pageIds = new Map<string, string[]>()\n const sourceHashes = new Map<string, string[]>()\n for (const page of index.pages) {\n pageIds.set(page.id, [...(pageIds.get(page.id) ?? []), page.path])\n byTarget.add(normalizeLinkTarget(page.id))\n byTarget.add(normalizeLinkTarget(page.title))\n byTarget.add(normalizeLinkTarget(page.path.split('/').pop()!.replace(/\\.md$/, '')))\n const titleKey = page.title.toLowerCase()\n titles.set(titleKey, [...(titles.get(titleKey) ?? []), page.path])\n }\n for (const source of index.sources) {\n sourceHashes.set(source.contentHash, [\n ...(sourceHashes.get(source.contentHash) ?? []),\n source.id,\n ])\n }\n\n const inbound = new Map<string, number>()\n for (const page of index.pages) inbound.set(page.id, 0)\n for (const page of index.pages) {\n if (page.outLinks.length === 0 && !isScaffoldPath(page.path)) {\n findings.push({\n type: 'no-outlinks',\n severity: 'info',\n page: page.path,\n message: 'Page has no wikilinks to other knowledge pages.',\n })\n }\n for (const link of page.outLinks) {\n if (!byTarget.has(normalizeLinkTarget(link))) {\n findings.push({\n type: 'broken-link',\n severity: 'warning',\n page: page.path,\n message: `Broken wikilink [[${link}]].`,\n })\n }\n }\n }\n\n for (const edge of index.graph.edges)\n inbound.set(edge.target, (inbound.get(edge.target) ?? 0) + 1)\n for (const page of index.pages) {\n if (!isScaffoldPath(page.path) && (inbound.get(page.id) ?? 0) === 0) {\n findings.push({\n type: 'orphan',\n severity: 'info',\n page: page.path,\n message: 'No other page links to this page.',\n })\n }\n if (/\\bclaim\\b/i.test(page.text) && page.sourceIds.length === 0) {\n findings.push({\n type: 'uncited-claim',\n severity: 'warning',\n page: page.path,\n message: 'Page appears to contain claims but has no sources frontmatter.',\n })\n }\n for (const sourceId of page.sourceIds) {\n if (!sourceIds.has(sourceId)) {\n findings.push({\n type: 'missing-source',\n severity: 'error',\n page: page.path,\n message: `Page cites unknown source \"${sourceId}\".`,\n metadata: { sourceId },\n })\n }\n }\n for (const ref of extractSourceRefs(page.text)) {\n if (!sourceIds.has(ref.sourceId)) {\n findings.push({\n type: 'missing-source',\n severity: 'error',\n page: page.path,\n message: `Page cites unknown source \"${ref.sourceId}\".`,\n metadata: ref,\n })\n } else if (ref.anchorId && !anchorIds.get(ref.sourceId)?.has(ref.anchorId)) {\n findings.push({\n type: 'missing-source',\n severity: 'error',\n page: page.path,\n message: `Page cites unknown source anchor \"${ref.sourceId}#${ref.anchorId}\".`,\n metadata: ref,\n })\n }\n }\n }\n\n for (const [title, paths] of titles) {\n if (title && paths.length > 1) {\n findings.push({\n type: 'duplicate-title',\n severity: 'warning',\n message: `Duplicate title \"${title}\" in ${paths.join(', ')}.`,\n metadata: { paths },\n })\n }\n }\n for (const [id, paths] of pageIds) {\n if (id && paths.length > 1) {\n findings.push({\n type: 'duplicate-page-id',\n severity: 'error',\n message: `Duplicate page id \"${id}\" in ${paths.join(', ')}.`,\n metadata: { paths },\n })\n }\n }\n for (const [hash, ids] of sourceHashes) {\n if (hash && ids.length > 1) {\n findings.push({\n type: 'duplicate-source-hash',\n severity: 'warning',\n message: `Duplicate source content hash across ${ids.join(', ')}.`,\n metadata: { sourceIds: ids },\n })\n }\n }\n return findings\n}\n\nfunction extractSourceRefs(text: string): Array<{ sourceId: string; anchorId?: string }> {\n const refs: Array<{ sourceId: string; anchorId?: string }> = []\n const regex = /\\[\\^([A-Za-z0-9_-]+)(?:#([A-Za-z0-9_.:-]+))?\\]/g\n let match: RegExpExecArray | null\n match = regex.exec(text)\n while (match !== null) {\n refs.push({ sourceId: match[1]!, anchorId: match[2] })\n match = regex.exec(text)\n }\n return refs\n}\n","import { lintKnowledgeIndex } from './lint'\nimport { KnowledgeIndexSchema } from './schemas'\nimport { isScaffoldPath } from './store'\nimport type { KnowledgeIndex, KnowledgeLintFinding } from './types'\n\nexport interface ValidateKnowledgeOptions {\n strict?: boolean\n}\n\nexport interface ValidateKnowledgeResult {\n ok: boolean\n findings: KnowledgeLintFinding[]\n}\n\nexport function validateKnowledgeIndex(\n index: KnowledgeIndex,\n options: ValidateKnowledgeOptions = {},\n): ValidateKnowledgeResult {\n const findings = [...lintKnowledgeIndex(index)]\n const parsed = KnowledgeIndexSchema.safeParse(index)\n if (!parsed.success) {\n findings.push({\n type: 'missing-frontmatter',\n severity: 'error',\n message: parsed.error.issues\n .map((issue) => `${issue.path.join('.')}: ${issue.message}`)\n .join('; '),\n })\n }\n if (options.strict) {\n for (const page of index.pages) {\n if (isScaffoldPath(page.path)) continue\n if (!page.frontmatter.id || !page.frontmatter.title) {\n findings.push({\n type: 'missing-frontmatter',\n severity: 'error',\n page: page.path,\n message: 'Strict mode requires id and title frontmatter.',\n })\n }\n }\n }\n return { ok: !findings.some((finding) => finding.severity === 'error'), findings }\n}\n","import type { KnowledgeWriteParseResult } from './types'\n\nconst OPENER_LINE = /^---\\s*FILE:\\s*(.+?)\\s*---\\s*$/i\nconst CLOSER_LINE = /^---\\s*END\\s+FILE\\s*---\\s*$/i\nconst FENCE_LINE = /^\\s{0,3}(```+|~~~+)/\n\nexport function isSafeKnowledgePath(path: string, allowedPrefixes = ['knowledge/']): boolean {\n if (typeof path !== 'string' || path.trim() === '') return false\n // Path-safety validation must reject any control character that could be used\n // in path-traversal / encoding attacks. Built via String.fromCharCode rather\n // than inline `\\xNN` escapes to keep biome's regex-control-char rule happy.\n const controlRangeRegex = new RegExp(`[${String.fromCharCode(0)}-${String.fromCharCode(0x1f)}]`)\n if (controlRangeRegex.test(path)) return false\n if (path.startsWith('/') || path.startsWith('\\\\')) return false\n if (/^[a-zA-Z]:/.test(path)) return false\n const normalized = path.replace(/\\\\/g, '/')\n if (normalized.split('/').some((part) => part === '..')) return false\n return allowedPrefixes.some((prefix) => normalized.startsWith(prefix))\n}\n\nexport function parseKnowledgeWriteBlocks(\n text: string,\n allowedPrefixes = ['knowledge/'],\n): KnowledgeWriteParseResult {\n const lines = text.replace(/\\r\\n/g, '\\n').split('\\n')\n const blocks: KnowledgeWriteParseResult['blocks'] = []\n const warnings: string[] = []\n let i = 0\n\n while (i < lines.length) {\n const opener = OPENER_LINE.exec(lines[i]!)\n if (!opener) {\n i++\n continue\n }\n const path = opener[1]!.trim()\n i++\n const contentLines: string[] = []\n let fenceMarker: string | null = null\n let fenceLen = 0\n let closed = false\n\n while (i < lines.length) {\n const line = lines[i]!\n const fence = FENCE_LINE.exec(line)\n if (fence) {\n const run = fence[1]!\n const char = run[0]!\n if (fenceMarker === null) {\n fenceMarker = char\n fenceLen = run.length\n } else if (char === fenceMarker && run.length >= fenceLen) {\n fenceMarker = null\n fenceLen = 0\n }\n contentLines.push(line)\n i++\n continue\n }\n if (fenceMarker === null && CLOSER_LINE.test(line)) {\n closed = true\n i++\n break\n }\n contentLines.push(line)\n i++\n }\n\n if (!closed) {\n warnings.push(`FILE block \"${path || '(empty)'}\" was not closed before end of stream.`)\n continue\n }\n if (!isSafeKnowledgePath(path, allowedPrefixes)) {\n warnings.push(`FILE block with unsafe path \"${path}\" rejected.`)\n continue\n }\n blocks.push({ path, content: contentLines.join('\\n') })\n }\n\n return { blocks, warnings }\n}\n","import { readFile } from 'node:fs/promises'\nimport { contentHash } from '@tangle-network/agent-eval'\nimport { commitKnowledgeFileMutations } from './file-transaction'\nimport { withKnowledgeMutation } from './mutation-lock'\nimport { parseKnowledgeWriteBlocks } from './write-protocol'\n\nexport interface ApplyWriteBlocksResult {\n written: string[]\n warnings: string[]\n}\n\nexport async function applyKnowledgeWriteBlocks(\n root: string,\n proposalText: string,\n): Promise<ApplyWriteBlocksResult> {\n const parsed = parseKnowledgeWriteBlocks(proposalText)\n const purpose = `knowledge-proposal:${contentHash(parsed.blocks)}`\n return withKnowledgeMutation(\n root,\n async (lock) => {\n if (parsed.blocks.length > 0) {\n await commitKnowledgeFileMutations({\n root,\n transactionRoot: lock.transactionRoot,\n purpose,\n mutations: parsed.blocks.map((block) => ({\n path: block.path,\n content: block.content.endsWith('\\n') ? block.content : `${block.content}\\n`,\n })),\n assertOwned: lock.assertOwned,\n })\n }\n return { written: parsed.blocks.map((block) => block.path), warnings: parsed.warnings }\n },\n { resumeTransaction: { purpose } },\n )\n}\n\nexport async function applyKnowledgeWriteBlocksFile(\n root: string,\n proposalPath: string,\n): Promise<ApplyWriteBlocksResult> {\n return applyKnowledgeWriteBlocks(root, await readFile(proposalPath, 'utf8'))\n}\n","/**\n * Read a string value from an optional metadata bag, returning `undefined`\n * when the key is absent or holds a non-string value. Shared by the readiness\n * and inspection paths so the \"string field of an untyped record\" coercion is\n * single-sourced.\n *\n * Internal — not re-exported through the package barrel.\n */\nexport function stringMetadata(\n metadata: Record<string, unknown> | undefined,\n key: string,\n): string | undefined {\n const value = metadata?.[key]\n return typeof value === 'string' ? value : undefined\n}\n","import { lintKnowledgeIndex } from './lint'\nimport { stringMetadata } from './metadata'\nimport { searchKnowledge } from './search'\nimport type { KnowledgeIndex, KnowledgeLintFinding, KnowledgePage } from './types'\n\nexport interface KnowledgeInspection {\n pageCount: number\n sourceCount: number\n expiredSourceCount: number\n staleSourceCount: number\n edgeCount: number\n findingCount: number\n blockingFindingCount: number\n topPages: Array<{ path: string; title: string; degree: number; sources: number }>\n sourceFreshness: SourceFreshnessInspection[]\n findings: KnowledgeLintFinding[]\n}\n\nexport interface SourceFreshnessInspection {\n id: string\n title?: string\n uri: string\n status: 'fresh' | 'expired' | 'unknown'\n validUntil?: string\n lastVerifiedAt?: string\n}\n\nexport function inspectKnowledgeIndex(\n index: KnowledgeIndex,\n options: { now?: Date } = {},\n): KnowledgeInspection {\n const now = options.now ?? new Date()\n const findings = lintKnowledgeIndex(index)\n const degree = new Map(index.graph.nodes.map((node) => [node.id, node.inDegree + node.outDegree]))\n const sourceFreshness = index.sources.map((source) => inspectSourceFreshness(source, now))\n return {\n pageCount: index.pages.length,\n sourceCount: index.sources.length,\n expiredSourceCount: sourceFreshness.filter((source) => source.status === 'expired').length,\n staleSourceCount: sourceFreshness.filter((source) => source.status !== 'fresh').length,\n edgeCount: index.graph.edges.length,\n findingCount: findings.length,\n blockingFindingCount: findings.filter((finding) => finding.severity === 'error').length,\n topPages: [...index.pages]\n .sort((a, b) => (degree.get(b.id) ?? 0) - (degree.get(a.id) ?? 0))\n .slice(0, 10)\n .map((page) => ({\n path: page.path,\n title: page.title,\n degree: degree.get(page.id) ?? 0,\n sources: page.sourceIds.length,\n })),\n sourceFreshness,\n findings,\n }\n}\n\nfunction inspectSourceFreshness(\n source: KnowledgeIndex['sources'][number],\n now: Date,\n): SourceFreshnessInspection {\n const validUntil =\n source.validUntil ??\n stringMetadata(source.metadata, 'validUntil') ??\n stringMetadata(source.metadata, 'expiresAt')\n const lastVerifiedAt = source.lastVerifiedAt ?? stringMetadata(source.metadata, 'lastVerifiedAt')\n const status =\n validUntil && Number.isFinite(Date.parse(validUntil))\n ? Date.parse(validUntil) <= now.getTime()\n ? 'expired'\n : 'fresh'\n : 'unknown'\n return { id: source.id, title: source.title, uri: source.uri, status, validUntil, lastVerifiedAt }\n}\n\nexport interface KnowledgeExplanation {\n target: string\n page?: KnowledgePage\n sources: Array<{ id: string; title?: string; uri: string }>\n links: string[]\n inbound: string[]\n related: Array<{ path: string; title: string; score: number }>\n}\n\nexport function explainKnowledgeTarget(\n index: KnowledgeIndex,\n target: string,\n): KnowledgeExplanation {\n const page = index.pages.find(\n (candidate) =>\n candidate.path === target ||\n candidate.id === target ||\n candidate.title.toLowerCase() === target.toLowerCase(),\n )\n const inbound = page\n ? index.graph.edges\n .filter((edge) => edge.target === page.id)\n .map(\n (edge) =>\n index.pages.find((candidate) => candidate.id === edge.source)?.path ?? edge.source,\n )\n : []\n const related = page\n ? searchKnowledge(index, `${page.title} ${page.tags.join(' ')}`, 6)\n .filter((result) => result.page.id !== page.id)\n .map((result) => ({\n path: result.page.path,\n title: result.page.title,\n score: result.score,\n }))\n : searchKnowledge(index, target, 6).map((result) => ({\n path: result.page.path,\n title: result.page.title,\n score: result.score,\n }))\n return {\n target,\n page,\n sources: page\n ? index.sources\n .filter((source) => page.sourceIds.includes(source.id))\n .map((source) => ({ id: source.id, title: source.title, uri: source.uri }))\n : [],\n links: page?.outLinks ?? [],\n inbound,\n related,\n }\n}\n"],"mappings":"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","names":["mkdir","dirname","join","resolve","entry","randomUUID","readdir","rm","resolve","randomUUID","rm","readdir","resolve","resolve","join","mkdir","dirname","z","join","join","basename","lstat","readdir","readFile","basename","join","relative","z","z","lstat","readFile","contentHash","basename","mediaTypeFor","relative","lock","join","readdir","readFile","contentHash","contentHash","lock","readFile"]}