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.
- package/LICENSE +21 -0
- package/README.md +175 -0
- package/dist/cli.d.ts +6 -0
- package/dist/cli.js +1090 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +287 -0
- package/dist/index.js +1135 -0
- package/dist/index.js.map +1 -0
- package/docs/production-storage.md +92 -0
- package/examples/basic-eve-agent/agent/instructions.md +2 -0
- package/examples/basic-eve-agent/agent/knowledge/product/refunds.md +7 -0
- package/examples/basic-eve-agent/agent/tools/eve-knowledge.d.ts +8 -0
- package/examples/basic-eve-agent/agent/tools/search_knowledge.ts +37 -0
- package/examples/basic-eve-agent/eve-knowledge.config.json +4 -0
- package/examples/basic-eve-agent/package.json +13 -0
- package/examples/basic-eve-agent/production-store-recipe.ts +85 -0
- package/examples/basic-eve-agent/tsconfig.json +15 -0
- package/package.json +76 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/config.ts","../src/indexer.ts","../src/hash.ts","../src/chunk.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/input.ts","../src/search.ts","../src/evals.ts","../src/model-output.ts","../src/scaffold.ts","../src/project.ts","../src/index.ts"],"sourcesContent":["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 { 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 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 { z } from \"zod\";\nimport type { SearchKnowledgeInput } from \"./types.js\";\n\nconst metadataPrimitiveSchema = z.union([z.string(), z.number(), z.boolean()]);\n\nexport const searchKnowledgeInputSchema = z\n .object({\n query: z.string().min(1),\n topK: z.number().int().min(1).max(20).optional(),\n filters: z.record(z.string(), z.union([metadataPrimitiveSchema, z.array(metadataPrimitiveSchema)])).optional(),\n })\n .strict();\n\nexport function parseSearchKnowledgeInput(input: unknown): SearchKnowledgeInput {\n const parsed = searchKnowledgeInputSchema.parse(input);\n return {\n query: parsed.query,\n ...(parsed.topK !== undefined ? { topK: parsed.topK } : {}),\n ...(parsed.filters !== undefined ? { filters: parsed.filters } : {}),\n };\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 { indexKnowledge } from \"./indexer.js\";\nimport { searchKnowledge } from \"./search.js\";\nimport type { KnowledgeConfig } from \"./types.js\";\n\nexport interface EvalCase {\n name: string;\n query: string;\n expectPath?: string;\n expectNoResults?: boolean;\n filters?: Record<string, string | number | boolean | Array<string | number | boolean>>;\n}\n\nexport interface EvalResult {\n name: string;\n passed: boolean;\n message: string;\n}\n\nexport interface RunEvalOptions {\n cwd?: string;\n config?: KnowledgeConfig;\n cases: EvalCase[];\n}\n\nexport async function runKnowledgeEvals(options: RunEvalOptions): Promise<EvalResult[]> {\n await indexKnowledge({\n ...(options.cwd ? { cwd: options.cwd } : {}),\n ...(options.config ? { config: options.config } : {}),\n });\n\n const results: EvalResult[] = [];\n\n for (const testCase of options.cases) {\n const response = await searchKnowledge(\n {\n query: testCase.query,\n ...(testCase.filters ? { filters: testCase.filters } : {}),\n },\n {\n ...(options.cwd ? { cwd: options.cwd } : {}),\n ...(options.config ? { config: options.config } : {}),\n },\n );\n\n if (testCase.expectNoResults) {\n results.push({\n name: testCase.name,\n passed: response.status === \"no_results\",\n message:\n response.status === \"no_results\"\n ? \"No-result behavior matched.\"\n : \"Expected no results but received cited results.\",\n });\n continue;\n }\n\n if (response.status === \"no_results\") {\n results.push({\n name: testCase.name,\n passed: false,\n message: \"Expected cited results but received no_results.\",\n });\n continue;\n }\n\n const matched = testCase.expectPath\n ? response.results.some((result) => result.citation.path === testCase.expectPath)\n : response.results.length > 0;\n\n results.push({\n name: testCase.name,\n passed: matched,\n message: matched ? \"Expected citation found.\" : `Missing citation ${testCase.expectPath}.`,\n });\n }\n\n return results;\n}\n","import type { KnowledgeSearchResponse } from \"./types.js\";\n\nexport interface ModelOutput {\n type: \"json\";\n value: unknown;\n}\n\nexport function toModelOutput(output: KnowledgeSearchResponse): ModelOutput {\n if (output.status === \"no_results\") {\n return {\n type: \"json\",\n value: {\n status: output.status,\n query: output.query,\n message: output.message,\n },\n };\n }\n\n return {\n type: \"json\",\n value: {\n status: output.status,\n query: output.query,\n citations: output.results.map((result) => result.citation),\n results: output.results.slice(0, 5).map((result) => ({\n text: boundText(result.chunk.text, 800),\n score: result.score,\n citation: result.citation,\n })),\n },\n };\n}\n\nfunction boundText(text: string, maxCharacters: number): string {\n if (text.length <= maxCharacters) return text;\n return `${text.slice(0, maxCharacters - 1).trimEnd()}...`;\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,92 @@
|
|
|
1
|
+
# Production Storage
|
|
2
|
+
|
|
3
|
+
`eve-knowledge` ships with a local JSON store for development. It is intentionally simple and excellent for local Eve apps, tests, and demos.
|
|
4
|
+
|
|
5
|
+
Do not rely on local filesystem durability for serverless production deployments unless your runtime provides persistent writable storage. In many Vercel-style serverless deployments, local writes are ephemeral.
|
|
6
|
+
|
|
7
|
+
## Recommended Production Shape
|
|
8
|
+
|
|
9
|
+
Use the core `KnowledgeStore` interface to connect a durable store:
|
|
10
|
+
|
|
11
|
+
```ts
|
|
12
|
+
import {
|
|
13
|
+
citationForChunk,
|
|
14
|
+
countSources,
|
|
15
|
+
matchesMetadataFilters,
|
|
16
|
+
removeChunksBySource,
|
|
17
|
+
replaceChunksBySource,
|
|
18
|
+
} from "eve-knowledge";
|
|
19
|
+
import type {
|
|
20
|
+
KnowledgeChunk,
|
|
21
|
+
KnowledgeSearchHit,
|
|
22
|
+
KnowledgeStore,
|
|
23
|
+
StoreSearchInput,
|
|
24
|
+
StoreStats,
|
|
25
|
+
} from "eve-knowledge";
|
|
26
|
+
|
|
27
|
+
export class DurableJsonRecipeStore implements KnowledgeStore {
|
|
28
|
+
readonly name = "durable-json-recipe";
|
|
29
|
+
readonly durability = "durable";
|
|
30
|
+
|
|
31
|
+
constructor(private readonly bucket: DurableObjectLike) {}
|
|
32
|
+
|
|
33
|
+
async upsertChunks(chunks: KnowledgeChunk[]): Promise<void> {
|
|
34
|
+
await this.writeChunks(replaceChunksBySource(await this.readChunks(), chunks));
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
async deleteBySource(sourcePath: string): Promise<void> {
|
|
38
|
+
await this.writeChunks(removeChunksBySource(await this.readChunks(), sourcePath));
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
async search(input: StoreSearchInput): Promise<KnowledgeSearchHit[]> {
|
|
42
|
+
// Replace with database/vector search in real production. Keep output bounded and cited.
|
|
43
|
+
return (await this.readChunks())
|
|
44
|
+
.filter((chunk) => matchesMetadataFilters(chunk, input.filters))
|
|
45
|
+
.filter((chunk) => chunk.text.toLowerCase().includes(input.query.toLowerCase()))
|
|
46
|
+
.slice(0, input.topK)
|
|
47
|
+
.map((chunk) => ({
|
|
48
|
+
chunk,
|
|
49
|
+
score: 1,
|
|
50
|
+
citation: citationForChunk(chunk),
|
|
51
|
+
}));
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
async stats(): Promise<StoreStats> {
|
|
55
|
+
const chunks = await this.readChunks();
|
|
56
|
+
return {
|
|
57
|
+
chunks: chunks.length,
|
|
58
|
+
sources: countSources(chunks),
|
|
59
|
+
durability: "durable",
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
private async readChunks(): Promise<KnowledgeChunk[]> {
|
|
64
|
+
return (await this.bucket.get("eve-knowledge:index")) ?? [];
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
private async writeChunks(chunks: KnowledgeChunk[]): Promise<void> {
|
|
68
|
+
await this.bucket.put("eve-knowledge:index", chunks);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
interface DurableObjectLike {
|
|
73
|
+
get(key: string): Promise<KnowledgeChunk[] | undefined>;
|
|
74
|
+
put(key: string, value: KnowledgeChunk[]): Promise<void>;
|
|
75
|
+
}
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
Minimum adapter behavior:
|
|
79
|
+
|
|
80
|
+
- `upsertChunks(chunks)` replaces all chunks for incoming source paths.
|
|
81
|
+
- `deleteBySource(sourcePath)` removes all chunks for a removed or empty source.
|
|
82
|
+
- `search({ query, topK, filters })` returns bounded cited hits.
|
|
83
|
+
- `stats()` reports chunk count, source count, and `durability: "durable"`.
|
|
84
|
+
- `listChunks()` and `listSources()` are strongly recommended so `eve-knowledge check` can detect deleted files and metadata-only changes without mutating production state.
|
|
85
|
+
|
|
86
|
+
For CI, run:
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
npx eve-knowledge check
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
`check` treats redaction findings as failures so unsafe docs do not silently ship.
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
declare module "eve/tools" {
|
|
2
|
+
export function defineTool<TInput, TOutput>(definition: {
|
|
3
|
+
description: string;
|
|
4
|
+
inputSchema: unknown;
|
|
5
|
+
execute(input: TInput): TOutput | Promise<TOutput>;
|
|
6
|
+
toModelOutput(output: Awaited<TOutput>): { type: "json" | "text"; value: unknown };
|
|
7
|
+
}): unknown;
|
|
8
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { defineTool } from "eve/tools";
|
|
2
|
+
import { parseSearchKnowledgeInput, searchKnowledge, toModelOutput } from "eve-knowledge";
|
|
3
|
+
|
|
4
|
+
const inputSchema = {
|
|
5
|
+
type: "object",
|
|
6
|
+
properties: {
|
|
7
|
+
query: {
|
|
8
|
+
type: "string",
|
|
9
|
+
minLength: 1,
|
|
10
|
+
description: "The natural-language knowledge search query.",
|
|
11
|
+
},
|
|
12
|
+
topK: {
|
|
13
|
+
type: "integer",
|
|
14
|
+
minimum: 1,
|
|
15
|
+
maximum: 10,
|
|
16
|
+
description: "Maximum number of cited chunks to return.",
|
|
17
|
+
},
|
|
18
|
+
filters: {
|
|
19
|
+
type: "object",
|
|
20
|
+
additionalProperties: true,
|
|
21
|
+
description: "Optional metadata filters such as audience, tenant, or product.",
|
|
22
|
+
},
|
|
23
|
+
},
|
|
24
|
+
required: ["query"],
|
|
25
|
+
additionalProperties: false,
|
|
26
|
+
} as const;
|
|
27
|
+
|
|
28
|
+
export default defineTool({
|
|
29
|
+
description: "Search the agent knowledge base and return cited results.",
|
|
30
|
+
inputSchema,
|
|
31
|
+
async execute(input) {
|
|
32
|
+
return searchKnowledge(parseSearchKnowledgeInput(input));
|
|
33
|
+
},
|
|
34
|
+
toModelOutput(output) {
|
|
35
|
+
return toModelOutput(output);
|
|
36
|
+
},
|
|
37
|
+
});
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import {
|
|
4
|
+
citationForChunk,
|
|
5
|
+
countSources,
|
|
6
|
+
listSourcePaths,
|
|
7
|
+
matchesMetadataFilters,
|
|
8
|
+
removeChunksBySource,
|
|
9
|
+
replaceChunksBySource,
|
|
10
|
+
} from "eve-knowledge";
|
|
11
|
+
import type {
|
|
12
|
+
KnowledgeChunk,
|
|
13
|
+
KnowledgeSearchHit,
|
|
14
|
+
KnowledgeStore,
|
|
15
|
+
StoreSearchInput,
|
|
16
|
+
StoreStats,
|
|
17
|
+
} from "eve-knowledge";
|
|
18
|
+
|
|
19
|
+
export class FileBackedDurableRecipeStore implements KnowledgeStore {
|
|
20
|
+
readonly name = "file-backed-durable-recipe";
|
|
21
|
+
readonly durability = "durable";
|
|
22
|
+
|
|
23
|
+
constructor(private readonly filePath: string) {}
|
|
24
|
+
|
|
25
|
+
async upsertChunks(chunks: KnowledgeChunk[]): Promise<void> {
|
|
26
|
+
await this.writeChunks(replaceChunksBySource(await this.readChunks(), chunks));
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
async deleteBySource(sourcePath: string): Promise<void> {
|
|
30
|
+
await this.writeChunks(removeChunksBySource(await this.readChunks(), sourcePath));
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
async search(input: StoreSearchInput): Promise<KnowledgeSearchHit[]> {
|
|
34
|
+
return (await this.readChunks())
|
|
35
|
+
.filter((chunk) => matchesMetadataFilters(chunk, input.filters))
|
|
36
|
+
.filter((chunk) => chunk.text.toLowerCase().includes(input.query.toLowerCase()))
|
|
37
|
+
.slice(0, input.topK)
|
|
38
|
+
.map((chunk) => ({
|
|
39
|
+
chunk,
|
|
40
|
+
score: 1,
|
|
41
|
+
citation: citationForChunk(chunk),
|
|
42
|
+
}));
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
async stats(): Promise<StoreStats> {
|
|
46
|
+
const chunks = await this.readChunks();
|
|
47
|
+
return {
|
|
48
|
+
chunks: chunks.length,
|
|
49
|
+
sources: countSources(chunks),
|
|
50
|
+
storePath: this.filePath,
|
|
51
|
+
durability: this.durability,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
async listChunks(): Promise<KnowledgeChunk[]> {
|
|
56
|
+
return this.readChunks();
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
async listSources(): Promise<string[]> {
|
|
60
|
+
return listSourcePaths(await this.readChunks());
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
private async readChunks(): Promise<KnowledgeChunk[]> {
|
|
64
|
+
try {
|
|
65
|
+
return JSON.parse(await fs.readFile(this.filePath, "utf8")) as KnowledgeChunk[];
|
|
66
|
+
} catch (error) {
|
|
67
|
+
if (isMissingFileError(error)) return [];
|
|
68
|
+
throw error;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
private async writeChunks(chunks: KnowledgeChunk[]): Promise<void> {
|
|
73
|
+
await fs.mkdir(path.dirname(this.filePath), { recursive: true });
|
|
74
|
+
await fs.writeFile(this.filePath, `${JSON.stringify(chunks, null, 2)}\n`);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function isMissingFileError(error: unknown): boolean {
|
|
79
|
+
return (
|
|
80
|
+
typeof error === "object" &&
|
|
81
|
+
error !== null &&
|
|
82
|
+
"code" in error &&
|
|
83
|
+
(error as { code?: unknown }).code === "ENOENT"
|
|
84
|
+
);
|
|
85
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2022",
|
|
4
|
+
"module": "NodeNext",
|
|
5
|
+
"moduleResolution": "NodeNext",
|
|
6
|
+
"strict": true,
|
|
7
|
+
"skipLibCheck": true,
|
|
8
|
+
"noEmit": true,
|
|
9
|
+
"baseUrl": ".",
|
|
10
|
+
"paths": {
|
|
11
|
+
"eve-knowledge": ["../../src/index.ts"]
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"include": ["agent/**/*.ts", "production-store-recipe.ts"]
|
|
15
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "eve-knowledge",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Add a cited agent/knowledge folder to Eve agents.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "git+https://github.com/aiswarya797/eve-knowledge.git"
|
|
10
|
+
},
|
|
11
|
+
"homepage": "https://github.com/aiswarya797/eve-knowledge#readme",
|
|
12
|
+
"bugs": {
|
|
13
|
+
"url": "https://github.com/aiswarya797/eve-knowledge/issues"
|
|
14
|
+
},
|
|
15
|
+
"types": "./dist/index.d.ts",
|
|
16
|
+
"sideEffects": false,
|
|
17
|
+
"bin": {
|
|
18
|
+
"eve-knowledge": "dist/cli.js"
|
|
19
|
+
},
|
|
20
|
+
"files": [
|
|
21
|
+
"dist",
|
|
22
|
+
"docs/production-storage.md",
|
|
23
|
+
"examples",
|
|
24
|
+
"README.md",
|
|
25
|
+
"LICENSE"
|
|
26
|
+
],
|
|
27
|
+
"exports": {
|
|
28
|
+
".": {
|
|
29
|
+
"types": "./dist/index.d.ts",
|
|
30
|
+
"import": "./dist/index.js"
|
|
31
|
+
},
|
|
32
|
+
"./cli": {
|
|
33
|
+
"types": "./dist/cli.d.ts",
|
|
34
|
+
"import": "./dist/cli.js"
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
"scripts": {
|
|
38
|
+
"build": "tsup",
|
|
39
|
+
"check": "npm run typecheck && npm run typecheck:examples && npm run test",
|
|
40
|
+
"prepack": "npm run build",
|
|
41
|
+
"test": "vitest run",
|
|
42
|
+
"typecheck:examples": "tsc --noEmit -p examples/basic-eve-agent/tsconfig.json",
|
|
43
|
+
"typecheck": "tsc --noEmit"
|
|
44
|
+
},
|
|
45
|
+
"keywords": [
|
|
46
|
+
"eve",
|
|
47
|
+
"eve-agent",
|
|
48
|
+
"agents",
|
|
49
|
+
"ai-agents",
|
|
50
|
+
"rag",
|
|
51
|
+
"retrieval",
|
|
52
|
+
"citations",
|
|
53
|
+
"knowledge",
|
|
54
|
+
"memory",
|
|
55
|
+
"vercel"
|
|
56
|
+
],
|
|
57
|
+
"publishConfig": {
|
|
58
|
+
"access": "public"
|
|
59
|
+
},
|
|
60
|
+
"dependencies": {
|
|
61
|
+
"commander": "^14.0.2",
|
|
62
|
+
"fast-glob": "^3.3.3",
|
|
63
|
+
"ignore": "^7.0.5",
|
|
64
|
+
"yaml": "^2.9.0",
|
|
65
|
+
"zod": "^4.2.1"
|
|
66
|
+
},
|
|
67
|
+
"devDependencies": {
|
|
68
|
+
"@types/node": "^25.0.3",
|
|
69
|
+
"tsup": "^8.5.1",
|
|
70
|
+
"typescript": "^5.9.3",
|
|
71
|
+
"vitest": "^4.0.16"
|
|
72
|
+
},
|
|
73
|
+
"engines": {
|
|
74
|
+
"node": ">=24"
|
|
75
|
+
}
|
|
76
|
+
}
|