@kb-labs/mind-core 2.119.0-canary.e120bc0ee → 2.119.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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types.ts","../src/ingest/discover.ts","../src/ingest/chunk.ts","../src/ingest/structural.ts","../src/ingest/embed.ts","../src/index-store.ts","../src/ingest/ingest.ts","../src/sync.ts","../src/retrieval/bm25.ts","../src/retrieval/vector.ts","../src/retrieval/fuse.ts","../src/retrieval/hyde.ts","../src/retrieval/expand.ts","../src/retrieval/retrieve.ts","../src/retrieval/rerank.ts","../src/retrieval/dedup.ts","../src/answer/verify.ts","../src/answer/field-check.ts","../src/answer/decompose.ts","../src/answer/synthesize.ts","../src/answer/answer.ts","../src/answer/explore.ts","../src/feedback/history.ts","../src/mind.ts","../src/pipeline.ts"],"names":["path","approxTokens","readFile","join","MAX_SNIPPET_CHARS","staleCount"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Internal engine types (not wire contracts).\n *\n * A `Chunk` is the unit of indexing/retrieval. Chunks are stored two ways:\n * - in the vector store (one `VectorRecord` per chunk, scoped by namespace=indexId)\n * for semantic search;\n * - in a per-index `chunks.json` via `IStorage` as the corpus for BM25 and\n * listing/status.\n */\n\nimport type { AgentSourceKind } from '@kb-labs/mind-contracts';\n\nexport interface Chunk {\n /** Stable id: `${path}#${startLine}-${endLine}`. */\n id: string;\n path: string;\n startLine: number;\n endLine: number;\n text: string;\n kind: AgentSourceKind;\n}\n\n/** Metadata stored alongside each vector record. */\nexport interface ChunkMeta extends Record<string, unknown> {\n path: string;\n startLine: number;\n endLine: number;\n text: string;\n kind: AgentSourceKind;\n}\n\n/** Per-file bookkeeping. `hash` enables incremental (delta) re-indexing. */\nexport interface FileEntry {\n chunks: number;\n indexedAt: string;\n /** Content hash; unchanged hash ⇒ file skipped on re-index. */\n hash: string;\n}\n\n/** Persisted per-index corpus (source of truth for BM25 + listing). */\nexport interface IndexManifest {\n indexId: string;\n /** Chunks keyed by id. */\n chunks: Chunk[];\n /** Per-path bookkeeping for incremental sync. */\n files: Record<string, FileEntry>;\n updatedAt: string | null;\n}\n\nexport function chunkId(path: string, startLine: number, endLine: number): string {\n return `${path}#${startLine}-${endLine}`;\n}\n\n/** Stable content hash for delta detection (FNV-1a, dependency-free). */\nexport function hashContent(text: string): string {\n let h = 0x811c9dc5;\n for (let i = 0; i < text.length; i++) {\n h ^= text.charCodeAt(i);\n h = Math.imul(h, 0x01000193);\n }\n return (h >>> 0).toString(16);\n}\n\n/** Derive a source kind from a file path. */\nexport function kindFromPath(path: string): AgentSourceKind {\n const lower = path.toLowerCase();\n if (lower.includes('/adr/') || /adr-\\d+/.test(lower)) {\n return 'adr';\n }\n if (lower.endsWith('.md') || lower.endsWith('.mdx') || lower.endsWith('.txt')) {\n return 'doc';\n }\n if (\n lower.endsWith('.json') ||\n lower.endsWith('.yaml') ||\n lower.endsWith('.yml') ||\n lower.endsWith('.toml')\n ) {\n return 'config';\n }\n return 'code';\n}\n","/**\n * Adaptive source-file discovery via `globby` over the real filesystem.\n *\n * Reads the repo relative to `cwd` — NOT the platform `storage` adapter, which\n * is a blob store that recurses into node_modules and chokes on pnpm symlink\n * chains. Symlinks are not followed and dependency/build dirs are excluded.\n *\n * No language allowlist: we glob every file and KEEP whatever looks like source\n * text, excluding only binaries, media, archives, data blobs, lockfiles and\n * oversized/generated files. A new language (`.cs`, `.vue`, `.kt`, …) is indexed\n * automatically — discovery adapts to the repo instead of being hand-curated.\n *\n * Returns paths relative to `cwd`.\n */\n\nimport globby from 'globby';\nimport { statSync, openSync, readSync, closeSync } from 'node:fs';\nimport path from 'node:path';\n\nconst IGNORE = [\n '**/node_modules/**',\n '**/dist/**',\n '**/build/**',\n '**/out/**',\n '**/coverage/**',\n '**/.git/**',\n '**/.kb/**',\n '**/bin/**',\n '**/obj/**',\n '**/.next/**',\n '**/.nuxt/**',\n '**/vendor/**',\n '**/__pycache__/**',\n];\n\n/**\n * Non-source extensions — binary, media, archives, data blobs, sourcemaps,\n * minified bundles. Everything NOT here is treated as source if it is text.\n */\nconst DENY_EXT = new Set([\n 'png', 'jpg', 'jpeg', 'gif', 'svg', 'ico', 'webp', 'bmp', 'tif', 'tiff', 'avif',\n 'mp4', 'mov', 'avi', 'webm', 'mp3', 'wav', 'ogg', 'flac', 'pdf',\n 'woff', 'woff2', 'ttf', 'eot', 'otf',\n 'zip', 'gz', 'tgz', 'bz2', 'xz', 'tar', 'rar', '7z',\n 'exe', 'dll', 'so', 'dylib', 'bin', 'wasm', 'class', 'node', 'pdb',\n 'xlsx', 'xls', 'docx', 'doc', 'pptx', 'ppt', 'parquet', 'db', 'sqlite',\n 'map', 'min.js', 'min.css', 'snap',\n // Bulk data / logs / dumps — text, but no semantic value and they bloat the\n // index + embedding cost (the old extension allowlist excluded these by omission).\n 'csv', 'tsv', 'ndjson', 'jsonl', 'log', 'sql', 'dump', 'out',\n]);\n\n/** Generated/lock files that are text but carry no semantic signal. */\nconst DENY_FILE = new Set([\n 'package-lock.json', 'pnpm-lock.yaml', 'yarn.lock', 'go.sum', 'Cargo.lock', 'composer.lock',\n]);\n\n/** Skip empty and oversized (usually generated/minified) files. */\nconst MAX_BYTES = 512 * 1024;\n\nfunction extOf(file: string): string {\n const name = file.slice(file.lastIndexOf('/') + 1).toLowerCase();\n if (name.endsWith('.min.js')) {\n return 'min.js';\n }\n if (name.endsWith('.min.css')) {\n return 'min.css';\n }\n const dot = name.lastIndexOf('.');\n return dot === -1 ? '' : name.slice(dot + 1);\n}\n\n/** Cheap binary sniff: a NUL byte in the first 4 KB ⇒ treat as binary. */\nfunction isBinary(abs: string): boolean {\n let fd: number | undefined;\n try {\n fd = openSync(abs, 'r');\n const buf = Buffer.alloc(4096);\n const n = readSync(fd, buf, 0, buf.length, 0);\n for (let i = 0; i < n; i++) {\n if (buf[i] === 0) {\n return true;\n }\n }\n return false;\n } catch {\n return true; // unreadable ⇒ skip\n } finally {\n if (fd !== undefined) {\n closeSync(fd);\n }\n }\n}\n\n/** Strip trailing slashes without a backtracking regex (avoids polynomial ReDoS). */\nfunction trimTrailingSlashes(s: string): string {\n let end = s.length;\n while (end > 0 && s.charCodeAt(end - 1) === 47 /* '/' */) {\n end--;\n }\n return s.slice(0, end);\n}\n\n/** Scope the engine discovers against — config-driven include/exclude globs. */\nexport interface DiscoverScope {\n /** Repo-relative roots/globs to index. Empty/undefined ⇒ whole repo. */\n include?: string[];\n /** Globs subtracted from the include set (added to the ignore list). */\n exclude?: string[];\n}\n\nexport async function discover(cwd: string, scope?: DiscoverScope): Promise<string[]> {\n const include = scope?.include && scope.include.length > 0 ? scope.include : ['.'];\n const exclude = scope?.exclude ?? [];\n\n // Each include root → a recursive glob ('.' ⇒ whole repo). exclude globs\n // join the ignore list, so they're subtracted from whatever include matched.\n const patterns = include.map((p) => {\n const base = p && p !== '.' ? trimTrailingSlashes(p) : '';\n return base ? `${base}/**/*` : '**/*';\n });\n\n const candidates = await globby(patterns, {\n cwd,\n ignore: [...IGNORE, ...exclude],\n dot: false,\n followSymbolicLinks: false,\n gitignore: false,\n onlyFiles: true,\n });\n\n return candidates.filter((rel) => {\n if (DENY_FILE.has(rel.slice(rel.lastIndexOf('/') + 1))) {\n return false;\n }\n if (DENY_EXT.has(extOf(rel))) {\n return false;\n }\n const abs = path.join(cwd, rel);\n try {\n const st = statSync(abs);\n if (st.size === 0 || st.size > MAX_BYTES) {\n return false;\n }\n } catch {\n return false;\n }\n return !isBinary(abs);\n });\n}\n","/**\n * Sliding-window chunker (Phase 2 baseline; AST chunking is layered in Phase 3).\n *\n * Splits a file into line-aligned chunks of roughly `maxTokens` tokens with\n * `overlapTokens` of overlap. Token count is approximated by whitespace words —\n * good enough for windowing; real tokenization is not needed here.\n */\n\nimport type { Chunk } from '../types';\nimport { chunkId, kindFromPath } from '../types';\n\nexport interface ChunkOptions {\n maxTokens: number;\n overlapTokens: number;\n}\n\nfunction approxTokens(line: string): number {\n const t = line.trim();\n if (t === '') {\n return 0;\n }\n return t.split(/\\s+/).length;\n}\n\nexport function slidingWindowChunks(path: string, content: string, opts: ChunkOptions): Chunk[] {\n const lines = content.split('\\n');\n const kind = kindFromPath(path);\n const chunks: Chunk[] = [];\n\n const maxTokens = Math.max(1, opts.maxTokens);\n const overlapTokens = Math.max(0, Math.min(opts.overlapTokens, maxTokens - 1));\n\n let startIdx = 0;\n while (startIdx < lines.length) {\n let tokens = 0;\n let endIdx = startIdx;\n while (endIdx < lines.length && tokens < maxTokens) {\n tokens += approxTokens(lines[endIdx] ?? '');\n endIdx++;\n }\n\n const startLine = startIdx + 1; // 1-based, inclusive\n const endLine = endIdx; // 1-based, inclusive\n const text = lines.slice(startIdx, endIdx).join('\\n');\n\n if (text.trim() !== '') {\n chunks.push({ id: chunkId(path, startLine, endLine), path, startLine, endLine, text, kind });\n }\n\n if (endIdx >= lines.length) {\n break;\n }\n\n // Step back by roughly `overlapTokens` worth of lines for overlap.\n let overlap = 0;\n let stepBack = 0;\n let i = endIdx - 1;\n while (i > startIdx && overlap < overlapTokens) {\n overlap += approxTokens(lines[i] ?? '');\n stepBack++;\n i--;\n }\n startIdx = Math.max(startIdx + 1, endIdx - stepBack);\n }\n\n return chunks;\n}\n","/**\n * Structure-aware chunking for code (AST-lite).\n *\n * Splits a source file at top-level declaration boundaries (functions, classes,\n * interfaces, etc.) so chunks align with logical units instead of arbitrary\n * windows. Oversized blocks fall back to the sliding window. This is a\n * dependency-free approximation of AST chunking; a tree-sitter backend can\n * replace it later behind the same `chunkFile` entry without touching callers.\n */\n\nimport type { Chunk } from '../types';\nimport { chunkId, kindFromPath } from '../types';\nimport { slidingWindowChunks, type ChunkOptions } from './chunk';\n\n// Declaration keywords and leading modifiers. We detect boundaries by scanning\n// the line's leading words (linear) rather than a multi-optional-group regex —\n// the latter is a polynomial-ReDoS shape on attacker-controlled file content.\nconst DECL_KEYWORDS = new Set([\n 'function', 'class', 'interface', 'type', 'enum', 'const', 'let', 'var',\n 'namespace', 'module', 'def', 'func', 'fn', 'impl', 'struct', 'trait',\n 'public', 'private',\n]);\nconst MODIFIERS = new Set([\n 'export', 'default', 'declare', 'public', 'private', 'protected',\n 'static', 'abstract', 'async',\n]);\n\n/** A top-level (unindented) line whose leading modifiers lead to a declaration. */\nfunction isBoundaryLine(line: string): boolean {\n if (line.length === 0 || line.charCodeAt(0) === 32 || line.charCodeAt(0) === 9) {\n return false; // indented → not top-level\n }\n for (const word of line.split(/\\s+/)) {\n if (DECL_KEYWORDS.has(word)) {\n return true;\n }\n if (!MODIFIERS.has(word)) {\n return false; // first non-modifier, non-keyword word → not a declaration\n }\n }\n return false;\n}\n\nfunction approxTokens(text: string): number {\n const t = text.trim();\n return t === '' ? 0 : t.split(/\\s+/).length;\n}\n\nexport function structuralChunks(path: string, content: string, opts: ChunkOptions): Chunk[] {\n const lines = content.split('\\n');\n const kind = kindFromPath(path);\n\n // Find top-level boundary line indices (indentation 0, declaration-like).\n const boundaries: number[] = [];\n lines.forEach((line, i) => {\n if (isBoundaryLine(line)) {\n boundaries.push(i);\n }\n });\n\n if (boundaries.length === 0) {\n return slidingWindowChunks(path, content, opts);\n }\n\n // Block start indices: file start + each boundary (deduped, sorted).\n const starts = [...new Set([0, ...boundaries])].sort((a, b) => a - b);\n const chunks: Chunk[] = [];\n\n for (let b = 0; b < starts.length; b++) {\n const from = starts[b]!;\n const to = b + 1 < starts.length ? starts[b + 1]! : lines.length; // exclusive\n const blockLines = lines.slice(from, to);\n const blockText = blockLines.join('\\n');\n if (blockText.trim() === '') {\n continue;\n }\n\n if (approxTokens(blockText) > opts.maxTokens) {\n // Oversized declaration: window it, offsetting line numbers to the block.\n for (const sub of slidingWindowChunks(path, blockText, opts)) {\n const startLine = from + sub.startLine; // sub is 1-based within block\n const endLine = from + sub.endLine;\n chunks.push({ id: chunkId(path, startLine, endLine), path, startLine, endLine, text: sub.text, kind });\n }\n } else {\n const startLine = from + 1;\n const endLine = to;\n chunks.push({ id: chunkId(path, startLine, endLine), path, startLine, endLine, text: blockText, kind });\n }\n }\n\n return chunks;\n}\n\n/** Dispatch: structure-aware for code when enabled, else sliding window. */\nexport function chunkFile(path: string, content: string, opts: ChunkOptions, ast: boolean): Chunk[] {\n if (ast && kindFromPath(path) === 'code') {\n return structuralChunks(path, content, opts);\n }\n return slidingWindowChunks(path, content, opts);\n}\n","/**\n * Embed chunks into vector records via the platform embeddings adapter.\n */\n\nimport type { Chunk, ChunkMeta } from '../types';\nimport type { IEmbeddings, VectorRecord } from '../services';\n\n/** Max chunks per embedding request. */\nconst MAX_BATCH_CHUNKS = 96;\n/** Max approx tokens per request — kept well under provider limits (e.g. OpenAI 300k). */\nconst MAX_BATCH_TOKENS = 200_000;\n/**\n * Hard char cap on a single input. Providers cap inputs at ~8192 tokens; dense\n * markdown/code runs ~2–3 chars/token, so 12k chars stays safely under that.\n * Only pathological chunks (e.g. a doc with one enormous line the chunker\n * couldn't split) hit this; the full text is still kept in metadata.\n */\nconst MAX_INPUT_CHARS = 12_000;\n/** Rough chars→tokens estimate for batch budgeting (avoids a tokenizer dep). */\nconst CHARS_PER_TOKEN = 4;\n\nconst approxTokens = (text: string): number => Math.ceil(text.length / CHARS_PER_TOKEN);\n\nfunction toRecord(chunk: Chunk, vector: number[], text: string): VectorRecord {\n const meta: ChunkMeta = {\n path: chunk.path,\n startLine: chunk.startLine,\n endLine: chunk.endLine,\n text,\n kind: chunk.kind,\n };\n return { id: chunk.id, vector, metadata: meta };\n}\n\n/**\n * Split chunks into request batches bounded by BOTH a chunk count and an approx\n * token budget, so a batch never exceeds the provider's per-request token limit\n * (which count-only batching blows on large files). Oversized single inputs are\n * truncated to the per-input cap.\n */\nfunction planBatches(chunks: Chunk[]): { chunk: Chunk; text: string }[][] {\n const items = chunks.map((c) => ({\n chunk: c,\n text: c.text.length > MAX_INPUT_CHARS ? c.text.slice(0, MAX_INPUT_CHARS) : c.text,\n }));\n const batches: { chunk: Chunk; text: string }[][] = [];\n let cur: { chunk: Chunk; text: string }[] = [];\n let curTokens = 0;\n for (const item of items) {\n const t = approxTokens(item.text);\n if (cur.length > 0 && (cur.length >= MAX_BATCH_CHUNKS || curTokens + t > MAX_BATCH_TOKENS)) {\n batches.push(cur);\n cur = [];\n curTokens = 0;\n }\n cur.push(item);\n curTokens += t;\n }\n if (cur.length > 0) {\n batches.push(cur);\n }\n return batches;\n}\n\n/**\n * Embed chunks into vector records. Batched by count + token budget so the\n * embedding stage reports progress and never sends an oversized request.\n */\nexport async function embedChunks(\n chunks: Chunk[],\n embeddings: IEmbeddings,\n onProgress?: (done: number, total: number) => void,\n): Promise<VectorRecord[]> {\n if (chunks.length === 0) {\n return [];\n }\n\n const records: VectorRecord[] = [];\n for (const batch of planBatches(chunks)) {\n const vectors = await embeddings.embedBatch(batch.map((b) => b.text));\n // Store the original chunk text in metadata, even if the embedded text was truncated.\n batch.forEach((b, j) => records.push(toRecord(b.chunk, vectors[j] ?? [], b.chunk.text)));\n onProgress?.(records.length, chunks.length);\n }\n return records;\n}\n","/**\n * Per-index manifest persistence via `IStorage`.\n *\n * The manifest is the source of truth for the BM25 corpus and for\n * listing/status. Vectors live in the vector store; the manifest holds chunk\n * text + per-file bookkeeping. One manifest per index id.\n */\n\nimport { readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport type { IStorage } from './services';\nimport { hashContent, type IndexManifest } from './types';\n\nfunction manifestPath(indexId: string): string {\n return `mind/${indexId}/manifest.json`;\n}\n\n/**\n * Whether `file`'s on-disk content has drifted from what the manifest indexed\n * (the agent should re-read the live file). Files not in the index are treated\n * as not-stale (unknown, not misleading); unreadable/removed files are stale.\n * Bounded cost — call only for the results actually returned, not the corpus.\n */\nexport async function isStale(manifest: IndexManifest, file: string, cwd: string): Promise<boolean> {\n const entry = manifest.files[file];\n if (!entry) {\n return false;\n }\n try {\n const content = await readFile(join(cwd, file), 'utf8');\n return hashContent(content) !== entry.hash;\n } catch {\n return true; // gone from disk or unreadable\n }\n}\n\n/** Stale flag for many files at once (deduped) → `Map<file, stale>`. */\nexport async function staleMap(manifest: IndexManifest, files: string[], cwd: string): Promise<Map<string, boolean>> {\n const out = new Map<string, boolean>();\n await Promise.all(\n [...new Set(files)].map(async (f) => {\n out.set(f, await isStale(manifest, f, cwd));\n }),\n );\n return out;\n}\n\n/** Count of indexed files whose on-disk content changed — whole-index freshness (status). */\nexport async function staleCount(manifest: IndexManifest, cwd: string): Promise<number> {\n const flags = await staleMap(manifest, Object.keys(manifest.files), cwd);\n return [...flags.values()].filter(Boolean).length;\n}\n\n/**\n * Whether an index has a persisted manifest. Distinguishes \"absent\" (typo'd /\n * already-dropped id) from \"empty\", so a destructive `drop` does not report\n * success for a no-op on the wrong index.\n */\nexport async function manifestExists(storage: IStorage, indexId: string): Promise<boolean> {\n return Boolean(await storage.read(manifestPath(indexId)));\n}\n\nexport async function loadManifest(storage: IStorage, indexId: string): Promise<IndexManifest> {\n const buf = await storage.read(manifestPath(indexId));\n if (!buf) {\n return { indexId, chunks: [], files: {}, updatedAt: null };\n }\n try {\n const parsed = JSON.parse(buf.toString('utf8')) as IndexManifest;\n return { indexId, chunks: parsed.chunks ?? [], files: parsed.files ?? {}, updatedAt: parsed.updatedAt ?? null };\n } catch {\n return { indexId, chunks: [], files: {}, updatedAt: null };\n }\n}\n\nexport async function saveManifest(storage: IStorage, manifest: IndexManifest): Promise<void> {\n const buf = Buffer.from(JSON.stringify(manifest), 'utf8');\n await storage.write(manifestPath(manifest.indexId), buf);\n}\n\n/** Remove an index's manifest (used when dropping the whole index). */\nexport async function deleteManifest(storage: IStorage, indexId: string): Promise<void> {\n await storage.delete(manifestPath(indexId));\n}\n","/**\n * Ingest pipeline: discover -> (hash-delta) -> chunk -> embed ->\n * upsert(namespace=indexId), then persist the per-index manifest.\n *\n * Incremental by default: only files whose content hash changed since the last\n * index are re-chunked/re-embedded; unchanged files keep their existing chunks\n * (and vectors), removed files are pruned. `full` forces a clean rebuild.\n */\n\nimport { readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport type { MindServices } from '../services';\nimport type { Chunk, FileEntry, IndexManifest } from '../types';\nimport { hashContent } from '../types';\nimport { discover, type DiscoverScope } from './discover';\nimport { type ChunkOptions } from './chunk';\nimport { chunkFile } from './structural';\nimport { embedChunks } from './embed';\nimport { loadManifest, saveManifest } from '../index-store';\n\n/** Staged progress events emitted during ingest (for CLI/REST progress UIs). */\nexport type IngestProgress =\n | { stage: 'discover'; files: number }\n | { stage: 'delta'; toIndex: number; unchanged: number; removed: number }\n | { stage: 'chunk'; chunks: number }\n | { stage: 'embed'; done: number; total: number }\n | { stage: 'upsert'; count: number }\n | { stage: 'save' };\n\nexport interface IngestInput {\n indexId: string;\n /** Workspace root that source paths are resolved against. */\n cwd: string;\n /** Config-driven include/exclude globs for discovery. */\n scope?: DiscoverScope;\n chunk: ChunkOptions;\n /** Use structure-aware chunking for code. */\n ast: boolean;\n /** Force a full rebuild instead of incremental delta. */\n full?: boolean;\n /** ISO timestamp for manifest bookkeeping (injectable for determinism). */\n now: string;\n /** Optional staged-progress sink (best-effort; never affects results). */\n onProgress?: (event: IngestProgress) => void;\n}\n\nexport interface IngestResult {\n filesIndexed: number;\n chunks: number;\n /** Files (re)embedded this run (new + changed). */\n added: number;\n updated: number;\n /** Files removed from the index (gone from disk). */\n removed: number;\n /** Files skipped because their content hash was unchanged. */\n unchanged: number;\n}\n\n/** Read + content-hash every discovered file. Unreadable files are skipped (warned). */\nasync function readAndHash(\n cwd: string,\n paths: string[],\n logger?: MindServices['logger'],\n): Promise<{ contentByPath: Map<string, string>; hashByPath: Map<string, string> }> {\n const contentByPath = new Map<string, string>();\n const hashByPath = new Map<string, string>();\n for (const path of paths) {\n let content: string;\n try {\n // Source comes from the real filesystem; storage is only for the manifest.\n content = await readFile(join(cwd, path), 'utf8');\n } catch (err) {\n logger?.warn('mind: skipped unreadable file', { path, reason: err instanceof Error ? err.message : String(err) });\n continue;\n }\n contentByPath.set(path, content);\n hashByPath.set(path, hashContent(content));\n }\n return { contentByPath, hashByPath };\n}\n\ninterface Delta {\n /** New + changed files — need re-chunk + re-embed. */\n toIndex: string[];\n /** Files whose content hash matched the previous index. */\n unchanged: string[];\n /** Files in the previous index that are gone from disk. */\n removedPaths: string[];\n added: number;\n updated: number;\n}\n\n/** Classify discovered files against the previous index by content hash. */\nfunction classify(\n contentByPath: Map<string, string>,\n hashByPath: Map<string, string>,\n prevFiles: Record<string, FileEntry>,\n): Delta {\n const toIndex: string[] = [];\n const unchanged: string[] = [];\n let added = 0;\n let updated = 0;\n for (const path of contentByPath.keys()) {\n const prevEntry = prevFiles[path];\n if (prevEntry && prevEntry.hash === hashByPath.get(path)) {\n unchanged.push(path);\n } else {\n toIndex.push(path);\n if (prevEntry) {\n updated++;\n } else {\n added++;\n }\n }\n }\n const removedPaths = Object.keys(prevFiles).filter((p) => !contentByPath.has(p));\n return { toIndex, unchanged, removedPaths, added, updated };\n}\n\nexport async function ingest(input: IngestInput, services: MindServices): Promise<IngestResult> {\n const { storage, embeddings, vectorStore } = services;\n const prev = await loadManifest(storage, input.indexId);\n const prevFiles: Record<string, FileEntry> = input.full ? {} : prev.files;\n\n const emit = input.onProgress ?? (() => {});\n\n const paths = await discover(input.cwd, input.scope);\n emit({ stage: 'discover', files: paths.length });\n const { contentByPath, hashByPath } = await readAndHash(input.cwd, paths, services.logger);\n const { toIndex, unchanged, removedPaths, added, updated } = classify(contentByPath, hashByPath, prevFiles);\n emit({ stage: 'delta', toIndex: toIndex.length, unchanged: unchanged.length, removed: removedPaths.length });\n\n // Vectors to drop: on full, everything previously indexed; otherwise only the\n // chunks of changed + removed files.\n const stalePaths = new Set(input.full ? Object.keys(prev.files) : [...toIndex, ...removedPaths]);\n const staleIds = (input.full ? prev.chunks : prev.chunks.filter((c) => stalePaths.has(c.path))).map((c) => c.id);\n if (staleIds.length > 0) {\n await vectorStore.delete(staleIds, input.indexId);\n }\n\n // Keep unchanged files' chunks + bookkeeping as-is.\n const unchangedSet = new Set(unchanged);\n const keptChunks = input.full ? [] : prev.chunks.filter((c) => unchangedSet.has(c.path));\n const files: Record<string, FileEntry> = {};\n for (const path of unchanged) {\n files[path] = prevFiles[path]!;\n }\n\n // Chunk + embed only the new/changed files.\n const newChunks: Chunk[] = [];\n for (const path of toIndex) {\n const chunks = chunkFile(path, contentByPath.get(path)!, input.chunk, input.ast);\n if (chunks.length === 0) {\n continue;\n }\n newChunks.push(...chunks);\n files[path] = { chunks: chunks.length, indexedAt: input.now, hash: hashByPath.get(path)! };\n }\n emit({ stage: 'chunk', chunks: newChunks.length });\n\n const records = await embedChunks(newChunks, embeddings, (done, total) =>\n emit({ stage: 'embed', done, total }),\n );\n if (records.length > 0) {\n emit({ stage: 'upsert', count: records.length });\n await vectorStore.upsert(records, input.indexId);\n }\n emit({ stage: 'save' });\n\n const manifest: IndexManifest = {\n indexId: input.indexId,\n chunks: [...keptChunks, ...newChunks],\n files,\n updatedAt: input.now,\n };\n await saveManifest(storage, manifest);\n\n return {\n filesIndexed: Object.keys(files).length,\n chunks: manifest.chunks.length,\n added,\n updated,\n removed: removedPaths.length,\n unchanged: unchanged.length,\n };\n}\n","/**\n * Incremental document sync — add / update / delete specific paths in an index\n * without a full rebuild. Operates on both the vector store (namespace=indexId)\n * and the persisted manifest (BM25 corpus + bookkeeping).\n */\n\nimport { readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport type { MindServices } from './services';\nimport type { Chunk, IndexManifest } from './types';\nimport { hashContent } from './types';\nimport { type ChunkOptions } from './ingest/chunk';\nimport { chunkFile } from './ingest/structural';\nimport { embedChunks } from './ingest/embed';\nimport { loadManifest, saveManifest } from './index-store';\n\nexport interface SyncOptions {\n indexId: string;\n /** Workspace root that source paths are resolved against. */\n cwd: string;\n chunk: ChunkOptions;\n ast: boolean;\n now: string;\n}\n\nexport interface SyncCounts {\n added: number;\n updated: number;\n deleted: number;\n}\n\n/** Remove all chunks for the given paths from vector store + manifest. */\nasync function removePaths(\n manifest: IndexManifest,\n paths: Set<string>,\n services: MindServices,\n indexId: string,\n): Promise<number> {\n const removedIds = manifest.chunks.filter((c) => paths.has(c.path)).map((c) => c.id);\n if (removedIds.length > 0) {\n await services.vectorStore.delete(removedIds, indexId);\n }\n manifest.chunks = manifest.chunks.filter((c) => !paths.has(c.path));\n for (const p of paths) {\n delete manifest.files[p];\n }\n return removedIds.length;\n}\n\n/** Chunk + embed + upsert the given paths into the index. */\nasync function addPaths(\n manifest: IndexManifest,\n paths: string[],\n services: MindServices,\n opts: SyncOptions,\n): Promise<number> {\n const newChunks: Chunk[] = [];\n for (const path of paths) {\n let content: string;\n try {\n content = await readFile(join(opts.cwd, path), 'utf8');\n } catch {\n continue;\n }\n const chunks = chunkFile(path, content, opts.chunk, opts.ast);\n if (chunks.length === 0) {\n continue;\n }\n newChunks.push(...chunks);\n manifest.files[path] = { chunks: chunks.length, indexedAt: opts.now, hash: hashContent(content) };\n }\n\n if (newChunks.length > 0) {\n const records = await embedChunks(newChunks, services.embeddings);\n await services.vectorStore.upsert(records, opts.indexId);\n manifest.chunks.push(...newChunks);\n }\n return newChunks.length;\n}\n\nexport async function syncAdd(paths: string[], services: MindServices, opts: SyncOptions): Promise<SyncCounts> {\n const manifest = await loadManifest(services.storage, opts.indexId);\n // Treat re-adding an existing path as an update (replace its chunks).\n const existing = new Set(paths.filter((p) => manifest.files[p]));\n await removePaths(manifest, existing, services, opts.indexId);\n await addPaths(manifest, paths, services, opts);\n manifest.updatedAt = opts.now;\n await saveManifest(services.storage, manifest);\n return { added: paths.length - existing.size, updated: existing.size, deleted: 0 };\n}\n\nexport async function syncUpdate(paths: string[], services: MindServices, opts: SyncOptions): Promise<SyncCounts> {\n const manifest = await loadManifest(services.storage, opts.indexId);\n await removePaths(manifest, new Set(paths), services, opts.indexId);\n await addPaths(manifest, paths, services, opts);\n manifest.updatedAt = opts.now;\n await saveManifest(services.storage, manifest);\n return { added: 0, updated: paths.length, deleted: 0 };\n}\n\nexport async function syncDelete(paths: string[], services: MindServices, opts: SyncOptions): Promise<SyncCounts> {\n const manifest = await loadManifest(services.storage, opts.indexId);\n const deleted = await removePaths(manifest, new Set(paths), services, opts.indexId);\n manifest.updatedAt = opts.now;\n await saveManifest(services.storage, manifest);\n return { added: 0, updated: 0, deleted };\n}\n","/**\n * BM25 keyword ranking over the in-memory chunk corpus.\n *\n * Self-contained Okapi BM25. Tokenization lowercases and splits on\n * non-alphanumerics, additionally splitting camelCase and snake_case so code\n * identifiers (`getUserId`, `user_id`) match natural-language queries.\n */\n\nimport type { Chunk } from '../types';\n\nexport interface Ranked {\n id: string;\n score: number;\n}\n\nconst K1 = 1.5;\nconst B = 0.75;\n\nexport function tokenize(text: string): string[] {\n return text\n .replace(/([a-z0-9])([A-Z])/g, '$1 $2') // camelCase -> camel Case\n .toLowerCase()\n .split(/[^a-z0-9]+/)\n .filter((t) => t.length > 1);\n}\n\nexport function bm25Search(chunks: Chunk[], query: string, limit: number): Ranked[] {\n if (chunks.length === 0) {\n return [];\n }\n\n const docs = chunks.map((c) => tokenize(c.text));\n const docLens = docs.map((d) => d.length);\n const avgDocLen = docLens.reduce((a, b) => a + b, 0) / docs.length || 1;\n\n // Document frequency per term.\n const df = new Map<string, number>();\n for (const doc of docs) {\n for (const term of new Set(doc)) {\n df.set(term, (df.get(term) ?? 0) + 1);\n }\n }\n\n const queryTerms = [...new Set(tokenize(query))];\n const N = docs.length;\n\n const scored: Ranked[] = chunks.map((chunk, i) => {\n const doc = docs[i] ?? [];\n const len = docLens[i] ?? 0;\n const tf = new Map<string, number>();\n for (const term of doc) {\n tf.set(term, (tf.get(term) ?? 0) + 1);\n }\n\n let score = 0;\n for (const term of queryTerms) {\n const termTf = tf.get(term);\n if (!termTf) {\n continue;\n }\n const docFreq = df.get(term) ?? 0;\n // BM25 idf with +1 to keep it non-negative.\n const idf = Math.log(1 + (N - docFreq + 0.5) / (docFreq + 0.5));\n const denom = termTf + K1 * (1 - B + (B * len) / avgDocLen);\n score += idf * ((termTf * (K1 + 1)) / denom);\n }\n\n return { id: chunk.id, score };\n });\n\n return scored\n .filter((r) => r.score > 0)\n .sort((a, b) => b.score - a.score)\n .slice(0, limit);\n}\n","/**\n * Vector retrieval via the platform vector store, scoped by namespace=indexId.\n */\n\nimport type { IVectorStore } from '../services';\nimport type { Ranked } from './bm25';\n\nexport async function vectorSearch(\n queryText: string,\n vectorStore: IVectorStore,\n embed: (text: string) => Promise<number[]>,\n indexId: string,\n limit: number,\n): Promise<Ranked[]> {\n let vector: number[];\n try {\n vector = await embed(queryText);\n } catch (err) {\n throw new Error(`mind: query embedding failed — ${err instanceof Error ? err.message : String(err)}`);\n }\n try {\n const hits = await vectorStore.search(vector, limit, undefined, indexId);\n return hits.map((h) => ({ id: h.id, score: h.score }));\n } catch (err) {\n throw new Error(\n `mind: vector search failed (indexId=\"${indexId}\", dims=${vector.length}) — ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n}\n","/**\n * Reciprocal Rank Fusion (RRF) with intent-adaptive weights.\n *\n * Fuses ranked lists by `weight * 1/(k + rank)`. Weights shift the balance\n * between the semantic (vector) and keyword (BM25) lists based on query intent.\n */\n\nimport type { Ranked } from './bm25';\n\nexport type QueryIntent = 'lookup' | 'concept' | 'architecture';\n\n/** Which retrieval signal surfaced a result — the \"why\" + proof-of-value vs grep. */\nexport type MatchedBy = 'lexical' | 'semantic' | 'both';\n\nexport interface WeightedList {\n ranked: Ranked[];\n weight: number;\n /** Provenance label for this list (so the fused result knows where it came from). */\n label?: Exclude<MatchedBy, 'both'>;\n}\n\nexport interface FusedRanked extends Ranked {\n matchedBy: MatchedBy;\n}\n\n/** Vector/BM25 weighting per intent (vector favored for meaning, BM25 for exact terms). */\nexport function intentWeights(intent?: QueryIntent): { vector: number; bm25: number } {\n switch (intent) {\n case 'lookup':\n return { vector: 0.4, bm25: 0.6 }; // exact symbol lookups lean keyword\n case 'architecture':\n return { vector: 0.6, bm25: 0.4 };\n case 'concept':\n default:\n return { vector: 0.7, bm25: 0.3 };\n }\n}\n\nexport function rrfFuse(lists: WeightedList[], k: number): FusedRanked[] {\n const scores = new Map<string, number>();\n const labels = new Map<string, Set<Exclude<MatchedBy, 'both'>>>();\n\n for (const { ranked, weight, label } of lists) {\n ranked.forEach((item, idx) => {\n const rank = idx + 1;\n scores.set(item.id, (scores.get(item.id) ?? 0) + weight * (1 / (k + rank)));\n if (label) {\n const set = labels.get(item.id) ?? new Set();\n set.add(label);\n labels.set(item.id, set);\n }\n });\n }\n\n return [...scores.entries()]\n .map(([id, score]) => ({ id, score, matchedBy: resolveMatchedBy(labels.get(id)) }))\n .sort((a, b) => b.score - a.score);\n}\n\nfunction resolveMatchedBy(set?: Set<Exclude<MatchedBy, 'both'>>): MatchedBy {\n // Unlabelled lists (e.g. tests) → 'both' (neutral). Otherwise: in both lists → 'both'.\n if (!set || set.size === 0 || set.size === 2) {\n return 'both';\n }\n return set.has('semantic') ? 'semantic' : 'lexical';\n}\n","/**\n * HyDE — Hypothetical Document Embeddings.\n *\n * Ask the LLM to draft a short, realistic snippet that would answer the query,\n * then use THAT text (not the raw query) for the vector search. The hypothetical\n * doc lives in answer-space, so its embedding sits closer to the relevant chunks\n * than a terse question does — which helps concept queries where the query\n * wording and the code/doc wording diverge. BM25 keeps using the raw query, so\n * exact-term lookups are unaffected.\n *\n * Best-effort: on any LLM error or empty output, fall back to the raw query so\n * retrieval degrades to plain vector search rather than failing.\n */\n\nimport type { ILLM } from '../services';\n\nconst HYDE_PROMPT = (query: string) =>\n `Write a short, realistic code or documentation snippet that would directly answer ` +\n `the question below. Output only the snippet — no preamble, no explanation, no fences.\\n\\n` +\n `Question: ${query}`;\n\nexport async function hypotheticalDocument(query: string, llm: ILLM): Promise<string> {\n try {\n const { content } = await llm.complete(HYDE_PROMPT(query), { temperature: 0.0, maxTokens: 256 });\n const text = (content ?? '').trim();\n // Append the raw query so query terms still contribute to the embedding.\n return text === '' ? query : `${text}\\n\\n${query}`;\n } catch {\n return query;\n }\n}\n","/**\n * Query expansion for the lexical (BM25) side.\n *\n * Ask the LLM for code identifiers and synonyms that are likely to appear in\n * relevant source/docs, then append them to the raw query before BM25. This\n * targets vocabulary mismatch — the core failure mode on messy/undocumented\n * repos, where the asker's words and the code's words diverge. The vector side\n * keeps its own bridge (HyDE); the two levers are orthogonal.\n *\n * Best-effort: on any LLM error or empty output, fall back to the raw query so\n * retrieval degrades to plain BM25 rather than failing.\n */\n\nimport type { ILLM } from '../services';\n\nconst EXPAND_PROMPT = (query: string) =>\n `List code identifiers, function/type names, and close synonyms that would likely appear ` +\n `in source code or documentation relevant to the query below. Output a single ` +\n `space-separated line of terms only — no explanation, no punctuation, no fences.\\n\\n` +\n `Query: ${query}`;\n\nexport async function expandQuery(query: string, llm: ILLM): Promise<string> {\n try {\n const { content } = await llm.complete(EXPAND_PROMPT(query), { temperature: 0.0, maxTokens: 64 });\n const extra = (content ?? '').trim();\n // Keep the raw query first so its exact terms still dominate BM25 scoring.\n return extra === '' ? query : `${query} ${extra}`;\n } catch {\n return query;\n }\n}\n","/**\n * Retrieval pipeline: BM25 (over manifest corpus) + vector (platform store),\n * fused with intent-adaptive RRF, mapped back to chunks.\n */\n\nimport type { MindServices } from '../services';\nimport type { Chunk } from '../types';\nimport { loadManifest } from '../index-store';\nimport { bm25Search, type Ranked } from './bm25';\nimport { vectorSearch } from './vector';\nimport { rrfFuse, intentWeights, type QueryIntent, type MatchedBy } from './fuse';\nimport { hypotheticalDocument } from './hyde';\nimport { expandQuery } from './expand';\n\nexport interface RetrieveInput {\n text: string;\n indexId: string;\n limit: number;\n intent?: QueryIntent;\n rrfK: number;\n /** HyDE: embed an LLM-generated hypothetical doc for the vector search. */\n hyde?: boolean;\n /** Query expansion: append LLM-suggested related terms to the BM25 query. */\n expand?: boolean;\n}\n\nexport interface RankedChunk {\n chunk: Chunk;\n /** Fused RRF score (best first). */\n score: number;\n /** Which signal surfaced this chunk (lexical/semantic/both) — provenance. */\n matchedBy: MatchedBy;\n}\n\nexport interface RetrieveOutput {\n /** Fused, ranked chunks (best first), truncated to `limit`. */\n ranked: RankedChunk[];\n /** Raw cosine confidence proxy from the vector list (top-3 avg). */\n confidence: number;\n /** Share of returned results found semantic-only (grep would miss them). */\n semanticWinRate: number;\n}\n\nexport async function retrieve(input: RetrieveInput, services: MindServices): Promise<RetrieveOutput> {\n const manifest = await loadManifest(services.storage, input.indexId);\n const byId = new Map(manifest.chunks.map((c) => [c.id, c]));\n\n // Over-fetch each list so fusion has signal beyond the final cut.\n const candidateLimit = Math.max(input.limit * 3, 30);\n\n // Two orthogonal, optional query bridges (each one LLM call):\n // - HyDE rewrites the VECTOR text (a hypothetical answer sits near the chunks);\n // - expansion augments the BM25 (LEXICAL) text with related identifiers/synonyms.\n const vectorText = input.hyde ? await hypotheticalDocument(input.text, services.llm) : input.text;\n const lexicalText = input.expand ? await expandQuery(input.text, services.llm) : input.text;\n\n const bm25 = bm25Search(manifest.chunks, lexicalText, candidateLimit);\n const vector = await vectorSearch(\n vectorText,\n services.vectorStore,\n (t) => services.embeddings.embed(t),\n input.indexId,\n candidateLimit,\n );\n\n const weights = intentWeights(input.intent);\n const fused = rrfFuse(\n [\n { ranked: vector, weight: weights.vector, label: 'semantic' },\n { ranked: bm25, weight: weights.bm25, label: 'lexical' },\n ],\n input.rrfK,\n );\n\n const ranked: RankedChunk[] = fused\n .map((r) => {\n const chunk = byId.get(r.id);\n return chunk ? { chunk, score: r.score, matchedBy: r.matchedBy } : undefined;\n })\n .filter((r): r is RankedChunk => r !== undefined)\n .slice(0, input.limit);\n\n // Proof-of-value vs grep: how many returned hits are semantic-only (grep-miss).\n const semanticWinRate =\n ranked.length === 0 ? 0 : ranked.filter((r) => r.matchedBy === 'semantic').length / ranked.length;\n\n return { ranked, confidence: confidenceFrom(vector), semanticWinRate };\n}\n\n/** Phase 2 confidence proxy: average cosine of the top-3 vector hits. */\nfunction confidenceFrom(vector: Ranked[]): number {\n if (vector.length === 0) {\n return 0;\n }\n const top = vector.slice(0, 3);\n const avg = top.reduce((a, r) => a + r.score, 0) / top.length;\n return Math.max(0, Math.min(1, avg));\n}\n","/**\n * Heuristic reranking of fused candidates.\n *\n * Lightweight, deterministic signals layered on the fused RRF score:\n * - exact query-term coverage in the chunk text (keyword precision)\n * - identifier hit: a query token appearing verbatim (good for code lookups)\n *\n * An optional LLM reranker can be layered later; this heuristic pass is always\n * available and needs no model.\n */\n\nimport type { RankedChunk } from './retrieve';\nimport { tokenize } from './bm25';\n\nexport function rerank(ranked: RankedChunk[], query: string): RankedChunk[] {\n const qTokens = new Set(tokenize(query));\n if (qTokens.size === 0) {\n return ranked;\n }\n\n const boosted = ranked.map((item) => {\n const docTokens = tokenize(item.chunk.text);\n const docSet = new Set(docTokens);\n let covered = 0;\n for (const q of qTokens) {\n if (docSet.has(q)) {\n covered++;\n }\n }\n const coverage = covered / qTokens.size; // 0..1\n // Verbatim identifier presence (case-insensitive) — strong for symbol lookups.\n const lowerText = item.chunk.text.toLowerCase();\n const verbatim = [...qTokens].some((q) => q.length >= 3 && lowerText.includes(q)) ? 1 : 0;\n\n const boost = 1 + 0.5 * coverage + 0.25 * verbatim;\n return { ...item, score: item.score * boost };\n });\n\n return boosted.sort((a, b) => b.score - a.score);\n}\n","/**\n * Semantic-ish dedup of ranked chunks via token-set Jaccard similarity.\n *\n * Keeps the highest-ranked chunk and drops later near-duplicates (e.g. the same\n * code re-surfaced by both BM25 and vector lists, or overlapping windows).\n * Operates on the small post-fusion list, so O(n²) is fine.\n */\n\nimport type { RankedChunk } from './retrieve';\nimport { tokenize } from './bm25';\n\nfunction jaccard(a: Set<string>, b: Set<string>): number {\n if (a.size === 0 && b.size === 0) {\n return 1;\n }\n let inter = 0;\n for (const t of a) {\n if (b.has(t)) {\n inter++;\n }\n }\n const union = a.size + b.size - inter;\n return union === 0 ? 0 : inter / union;\n}\n\nexport function dedupRanked(ranked: RankedChunk[], threshold = 0.85): RankedChunk[] {\n const kept: RankedChunk[] = [];\n const keptTokens: Set<string>[] = [];\n\n for (const item of ranked) {\n const tokens = new Set(tokenize(item.chunk.text));\n const isDup = keptTokens.some((k) => jaccard(tokens, k) >= threshold);\n if (!isDup) {\n kept.push(item);\n keptTokens.push(tokens);\n }\n }\n\n return kept;\n}\n","/**\n * Anti-hallucination verification + confidence stack.\n *\n * Each retrieved chunk is verified against the live source via `IStorage`:\n * file exists (0.7) + snippet still present (0.3). The verification rate scales\n * the retrieval confidence — a stale or fabricated source drags confidence down.\n * Mirrors the legacy mind concept (source-verifier + confidence floor).\n */\n\nimport type { AgentWarning } from '@kb-labs/mind-contracts';\nimport type { IStorage } from '../services';\nimport type { RankedChunk } from '../retrieval/retrieve';\n\nexport interface VerificationResult {\n /** 0..1 fraction of (weighted) verification across chunks. */\n rate: number;\n /** Per-chunk verification score (0..1), aligned with input order. */\n perChunk: number[];\n}\n\nconst FILE_WEIGHT = 0.7;\nconst SNIPPET_WEIGHT = 0.3;\n\nexport async function verifySources(ranked: RankedChunk[], storage: IStorage): Promise<VerificationResult> {\n if (ranked.length === 0) {\n return { rate: 1, perChunk: [] };\n }\n\n const perChunk: number[] = [];\n for (const { chunk } of ranked) {\n const exists = await storage.exists(chunk.path);\n let score = exists ? FILE_WEIGHT : 0;\n if (exists) {\n const buf = await storage.read(chunk.path);\n const content = buf?.toString('utf8') ?? '';\n // Snippet grounding: a representative line of the chunk is still present.\n const probe = chunk.text.split('\\n').find((l) => l.trim().length > 8)?.trim();\n if (probe && content.includes(probe)) {\n score += SNIPPET_WEIGHT;\n }\n }\n perChunk.push(score);\n }\n\n const rate = perChunk.reduce((a, b) => a + b, 0) / perChunk.length;\n return { rate, perChunk };\n}\n\nexport interface ConfidenceResult {\n confidence: number;\n warnings: AgentWarning[];\n}\n\n/** Combine retrieval confidence with the verification rate; warn below floor. */\nexport function computeConfidence(\n retrievalConfidence: number,\n verificationRate: number,\n floor: number,\n): ConfidenceResult {\n const confidence = Math.max(0, Math.min(1, retrievalConfidence * verificationRate));\n const warnings: AgentWarning[] = [];\n if (confidence < floor) {\n warnings.push({\n code: 'LOW_CONFIDENCE',\n message: `Confidence ${confidence.toFixed(2)} is below the floor ${floor.toFixed(2)}; the answer may be unreliable.`,\n });\n }\n return { confidence, warnings };\n}\n","/**\n * Field-checker — an anti-hallucination signal ported from the legacy engine.\n *\n * An LLM answer that cites code should only name symbols that actually appear\n * in the retrieved sources. We extract code-like symbols from the answer\n * (backtick spans, camelCase/dotted/underscored identifiers, file names) and\n * check each against the retrieved chunks (text + path). The grounded fraction\n * folds into the confidence stack, and any ungrounded terms are surfaced as a\n * warning — a cheap, deterministic guard against fabricated APIs.\n */\n\nimport type { AgentWarning } from '@kb-labs/mind-contracts';\nimport type { RankedChunk } from '../retrieval/retrieve';\n\n/** Heuristic: does this token look like a code symbol worth grounding? */\nfunction isCodeSymbol(t: string): boolean {\n if (t.length < 3 || t.length > 80) {\n return false;\n }\n if (/\\.(ts|tsx|js|jsx|json|md|go|py|rs)$/.test(t)) {\n return true; // file name\n }\n if (t.includes('.') && /[a-zA-Z]/.test(t)) {\n return true; // dotted member access (vectorStore.search, config.loader)\n }\n if (/_/.test(t) && /[a-zA-Z]/.test(t)) {\n return true; // snake_case / CONST_CASE\n }\n if (/[a-z][A-Z]/.test(t)) {\n return true; // camelCase / PascalCase transition (assemblePlatform, EventBus)\n }\n return false;\n}\n\n/** Extract code-like symbols from an answer (deduped, order-preserving). */\nexport function extractSymbols(answer: string): string[] {\n const out = new Set<string>();\n // Backtick spans are the strongest signal — the model is quoting code.\n for (const m of answer.matchAll(/`([^`\\n]{2,80})`/g)) {\n for (const tok of m[1]!.trim().split(/[\\s(),;:[\\]{}'\"]+/)) {\n if (isCodeSymbol(tok)) {\n out.add(tok);\n }\n }\n }\n // Bare identifiers in prose (camelCase/dotted/underscored/hyphenated/file names).\n for (const m of answer.matchAll(/[A-Za-z_$][A-Za-z0-9_$-]*(?:[./][A-Za-z0-9_$.-]+)*/g)) {\n if (isCodeSymbol(m[0])) {\n out.add(m[0]);\n }\n }\n return [...out];\n}\n\nexport interface FieldCheckResult {\n /** 0..1 fraction of extracted symbols grounded in the sources. */\n rate: number;\n /** Symbols not found in any retrieved chunk. */\n ungrounded: string[];\n /** Number of symbols checked (0 → nothing to verify, rate defaults to 1). */\n checked: number;\n}\n\n/** Check that symbols named in the answer appear in the retrieved sources. */\nexport function checkFields(answer: string, ranked: RankedChunk[]): FieldCheckResult {\n const symbols = extractSymbols(answer);\n if (symbols.length === 0) {\n return { rate: 1, ungrounded: [], checked: 0 };\n }\n const corpus = ranked.map((r) => `${r.chunk.path}\\n${r.chunk.text}`).join('\\n').toLowerCase();\n const grounded = (sym: string): boolean => {\n const s = sym.toLowerCase();\n if (corpus.includes(s)) {\n return true;\n }\n // Dotted member (a.b.c): accept if the head object is present in sources.\n const head = s.split('.')[0]!;\n return head.length >= 3 && corpus.includes(head);\n };\n const ungrounded = symbols.filter((s) => !grounded(s));\n return { rate: (symbols.length - ungrounded.length) / symbols.length, ungrounded, checked: symbols.length };\n}\n\n/**\n * Fold a field-check into the confidence stack: ungrounded terms scale\n * confidence down (never below 0) and surface as warnings. Returns the adjusted\n * confidence + the (possibly extended) warning list. Pure — no side effects.\n */\nexport function applyFieldCheck(\n answer: string,\n ranked: RankedChunk[],\n confidence: number,\n warnings: AgentWarning[],\n floor: number,\n): { confidence: number; warnings: AgentWarning[] } {\n const fc = checkFields(answer, ranked);\n if (fc.checked === 0 || fc.rate === 1) {\n return { confidence, warnings };\n }\n const adjusted = Math.max(0, confidence * (0.5 + 0.5 * fc.rate));\n const next = [...warnings];\n if (fc.ungrounded.length > 0) {\n next.push({\n code: 'UNGROUNDED_TERMS',\n message: `Answer mentions ${fc.ungrounded.length} term(s) not found in sources: ${fc.ungrounded.slice(0, 5).join(', ')}`,\n details: { ungrounded: fc.ungrounded, rate: Math.round(fc.rate * 1000) / 1000 },\n });\n }\n if (adjusted < floor && !next.some((w) => w.code === 'LOW_CONFIDENCE')) {\n next.push({\n code: 'LOW_CONFIDENCE',\n message: `Confidence ${adjusted.toFixed(2)} is below the floor ${floor.toFixed(2)}; the answer may be unreliable.`,\n });\n }\n return { confidence: adjusted, warnings: next };\n}\n","/**\n * Query decomposition (multi-step reasoning) for richer agent modes.\n *\n * Asks the LLM to split a complex question into focused sub-queries. Degrades\n * gracefully: if decomposition is disabled or the LLM returns nothing usable,\n * it falls back to the original query alone.\n */\n\nimport type { ILLM } from '../services';\n\nexport async function decompose(query: string, llm: ILLM, maxSubqueries: number): Promise<string[]> {\n if (maxSubqueries <= 0) {\n return [query];\n }\n\n const prompt =\n `Break the following question into at most ${maxSubqueries} focused, self-contained ` +\n `sub-questions that together cover it. Return one sub-question per line, no numbering.\\n\\n` +\n `Question: ${query}`;\n\n try {\n const { content } = await llm.complete(prompt, { temperature: 0.2, maxTokens: 256 });\n const subs = (content ?? '')\n .split('\\n')\n .map((l) => l.replace(/^[-*\\d.)\\s]+/, '').trim())\n .filter((l) => l.length > 0)\n .slice(0, maxSubqueries);\n // Always include the original query so we never lose the primary intent.\n return subs.length > 0 ? [query, ...subs] : [query];\n } catch {\n return [query];\n }\n}\n","/**\n * Shape ranked chunks into lean wire `SearchResult`s (pointers, not payloads).\n *\n * `snippet` rides only as much text as the caller asked for (`--snippet`):\n * none → nothing; line → the first meaningful line; full → truncated chunk.\n */\n\nimport type { SearchResult, SnippetMode } from '@kb-labs/mind-contracts';\nimport type { RankedChunk } from '../retrieval/retrieve';\n\nconst MAX_SNIPPET_CHARS = 600;\n\n/** Extract a snippet of the requested verbosity from chunk text. */\nexport function snippetFrom(text: string, mode: SnippetMode): string | undefined {\n if (mode === 'none') {\n return undefined;\n }\n if (mode === 'full') {\n return text.length > MAX_SNIPPET_CHARS ? `${text.slice(0, MAX_SNIPPET_CHARS)}…` : text;\n }\n // 'line' — the first non-trivial line, for an \"is this it?\" glance.\n const line = text.split('\\n').find((l) => l.trim().length > 8)?.trim() ?? text.trim().slice(0, 120);\n return line.length > 200 ? `${line.slice(0, 200)}…` : line;\n}\n\nexport interface ToResultsOptions {\n snippet: SnippetMode;\n /** file → stale (on-disk drift since indexing). */\n staleByFile: Map<string, boolean>;\n}\n\nexport function toSearchResults(ranked: RankedChunk[], opts: ToResultsOptions): SearchResult[] {\n return ranked.map(({ chunk, matchedBy }) => ({\n file: chunk.path,\n lines: [chunk.startLine, chunk.endLine] as [number, number],\n kind: chunk.kind,\n matchedBy,\n stale: opts.staleByFile.get(chunk.path) ?? false,\n snippet: snippetFrom(chunk.text, opts.snippet),\n }));\n}\n","/**\n * Answer synthesis + frozen `AgentResponse` assembly.\n *\n * Produces the `agent-response-v1` contract consumed by CLAUDE.md and the\n * task-rag skill. The response is validated against the contract zod before\n * being returned, so a drift fails loudly here rather than silently downstream.\n */\n\nimport {\n AgentResponseSchema,\n type AgentResponse,\n type AgentSource,\n type AgentWarning,\n type AgentQueryMode,\n type SnippetMode,\n} from '@kb-labs/mind-contracts';\nimport type { ILLM } from '../services';\nimport type { RankedChunk } from '../retrieval/retrieve';\nimport { snippetFrom } from './synthesize';\n\nconst MAX_SNIPPET_CHARS = 600;\n\nfunction truncate(text: string): string {\n return text.length > MAX_SNIPPET_CHARS ? `${text.slice(0, MAX_SNIPPET_CHARS)}…` : text;\n}\n\n/** Extractive fallback answer (no LLM): the most relevant snippet, attributed. */\nfunction extractiveAnswer(query: string, ranked: RankedChunk[]): string {\n if (ranked.length === 0) {\n return `No indexed content matched the query: \"${query}\".`;\n }\n const top = ranked[0]!.chunk;\n return `Most relevant source: ${top.path} (lines ${top.startLine}-${top.endLine}).\\n\\n${truncate(top.text)}`;\n}\n\nexport async function synthesizeAnswer(\n query: string,\n ranked: RankedChunk[],\n llm: ILLM,\n useLLM: boolean,\n): Promise<string> {\n if (!useLLM || ranked.length === 0) {\n return extractiveAnswer(query, ranked);\n }\n\n const context = ranked\n .map((r, i) => `[${i + 1}] ${r.chunk.path}:${r.chunk.startLine}-${r.chunk.endLine}\\n${r.chunk.text}`)\n .join('\\n\\n');\n\n const prompt =\n `Answer the question using ONLY the provided context. Be concise and cite the ` +\n `relevant files by path. If the context does not contain the answer, say so.\\n\\n` +\n `Question: ${query}\\n\\nContext:\\n${context}`;\n\n try {\n const { content } = await llm.complete(prompt, { temperature: 0.2, maxTokens: 800 });\n const trimmed = (content ?? '').trim();\n return trimmed.length > 0 ? trimmed : extractiveAnswer(query, ranked);\n } catch {\n return extractiveAnswer(query, ranked);\n }\n}\n\nexport interface ToSourcesOptions {\n snippet: SnippetMode;\n staleByFile: Map<string, boolean>;\n}\n\nexport function toSources(ranked: RankedChunk[], opts: ToSourcesOptions): AgentSource[] {\n return ranked.map(({ chunk, matchedBy }) => ({\n file: chunk.path,\n lines: [chunk.startLine, chunk.endLine] as [number, number],\n kind: chunk.kind,\n matchedBy,\n stale: opts.staleByFile.get(chunk.path) ?? false,\n snippet: snippetFrom(chunk.text, opts.snippet),\n }));\n}\n\nexport interface BuildAgentResponseInput {\n answer: string;\n ranked: RankedChunk[];\n confidence: number;\n mode: AgentQueryMode;\n requestId: string;\n timingMs: number;\n indexId: string;\n floor: number;\n snippet: SnippetMode;\n staleByFile: Map<string, boolean>;\n warnings?: AgentWarning[];\n}\n\n/** Assemble + validate the lean agent response. */\nexport function buildAgentResponse(input: BuildAgentResponseInput): AgentResponse {\n const sources = toSources(input.ranked, { snippet: input.snippet, staleByFile: input.staleByFile });\n const abstained = input.confidence < input.floor || sources.length === 0;\n\n const response: AgentResponse = {\n answer: input.answer,\n confidence: input.confidence,\n abstained,\n sources,\n warnings: input.warnings && input.warnings.length > 0 ? input.warnings : undefined,\n meta: {\n requestId: input.requestId,\n mode: input.mode,\n timingMs: input.timingMs,\n indexId: input.indexId,\n },\n };\n\n // Fail loudly if we ever drift from the contract.\n return AgentResponseSchema.parse(response);\n}\n","/**\n * Task-orientation map. No hardcoded role/name heuristics: relevance + ranking\n * come from retrieval, the orientation (\"where to start / how involved\") comes\n * from the model, and structure (`spread`) is derived from the actual paths.\n */\n\nimport type { ExploreEntry } from '@kb-labs/mind-contracts';\nimport type { ILLM } from '../services';\nimport type { RankedChunk } from '../retrieval/retrieve';\nimport { snippetFrom } from './synthesize';\n\n/** Ranked chunks → entries deduped by file (best rank kept). `why` = matched line. */\nexport function toExploreEntries(ranked: RankedChunk[], staleByFile: Map<string, boolean>): ExploreEntry[] {\n const seen = new Set<string>();\n const out: ExploreEntry[] = [];\n for (const r of ranked) {\n if (seen.has(r.chunk.path)) {\n continue;\n }\n seen.add(r.chunk.path);\n const line = snippetFrom(r.chunk.text, 'line');\n out.push({\n file: r.chunk.path,\n lines: [r.chunk.startLine, r.chunk.endLine] as [number, number],\n why: line && line.length > 0 ? line : `${r.chunk.kind} file`,\n matchedBy: r.matchedBy,\n stale: staleByFile.get(r.chunk.path) ?? false,\n });\n }\n return out;\n}\n\n/** Distinct directories the files span — a structural \"how spread out\" hint. */\nexport function spreadOf(files: string[]): number {\n return new Set(\n files.map((f) => {\n const i = f.lastIndexOf('/');\n return i < 0 ? '.' : f.slice(0, i);\n }),\n ).size;\n}\n\n/**\n * Model-synthesized orientation grounded in the retrieved files. Empty string\n * when no LLM is available (e.g. instant mode) — the file list still stands.\n */\nexport async function orientationSummary(\n task: string,\n entries: ExploreEntry[],\n llm: ILLM,\n useLLM: boolean,\n): Promise<string> {\n if (!useLLM || entries.length === 0) {\n return '';\n }\n const list = entries.map((e, i) => `[${i + 1}] ${e.file}:${e.lines[0]}-${e.lines[1]} — ${e.why}`).join('\\n');\n const prompt =\n `A developer must approach the task below in an unfamiliar codebase. Using ONLY the ` +\n `relevant files listed, briefly explain WHERE to start, the KEY files and their role, ` +\n `and HOW involved the task looks. Be concise; cite files by path.\\n\\n` +\n `Task: ${task}\\n\\nRelevant files:\\n${list}`;\n try {\n const { content } = await llm.complete(prompt, { temperature: 0.2, maxTokens: 400 });\n return (content ?? '').trim();\n } catch {\n return '';\n }\n}\n","/**\n * Query-history feedback loop via the platform cache (sorted set).\n *\n * Records queries per index (scored by timestamp) so the engine can learn from\n * usage over time. Best-effort: cache failures never break a query.\n */\n\nimport type { ICache } from '../services';\nimport { MIND_NAMESPACE_PREFIX } from '@kb-labs/mind-contracts';\n\nfunction historyKey(indexId: string): string {\n return `${MIND_NAMESPACE_PREFIX}history:${indexId}`;\n}\n\nexport async function recordQuery(\n cache: ICache,\n indexId: string,\n query: string,\n at: number,\n): Promise<void> {\n try {\n await cache.zadd(historyKey(indexId), at, query);\n } catch {\n // Feedback is best-effort; never fail the user's query because of it.\n }\n}\n\nexport async function recentQueries(\n cache: ICache,\n indexId: string,\n sinceMs = 0,\n): Promise<string[]> {\n try {\n return await cache.zrangebyscore(historyKey(indexId), sinceMs, Number.MAX_SAFE_INTEGER);\n } catch {\n return [];\n }\n}\n","/**\n * Mind facade — the single object the plugin (CLI + REST) talks to.\n *\n * `createMind(services, config)` returns verbs that both the CLI commands and\n * REST handlers call identically, so behaviour is shared by construction.\n * Phase 2 ships `index` / `search` / `status`; `ask`, `sync`, `reindex` are\n * layered in later phases.\n */\n\nimport type {\n MindConfig,\n IndexRequest,\n IndexResponse,\n SearchRequest,\n SearchResponse,\n StatusResponse,\n IndexSummary,\n HealthResponse,\n QueryRequest,\n AgentResponse,\n AgentQueryMode,\n ExploreRequest,\n ExploreResponse,\n SyncResponse,\n SyncListResponse,\n SyncStatusResponse,\n ReindexRequest,\n DropRequest,\n DropResponse,\n} from '@kb-labs/mind-contracts';\nimport { effectiveIndexConfig, resolveScope } from '@kb-labs/mind-contracts';\nimport type { MindServices } from './services';\nimport type { RankedChunk } from './retrieval/retrieve';\nimport { ingest, type IngestProgress } from './ingest/ingest';\nimport { syncAdd, syncUpdate, syncDelete, type SyncOptions } from './sync';\nimport { retrieve } from './retrieval/retrieve';\nimport { rerank } from './retrieval/rerank';\nimport { dedupRanked } from './retrieval/dedup';\nimport { verifySources, computeConfidence } from './answer/verify';\nimport { applyFieldCheck } from './answer/field-check';\nimport { decompose } from './answer/decompose';\nimport { synthesizeAnswer, buildAgentResponse } from './answer/answer';\nimport { toExploreEntries, spreadOf, orientationSummary } from './answer/explore';\nimport { recordQuery } from './feedback/history';\nimport { toSearchResults } from './answer/synthesize';\nimport { loadManifest, staleMap, staleCount, deleteManifest, manifestExists } from './index-store';\n\nexport interface Mind {\n index(req: IndexRequest, onProgress?: (event: IngestProgress) => void): Promise<IndexResponse>;\n search(req: SearchRequest): Promise<SearchResponse>;\n ask(req: QueryRequest): Promise<AgentResponse>;\n explore(req: ExploreRequest): Promise<ExploreResponse>;\n reindex(req: ReindexRequest): Promise<IndexResponse>;\n drop(req: DropRequest): Promise<DropResponse>;\n syncAdd(paths: string[], indexId?: string): Promise<SyncResponse>;\n syncUpdate(paths: string[], indexId?: string): Promise<SyncResponse>;\n syncDelete(paths: string[], indexId?: string): Promise<SyncResponse>;\n syncList(indexId?: string): Promise<SyncListResponse>;\n syncStatus(indexId?: string): Promise<SyncStatusResponse>;\n status(indexId?: string): Promise<StatusResponse>;\n health(): Promise<HealthResponse>;\n}\n\nexport interface CreateMindOptions {\n /** Workspace root that source paths are resolved against (default: process.cwd()). */\n cwd?: string;\n /** Injectable clock for deterministic tests. */\n now?: () => number;\n /** Injectable ISO timestamp source for manifest bookkeeping. */\n isoNow?: () => string;\n}\n\nexport function createMind(\n services: MindServices,\n config: MindConfig,\n options: CreateMindOptions = {},\n): Mind {\n const now = options.now ?? (() => Date.now());\n const isoNow = options.isoNow ?? (() => new Date(now()).toISOString());\n const cwd = options.cwd ?? process.cwd();\n\n function resolveIndexId(indexId?: string): string {\n return indexId && indexId.trim() !== '' ? indexId : config.defaultIndex;\n }\n\n function syncOpts(indexId: string): SyncOptions {\n const eff = effectiveIndexConfig(config, indexId);\n return {\n indexId,\n cwd,\n chunk: { maxTokens: eff.chunk.maxTokens, overlapTokens: eff.chunk.overlapTokens },\n ast: eff.chunk.ast,\n now: isoNow(),\n };\n }\n\n return {\n async index(req, onProgress): Promise<IndexResponse> {\n const indexId = resolveIndexId(req.indexId);\n const eff = effectiveIndexConfig(config, indexId);\n const start = now();\n const result = await ingest(\n {\n indexId,\n cwd,\n // CLI `--scope` overrides the include set (keeping configured excludes);\n // otherwise use the index's configured include/exclude scope.\n scope: req.scope ? { include: [req.scope], exclude: eff.scope.exclude } : eff.scope,\n full: req.full,\n chunk: { maxTokens: eff.chunk.maxTokens, overlapTokens: eff.chunk.overlapTokens },\n ast: eff.chunk.ast,\n now: isoNow(),\n onProgress,\n },\n services,\n );\n const durationMs = now() - start;\n services.logger?.info('mind: index', {\n indexId,\n filesIndexed: result.filesIndexed,\n chunks: result.chunks,\n added: result.added,\n updated: result.updated,\n removed: result.removed,\n unchanged: result.unchanged,\n durationMs,\n });\n return { indexId, filesIndexed: result.filesIndexed, chunks: result.chunks, durationMs };\n },\n\n async search(req): Promise<SearchResponse> {\n const indexId = resolveIndexId(req.indexId);\n const retrieval = effectiveIndexConfig(config, indexId).retrieval;\n const limit = req.limit ?? retrieval.limit;\n const snippet = req.snippet ?? 'line';\n const t0 = now();\n\n // Over-fetch, then refine: retrieve -> rerank -> dedup.\n const retrieved = await retrieve(\n { text: req.text, indexId, limit: limit * 3, intent: req.intent, rrfK: retrieval.rrfK, hyde: retrieval.hyde, expand: retrieval.expand },\n services,\n );\n let ranked = retrieval.rerank ? rerank(retrieved.ranked, req.text) : retrieved.ranked;\n if (retrieval.dedup) {\n ranked = dedupRanked(ranked);\n }\n ranked = ranked.slice(0, limit);\n\n // Per-result freshness for the returned files only (bounded cost).\n const manifest = await loadManifest(services.storage, indexId);\n const stales = await staleMap(manifest, ranked.map((r) => r.chunk.path), cwd);\n const results = toSearchResults(ranked, { snippet, staleByFile: stales });\n const staleCount = [...stales.values()].filter(Boolean).length;\n const timingMs = now() - t0;\n\n services.logger?.info('mind: search', {\n indexId,\n results: results.length,\n semanticWinRate: retrieved.semanticWinRate,\n staleCount,\n timingMs,\n });\n return {\n results,\n confidence: retrieved.confidence,\n indexId,\n meta: { requestId: `mind:${t0}`, timingMs, semanticWinRate: retrieved.semanticWinRate, staleCount },\n };\n },\n\n async ask(req): Promise<AgentResponse> {\n const indexId = resolveIndexId(req.indexId);\n const retrieval = effectiveIndexConfig(config, indexId).retrieval;\n const mode: AgentQueryMode = req.mode ?? 'auto';\n const budget = config.modes[mode];\n const t0 = now();\n\n // Feedback: record the query (best-effort).\n await recordQuery(services.cache, indexId, req.text, t0);\n\n // Decompose into sub-queries for richer modes; always retains the original.\n const queries = budget.useLLM\n ? await decompose(req.text, services.llm, budget.maxSubqueries)\n : [req.text];\n\n // Gather across sub-queries, merging by chunk id (keep best score).\n const merged = new Map<string, RankedChunk>();\n let retrievalConfidence = 0;\n for (const q of queries) {\n const r = await retrieve(\n { text: q, indexId, limit: budget.maxChunks, intent: undefined, rrfK: retrieval.rrfK, hyde: retrieval.hyde, expand: retrieval.expand },\n services,\n );\n retrievalConfidence = Math.max(retrievalConfidence, r.confidence);\n for (const rc of r.ranked) {\n const prev = merged.get(rc.chunk.id);\n if (!prev || rc.score > prev.score) {\n merged.set(rc.chunk.id, rc);\n }\n }\n }\n\n let ranked = retrieval.rerank\n ? rerank([...merged.values()], req.text)\n : [...merged.values()].sort((a, b) => b.score - a.score);\n if (retrieval.dedup) {\n ranked = dedupRanked(ranked);\n }\n ranked = ranked.slice(0, budget.maxChunks);\n\n const verification = await verifySources(ranked, services.storage);\n const base = computeConfidence(retrievalConfidence, verification.rate, config.confidence.floor);\n\n const answer = await synthesizeAnswer(req.text, ranked, services.llm, budget.useLLM);\n\n // Field-check (anti-hallucination): symbols the answer names must exist in\n // the retrieved sources. Ungrounded terms penalise confidence and warn.\n const { confidence, warnings } = budget.useLLM\n ? applyFieldCheck(answer, ranked, base.confidence, base.warnings, config.confidence.floor)\n : base;\n\n const manifest = await loadManifest(services.storage, indexId);\n const staleByFile = await staleMap(manifest, ranked.map((r) => r.chunk.path), cwd);\n\n const timingMs = now() - t0;\n services.logger?.info('mind: ask', {\n indexId,\n mode,\n subqueries: queries.length,\n chunks: ranked.length,\n confidence: Math.round(confidence * 1000) / 1000,\n timingMs,\n });\n return buildAgentResponse({\n answer,\n ranked,\n confidence,\n mode,\n requestId: `mind:${t0}`,\n timingMs,\n indexId,\n floor: config.confidence.floor,\n snippet: req.snippet ?? 'line',\n staleByFile,\n warnings,\n });\n },\n\n async explore(req): Promise<ExploreResponse> {\n const indexId = resolveIndexId(req.indexId);\n const retrieval = effectiveIndexConfig(config, indexId).retrieval;\n // A map is a wider view than a search; the model decides what to open.\n const budget = config.modes.auto;\n const limit = req.limit ?? retrieval.limit;\n const t0 = now();\n\n // Over-fetch with an architecture lens, then refine: retrieve -> rerank -> dedup.\n const retrieved = await retrieve(\n { text: req.task, indexId, limit: limit * 3, intent: 'architecture', rrfK: retrieval.rrfK, hyde: retrieval.hyde, expand: retrieval.expand },\n services,\n );\n let ranked = retrieval.rerank ? rerank(retrieved.ranked, req.task) : retrieved.ranked;\n if (retrieval.dedup) {\n ranked = dedupRanked(ranked);\n }\n ranked = ranked.slice(0, limit);\n\n const manifest = await loadManifest(services.storage, indexId);\n const stales = await staleMap(manifest, ranked.map((r) => r.chunk.path), cwd);\n const files = toExploreEntries(ranked, stales);\n const spread = spreadOf(files.map((f) => f.file));\n const summary = await orientationSummary(req.task, files, services.llm, budget.useLLM);\n const timingMs = now() - t0;\n\n services.logger?.info('mind: explore', {\n indexId,\n filesTouched: files.length,\n spread,\n timingMs,\n });\n return {\n task: req.task,\n indexId,\n confidence: retrieved.confidence,\n summary,\n files,\n meta: { requestId: `mind:${t0}`, timingMs, filesTouched: files.length, spread },\n };\n },\n\n async reindex(req): Promise<IndexResponse> {\n return this.index({ indexId: req.indexId, full: true });\n },\n\n async drop(req): Promise<DropResponse> {\n const indexId = resolveIndexId(req.indexId);\n if (!(await manifestExists(services.storage, indexId))) {\n throw new Error(`No such index \"${indexId}\" — nothing to drop (run \\`kb mind status\\` to list indexes).`);\n }\n const manifest = await loadManifest(services.storage, indexId);\n const ids = manifest.chunks.map((c) => c.id);\n const droppedFiles = Object.keys(manifest.files).length;\n // Remove vectors in batches (large indexes have tens of thousands of ids).\n const BATCH = 500;\n for (let i = 0; i < ids.length; i += BATCH) {\n await services.vectorStore.delete(ids.slice(i, i + BATCH), indexId);\n }\n await deleteManifest(services.storage, indexId);\n services.logger?.info('mind: drop', { indexId, droppedChunks: ids.length, droppedFiles });\n return { indexId, droppedChunks: ids.length, droppedFiles };\n },\n\n async syncAdd(paths, indexId): Promise<SyncResponse> {\n const id = resolveIndexId(indexId);\n const counts = await syncAdd(paths, services, syncOpts(id));\n return { indexId: id, ...counts };\n },\n\n async syncUpdate(paths, indexId): Promise<SyncResponse> {\n const id = resolveIndexId(indexId);\n const counts = await syncUpdate(paths, services, syncOpts(id));\n return { indexId: id, ...counts };\n },\n\n async syncDelete(paths, indexId): Promise<SyncResponse> {\n const id = resolveIndexId(indexId);\n const counts = await syncDelete(paths, services, syncOpts(id));\n return { indexId: id, ...counts };\n },\n\n async syncList(indexId): Promise<SyncListResponse> {\n const id = resolveIndexId(indexId);\n const manifest = await loadManifest(services.storage, id);\n return {\n indexId: id,\n documents: Object.entries(manifest.files).map(([path, info]) => ({\n path,\n chunks: info.chunks,\n indexedAt: info.indexedAt,\n })),\n };\n },\n\n async syncStatus(indexId): Promise<SyncStatusResponse> {\n const id = resolveIndexId(indexId);\n const manifest = await loadManifest(services.storage, id);\n return {\n indexId: id,\n documents: Object.keys(manifest.files).length,\n chunks: manifest.chunks.length,\n lastIndexedAt: manifest.updatedAt,\n stale: false,\n };\n },\n\n async status(indexId): Promise<StatusResponse> {\n // Show every CONFIGURED index (even if not yet built) plus any built ones,\n // so an agent can see which corpora/scopes the project offers.\n const ids = indexId\n ? [indexId]\n : [...new Set([...Object.keys(config.indexes), ...(await listIndexIds(services))])];\n const indexes: IndexSummary[] = [];\n for (const id of ids) {\n const manifest = await loadManifest(services.storage, id);\n const declared = config.indexes[id];\n const sc = resolveScope(declared?.scope);\n const coverage =\n sc.include.join(', ') + (sc.exclude.length ? ` · excl ${sc.exclude.join(', ')}` : '');\n indexes.push({\n indexId: id,\n label: declared?.label,\n coverage,\n documents: Object.keys(manifest.files).length,\n chunks: manifest.chunks.length,\n lastIndexedAt: manifest.updatedAt,\n staleCount: await staleCount(manifest, cwd),\n });\n }\n return { indexes, healthy: true };\n },\n\n async health(): Promise<HealthResponse> {\n return {\n ok: true,\n vectorStore: Boolean(services.vectorStore),\n embeddings: Boolean(services.embeddings),\n llm: Boolean(services.llm),\n };\n },\n };\n}\n\n/** Enumerate index ids by scanning persisted manifests under `mind/`. */\nasync function listIndexIds(services: MindServices): Promise<string[]> {\n const paths = await services.storage.list('mind/');\n const ids = new Set<string>();\n for (const p of paths) {\n const match = /^mind\\/([^/]+)\\/manifest\\.json$/.exec(p);\n if (match) {\n ids.add(match[1]!);\n }\n }\n return [...ids];\n}\n","/**\n * Pipeline primitive.\n *\n * Every stage is a pure function `(input, services) => output`. A `Tracer`\n * times each stage and collects `StageTrace` entries so the full query flow\n * (retrieve → fuse → rerank → verify → compress → synthesize) is observable.\n * Modes (instant/auto/thinking) are just configs deciding which stages run —\n * never separate code paths.\n */\n\nimport type { StageTrace, Trace } from '@kb-labs/mind-contracts';\nimport type { MindServices } from './services';\n\nexport type Stage<I, O> = (input: I, services: MindServices) => Promise<O>;\n\n/** Monotonic clock; injectable so tests stay deterministic. */\nexport type Clock = () => number;\n\nconst defaultClock: Clock = () => Date.now();\n\n/**\n * Collects per-stage traces for one request. `run` times a stage and records\n * its duration + output size.\n */\nexport class Tracer {\n private readonly stages: StageTrace[] = [];\n\n constructor(\n private readonly requestId: string,\n private readonly mode: string,\n private readonly clock: Clock = defaultClock,\n ) {}\n\n async run<I, O>(stage: string, input: I, services: MindServices, fn: Stage<I, O>): Promise<O> {\n const start = this.clock();\n const output = await fn(input, services);\n this.stages.push({\n stage,\n durationMs: this.clock() - start,\n outputCount: Array.isArray(output) ? output.length : undefined,\n });\n return output;\n }\n\n /** Record a stage trace manually (for stages not wrapped by `run`). */\n record(trace: StageTrace): void {\n this.stages.push(trace);\n }\n\n build(totalMs: number): Trace {\n return {\n requestId: this.requestId,\n mode: this.mode,\n totalMs,\n stages: [...this.stages],\n };\n }\n}\n"]}
1
+ {"version":3,"sources":["../../home/runner/work/kb-labs/kb-labs/plugins/mind/core/src/types.ts","../../home/runner/work/kb-labs/kb-labs/plugins/mind/core/src/ingest/discover.ts","../../home/runner/work/kb-labs/kb-labs/plugins/mind/core/src/ingest/chunk.ts","../../home/runner/work/kb-labs/kb-labs/plugins/mind/core/src/ingest/structural.ts","../../home/runner/work/kb-labs/kb-labs/plugins/mind/core/src/ingest/embed.ts","../../home/runner/work/kb-labs/kb-labs/plugins/mind/core/src/index-store.ts","../../home/runner/work/kb-labs/kb-labs/plugins/mind/core/src/ingest/ingest.ts","../../home/runner/work/kb-labs/kb-labs/plugins/mind/core/src/sync.ts","../../home/runner/work/kb-labs/kb-labs/plugins/mind/core/src/retrieval/bm25.ts","../../home/runner/work/kb-labs/kb-labs/plugins/mind/core/src/retrieval/vector.ts","../../home/runner/work/kb-labs/kb-labs/plugins/mind/core/src/retrieval/fuse.ts","../../home/runner/work/kb-labs/kb-labs/plugins/mind/core/src/retrieval/hyde.ts","../../home/runner/work/kb-labs/kb-labs/plugins/mind/core/src/retrieval/expand.ts","../../home/runner/work/kb-labs/kb-labs/plugins/mind/core/src/retrieval/retrieve.ts","../../home/runner/work/kb-labs/kb-labs/plugins/mind/core/src/retrieval/rerank.ts","../../home/runner/work/kb-labs/kb-labs/plugins/mind/core/src/retrieval/dedup.ts","../../home/runner/work/kb-labs/kb-labs/plugins/mind/core/src/answer/verify.ts","../../home/runner/work/kb-labs/kb-labs/plugins/mind/core/src/answer/field-check.ts","../../home/runner/work/kb-labs/kb-labs/plugins/mind/core/src/answer/decompose.ts","../../home/runner/work/kb-labs/kb-labs/plugins/mind/core/src/answer/synthesize.ts","../../home/runner/work/kb-labs/kb-labs/plugins/mind/core/src/answer/answer.ts","../../home/runner/work/kb-labs/kb-labs/plugins/mind/core/src/answer/explore.ts","../../home/runner/work/kb-labs/kb-labs/plugins/mind/core/src/feedback/history.ts","../../home/runner/work/kb-labs/kb-labs/plugins/mind/core/src/mind.ts","../../home/runner/work/kb-labs/kb-labs/plugins/mind/core/src/pipeline.ts"],"names":["path","approxTokens","readFile","join","MAX_SNIPPET_CHARS","staleCount"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Internal engine types (not wire contracts).\n *\n * A `Chunk` is the unit of indexing/retrieval. Chunks are stored two ways:\n * - in the vector store (one `VectorRecord` per chunk, scoped by namespace=indexId)\n * for semantic search;\n * - in a per-index `chunks.json` via `IStorage` as the corpus for BM25 and\n * listing/status.\n */\n\nimport type { AgentSourceKind } from '@kb-labs/mind-contracts';\n\nexport interface Chunk {\n /** Stable id: `${path}#${startLine}-${endLine}`. */\n id: string;\n path: string;\n startLine: number;\n endLine: number;\n text: string;\n kind: AgentSourceKind;\n}\n\n/** Metadata stored alongside each vector record. */\nexport interface ChunkMeta extends Record<string, unknown> {\n path: string;\n startLine: number;\n endLine: number;\n text: string;\n kind: AgentSourceKind;\n}\n\n/** Per-file bookkeeping. `hash` enables incremental (delta) re-indexing. */\nexport interface FileEntry {\n chunks: number;\n indexedAt: string;\n /** Content hash; unchanged hash ⇒ file skipped on re-index. */\n hash: string;\n}\n\n/** Persisted per-index corpus (source of truth for BM25 + listing). */\nexport interface IndexManifest {\n indexId: string;\n /** Chunks keyed by id. */\n chunks: Chunk[];\n /** Per-path bookkeeping for incremental sync. */\n files: Record<string, FileEntry>;\n updatedAt: string | null;\n}\n\nexport function chunkId(path: string, startLine: number, endLine: number): string {\n return `${path}#${startLine}-${endLine}`;\n}\n\n/** Stable content hash for delta detection (FNV-1a, dependency-free). */\nexport function hashContent(text: string): string {\n let h = 0x811c9dc5;\n for (let i = 0; i < text.length; i++) {\n h ^= text.charCodeAt(i);\n h = Math.imul(h, 0x01000193);\n }\n return (h >>> 0).toString(16);\n}\n\n/** Derive a source kind from a file path. */\nexport function kindFromPath(path: string): AgentSourceKind {\n const lower = path.toLowerCase();\n if (lower.includes('/adr/') || /adr-\\d+/.test(lower)) {\n return 'adr';\n }\n if (lower.endsWith('.md') || lower.endsWith('.mdx') || lower.endsWith('.txt')) {\n return 'doc';\n }\n if (\n lower.endsWith('.json') ||\n lower.endsWith('.yaml') ||\n lower.endsWith('.yml') ||\n lower.endsWith('.toml')\n ) {\n return 'config';\n }\n return 'code';\n}\n","/**\n * Adaptive source-file discovery via `globby` over the real filesystem.\n *\n * Reads the repo relative to `cwd` — NOT the platform `storage` adapter, which\n * is a blob store that recurses into node_modules and chokes on pnpm symlink\n * chains. Symlinks are not followed and dependency/build dirs are excluded.\n *\n * No language allowlist: we glob every file and KEEP whatever looks like source\n * text, excluding only binaries, media, archives, data blobs, lockfiles and\n * oversized/generated files. A new language (`.cs`, `.vue`, `.kt`, …) is indexed\n * automatically — discovery adapts to the repo instead of being hand-curated.\n *\n * Returns paths relative to `cwd`.\n */\n\nimport globby from 'globby';\nimport { statSync, openSync, readSync, closeSync } from 'node:fs';\nimport path from 'node:path';\n\nconst IGNORE = [\n '**/node_modules/**',\n '**/dist/**',\n '**/build/**',\n '**/out/**',\n '**/coverage/**',\n '**/.git/**',\n '**/.kb/**',\n '**/bin/**',\n '**/obj/**',\n '**/.next/**',\n '**/.nuxt/**',\n '**/vendor/**',\n '**/__pycache__/**',\n];\n\n/**\n * Non-source extensions — binary, media, archives, data blobs, sourcemaps,\n * minified bundles. Everything NOT here is treated as source if it is text.\n */\nconst DENY_EXT = new Set([\n 'png', 'jpg', 'jpeg', 'gif', 'svg', 'ico', 'webp', 'bmp', 'tif', 'tiff', 'avif',\n 'mp4', 'mov', 'avi', 'webm', 'mp3', 'wav', 'ogg', 'flac', 'pdf',\n 'woff', 'woff2', 'ttf', 'eot', 'otf',\n 'zip', 'gz', 'tgz', 'bz2', 'xz', 'tar', 'rar', '7z',\n 'exe', 'dll', 'so', 'dylib', 'bin', 'wasm', 'class', 'node', 'pdb',\n 'xlsx', 'xls', 'docx', 'doc', 'pptx', 'ppt', 'parquet', 'db', 'sqlite',\n 'map', 'min.js', 'min.css', 'snap',\n // Bulk data / logs / dumps — text, but no semantic value and they bloat the\n // index + embedding cost (the old extension allowlist excluded these by omission).\n 'csv', 'tsv', 'ndjson', 'jsonl', 'log', 'sql', 'dump', 'out',\n]);\n\n/** Generated/lock files that are text but carry no semantic signal. */\nconst DENY_FILE = new Set([\n 'package-lock.json', 'pnpm-lock.yaml', 'yarn.lock', 'go.sum', 'Cargo.lock', 'composer.lock',\n]);\n\n/** Skip empty and oversized (usually generated/minified) files. */\nconst MAX_BYTES = 512 * 1024;\n\nfunction extOf(file: string): string {\n const name = file.slice(file.lastIndexOf('/') + 1).toLowerCase();\n if (name.endsWith('.min.js')) {\n return 'min.js';\n }\n if (name.endsWith('.min.css')) {\n return 'min.css';\n }\n const dot = name.lastIndexOf('.');\n return dot === -1 ? '' : name.slice(dot + 1);\n}\n\n/** Cheap binary sniff: a NUL byte in the first 4 KB ⇒ treat as binary. */\nfunction isBinary(abs: string): boolean {\n let fd: number | undefined;\n try {\n fd = openSync(abs, 'r');\n const buf = Buffer.alloc(4096);\n const n = readSync(fd, buf, 0, buf.length, 0);\n for (let i = 0; i < n; i++) {\n if (buf[i] === 0) {\n return true;\n }\n }\n return false;\n } catch {\n return true; // unreadable ⇒ skip\n } finally {\n if (fd !== undefined) {\n closeSync(fd);\n }\n }\n}\n\n/** Strip trailing slashes without a backtracking regex (avoids polynomial ReDoS). */\nfunction trimTrailingSlashes(s: string): string {\n let end = s.length;\n while (end > 0 && s.charCodeAt(end - 1) === 47 /* '/' */) {\n end--;\n }\n return s.slice(0, end);\n}\n\n/** Scope the engine discovers against — config-driven include/exclude globs. */\nexport interface DiscoverScope {\n /** Repo-relative roots/globs to index. Empty/undefined ⇒ whole repo. */\n include?: string[];\n /** Globs subtracted from the include set (added to the ignore list). */\n exclude?: string[];\n}\n\nexport async function discover(cwd: string, scope?: DiscoverScope): Promise<string[]> {\n const include = scope?.include && scope.include.length > 0 ? scope.include : ['.'];\n const exclude = scope?.exclude ?? [];\n\n // Each include root → a recursive glob ('.' ⇒ whole repo). exclude globs\n // join the ignore list, so they're subtracted from whatever include matched.\n const patterns = include.map((p) => {\n const base = p && p !== '.' ? trimTrailingSlashes(p) : '';\n return base ? `${base}/**/*` : '**/*';\n });\n\n const candidates = await globby(patterns, {\n cwd,\n ignore: [...IGNORE, ...exclude],\n dot: false,\n followSymbolicLinks: false,\n gitignore: false,\n onlyFiles: true,\n });\n\n return candidates.filter((rel) => {\n if (DENY_FILE.has(rel.slice(rel.lastIndexOf('/') + 1))) {\n return false;\n }\n if (DENY_EXT.has(extOf(rel))) {\n return false;\n }\n const abs = path.join(cwd, rel);\n try {\n const st = statSync(abs);\n if (st.size === 0 || st.size > MAX_BYTES) {\n return false;\n }\n } catch {\n return false;\n }\n return !isBinary(abs);\n });\n}\n","/**\n * Sliding-window chunker (Phase 2 baseline; AST chunking is layered in Phase 3).\n *\n * Splits a file into line-aligned chunks of roughly `maxTokens` tokens with\n * `overlapTokens` of overlap. Token count is approximated by whitespace words —\n * good enough for windowing; real tokenization is not needed here.\n */\n\nimport type { Chunk } from '../types';\nimport { chunkId, kindFromPath } from '../types';\n\nexport interface ChunkOptions {\n maxTokens: number;\n overlapTokens: number;\n}\n\nfunction approxTokens(line: string): number {\n const t = line.trim();\n if (t === '') {\n return 0;\n }\n return t.split(/\\s+/).length;\n}\n\nexport function slidingWindowChunks(path: string, content: string, opts: ChunkOptions): Chunk[] {\n const lines = content.split('\\n');\n const kind = kindFromPath(path);\n const chunks: Chunk[] = [];\n\n const maxTokens = Math.max(1, opts.maxTokens);\n const overlapTokens = Math.max(0, Math.min(opts.overlapTokens, maxTokens - 1));\n\n let startIdx = 0;\n while (startIdx < lines.length) {\n let tokens = 0;\n let endIdx = startIdx;\n while (endIdx < lines.length && tokens < maxTokens) {\n tokens += approxTokens(lines[endIdx] ?? '');\n endIdx++;\n }\n\n const startLine = startIdx + 1; // 1-based, inclusive\n const endLine = endIdx; // 1-based, inclusive\n const text = lines.slice(startIdx, endIdx).join('\\n');\n\n if (text.trim() !== '') {\n chunks.push({ id: chunkId(path, startLine, endLine), path, startLine, endLine, text, kind });\n }\n\n if (endIdx >= lines.length) {\n break;\n }\n\n // Step back by roughly `overlapTokens` worth of lines for overlap.\n let overlap = 0;\n let stepBack = 0;\n let i = endIdx - 1;\n while (i > startIdx && overlap < overlapTokens) {\n overlap += approxTokens(lines[i] ?? '');\n stepBack++;\n i--;\n }\n startIdx = Math.max(startIdx + 1, endIdx - stepBack);\n }\n\n return chunks;\n}\n","/**\n * Structure-aware chunking for code (AST-lite).\n *\n * Splits a source file at top-level declaration boundaries (functions, classes,\n * interfaces, etc.) so chunks align with logical units instead of arbitrary\n * windows. Oversized blocks fall back to the sliding window. This is a\n * dependency-free approximation of AST chunking; a tree-sitter backend can\n * replace it later behind the same `chunkFile` entry without touching callers.\n */\n\nimport type { Chunk } from '../types';\nimport { chunkId, kindFromPath } from '../types';\nimport { slidingWindowChunks, type ChunkOptions } from './chunk';\n\n// Declaration keywords and leading modifiers. We detect boundaries by scanning\n// the line's leading words (linear) rather than a multi-optional-group regex —\n// the latter is a polynomial-ReDoS shape on attacker-controlled file content.\nconst DECL_KEYWORDS = new Set([\n 'function', 'class', 'interface', 'type', 'enum', 'const', 'let', 'var',\n 'namespace', 'module', 'def', 'func', 'fn', 'impl', 'struct', 'trait',\n 'public', 'private',\n]);\nconst MODIFIERS = new Set([\n 'export', 'default', 'declare', 'public', 'private', 'protected',\n 'static', 'abstract', 'async',\n]);\n\n/** A top-level (unindented) line whose leading modifiers lead to a declaration. */\nfunction isBoundaryLine(line: string): boolean {\n if (line.length === 0 || line.charCodeAt(0) === 32 || line.charCodeAt(0) === 9) {\n return false; // indented → not top-level\n }\n for (const word of line.split(/\\s+/)) {\n if (DECL_KEYWORDS.has(word)) {\n return true;\n }\n if (!MODIFIERS.has(word)) {\n return false; // first non-modifier, non-keyword word → not a declaration\n }\n }\n return false;\n}\n\nfunction approxTokens(text: string): number {\n const t = text.trim();\n return t === '' ? 0 : t.split(/\\s+/).length;\n}\n\nexport function structuralChunks(path: string, content: string, opts: ChunkOptions): Chunk[] {\n const lines = content.split('\\n');\n const kind = kindFromPath(path);\n\n // Find top-level boundary line indices (indentation 0, declaration-like).\n const boundaries: number[] = [];\n lines.forEach((line, i) => {\n if (isBoundaryLine(line)) {\n boundaries.push(i);\n }\n });\n\n if (boundaries.length === 0) {\n return slidingWindowChunks(path, content, opts);\n }\n\n // Block start indices: file start + each boundary (deduped, sorted).\n const starts = [...new Set([0, ...boundaries])].sort((a, b) => a - b);\n const chunks: Chunk[] = [];\n\n for (let b = 0; b < starts.length; b++) {\n const from = starts[b]!;\n const to = b + 1 < starts.length ? starts[b + 1]! : lines.length; // exclusive\n const blockLines = lines.slice(from, to);\n const blockText = blockLines.join('\\n');\n if (blockText.trim() === '') {\n continue;\n }\n\n if (approxTokens(blockText) > opts.maxTokens) {\n // Oversized declaration: window it, offsetting line numbers to the block.\n for (const sub of slidingWindowChunks(path, blockText, opts)) {\n const startLine = from + sub.startLine; // sub is 1-based within block\n const endLine = from + sub.endLine;\n chunks.push({ id: chunkId(path, startLine, endLine), path, startLine, endLine, text: sub.text, kind });\n }\n } else {\n const startLine = from + 1;\n const endLine = to;\n chunks.push({ id: chunkId(path, startLine, endLine), path, startLine, endLine, text: blockText, kind });\n }\n }\n\n return chunks;\n}\n\n/** Dispatch: structure-aware for code when enabled, else sliding window. */\nexport function chunkFile(path: string, content: string, opts: ChunkOptions, ast: boolean): Chunk[] {\n if (ast && kindFromPath(path) === 'code') {\n return structuralChunks(path, content, opts);\n }\n return slidingWindowChunks(path, content, opts);\n}\n","/**\n * Embed chunks into vector records via the platform embeddings adapter.\n */\n\nimport type { Chunk, ChunkMeta } from '../types';\nimport type { IEmbeddings, VectorRecord } from '../services';\n\n/** Max chunks per embedding request. */\nconst MAX_BATCH_CHUNKS = 96;\n/** Max approx tokens per request — kept well under provider limits (e.g. OpenAI 300k). */\nconst MAX_BATCH_TOKENS = 200_000;\n/**\n * Hard char cap on a single input. Providers cap inputs at ~8192 tokens; dense\n * markdown/code runs ~2–3 chars/token, so 12k chars stays safely under that.\n * Only pathological chunks (e.g. a doc with one enormous line the chunker\n * couldn't split) hit this; the full text is still kept in metadata.\n */\nconst MAX_INPUT_CHARS = 12_000;\n/** Rough chars→tokens estimate for batch budgeting (avoids a tokenizer dep). */\nconst CHARS_PER_TOKEN = 4;\n\nconst approxTokens = (text: string): number => Math.ceil(text.length / CHARS_PER_TOKEN);\n\nfunction toRecord(chunk: Chunk, vector: number[], text: string): VectorRecord {\n const meta: ChunkMeta = {\n path: chunk.path,\n startLine: chunk.startLine,\n endLine: chunk.endLine,\n text,\n kind: chunk.kind,\n };\n return { id: chunk.id, vector, metadata: meta };\n}\n\n/**\n * Split chunks into request batches bounded by BOTH a chunk count and an approx\n * token budget, so a batch never exceeds the provider's per-request token limit\n * (which count-only batching blows on large files). Oversized single inputs are\n * truncated to the per-input cap.\n */\nfunction planBatches(chunks: Chunk[]): { chunk: Chunk; text: string }[][] {\n const items = chunks.map((c) => ({\n chunk: c,\n text: c.text.length > MAX_INPUT_CHARS ? c.text.slice(0, MAX_INPUT_CHARS) : c.text,\n }));\n const batches: { chunk: Chunk; text: string }[][] = [];\n let cur: { chunk: Chunk; text: string }[] = [];\n let curTokens = 0;\n for (const item of items) {\n const t = approxTokens(item.text);\n if (cur.length > 0 && (cur.length >= MAX_BATCH_CHUNKS || curTokens + t > MAX_BATCH_TOKENS)) {\n batches.push(cur);\n cur = [];\n curTokens = 0;\n }\n cur.push(item);\n curTokens += t;\n }\n if (cur.length > 0) {\n batches.push(cur);\n }\n return batches;\n}\n\n/**\n * Embed chunks into vector records. Batched by count + token budget so the\n * embedding stage reports progress and never sends an oversized request.\n */\nexport async function embedChunks(\n chunks: Chunk[],\n embeddings: IEmbeddings,\n onProgress?: (done: number, total: number) => void,\n): Promise<VectorRecord[]> {\n if (chunks.length === 0) {\n return [];\n }\n\n const records: VectorRecord[] = [];\n for (const batch of planBatches(chunks)) {\n const vectors = await embeddings.embedBatch(batch.map((b) => b.text));\n // Store the original chunk text in metadata, even if the embedded text was truncated.\n batch.forEach((b, j) => records.push(toRecord(b.chunk, vectors[j] ?? [], b.chunk.text)));\n onProgress?.(records.length, chunks.length);\n }\n return records;\n}\n","/**\n * Per-index manifest persistence via `IStorage`.\n *\n * The manifest is the source of truth for the BM25 corpus and for\n * listing/status. Vectors live in the vector store; the manifest holds chunk\n * text + per-file bookkeeping. One manifest per index id.\n */\n\nimport { readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport type { IStorage } from './services';\nimport { hashContent, type IndexManifest } from './types';\n\nfunction manifestPath(indexId: string): string {\n return `mind/${indexId}/manifest.json`;\n}\n\n/**\n * Whether `file`'s on-disk content has drifted from what the manifest indexed\n * (the agent should re-read the live file). Files not in the index are treated\n * as not-stale (unknown, not misleading); unreadable/removed files are stale.\n * Bounded cost — call only for the results actually returned, not the corpus.\n */\nexport async function isStale(manifest: IndexManifest, file: string, cwd: string): Promise<boolean> {\n const entry = manifest.files[file];\n if (!entry) {\n return false;\n }\n try {\n const content = await readFile(join(cwd, file), 'utf8');\n return hashContent(content) !== entry.hash;\n } catch {\n return true; // gone from disk or unreadable\n }\n}\n\n/** Stale flag for many files at once (deduped) → `Map<file, stale>`. */\nexport async function staleMap(manifest: IndexManifest, files: string[], cwd: string): Promise<Map<string, boolean>> {\n const out = new Map<string, boolean>();\n await Promise.all(\n [...new Set(files)].map(async (f) => {\n out.set(f, await isStale(manifest, f, cwd));\n }),\n );\n return out;\n}\n\n/** Count of indexed files whose on-disk content changed — whole-index freshness (status). */\nexport async function staleCount(manifest: IndexManifest, cwd: string): Promise<number> {\n const flags = await staleMap(manifest, Object.keys(manifest.files), cwd);\n return [...flags.values()].filter(Boolean).length;\n}\n\n/**\n * Whether an index has a persisted manifest. Distinguishes \"absent\" (typo'd /\n * already-dropped id) from \"empty\", so a destructive `drop` does not report\n * success for a no-op on the wrong index.\n */\nexport async function manifestExists(storage: IStorage, indexId: string): Promise<boolean> {\n return Boolean(await storage.read(manifestPath(indexId)));\n}\n\nexport async function loadManifest(storage: IStorage, indexId: string): Promise<IndexManifest> {\n const buf = await storage.read(manifestPath(indexId));\n if (!buf) {\n return { indexId, chunks: [], files: {}, updatedAt: null };\n }\n try {\n const parsed = JSON.parse(buf.toString('utf8')) as IndexManifest;\n return { indexId, chunks: parsed.chunks ?? [], files: parsed.files ?? {}, updatedAt: parsed.updatedAt ?? null };\n } catch {\n return { indexId, chunks: [], files: {}, updatedAt: null };\n }\n}\n\nexport async function saveManifest(storage: IStorage, manifest: IndexManifest): Promise<void> {\n const buf = Buffer.from(JSON.stringify(manifest), 'utf8');\n await storage.write(manifestPath(manifest.indexId), buf);\n}\n\n/** Remove an index's manifest (used when dropping the whole index). */\nexport async function deleteManifest(storage: IStorage, indexId: string): Promise<void> {\n await storage.delete(manifestPath(indexId));\n}\n","/**\n * Ingest pipeline: discover -> (hash-delta) -> chunk -> embed ->\n * upsert(namespace=indexId), then persist the per-index manifest.\n *\n * Incremental by default: only files whose content hash changed since the last\n * index are re-chunked/re-embedded; unchanged files keep their existing chunks\n * (and vectors), removed files are pruned. `full` forces a clean rebuild.\n */\n\nimport { readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport type { MindServices } from '../services';\nimport type { Chunk, FileEntry, IndexManifest } from '../types';\nimport { hashContent } from '../types';\nimport { discover, type DiscoverScope } from './discover';\nimport { type ChunkOptions } from './chunk';\nimport { chunkFile } from './structural';\nimport { embedChunks } from './embed';\nimport { loadManifest, saveManifest } from '../index-store';\n\n/** Staged progress events emitted during ingest (for CLI/REST progress UIs). */\nexport type IngestProgress =\n | { stage: 'discover'; files: number }\n | { stage: 'delta'; toIndex: number; unchanged: number; removed: number }\n | { stage: 'chunk'; chunks: number }\n | { stage: 'embed'; done: number; total: number }\n | { stage: 'upsert'; count: number }\n | { stage: 'save' };\n\nexport interface IngestInput {\n indexId: string;\n /** Workspace root that source paths are resolved against. */\n cwd: string;\n /** Config-driven include/exclude globs for discovery. */\n scope?: DiscoverScope;\n chunk: ChunkOptions;\n /** Use structure-aware chunking for code. */\n ast: boolean;\n /** Force a full rebuild instead of incremental delta. */\n full?: boolean;\n /** ISO timestamp for manifest bookkeeping (injectable for determinism). */\n now: string;\n /** Optional staged-progress sink (best-effort; never affects results). */\n onProgress?: (event: IngestProgress) => void;\n}\n\nexport interface IngestResult {\n filesIndexed: number;\n chunks: number;\n /** Files (re)embedded this run (new + changed). */\n added: number;\n updated: number;\n /** Files removed from the index (gone from disk). */\n removed: number;\n /** Files skipped because their content hash was unchanged. */\n unchanged: number;\n}\n\n/** Read + content-hash every discovered file. Unreadable files are skipped (warned). */\nasync function readAndHash(\n cwd: string,\n paths: string[],\n logger?: MindServices['logger'],\n): Promise<{ contentByPath: Map<string, string>; hashByPath: Map<string, string> }> {\n const contentByPath = new Map<string, string>();\n const hashByPath = new Map<string, string>();\n for (const path of paths) {\n let content: string;\n try {\n // Source comes from the real filesystem; storage is only for the manifest.\n content = await readFile(join(cwd, path), 'utf8');\n } catch (err) {\n logger?.warn('mind: skipped unreadable file', { path, reason: err instanceof Error ? err.message : String(err) });\n continue;\n }\n contentByPath.set(path, content);\n hashByPath.set(path, hashContent(content));\n }\n return { contentByPath, hashByPath };\n}\n\ninterface Delta {\n /** New + changed files — need re-chunk + re-embed. */\n toIndex: string[];\n /** Files whose content hash matched the previous index. */\n unchanged: string[];\n /** Files in the previous index that are gone from disk. */\n removedPaths: string[];\n added: number;\n updated: number;\n}\n\n/** Classify discovered files against the previous index by content hash. */\nfunction classify(\n contentByPath: Map<string, string>,\n hashByPath: Map<string, string>,\n prevFiles: Record<string, FileEntry>,\n): Delta {\n const toIndex: string[] = [];\n const unchanged: string[] = [];\n let added = 0;\n let updated = 0;\n for (const path of contentByPath.keys()) {\n const prevEntry = prevFiles[path];\n if (prevEntry && prevEntry.hash === hashByPath.get(path)) {\n unchanged.push(path);\n } else {\n toIndex.push(path);\n if (prevEntry) {\n updated++;\n } else {\n added++;\n }\n }\n }\n const removedPaths = Object.keys(prevFiles).filter((p) => !contentByPath.has(p));\n return { toIndex, unchanged, removedPaths, added, updated };\n}\n\nexport async function ingest(input: IngestInput, services: MindServices): Promise<IngestResult> {\n const { storage, embeddings, vectorStore } = services;\n const prev = await loadManifest(storage, input.indexId);\n const prevFiles: Record<string, FileEntry> = input.full ? {} : prev.files;\n\n const emit = input.onProgress ?? (() => {});\n\n const paths = await discover(input.cwd, input.scope);\n emit({ stage: 'discover', files: paths.length });\n const { contentByPath, hashByPath } = await readAndHash(input.cwd, paths, services.logger);\n const { toIndex, unchanged, removedPaths, added, updated } = classify(contentByPath, hashByPath, prevFiles);\n emit({ stage: 'delta', toIndex: toIndex.length, unchanged: unchanged.length, removed: removedPaths.length });\n\n // Vectors to drop: on full, everything previously indexed; otherwise only the\n // chunks of changed + removed files.\n const stalePaths = new Set(input.full ? Object.keys(prev.files) : [...toIndex, ...removedPaths]);\n const staleIds = (input.full ? prev.chunks : prev.chunks.filter((c) => stalePaths.has(c.path))).map((c) => c.id);\n if (staleIds.length > 0) {\n await vectorStore.delete(staleIds, input.indexId);\n }\n\n // Keep unchanged files' chunks + bookkeeping as-is.\n const unchangedSet = new Set(unchanged);\n const keptChunks = input.full ? [] : prev.chunks.filter((c) => unchangedSet.has(c.path));\n const files: Record<string, FileEntry> = {};\n for (const path of unchanged) {\n files[path] = prevFiles[path]!;\n }\n\n // Chunk + embed only the new/changed files.\n const newChunks: Chunk[] = [];\n for (const path of toIndex) {\n const chunks = chunkFile(path, contentByPath.get(path)!, input.chunk, input.ast);\n if (chunks.length === 0) {\n continue;\n }\n newChunks.push(...chunks);\n files[path] = { chunks: chunks.length, indexedAt: input.now, hash: hashByPath.get(path)! };\n }\n emit({ stage: 'chunk', chunks: newChunks.length });\n\n const records = await embedChunks(newChunks, embeddings, (done, total) =>\n emit({ stage: 'embed', done, total }),\n );\n if (records.length > 0) {\n emit({ stage: 'upsert', count: records.length });\n await vectorStore.upsert(records, input.indexId);\n }\n emit({ stage: 'save' });\n\n const manifest: IndexManifest = {\n indexId: input.indexId,\n chunks: [...keptChunks, ...newChunks],\n files,\n updatedAt: input.now,\n };\n await saveManifest(storage, manifest);\n\n return {\n filesIndexed: Object.keys(files).length,\n chunks: manifest.chunks.length,\n added,\n updated,\n removed: removedPaths.length,\n unchanged: unchanged.length,\n };\n}\n","/**\n * Incremental document sync — add / update / delete specific paths in an index\n * without a full rebuild. Operates on both the vector store (namespace=indexId)\n * and the persisted manifest (BM25 corpus + bookkeeping).\n */\n\nimport { readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport type { MindServices } from './services';\nimport type { Chunk, IndexManifest } from './types';\nimport { hashContent } from './types';\nimport { type ChunkOptions } from './ingest/chunk';\nimport { chunkFile } from './ingest/structural';\nimport { embedChunks } from './ingest/embed';\nimport { loadManifest, saveManifest } from './index-store';\n\nexport interface SyncOptions {\n indexId: string;\n /** Workspace root that source paths are resolved against. */\n cwd: string;\n chunk: ChunkOptions;\n ast: boolean;\n now: string;\n}\n\nexport interface SyncCounts {\n added: number;\n updated: number;\n deleted: number;\n}\n\n/** Remove all chunks for the given paths from vector store + manifest. */\nasync function removePaths(\n manifest: IndexManifest,\n paths: Set<string>,\n services: MindServices,\n indexId: string,\n): Promise<number> {\n const removedIds = manifest.chunks.filter((c) => paths.has(c.path)).map((c) => c.id);\n if (removedIds.length > 0) {\n await services.vectorStore.delete(removedIds, indexId);\n }\n manifest.chunks = manifest.chunks.filter((c) => !paths.has(c.path));\n for (const p of paths) {\n delete manifest.files[p];\n }\n return removedIds.length;\n}\n\n/** Chunk + embed + upsert the given paths into the index. */\nasync function addPaths(\n manifest: IndexManifest,\n paths: string[],\n services: MindServices,\n opts: SyncOptions,\n): Promise<number> {\n const newChunks: Chunk[] = [];\n for (const path of paths) {\n let content: string;\n try {\n content = await readFile(join(opts.cwd, path), 'utf8');\n } catch {\n continue;\n }\n const chunks = chunkFile(path, content, opts.chunk, opts.ast);\n if (chunks.length === 0) {\n continue;\n }\n newChunks.push(...chunks);\n manifest.files[path] = { chunks: chunks.length, indexedAt: opts.now, hash: hashContent(content) };\n }\n\n if (newChunks.length > 0) {\n const records = await embedChunks(newChunks, services.embeddings);\n await services.vectorStore.upsert(records, opts.indexId);\n manifest.chunks.push(...newChunks);\n }\n return newChunks.length;\n}\n\nexport async function syncAdd(paths: string[], services: MindServices, opts: SyncOptions): Promise<SyncCounts> {\n const manifest = await loadManifest(services.storage, opts.indexId);\n // Treat re-adding an existing path as an update (replace its chunks).\n const existing = new Set(paths.filter((p) => manifest.files[p]));\n await removePaths(manifest, existing, services, opts.indexId);\n await addPaths(manifest, paths, services, opts);\n manifest.updatedAt = opts.now;\n await saveManifest(services.storage, manifest);\n return { added: paths.length - existing.size, updated: existing.size, deleted: 0 };\n}\n\nexport async function syncUpdate(paths: string[], services: MindServices, opts: SyncOptions): Promise<SyncCounts> {\n const manifest = await loadManifest(services.storage, opts.indexId);\n await removePaths(manifest, new Set(paths), services, opts.indexId);\n await addPaths(manifest, paths, services, opts);\n manifest.updatedAt = opts.now;\n await saveManifest(services.storage, manifest);\n return { added: 0, updated: paths.length, deleted: 0 };\n}\n\nexport async function syncDelete(paths: string[], services: MindServices, opts: SyncOptions): Promise<SyncCounts> {\n const manifest = await loadManifest(services.storage, opts.indexId);\n const deleted = await removePaths(manifest, new Set(paths), services, opts.indexId);\n manifest.updatedAt = opts.now;\n await saveManifest(services.storage, manifest);\n return { added: 0, updated: 0, deleted };\n}\n","/**\n * BM25 keyword ranking over the in-memory chunk corpus.\n *\n * Self-contained Okapi BM25. Tokenization lowercases and splits on\n * non-alphanumerics, additionally splitting camelCase and snake_case so code\n * identifiers (`getUserId`, `user_id`) match natural-language queries.\n */\n\nimport type { Chunk } from '../types';\n\nexport interface Ranked {\n id: string;\n score: number;\n}\n\nconst K1 = 1.5;\nconst B = 0.75;\n\nexport function tokenize(text: string): string[] {\n return text\n .replace(/([a-z0-9])([A-Z])/g, '$1 $2') // camelCase -> camel Case\n .toLowerCase()\n .split(/[^a-z0-9]+/)\n .filter((t) => t.length > 1);\n}\n\nexport function bm25Search(chunks: Chunk[], query: string, limit: number): Ranked[] {\n if (chunks.length === 0) {\n return [];\n }\n\n const docs = chunks.map((c) => tokenize(c.text));\n const docLens = docs.map((d) => d.length);\n const avgDocLen = docLens.reduce((a, b) => a + b, 0) / docs.length || 1;\n\n // Document frequency per term.\n const df = new Map<string, number>();\n for (const doc of docs) {\n for (const term of new Set(doc)) {\n df.set(term, (df.get(term) ?? 0) + 1);\n }\n }\n\n const queryTerms = [...new Set(tokenize(query))];\n const N = docs.length;\n\n const scored: Ranked[] = chunks.map((chunk, i) => {\n const doc = docs[i] ?? [];\n const len = docLens[i] ?? 0;\n const tf = new Map<string, number>();\n for (const term of doc) {\n tf.set(term, (tf.get(term) ?? 0) + 1);\n }\n\n let score = 0;\n for (const term of queryTerms) {\n const termTf = tf.get(term);\n if (!termTf) {\n continue;\n }\n const docFreq = df.get(term) ?? 0;\n // BM25 idf with +1 to keep it non-negative.\n const idf = Math.log(1 + (N - docFreq + 0.5) / (docFreq + 0.5));\n const denom = termTf + K1 * (1 - B + (B * len) / avgDocLen);\n score += idf * ((termTf * (K1 + 1)) / denom);\n }\n\n return { id: chunk.id, score };\n });\n\n return scored\n .filter((r) => r.score > 0)\n .sort((a, b) => b.score - a.score)\n .slice(0, limit);\n}\n","/**\n * Vector retrieval via the platform vector store, scoped by namespace=indexId.\n */\n\nimport type { IVectorStore } from '../services';\nimport type { Ranked } from './bm25';\n\nexport async function vectorSearch(\n queryText: string,\n vectorStore: IVectorStore,\n embed: (text: string) => Promise<number[]>,\n indexId: string,\n limit: number,\n): Promise<Ranked[]> {\n let vector: number[];\n try {\n vector = await embed(queryText);\n } catch (err) {\n throw new Error(`mind: query embedding failed — ${err instanceof Error ? err.message : String(err)}`);\n }\n try {\n const hits = await vectorStore.search(vector, limit, undefined, indexId);\n return hits.map((h) => ({ id: h.id, score: h.score }));\n } catch (err) {\n throw new Error(\n `mind: vector search failed (indexId=\"${indexId}\", dims=${vector.length}) — ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n}\n","/**\n * Reciprocal Rank Fusion (RRF) with intent-adaptive weights.\n *\n * Fuses ranked lists by `weight * 1/(k + rank)`. Weights shift the balance\n * between the semantic (vector) and keyword (BM25) lists based on query intent.\n */\n\nimport type { Ranked } from './bm25';\n\nexport type QueryIntent = 'lookup' | 'concept' | 'architecture';\n\n/** Which retrieval signal surfaced a result — the \"why\" + proof-of-value vs grep. */\nexport type MatchedBy = 'lexical' | 'semantic' | 'both';\n\nexport interface WeightedList {\n ranked: Ranked[];\n weight: number;\n /** Provenance label for this list (so the fused result knows where it came from). */\n label?: Exclude<MatchedBy, 'both'>;\n}\n\nexport interface FusedRanked extends Ranked {\n matchedBy: MatchedBy;\n}\n\n/** Vector/BM25 weighting per intent (vector favored for meaning, BM25 for exact terms). */\nexport function intentWeights(intent?: QueryIntent): { vector: number; bm25: number } {\n switch (intent) {\n case 'lookup':\n return { vector: 0.4, bm25: 0.6 }; // exact symbol lookups lean keyword\n case 'architecture':\n return { vector: 0.6, bm25: 0.4 };\n case 'concept':\n default:\n return { vector: 0.7, bm25: 0.3 };\n }\n}\n\nexport function rrfFuse(lists: WeightedList[], k: number): FusedRanked[] {\n const scores = new Map<string, number>();\n const labels = new Map<string, Set<Exclude<MatchedBy, 'both'>>>();\n\n for (const { ranked, weight, label } of lists) {\n ranked.forEach((item, idx) => {\n const rank = idx + 1;\n scores.set(item.id, (scores.get(item.id) ?? 0) + weight * (1 / (k + rank)));\n if (label) {\n const set = labels.get(item.id) ?? new Set();\n set.add(label);\n labels.set(item.id, set);\n }\n });\n }\n\n return [...scores.entries()]\n .map(([id, score]) => ({ id, score, matchedBy: resolveMatchedBy(labels.get(id)) }))\n .sort((a, b) => b.score - a.score);\n}\n\nfunction resolveMatchedBy(set?: Set<Exclude<MatchedBy, 'both'>>): MatchedBy {\n // Unlabelled lists (e.g. tests) → 'both' (neutral). Otherwise: in both lists → 'both'.\n if (!set || set.size === 0 || set.size === 2) {\n return 'both';\n }\n return set.has('semantic') ? 'semantic' : 'lexical';\n}\n","/**\n * HyDE — Hypothetical Document Embeddings.\n *\n * Ask the LLM to draft a short, realistic snippet that would answer the query,\n * then use THAT text (not the raw query) for the vector search. The hypothetical\n * doc lives in answer-space, so its embedding sits closer to the relevant chunks\n * than a terse question does — which helps concept queries where the query\n * wording and the code/doc wording diverge. BM25 keeps using the raw query, so\n * exact-term lookups are unaffected.\n *\n * Best-effort: on any LLM error or empty output, fall back to the raw query so\n * retrieval degrades to plain vector search rather than failing.\n */\n\nimport type { ILLM } from '../services';\n\nconst HYDE_PROMPT = (query: string) =>\n `Write a short, realistic code or documentation snippet that would directly answer ` +\n `the question below. Output only the snippet — no preamble, no explanation, no fences.\\n\\n` +\n `Question: ${query}`;\n\nexport async function hypotheticalDocument(query: string, llm: ILLM): Promise<string> {\n try {\n const { content } = await llm.complete(HYDE_PROMPT(query), { temperature: 0.0, maxTokens: 256 });\n const text = (content ?? '').trim();\n // Append the raw query so query terms still contribute to the embedding.\n return text === '' ? query : `${text}\\n\\n${query}`;\n } catch {\n return query;\n }\n}\n","/**\n * Query expansion for the lexical (BM25) side.\n *\n * Ask the LLM for code identifiers and synonyms that are likely to appear in\n * relevant source/docs, then append them to the raw query before BM25. This\n * targets vocabulary mismatch — the core failure mode on messy/undocumented\n * repos, where the asker's words and the code's words diverge. The vector side\n * keeps its own bridge (HyDE); the two levers are orthogonal.\n *\n * Best-effort: on any LLM error or empty output, fall back to the raw query so\n * retrieval degrades to plain BM25 rather than failing.\n */\n\nimport type { ILLM } from '../services';\n\nconst EXPAND_PROMPT = (query: string) =>\n `List code identifiers, function/type names, and close synonyms that would likely appear ` +\n `in source code or documentation relevant to the query below. Output a single ` +\n `space-separated line of terms only — no explanation, no punctuation, no fences.\\n\\n` +\n `Query: ${query}`;\n\nexport async function expandQuery(query: string, llm: ILLM): Promise<string> {\n try {\n const { content } = await llm.complete(EXPAND_PROMPT(query), { temperature: 0.0, maxTokens: 64 });\n const extra = (content ?? '').trim();\n // Keep the raw query first so its exact terms still dominate BM25 scoring.\n return extra === '' ? query : `${query} ${extra}`;\n } catch {\n return query;\n }\n}\n","/**\n * Retrieval pipeline: BM25 (over manifest corpus) + vector (platform store),\n * fused with intent-adaptive RRF, mapped back to chunks.\n */\n\nimport type { MindServices } from '../services';\nimport type { Chunk } from '../types';\nimport { loadManifest } from '../index-store';\nimport { bm25Search, type Ranked } from './bm25';\nimport { vectorSearch } from './vector';\nimport { rrfFuse, intentWeights, type QueryIntent, type MatchedBy } from './fuse';\nimport { hypotheticalDocument } from './hyde';\nimport { expandQuery } from './expand';\n\nexport interface RetrieveInput {\n text: string;\n indexId: string;\n limit: number;\n intent?: QueryIntent;\n rrfK: number;\n /** HyDE: embed an LLM-generated hypothetical doc for the vector search. */\n hyde?: boolean;\n /** Query expansion: append LLM-suggested related terms to the BM25 query. */\n expand?: boolean;\n}\n\nexport interface RankedChunk {\n chunk: Chunk;\n /** Fused RRF score (best first). */\n score: number;\n /** Which signal surfaced this chunk (lexical/semantic/both) — provenance. */\n matchedBy: MatchedBy;\n}\n\nexport interface RetrieveOutput {\n /** Fused, ranked chunks (best first), truncated to `limit`. */\n ranked: RankedChunk[];\n /** Raw cosine confidence proxy from the vector list (top-3 avg). */\n confidence: number;\n /** Share of returned results found semantic-only (grep would miss them). */\n semanticWinRate: number;\n}\n\nexport async function retrieve(input: RetrieveInput, services: MindServices): Promise<RetrieveOutput> {\n const manifest = await loadManifest(services.storage, input.indexId);\n const byId = new Map(manifest.chunks.map((c) => [c.id, c]));\n\n // Over-fetch each list so fusion has signal beyond the final cut.\n const candidateLimit = Math.max(input.limit * 3, 30);\n\n // Two orthogonal, optional query bridges (each one LLM call):\n // - HyDE rewrites the VECTOR text (a hypothetical answer sits near the chunks);\n // - expansion augments the BM25 (LEXICAL) text with related identifiers/synonyms.\n const vectorText = input.hyde ? await hypotheticalDocument(input.text, services.llm) : input.text;\n const lexicalText = input.expand ? await expandQuery(input.text, services.llm) : input.text;\n\n const bm25 = bm25Search(manifest.chunks, lexicalText, candidateLimit);\n const vector = await vectorSearch(\n vectorText,\n services.vectorStore,\n (t) => services.embeddings.embed(t),\n input.indexId,\n candidateLimit,\n );\n\n const weights = intentWeights(input.intent);\n const fused = rrfFuse(\n [\n { ranked: vector, weight: weights.vector, label: 'semantic' },\n { ranked: bm25, weight: weights.bm25, label: 'lexical' },\n ],\n input.rrfK,\n );\n\n const ranked: RankedChunk[] = fused\n .map((r) => {\n const chunk = byId.get(r.id);\n return chunk ? { chunk, score: r.score, matchedBy: r.matchedBy } : undefined;\n })\n .filter((r): r is RankedChunk => r !== undefined)\n .slice(0, input.limit);\n\n // Proof-of-value vs grep: how many returned hits are semantic-only (grep-miss).\n const semanticWinRate =\n ranked.length === 0 ? 0 : ranked.filter((r) => r.matchedBy === 'semantic').length / ranked.length;\n\n return { ranked, confidence: confidenceFrom(vector), semanticWinRate };\n}\n\n/** Phase 2 confidence proxy: average cosine of the top-3 vector hits. */\nfunction confidenceFrom(vector: Ranked[]): number {\n if (vector.length === 0) {\n return 0;\n }\n const top = vector.slice(0, 3);\n const avg = top.reduce((a, r) => a + r.score, 0) / top.length;\n return Math.max(0, Math.min(1, avg));\n}\n","/**\n * Heuristic reranking of fused candidates.\n *\n * Lightweight, deterministic signals layered on the fused RRF score:\n * - exact query-term coverage in the chunk text (keyword precision)\n * - identifier hit: a query token appearing verbatim (good for code lookups)\n *\n * An optional LLM reranker can be layered later; this heuristic pass is always\n * available and needs no model.\n */\n\nimport type { RankedChunk } from './retrieve';\nimport { tokenize } from './bm25';\n\nexport function rerank(ranked: RankedChunk[], query: string): RankedChunk[] {\n const qTokens = new Set(tokenize(query));\n if (qTokens.size === 0) {\n return ranked;\n }\n\n const boosted = ranked.map((item) => {\n const docTokens = tokenize(item.chunk.text);\n const docSet = new Set(docTokens);\n let covered = 0;\n for (const q of qTokens) {\n if (docSet.has(q)) {\n covered++;\n }\n }\n const coverage = covered / qTokens.size; // 0..1\n // Verbatim identifier presence (case-insensitive) — strong for symbol lookups.\n const lowerText = item.chunk.text.toLowerCase();\n const verbatim = [...qTokens].some((q) => q.length >= 3 && lowerText.includes(q)) ? 1 : 0;\n\n const boost = 1 + 0.5 * coverage + 0.25 * verbatim;\n return { ...item, score: item.score * boost };\n });\n\n return boosted.sort((a, b) => b.score - a.score);\n}\n","/**\n * Semantic-ish dedup of ranked chunks via token-set Jaccard similarity.\n *\n * Keeps the highest-ranked chunk and drops later near-duplicates (e.g. the same\n * code re-surfaced by both BM25 and vector lists, or overlapping windows).\n * Operates on the small post-fusion list, so O(n²) is fine.\n */\n\nimport type { RankedChunk } from './retrieve';\nimport { tokenize } from './bm25';\n\nfunction jaccard(a: Set<string>, b: Set<string>): number {\n if (a.size === 0 && b.size === 0) {\n return 1;\n }\n let inter = 0;\n for (const t of a) {\n if (b.has(t)) {\n inter++;\n }\n }\n const union = a.size + b.size - inter;\n return union === 0 ? 0 : inter / union;\n}\n\nexport function dedupRanked(ranked: RankedChunk[], threshold = 0.85): RankedChunk[] {\n const kept: RankedChunk[] = [];\n const keptTokens: Set<string>[] = [];\n\n for (const item of ranked) {\n const tokens = new Set(tokenize(item.chunk.text));\n const isDup = keptTokens.some((k) => jaccard(tokens, k) >= threshold);\n if (!isDup) {\n kept.push(item);\n keptTokens.push(tokens);\n }\n }\n\n return kept;\n}\n","/**\n * Anti-hallucination verification + confidence stack.\n *\n * Each retrieved chunk is verified against the live source via `IStorage`:\n * file exists (0.7) + snippet still present (0.3). The verification rate scales\n * the retrieval confidence — a stale or fabricated source drags confidence down.\n * Mirrors the legacy mind concept (source-verifier + confidence floor).\n */\n\nimport type { AgentWarning } from '@kb-labs/mind-contracts';\nimport type { IStorage } from '../services';\nimport type { RankedChunk } from '../retrieval/retrieve';\n\nexport interface VerificationResult {\n /** 0..1 fraction of (weighted) verification across chunks. */\n rate: number;\n /** Per-chunk verification score (0..1), aligned with input order. */\n perChunk: number[];\n}\n\nconst FILE_WEIGHT = 0.7;\nconst SNIPPET_WEIGHT = 0.3;\n\nexport async function verifySources(ranked: RankedChunk[], storage: IStorage): Promise<VerificationResult> {\n if (ranked.length === 0) {\n return { rate: 1, perChunk: [] };\n }\n\n const perChunk: number[] = [];\n for (const { chunk } of ranked) {\n const exists = await storage.exists(chunk.path);\n let score = exists ? FILE_WEIGHT : 0;\n if (exists) {\n const buf = await storage.read(chunk.path);\n const content = buf?.toString('utf8') ?? '';\n // Snippet grounding: a representative line of the chunk is still present.\n const probe = chunk.text.split('\\n').find((l) => l.trim().length > 8)?.trim();\n if (probe && content.includes(probe)) {\n score += SNIPPET_WEIGHT;\n }\n }\n perChunk.push(score);\n }\n\n const rate = perChunk.reduce((a, b) => a + b, 0) / perChunk.length;\n return { rate, perChunk };\n}\n\nexport interface ConfidenceResult {\n confidence: number;\n warnings: AgentWarning[];\n}\n\n/** Combine retrieval confidence with the verification rate; warn below floor. */\nexport function computeConfidence(\n retrievalConfidence: number,\n verificationRate: number,\n floor: number,\n): ConfidenceResult {\n const confidence = Math.max(0, Math.min(1, retrievalConfidence * verificationRate));\n const warnings: AgentWarning[] = [];\n if (confidence < floor) {\n warnings.push({\n code: 'LOW_CONFIDENCE',\n message: `Confidence ${confidence.toFixed(2)} is below the floor ${floor.toFixed(2)}; the answer may be unreliable.`,\n });\n }\n return { confidence, warnings };\n}\n","/**\n * Field-checker — an anti-hallucination signal ported from the legacy engine.\n *\n * An LLM answer that cites code should only name symbols that actually appear\n * in the retrieved sources. We extract code-like symbols from the answer\n * (backtick spans, camelCase/dotted/underscored identifiers, file names) and\n * check each against the retrieved chunks (text + path). The grounded fraction\n * folds into the confidence stack, and any ungrounded terms are surfaced as a\n * warning — a cheap, deterministic guard against fabricated APIs.\n */\n\nimport type { AgentWarning } from '@kb-labs/mind-contracts';\nimport type { RankedChunk } from '../retrieval/retrieve';\n\n/** Heuristic: does this token look like a code symbol worth grounding? */\nfunction isCodeSymbol(t: string): boolean {\n if (t.length < 3 || t.length > 80) {\n return false;\n }\n if (/\\.(ts|tsx|js|jsx|json|md|go|py|rs)$/.test(t)) {\n return true; // file name\n }\n if (t.includes('.') && /[a-zA-Z]/.test(t)) {\n return true; // dotted member access (vectorStore.search, config.loader)\n }\n if (/_/.test(t) && /[a-zA-Z]/.test(t)) {\n return true; // snake_case / CONST_CASE\n }\n if (/[a-z][A-Z]/.test(t)) {\n return true; // camelCase / PascalCase transition (assemblePlatform, EventBus)\n }\n return false;\n}\n\n/** Extract code-like symbols from an answer (deduped, order-preserving). */\nexport function extractSymbols(answer: string): string[] {\n const out = new Set<string>();\n // Backtick spans are the strongest signal — the model is quoting code.\n for (const m of answer.matchAll(/`([^`\\n]{2,80})`/g)) {\n for (const tok of m[1]!.trim().split(/[\\s(),;:[\\]{}'\"]+/)) {\n if (isCodeSymbol(tok)) {\n out.add(tok);\n }\n }\n }\n // Bare identifiers in prose (camelCase/dotted/underscored/hyphenated/file names).\n for (const m of answer.matchAll(/[A-Za-z_$][A-Za-z0-9_$-]*(?:[./][A-Za-z0-9_$.-]+)*/g)) {\n if (isCodeSymbol(m[0])) {\n out.add(m[0]);\n }\n }\n return [...out];\n}\n\nexport interface FieldCheckResult {\n /** 0..1 fraction of extracted symbols grounded in the sources. */\n rate: number;\n /** Symbols not found in any retrieved chunk. */\n ungrounded: string[];\n /** Number of symbols checked (0 → nothing to verify, rate defaults to 1). */\n checked: number;\n}\n\n/** Check that symbols named in the answer appear in the retrieved sources. */\nexport function checkFields(answer: string, ranked: RankedChunk[]): FieldCheckResult {\n const symbols = extractSymbols(answer);\n if (symbols.length === 0) {\n return { rate: 1, ungrounded: [], checked: 0 };\n }\n const corpus = ranked.map((r) => `${r.chunk.path}\\n${r.chunk.text}`).join('\\n').toLowerCase();\n const grounded = (sym: string): boolean => {\n const s = sym.toLowerCase();\n if (corpus.includes(s)) {\n return true;\n }\n // Dotted member (a.b.c): accept if the head object is present in sources.\n const head = s.split('.')[0]!;\n return head.length >= 3 && corpus.includes(head);\n };\n const ungrounded = symbols.filter((s) => !grounded(s));\n return { rate: (symbols.length - ungrounded.length) / symbols.length, ungrounded, checked: symbols.length };\n}\n\n/**\n * Fold a field-check into the confidence stack: ungrounded terms scale\n * confidence down (never below 0) and surface as warnings. Returns the adjusted\n * confidence + the (possibly extended) warning list. Pure — no side effects.\n */\nexport function applyFieldCheck(\n answer: string,\n ranked: RankedChunk[],\n confidence: number,\n warnings: AgentWarning[],\n floor: number,\n): { confidence: number; warnings: AgentWarning[] } {\n const fc = checkFields(answer, ranked);\n if (fc.checked === 0 || fc.rate === 1) {\n return { confidence, warnings };\n }\n const adjusted = Math.max(0, confidence * (0.5 + 0.5 * fc.rate));\n const next = [...warnings];\n if (fc.ungrounded.length > 0) {\n next.push({\n code: 'UNGROUNDED_TERMS',\n message: `Answer mentions ${fc.ungrounded.length} term(s) not found in sources: ${fc.ungrounded.slice(0, 5).join(', ')}`,\n details: { ungrounded: fc.ungrounded, rate: Math.round(fc.rate * 1000) / 1000 },\n });\n }\n if (adjusted < floor && !next.some((w) => w.code === 'LOW_CONFIDENCE')) {\n next.push({\n code: 'LOW_CONFIDENCE',\n message: `Confidence ${adjusted.toFixed(2)} is below the floor ${floor.toFixed(2)}; the answer may be unreliable.`,\n });\n }\n return { confidence: adjusted, warnings: next };\n}\n","/**\n * Query decomposition (multi-step reasoning) for richer agent modes.\n *\n * Asks the LLM to split a complex question into focused sub-queries. Degrades\n * gracefully: if decomposition is disabled or the LLM returns nothing usable,\n * it falls back to the original query alone.\n */\n\nimport type { ILLM } from '../services';\n\nexport async function decompose(query: string, llm: ILLM, maxSubqueries: number): Promise<string[]> {\n if (maxSubqueries <= 0) {\n return [query];\n }\n\n const prompt =\n `Break the following question into at most ${maxSubqueries} focused, self-contained ` +\n `sub-questions that together cover it. Return one sub-question per line, no numbering.\\n\\n` +\n `Question: ${query}`;\n\n try {\n const { content } = await llm.complete(prompt, { temperature: 0.2, maxTokens: 256 });\n const subs = (content ?? '')\n .split('\\n')\n .map((l) => l.replace(/^[-*\\d.)\\s]+/, '').trim())\n .filter((l) => l.length > 0)\n .slice(0, maxSubqueries);\n // Always include the original query so we never lose the primary intent.\n return subs.length > 0 ? [query, ...subs] : [query];\n } catch {\n return [query];\n }\n}\n","/**\n * Shape ranked chunks into lean wire `SearchResult`s (pointers, not payloads).\n *\n * `snippet` rides only as much text as the caller asked for (`--snippet`):\n * none → nothing; line → the first meaningful line; full → truncated chunk.\n */\n\nimport type { SearchResult, SnippetMode } from '@kb-labs/mind-contracts';\nimport type { RankedChunk } from '../retrieval/retrieve';\n\nconst MAX_SNIPPET_CHARS = 600;\n\n/** Extract a snippet of the requested verbosity from chunk text. */\nexport function snippetFrom(text: string, mode: SnippetMode): string | undefined {\n if (mode === 'none') {\n return undefined;\n }\n if (mode === 'full') {\n return text.length > MAX_SNIPPET_CHARS ? `${text.slice(0, MAX_SNIPPET_CHARS)}…` : text;\n }\n // 'line' — the first non-trivial line, for an \"is this it?\" glance.\n const line = text.split('\\n').find((l) => l.trim().length > 8)?.trim() ?? text.trim().slice(0, 120);\n return line.length > 200 ? `${line.slice(0, 200)}…` : line;\n}\n\nexport interface ToResultsOptions {\n snippet: SnippetMode;\n /** file → stale (on-disk drift since indexing). */\n staleByFile: Map<string, boolean>;\n}\n\nexport function toSearchResults(ranked: RankedChunk[], opts: ToResultsOptions): SearchResult[] {\n return ranked.map(({ chunk, matchedBy }) => ({\n file: chunk.path,\n lines: [chunk.startLine, chunk.endLine] as [number, number],\n kind: chunk.kind,\n matchedBy,\n stale: opts.staleByFile.get(chunk.path) ?? false,\n snippet: snippetFrom(chunk.text, opts.snippet),\n }));\n}\n","/**\n * Answer synthesis + frozen `AgentResponse` assembly.\n *\n * Produces the `agent-response-v1` contract consumed by CLAUDE.md and the\n * task-rag skill. The response is validated against the contract zod before\n * being returned, so a drift fails loudly here rather than silently downstream.\n */\n\nimport {\n AgentResponseSchema,\n type AgentResponse,\n type AgentSource,\n type AgentWarning,\n type AgentQueryMode,\n type SnippetMode,\n} from '@kb-labs/mind-contracts';\nimport type { ILLM } from '../services';\nimport type { RankedChunk } from '../retrieval/retrieve';\nimport { snippetFrom } from './synthesize';\n\nconst MAX_SNIPPET_CHARS = 600;\n\nfunction truncate(text: string): string {\n return text.length > MAX_SNIPPET_CHARS ? `${text.slice(0, MAX_SNIPPET_CHARS)}…` : text;\n}\n\n/** Extractive fallback answer (no LLM): the most relevant snippet, attributed. */\nfunction extractiveAnswer(query: string, ranked: RankedChunk[]): string {\n if (ranked.length === 0) {\n return `No indexed content matched the query: \"${query}\".`;\n }\n const top = ranked[0]!.chunk;\n return `Most relevant source: ${top.path} (lines ${top.startLine}-${top.endLine}).\\n\\n${truncate(top.text)}`;\n}\n\nexport async function synthesizeAnswer(\n query: string,\n ranked: RankedChunk[],\n llm: ILLM,\n useLLM: boolean,\n): Promise<string> {\n if (!useLLM || ranked.length === 0) {\n return extractiveAnswer(query, ranked);\n }\n\n const context = ranked\n .map((r, i) => `[${i + 1}] ${r.chunk.path}:${r.chunk.startLine}-${r.chunk.endLine}\\n${r.chunk.text}`)\n .join('\\n\\n');\n\n const prompt =\n `Answer the question using ONLY the provided context. Be concise and cite the ` +\n `relevant files by path. If the context does not contain the answer, say so.\\n\\n` +\n `Question: ${query}\\n\\nContext:\\n${context}`;\n\n try {\n const { content } = await llm.complete(prompt, { temperature: 0.2, maxTokens: 800 });\n const trimmed = (content ?? '').trim();\n return trimmed.length > 0 ? trimmed : extractiveAnswer(query, ranked);\n } catch {\n return extractiveAnswer(query, ranked);\n }\n}\n\nexport interface ToSourcesOptions {\n snippet: SnippetMode;\n staleByFile: Map<string, boolean>;\n}\n\nexport function toSources(ranked: RankedChunk[], opts: ToSourcesOptions): AgentSource[] {\n return ranked.map(({ chunk, matchedBy }) => ({\n file: chunk.path,\n lines: [chunk.startLine, chunk.endLine] as [number, number],\n kind: chunk.kind,\n matchedBy,\n stale: opts.staleByFile.get(chunk.path) ?? false,\n snippet: snippetFrom(chunk.text, opts.snippet),\n }));\n}\n\nexport interface BuildAgentResponseInput {\n answer: string;\n ranked: RankedChunk[];\n confidence: number;\n mode: AgentQueryMode;\n requestId: string;\n timingMs: number;\n indexId: string;\n floor: number;\n snippet: SnippetMode;\n staleByFile: Map<string, boolean>;\n warnings?: AgentWarning[];\n}\n\n/** Assemble + validate the lean agent response. */\nexport function buildAgentResponse(input: BuildAgentResponseInput): AgentResponse {\n const sources = toSources(input.ranked, { snippet: input.snippet, staleByFile: input.staleByFile });\n const abstained = input.confidence < input.floor || sources.length === 0;\n\n const response: AgentResponse = {\n answer: input.answer,\n confidence: input.confidence,\n abstained,\n sources,\n warnings: input.warnings && input.warnings.length > 0 ? input.warnings : undefined,\n meta: {\n requestId: input.requestId,\n mode: input.mode,\n timingMs: input.timingMs,\n indexId: input.indexId,\n },\n };\n\n // Fail loudly if we ever drift from the contract.\n return AgentResponseSchema.parse(response);\n}\n","/**\n * Task-orientation map. No hardcoded role/name heuristics: relevance + ranking\n * come from retrieval, the orientation (\"where to start / how involved\") comes\n * from the model, and structure (`spread`) is derived from the actual paths.\n */\n\nimport type { ExploreEntry } from '@kb-labs/mind-contracts';\nimport type { ILLM } from '../services';\nimport type { RankedChunk } from '../retrieval/retrieve';\nimport { snippetFrom } from './synthesize';\n\n/** Ranked chunks → entries deduped by file (best rank kept). `why` = matched line. */\nexport function toExploreEntries(ranked: RankedChunk[], staleByFile: Map<string, boolean>): ExploreEntry[] {\n const seen = new Set<string>();\n const out: ExploreEntry[] = [];\n for (const r of ranked) {\n if (seen.has(r.chunk.path)) {\n continue;\n }\n seen.add(r.chunk.path);\n const line = snippetFrom(r.chunk.text, 'line');\n out.push({\n file: r.chunk.path,\n lines: [r.chunk.startLine, r.chunk.endLine] as [number, number],\n why: line && line.length > 0 ? line : `${r.chunk.kind} file`,\n matchedBy: r.matchedBy,\n stale: staleByFile.get(r.chunk.path) ?? false,\n });\n }\n return out;\n}\n\n/** Distinct directories the files span — a structural \"how spread out\" hint. */\nexport function spreadOf(files: string[]): number {\n return new Set(\n files.map((f) => {\n const i = f.lastIndexOf('/');\n return i < 0 ? '.' : f.slice(0, i);\n }),\n ).size;\n}\n\n/**\n * Model-synthesized orientation grounded in the retrieved files. Empty string\n * when no LLM is available (e.g. instant mode) — the file list still stands.\n */\nexport async function orientationSummary(\n task: string,\n entries: ExploreEntry[],\n llm: ILLM,\n useLLM: boolean,\n): Promise<string> {\n if (!useLLM || entries.length === 0) {\n return '';\n }\n const list = entries.map((e, i) => `[${i + 1}] ${e.file}:${e.lines[0]}-${e.lines[1]} — ${e.why}`).join('\\n');\n const prompt =\n `A developer must approach the task below in an unfamiliar codebase. Using ONLY the ` +\n `relevant files listed, briefly explain WHERE to start, the KEY files and their role, ` +\n `and HOW involved the task looks. Be concise; cite files by path.\\n\\n` +\n `Task: ${task}\\n\\nRelevant files:\\n${list}`;\n try {\n const { content } = await llm.complete(prompt, { temperature: 0.2, maxTokens: 400 });\n return (content ?? '').trim();\n } catch {\n return '';\n }\n}\n","/**\n * Query-history feedback loop via the platform cache (sorted set).\n *\n * Records queries per index (scored by timestamp) so the engine can learn from\n * usage over time. Best-effort: cache failures never break a query.\n */\n\nimport type { ICache } from '../services';\nimport { MIND_NAMESPACE_PREFIX } from '@kb-labs/mind-contracts';\n\nfunction historyKey(indexId: string): string {\n return `${MIND_NAMESPACE_PREFIX}history:${indexId}`;\n}\n\nexport async function recordQuery(\n cache: ICache,\n indexId: string,\n query: string,\n at: number,\n): Promise<void> {\n try {\n await cache.zadd(historyKey(indexId), at, query);\n } catch {\n // Feedback is best-effort; never fail the user's query because of it.\n }\n}\n\nexport async function recentQueries(\n cache: ICache,\n indexId: string,\n sinceMs = 0,\n): Promise<string[]> {\n try {\n return await cache.zrangebyscore(historyKey(indexId), sinceMs, Number.MAX_SAFE_INTEGER);\n } catch {\n return [];\n }\n}\n","/**\n * Mind facade — the single object the plugin (CLI + REST) talks to.\n *\n * `createMind(services, config)` returns verbs that both the CLI commands and\n * REST handlers call identically, so behaviour is shared by construction.\n * Phase 2 ships `index` / `search` / `status`; `ask`, `sync`, `reindex` are\n * layered in later phases.\n */\n\nimport type {\n MindConfig,\n IndexRequest,\n IndexResponse,\n SearchRequest,\n SearchResponse,\n StatusResponse,\n IndexSummary,\n HealthResponse,\n QueryRequest,\n AgentResponse,\n AgentQueryMode,\n ExploreRequest,\n ExploreResponse,\n SyncResponse,\n SyncListResponse,\n SyncStatusResponse,\n ReindexRequest,\n DropRequest,\n DropResponse,\n} from '@kb-labs/mind-contracts';\nimport { effectiveIndexConfig, resolveScope } from '@kb-labs/mind-contracts';\nimport type { MindServices } from './services';\nimport type { RankedChunk } from './retrieval/retrieve';\nimport { ingest, type IngestProgress } from './ingest/ingest';\nimport { syncAdd, syncUpdate, syncDelete, type SyncOptions } from './sync';\nimport { retrieve } from './retrieval/retrieve';\nimport { rerank } from './retrieval/rerank';\nimport { dedupRanked } from './retrieval/dedup';\nimport { verifySources, computeConfidence } from './answer/verify';\nimport { applyFieldCheck } from './answer/field-check';\nimport { decompose } from './answer/decompose';\nimport { synthesizeAnswer, buildAgentResponse } from './answer/answer';\nimport { toExploreEntries, spreadOf, orientationSummary } from './answer/explore';\nimport { recordQuery } from './feedback/history';\nimport { toSearchResults } from './answer/synthesize';\nimport { loadManifest, staleMap, staleCount, deleteManifest, manifestExists } from './index-store';\n\nexport interface Mind {\n index(req: IndexRequest, onProgress?: (event: IngestProgress) => void): Promise<IndexResponse>;\n search(req: SearchRequest): Promise<SearchResponse>;\n ask(req: QueryRequest): Promise<AgentResponse>;\n explore(req: ExploreRequest): Promise<ExploreResponse>;\n reindex(req: ReindexRequest): Promise<IndexResponse>;\n drop(req: DropRequest): Promise<DropResponse>;\n syncAdd(paths: string[], indexId?: string): Promise<SyncResponse>;\n syncUpdate(paths: string[], indexId?: string): Promise<SyncResponse>;\n syncDelete(paths: string[], indexId?: string): Promise<SyncResponse>;\n syncList(indexId?: string): Promise<SyncListResponse>;\n syncStatus(indexId?: string): Promise<SyncStatusResponse>;\n status(indexId?: string): Promise<StatusResponse>;\n health(): Promise<HealthResponse>;\n}\n\nexport interface CreateMindOptions {\n /** Workspace root that source paths are resolved against (default: process.cwd()). */\n cwd?: string;\n /** Injectable clock for deterministic tests. */\n now?: () => number;\n /** Injectable ISO timestamp source for manifest bookkeeping. */\n isoNow?: () => string;\n}\n\nexport function createMind(\n services: MindServices,\n config: MindConfig,\n options: CreateMindOptions = {},\n): Mind {\n const now = options.now ?? (() => Date.now());\n const isoNow = options.isoNow ?? (() => new Date(now()).toISOString());\n const cwd = options.cwd ?? process.cwd();\n\n function resolveIndexId(indexId?: string): string {\n return indexId && indexId.trim() !== '' ? indexId : config.defaultIndex;\n }\n\n function syncOpts(indexId: string): SyncOptions {\n const eff = effectiveIndexConfig(config, indexId);\n return {\n indexId,\n cwd,\n chunk: { maxTokens: eff.chunk.maxTokens, overlapTokens: eff.chunk.overlapTokens },\n ast: eff.chunk.ast,\n now: isoNow(),\n };\n }\n\n return {\n async index(req, onProgress): Promise<IndexResponse> {\n const indexId = resolveIndexId(req.indexId);\n const eff = effectiveIndexConfig(config, indexId);\n const start = now();\n const result = await ingest(\n {\n indexId,\n cwd,\n // CLI `--scope` overrides the include set (keeping configured excludes);\n // otherwise use the index's configured include/exclude scope.\n scope: req.scope ? { include: [req.scope], exclude: eff.scope.exclude } : eff.scope,\n full: req.full,\n chunk: { maxTokens: eff.chunk.maxTokens, overlapTokens: eff.chunk.overlapTokens },\n ast: eff.chunk.ast,\n now: isoNow(),\n onProgress,\n },\n services,\n );\n const durationMs = now() - start;\n services.logger?.info('mind: index', {\n indexId,\n filesIndexed: result.filesIndexed,\n chunks: result.chunks,\n added: result.added,\n updated: result.updated,\n removed: result.removed,\n unchanged: result.unchanged,\n durationMs,\n });\n return { indexId, filesIndexed: result.filesIndexed, chunks: result.chunks, durationMs };\n },\n\n async search(req): Promise<SearchResponse> {\n const indexId = resolveIndexId(req.indexId);\n const retrieval = effectiveIndexConfig(config, indexId).retrieval;\n const limit = req.limit ?? retrieval.limit;\n const snippet = req.snippet ?? 'line';\n const t0 = now();\n\n // Over-fetch, then refine: retrieve -> rerank -> dedup.\n const retrieved = await retrieve(\n { text: req.text, indexId, limit: limit * 3, intent: req.intent, rrfK: retrieval.rrfK, hyde: retrieval.hyde, expand: retrieval.expand },\n services,\n );\n let ranked = retrieval.rerank ? rerank(retrieved.ranked, req.text) : retrieved.ranked;\n if (retrieval.dedup) {\n ranked = dedupRanked(ranked);\n }\n ranked = ranked.slice(0, limit);\n\n // Per-result freshness for the returned files only (bounded cost).\n const manifest = await loadManifest(services.storage, indexId);\n const stales = await staleMap(manifest, ranked.map((r) => r.chunk.path), cwd);\n const results = toSearchResults(ranked, { snippet, staleByFile: stales });\n const staleCount = [...stales.values()].filter(Boolean).length;\n const timingMs = now() - t0;\n\n services.logger?.info('mind: search', {\n indexId,\n results: results.length,\n semanticWinRate: retrieved.semanticWinRate,\n staleCount,\n timingMs,\n });\n return {\n results,\n confidence: retrieved.confidence,\n indexId,\n meta: { requestId: `mind:${t0}`, timingMs, semanticWinRate: retrieved.semanticWinRate, staleCount },\n };\n },\n\n async ask(req): Promise<AgentResponse> {\n const indexId = resolveIndexId(req.indexId);\n const retrieval = effectiveIndexConfig(config, indexId).retrieval;\n const mode: AgentQueryMode = req.mode ?? 'auto';\n const budget = config.modes[mode];\n const t0 = now();\n\n // Feedback: record the query (best-effort).\n await recordQuery(services.cache, indexId, req.text, t0);\n\n // Decompose into sub-queries for richer modes; always retains the original.\n const queries = budget.useLLM\n ? await decompose(req.text, services.llm, budget.maxSubqueries)\n : [req.text];\n\n // Gather across sub-queries, merging by chunk id (keep best score).\n const merged = new Map<string, RankedChunk>();\n let retrievalConfidence = 0;\n for (const q of queries) {\n const r = await retrieve(\n { text: q, indexId, limit: budget.maxChunks, intent: undefined, rrfK: retrieval.rrfK, hyde: retrieval.hyde, expand: retrieval.expand },\n services,\n );\n retrievalConfidence = Math.max(retrievalConfidence, r.confidence);\n for (const rc of r.ranked) {\n const prev = merged.get(rc.chunk.id);\n if (!prev || rc.score > prev.score) {\n merged.set(rc.chunk.id, rc);\n }\n }\n }\n\n let ranked = retrieval.rerank\n ? rerank([...merged.values()], req.text)\n : [...merged.values()].sort((a, b) => b.score - a.score);\n if (retrieval.dedup) {\n ranked = dedupRanked(ranked);\n }\n ranked = ranked.slice(0, budget.maxChunks);\n\n const verification = await verifySources(ranked, services.storage);\n const base = computeConfidence(retrievalConfidence, verification.rate, config.confidence.floor);\n\n const answer = await synthesizeAnswer(req.text, ranked, services.llm, budget.useLLM);\n\n // Field-check (anti-hallucination): symbols the answer names must exist in\n // the retrieved sources. Ungrounded terms penalise confidence and warn.\n const { confidence, warnings } = budget.useLLM\n ? applyFieldCheck(answer, ranked, base.confidence, base.warnings, config.confidence.floor)\n : base;\n\n const manifest = await loadManifest(services.storage, indexId);\n const staleByFile = await staleMap(manifest, ranked.map((r) => r.chunk.path), cwd);\n\n const timingMs = now() - t0;\n services.logger?.info('mind: ask', {\n indexId,\n mode,\n subqueries: queries.length,\n chunks: ranked.length,\n confidence: Math.round(confidence * 1000) / 1000,\n timingMs,\n });\n return buildAgentResponse({\n answer,\n ranked,\n confidence,\n mode,\n requestId: `mind:${t0}`,\n timingMs,\n indexId,\n floor: config.confidence.floor,\n snippet: req.snippet ?? 'line',\n staleByFile,\n warnings,\n });\n },\n\n async explore(req): Promise<ExploreResponse> {\n const indexId = resolveIndexId(req.indexId);\n const retrieval = effectiveIndexConfig(config, indexId).retrieval;\n // A map is a wider view than a search; the model decides what to open.\n const budget = config.modes.auto;\n const limit = req.limit ?? retrieval.limit;\n const t0 = now();\n\n // Over-fetch with an architecture lens, then refine: retrieve -> rerank -> dedup.\n const retrieved = await retrieve(\n { text: req.task, indexId, limit: limit * 3, intent: 'architecture', rrfK: retrieval.rrfK, hyde: retrieval.hyde, expand: retrieval.expand },\n services,\n );\n let ranked = retrieval.rerank ? rerank(retrieved.ranked, req.task) : retrieved.ranked;\n if (retrieval.dedup) {\n ranked = dedupRanked(ranked);\n }\n ranked = ranked.slice(0, limit);\n\n const manifest = await loadManifest(services.storage, indexId);\n const stales = await staleMap(manifest, ranked.map((r) => r.chunk.path), cwd);\n const files = toExploreEntries(ranked, stales);\n const spread = spreadOf(files.map((f) => f.file));\n const summary = await orientationSummary(req.task, files, services.llm, budget.useLLM);\n const timingMs = now() - t0;\n\n services.logger?.info('mind: explore', {\n indexId,\n filesTouched: files.length,\n spread,\n timingMs,\n });\n return {\n task: req.task,\n indexId,\n confidence: retrieved.confidence,\n summary,\n files,\n meta: { requestId: `mind:${t0}`, timingMs, filesTouched: files.length, spread },\n };\n },\n\n async reindex(req): Promise<IndexResponse> {\n return this.index({ indexId: req.indexId, full: true });\n },\n\n async drop(req): Promise<DropResponse> {\n const indexId = resolveIndexId(req.indexId);\n if (!(await manifestExists(services.storage, indexId))) {\n throw new Error(`No such index \"${indexId}\" — nothing to drop (run \\`kb mind status\\` to list indexes).`);\n }\n const manifest = await loadManifest(services.storage, indexId);\n const ids = manifest.chunks.map((c) => c.id);\n const droppedFiles = Object.keys(manifest.files).length;\n // Remove vectors in batches (large indexes have tens of thousands of ids).\n const BATCH = 500;\n for (let i = 0; i < ids.length; i += BATCH) {\n await services.vectorStore.delete(ids.slice(i, i + BATCH), indexId);\n }\n await deleteManifest(services.storage, indexId);\n services.logger?.info('mind: drop', { indexId, droppedChunks: ids.length, droppedFiles });\n return { indexId, droppedChunks: ids.length, droppedFiles };\n },\n\n async syncAdd(paths, indexId): Promise<SyncResponse> {\n const id = resolveIndexId(indexId);\n const counts = await syncAdd(paths, services, syncOpts(id));\n return { indexId: id, ...counts };\n },\n\n async syncUpdate(paths, indexId): Promise<SyncResponse> {\n const id = resolveIndexId(indexId);\n const counts = await syncUpdate(paths, services, syncOpts(id));\n return { indexId: id, ...counts };\n },\n\n async syncDelete(paths, indexId): Promise<SyncResponse> {\n const id = resolveIndexId(indexId);\n const counts = await syncDelete(paths, services, syncOpts(id));\n return { indexId: id, ...counts };\n },\n\n async syncList(indexId): Promise<SyncListResponse> {\n const id = resolveIndexId(indexId);\n const manifest = await loadManifest(services.storage, id);\n return {\n indexId: id,\n documents: Object.entries(manifest.files).map(([path, info]) => ({\n path,\n chunks: info.chunks,\n indexedAt: info.indexedAt,\n })),\n };\n },\n\n async syncStatus(indexId): Promise<SyncStatusResponse> {\n const id = resolveIndexId(indexId);\n const manifest = await loadManifest(services.storage, id);\n return {\n indexId: id,\n documents: Object.keys(manifest.files).length,\n chunks: manifest.chunks.length,\n lastIndexedAt: manifest.updatedAt,\n stale: false,\n };\n },\n\n async status(indexId): Promise<StatusResponse> {\n // Show every CONFIGURED index (even if not yet built) plus any built ones,\n // so an agent can see which corpora/scopes the project offers.\n const ids = indexId\n ? [indexId]\n : [...new Set([...Object.keys(config.indexes), ...(await listIndexIds(services))])];\n const indexes: IndexSummary[] = [];\n for (const id of ids) {\n const manifest = await loadManifest(services.storage, id);\n const declared = config.indexes[id];\n const sc = resolveScope(declared?.scope);\n const coverage =\n sc.include.join(', ') + (sc.exclude.length ? ` · excl ${sc.exclude.join(', ')}` : '');\n indexes.push({\n indexId: id,\n label: declared?.label,\n coverage,\n documents: Object.keys(manifest.files).length,\n chunks: manifest.chunks.length,\n lastIndexedAt: manifest.updatedAt,\n staleCount: await staleCount(manifest, cwd),\n });\n }\n return { indexes, healthy: true };\n },\n\n async health(): Promise<HealthResponse> {\n return {\n ok: true,\n vectorStore: Boolean(services.vectorStore),\n embeddings: Boolean(services.embeddings),\n llm: Boolean(services.llm),\n };\n },\n };\n}\n\n/** Enumerate index ids by scanning persisted manifests under `mind/`. */\nasync function listIndexIds(services: MindServices): Promise<string[]> {\n const paths = await services.storage.list('mind/');\n const ids = new Set<string>();\n for (const p of paths) {\n const match = /^mind\\/([^/]+)\\/manifest\\.json$/.exec(p);\n if (match) {\n ids.add(match[1]!);\n }\n }\n return [...ids];\n}\n","/**\n * Pipeline primitive.\n *\n * Every stage is a pure function `(input, services) => output`. A `Tracer`\n * times each stage and collects `StageTrace` entries so the full query flow\n * (retrieve → fuse → rerank → verify → compress → synthesize) is observable.\n * Modes (instant/auto/thinking) are just configs deciding which stages run —\n * never separate code paths.\n */\n\nimport type { StageTrace, Trace } from '@kb-labs/mind-contracts';\nimport type { MindServices } from './services';\n\nexport type Stage<I, O> = (input: I, services: MindServices) => Promise<O>;\n\n/** Monotonic clock; injectable so tests stay deterministic. */\nexport type Clock = () => number;\n\nconst defaultClock: Clock = () => Date.now();\n\n/**\n * Collects per-stage traces for one request. `run` times a stage and records\n * its duration + output size.\n */\nexport class Tracer {\n private readonly stages: StageTrace[] = [];\n\n constructor(\n private readonly requestId: string,\n private readonly mode: string,\n private readonly clock: Clock = defaultClock,\n ) {}\n\n async run<I, O>(stage: string, input: I, services: MindServices, fn: Stage<I, O>): Promise<O> {\n const start = this.clock();\n const output = await fn(input, services);\n this.stages.push({\n stage,\n durationMs: this.clock() - start,\n outputCount: Array.isArray(output) ? output.length : undefined,\n });\n return output;\n }\n\n /** Record a stage trace manually (for stages not wrapped by `run`). */\n record(trace: StageTrace): void {\n this.stages.push(trace);\n }\n\n build(totalMs: number): Trace {\n return {\n requestId: this.requestId,\n mode: this.mode,\n totalMs,\n stages: [...this.stages],\n };\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/testing.ts"],"names":[],"mappings":"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","file":"testing.js","sourcesContent":["/**\n * Functional in-memory test harness for the engine.\n *\n * `@kb-labs/sdk/testing`'s `createTestContext` returns *mock* platform services\n * (empty/noop) — fine for handler wiring, useless for exercising retrieval.\n * This harness provides REAL behaviour: a deterministic bag-of-words embedder\n * and working in-memory vector store / storage, so ingest+retrieve and\n * namespace isolation can be tested end-to-end without a daemon or network.\n *\n * Imports only types from `@kb-labs/sdk`; the implementations are local.\n */\n\nimport { mkdtempSync, mkdirSync, writeFileSync } from 'node:fs';\nimport { tmpdir } from 'node:os';\nimport { join, dirname } from 'node:path';\nimport type {\n MindServices,\n IVectorStore,\n IEmbeddings,\n IStorage,\n ICache,\n ILLM,\n ILogger,\n VectorRecord,\n VectorSearchResult,\n VectorFilter,\n} from './services';\n\nconst EMBED_DIM = 64;\n\n/** Deterministic bag-of-words embedder: shared tokens → higher cosine similarity. */\nexport class DeterministicEmbedder implements IEmbeddings {\n readonly dimensions = EMBED_DIM;\n /** Number of texts embedded — lets tests assert delta re-indexing skips work. */\n embedCount = 0;\n\n async embed(text: string): Promise<number[]> {\n this.embedCount += 1;\n const vec = new Array<number>(EMBED_DIM).fill(0);\n for (const token of text.toLowerCase().split(/[^a-z0-9]+/).filter(Boolean)) {\n let h = 0;\n for (let i = 0; i < token.length; i++) {\n h = (h * 31 + token.charCodeAt(i)) >>> 0;\n }\n const idx = h % EMBED_DIM;\n vec[idx] = (vec[idx] ?? 0) + 1;\n }\n return vec;\n }\n\n async embedBatch(texts: string[]): Promise<number[][]> {\n return Promise.all(texts.map((t) => this.embed(t)));\n }\n\n async getDimensions(): Promise<number> {\n return EMBED_DIM;\n }\n}\n\nfunction cosine(a: number[], b: number[]): number {\n let dot = 0;\n let na = 0;\n let nb = 0;\n for (let i = 0; i < a.length; i++) {\n const x = a[i] ?? 0;\n const y = b[i] ?? 0;\n dot += x * y;\n na += x * x;\n nb += y * y;\n }\n const d = Math.sqrt(na) * Math.sqrt(nb);\n return d === 0 ? 0 : dot / d;\n}\n\n/** Minimal namespace-partitioned in-memory vector store (mirrors platform semantics). */\nexport class TestVectorStore implements IVectorStore {\n private ns = new Map<string, Map<string, VectorRecord>>();\n\n private part(namespace?: string): Map<string, VectorRecord> {\n const key = namespace ?? '';\n let p = this.ns.get(key);\n if (!p) {\n p = new Map();\n this.ns.set(key, p);\n }\n return p;\n }\n\n async search(query: number[], limit: number, _filter?: VectorFilter, namespace?: string): Promise<VectorSearchResult[]> {\n return [...this.part(namespace).values()]\n .map((r) => ({ id: r.id, score: cosine(query, r.vector), metadata: r.metadata }))\n .sort((a, b) => b.score - a.score)\n .slice(0, limit);\n }\n\n async upsert(vectors: VectorRecord[], namespace?: string): Promise<void> {\n const p = this.part(namespace);\n for (const v of vectors) {\n p.set(v.id, v);\n }\n }\n\n async delete(ids: string[], namespace?: string): Promise<void> {\n const p = this.part(namespace);\n for (const id of ids) {\n p.delete(id);\n }\n }\n\n async count(namespace?: string): Promise<number> {\n return this.part(namespace).size;\n }\n\n async query(_filter: VectorFilter, namespace?: string): Promise<VectorRecord[]> {\n return [...this.part(namespace).values()];\n }\n}\n\n/** Minimal in-memory storage with prefix listing. */\nexport class TestStorage implements IStorage {\n private files = new Map<string, Buffer>();\n\n seed(path: string, content: string): void {\n this.files.set(path, Buffer.from(content, 'utf8'));\n }\n\n async read(path: string): Promise<Buffer | null> {\n return this.files.get(path) ?? null;\n }\n\n async write(path: string, data: Buffer): Promise<void> {\n this.files.set(path, data);\n }\n\n async delete(path: string): Promise<void> {\n this.files.delete(path);\n }\n\n async list(prefix: string): Promise<string[]> {\n return [...this.files.keys()].filter((p) => p.startsWith(prefix));\n }\n\n async exists(path: string): Promise<boolean> {\n return this.files.has(path);\n }\n}\n\nconst noopLogger = {\n debug() {},\n info() {},\n warn() {},\n error() {},\n fatal() {},\n trace() {},\n child() {\n return noopLogger;\n },\n} as unknown as ILogger;\n\nconst stubCache: ICache = {\n async get() {\n return null;\n },\n async set() {},\n async delete() {},\n async clear() {},\n async zadd() {},\n async zrangebyscore() {\n return [];\n },\n} as unknown as ICache;\n\nconst stubLLM: ILLM = {\n async complete() {\n return { content: '', usage: { promptTokens: 0, completionTokens: 0 } };\n },\n} as unknown as ILLM;\n\n/** Scripted LLM that returns a fixed completion — for testing agent synthesis. */\nexport function makeScriptedLLM(content: string): ILLM {\n return {\n async complete() {\n return { content, usage: { promptTokens: 0, completionTokens: 0 } };\n },\n } as unknown as ILLM;\n}\n\nexport interface TestServices extends MindServices {\n storage: TestStorage;\n vectorStore: TestVectorStore;\n}\n\n/** Build functional in-memory `MindServices` for engine tests. */\nexport function makeTestServices(overrides: Partial<MindServices> = {}): TestServices {\n const storage = new TestStorage();\n const vectorStore = new TestVectorStore();\n return {\n storage,\n vectorStore,\n embeddings: new DeterministicEmbedder(),\n cache: stubCache,\n llm: stubLLM,\n logger: noopLogger,\n ...overrides,\n } as TestServices;\n}\n\nexport interface TestWorkspace {\n /** Workspace root (a real temp dir) — pass as `createMind(..., { cwd })`. */\n cwd: string;\n /** In-memory services (vector store + manifest storage). */\n services: TestServices;\n}\n\n/**\n * Materialize source files on disk (a temp dir) so the engine exercises its\n * REAL discovery (globby + fs + ignores) instead of in-memory seeding — this is\n * what catches discovery bugs (e.g. node_modules recursion). The vector store\n * and manifest stay in-memory via `makeTestServices`.\n */\nexport function makeTestWorkspace(\n files: Record<string, string>,\n overrides: Partial<MindServices> = {},\n): TestWorkspace {\n const cwd = mkdtempSync(join(tmpdir(), 'mind-test-'));\n for (const [rel, content] of Object.entries(files)) {\n const abs = join(cwd, rel);\n mkdirSync(dirname(abs), { recursive: true });\n writeFileSync(abs, content, 'utf8');\n }\n return { cwd, services: makeTestServices(overrides) };\n}\n"]}
1
+ {"version":3,"sources":["../../home/runner/work/kb-labs/kb-labs/plugins/mind/core/src/testing.ts"],"names":[],"mappings":"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","file":"testing.js","sourcesContent":["/**\n * Functional in-memory test harness for the engine.\n *\n * `@kb-labs/sdk/testing`'s `createTestContext` returns *mock* platform services\n * (empty/noop) — fine for handler wiring, useless for exercising retrieval.\n * This harness provides REAL behaviour: a deterministic bag-of-words embedder\n * and working in-memory vector store / storage, so ingest+retrieve and\n * namespace isolation can be tested end-to-end without a daemon or network.\n *\n * Imports only types from `@kb-labs/sdk`; the implementations are local.\n */\n\nimport { mkdtempSync, mkdirSync, writeFileSync } from 'node:fs';\nimport { tmpdir } from 'node:os';\nimport { join, dirname } from 'node:path';\nimport type {\n MindServices,\n IVectorStore,\n IEmbeddings,\n IStorage,\n ICache,\n ILLM,\n ILogger,\n VectorRecord,\n VectorSearchResult,\n VectorFilter,\n} from './services';\n\nconst EMBED_DIM = 64;\n\n/** Deterministic bag-of-words embedder: shared tokens → higher cosine similarity. */\nexport class DeterministicEmbedder implements IEmbeddings {\n readonly dimensions = EMBED_DIM;\n /** Number of texts embedded — lets tests assert delta re-indexing skips work. */\n embedCount = 0;\n\n async embed(text: string): Promise<number[]> {\n this.embedCount += 1;\n const vec = new Array<number>(EMBED_DIM).fill(0);\n for (const token of text.toLowerCase().split(/[^a-z0-9]+/).filter(Boolean)) {\n let h = 0;\n for (let i = 0; i < token.length; i++) {\n h = (h * 31 + token.charCodeAt(i)) >>> 0;\n }\n const idx = h % EMBED_DIM;\n vec[idx] = (vec[idx] ?? 0) + 1;\n }\n return vec;\n }\n\n async embedBatch(texts: string[]): Promise<number[][]> {\n return Promise.all(texts.map((t) => this.embed(t)));\n }\n\n async getDimensions(): Promise<number> {\n return EMBED_DIM;\n }\n}\n\nfunction cosine(a: number[], b: number[]): number {\n let dot = 0;\n let na = 0;\n let nb = 0;\n for (let i = 0; i < a.length; i++) {\n const x = a[i] ?? 0;\n const y = b[i] ?? 0;\n dot += x * y;\n na += x * x;\n nb += y * y;\n }\n const d = Math.sqrt(na) * Math.sqrt(nb);\n return d === 0 ? 0 : dot / d;\n}\n\n/** Minimal namespace-partitioned in-memory vector store (mirrors platform semantics). */\nexport class TestVectorStore implements IVectorStore {\n private ns = new Map<string, Map<string, VectorRecord>>();\n\n private part(namespace?: string): Map<string, VectorRecord> {\n const key = namespace ?? '';\n let p = this.ns.get(key);\n if (!p) {\n p = new Map();\n this.ns.set(key, p);\n }\n return p;\n }\n\n async search(query: number[], limit: number, _filter?: VectorFilter, namespace?: string): Promise<VectorSearchResult[]> {\n return [...this.part(namespace).values()]\n .map((r) => ({ id: r.id, score: cosine(query, r.vector), metadata: r.metadata }))\n .sort((a, b) => b.score - a.score)\n .slice(0, limit);\n }\n\n async upsert(vectors: VectorRecord[], namespace?: string): Promise<void> {\n const p = this.part(namespace);\n for (const v of vectors) {\n p.set(v.id, v);\n }\n }\n\n async delete(ids: string[], namespace?: string): Promise<void> {\n const p = this.part(namespace);\n for (const id of ids) {\n p.delete(id);\n }\n }\n\n async count(namespace?: string): Promise<number> {\n return this.part(namespace).size;\n }\n\n async query(_filter: VectorFilter, namespace?: string): Promise<VectorRecord[]> {\n return [...this.part(namespace).values()];\n }\n}\n\n/** Minimal in-memory storage with prefix listing. */\nexport class TestStorage implements IStorage {\n private files = new Map<string, Buffer>();\n\n seed(path: string, content: string): void {\n this.files.set(path, Buffer.from(content, 'utf8'));\n }\n\n async read(path: string): Promise<Buffer | null> {\n return this.files.get(path) ?? null;\n }\n\n async write(path: string, data: Buffer): Promise<void> {\n this.files.set(path, data);\n }\n\n async delete(path: string): Promise<void> {\n this.files.delete(path);\n }\n\n async list(prefix: string): Promise<string[]> {\n return [...this.files.keys()].filter((p) => p.startsWith(prefix));\n }\n\n async exists(path: string): Promise<boolean> {\n return this.files.has(path);\n }\n}\n\nconst noopLogger = {\n debug() {},\n info() {},\n warn() {},\n error() {},\n fatal() {},\n trace() {},\n child() {\n return noopLogger;\n },\n} as unknown as ILogger;\n\nconst stubCache: ICache = {\n async get() {\n return null;\n },\n async set() {},\n async delete() {},\n async clear() {},\n async zadd() {},\n async zrangebyscore() {\n return [];\n },\n} as unknown as ICache;\n\nconst stubLLM: ILLM = {\n async complete() {\n return { content: '', usage: { promptTokens: 0, completionTokens: 0 } };\n },\n} as unknown as ILLM;\n\n/** Scripted LLM that returns a fixed completion — for testing agent synthesis. */\nexport function makeScriptedLLM(content: string): ILLM {\n return {\n async complete() {\n return { content, usage: { promptTokens: 0, completionTokens: 0 } };\n },\n } as unknown as ILLM;\n}\n\nexport interface TestServices extends MindServices {\n storage: TestStorage;\n vectorStore: TestVectorStore;\n}\n\n/** Build functional in-memory `MindServices` for engine tests. */\nexport function makeTestServices(overrides: Partial<MindServices> = {}): TestServices {\n const storage = new TestStorage();\n const vectorStore = new TestVectorStore();\n return {\n storage,\n vectorStore,\n embeddings: new DeterministicEmbedder(),\n cache: stubCache,\n llm: stubLLM,\n logger: noopLogger,\n ...overrides,\n } as TestServices;\n}\n\nexport interface TestWorkspace {\n /** Workspace root (a real temp dir) — pass as `createMind(..., { cwd })`. */\n cwd: string;\n /** In-memory services (vector store + manifest storage). */\n services: TestServices;\n}\n\n/**\n * Materialize source files on disk (a temp dir) so the engine exercises its\n * REAL discovery (globby + fs + ignores) instead of in-memory seeding — this is\n * what catches discovery bugs (e.g. node_modules recursion). The vector store\n * and manifest stay in-memory via `makeTestServices`.\n */\nexport function makeTestWorkspace(\n files: Record<string, string>,\n overrides: Partial<MindServices> = {},\n): TestWorkspace {\n const cwd = mkdtempSync(join(tmpdir(), 'mind-test-'));\n for (const [rel, content] of Object.entries(files)) {\n const abs = join(cwd, rel);\n mkdirSync(dirname(abs), { recursive: true });\n writeFileSync(abs, content, 'utf8');\n }\n return { cwd, services: makeTestServices(overrides) };\n}\n"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@kb-labs/mind-core",
3
3
  "description": "Core RAG engine for KB Labs Mind: ingest, retrieval, answer. Dry business logic over platform adapters.",
4
- "version": "2.119.0-canary.e120bc0ee",
4
+ "version": "2.119.0",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
7
7
  "types": "./dist/index.d.ts",
@@ -23,7 +23,7 @@
23
23
  ],
24
24
  "dependencies": {
25
25
  "globby": "^11.0.0",
26
- "@kb-labs/mind-contracts": "2.119.0-canary.e120bc0ee",
26
+ "@kb-labs/mind-contracts": "2.119.0",
27
27
  "@kb-labs/sdk": "2.115.4"
28
28
  },
29
29
  "devDependencies": {
@@ -32,10 +32,10 @@
32
32
  "tsup": "^8.5.0",
33
33
  "typescript": "^5.6.3",
34
34
  "vitest": "^3.2.6",
35
- "@kb-labs/devkit": "2.119.0-canary.e120bc0ee"
35
+ "@kb-labs/devkit": "2.119.0"
36
36
  },
37
37
  "engines": {
38
- "node": ">=22.0.0",
38
+ "node": ">=24.0.0",
39
39
  "pnpm": ">=9.0.0"
40
40
  },
41
41
  "sideEffects": false,