eve-knowledge 0.1.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli.ts","../src/indexer.ts","../src/hash.ts","../src/chunk.ts","../src/config.ts","../src/loader.ts","../src/fs-utils.ts","../src/frontmatter.ts","../src/format.ts","../src/redaction.ts","../src/sections.ts","../src/scan.ts","../src/store/local.ts","../src/store/helpers.ts","../src/check.ts","../src/config-loader.ts","../src/search.ts","../src/scaffold.ts","../src/project.ts","../src/index.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { checkKnowledge } from \"./check.js\";\nimport { loadKnowledgeConfig } from \"./config-loader.js\";\nimport { indexKnowledge } from \"./indexer.js\";\nimport { version } from \"./index.js\";\nimport { searchKnowledge } from \"./search.js\";\nimport { scaffoldEveKnowledge } from \"./scaffold.js\";\n\nexport function createCli(): Command {\n const program = new Command();\n\n program\n .name(\"eve-knowledge\")\n .description(\"Add a cited agent/knowledge folder to Eve agents.\")\n .version(version);\n\n program\n .command(\"init\")\n .description(\"Create the agent/knowledge convention, Eve tool, citation skill, and config.\")\n .option(\"--dry-run\", \"Print planned files without writing them.\")\n .option(\"--force\", \"Overwrite existing generated files.\")\n .option(\"--allow-non-eve\", \"Scaffold even if no Eve project is detected.\")\n .action(async (options: { dryRun?: boolean; force?: boolean; allowNonEve?: boolean }) => {\n const result = await scaffoldEveKnowledge({\n cwd: process.cwd(),\n ...(options.dryRun ? { dryRun: true } : {}),\n ...(options.force ? { force: true } : {}),\n ...(options.allowNonEve ? { allowNonEve: true } : {}),\n });\n\n printList(options.dryRun ? \"Would write\" : \"Written\", result.written);\n printList(\"Skipped existing files\", result.skipped);\n\n if (result.skipped.length > 0 && !options.force) {\n console.log(\"Use --force to overwrite skipped files.\");\n }\n });\n\n program\n .command(\"index\")\n .description(\"Index files from agent/knowledge into the configured local store.\")\n .option(\"--trusted-config\", \"Allow executable eve-knowledge.config.ts/js/mjs. Use only with trusted code.\")\n .action(async (options: { trustedConfig?: boolean }) => {\n const config = await loadKnowledgeConfig({ trustedConfig: Boolean(options.trustedConfig) });\n const summary = await indexKnowledge({ config });\n console.log(JSON.stringify(summary, null, 2));\n if (summary.errors.length > 0) {\n process.exitCode = 1;\n }\n });\n\n program\n .command(\"search\")\n .description(\"Search the local knowledge store.\")\n .argument(\"<query>\", \"Knowledge search query.\")\n .option(\"--top-k <number>\", \"Maximum number of results.\", parseInteger)\n .option(\"--trusted-config\", \"Allow executable eve-knowledge.config.ts/js/mjs. Use only with trusted code.\")\n .action(async (query: string, options: { topK?: number; trustedConfig?: boolean }) => {\n const config = await loadKnowledgeConfig({ trustedConfig: Boolean(options.trustedConfig) });\n const response = await searchKnowledge(\n {\n query,\n ...(options.topK !== undefined ? { topK: options.topK } : {}),\n },\n { config },\n );\n console.log(JSON.stringify(response, null, 2));\n });\n\n program\n .command(\"check\")\n .description(\"Validate that knowledge can be indexed safely for CI.\")\n .option(\"--production\", \"Fail if the configured store is not durable.\")\n .option(\"--trusted-config\", \"Allow executable eve-knowledge.config.ts/js/mjs. Use only with trusted code.\")\n .action(async (options: { production?: boolean; trustedConfig?: boolean }) => {\n const loadedConfig = await loadKnowledgeConfig({ trustedConfig: Boolean(options.trustedConfig) });\n const result = await checkKnowledge({\n config: {\n ...loadedConfig,\n },\n ...(options.production ? { production: true } : {}),\n });\n console.log(JSON.stringify(result, null, 2));\n\n if (!result.ok) {\n process.exitCode = 1;\n }\n });\n\n return program;\n}\n\nexport async function runCli(argv = process.argv): Promise<void> {\n await createCli().parseAsync(argv);\n}\n\nif (import.meta.url === `file://${process.argv[1]}`) {\n await runCli();\n}\n\nfunction printList(label: string, values: string[]): void {\n if (values.length === 0) return;\n\n console.log(`${label}:`);\n for (const value of values) {\n console.log(` - ${value}`);\n }\n}\n\nfunction parseInteger(value: string): number {\n const parsed = Number.parseInt(value, 10);\n if (!Number.isInteger(parsed)) {\n throw new Error(`Expected an integer, received ${value}`);\n }\n\n return parsed;\n}\n","import { performance } from \"node:perf_hooks\";\nimport { chunkDocument } from \"./chunk.js\";\nimport { resolveKnowledgeConfig } from \"./config.js\";\nimport { loadKnowledgeDocument } from \"./loader.js\";\nimport { KnowledgeRedactionError } from \"./redaction.js\";\nimport { scanKnowledgeFiles } from \"./scan.js\";\nimport { createLocalKnowledgeStore } from \"./store/local.js\";\nimport type {\n IndexIssue,\n IndexSummary,\n KnowledgeChunk,\n KnowledgeConfig,\n KnowledgeStore,\n} from \"./types.js\";\n\nexport interface IndexKnowledgeOptions {\n config?: KnowledgeConfig;\n store?: KnowledgeStore;\n cwd?: string;\n now?: Date;\n dryRun?: boolean;\n}\n\nexport async function indexKnowledge(options: IndexKnowledgeOptions = {}): Promise<IndexSummary> {\n const startedAt = performance.now();\n const config = resolveKnowledgeConfig(options.config, options.cwd);\n const store = options.store ?? createLocalKnowledgeStore({ storeDir: config.storeDir });\n const scan = await scanKnowledgeFiles(config);\n const warnings: IndexIssue[] = [...scan.warnings];\n const errors: IndexIssue[] = [...scan.errors];\n\n if (errors.length > 0) {\n return {\n filesScanned: scan.files.length + scan.skipped.length + scan.errors.length,\n filesIndexed: 0,\n filesSkipped: scan.skipped.length,\n chunksCreated: 0,\n chunksReused: 0,\n sourcesChanged: 0,\n sourcesDeleted: 0,\n warnings,\n errors,\n elapsedMs: Math.round(performance.now() - startedAt),\n store: await store.stats(),\n };\n }\n\n const existingChunks = \"listChunks\" in store && store.listChunks ? await store.listChunks() : [];\n const existingBySource = groupChunksBySource(existingChunks);\n const seenSources = new Set<string>();\n let chunksCreated = 0;\n let chunksReused = 0;\n let sourcesChanged = 0;\n let sourcesDeleted = 0;\n let filesIndexed = 0;\n const chunksToUpsert: KnowledgeChunk[] = [];\n const sourcesToDelete: string[] = [];\n\n for (const filePath of scan.files) {\n try {\n const document = await loadKnowledgeDocument(filePath, config);\n if (!document) continue;\n\n const chunks = chunkDocument(document, config, options.now?.toISOString());\n const existingForSource = existingBySource.get(document.source.path) ?? [];\n const reconciled = reconcileChunks(chunks, existingForSource);\n chunksReused += reconciled.reused;\n chunksCreated += reconciled.created;\n\n if (!options.dryRun) {\n if (chunks.length === 0) {\n sourcesToDelete.push(document.source.path);\n } else if (!reconciled.unchanged) {\n chunksToUpsert.push(...reconciled.chunks);\n }\n }\n if (!reconciled.unchanged) {\n sourcesChanged += 1;\n }\n seenSources.add(document.source.path);\n filesIndexed += 1;\n } catch (error) {\n if (error instanceof KnowledgeRedactionError) {\n const issue: IndexIssue = {\n level: error.level,\n path: error.path,\n code: \"possible_secret\",\n message: error.message,\n };\n\n if (error.level === \"error\") errors.push(issue);\n else warnings.push(issue);\n continue;\n }\n\n errors.push({\n level: \"error\",\n path: filePath,\n code: \"load_failed\",\n message: error instanceof Error ? error.message : \"Failed to load knowledge file.\",\n });\n }\n }\n\n if (\"listSources\" in store && store.listSources) {\n const previousSources = await store.listSources();\n for (const sourcePath of previousSources.filter((sourcePath) => !seenSources.has(sourcePath))) {\n sourcesDeleted += 1;\n if (!options.dryRun) {\n sourcesToDelete.push(sourcePath);\n }\n }\n }\n\n if (!options.dryRun) {\n if (chunksToUpsert.length > 0) {\n await store.upsertChunks(chunksToUpsert);\n }\n for (const sourcePath of sourcesToDelete) {\n await store.deleteBySource(sourcePath);\n }\n }\n\n return {\n filesScanned: scan.files.length + scan.skipped.length,\n filesIndexed,\n filesSkipped: scan.skipped.length + warnings.length,\n chunksCreated,\n chunksReused,\n sourcesChanged,\n sourcesDeleted,\n warnings,\n errors,\n elapsedMs: Math.round(performance.now() - startedAt),\n store: await store.stats(),\n };\n}\n\ninterface ReconciledChunks {\n chunks: KnowledgeChunk[];\n reused: number;\n created: number;\n unchanged: boolean;\n}\n\nfunction reconcileChunks(chunks: KnowledgeChunk[], existingChunks: KnowledgeChunk[]): ReconciledChunks {\n const existingById = new Map(existingChunks.map((chunk) => [chunk.id, chunk]));\n let reused = 0;\n let created = 0;\n\n const reconciled = chunks.map((chunk) => {\n const existing = existingById.get(chunk.id);\n if (existing?.contentHash === chunk.contentHash) {\n reused += 1;\n return mergeReusedChunk(chunk, existing);\n }\n\n created += 1;\n return chunk;\n });\n\n return {\n chunks: reconciled,\n reused,\n created,\n unchanged: isSameChunkSet(reconciled, existingChunks),\n };\n}\n\nfunction mergeReusedChunk(chunk: KnowledgeChunk, existing: KnowledgeChunk): KnowledgeChunk {\n return {\n ...chunk,\n source: sameSourceExceptModifiedTime(chunk, existing) ? existing.source : chunk.source,\n indexedAt: existing.indexedAt,\n };\n}\n\nfunction sameSourceExceptModifiedTime(next: KnowledgeChunk, existing: KnowledgeChunk): boolean {\n const { modifiedTime: _nextModifiedTime, ...nextSource } = next.source;\n const { modifiedTime: _existingModifiedTime, ...existingSource } = existing.source;\n return JSON.stringify(nextSource) === JSON.stringify(existingSource);\n}\n\nfunction isSameChunkSet(nextChunks: KnowledgeChunk[], existingChunks: KnowledgeChunk[]): boolean {\n if (nextChunks.length !== existingChunks.length) return false;\n\n const existingById = new Map(existingChunks.map((chunk) => [chunk.id, chunk]));\n\n return nextChunks.every((chunk) => {\n const existing = existingById.get(chunk.id);\n return existing !== undefined && JSON.stringify(existing) === JSON.stringify(chunk);\n });\n}\n\nfunction groupChunksBySource(chunks: KnowledgeChunk[]): Map<string, KnowledgeChunk[]> {\n const grouped = new Map<string, KnowledgeChunk[]>();\n\n for (const chunk of chunks) {\n const group = grouped.get(chunk.source.path) ?? [];\n group.push(chunk);\n grouped.set(chunk.source.path, group);\n }\n\n return grouped;\n}\n","import { createHash } from \"node:crypto\";\n\nexport function sha256(input: string | Buffer): string {\n return createHash(\"sha256\").update(input).digest(\"hex\");\n}\n\nexport function shortHash(input: string | Buffer, length = 16): string {\n return sha256(input).slice(0, length);\n}\n","import { shortHash } from \"./hash.js\";\nimport type { KnowledgeChunk, LoadedKnowledgeDocument, ResolvedKnowledgeConfig } from \"./types.js\";\n\nexport function chunkDocument(\n document: LoadedKnowledgeDocument,\n config: Pick<ResolvedKnowledgeConfig, \"chunking\">,\n indexedAt = new Date().toISOString(),\n): KnowledgeChunk[] {\n const chunks: KnowledgeChunk[] = [];\n\n for (const section of document.sections) {\n const parts = splitText(section.text, config.chunking.maxCharacters, config.chunking.overlapCharacters);\n\n parts.forEach((text, partIndex) => {\n const contentHash = shortHash(text, 32);\n const ordinal = chunks.length;\n chunks.push({\n id: createChunkId(document.source.path, section.headingPath, section.ordinal, partIndex, contentHash),\n source: document.source,\n text,\n headingPath: section.headingPath,\n ordinal,\n contentHash,\n tokenCount: estimateTokenCount(text),\n charCount: text.length,\n indexedAt,\n });\n });\n }\n\n return chunks;\n}\n\nexport function createChunkId(\n sourcePath: string,\n headingPath: string[],\n sectionOrdinal: number,\n partOrdinal: number,\n contentHash: string,\n): string {\n return `chk_${shortHash(\n [sourcePath, headingPath.join(\" > \"), sectionOrdinal, partOrdinal, contentHash].join(\"\\n\"),\n 24,\n )}`;\n}\n\nfunction splitText(text: string, maxCharacters: number, overlapCharacters: number): string[] {\n const normalized = text.trim();\n if (!normalized) return [];\n if (normalized.length <= maxCharacters) return [normalized];\n\n const parts: string[] = [];\n let start = 0;\n\n while (start < normalized.length) {\n const hardEnd = Math.min(start + maxCharacters, normalized.length);\n const end = chooseBreak(normalized, start, hardEnd);\n const part = normalized.slice(start, end).trim();\n\n if (part) parts.push(part);\n if (end >= normalized.length) break;\n\n start = Math.max(end - overlapCharacters, start + 1);\n }\n\n return parts;\n}\n\nfunction chooseBreak(text: string, start: number, hardEnd: number): number {\n if (hardEnd >= text.length) return text.length;\n\n const window = text.slice(start, hardEnd);\n const paragraphBreak = window.lastIndexOf(\"\\n\\n\");\n if (paragraphBreak > Math.floor(window.length * 0.5)) {\n return start + paragraphBreak;\n }\n\n const sentenceBreak = Math.max(window.lastIndexOf(\". \"), window.lastIndexOf(\"? \"), window.lastIndexOf(\"! \"));\n if (sentenceBreak > Math.floor(window.length * 0.5)) {\n return start + sentenceBreak + 1;\n }\n\n const wordBreak = window.lastIndexOf(\" \");\n if (wordBreak > Math.floor(window.length * 0.5)) {\n return start + wordBreak;\n }\n\n return hardEnd;\n}\n\nfunction estimateTokenCount(text: string): number {\n return Math.ceil(text.length / 4);\n}\n","import path from \"node:path\";\nimport type { KnowledgeConfig, ResolvedKnowledgeConfig } from \"./types.js\";\n\nexport const defaultIncludePatterns = [\"**/*.{md,mdx,txt,json,yaml,yml}\"];\n\nexport const defaultIgnorePatterns = [\n \".git/**\",\n \"node_modules/**\",\n \"dist/**\",\n \"build/**\",\n \".next/**\",\n \".nuxt/**\",\n \".output/**\",\n \".vercel/**\",\n \".turbo/**\",\n \".cache/**\",\n \".eve-knowledge/**\",\n \"**/.env\",\n \"**/.env.*\",\n \"**/*.pem\",\n \"**/*.key\",\n \"**/*secret*\",\n \"**/*credential*\",\n];\n\nexport const defaultMaxFileBytes = 256 * 1024;\n\nexport const defaultChunking = {\n maxCharacters: 1_600,\n overlapCharacters: 160,\n};\n\nexport function defineKnowledgeConfig(config: KnowledgeConfig): KnowledgeConfig {\n return config;\n}\n\nexport function resolveKnowledgeConfig(\n config: KnowledgeConfig = {},\n cwd = process.cwd(),\n): ResolvedKnowledgeConfig {\n const rootDir = path.resolve(cwd, config.rootDir ?? \".\");\n const agentDir = path.resolve(rootDir, config.agentDir ?? \"agent\");\n const knowledgeDir = path.resolve(rootDir, config.knowledgeDir ?? \"agent/knowledge\");\n const storeDir = path.resolve(rootDir, config.storeDir ?? \".eve-knowledge\");\n const chunking = {\n ...defaultChunking,\n ...config.chunking,\n };\n\n if (chunking.maxCharacters <= 0) {\n throw new Error(\"chunking.maxCharacters must be greater than 0\");\n }\n\n if (chunking.overlapCharacters < 0) {\n throw new Error(\"chunking.overlapCharacters must be zero or greater\");\n }\n\n if (chunking.overlapCharacters >= chunking.maxCharacters) {\n throw new Error(\"chunking.overlapCharacters must be smaller than chunking.maxCharacters\");\n }\n\n return {\n rootDir,\n agentDir,\n knowledgeDir,\n storeDir,\n include: config.include ?? defaultIncludePatterns,\n ignore: [...defaultIgnorePatterns, ...(config.ignore ?? [])],\n maxFileBytes: config.maxFileBytes ?? defaultMaxFileBytes,\n chunking,\n redaction: {\n mode: config.redaction?.mode ?? \"warn\",\n },\n memory: config.memory ?? { enabled: false },\n };\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { toRepoPath } from \"./fs-utils.js\";\nimport { parse as parseYaml } from \"yaml\";\nimport { parseFrontmatter, normalizeMetadata } from \"./frontmatter.js\";\nimport { detectKnowledgeFormat } from \"./format.js\";\nimport { sha256 } from \"./hash.js\";\nimport { detectSecrets, KnowledgeRedactionError } from \"./redaction.js\";\nimport { sectionFromText, splitMarkdownSections } from \"./sections.js\";\nimport type {\n DocumentMetadata,\n LoadedKnowledgeDocument,\n ResolvedKnowledgeConfig,\n} from \"./types.js\";\n\nexport async function loadKnowledgeDocument(\n filePath: string,\n config: ResolvedKnowledgeConfig,\n): Promise<LoadedKnowledgeDocument | undefined> {\n const format = detectKnowledgeFormat(filePath);\n if (!format) return undefined;\n\n const stat = await fs.stat(filePath);\n const content = await fs.readFile(filePath, \"utf8\");\n const relativePath = toRepoPath(path.relative(config.rootDir, filePath));\n const secrets = detectSecrets(content);\n if (secrets.length > 0 && config.redaction.mode !== \"off\") {\n throw new KnowledgeRedactionError(\n config.redaction.mode === \"fail\" ? \"error\" : \"warning\",\n relativePath,\n secrets,\n );\n }\n\n const contentHash = sha256(content);\n const modifiedTime = stat.mtime.toISOString();\n let metadata: DocumentMetadata = {};\n let body = content;\n\n if (format === \"markdown\" || format === \"mdx\") {\n const parsed = parseFrontmatter(content);\n metadata = parsed.metadata;\n body = parsed.body;\n } else if (format === \"json\") {\n const parsed = JSON.parse(content) as unknown;\n metadata = normalizeMetadata(parsed);\n body = JSON.stringify(parsed, null, 2);\n } else if (format === \"yaml\") {\n const parsed = parseYaml(content);\n metadata = normalizeMetadata(parsed);\n body = parsed === null || parsed === undefined ? \"\" : JSON.stringify(parsed, null, 2);\n }\n\n return {\n source: {\n path: relativePath,\n format,\n contentHash,\n modifiedTime,\n sizeBytes: stat.size,\n metadata,\n },\n sections:\n format === \"markdown\" || format === \"mdx\"\n ? splitMarkdownSections(body)\n : sectionFromText(body),\n };\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\n\nexport function toRepoPath(filePath: string): string {\n return filePath.split(path.sep).join(\"/\");\n}\n\nexport function isMissingFileError(error: unknown): boolean {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n (error as { code?: unknown }).code === \"ENOENT\"\n );\n}\n\nexport async function pathExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n","import { parse as parseYaml } from \"yaml\";\nimport type { DocumentMetadata, MetadataPrimitive } from \"./types.js\";\n\nexport interface FrontmatterResult {\n body: string;\n metadata: DocumentMetadata;\n}\n\nconst frontmatterPattern = /^---\\r?\\n([\\s\\S]*?)\\r?\\n---\\r?\\n?/;\n\nexport function parseFrontmatter(content: string): FrontmatterResult {\n const match = frontmatterPattern.exec(content);\n if (!match) {\n return { body: content, metadata: {} };\n }\n\n const yamlText = match[1] ?? \"\";\n const parsed = parseYaml(yamlText);\n\n return {\n body: content.slice(match[0].length),\n metadata: normalizeMetadata(parsed),\n };\n}\n\nexport function normalizeMetadata(value: unknown): DocumentMetadata {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return {};\n }\n\n const metadata: DocumentMetadata = {};\n\n for (const [key, rawValue] of Object.entries(value)) {\n const normalized = normalizeMetadataValue(rawValue);\n if (normalized !== undefined) {\n metadata[key] = normalized;\n }\n }\n\n return metadata;\n}\n\nfunction normalizeMetadataValue(\n value: unknown,\n): MetadataPrimitive | MetadataPrimitive[] | undefined {\n if (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\n return value;\n }\n\n if (Array.isArray(value)) {\n const normalized = value.filter(isMetadataPrimitive);\n return normalized.length > 0 ? normalized : undefined;\n }\n\n return undefined;\n}\n\nfunction isMetadataPrimitive(value: unknown): value is MetadataPrimitive {\n return typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\";\n}\n","import path from \"node:path\";\nimport type { KnowledgeFileFormat } from \"./types.js\";\n\nexport function detectKnowledgeFormat(filePath: string): KnowledgeFileFormat | undefined {\n const ext = path.extname(filePath).toLowerCase();\n\n if (ext === \".md\") return \"markdown\";\n if (ext === \".mdx\") return \"mdx\";\n if (ext === \".txt\") return \"text\";\n if (ext === \".json\") return \"json\";\n if (ext === \".yaml\" || ext === \".yml\") return \"yaml\";\n\n return undefined;\n}\n","export interface SecretFinding {\n label: string;\n index: number;\n preview: string;\n}\n\nexport class KnowledgeRedactionError extends Error {\n constructor(\n readonly level: \"warning\" | \"error\",\n readonly path: string,\n readonly findings: SecretFinding[],\n ) {\n super(`Possible secret detected (${findings.map((finding) => finding.label).join(\", \")}).`);\n this.name = \"KnowledgeRedactionError\";\n }\n}\n\nconst secretPatterns: Array<{ label: string; pattern: RegExp }> = [\n { label: \"openai_api_key\", pattern: /\\bsk-[A-Za-z0-9_-]{20,}\\b/g },\n { label: \"anthropic_api_key\", pattern: /\\bsk-ant-[A-Za-z0-9_-]{20,}\\b/g },\n { label: \"github_token\", pattern: /\\bgh[pousr]_[A-Za-z0-9_]{20,}\\b/g },\n { label: \"private_key\", pattern: /-----BEGIN [A-Z ]*PRIVATE KEY-----/g },\n {\n label: \"env_secret_assignment\",\n pattern: /\\b[A-Z0-9_]*(?:SECRET|TOKEN|API_KEY|PASSWORD)[A-Z0-9_]*\\s*=\\s*[\"']?[^\"'\\s]{8,}/g,\n },\n];\n\nexport function detectSecrets(content: string): SecretFinding[] {\n const findings: SecretFinding[] = [];\n\n for (const { label, pattern } of secretPatterns) {\n pattern.lastIndex = 0;\n for (const match of content.matchAll(pattern)) {\n findings.push({\n label,\n index: match.index ?? 0,\n preview: maskSecret(match[0] ?? \"\"),\n });\n }\n }\n\n return findings;\n}\n\nfunction maskSecret(value: string): string {\n if (value.length <= 8) return \"[redacted]\";\n return `${value.slice(0, 4)}...${value.slice(-4)}`;\n}\n","import type { KnowledgeSection } from \"./types.js\";\n\ninterface HeadingState {\n level: number;\n title: string;\n}\n\nconst markdownHeadingPattern = /^(#{1,6})\\s+(.+?)\\s*#*\\s*$/;\n\nexport function splitMarkdownSections(content: string): KnowledgeSection[] {\n const sections: KnowledgeSection[] = [];\n const headingStack: HeadingState[] = [];\n let currentLines: string[] = [];\n let currentHeadingPath: string[] = [];\n let ordinal = 0;\n\n for (const line of content.split(/\\r?\\n/)) {\n const heading = markdownHeadingPattern.exec(line);\n\n if (heading) {\n pushSection();\n const level = heading[1]?.length ?? 1;\n const title = normalizeHeadingTitle(heading[2] ?? \"\");\n\n while (headingStack.length > 0 && headingStack[headingStack.length - 1]!.level >= level) {\n headingStack.pop();\n }\n\n headingStack.push({ level, title });\n currentHeadingPath = headingStack.map((entry) => entry.title);\n currentLines = [];\n continue;\n }\n\n currentLines.push(line);\n }\n\n pushSection();\n\n if (sections.length === 0) {\n return [{ text: \"\", headingPath: [], ordinal: 0 }];\n }\n\n return sections;\n\n function pushSection(): void {\n const text = currentLines.join(\"\\n\").trim();\n if (!text) {\n currentLines = [];\n return;\n }\n\n sections.push({\n text,\n headingPath: currentHeadingPath,\n ordinal,\n });\n ordinal += 1;\n currentLines = [];\n }\n}\n\nexport function sectionFromText(content: string): KnowledgeSection[] {\n return [\n {\n text: content.trim(),\n headingPath: [],\n ordinal: 0,\n },\n ];\n}\n\nfunction normalizeHeadingTitle(title: string): string {\n return title.replace(/\\s+/g, \" \").trim();\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport fg from \"fast-glob\";\nimport ignore from \"ignore\";\nimport { isMissingFileError, toRepoPath } from \"./fs-utils.js\";\nimport type { IndexIssue, ResolvedKnowledgeConfig } from \"./types.js\";\n\nexport interface ScanResult {\n files: string[];\n skipped: IndexIssue[];\n warnings: IndexIssue[];\n errors: IndexIssue[];\n}\n\nexport async function scanKnowledgeFiles(config: ResolvedKnowledgeConfig): Promise<ScanResult> {\n const builtInIg = ignore().add(config.ignore);\n const userIg = ignore().add(await readEveKnowledgeIgnore(config));\n const rootRealPath = await fs.realpath(config.rootDir);\n const knowledgeRealPath = await fs.realpath(config.knowledgeDir);\n const entries = await fg(config.include, {\n cwd: config.knowledgeDir,\n absolute: true,\n onlyFiles: true,\n dot: true,\n followSymbolicLinks: false,\n unique: true,\n });\n\n const files: string[] = [];\n const skipped: IndexIssue[] = [];\n const warnings: IndexIssue[] = [];\n const errors: IndexIssue[] = [];\n\n for (const filePath of entries.sort()) {\n const relativeToRoot = toRepoPath(path.relative(config.rootDir, filePath));\n const relativeToKnowledge = toRepoPath(path.relative(config.knowledgeDir, filePath));\n\n const lstat = await fs.lstat(filePath);\n if (lstat.isSymbolicLink()) {\n skipped.push(issue(\"warning\", relativeToRoot, \"symlink_skipped\", \"Symlinks are not indexed.\"));\n continue;\n }\n\n const realPath = await fs.realpath(filePath);\n if (!isInside(realPath, knowledgeRealPath) || !isInside(realPath, rootRealPath)) {\n skipped.push(issue(\"warning\", relativeToRoot, \"path_escape\", \"File resolves outside the knowledge tree.\"));\n continue;\n }\n\n if (\n builtInIg.ignores(relativeToRoot) ||\n builtInIg.ignores(relativeToKnowledge) ||\n userIg.ignores(relativeToRoot) ||\n userIg.ignores(relativeToKnowledge)\n ) {\n skipped.push(issue(\"info\", relativeToRoot, \"ignored\", \"File matched .eveknowledgeignore rules.\"));\n continue;\n }\n\n const stat = await fs.stat(filePath);\n if (stat.size > config.maxFileBytes) {\n skipped.push(\n issue(\n \"warning\",\n relativeToRoot,\n \"max_file_size\",\n `File is ${stat.size} bytes, above the ${config.maxFileBytes} byte limit.`,\n ),\n );\n continue;\n }\n\n files.push(filePath);\n }\n\n return { files, skipped, warnings, errors };\n}\n\nasync function readEveKnowledgeIgnore(config: ResolvedKnowledgeConfig): Promise<string[]> {\n const candidates = [\n path.join(config.rootDir, \".eveknowledgeignore\"),\n path.join(config.knowledgeDir, \".eveknowledgeignore\"),\n ];\n const patterns: string[] = [];\n\n for (const filePath of candidates) {\n try {\n const content = await fs.readFile(filePath, \"utf8\");\n patterns.push(\n ...content\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0 && !line.startsWith(\"#\")),\n );\n } catch (error) {\n if (!isMissingFileError(error)) {\n throw error;\n }\n }\n }\n\n return patterns;\n}\n\nfunction issue(level: IndexIssue[\"level\"], filePath: string, code: string, message: string): IndexIssue {\n return { level, path: filePath, code, message };\n}\n\nfunction isInside(candidate: string, directory: string): boolean {\n const relative = path.relative(directory, candidate);\n return relative === \"\" || (!relative.startsWith(\"..\") && !path.isAbsolute(relative));\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { isMissingFileError } from \"../fs-utils.js\";\nimport {\n citationForChunk,\n countSources,\n listSourcePaths,\n matchesMetadataFilters,\n removeChunksBySource,\n replaceChunksBySource,\n} from \"./helpers.js\";\nimport type {\n KnowledgeChunk,\n KnowledgeSearchHit,\n KnowledgeStore,\n StoreSearchInput,\n StoreStats,\n} from \"../types.js\";\n\ninterface LocalStoreData {\n version: 1;\n chunks: KnowledgeChunk[];\n}\n\nexport interface LocalKnowledgeStoreOptions {\n storeDir: string;\n}\n\nexport class LocalKnowledgeStore implements KnowledgeStore {\n readonly name = \"local-json\";\n readonly durability = \"local\";\n\n private readonly filePath: string;\n private data?: LocalStoreData;\n\n constructor(options: LocalKnowledgeStoreOptions) {\n this.filePath = path.join(options.storeDir, \"index.json\");\n }\n\n async upsertChunks(chunks: KnowledgeChunk[]): Promise<void> {\n const data = await this.read();\n data.chunks = replaceChunksBySource(data.chunks, chunks);\n await this.write(data);\n }\n\n async deleteBySource(sourcePath: string): Promise<void> {\n const data = await this.read();\n data.chunks = removeChunksBySource(data.chunks, sourcePath);\n await this.write(data);\n }\n\n async search(input: StoreSearchInput): Promise<KnowledgeSearchHit[]> {\n const data = await this.read();\n const queryTokens = tokenize(input.query);\n if (queryTokens.length === 0) return [];\n\n return data.chunks\n .filter((chunk) => matchesMetadataFilters(chunk, input.filters))\n .map((chunk) => ({\n chunk,\n score: scoreChunk(chunk, queryTokens),\n citation: citationForChunk(chunk),\n }))\n .filter((hit) => hit.score > 0)\n .sort((a, b) => b.score - a.score || a.chunk.source.path.localeCompare(b.chunk.source.path))\n .slice(0, input.topK);\n }\n\n async stats(): Promise<StoreStats> {\n const data = await this.read();\n return {\n chunks: data.chunks.length,\n sources: countSources(data.chunks),\n storePath: this.filePath,\n durability: this.durability,\n };\n }\n\n async listChunks(): Promise<KnowledgeChunk[]> {\n const data = await this.read();\n return [...data.chunks];\n }\n\n async listSources(): Promise<string[]> {\n const data = await this.read();\n return listSourcePaths(data.chunks);\n }\n\n private async read(): Promise<LocalStoreData> {\n if (this.data) return this.data;\n\n try {\n const content = await fs.readFile(this.filePath, \"utf8\");\n this.data = JSON.parse(content) as LocalStoreData;\n } catch (error) {\n if (!isMissingFileError(error)) throw error;\n this.data = { version: 1, chunks: [] };\n }\n\n return this.data;\n }\n\n private async write(data: LocalStoreData): Promise<void> {\n await fs.mkdir(path.dirname(this.filePath), { recursive: true });\n const tempPath = `${this.filePath}.${process.pid}.${Date.now()}.${Math.random()\n .toString(36)\n .slice(2)}.tmp`;\n await fs.writeFile(tempPath, `${JSON.stringify(data, null, 2)}\\n`);\n await fs.rename(tempPath, this.filePath);\n this.data = data;\n }\n}\n\nexport function createLocalKnowledgeStore(options: LocalKnowledgeStoreOptions): LocalKnowledgeStore {\n return new LocalKnowledgeStore(options);\n}\n\nfunction scoreChunk(chunk: KnowledgeChunk, queryTokens: string[]): number {\n const haystack = tokenize(\n [\n chunk.text,\n chunk.headingPath.join(\" \"),\n chunk.source.path,\n Object.values(chunk.source.metadata).flat().join(\" \"),\n ].join(\" \"),\n );\n const haystackCounts = new Map<string, number>();\n\n for (const token of haystack) {\n haystackCounts.set(token, (haystackCounts.get(token) ?? 0) + 1);\n }\n\n let score = 0;\n for (const token of queryTokens) {\n score += haystackCounts.get(token) ?? 0;\n }\n\n if (queryTokens.some((token) => chunk.source.path.toLowerCase().includes(token))) {\n score += 0.25;\n }\n\n return score / queryTokens.length;\n}\n\nfunction tokenize(input: string): string[] {\n return input\n .toLowerCase()\n .split(/[^a-z0-9]+/)\n .filter((token) => token.length > 1);\n}\n","import type { Citation, KnowledgeChunk, MetadataFilter } from \"../types.js\";\n\nexport function replaceChunksBySource(existing: KnowledgeChunk[], incoming: KnowledgeChunk[]): KnowledgeChunk[] {\n const incomingSourcePaths = new Set(incoming.map((chunk) => chunk.source.path));\n const incomingIds = new Set(incoming.map((chunk) => chunk.id));\n return [\n ...existing.filter(\n (chunk) => !incomingSourcePaths.has(chunk.source.path) && !incomingIds.has(chunk.id),\n ),\n ...incoming,\n ].sort((a, b) => a.id.localeCompare(b.id));\n}\n\nexport function removeChunksBySource(chunks: KnowledgeChunk[], sourcePath: string): KnowledgeChunk[] {\n return chunks.filter((chunk) => chunk.source.path !== sourcePath);\n}\n\nexport function citationForChunk(chunk: KnowledgeChunk): Citation {\n return {\n path: chunk.source.path,\n chunkId: chunk.id,\n indexedAt: chunk.indexedAt,\n ...(chunk.headingPath.length > 0 ? { heading: chunk.headingPath.join(\" > \") } : {}),\n };\n}\n\nexport function countSources(chunks: KnowledgeChunk[]): number {\n return listSourcePaths(chunks).length;\n}\n\nexport function listSourcePaths(chunks: KnowledgeChunk[]): string[] {\n return [...new Set(chunks.map((chunk) => chunk.source.path))].sort();\n}\n\nexport function matchesMetadataFilters(chunk: KnowledgeChunk, filters?: MetadataFilter): boolean {\n if (!filters) return true;\n\n for (const [key, expected] of Object.entries(filters)) {\n const actual = chunk.source.metadata[key];\n if (actual === undefined) return false;\n\n const expectedValues = Array.isArray(expected) ? expected : [expected];\n const actualValues = Array.isArray(actual) ? actual : [actual];\n\n if (!expectedValues.some((value) => actualValues.includes(value))) {\n return false;\n }\n }\n\n return true;\n}\n","import { indexKnowledge } from \"./indexer.js\";\nimport type { IndexIssue, IndexSummary, KnowledgeConfig, KnowledgeStore } from \"./types.js\";\n\nexport interface CheckKnowledgeOptions {\n config?: KnowledgeConfig;\n store?: KnowledgeStore;\n cwd?: string;\n production?: boolean;\n}\n\nexport interface CheckKnowledgeResult {\n ok: boolean;\n summary: IndexSummary;\n issues: IndexIssue[];\n}\n\nexport async function checkKnowledge(options: CheckKnowledgeOptions = {}): Promise<CheckKnowledgeResult> {\n const store = options.store;\n const summary = await indexKnowledge({\n ...(options.cwd ? { cwd: options.cwd } : {}),\n config: {\n ...options.config,\n redaction: {\n ...options.config?.redaction,\n mode: \"fail\",\n },\n },\n ...(store ? { store } : {}),\n dryRun: true,\n });\n const issues: IndexIssue[] = [...summary.errors];\n\n if (summary.sourcesChanged > 0 || summary.sourcesDeleted > 0) {\n issues.push({\n level: \"error\",\n code: \"stale_index\",\n message: `${summary.sourcesChanged} sources changed and ${summary.sourcesDeleted} sources were deleted. Run eve-knowledge index before shipping.`,\n });\n }\n\n if (options.production) {\n const durability = options.store?.durability ?? summary.store.durability;\n if (durability !== \"durable\") {\n issues.push({\n level: \"error\",\n code: \"non_durable_store\",\n message: \"Production checks require a durable KnowledgeStore. Local filesystem storage is not durable in serverless deployments.\",\n });\n }\n }\n\n return {\n ok: issues.length === 0,\n summary,\n issues,\n };\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport type { KnowledgeConfig } from \"./types.js\";\n\nconst safeConfigFileNames = [\"eve-knowledge.config.json\"];\nconst trustedConfigFileNames = [\"eve-knowledge.config.ts\", \"eve-knowledge.config.mjs\", \"eve-knowledge.config.js\"];\n\nexport interface LoadKnowledgeConfigOptions {\n cwd?: string;\n trustedConfig?: boolean;\n}\n\nexport async function loadKnowledgeConfig(options: LoadKnowledgeConfigOptions = {}): Promise<KnowledgeConfig> {\n const cwd = options.cwd ?? process.cwd();\n const safeConfigPath = await findConfigPath(cwd, safeConfigFileNames);\n if (safeConfigPath) {\n return JSON.parse(await fs.readFile(safeConfigPath, \"utf8\")) as KnowledgeConfig;\n }\n\n const configPath = await findConfigPath(cwd, trustedConfigFileNames);\n if (!configPath) return {};\n if (!options.trustedConfig) {\n throw new Error(\n `Refusing to execute ${path.basename(configPath)}. Use --trusted-config for trusted local config, or use eve-knowledge.config.json for CI.`,\n );\n }\n\n const loaded = (await import(pathToFileURL(configPath).href)) as {\n default?: KnowledgeConfig;\n };\n\n return loaded.default ?? {};\n}\n\nasync function findConfigPath(cwd: string, fileNames: string[]): Promise<string | undefined> {\n for (const fileName of fileNames) {\n const filePath = path.join(cwd, fileName);\n try {\n await fs.access(filePath);\n return filePath;\n } catch {\n // Try the next supported config filename.\n }\n }\n\n return undefined;\n}\n","import { resolveKnowledgeConfig } from \"./config.js\";\nimport { createLocalKnowledgeStore } from \"./store/local.js\";\nimport type {\n KnowledgeConfig,\n KnowledgeSearchResponse,\n KnowledgeStore,\n SearchKnowledgeInput,\n} from \"./types.js\";\n\nexport interface SearchKnowledgeOptions {\n config?: KnowledgeConfig;\n store?: KnowledgeStore;\n cwd?: string;\n maxResults?: number;\n}\n\nexport async function searchKnowledge(\n input: SearchKnowledgeInput,\n options: SearchKnowledgeOptions = {},\n): Promise<KnowledgeSearchResponse> {\n const config = resolveKnowledgeConfig(options.config, options.cwd);\n const store = options.store ?? createLocalKnowledgeStore({ storeDir: config.storeDir });\n const topK = Math.min(Math.max(input.topK ?? options.maxResults ?? 5, 1), 20);\n const results = await store.search({\n query: input.query,\n topK,\n ...(input.filters ? { filters: input.filters } : {}),\n });\n\n if (results.length === 0) {\n return {\n status: \"no_results\",\n query: input.query,\n message:\n \"No relevant knowledge results were found. Do not fabricate an answer; ask for source material or say you do not know.\",\n };\n }\n\n return {\n status: \"results\",\n query: input.query,\n results,\n };\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { defaultIgnorePatterns } from \"./config.js\";\nimport { pathExists } from \"./fs-utils.js\";\nimport { detectEveProject } from \"./project.js\";\n\nexport interface ScaffoldOptions {\n cwd: string;\n dryRun?: boolean;\n force?: boolean;\n allowNonEve?: boolean;\n}\n\nexport interface ScaffoldFile {\n path: string;\n content: string;\n}\n\nexport interface ScaffoldResult {\n files: ScaffoldFile[];\n written: string[];\n skipped: string[];\n}\n\nexport async function scaffoldEveKnowledge(options: ScaffoldOptions): Promise<ScaffoldResult> {\n const detection = await detectEveProject(options.cwd);\n if (!detection.isEveProject && !options.allowNonEve) {\n throw new Error(\n \"No Eve project detected. Run this inside an Eve app or pass --allow-non-eve to scaffold anyway.\",\n );\n }\n\n const files = scaffoldFiles();\n const written: string[] = [];\n const skipped: string[] = [];\n\n for (const file of files) {\n const absolutePath = path.join(options.cwd, file.path);\n const exists = await pathExists(absolutePath);\n\n if (exists && !options.force) {\n skipped.push(file.path);\n continue;\n }\n\n if (!options.dryRun) {\n await fs.mkdir(path.dirname(absolutePath), { recursive: true });\n await fs.writeFile(absolutePath, file.content);\n }\n\n written.push(file.path);\n }\n\n return { files, written, skipped };\n}\n\nexport function scaffoldFiles(): ScaffoldFile[] {\n return [\n {\n path: \"agent/knowledge/README.md\",\n content: knowledgeReadme(),\n },\n {\n path: \"agent/knowledge/.eveknowledgeignore\",\n content: `${defaultIgnorePatterns.join(\"\\n\")}\\n`,\n },\n {\n path: \"agent/tools/search_knowledge.ts\",\n content: searchKnowledgeTool(),\n },\n {\n path: \"agent/skills/answer-with-citations.md\",\n content: citationSkill(),\n },\n {\n path: \"eve-knowledge.config.json\",\n content: configFile(),\n },\n ];\n}\n\nfunction knowledgeReadme(): string {\n return `# Agent Knowledge\n\nPlace reference docs for this Eve agent here. This folder is indexed by eve-knowledge; Eve core does not currently load agent/knowledge as a native slot.\n\nRecommended folders:\n\n- product/\n- runbooks/\n- decisions/\n- policies/\n\nDo not store credentials, private customer data, or regulated records here unless your team has consent, retention, deletion, and access-control rules in place.\n`;\n}\n\nfunction searchKnowledgeTool(): string {\n return `import { defineTool } from \"eve/tools\";\nimport { parseSearchKnowledgeInput, searchKnowledge, toModelOutput } from \"eve-knowledge\";\n\nconst inputSchema = {\n type: \"object\",\n properties: {\n query: {\n type: \"string\",\n minLength: 1,\n description: \"The natural-language knowledge search query.\",\n },\n topK: {\n type: \"integer\",\n minimum: 1,\n maximum: 10,\n description: \"Maximum number of cited chunks to return.\",\n },\n filters: {\n type: \"object\",\n additionalProperties: true,\n description: \"Optional metadata filters such as audience, tenant, or product.\",\n },\n },\n required: [\"query\"],\n additionalProperties: false,\n} as const;\n\nexport default defineTool({\n description: \"Search the agent knowledge base and return cited results.\",\n inputSchema,\n async execute(input) {\n return searchKnowledge(parseSearchKnowledgeInput(input));\n },\n toModelOutput(output) {\n return toModelOutput(output);\n },\n});\n`;\n}\n\nfunction citationSkill(): string {\n return `---\ndescription: Answer using retrieved eve-knowledge citations.\n---\n\n# Answer With Citations\n\nWhen answering from knowledge search results:\n\n- Use only the retrieved evidence.\n- Cite repo-relative source paths and headings when available.\n- If the evidence is missing or weak, say you do not know.\n- Do not expose secrets, raw private data, or unrelated chunks.\n`;\n}\n\nfunction configFile(): string {\n return `{\n \"knowledgeDir\": \"agent/knowledge\",\n \"storeDir\": \".eve-knowledge\",\n \"redaction\": {\n \"mode\": \"warn\"\n }\n}\n`;\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { pathExists } from \"./fs-utils.js\";\n\nexport interface EveProjectDetection {\n isEveProject: boolean;\n signals: string[];\n}\n\nexport async function detectEveProject(cwd: string): Promise<EveProjectDetection> {\n const signals: string[] = [];\n const agentDir = path.join(cwd, \"agent\");\n\n if (await pathExists(agentDir)) {\n signals.push(\"agent/\");\n }\n\n for (const filePath of [\"agent/agent.ts\", \"agent/instructions.md\", \"agent/tools\"]) {\n if (await pathExists(path.join(cwd, filePath))) {\n signals.push(filePath);\n }\n }\n\n if (await packageHasEveDependency(path.join(cwd, \"package.json\"))) {\n signals.push(\"package.json:eve\");\n }\n\n return {\n isEveProject: signals.some((signal) => signal !== \"agent/\"),\n signals,\n };\n}\n\nasync function packageHasEveDependency(filePath: string): Promise<boolean> {\n try {\n const pkg = JSON.parse(await fs.readFile(filePath, \"utf8\")) as {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n };\n return Boolean(pkg.dependencies?.eve ?? pkg.devDependencies?.eve);\n } catch {\n return false;\n }\n}\n","export { defineKnowledgeConfig, resolveKnowledgeConfig } from \"./config.js\";\nexport { checkKnowledge } from \"./check.js\";\nexport { loadKnowledgeConfig } from \"./config-loader.js\";\nexport { chunkDocument, createChunkId } from \"./chunk.js\";\nexport { detectKnowledgeFormat } from \"./format.js\";\nexport { indexKnowledge } from \"./indexer.js\";\nexport { parseSearchKnowledgeInput, searchKnowledgeInputSchema } from \"./input.js\";\nexport { runKnowledgeEvals } from \"./evals.js\";\nexport type { EvalCase, EvalResult, RunEvalOptions } from \"./evals.js\";\nexport { loadKnowledgeDocument } from \"./loader.js\";\nexport { toModelOutput } from \"./model-output.js\";\nexport { scanKnowledgeFiles } from \"./scan.js\";\nexport { scaffoldEveKnowledge, scaffoldFiles } from \"./scaffold.js\";\nexport { searchKnowledge } from \"./search.js\";\nexport { LocalKnowledgeStore, createLocalKnowledgeStore } from \"./store/local.js\";\nexport {\n citationForChunk,\n countSources,\n listSourcePaths,\n matchesMetadataFilters,\n removeChunksBySource,\n replaceChunksBySource,\n} from \"./store/helpers.js\";\nexport { detectSecrets } from \"./redaction.js\";\nexport type {\n Citation,\n ChunkingConfig,\n DocumentMetadata,\n EmbeddingProvider,\n IndexIssue,\n IndexSummary,\n KnowledgeChunk,\n KnowledgeConfig,\n KnowledgeFileFormat,\n KnowledgeSearchHit,\n KnowledgeSearchResponse,\n KnowledgeSection,\n KnowledgeSource,\n KnowledgeStore,\n KnowledgeStoreDurability,\n MemoryConfig,\n MetadataFilter,\n RedactionConfig,\n RedactionMode,\n ResolvedKnowledgeConfig,\n SearchKnowledgeInput,\n SearchOptions,\n StoreSearchInput,\n StoreStats,\n LoadedKnowledgeDocument,\n} from \"./types.js\";\n\nexport const version = \"0.1.0\";\n"],"mappings":"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","names":["fs","path","path","parseYaml","path","path","fs","path","parseYaml","fs","path","fs","path","fs","path","path","fs","issue","sourcePath","fs","path","fs","path","fs","path","path","fs","path","fs"]}
@@ -0,0 +1,287 @@
1
+ import { z } from 'zod';
2
+
3
+ type KnowledgeFileFormat = "markdown" | "mdx" | "text" | "json" | "yaml";
4
+ type MetadataPrimitive = string | number | boolean;
5
+ type DocumentMetadata = Record<string, MetadataPrimitive | MetadataPrimitive[]>;
6
+ interface KnowledgeSource {
7
+ path: string;
8
+ format: KnowledgeFileFormat;
9
+ contentHash: string;
10
+ modifiedTime: string;
11
+ sizeBytes: number;
12
+ metadata: DocumentMetadata;
13
+ }
14
+ interface KnowledgeSection {
15
+ text: string;
16
+ headingPath: string[];
17
+ ordinal: number;
18
+ }
19
+ interface LoadedKnowledgeDocument {
20
+ source: KnowledgeSource;
21
+ sections: KnowledgeSection[];
22
+ }
23
+ interface Citation {
24
+ path: string;
25
+ heading?: string;
26
+ chunkId: string;
27
+ indexedAt: string;
28
+ }
29
+ interface KnowledgeChunk {
30
+ id: string;
31
+ source: KnowledgeSource;
32
+ text: string;
33
+ headingPath: string[];
34
+ ordinal: number;
35
+ contentHash: string;
36
+ tokenCount: number;
37
+ charCount: number;
38
+ indexedAt: string;
39
+ }
40
+ type MetadataFilter = Record<string, MetadataPrimitive | MetadataPrimitive[]>;
41
+ interface StoreSearchInput {
42
+ query: string;
43
+ topK: number;
44
+ filters?: MetadataFilter;
45
+ }
46
+ interface KnowledgeSearchHit {
47
+ chunk: KnowledgeChunk;
48
+ score: number;
49
+ citation: Citation;
50
+ }
51
+ type KnowledgeSearchResponse = {
52
+ status: "results";
53
+ query: string;
54
+ results: KnowledgeSearchHit[];
55
+ } | {
56
+ status: "no_results";
57
+ query: string;
58
+ message: string;
59
+ };
60
+ interface SearchKnowledgeInput {
61
+ query: string;
62
+ topK?: number;
63
+ filters?: MetadataFilter;
64
+ }
65
+ interface SearchOptions {
66
+ maxResults?: number;
67
+ maxSnippetCharacters?: number;
68
+ }
69
+ type KnowledgeStoreDurability = "ephemeral" | "local" | "durable";
70
+ interface StoreStats {
71
+ chunks: number;
72
+ sources: number;
73
+ storePath?: string;
74
+ durability: KnowledgeStoreDurability;
75
+ }
76
+ interface KnowledgeStore {
77
+ readonly name: string;
78
+ readonly durability: KnowledgeStoreDurability;
79
+ upsertChunks(chunks: KnowledgeChunk[]): Promise<void>;
80
+ deleteBySource(sourcePath: string): Promise<void>;
81
+ search(input: StoreSearchInput): Promise<KnowledgeSearchHit[]>;
82
+ stats(): Promise<StoreStats>;
83
+ listChunks?(): Promise<KnowledgeChunk[]>;
84
+ listSources?(): Promise<string[]>;
85
+ close?(): Promise<void>;
86
+ }
87
+ interface EmbeddingProvider {
88
+ readonly name: string;
89
+ embedBatch(texts: string[]): Promise<number[][]>;
90
+ }
91
+ interface ChunkingConfig {
92
+ maxCharacters: number;
93
+ overlapCharacters: number;
94
+ }
95
+ type RedactionMode = "warn" | "fail" | "off";
96
+ interface RedactionConfig {
97
+ mode: RedactionMode;
98
+ }
99
+ interface MemoryConfig {
100
+ enabled: false;
101
+ }
102
+ interface KnowledgeConfig {
103
+ rootDir?: string;
104
+ agentDir?: string;
105
+ knowledgeDir?: string;
106
+ storeDir?: string;
107
+ include?: string[];
108
+ ignore?: string[];
109
+ maxFileBytes?: number;
110
+ chunking?: Partial<ChunkingConfig>;
111
+ redaction?: Partial<RedactionConfig>;
112
+ memory?: MemoryConfig;
113
+ }
114
+ interface ResolvedKnowledgeConfig {
115
+ rootDir: string;
116
+ agentDir: string;
117
+ knowledgeDir: string;
118
+ storeDir: string;
119
+ include: string[];
120
+ ignore: string[];
121
+ maxFileBytes: number;
122
+ chunking: ChunkingConfig;
123
+ redaction: RedactionConfig;
124
+ memory: MemoryConfig;
125
+ }
126
+ type IndexIssueLevel = "info" | "warning" | "error";
127
+ interface IndexIssue {
128
+ level: IndexIssueLevel;
129
+ path?: string;
130
+ code: string;
131
+ message: string;
132
+ }
133
+ interface IndexSummary {
134
+ filesScanned: number;
135
+ filesIndexed: number;
136
+ filesSkipped: number;
137
+ chunksCreated: number;
138
+ chunksReused: number;
139
+ sourcesChanged: number;
140
+ sourcesDeleted: number;
141
+ warnings: IndexIssue[];
142
+ errors: IndexIssue[];
143
+ elapsedMs: number;
144
+ store: StoreStats;
145
+ }
146
+
147
+ declare function defineKnowledgeConfig(config: KnowledgeConfig): KnowledgeConfig;
148
+ declare function resolveKnowledgeConfig(config?: KnowledgeConfig, cwd?: string): ResolvedKnowledgeConfig;
149
+
150
+ interface CheckKnowledgeOptions {
151
+ config?: KnowledgeConfig;
152
+ store?: KnowledgeStore;
153
+ cwd?: string;
154
+ production?: boolean;
155
+ }
156
+ interface CheckKnowledgeResult {
157
+ ok: boolean;
158
+ summary: IndexSummary;
159
+ issues: IndexIssue[];
160
+ }
161
+ declare function checkKnowledge(options?: CheckKnowledgeOptions): Promise<CheckKnowledgeResult>;
162
+
163
+ interface LoadKnowledgeConfigOptions {
164
+ cwd?: string;
165
+ trustedConfig?: boolean;
166
+ }
167
+ declare function loadKnowledgeConfig(options?: LoadKnowledgeConfigOptions): Promise<KnowledgeConfig>;
168
+
169
+ declare function chunkDocument(document: LoadedKnowledgeDocument, config: Pick<ResolvedKnowledgeConfig, "chunking">, indexedAt?: string): KnowledgeChunk[];
170
+ declare function createChunkId(sourcePath: string, headingPath: string[], sectionOrdinal: number, partOrdinal: number, contentHash: string): string;
171
+
172
+ declare function detectKnowledgeFormat(filePath: string): KnowledgeFileFormat | undefined;
173
+
174
+ interface IndexKnowledgeOptions {
175
+ config?: KnowledgeConfig;
176
+ store?: KnowledgeStore;
177
+ cwd?: string;
178
+ now?: Date;
179
+ dryRun?: boolean;
180
+ }
181
+ declare function indexKnowledge(options?: IndexKnowledgeOptions): Promise<IndexSummary>;
182
+
183
+ declare const searchKnowledgeInputSchema: z.ZodObject<{
184
+ query: z.ZodString;
185
+ topK: z.ZodOptional<z.ZodNumber>;
186
+ filters: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>, z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>]>>>;
187
+ }, z.core.$strict>;
188
+ declare function parseSearchKnowledgeInput(input: unknown): SearchKnowledgeInput;
189
+
190
+ interface EvalCase {
191
+ name: string;
192
+ query: string;
193
+ expectPath?: string;
194
+ expectNoResults?: boolean;
195
+ filters?: Record<string, string | number | boolean | Array<string | number | boolean>>;
196
+ }
197
+ interface EvalResult {
198
+ name: string;
199
+ passed: boolean;
200
+ message: string;
201
+ }
202
+ interface RunEvalOptions {
203
+ cwd?: string;
204
+ config?: KnowledgeConfig;
205
+ cases: EvalCase[];
206
+ }
207
+ declare function runKnowledgeEvals(options: RunEvalOptions): Promise<EvalResult[]>;
208
+
209
+ declare function loadKnowledgeDocument(filePath: string, config: ResolvedKnowledgeConfig): Promise<LoadedKnowledgeDocument | undefined>;
210
+
211
+ interface ModelOutput {
212
+ type: "json";
213
+ value: unknown;
214
+ }
215
+ declare function toModelOutput(output: KnowledgeSearchResponse): ModelOutput;
216
+
217
+ interface ScanResult {
218
+ files: string[];
219
+ skipped: IndexIssue[];
220
+ warnings: IndexIssue[];
221
+ errors: IndexIssue[];
222
+ }
223
+ declare function scanKnowledgeFiles(config: ResolvedKnowledgeConfig): Promise<ScanResult>;
224
+
225
+ interface ScaffoldOptions {
226
+ cwd: string;
227
+ dryRun?: boolean;
228
+ force?: boolean;
229
+ allowNonEve?: boolean;
230
+ }
231
+ interface ScaffoldFile {
232
+ path: string;
233
+ content: string;
234
+ }
235
+ interface ScaffoldResult {
236
+ files: ScaffoldFile[];
237
+ written: string[];
238
+ skipped: string[];
239
+ }
240
+ declare function scaffoldEveKnowledge(options: ScaffoldOptions): Promise<ScaffoldResult>;
241
+ declare function scaffoldFiles(): ScaffoldFile[];
242
+
243
+ interface SearchKnowledgeOptions {
244
+ config?: KnowledgeConfig;
245
+ store?: KnowledgeStore;
246
+ cwd?: string;
247
+ maxResults?: number;
248
+ }
249
+ declare function searchKnowledge(input: SearchKnowledgeInput, options?: SearchKnowledgeOptions): Promise<KnowledgeSearchResponse>;
250
+
251
+ interface LocalKnowledgeStoreOptions {
252
+ storeDir: string;
253
+ }
254
+ declare class LocalKnowledgeStore implements KnowledgeStore {
255
+ readonly name = "local-json";
256
+ readonly durability = "local";
257
+ private readonly filePath;
258
+ private data?;
259
+ constructor(options: LocalKnowledgeStoreOptions);
260
+ upsertChunks(chunks: KnowledgeChunk[]): Promise<void>;
261
+ deleteBySource(sourcePath: string): Promise<void>;
262
+ search(input: StoreSearchInput): Promise<KnowledgeSearchHit[]>;
263
+ stats(): Promise<StoreStats>;
264
+ listChunks(): Promise<KnowledgeChunk[]>;
265
+ listSources(): Promise<string[]>;
266
+ private read;
267
+ private write;
268
+ }
269
+ declare function createLocalKnowledgeStore(options: LocalKnowledgeStoreOptions): LocalKnowledgeStore;
270
+
271
+ declare function replaceChunksBySource(existing: KnowledgeChunk[], incoming: KnowledgeChunk[]): KnowledgeChunk[];
272
+ declare function removeChunksBySource(chunks: KnowledgeChunk[], sourcePath: string): KnowledgeChunk[];
273
+ declare function citationForChunk(chunk: KnowledgeChunk): Citation;
274
+ declare function countSources(chunks: KnowledgeChunk[]): number;
275
+ declare function listSourcePaths(chunks: KnowledgeChunk[]): string[];
276
+ declare function matchesMetadataFilters(chunk: KnowledgeChunk, filters?: MetadataFilter): boolean;
277
+
278
+ interface SecretFinding {
279
+ label: string;
280
+ index: number;
281
+ preview: string;
282
+ }
283
+ declare function detectSecrets(content: string): SecretFinding[];
284
+
285
+ declare const version = "0.1.0";
286
+
287
+ export { type ChunkingConfig, type Citation, type DocumentMetadata, type EmbeddingProvider, type EvalCase, type EvalResult, type IndexIssue, type IndexSummary, type KnowledgeChunk, type KnowledgeConfig, type KnowledgeFileFormat, type KnowledgeSearchHit, type KnowledgeSearchResponse, type KnowledgeSection, type KnowledgeSource, type KnowledgeStore, type KnowledgeStoreDurability, type LoadedKnowledgeDocument, LocalKnowledgeStore, type MemoryConfig, type MetadataFilter, type RedactionConfig, type RedactionMode, type ResolvedKnowledgeConfig, type RunEvalOptions, type SearchKnowledgeInput, type SearchOptions, type StoreSearchInput, type StoreStats, checkKnowledge, chunkDocument, citationForChunk, countSources, createChunkId, createLocalKnowledgeStore, defineKnowledgeConfig, detectKnowledgeFormat, detectSecrets, indexKnowledge, listSourcePaths, loadKnowledgeConfig, loadKnowledgeDocument, matchesMetadataFilters, parseSearchKnowledgeInput, removeChunksBySource, replaceChunksBySource, resolveKnowledgeConfig, runKnowledgeEvals, scaffoldEveKnowledge, scaffoldFiles, scanKnowledgeFiles, searchKnowledge, searchKnowledgeInputSchema, toModelOutput, version };