@tangle-network/agent-knowledge 4.0.1 → 5.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +35 -19
- package/CHANGELOG.md +48 -0
- package/README.md +220 -943
- package/dist/benchmarks/index.d.ts +3 -2
- package/dist/benchmarks/index.js +1 -1
- package/dist/{chunk-EUAXSBMH.js → chunk-AKYJG2MR.js} +224 -224
- package/dist/chunk-AKYJG2MR.js.map +1 -0
- package/dist/{chunk-BBCIB4UL.js → chunk-EYIA5PLQ.js} +27 -195
- package/dist/chunk-EYIA5PLQ.js.map +1 -0
- package/dist/{chunk-3CAAGJCE.js → chunk-LMR53POQ.js} +1227 -574
- package/dist/chunk-LMR53POQ.js.map +1 -0
- package/dist/{chunk-WCYW2GDA.js → chunk-MYFM6LKH.js} +2 -2
- package/dist/chunk-MYFM6LKH.js.map +1 -0
- package/dist/cli.js +1 -1
- package/dist/index-Cf7txrYP.d.ts +790 -0
- package/dist/index.d.ts +252 -73
- package/dist/index.js +2813 -2229
- package/dist/index.js.map +1 -1
- package/dist/memory/index.d.ts +8 -709
- package/dist/memory/index.js +2 -2
- package/dist/sources/index.d.ts +17 -33
- package/dist/sources/index.js +1 -1
- package/dist/{types-ZzY_x0r7.d.ts → types-BY-xLVw-.d.ts} +28 -67
- package/docs/eval/investment-material-facts.md +28 -29
- package/docs/eval/rag-eval-roadmap.md +21 -17
- package/docs/results/adaptive.md +13 -13
- package/docs/results/claim-grounding.md +11 -11
- package/docs/results/cost-quality.md +4 -4
- package/docs/results/investment-thesis.md +56 -56
- package/docs/results/research-driving.md +54 -54
- package/docs/two-agent-research-ab.md +94 -94
- package/package.json +11 -11
- package/skills/build-with-agent-knowledge/SKILL.md +97 -0
- package/dist/chunk-3CAAGJCE.js.map +0 -1
- package/dist/chunk-BBCIB4UL.js.map +0 -1
- package/dist/chunk-EUAXSBMH.js.map +0 -1
- package/dist/chunk-WCYW2GDA.js.map +0 -1
|
@@ -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 readonly recovery?: KnowledgeMutationRecovery\n assertOwned(): void\n}\n\nexport interface KnowledgeMutationRecovery {\n transactionId: string\n purpose: string\n direction: 'apply' | 'rollback'\n transaction: KnowledgeFileTransaction\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 recoveryOwner?: string\n validate?: (transaction: KnowledgeFileTransaction) => void\n direction?: 'apply' | 'rollback'\n deferFinish?: boolean\n }\n retries?: LockOptions['retries']\n}\n\nexport interface PendingKnowledgeMutation {\n transactionId: string\n purpose: string\n recoveryOwner?: 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 let recovery: KnowledgeMutationRecovery | undefined\n const mutationLock: KnowledgeMutationLock = {\n transactionRoot: join(cacheDir, 'file-transactions'),\n get recovery() {\n return recovery\n },\n assertOwned: acquired.assertOwned,\n }\n const scope: KnowledgeMutationScope = { active: true, lock: mutationLock }\n try {\n const pendingState = await inspectKnowledgeFileTransaction({\n root: resolvedRoot,\n transactionRoot: mutationLock.transactionRoot,\n })\n const pending = pendingState?.transaction ?? null\n const resume = pending\n ? assertKnowledgeTransactionResume(pending, options.resumeTransaction)\n : undefined\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 const finishEpoch = async (completed: boolean) => {\n mutationLock.assertOwned()\n const stillPending = await loadKnowledgeFileTransaction({\n root: resolvedRoot,\n transactionRoot: mutationLock.transactionRoot,\n })\n if (completed && stillPending) {\n throw new Error('knowledge mutation returned with an unfinished transaction')\n }\n if (!stillPending) await finishMutationEpoch(cacheDir, epoch)\n }\n try {\n if (pending) {\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 finish: resume.deferFinish !== true,\n validate: resume.validate,\n assertOwned: acquired.assertOwned,\n })\n recovery = Object.freeze({\n transactionId: pending.transactionId,\n purpose: pending.purpose,\n direction: resume.direction ?? pendingState?.direction ?? 'apply',\n transaction: pending,\n })\n }\n mutationLock.assertOwned()\n const result = await mutate(mutationLock)\n mutationLock.assertOwned()\n await finishEpoch(true)\n return result\n } catch (error) {\n try {\n await finishEpoch(false)\n } catch (finishError) {\n throw new AggregateError(\n [error, finishError],\n 'knowledge mutation failed and its durable state could not be inspected',\n )\n }\n throw error\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 ...(transaction.recoveryOwner ? { recoveryOwner: transaction.recoveryOwner } : {}),\n createdAt: transaction.createdAt,\n direction,\n paths: transaction.entries.map((entry) => entry.path),\n }\n}\n\nfunction assertKnowledgeTransactionResume(\n pending: KnowledgeFileTransaction,\n resume: KnowledgeMutationOptions['resumeTransaction'],\n): NonNullable<KnowledgeMutationOptions['resumeTransaction']> {\n if (!resume || pending.purpose !== resume.purpose) {\n throw new Error(`knowledge transaction '${pending.purpose}' requires its owner to resume`)\n }\n if (pending.recoveryOwner !== resume.recoveryOwner) {\n if (pending.recoveryOwner) {\n throw new Error(\n `knowledge transaction '${pending.purpose}' must be resumed by '${pending.recoveryOwner}'`,\n )\n }\n throw new Error(`knowledge transaction '${pending.purpose}' has no recovery owner`)\n }\n return resume\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 await healAbandonedMutationEpoch(root, epoch, options)\n await new Promise((resolve) => setTimeout(resolve, options.waitMs ?? DEFAULT_READ_WAIT_MS))\n}\n\nasync function healAbandonedMutationEpoch(\n root: string,\n expectedEpoch: number,\n options: KnowledgeReadOptions,\n): Promise<void> {\n await withSafeDirectory(root, '.agent-knowledge', false, async (cacheDir) => {\n let acquired: DurableFileLock\n try {\n acquired = await acquireDurableFileLock(root, {\n lockfilePath: join(cacheDir, 'mutation.lock.durable'),\n staleMs: options.staleMs,\n retries: 0,\n })\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ELOCKED') return\n throw error\n }\n try {\n const currentEpoch = await readMutationEpochFromCache(cacheDir)\n if (currentEpoch !== expectedEpoch || !isOdd(currentEpoch)) return\n const pending = await inspectKnowledgeFileTransaction({\n root,\n transactionRoot: join(cacheDir, 'file-transactions'),\n })\n if (pending) {\n throw new Error(\n `knowledge transaction '${pending.transaction.purpose}' requires its owner to resume`,\n )\n }\n await finishMutationEpoch(cacheDir, currentEpoch)\n } finally {\n await acquired.release()\n }\n })\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 recoveryOwner: z.string().min(1).max(256).optional(),\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 recoveryOwner?: 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 ...(input.recoveryOwner ? { recoveryOwner: input.recoveryOwner } : {}),\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 finish?: boolean\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 if (input.finish !== false) {\n await finishKnowledgeFileTransaction({\n root: input.root,\n transactionRoot: input.transactionRoot,\n transaction,\n assertOwned: input.assertOwned,\n })\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"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/sources/html.ts","../src/sources/http.ts","../src/sources/cornell-lii.ts","../src/sources/irs-publications.ts","../src/sources/state-sos.ts"],"sourcesContent":["/**\n * Minimal HTML helpers used by the shipped sources.\n *\n * Deliberately not a full DOM parser: every authority we ship against\n * (Cornell LII, IRS.gov, state SOS portals) has well-behaved server-rendered\n * HTML where regex-based extraction is correct and cheap. Bringing in cheerio\n * would add a 1.5MB dependency to a package whose purpose is shipping\n * primitives, not parsing arbitrary web pages.\n *\n * If a future source needs real DOM traversal, it should depend on its own\n * parser locally rather than promoting one into the package-wide deps.\n *\n * @stable\n */\n\n/**\n * Strip HTML tags, collapse whitespace, decode common entities.\n *\n * Preserves paragraph and line breaks (`</p>`, `<br>`, `</li>`, `</div>`,\n * `</h*>`) as `\\n` so statute text retains its subsection structure.\n */\nexport function htmlToText(html: string): string {\n return html\n .replace(/<script[\\s\\S]*?<\\/script>/gi, '')\n .replace(/<style[\\s\\S]*?<\\/style>/gi, '')\n .replace(/<noscript[\\s\\S]*?<\\/noscript>/gi, '')\n .replace(/<!--([\\s\\S]*?)-->/g, '')\n .replace(/<\\s*br\\s*\\/?>/gi, '\\n')\n .replace(/<\\/(p|li|div|tr|h[1-6]|blockquote|section|article)>/gi, '\\n')\n .replace(/<[^>]+>/g, '')\n .replace(/ /gi, ' ')\n .replace(/&/gi, '&')\n .replace(/</gi, '<')\n .replace(/>/gi, '>')\n .replace(/"/gi, '\"')\n .replace(/'/gi, \"'\")\n .replace(/§/gi, '§')\n .replace(/—/gi, '—')\n .replace(/–/gi, '–')\n .replace(/&#(\\d+);/g, (_, code) => String.fromCodePoint(Number(code)))\n .replace(/&#x([0-9a-f]+);/gi, (_, code) => String.fromCodePoint(Number.parseInt(code, 16)))\n .split('\\n')\n .map((line) => line.replace(/[\\t ]+/g, ' ').trim())\n .filter((line, idx, all) => !(line === '' && all[idx - 1] === ''))\n .join('\\n')\n .trim()\n}\n\n/** Extract the first match of a regex's first capture group, or undefined. */\nexport function firstMatch(html: string, pattern: RegExp): string | undefined {\n return pattern.exec(html)?.[1]?.trim()\n}\n\n/** Extract the inner HTML of the first matching tag with id `id`. */\nexport function innerHtmlById(html: string, id: string): string | undefined {\n const escaped = id.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n const tagPattern = new RegExp(\n `<([a-z][a-z0-9]*)\\\\b[^>]*\\\\sid=[\"']${escaped}[\"'][^>]*>([\\\\s\\\\S]*?)<\\\\/\\\\1>`,\n 'i',\n )\n return tagPattern.exec(html)?.[2]\n}\n\n/**\n * Extract every (href, text) pair matching the URL regex.\n * Returns absolute URLs by resolving against `baseUrl`.\n */\nexport function extractLinks(\n html: string,\n hrefPattern: RegExp,\n baseUrl: string,\n): { href: string; text: string }[] {\n const out: { href: string; text: string }[] = []\n const anchor = /<a\\b[^>]*\\shref=[\"']([^\"']+)[\"'][^>]*>([\\s\\S]*?)<\\/a>/gi\n for (const match of html.matchAll(anchor)) {\n const href = match[1]\n const inner = match[2]\n if (!href || !inner) continue\n if (!hrefPattern.test(href)) continue\n const text = htmlToText(inner)\n if (!text) continue\n try {\n out.push({ href: new URL(href, baseUrl).toString(), text })\n } catch {\n /* skip malformed URL */\n }\n }\n return out\n}\n","import { mkdir, readFile, stat, writeFile } from 'node:fs/promises'\nimport { dirname, join } from 'node:path'\nimport { sha256 } from '../ids'\n\n/**\n * Polite HTTP fetcher used by every shipped source.\n *\n * Three invariants this enforces — each was a bug found while wiring real\n * authorities; do not regress:\n *\n * 1. Per-host throttling. Cornell LII serves under 1 req/s/origin\n * politely and will start serving block pages above that. The lock\n * is per-host (`hostThrottle`) rather than per-source so that two\n * independent sources targeting the same authority still cooperate.\n *\n * 2. On-disk content cache keyed by URL. Production sources are called\n * from a cron loop; without a cache, every run re-hits the same\n * pages and inflates change-detection false-positives (the authority\n * occasionally serves slightly different boilerplate). The cache is\n * content-addressed by URL, not by ETag — authorities like IRS.gov\n * do not consistently send ETag/Last-Modified.\n *\n * 3. Block-page detection on success. A 200 with a captcha body still\n * means \"we couldn't authenticate.\" Sources downstream rely on\n * `verifiable` to refuse promotion — losing that signal because the\n * fetcher said \"well, the status code was 200\" is the bug class\n * this exists to prevent.\n *\n * @stable\n */\n\n/** User-Agent string sent on every outbound request. */\nexport const POLITE_USER_AGENT =\n 'agent-knowledge/0.2.0 (+https://github.com/tangle-network/agent-knowledge)'\n\n/** Minimum gap between successive requests to the same origin (ms). */\nexport const MIN_REQUEST_GAP_MS = 1_000\n\n/** Maximum response body we will buffer in memory (bytes). */\nexport const MAX_RESPONSE_BYTES = 8 * 1024 * 1024\n\nconst hostThrottle = new Map<string, Promise<void>>()\n\nexport interface PoliteFetchOptions {\n signal?: AbortSignal\n cacheDir?: string\n /**\n * Cache age beyond which we re-fetch. Default 1 hour — long enough to\n * batch a cron sweep across many selectors, short enough that hourly\n * authoritative-page changes get picked up next tick.\n */\n cacheTtlMs?: number\n /**\n * Extra request headers. The fetcher always sets `User-Agent` and\n * `Accept`; callers can add `Accept-Language` etc.\n */\n headers?: Record<string, string>\n}\n\nexport interface PoliteFetchResult {\n url: string\n status: number\n /** Decoded UTF-8 body. Truncated to `MAX_RESPONSE_BYTES`. */\n body: string\n /**\n * Best-effort source-attested timestamp. Reads `Last-Modified`,\n * falling back to `Date`, falling back to fetch time. Always ISO 8601.\n */\n sourceUpdatedAt: string\n fetchedAt: string\n /** True iff the response was satisfied from disk cache. */\n fromCache: boolean\n /**\n * False on: non-2xx status, captcha/block page heuristic match, or\n * decoded body below 200 chars from a host known to serve real content\n * (Cornell, IRS, state SOS). `unverifiableReason` carries the why.\n */\n verifiable: boolean\n unverifiableReason?: string\n}\n\n/**\n * Fetch one URL with per-host throttling, on-disk cache, and block-page\n * detection. Never throws on network/HTTP failure — returns a result with\n * `verifiable: false` and `unverifiableReason` set so the caller can decide\n * whether to skip, retry, or surface.\n *\n * Throws ONLY on `AbortError` (caller asked to stop) and on cache-write\n * failures that indicate a misconfigured filesystem.\n */\nexport async function politeFetch(\n url: string,\n options: PoliteFetchOptions = {},\n): Promise<PoliteFetchResult> {\n const cacheTtl = options.cacheTtlMs ?? 60 * 60 * 1000\n const cached = options.cacheDir ? await readCache(options.cacheDir, url, cacheTtl) : undefined\n if (cached) return cached\n\n const host = safeHost(url)\n await throttleHost(host)\n\n const fetchedAt = new Date().toISOString()\n let response: Response\n try {\n response = await fetch(url, {\n signal: options.signal,\n redirect: 'follow',\n headers: {\n 'User-Agent': POLITE_USER_AGENT,\n Accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',\n 'Accept-Language': 'en-US,en;q=0.9',\n ...(options.headers ?? {}),\n },\n })\n } catch (error) {\n if ((error as { name?: string }).name === 'AbortError') throw error\n const result: PoliteFetchResult = {\n url,\n status: 0,\n body: '',\n sourceUpdatedAt: fetchedAt,\n fetchedAt,\n fromCache: false,\n verifiable: false,\n unverifiableReason: `network error: ${(error as Error).message}`,\n }\n if (options.cacheDir) await writeCache(options.cacheDir, url, result)\n return result\n }\n\n const text = await readBoundedText(response)\n const lastModified = response.headers.get('last-modified')\n const dateHeader = response.headers.get('date')\n const sourceUpdatedAt = parseHttpDate(lastModified) ?? parseHttpDate(dateHeader) ?? fetchedAt\n\n const result: PoliteFetchResult = {\n url,\n status: response.status,\n body: text,\n sourceUpdatedAt,\n fetchedAt,\n fromCache: false,\n verifiable: true,\n }\n\n if (response.status < 200 || response.status >= 300) {\n result.verifiable = false\n result.unverifiableReason = `non-2xx status: ${response.status}`\n } else if (looksLikeBlockPage(text)) {\n result.verifiable = false\n result.unverifiableReason = 'block-page heuristic matched'\n } else if (text.length < 200 && knownLargeAuthority(host)) {\n result.verifiable = false\n result.unverifiableReason = `body shorter than expected (${text.length} chars)`\n }\n\n if (options.cacheDir) await writeCache(options.cacheDir, url, result)\n return result\n}\n\n/** Reset the in-process throttle map. Test-only. */\nexport function __resetHttpThrottle(): void {\n hostThrottle.clear()\n}\n\nfunction safeHost(url: string): string {\n try {\n return new URL(url).host\n } catch {\n return 'unknown'\n }\n}\n\nasync function throttleHost(host: string): Promise<void> {\n const prev = hostThrottle.get(host) ?? Promise.resolve()\n let release: () => void = () => {}\n const next = new Promise<void>((resolve) => {\n release = resolve\n })\n hostThrottle.set(\n host,\n prev.then(() => next),\n )\n await prev\n setTimeout(release, MIN_REQUEST_GAP_MS)\n}\n\nasync function readBoundedText(response: Response): Promise<string> {\n if (!response.body) return ''\n const reader = response.body.getReader()\n const chunks: Uint8Array[] = []\n let total = 0\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n if (!value) continue\n total += value.length\n if (total > MAX_RESPONSE_BYTES) {\n // Stop reading; release the underlying connection.\n await reader.cancel()\n break\n }\n chunks.push(value)\n }\n const merged = new Uint8Array(Math.min(total, MAX_RESPONSE_BYTES))\n let offset = 0\n for (const chunk of chunks) {\n const take = Math.min(chunk.length, merged.length - offset)\n if (take <= 0) break\n merged.set(chunk.subarray(0, take), offset)\n offset += take\n }\n return new TextDecoder('utf-8', { fatal: false }).decode(merged)\n}\n\nfunction parseHttpDate(value: string | null): string | undefined {\n if (!value) return undefined\n const ms = Date.parse(value)\n return Number.isFinite(ms) ? new Date(ms).toISOString() : undefined\n}\n\n/** Cheap heuristic that catches CAPTCHA, WAF block pages, and \"Just a moment\" interstitials. */\nexport function looksLikeBlockPage(body: string): boolean {\n if (!body) return false\n const lower = body.toLowerCase()\n const markers = [\n 'verify you are human',\n 'please enable javascript and cookies',\n 'just a moment',\n 'access denied',\n 'request unsuccessful',\n 'cf-error-details',\n 'captcha',\n 'incapsula',\n 'pardon our interruption',\n ]\n for (const marker of markers) {\n if (lower.includes(marker)) return true\n }\n return false\n}\n\nfunction knownLargeAuthority(host: string): boolean {\n return (\n host.endsWith('law.cornell.edu') ||\n host.endsWith('irs.gov') ||\n host.endsWith('sos.ca.gov') ||\n host.endsWith('sos.state.tx.us') ||\n host.endsWith('sos.state.us')\n )\n}\n\nfunction cachePath(cacheDir: string, url: string): string {\n const key = sha256(url)\n return join(cacheDir, 'http', `${key.slice(0, 2)}`, `${key}.json`)\n}\n\nasync function readCache(\n cacheDir: string,\n url: string,\n ttlMs: number,\n): Promise<PoliteFetchResult | undefined> {\n const path = cachePath(cacheDir, url)\n try {\n const info = await stat(path)\n if (Date.now() - info.mtimeMs > ttlMs) return undefined\n const raw = await readFile(path, 'utf8')\n const parsed = JSON.parse(raw) as PoliteFetchResult\n return { ...parsed, fromCache: true }\n } catch {\n return undefined\n }\n}\n\nasync function writeCache(cacheDir: string, url: string, value: PoliteFetchResult): Promise<void> {\n const path = cachePath(cacheDir, url)\n await mkdir(dirname(path), { recursive: true })\n await writeFile(path, JSON.stringify(value), 'utf8')\n}\n","import { sha256 } from '../ids'\nimport { htmlToText, innerHtmlById } from './html'\nimport { politeFetch } from './http'\nimport type { FetchOpts, KnowledgeFragment, KnowledgeSource } from './types'\n\n/**\n * Cornell Legal Information Institute (LII) source.\n *\n * Pulls federal US Code sections and Wex encyclopedia entries — the two\n * Cornell LII surfaces an agent typically grounds against. The Wex\n * \"non-compete\" page is the canonical test case for the Ryan-LLC v. FTC\n * vacatur drift the continuous-ingestion story is designed to catch.\n *\n * @stable\n */\n\nconst BASE_URL = 'https://www.law.cornell.edu'\n\nexport interface CornellLiiSelector {\n /** Either 'uscode' or 'wex'. */\n kind: 'uscode' | 'wex'\n /**\n * For `uscode`: `<title>/<section>` (e.g. `'18/1836'` for DTSA).\n * For `wex`: the slug (e.g. `'non-compete'`).\n */\n path: string\n /**\n * Optional pre-declared eval dimensions affected by this section. If\n * omitted, defaults are chosen from `kind` + path heuristics.\n */\n dimensionHints?: string[]\n}\n\nexport interface CornellLiiSourceOptions {\n /**\n * Selectors to fetch on each `fetch()` call. The caller (a per-tenant\n * workspace config, typically) lists exactly the authorities they need\n * tracked. There is no auto-discovery; that would crawl Cornell at\n * cron speed, which is what the polite-fetch contract exists to avoid.\n */\n selectors: CornellLiiSelector[]\n /** Source id override; default is `'cornell-lii'`. */\n id?: string\n}\n\n/**\n * Build a Cornell LII source for the listed selectors.\n *\n * Example: track DTSA + non-compete:\n * ```\n * createCornellLiiSource({\n * selectors: [\n * { kind: 'uscode', path: '18/1836' },\n * { kind: 'wex', path: 'non-compete', dimensionHints: ['jurisdictional_accuracy'] },\n * ],\n * })\n * ```\n */\nexport function createCornellLiiSource(options: CornellLiiSourceOptions): KnowledgeSource {\n const id = options.id ?? 'cornell-lii'\n return {\n id,\n name: 'Cornell Legal Information Institute',\n description:\n 'Federal US Code sections (uscode/text/...) and Wex legal encyclopedia entries from law.cornell.edu.',\n async fetch(opts: FetchOpts): Promise<KnowledgeFragment[]> {\n const limit = opts.limit ?? options.selectors.length\n const selectors = options.selectors.slice(0, limit)\n const out: KnowledgeFragment[] = []\n for (const selector of selectors) {\n out.push(await fetchOne(id, selector, opts))\n }\n return out\n },\n }\n}\n\nasync function fetchOne(\n sourceId: string,\n selector: CornellLiiSelector,\n opts: FetchOpts,\n): Promise<KnowledgeFragment> {\n const path = selector.path.replace(/^\\/+/, '')\n const url =\n selector.kind === 'uscode' ? `${BASE_URL}/uscode/text/${path}` : `${BASE_URL}/wex/${path}`\n\n const response = await politeFetch(url, {\n signal: opts.signal,\n cacheDir: opts.cacheDir,\n })\n\n const fragmentId = `${selector.kind}:${selector.path}`\n const dimensionHints = selector.dimensionHints ?? defaultDimensionHints(selector)\n\n if (!response.verifiable) {\n return {\n id: fragmentId,\n title: `Cornell LII ${selector.kind} ${selector.path}`,\n body: '',\n bodyHash: sha256(''),\n provenance: {\n url,\n sourceUpdatedAt: response.sourceUpdatedAt,\n fetchedAt: response.fetchedAt,\n jurisdiction: 'US-FED',\n verifiable: false,\n unverifiableReason: response.unverifiableReason,\n },\n dimensionHints,\n metadata: { sourceId, status: response.status, fromCache: response.fromCache },\n }\n }\n\n const html = response.body\n const title = extractTitle(html, selector)\n const body = extractBody(html, selector)\n const effective = extractEffectiveDate(html) ?? response.sourceUpdatedAt\n\n const verifiable = body.length > 50\n return {\n id: fragmentId,\n title,\n body,\n bodyHash: sha256(body),\n provenance: {\n url,\n sourceUpdatedAt: effective,\n fetchedAt: response.fetchedAt,\n jurisdiction: 'US-FED',\n verifiable,\n unverifiableReason: verifiable ? undefined : 'extracted body too short',\n },\n dimensionHints,\n metadata: { sourceId, status: response.status, fromCache: response.fromCache },\n }\n}\n\nfunction extractTitle(html: string, selector: CornellLiiSelector): string {\n const h1 = /<h1[^>]*\\bid=[\"']page_title[\"'][^>]*>([\\s\\S]*?)<\\/h1>/i.exec(html)?.[1]\n if (h1) return htmlToText(h1)\n const t = /<title>([\\s\\S]*?)<\\/title>/i.exec(html)?.[1]\n if (t) return htmlToText(t).split(' | ')[0] ?? `Cornell LII ${selector.path}`\n return `Cornell LII ${selector.kind} ${selector.path}`\n}\n\nfunction extractBody(html: string, selector: CornellLiiSelector): string {\n if (selector.kind === 'uscode') {\n // The statute text lives inside a <text><div class=\"text\">…</div></text>\n // block on US Code section pages. Prefer it; fall back to #tab_default_1\n // which always contains the section body.\n const text = /<text>([\\s\\S]*?)<\\/text>/i.exec(html)?.[1]\n if (text) return htmlToText(text)\n const tab = innerHtmlById(html, 'tab_default_1')\n if (tab) return htmlToText(tab)\n }\n // Wex pages wrap the encyclopedia entry under <div id=\"main-content\"> (newer\n // Drupal template) or directly inside <div id=\"extracted-content\"> (older\n // template). Try both — lazy regex matching against a nested-div container\n // returns the wrong (shorter) slice, so we anchor on the leaf containers.\n const mainContent = innerHtmlById(html, 'main-content')\n if (mainContent) {\n return htmlToText(mainContent.replace(/<h1[\\s\\S]*?<\\/h1>/i, ''))\n }\n const extracted = innerHtmlById(html, 'extracted-content')\n if (extracted) {\n return htmlToText(extracted.replace(/<h1[\\s\\S]*?<\\/h1>/i, ''))\n }\n return htmlToText(html)\n}\n\nfunction extractEffectiveDate(html: string): string | undefined {\n // Cornell LII includes \"Editorial Notes\" / \"Amendments\" blocks with\n // dates; the most reliable machine-readable signal is the last\n // amendment year embedded near the section text.\n const amend = /Amendments[\\s\\S]{0,200}?(\\d{4})/i.exec(html)?.[1]\n if (amend) {\n const y = Number.parseInt(amend, 10)\n if (Number.isFinite(y) && y > 1900 && y <= new Date().getUTCFullYear() + 1) {\n return new Date(Date.UTC(y, 11, 31)).toISOString()\n }\n }\n return undefined\n}\n\nfunction defaultDimensionHints(selector: CornellLiiSelector): string[] {\n if (selector.kind === 'uscode') return ['jurisdictional_accuracy', 'citation_hygiene']\n return ['citation_hygiene']\n}\n","import { sha256 } from '../ids'\nimport { htmlToText } from './html'\nimport { politeFetch } from './http'\nimport type { FetchOpts, KnowledgeFragment, KnowledgeSource } from './types'\n\n/**\n * IRS publications source.\n *\n * Two surfaces:\n *\n * 1. The publications index at https://www.irs.gov/publications enumerates\n * every active publication with its revision year — a single fragment\n * with the full table lets change detection notice when a publication\n * year flips (e.g. Pub 15 (2025) → Pub 15 (2026)).\n *\n * 2. Individual publication landing pages at /publications/p<N>[<suffix>]\n * return one fragment per publication with summary text. Callers list\n * the publications they need tracked via `selectors`.\n *\n * Revenue procedures are fetched under their numbered URLs; the IRS does\n * not maintain a stable HTML index of rev-procs, so the caller passes the\n * specific rev-proc paths they care about.\n *\n * @stable\n */\n\nconst BASE_URL = 'https://www.irs.gov'\nconst INDEX_URL = `${BASE_URL}/publications`\n\nexport interface IrsPublicationsSourceOptions {\n /**\n * Specific publication slugs to fetch (e.g. `['p15', 'p17', 'p463']`).\n * When `includeIndex` is true (default), the publications index page is\n * also fetched as a single fragment so change detection can notice\n * year/revision shifts across the whole catalogue.\n */\n publications?: string[]\n /**\n * Revenue procedure paths to fetch (e.g. `['/irb/2024-31_IRB']`). The\n * caller passes the exact path; this source does not auto-discover.\n */\n revenueProcedures?: string[]\n includeIndex?: boolean\n id?: string\n}\n\n/** Default eval dimensions for IRS-sourced fragments. */\nexport const IRS_DIMENSION_HINTS = ['tax_compliance', 'regulatory_currency', 'citation_hygiene']\n\nexport function createIrsPublicationsSource(\n options: IrsPublicationsSourceOptions = {},\n): KnowledgeSource {\n const id = options.id ?? 'irs-publications'\n const includeIndex = options.includeIndex ?? true\n return {\n id,\n name: 'IRS Publications',\n description:\n 'Internal Revenue Service publications index and individual publication landing pages from irs.gov.',\n async fetch(opts: FetchOpts): Promise<KnowledgeFragment[]> {\n const out: KnowledgeFragment[] = []\n const limit = opts.limit ?? Number.POSITIVE_INFINITY\n\n if (includeIndex && out.length < limit) {\n out.push(await fetchIndex(id, opts))\n }\n for (const slug of options.publications ?? []) {\n if (out.length >= limit) break\n out.push(await fetchPublication(id, slug, opts))\n }\n for (const path of options.revenueProcedures ?? []) {\n if (out.length >= limit) break\n out.push(await fetchRevenueProcedure(id, path, opts))\n }\n return out\n },\n }\n}\n\nasync function fetchIndex(sourceId: string, opts: FetchOpts): Promise<KnowledgeFragment> {\n const response = await politeFetch(INDEX_URL, { signal: opts.signal, cacheDir: opts.cacheDir })\n const tablePattern = /<table[\\s\\S]*?<\\/table>/gi\n const matches = response.body.match(tablePattern) ?? []\n // Extract the table that lists current-year publications. IRS publishes\n // one table per year on the index; the most recent table is always the\n // first that mentions a year ≥ current.\n const tables = matches.map((t) => htmlToText(t))\n const body = tables\n .filter((t) => /Publication\\s*\\d+/i.test(t))\n .join('\\n\\n')\n .slice(0, 200_000)\n\n const verifiable = response.verifiable && body.length > 200\n return {\n id: 'index',\n title: 'IRS Publications Index',\n body,\n bodyHash: sha256(body),\n provenance: {\n url: INDEX_URL,\n sourceUpdatedAt: response.sourceUpdatedAt,\n fetchedAt: response.fetchedAt,\n jurisdiction: 'US-FED',\n verifiable,\n unverifiableReason:\n response.unverifiableReason ?? (verifiable ? undefined : 'no publication rows extracted'),\n },\n dimensionHints: IRS_DIMENSION_HINTS,\n metadata: { sourceId, status: response.status, fromCache: response.fromCache, kind: 'index' },\n }\n}\n\nasync function fetchPublication(\n sourceId: string,\n slug: string,\n opts: FetchOpts,\n): Promise<KnowledgeFragment> {\n const url = `${BASE_URL}/publications/${slug.replace(/^\\/+/, '')}`\n const response = await politeFetch(url, { signal: opts.signal, cacheDir: opts.cacheDir })\n\n const title = extractTitle(response.body, `IRS Publication ${slug}`)\n const body = extractMainContent(response.body)\n const verifiable = response.verifiable && body.length > 200\n\n return {\n id: `publication:${slug}`,\n title,\n body,\n bodyHash: sha256(body),\n provenance: {\n url,\n sourceUpdatedAt: extractRevisionDate(response.body) ?? response.sourceUpdatedAt,\n fetchedAt: response.fetchedAt,\n jurisdiction: 'US-FED',\n verifiable,\n unverifiableReason:\n response.unverifiableReason ?? (verifiable ? undefined : 'no publication body extracted'),\n },\n dimensionHints: IRS_DIMENSION_HINTS,\n metadata: {\n sourceId,\n status: response.status,\n fromCache: response.fromCache,\n kind: 'publication',\n slug,\n },\n }\n}\n\nasync function fetchRevenueProcedure(\n sourceId: string,\n path: string,\n opts: FetchOpts,\n): Promise<KnowledgeFragment> {\n const url = `${BASE_URL}${path.startsWith('/') ? path : `/${path}`}`\n const response = await politeFetch(url, { signal: opts.signal, cacheDir: opts.cacheDir })\n const body = extractMainContent(response.body)\n const verifiable = response.verifiable && body.length > 200\n return {\n id: `rev-proc:${path}`,\n title: extractTitle(response.body, `IRS Revenue Procedure ${path}`),\n body,\n bodyHash: sha256(body),\n provenance: {\n url,\n sourceUpdatedAt: response.sourceUpdatedAt,\n fetchedAt: response.fetchedAt,\n jurisdiction: 'US-FED',\n verifiable,\n unverifiableReason:\n response.unverifiableReason ??\n (verifiable ? undefined : 'no revenue-procedure body extracted'),\n },\n dimensionHints: [...IRS_DIMENSION_HINTS, 'procedural_currency'],\n metadata: {\n sourceId,\n status: response.status,\n fromCache: response.fromCache,\n kind: 'rev-proc',\n path,\n },\n }\n}\n\nfunction extractTitle(html: string, fallback: string): string {\n const og = /<meta\\s+property=[\"']og:title[\"']\\s+content=[\"']([^\"']+)[\"']/i.exec(html)?.[1]\n if (og) return decodeHtml(og)\n const title = /<title>([\\s\\S]*?)<\\/title>/i.exec(html)?.[1]\n if (title) return htmlToText(title).split(' | ')[0] ?? fallback\n return fallback\n}\n\nfunction extractMainContent(html: string): string {\n // IRS uses Drupal — the main publication body is inside <main role=\"main\">\n // or under .field--name-body. We try main first; on miss, body.\n const main = /<main\\b[\\s\\S]*?<\\/main>/i.exec(html)?.[0]\n if (main) {\n const noNav = main\n .replace(/<nav[\\s\\S]*?<\\/nav>/gi, '')\n .replace(/<header[\\s\\S]*?<\\/header>/gi, '')\n .replace(/<footer[\\s\\S]*?<\\/footer>/gi, '')\n return htmlToText(noNav).slice(0, 200_000)\n }\n const body = /<body\\b[\\s\\S]*?<\\/body>/i.exec(html)?.[0]\n return body ? htmlToText(body).slice(0, 200_000) : htmlToText(html).slice(0, 200_000)\n}\n\nfunction extractRevisionDate(html: string): string | undefined {\n // IRS publication pages typically show \"Publication X (YYYY)\" in the title;\n // pulling the year gives a stable revision marker.\n const m = /Publication\\s+\\S+\\s*\\((\\d{4})\\)/i.exec(html)\n if (m?.[1]) {\n const year = Number.parseInt(m[1], 10)\n if (Number.isFinite(year) && year >= 2000 && year <= new Date().getUTCFullYear() + 1) {\n return new Date(Date.UTC(year, 0, 1)).toISOString()\n }\n }\n return undefined\n}\n\nfunction decodeHtml(value: string): string {\n return htmlToText(value)\n}\n","import { sha256 } from '../ids'\nimport { htmlToText } from './html'\nimport { politeFetch } from './http'\nimport type { FetchOpts, KnowledgeFragment, KnowledgeSource } from './types'\n\n/**\n * Generic Secretary-of-State source.\n *\n * Every US state SOS surfaces LLC/Corp formation requirements differently\n * (CA via static forms pages, DE via division of corporations pages, TX\n * via SOSDirect content pages). Rather than baking 50 state-specific\n * parsers into this package, the source takes a config that names the URL\n * pattern + CSS-equivalent selector + jurisdiction tag. Callers supply one\n * config per state they need tracked.\n *\n * The selector is interpreted as a substring/regex of an HTML element id\n * or class — see `StateSosSourceConfig` for the contract. This is\n * intentionally minimal; richer extraction belongs in a state-specific\n * adapter the consumer authors.\n *\n * @experimental Interface will likely grow as we add more state coverage.\n */\n\nexport interface StateSosEntity {\n /** Stable id for this fragment within the state (e.g. 'llc-formation', 'corp-formation'). */\n id: string\n /** Path under the configured `baseUrl` for this entity. */\n path: string\n /**\n * Extraction selector. Choose one:\n * - `{ kind: 'id', value: 'main-content' }` — innermost match of element with that id\n * - `{ kind: 'class', value: 'field--name-body' }` — innermost match of element with that class\n * - `{ kind: 'regex', value: /<article[\\s\\S]*?<\\/article>/i }` — raw regex\n * - `{ kind: 'whole' }` — full body, tags stripped (fallback for unstructured pages)\n */\n selector:\n | { kind: 'id'; value: string }\n | { kind: 'class'; value: string }\n | { kind: 'regex'; value: RegExp }\n | { kind: 'whole' }\n title: string\n /** Eval dimensions this entity feeds. */\n dimensionHints?: string[]\n}\n\nexport interface StateSosSourceConfig {\n /** US state postal code, e.g. 'CA', 'DE', 'TX'. */\n state: string\n /** Base URL for the state SOS — e.g. 'https://www.sos.ca.gov'. */\n baseUrl: string\n /** Entities this state exposes (LLC, Corp, etc). */\n entities: StateSosEntity[]\n /** Source id; default `state-sos:<state>`. */\n id?: string\n /** Display name; default `<state> Secretary of State`. */\n name?: string\n}\n\nexport function createStateSosSource(config: StateSosSourceConfig): KnowledgeSource {\n const id = config.id ?? `state-sos:${config.state.toLowerCase()}`\n const name = config.name ?? `${config.state} Secretary of State`\n return {\n id,\n name,\n description: `${config.state} Secretary of State filings and formation guidance pages.`,\n async fetch(opts: FetchOpts): Promise<KnowledgeFragment[]> {\n const limit = opts.limit ?? config.entities.length\n const entities = config.entities.slice(0, limit)\n const out: KnowledgeFragment[] = []\n for (const entity of entities) {\n out.push(await fetchEntity(id, config, entity, opts))\n }\n return out\n },\n }\n}\n\nasync function fetchEntity(\n sourceId: string,\n config: StateSosSourceConfig,\n entity: StateSosEntity,\n opts: FetchOpts,\n): Promise<KnowledgeFragment> {\n const url = joinUrl(config.baseUrl, entity.path)\n const response = await politeFetch(url, { signal: opts.signal, cacheDir: opts.cacheDir })\n\n const body = response.verifiable ? extractBySelector(response.body, entity.selector) : ''\n const verifiable = response.verifiable && body.length > 100\n\n return {\n id: entity.id,\n title: entity.title,\n body,\n bodyHash: sha256(body),\n provenance: {\n url,\n sourceUpdatedAt: response.sourceUpdatedAt,\n fetchedAt: response.fetchedAt,\n jurisdiction: `US-${config.state.toUpperCase()}`,\n verifiable,\n unverifiableReason:\n response.unverifiableReason ?? (verifiable ? undefined : 'extracted body too short'),\n },\n dimensionHints: entity.dimensionHints ?? [\n 'jurisdictional_accuracy',\n 'corporate_formation',\n 'citation_hygiene',\n ],\n metadata: {\n sourceId,\n status: response.status,\n fromCache: response.fromCache,\n state: config.state,\n },\n }\n}\n\nfunction extractBySelector(html: string, selector: StateSosEntity['selector']): string {\n if (selector.kind === 'whole') {\n const main = /<main\\b[\\s\\S]*?<\\/main>/i.exec(html)?.[0]\n return htmlToText(main ?? html).slice(0, 200_000)\n }\n if (selector.kind === 'regex') {\n const m = selector.value.exec(html)?.[0]\n return m ? htmlToText(m).slice(0, 200_000) : ''\n }\n if (selector.kind === 'id') {\n const escaped = selector.value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n const pattern = new RegExp(\n `<([a-z][a-z0-9]*)\\\\b[^>]*\\\\sid=[\"']${escaped}[\"'][^>]*>([\\\\s\\\\S]*?)<\\\\/\\\\1>`,\n 'i',\n )\n const inner = pattern.exec(html)?.[2]\n return inner ? htmlToText(inner).slice(0, 200_000) : ''\n }\n const escaped = selector.value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n const pattern = new RegExp(\n `<([a-z][a-z0-9]*)\\\\b[^>]*\\\\sclass=[\"'][^\"']*\\\\b${escaped}\\\\b[^\"']*[\"'][^>]*>([\\\\s\\\\S]*?)<\\\\/\\\\1>`,\n 'i',\n )\n const inner = pattern.exec(html)?.[2]\n return inner ? htmlToText(inner).slice(0, 200_000) : ''\n}\n\nfunction joinUrl(base: string, path: string): string {\n try {\n return new URL(path, base.endsWith('/') ? base : `${base}/`).toString()\n } catch {\n return `${base.replace(/\\/+$/, '')}/${path.replace(/^\\/+/, '')}`\n }\n}\n"],"mappings":"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","names":["result","BASE_URL","extractTitle","escaped","pattern","inner"]}
|