@wrongstack/tools 0.8.4 → 0.8.5

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/codebase-index/schema.ts","../../src/codebase-index/lsp-kind.ts","../../src/codebase-index/writer.ts","../../src/codebase-index/ts-parser.ts","../../src/codebase-index/go-parser.ts","../../src/codebase-index/py-parser.ts","../../src/codebase-index/rs-parser.ts","../../src/codebase-index/json-parser.ts","../../src/codebase-index/yaml-parser.ts","../../src/codebase-index/indexer.ts","../../src/codebase-index/codebase-index-tool.ts","../../src/codebase-index/bm25.ts","../../src/codebase-index/codebase-search-tool.ts","../../src/codebase-index/codebase-stats-tool.ts"],"names":["path","ts","parseSymbols","path2","mkdirSync","path3","os2","writeFileSync","execSync","regexParse","basename","path5","makeSymbol","path6","stat","c"],"mappings":"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","file":"index.js","sourcesContent":["// ─── Symbol kind taxonomy ───────────────────────────────────────────────────────\n\n/** Language a symbol belongs to. */\nexport type SymbolLang = 'ts' | 'js' | 'tsx' | 'jsx' | 'go' | 'py' | 'rs' | 'json' | 'yaml';\n\n/** What kind of symbol this is. */\nexport type SymbolKind =\n | 'class'\n | 'interface'\n | 'enum'\n | 'type'\n | 'function'\n | 'method'\n | 'var'\n | 'const'\n | 'let'\n | 'property'\n | 'parameter'\n | 'namespace'\n | 'object' // JSON root object\n | 'literal' // scalar value in JSON/YAML\n | 'schema' // JSON Schema $ref/$schema entry\n // Rust-specific\n | 'struct'\n | 'trait'\n | 'impl'\n | 'static'\n | 'mod';\n\n/** A single indexed code symbol. */\nexport interface Symbol {\n id: number;\n lang: SymbolLang;\n kind: SymbolKind;\n name: string;\n file: string; // absolute path\n line: number; // 1-based\n col: number; // 0-based\n signature: string; // e.g. \"function foo(a: string): Promise<void>\"\n docComment: string; // JSDoc / docstring first line\n scope: string; // e.g. \"MyClass.method\" or module-level \"\"\n text: string; // concatenated searchable text: name + signature + docComment\n}\n\n/** Extracted symbols and cross-references for one file. */\nexport interface FileSymbols {\n file: string;\n lang: SymbolLang;\n symbols: Symbol[];\n refs?: Ref[]; // cross-references extracted from this file (optional for back-compat)\n mtimeMs: number;\n}\n\n/** Source file metadata tracked for incremental indexing. */\nexport interface FileMeta {\n file: string;\n lang: SymbolLang;\n mtimeMs: number;\n symbolCount: number;\n lastIndexed: number; // unix ms\n}\n\n/** Statistics about the index. */\nexport interface IndexStats {\n totalSymbols: number;\n totalFiles: number;\n byLang: Record<SymbolLang, number>;\n byKind: Record<SymbolKind, number>;\n indexPath: string;\n lastIndexed: number | null;\n sizeBytes: number;\n version: number;\n}\n\n/** Result of a search query. */\nexport interface SearchResult {\n id: number;\n name: string;\n kind: SymbolKind;\n lang: SymbolLang;\n file: string;\n line: number;\n col: number;\n signature: string;\n docComment: string;\n score: number;\n snippet: string;\n /** Original LSP SymbolKind number if the result was filtered by an LSP kind. */\n lspKind?: number;\n}\n\n/** Result of a full reindex. */\nexport interface IndexResult {\n filesIndexed: number;\n symbolsIndexed: number;\n langStats: Record<SymbolLang, number>;\n durationMs: number;\n errors: string[];\n}\n\n// ─── Cross-reference types ───────────────────────────────────────────────────\n\n/** What kind of reference this is. */\nexport type CallType = 'call' | 'type_ref' | 'inherit' | 'implement' | 'import';\n\n/** A cross-reference between two symbols (who references whom). */\nexport interface Ref {\n id?: number;\n fromId: number; // symbol that makes the reference\n toName: string; // resolved name of the referenced symbol\n toId?: number; // resolved target symbol id (filled after index resolution)\n callType: CallType; // kind of reference\n line: number; // source line where the reference occurs\n}\n\n// ─── Schema version ───────────────────────────────────────────────────────────\n\nexport const SCHEMA_VERSION = 1;","/**\n * LSP SymbolKind mapping utilities.\n *\n * LSP SymbolKind numbers are defined by vscode-languageserver-protocol.\n * This module maps between LSP kind numbers and the internal SymbolKind taxonomy.\n */\n\nimport type { SymbolKind } from './schema.js';\n\n/**\n * LSP SymbolKind values (1–26) as defined by vscode-languageserver-protocol.\n */\nexport enum LSPSymbolKind {\n File = 1,\n Module = 2,\n Namespace = 3,\n Package = 4,\n Class = 5,\n Method = 6,\n Property = 7,\n Field = 8,\n Constructor = 9,\n Enum = 10,\n Interface = 11,\n Function = 12,\n Variable = 13,\n Constant = 14,\n String = 15,\n Number = 16,\n Boolean = 17,\n Array = 18,\n Object = 19,\n Key = 20,\n Null = 21,\n EnumMember = 22,\n Struct = 23,\n Event = 24,\n Operator = 25,\n TypeParameter = 26,\n}\n\n/**\n * Maps an LSP kind number to the corresponding internal SymbolKind.\n * Returns null if the LSP kind has no equivalent in the internal taxonomy.\n */\nexport function lspKindToInternalKind(k: number): SymbolKind | null {\n switch (k) {\n case LSPSymbolKind.Class: return 'class';\n case LSPSymbolKind.Method: return 'method';\n case LSPSymbolKind.Property:\n case LSPSymbolKind.Field: return 'property';\n case LSPSymbolKind.Constructor: return 'class';\n case LSPSymbolKind.Enum: return 'enum';\n case LSPSymbolKind.Interface: return 'interface';\n case LSPSymbolKind.Function: return 'function';\n case LSPSymbolKind.Variable: return 'var';\n case LSPSymbolKind.Constant: return 'const';\n case LSPSymbolKind.EnumMember: return 'enum';\n case LSPSymbolKind.TypeParameter:return 'type';\n case LSPSymbolKind.Namespace: return 'namespace';\n default: return null;\n }\n}\n\n/**\n * Maps an internal SymbolKind to the corresponding LSP kind number.\n * Returns null if the internal kind has no equivalent LSP kind.\n */\nexport function internalKindToLspKind(k: SymbolKind): number | null {\n switch (k) {\n case 'class': return LSPSymbolKind.Class;\n case 'method': return LSPSymbolKind.Method;\n case 'property': return LSPSymbolKind.Property;\n case 'function': return LSPSymbolKind.Function;\n case 'var': return LSPSymbolKind.Variable;\n case 'const': return LSPSymbolKind.Constant;\n case 'let': return LSPSymbolKind.Variable;\n case 'enum': return LSPSymbolKind.Enum;\n case 'interface': return LSPSymbolKind.Interface;\n case 'namespace': return LSPSymbolKind.Namespace;\n case 'type': return LSPSymbolKind.TypeParameter;\n // parameter and other internal-only kinds have no LSP equivalent\n default: return null;\n }\n}\n\n/**\n * Returns true if `k` is a valid LSP SymbolKind number (1–26).\n */\nexport function isLspKind(k: number): boolean {\n return Number.isInteger(k) && k >= 1 && k <= 26;\n}\n","/**\n * SQLite storage layer for the codebase index.\n *\n * Uses `node:sqlite` (synchronous API — DatabaseSync class).\n * Database file: {projectRoot}/.codebase-index/index.db\n */\n\nimport { createRequire } from 'node:module';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport type { DatabaseSync } from 'node:sqlite';\nimport type { FileMeta, IndexStats, Ref, SearchResult, Symbol as IndexSymbol, SymbolKind, SymbolLang } from './schema.js';\nimport { SCHEMA_VERSION } from './schema.js';\nimport { lspKindToInternalKind } from './lsp-kind.js';\n\nconst INDEX_DIR = '.codebase-index';\nconst DB_FILE = 'index.db';\n\nlet warningSilenced = false;\n/**\n * Swallow the one-time `ExperimentalWarning: SQLite ...` Node prints the first\n * time `node:sqlite` loads. Patched only once, and only filters that specific\n * warning — every other warning passes through untouched.\n */\nfunction silenceSqliteExperimentalWarning(): void {\n if (warningSilenced) return;\n warningSilenced = true;\n const original = process.emitWarning.bind(process);\n process.emitWarning = ((warning: unknown, ...rest: unknown[]): void => {\n const msg = typeof warning === 'string' ? warning : ((warning as Error)?.message ?? '');\n const name = typeof warning === 'string' ? String(rest[0] ?? '') : ((warning as Error)?.name ?? '');\n if (/sqlite/i.test(msg) && /experimental/i.test(`${name} ${msg}`)) return;\n (original as (w: unknown, ...r: unknown[]) => void)(warning, ...rest);\n }) as typeof process.emitWarning;\n}\n\nlet DatabaseSyncCtor: typeof DatabaseSync | undefined;\n/**\n * Load `node:sqlite`'s `DatabaseSync` lazily. Keeping this off the module's\n * top-level import means the codebase-index tools can be registered at CLI boot\n * without eagerly loading SQLite — so a runtime that lacks `node:sqlite` (it is\n * experimental, available since Node 22.5) only fails if the index is actually\n * used, with a clear message instead of a crash on import.\n */\nfunction loadDatabaseSync(): typeof DatabaseSync {\n if (DatabaseSyncCtor) return DatabaseSyncCtor;\n silenceSqliteExperimentalWarning();\n try {\n const req = createRequire(import.meta.url);\n DatabaseSyncCtor = (req('node:sqlite') as typeof import('node:sqlite')).DatabaseSync;\n } catch (err) {\n throw new Error(\n \"The codebase index needs Node's built-in SQLite (node:sqlite), available since Node 22.5. \" +\n `This runtime doesn't provide it: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n return DatabaseSyncCtor;\n}\n\nexport class IndexStore {\n private db: DatabaseSync;\n\n constructor(private projectRoot: string) {\n const dir = path.join(projectRoot, INDEX_DIR);\n fs.mkdirSync(dir, { recursive: true });\n const Database = loadDatabaseSync();\n this.db = new Database(path.join(dir, DB_FILE));\n this.initSchema();\n }\n\n private initSchema(): void {\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS metadata (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL\n );\n CREATE TABLE IF NOT EXISTS files (\n file TEXT PRIMARY KEY,\n lang TEXT NOT NULL,\n mtime_ms INTEGER NOT NULL,\n symbol_count INTEGER NOT NULL DEFAULT 0,\n last_indexed INTEGER NOT NULL\n );\n CREATE TABLE IF NOT EXISTS symbols (\n id INTEGER PRIMARY KEY,\n lang TEXT NOT NULL,\n kind TEXT NOT NULL,\n name TEXT NOT NULL,\n file TEXT NOT NULL,\n line INTEGER NOT NULL,\n col INTEGER NOT NULL,\n signature TEXT NOT NULL DEFAULT '',\n doc_comment TEXT NOT NULL DEFAULT '',\n scope TEXT NOT NULL DEFAULT '',\n text TEXT NOT NULL DEFAULT '',\n file_fk TEXT NOT NULL\n );\n `);\n\n this.db.exec('CREATE INDEX IF NOT EXISTS idx_s_name ON symbols(name)');\n this.db.exec('CREATE INDEX IF NOT EXISTS idx_s_kind ON symbols(kind)');\n this.db.exec('CREATE INDEX IF NOT EXISTS idx_s_lang ON symbols(lang)');\n this.db.exec('CREATE INDEX IF NOT EXISTS idx_s_file ON symbols(file)');\n\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS refs (\n id INTEGER PRIMARY KEY,\n from_id INTEGER NOT NULL,\n to_name TEXT NOT NULL,\n to_id INTEGER,\n call_type TEXT NOT NULL,\n line INTEGER NOT NULL\n );\n `);\n\n this.db.exec('CREATE INDEX IF NOT EXISTS idx_r_from ON refs(from_id)');\n this.db.exec('CREATE INDEX IF NOT EXISTS idx_r_to_id ON refs(to_id)');\n this.db.exec('CREATE INDEX IF NOT EXISTS idx_r_to_name ON refs(to_name)');\n this.db.exec('CREATE INDEX IF NOT EXISTS idx_r_call_type ON refs(call_type)');\n\n const versionRows = this.db.prepare('SELECT value FROM metadata WHERE key = ?').all('version');\n if (!versionRows.length) {\n this.db.prepare('INSERT INTO metadata(key, value) VALUES (?, ?)').run('version', String(SCHEMA_VERSION));\n }\n }\n\n // ─── Symbol CRUD ─────────────────────────────────────────────────────────────\n\n insertSymbols(symbols: IndexSymbol[], nextId: number): number {\n const stmt = this.db.prepare(\n `INSERT INTO symbols(id, lang, kind, name, file, line, col, signature, doc_comment, scope, text, file_fk)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n );\n\n let id = nextId;\n for (const s of symbols) {\n stmt.run(\n id++,\n s.lang,\n s.kind,\n s.name,\n s.file,\n s.line,\n s.col,\n s.signature,\n s.docComment,\n s.scope,\n s.text,\n s.file,\n );\n }\n return id;\n }\n\n deleteSymbolsForFile(file: string): void {\n this.db.prepare('DELETE FROM symbols WHERE file_fk = ?').run(file);\n }\n\n deleteFile(file: string): void {\n this.db.prepare('DELETE FROM files WHERE file = ?').run(file);\n }\n\n // ─── File metadata ──────────────────────────────────────────────────────────\n\n upsertFile(meta: FileMeta): void {\n this.db.prepare(\n `INSERT INTO files(file, lang, mtime_ms, symbol_count, last_indexed)\n VALUES (?, ?, ?, ?, ?)\n ON CONFLICT(file) DO UPDATE SET\n lang = excluded.lang,\n mtime_ms = excluded.mtime_ms,\n symbol_count = excluded.symbol_count,\n last_indexed = excluded.last_indexed`,\n ).run(meta.file, meta.lang, meta.mtimeMs, meta.symbolCount, meta.lastIndexed);\n }\n\n getFileMeta(file: string): FileMeta | null {\n const rows = this.db.prepare(\n 'SELECT file, lang, mtime_ms, symbol_count, last_indexed FROM files WHERE file = ?',\n ).all(file) as { file: string; lang: string; mtime_ms: number; symbol_count: number; last_indexed: number }[];\n if (!rows.length) return null;\n const r = rows[0]!;\n return { file: r.file, lang: r.lang as SymbolLang, mtimeMs: r.mtime_ms, symbolCount: r.symbol_count, lastIndexed: r.last_indexed };\n }\n\n getAllFileMetas(): FileMeta[] {\n return (this.db.prepare(\n 'SELECT file, lang, mtime_ms, symbol_count, last_indexed FROM files',\n ).all() as { file: string; lang: string; mtime_ms: number; symbol_count: number; last_indexed: number }[]).map(\n (r) => ({ file: r.file, lang: r.lang as SymbolLang, mtimeMs: r.mtime_ms, symbolCount: r.symbol_count, lastIndexed: r.last_indexed }),\n );\n }\n\n // ─── Search ──────────────────────────────────────────────────────────────────\n\n search(\n query: string,\n filter?: { kind?: SymbolKind; lang?: SymbolLang; file?: string; lspKind?: number },\n ): SearchResult[] {\n const conditions: string[] = [];\n const values: unknown[] = [];\n\n let effectiveKind: SymbolKind | undefined = filter?.kind;\n if (filter?.lspKind !== undefined) {\n const mapped = lspKindToInternalKind(filter.lspKind);\n if (mapped !== null) {\n effectiveKind = mapped;\n } else {\n // LSP kind was explicitly provided but has no internal mapping → no results\n return [];\n }\n }\n\n if (effectiveKind) {\n conditions.push('kind = ?');\n values.push(effectiveKind);\n }\n if (filter?.lang) {\n conditions.push('lang = ?');\n values.push(filter.lang);\n }\n if (filter?.file) {\n conditions.push('file LIKE ?');\n values.push(`%${filter.file}%`);\n }\n if (query.trim()) {\n const tokens = query.toLowerCase().split(/\\s+/).filter(Boolean);\n const tokenConds = tokens.map(() => 'text LIKE ?');\n conditions.push(`(${tokenConds.join(' OR ')})`);\n for (const t of tokens) values.push(`%${t}%`);\n }\n\n const where = conditions.length ? `WHERE ${conditions.join(' AND ')}` : '';\n const sql = `SELECT id, lang, kind, name, file, line, col, signature, doc_comment, text FROM symbols ${where}`;\n\n const stmt = this.db.prepare(sql);\n const rows = stmt.all(...values as (string | number)[]) as {\n id: number; lang: string; kind: string; name: string; file: string;\n line: number; col: number; signature: string; doc_comment: string; text: string;\n }[];\n\n return rows.map((r) => ({\n id: r.id,\n lang: r.lang as SymbolLang,\n kind: r.kind as SymbolKind,\n name: r.name,\n file: r.file,\n line: r.line,\n col: r.col,\n signature: r.signature,\n docComment: r.doc_comment,\n score: 0,\n snippet: '',\n lspKind: filter?.lspKind,\n }));\n }\n\n getAllIndexable(): Array<{ id: number; text: string }> {\n return (this.db.prepare('SELECT id, text FROM symbols').all() as { id: number; text: string }[]).map(\n ({ id, text }) => ({ id, text }),\n );\n }\n\n // ─── Stats ───────────────────────────────────────────────────────────────────\n\n getStats(): IndexStats {\n const sizeBytes = this.sizeBytes();\n\n const lastRows = this.db.prepare(\n \"SELECT value FROM metadata WHERE key = 'last_indexed'\",\n ).all() as { value: string }[];\n const lastIndexed = lastRows.length ? Number(lastRows[0]!.value) : null;\n\n const totalRows = this.db.prepare('SELECT COUNT(*) FROM symbols').all() as { 'COUNT(*)': number }[];\n const totalSymbols = totalRows[0] ? Number(totalRows[0]['COUNT(*)']) : 0;\n\n const fileRows = this.db.prepare('SELECT COUNT(*) FROM files').all() as { 'COUNT(*)': number }[];\n const totalFiles = fileRows[0] ? Number(fileRows[0]['COUNT(*)']) : 0;\n\n const langRows = this.db.prepare(\n 'SELECT lang, COUNT(*) FROM symbols GROUP BY lang',\n ).all() as { lang: string; 'COUNT(*)': number }[];\n const byLang = {} as Record<SymbolLang, number>;\n for (const row of langRows) byLang[row.lang as SymbolLang] = Number(row['COUNT(*)']);\n\n const kindRows = this.db.prepare(\n 'SELECT kind, COUNT(*) FROM symbols GROUP BY kind',\n ).all() as { kind: string; 'COUNT(*)': number }[];\n const byKind = {} as Record<SymbolKind, number>;\n for (const row of kindRows) byKind[row.kind as SymbolKind] = Number(row['COUNT(*)']);\n\n return {\n totalSymbols,\n totalFiles,\n byLang,\n byKind,\n indexPath: path.join(this.projectRoot, INDEX_DIR),\n lastIndexed,\n sizeBytes,\n version: SCHEMA_VERSION,\n };\n }\n\n setLastIndexed(ts: number): void {\n this.db.prepare(\n \"INSERT OR REPLACE INTO metadata(key, value) VALUES('last_indexed', ?)\",\n ).run(String(ts));\n }\n\n clearAll(): void {\n this.db.exec('DELETE FROM symbols');\n this.db.exec('DELETE FROM files');\n this.db.exec('DELETE FROM refs');\n }\n\n // ─── Ref CRUD ────────────────────────────────────────────────────────────────\n\n /**\n * Insert cross-references for a given source symbol id.\n * Replaces any existing refs from the same source (idempotent on re-index).\n */\n insertRefs(fromId: number, refs: Ref[]): void {\n // Delete old refs from this symbol (handles re-index)\n this.db.prepare('DELETE FROM refs WHERE from_id = ?').run(fromId);\n if (refs.length === 0) return;\n\n const stmt = this.db.prepare(\n `INSERT INTO refs(from_id, to_name, to_id, call_type, line)\n VALUES (?, ?, ?, ?, ?)`,\n );\n for (const ref of refs) {\n stmt.run(fromId, ref.toName, ref.toId ?? null, ref.callType, ref.line);\n }\n }\n\n /**\n * Delete all refs whose source symbols are in a given file.\n * Used when re-indexing a file to clear stale refs.\n */\n deleteRefsForFile(file: string): void {\n const ids = this.db.prepare(\n 'SELECT id FROM symbols WHERE file = ?',\n ).all(file) as { id: number }[];\n if (!ids.length) return;\n const placeholders = ids.map(() => '?').join(',');\n this.db.prepare(`DELETE FROM refs WHERE from_id IN (${placeholders})`).run(...ids.map((r) => r.id));\n }\n\n /**\n * Resolve `to_name` → `to_id` for all refs that have a name but no id.\n * Call this after all symbols have been inserted to fill in cross-references.\n */\n resolveRefs(): number {\n const unresolved = this.db.prepare(\n 'SELECT id, to_name FROM refs WHERE to_id IS NULL AND to_name IS NOT NULL',\n ).all() as { id: number; to_name: string }[];\n\n let resolved = 0;\n for (const row of unresolved) {\n const target = this.db.prepare('SELECT id FROM symbols WHERE name = ? LIMIT 1').all(row.to_name) as { id: number }[];\n if (target.length) {\n this.db.prepare('UPDATE refs SET to_id = ? WHERE id = ?').run(target[0]!.id, row.id);\n resolved++;\n }\n }\n return resolved;\n }\n\n /**\n * Find all references TO a given symbol (who calls / uses this symbol?).\n */\n findRefsTo(symbolId: number): Ref[] {\n return (this.db.prepare(\n 'SELECT id, from_id, to_name, to_id, call_type, line FROM refs WHERE to_id = ? OR to_name = (SELECT name FROM symbols WHERE id = ?)',\n ).all(symbolId, symbolId) as { id: number; from_id: number; to_name: string; to_id: number | null; call_type: string; line: number }[]).map((r) => ({\n id: r.id, fromId: r.from_id, toName: r.to_name, toId: r.to_id ?? undefined, callType: r.call_type as Ref['callType'], line: r.line,\n }));\n }\n\n /**\n * Find all references FROM a given symbol (what does this symbol call/use?).\n */\n findRefsFrom(symbolId: number): Ref[] {\n return (this.db.prepare(\n 'SELECT id, from_id, to_name, to_id, call_type, line FROM refs WHERE from_id = ?',\n ).all(symbolId) as { id: number; from_id: number; to_name: string; to_id: number | null; call_type: string; line: number }[]).map((r) => ({\n id: r.id, fromId: r.from_id, toName: r.to_name, toId: r.to_id ?? undefined, callType: r.call_type as Ref['callType'], line: r.line,\n }));\n }\n\n private sizeBytes(): number {\n const dbPath = path.join(this.projectRoot, INDEX_DIR, DB_FILE);\n try {\n return fs.statSync(dbPath).size;\n } catch {\n return 0;\n }\n }\n\n close(): void {\n try { this.db.close(); } catch { /* already closed */ }\n }\n}","/**\n * TypeScript/JavaScript symbol extraction using the TypeScript Compiler API.\n *\n * We traverse the AST and collect:\n * - classes, interfaces, enums, type aliases → class|interface|enum|type\n * - functions and methods → function|method\n * - const/let/var declarations → const|let|var\n * - property/accessor declarations → property\n *\n * The `id` field on each Symbol is always 0 — the caller is responsible for\n * assigning unique ids during insertion.\n */\n\nimport * as ts from 'typescript';\nimport type { CallType, FileSymbols, Ref, Symbol as IndexSymbol, SymbolKind, SymbolLang } from './schema.js';\n\n// Map TypeScript SyntaxKind → our SymbolKind taxonomy\nconst KIND_MAP: Partial<Record<ts.SyntaxKind, SymbolKind>> = {\n [ts.SyntaxKind.ClassDeclaration]: 'class',\n [ts.SyntaxKind.InterfaceDeclaration]: 'interface',\n [ts.SyntaxKind.EnumDeclaration]: 'enum',\n [ts.SyntaxKind.TypeAliasDeclaration]: 'type',\n [ts.SyntaxKind.FunctionDeclaration]: 'function',\n [ts.SyntaxKind.MethodDeclaration]: 'method',\n [ts.SyntaxKind.GetAccessor]: 'property',\n [ts.SyntaxKind.SetAccessor]: 'property',\n [ts.SyntaxKind.PropertyDeclaration]: 'property',\n [ts.SyntaxKind.Parameter]: 'parameter',\n [ts.SyntaxKind.NamespaceExportDeclaration]: 'namespace',\n};\n\nfunction kindOf(node: ts.Node): SymbolKind | null {\n // VariableDeclaration needs special handling — its parent tells us whether\n // it's `const`, `let`, or `var`.\n if (ts.isVariableDeclaration(node)) {\n const parent = node.parent;\n if (ts.isVariableDeclarationList(parent)) {\n const flags = parent.flags;\n if (flags & ts.NodeFlags.Let) return 'let';\n if (flags & ts.NodeFlags.Const) return 'const';\n return 'var';\n }\n }\n\n // Namespace (module) declaration\n if (ts.isModuleDeclaration(node)) return 'namespace';\n\n return KIND_MAP[node.kind] ?? null;\n}\n\nfunction extToLang(ext: string): SymbolLang | null {\n switch (ext) {\n case '.ts': return 'ts';\n case '.tsx': return 'tsx';\n case '.js': return 'js';\n case '.jsx': return 'jsx';\n case '.go': return 'go';\n case '.py': return 'py';\n case '.rs': return 'rs';\n case '.json': return 'json';\n case '.yaml': return 'yaml';\n case '.yml': return 'yaml';\n default: return null;\n }\n}\n\nfunction getSignature(node: ts.Declaration, sourceFile: ts.SourceFile): string {\n const printer = ts.createPrinter({});\n const raw = printer.printNode(ts.EmitHint.Unspecified, node, sourceFile);\n return raw.replace(/\\s+/g, ' ').slice(0, 500);\n}\n\n/**\n * Extract the first line of a JSDoc comment preceding a node.\n * Uses `ts.getLeadingCommentRanges` which is the modern replacement for\n * the removed `ts.getJSDocComments`.\n */\nfunction getJsDoc(node: ts.Node, sourceFile: ts.SourceFile): string {\n const fullText = sourceFile.getFullText();\n const nodePos = node.getFullWidth();\n const comments = ts.getLeadingCommentRanges(fullText, nodePos);\n if (!comments) return '';\n\n for (const range of comments) {\n const commentText = fullText.slice(range.pos, range.end);\n // Only process JSDoc comments (/** ... */)\n const trimmed = commentText.trim();\n if (trimmed.startsWith('/**') && trimmed.endsWith('*/')) {\n // Strip the /** and */ delimiters and leading * on each line\n const inner = trimmed\n .slice(3, -2) // remove /** and */\n .replace(/^[ \\t]*\\*[ ]?/gm, '') // remove leading \" * \" or \" *\" on each line\n .trim();\n return inner.split('\\n')[0]?.trim().slice(0, 200) ?? '';\n }\n }\n return '';\n}\n\n/** Build the scope path from a node up to the root (for class-method scope). */\nfunction buildScope(node: ts.Node): string {\n const parts: string[] = [];\n let current: ts.Node | undefined = node.parent;\n while (current) {\n if (\n ts.isClassDeclaration(current) ||\n ts.isInterfaceDeclaration(current) ||\n ts.isEnumDeclaration(current) ||\n ts.isTypeAliasDeclaration(current)\n ) {\n parts.unshift(current.name?.text ?? 'Anon');\n } else if (\n ts.isMethodDeclaration(current) ||\n ts.isGetAccessor(current) ||\n ts.isSetAccessor(current) ||\n ts.isPropertyDeclaration(current) ||\n ts.isFunctionDeclaration(current)\n ) {\n if (current.name && ts.isIdentifier(current.name)) {\n parts.unshift(current.name.text);\n }\n }\n current = current.parent;\n }\n return parts.join('.');\n}\n\nexport interface ParseOptions {\n file: string;\n content: string;\n lang: SymbolLang;\n}\n\n/**\n * Parse a TypeScript/JavaScript source file and extract all code symbols.\n *\n * The returned `Symbol.id` field is always `0` — the caller is responsible\n * for assigning unique numeric ids during bulk insertion.\n *\n * Returns an empty array for files that can't be parsed or contain no symbols.\n */\nexport function parseSymbols(opts: ParseOptions): FileSymbols {\n const { file, content, lang } = opts;\n\n let sourceFile: ts.SourceFile;\n try {\n sourceFile = ts.createSourceFile(file, content, ts.ScriptTarget.Latest, true);\n } catch {\n return { file, lang, symbols: [], mtimeMs: Date.now() };\n }\n\n const symbols: IndexSymbol[] = [];\n\n function visit(node: ts.Node): void {\n const kind = kindOf(node);\n\n if (kind) {\n const nameNode = (node as { name?: ts.Identifier }).name;\n if (!nameNode || !ts.isIdentifier(nameNode)) return;\n const name = nameNode.text;\n const pos = nameNode.getStart(sourceFile);\n const { line, character } = sourceFile.getLineAndCharacterOfPosition(pos);\n const scope = buildScope(node);\n const signature = getSignature(node as ts.Declaration, sourceFile);\n const docComment = getJsDoc(node, sourceFile);\n const text = [name, signature, docComment].filter(Boolean).join(' | ');\n\n symbols.push({\n id: 0,\n lang,\n kind,\n name,\n file,\n line: line + 1,\n col: character,\n signature,\n docComment,\n scope,\n text,\n });\n }\n\n ts.forEachChild(node, visit);\n }\n\n visit(sourceFile);\n\n // Second pass: collect cross-references (call/type/inherit refs)\n const refs = extractRefs(sourceFile);\n\n return { file, lang, symbols, refs, mtimeMs: Date.now() };\n}\n\n// ─── Reference extraction ──────────────────────────────────────────────────────\n\n/** Collect call/type/inherit references from a source file. */\nfunction extractRefs(sourceFile: ts.SourceFile): Ref[] {\n const refs: Ref[] = [];\n\n function visit(node: ts.Node): void {\n const pos = node.getStart(sourceFile);\n const { line } = sourceFile.getLineAndCharacterOfPosition(pos);\n const lineNum = line + 1;\n\n if (ts.isCallExpression(node)) {\n const expr = node.expression;\n if (ts.isIdentifier(expr)) {\n refs.push({ fromId: 0, toName: expr.text, callType: 'call', line: lineNum });\n }\n } else if (ts.isPropertyAccessExpression(node)) {\n if (ts.isIdentifier(node.expression)) {\n refs.push({ fromId: 0, toName: node.expression.text, callType: 'call', line: lineNum });\n }\n } else if (ts.isTypeReferenceNode(node)) {\n const name = getTypeName(node.typeName);\n if (name) refs.push({ fromId: 0, toName: name, callType: 'type_ref', line: lineNum });\n } else if (ts.isHeritageClause(node)) {\n for (const t of node.types) {\n const name = getTypeName(t.expression as ts.EntityName);\n if (name) refs.push({ fromId: 0, toName: name, callType: node.token === ts.SyntaxKind.ExtendsKeyword ? 'inherit' : 'implement', line: lineNum });\n }\n } else if (ts.isImportDeclaration(node)) {\n const moduleName = getModuleName(node);\n if (moduleName) refs.push({ fromId: 0, toName: moduleName, callType: 'import', line: lineNum });\n }\n\n ts.forEachChild(node, visit);\n }\n\n visit(sourceFile);\n return deduplicateRefs(refs);\n}\n\n/** Extract the name string from a type name node (simple or qualified). */\nfunction getTypeName(name: ts.EntityName): string {\n if (ts.isIdentifier(name)) return name.text;\n if (ts.isQualifiedName(name)) return `${getTypeName(name.left)}.${name.right.text}`;\n return '';\n}\n\n/** Get the module path string from an import declaration. */\nfunction getModuleName(node: ts.ImportDeclaration): string {\n const moduleSpecifier = node.moduleSpecifier;\n if (ts.isStringLiteral(moduleSpecifier)) return moduleSpecifier.text;\n return '';\n}\n\n/** Remove duplicate refs (same toName, callType, line). fromId is always 0 at this stage. */\nfunction deduplicateRefs(refs: Ref[]): Ref[] {\n const seen = new Set<string>();\n return refs.filter((r) => {\n const key = `${r.toName}:${r.callType}:${r.line}`;\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n}\n\n/** Detect SymbolLang from a file path extension. */\nexport function detectLang(file: string): SymbolLang | null {\n const idx = file.lastIndexOf('.');\n if (idx < 0) return null;\n return extToLang(file.slice(idx));\n}","/**\n * Go source symbol extraction using `go/parser`.\n *\n * Spawns a `go run -` child process that parses the file with go/ast and\n * emits JSON. Falls back to empty results on any error.\n *\n * Extracts: package, func, type, const, var\n */\n\nimport { execSync } from 'node:child_process';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport { mkdirSync, writeFileSync } from 'node:fs';\nimport type { FileSymbols, Symbol as IndexSymbol, SymbolLang } from './schema.js';\nimport { detectLang } from './ts-parser.js';\n\n// ─── Public API ─────────────────────────────────────────────────────────────\n\nexport function parseSymbols(opts: { file: string; content: string; lang: SymbolLang }): FileSymbols {\n const { file, content, lang } = opts;\n\n try {\n return syncGoParse(file, content, lang);\n } catch {\n return { file, lang, symbols: [], mtimeMs: Date.now() };\n }\n}\n\nexport { detectLang } from './ts-parser.js';\n\n// ─── Inline Go parser script ────────────────────────────────────────────────\n\nconst GO_PARSE_SCRIPT = `\npackage main\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"go/ast\"\n\t\"go/parser\"\n\t\"go/token\"\n\t\"io\"\n\t\"os\"\n\t\"strings\"\n)\n\ntype Sym struct {\n\tName string \\`json:\"name\"\\`\n\tKind string \\`json:\"kind\"\\`\n\tLine int \\`json:\"line\"\\`\n\tCol int \\`json:\"col\"\\`\n\tSignature string \\`json:\"signature\"\\`\n\tScope string \\`json:\"scope\"\\`\n}\n\nfunc main() {\n\tsrc, err := io.ReadAll(os.Stdin)\n\tif err != nil {\n\t\tfmt.Print(\"[]\")\n\t\treturn\n\t}\n\tfset := token.NewFileSet()\n\tnode, err := parser.ParseFile(fset, \"src.go\", src, 0)\n\tif err != nil {\n\t\tfmt.Print(\"[]\")\n\t\treturn\n\t}\n\n\tvar syms []Sym\n\n\t// Package-level scope\n\tpkgScope := node.Name.Name\n\n\t// Collect all top-level declarations\n\tfor _, decl := range node.Decls {\n\t\tswitch d := decl.(type) {\n\t\tcase *ast.FuncDecl:\n\t\t\tname := d.Name.Name\n\t\t\tkind := \"function\"\n\t\t\tscope := pkgScope\n\t\t\tif d.Recv != nil && len(d.Recv.List) > 0 {\n\t\t\t\tscope = pkgScope + \".\" + recvTypeName(d.Recv.List[0].Type) + \".\" + name\n\t\t\t\tkind = \"method\"\n\t\t\t} else {\n\t\t\t\tscope = pkgScope + \".\" + name\n\t\t\t}\n\t\t\tpos := fset.Position(d.Pos())\n\t\t\tsig := formatFuncSig(d)\n\t\t\tsyms = append(syms, Sym{Name: name, Kind: kind, Line: pos.Line, Col: pos.Column, Signature: sig, Scope: scope})\n\n\t\tcase *ast.GenDecl:\n\t\t\tfor _, spec := range d.Specs {\n\t\t\t\tswitch s := spec.(type) {\n\t\t\t\tcase *ast.TypeSpec:\n\t\t\t\t\tname := s.Name.Name\n\t\t\t\t\tpos := fset.Position(s.Pos())\n\t\t\t\t\tsig := \"type \" + name\n\t\t\t\t\tif s.TypeParams != nil {\n\t\t\t\t\t\tsig += formatTypeParams(s.TypeParams)\n\t\t\t\t\t}\n\t\t\t\t\tif st, ok := s.Type.(*ast.StructType); ok {\n\t\t\t\t\t\tsig += \" = struct { \" + formatFields(st.Fields.List) + \" }\"\n\t\t\t\t\t} else if it, ok := s.Type.(*ast.InterfaceType); ok {\n\t\t\t\t\t\tsig += \" = interface { \" + formatMethods(it.Methods.List) + \" }\"\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsig += \" = \" + formatType(s.Type)\n\t\t\t\t\t}\n\t\t\t\t\tsyms = append(syms, Sym{Name: name, Kind: \"type\", Line: pos.Line, Col: pos.Column, Signature: sig, Scope: pkgScope})\n\n\t\t\t\tcase *ast.ValueSpec:\n\t\t\t\t\tfor _, n := range s.Names {\n\t\t\t\t\t\tname := n.Name\n\t\t\t\t\t\tpos := fset.Position(n.Pos())\n\t\t\t\t\t\tkind := \"var\"\n\t\t\t\t\t\tif d.Tok == token.CONST {\n\t\t\t\t\t\t\tkind = \"const\"\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsig := kind + \" \" + name\n\t\t\t\t\t\tif s.Type != nil {\n\t\t\t\t\t\t\tsig += \" \" + formatType(s.Type)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsyms = append(syms, Sym{Name: name, Kind: kind, Line: pos.Line, Col: pos.Column, Signature: sig, Scope: pkgScope})\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tdata, err := json.Marshal(syms)\n\tif err != nil {\n\t\tfmt.Print(\"[]\")\n\t\treturn\n\t}\n\tfmt.Print(string(data))\n}\n\nfunc recvTypeName(t ast.Expr) string {\n\tswitch v := t.(type) {\n\tcase *ast.Ident:\n\t\treturn v.Name\n\tcase *ast.StarExpr:\n\t\treturn recvTypeName(v.X)\n\tdefault:\n\t\treturn \"?\"\n\t}\n}\n\nfunc formatFuncSig(d *ast.FuncDecl) string {\n\tscope := \"\"\n\tif d.Recv != nil && len(d.Recv.List) > 0 {\n\t\tscope = \"(\" + formatFieldList(d.Recv.List) + \") \"\n\t}\n\tscope += formatFuncType(d.Type)\n\treturn \"func \" + scope\n}\n\nfunc formatFuncType(f *ast.FuncType) string {\n\tparams := formatFieldList(f.Params.List)\n\tresults := \"\"\n\tif f.Results != nil {\n\t\tresults = \" -> \" + formatFieldList(f.Results.List)\n\t}\n\treturn params + results\n}\n\nfunc formatFieldList(fields []*ast.Field) string {\n\tif len(fields) == 0 {\n\t\treturn \"()\"\n\t}\n\tnames := make([]string, 0, len(fields))\n\tfor _, f := range fields {\n\t\tname := \"\"\n\t\tif len(f.Names) > 0 {\n\t\t\tname = f.Names[0].Name\n\t\t}\n\t\tt := formatType(f.Type)\n\t\tif name != \"\" {\n\t\t\tnames = append(names, name+\" \"+t)\n\t\t} else {\n\t\t\tnames = append(names, t)\n\t\t}\n\t}\n\treturn \"(\" + strings.Join(names, \", \") + \")\"\n}\n\nfunc formatFields(fields []*ast.Field) string {\n\tlines := make([]string, 0)\n\tfor _, f := range fields {\n\t\tname := \"\"\n\t\tif len(f.Names) > 0 {\n\t\t\tname = f.Names[0].Name\n\t\t}\n\t\tt := formatType(f.Type)\n\t\tif name != \"\" {\n\t\t\tlines = append(lines, name+\" \"+t)\n\t\t} else {\n\t\t\tlines = append(lines, t)\n\t\t}\n\t}\n\treturn strings.Join(lines, \"; \")\n}\n\nfunc formatMethods(fields []*ast.Field) string {\n\treturn formatFields(fields)\n}\n\nfunc formatTypeParams(tp *ast.FieldList) string {\n\tif tp == nil || len(tp.List) == 0 {\n\t\treturn \"\"\n\t}\n\tparams := make([]string, len(tp.List))\n\tfor i, p := range tp.List {\n\t\tif len(p.Names) > 0 {\n\t\t\tparams[i] = p.Names[0].Name\n\t\t} else {\n\t\t\tparams[i] = \"T\"\n\t\t}\n\t}\n\treturn \"[\" + strings.Join(params, \", \") + \"]\"\n}\n\nfunc formatType(t ast.Expr) string {\n\tif t == nil {\n\t\treturn \"?\"\n\t}\n\tswitch v := t.(type) {\n\tcase *ast.Ident:\n\t\treturn v.Name\n\tcase *ast.SelectorExpr:\n\t\treturn formatType(v.X) + \".\" + v.Sel.Name\n\tcase *ast.StarExpr:\n\t\treturn \"*\" + formatType(v.X)\n\tcase *ast.ArrayType:\n\t\tif v.Len == nil {\n\t\t\treturn \"[]\" + formatType(v.Elt)\n\t\t}\n\t\treturn \"[...]\" + formatType(v.Elt)\n\tcase *ast.MapType:\n\t\treturn \"map[\" + formatType(v.Key) + \"]\" + formatType(v.Value)\n\tcase *ast.InterfaceType:\n\t\treturn \"interface{}\"\n\tcase *ast.StructType:\n\t\treturn \"struct{}\"\n\tcase *ast.FuncType:\n\t\treturn formatFuncType(v)\n\tcase *ast.ChanType:\n\t\treturn \"chan \" + formatType(v.Value)\n\tcase *ast.BasicLit:\n\t\treturn v.Value\n\tcase *ast.IndexExpr:\n\t\t// Generic instantiation with one type arg, e.g. Logger[int].\n\t\treturn formatType(v.X) + \"[\" + formatType(v.Index) + \"]\"\n\tcase *ast.IndexListExpr:\n\t\t// Generic instantiation with multiple type args, e.g. Map[K, V].\n\t\targs := make([]string, len(v.Indices))\n\t\tfor i, idx := range v.Indices {\n\t\t\targs[i] = formatType(idx)\n\t\t}\n\t\treturn formatType(v.X) + \"[\" + strings.Join(args, \", \") + \"]\"\n\tdefault:\n\t\treturn \"?\"\n\t}\n}\n`;\n\nfunction syncGoParse(filePath: string, content: string, lang: SymbolLang): FileSymbols {\n\t// Feed the source over stdin — never pass the target .go file as a CLI arg.\n\t// `go run script.go target.go` makes the toolchain treat target.go as a\n\t// second package file (\"named files must all be in one directory\") and\n\t// refuses *_test.go outright. Reading from stdin sidesteps both, and lets\n\t// us parse the in-memory content without touching disk.\n\tconst tmpDir = path.join(os.tmpdir(), 'ws-go-parse');\n\ttry {\n\t\tmkdirSync(tmpDir, { recursive: true });\n\t\tconst scriptPath = path.join(tmpDir, 'parse.go');\n\t\twriteFileSync(scriptPath, GO_PARSE_SCRIPT, 'utf8');\n\n\t\tconst stdout = execSync(`go run \"${scriptPath}\"`, {\n\t\t\tinput: content,\n\t\t\ttimeout: 15_000,\n\t\t\tencoding: 'utf8',\n\t\t\twindowsHide: true,\n\t\t});\n\n\t\tif (!stdout.trim()) {\n\t\t\treturn { file: filePath, lang, symbols: [], mtimeMs: Date.now() };\n\t\t}\n\n\t\tconst raw = JSON.parse(stdout.trim()) as Array<{ name: string; kind: string; line: number; col: number; signature: string; scope: string }>;\n\t\tconst symbols: IndexSymbol[] = raw.map((s) => ({\n\t\t\tid: 0,\n\t\t\tlang,\n\t\t\tkind: s.kind as IndexSymbol['kind'],\n\t\t\tname: s.name,\n\t\t\tfile: filePath,\n\t\t\tline: s.line,\n\t\t\tcol: s.col,\n\t\t\tsignature: s.signature ?? '',\n\t\t\tdocComment: '',\n\t\t\tscope: s.scope ?? '',\n\t\t\ttext: `${s.name} ${s.signature ?? ''}`.trim(),\n\t\t}));\n\t\treturn { file: filePath, lang, symbols, mtimeMs: Date.now() };\n\t} catch {\n\t\treturn { file: filePath, lang, symbols: [], mtimeMs: Date.now() };\n\t}\n}","/**\n * Python source symbol extraction using the `ast` module.\n *\n * Spawns a `python -c` child process that parses the file with Python's `ast`\n * module and emits JSON. Falls back to empty results on any error.\n *\n * Extracts: class, function, async function, const, var, import, import_from\n */\n\nimport { execSync } from 'node:child_process';\nimport { mkdirSync, writeFileSync } from 'node:fs';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport type { FileSymbols, Symbol as IndexSymbol, SymbolLang } from './schema.js';\nimport { detectLang } from './ts-parser.js';\n\n// ─── Public API ─────────────────────────────────────────────────────────────\n\nexport function parseSymbols(opts: { file: string; content: string; lang: SymbolLang }): FileSymbols {\n const { file, lang } = opts;\n\n try {\n return syncPyParse(file, lang);\n } catch {\n return { file, lang, symbols: [], mtimeMs: Date.now() };\n }\n}\n\nexport { detectLang } from './ts-parser.js';\n\n// ─── Inline Python parser script ────────────────────────────────────────────\n\nconst PY_PARSE_SCRIPT = `import ast, json, sys, os\n\ndef get_name(node):\n if isinstance(node, ast.Name):\n return node.id\n elif isinstance(node, ast.Attribute):\n return get_name(node.value) + \".\" + node.attr\n elif isinstance(node, ast.Subscript):\n return get_name(node.value)\n elif isinstance(node, ast.Call):\n return get_name(node.func)\n elif isinstance(node, ast.Constant):\n return str(node.value)\n return \"\"\n\ndef get_decorators(node):\n decs = []\n for dec in node.decorator_list:\n decs.append(get_name(dec))\n return decs\n\ndef get_bases(node):\n bases = []\n for base in node.bases:\n bases.append(get_name(base))\n return bases\n\ndef get_args(args):\n parts = []\n for arg in args.args:\n parts.append(arg.arg)\n return \", \".join(parts)\n\ndef get_returns(node):\n if node.returns is None:\n return \"\"\n return get_name(node.returns)\n\nclass Sym:\n def __init__(self, name, kind, line, col, signature, scope):\n self.name = name\n self.kind = kind\n self.line = line\n self.col = col\n self.signature = signature\n self.scope = scope\n def to_dict(self):\n return {\n \"name\": self.name,\n \"kind\": self.kind,\n \"line\": self.line,\n \"col\": self.col,\n \"signature\": self.signature,\n \"scope\": self.scope,\n }\n\ndef is_private(name):\n return name.startswith(\"__\") and not name.endswith(\"__\")\n\nsyms = []\nerrors = []\n\ntry:\n with open(sys.argv[1], \"r\", encoding=\"utf-8\") as f:\n source = f.read()\n tree = ast.parse(source, filename=sys.argv[1])\nexcept Exception as e:\n errors.append(str(e))\n print(\"[]\")\n sys.exit(0)\n\n# Module-level scope\nmodule_scope = os.path.basename(sys.argv[1])[:-3] # strip .py\n\nclass ModuleVisitor(ast.NodeVisitor):\n def __init__(self):\n self.scope_stack = [module_scope]\n\n def visit_ClassDef(self, node):\n bases = get_bases(node)\n decs = get_decorators(node)\n sig = \"class \" + node.name\n if bases:\n sig += \"(\" + \", \".join(bases) + \")\"\n sig += \": ...\"\n syms.append(Sym(\n name=node.name,\n kind=\"class\",\n line=node.lineno,\n col=node.col_offset,\n signature=sig,\n scope=\".\".join(self.scope_stack) + \".\" + node.name,\n ))\n self.scope_stack.append(node.name)\n self.generic_visit(node)\n self.scope_stack.pop()\n\n def visit_FunctionDef(self, node):\n decs = get_decorators(node)\n args = get_args(node.args)\n returns = get_returns(node)\n is_async = isinstance(node, ast.AsyncFunctionDef)\n\n kind = \"function\"\n prefix = \"def \"\n if decs:\n for d in decs:\n if d.endswith(\".staticmethod\"):\n kind = \"staticmethod\"\n elif d.endswith(\".classmethod\"):\n kind = \"classmethod\"\n elif d == \"property\":\n kind = \"property\"\n\n if is_async:\n kind = \"async_\" + kind\n\n sig = f\"{prefix}{node.name}({args})\"\n if returns:\n sig += f\" -> {returns}\"\n scope = \".\".join(self.scope_stack) + \".\" + node.name\n\n syms.append(Sym(\n name=node.name,\n kind=kind,\n line=node.lineno,\n col=node.col_offset,\n signature=sig,\n scope=scope,\n ))\n # Don't descend into function bodies to avoid local symbols\n # self.generic_visit(node)\n\n def visit_AsyncFunctionDef(self, node):\n # Treat as function\n self.visit_FunctionDef(node)\n\n def visit_Assign(self, node):\n for target in node.targets:\n if isinstance(target, ast.Name):\n name = target.id\n if is_private(name):\n continue\n # Infer constness from UPPER_CASE naming\n kind = \"const\" if name.isupper() else \"var\"\n col = target.col_offset if hasattr(target, 'col_offset') else 0\n syms.append(Sym(\n name=name,\n kind=kind,\n line=node.lineno,\n col=col,\n signature=f\"{name} = ...\",\n scope=\".\".join(self.scope_stack),\n ))\n\n def visit_AnnAssign(self, node):\n if isinstance(node.target, ast.Name):\n name = node.target.id\n if is_private(name):\n return\n kind = \"const\" if name.isupper() else \"var\"\n col = node.target.col_offset if hasattr(node.target, 'col_offset') else 0\n sig = f\"{name}: {get_name(node.annotation)}\"\n if node.value:\n sig += \" = ...\"\n syms.append(Sym(\n name=name,\n kind=kind,\n line=node.lineno,\n col=col,\n signature=sig,\n scope=\".\".join(self.scope_stack),\n ))\n\n def visit_Import(self, node):\n for alias in node.names:\n name = alias.asname or alias.name\n syms.append(Sym(\n name=name,\n kind=\"import\",\n line=node.lineno,\n col=node.col_offset,\n signature=f\"import {alias.name}\",\n scope=\".\".join(self.scope_stack),\n ))\n\n def visit_ImportFrom(self, node):\n module = node.module or \"\"\n for alias in node.names:\n name = alias.asname or alias.name\n syms.append(Sym(\n name=name,\n kind=\"import\",\n line=node.lineno,\n col=node.col_offset,\n signature=f\"from {module} import {alias.name}\",\n scope=\".\".join(self.scope_stack),\n ))\n\nvisitor = ModuleVisitor()\nvisitor.visit(tree)\n\nprint(json.dumps([s.to_dict() for s in syms]))\n`;\n\n// ─── Synchronous Python parse via child process ─────────────────────────────\n\nfunction syncPyParse(filePath: string, lang: SymbolLang): FileSymbols {\n\ttry {\n\t\t// Write the parser to a temp .py and run it as a script. Passing the\n\t\t// whole 200-line program via `python -c \"...\"` breaks under cmd.exe on\n\t\t// Windows (embedded newlines truncate the command), so the child saw a\n\t\t// mangled script and emitted nothing. A real file sidesteps all quoting.\n\t\tconst tmpDir = path.join(os.tmpdir(), 'ws-py-parse');\n\t\tmkdirSync(tmpDir, { recursive: true });\n\t\tconst scriptPath = path.join(tmpDir, 'parse.py');\n\t\twriteFileSync(scriptPath, PY_PARSE_SCRIPT, 'utf8');\n\n\t\tconst stdout = execSync(`python \"${scriptPath}\" \"${filePath}\"`, {\n\t\t\ttimeout: 15_000,\n\t\t\tencoding: 'utf8',\n\t\t\twindowsHide: true,\n\t\t});\n\n\t\tif (!stdout.trim()) {\n\t\t\treturn { file: filePath, lang, symbols: [], mtimeMs: Date.now() };\n\t\t}\n\n\t\tconst raw = JSON.parse(stdout.trim()) as Array<{\n\t\t\tname: string;\n\t\t\tkind: string;\n\t\t\tline: number;\n\t\t\tcol: number;\n\t\t\tsignature: string;\n\t\t\tscope: string;\n\t\t}>;\n\t\tconst symbols: IndexSymbol[] = raw.map((s) => ({\n\t\t\tid: 0,\n\t\t\tlang,\n\t\t\tkind: s.kind as IndexSymbol['kind'],\n\t\t\tname: s.name,\n\t\t\tfile: filePath,\n\t\t\tline: s.line,\n\t\t\tcol: s.col,\n\t\t\tsignature: s.signature ?? '',\n\t\t\tdocComment: '',\n\t\t\tscope: s.scope ?? '',\n\t\t\ttext: `${s.name} ${s.signature ?? ''}`.trim(),\n\t\t}));\n\t\treturn { file: filePath, lang, symbols, mtimeMs: Date.now() };\n\t} catch {\n\t\treturn { file: filePath, lang, symbols: [], mtimeMs: Date.now() };\n\t}\n}","/**\n * Rust source symbol extraction.\n *\n * Tries to use the native `syn` crate via a cargo subproject (tools/syn-parser/).\n * Falls back to a robust regex-based extractor when cargo/syn is not available.\n *\n * The regex fallback extracts: fn, struct, enum, trait, impl, type, const, static, mod\n */\n\nimport { execSync, spawnSync } from 'node:child_process';\nimport * as path from 'node:path';\nimport type { FileSymbols, Symbol as IndexSymbol, SymbolLang } from './schema.js';\n\n// ─── Public API ─────────────────────────────────────────────────────────────\n\nexport function parseSymbols(opts: {\n file: string;\n content: string;\n lang: SymbolLang;\n}): FileSymbols {\n const { file, content, lang } = opts;\n\n // Try native parser first, fall back to regex\n const nativeAvailable = checkNativeParser();\n if (nativeAvailable) {\n const result = tryNativeParse(file, content);\n if (result) return result;\n }\n\n return regexParse({ file, content, lang });\n}\n\nexport { detectLang } from './ts-parser.js';\n\n// ─── Native parser (syn) ─────────────────────────────────────────────────────\n\nfunction checkNativeParser(): boolean {\n try {\n execSync('rustc --version', { stdio: 'pipe' });\n // Check if our syn-parser crate is available\n const toolsDir = path.join(process.cwd(), 'tools');\n try {\n execSync(\n 'cargo metadata --no-deps --format-version 1 --manifest-path ' +\n path.join(toolsDir, 'Cargo.toml'),\n { stdio: 'pipe' },\n );\n return true;\n } catch {\n return false;\n }\n } catch {\n return false;\n }\n}\n\nfunction tryNativeParse(file: string, content: string): FileSymbols | null {\n try {\n const toolsDir = path.join(process.cwd(), 'tools');\n const crateDir = path.join(toolsDir, 'syn-parser');\n\n // Write source to temp file for cargo to read\n const tmpFile = path.join(crateDir, 'src', 'input.rs');\n const { writeFileSync } = require('node:fs');\n writeFileSync(tmpFile, content, 'utf8');\n\n const result = spawnSync(\n 'cargo',\n ['run', '--manifest-path', path.join(toolsDir, 'Cargo.toml')],\n {\n cwd: process.cwd(),\n encoding: 'utf8',\n timeout: 15000,\n stdio: ['pipe', 'pipe', 'pipe'],\n },\n );\n\n if (result.status === 0 && result.stdout) {\n const symbols: IndexSymbol[] = JSON.parse(result.stdout);\n return {\n file,\n lang: 'rs',\n symbols: symbols.map((s) => ({ ...s, id: 0, lang: 'rs' as SymbolLang })),\n mtimeMs: Date.now(),\n };\n }\n } catch {\n // Fall through to regex\n }\n return null;\n}\n\n// ─── Regex fallback parser ───────────────────────────────────────────────────\n\ninterface RustPattern {\n regex: RegExp;\n kind: IndexSymbol['kind'];\n}\n\nconst RS_PATTERNS: RustPattern[] = [\n { regex: /fn\\s+(\\w+)\\s*\\([^)]*\\)/g, kind: 'function' },\n { regex: /struct\\s+(\\w+)/g, kind: 'struct' },\n { regex: /enum\\s+(\\w+)/g, kind: 'enum' },\n { regex: /trait\\s+(\\w+)/g, kind: 'trait' },\n { regex: /impl\\s+(?:<[^>]+>)?(\\w+)/g, kind: 'impl' },\n { regex: /type\\s+(\\w+)\\s*=/g, kind: 'type' },\n { regex: /const\\s+(\\w+)/g, kind: 'const' },\n { regex: /static\\s+(\\w+)/g, kind: 'static' },\n { regex: /mod\\s+(\\w+)/g, kind: 'mod' },\n];\n\nfunction regexParse(opts: { file: string; content: string; lang: SymbolLang }): FileSymbols {\n const { file, content, lang } = opts;\n const symbols: IndexSymbol[] = [];\n const lines = content.split('\\n');\n\n // Build line offset map\n const lineOffsets: number[] = [0];\n for (let i = 0; i < lines.length; i++) {\n lineOffsets.push(lineOffsets[i]! + lines[i]!.length + 1);\n }\n\n function lineFromOffset(offset: number): number {\n let lo = 0;\n let hi = lineOffsets.length - 1;\n while (lo < hi) {\n const mid = (lo + hi + 1) >>> 1;\n if (lineOffsets[mid]! <= offset) lo = mid;\n else hi = mid - 1;\n }\n return lo + 1; // 1-based\n }\n\n function extractDeclaration(lineIdx: number, match: RegExpExecArray): string {\n const line = lines[lineIdx] ?? '';\n return line.trim().slice(0, 500);\n }\n\n for (const pattern of RS_PATTERNS) {\n pattern.regex.lastIndex = 0;\n for (\n let match = pattern.regex.exec(content);\n match !== null;\n match = pattern.regex.exec(content)\n ) {\n const name = match[1]!;\n const offset = match.index!;\n const line = lineFromOffset(offset);\n const col = offset - (lineOffsets[line - 1] ?? 0);\n const lineIdx = line - 1;\n const signature = extractDeclaration(lineIdx, match);\n\n symbols.push({\n id: 0,\n lang,\n kind: pattern.kind,\n name,\n file,\n line,\n col,\n signature,\n docComment: '',\n scope: '',\n text: `${name} ${signature}`.trim(),\n });\n }\n }\n\n // Deduplicate by name+line\n const seen = new Set<string>();\n const deduped = symbols.filter((s) => {\n const key = `${s.name}:${s.line}`;\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n\n return { file, lang, symbols: deduped, mtimeMs: Date.now() };\n}\n","/**\n * JSON file symbol extraction.\n *\n * Extracts top-level keys as \"symbols\" with kind `property`.\n * Special handling for:\n * - package.json: scripts, dependencies, devDependencies → `const`\n * - tsconfig.json: compilerOptions keys → `property`\n * - JSON Schema / OpenAPI: $schema, $id, $ref → `schema`\n * - Root object itself → kind `object`\n *\n * Uses regex-based extraction for speed and zero dependencies.\n */\n\nimport * as path from 'node:path';\nimport type { FileSymbols, Symbol as IndexSymbol, SymbolLang } from './schema.js';\n\n// ─── Public API ─────────────────────────────────────────────────────────────\n\nexport function parseSymbols(opts: {\n file: string;\n content: string;\n lang: SymbolLang;\n}): FileSymbols {\n const { file, content, lang } = opts;\n\n try {\n return regexParse({ file, content, lang });\n } catch {\n return { file, lang, symbols: [], mtimeMs: Date.now() };\n }\n}\n\nexport { detectLang } from './ts-parser.js';\n\n// ─── Regex parser ───────────────────────────────────────────────────────────\n\ninterface JsonPattern {\n regex: RegExp;\n kind: IndexSymbol['kind'];\n}\n\nconst JSON_PATTERNS: JsonPattern[] = [\n // Top-level \"key\": value (on its own line)\n { regex: /^\\s*\"([^\"]+)\"\\s*:/gm, kind: 'property' },\n];\n\n/**\n * Extract key-value pairs from JSON content using regex.\n * Handles: \"key\": value, arrays with keyed objects, nested objects (depth ≤ 3).\n */\nfunction regexParse(opts: { file: string; content: string; lang: SymbolLang }): FileSymbols {\n const { file, content, lang } = opts;\n const symbols: IndexSymbol[] = [];\n const basename = path.basename(file).toLowerCase();\n\n const isPackageJson = basename === 'package.json';\n const isTsconfig = basename === 'tsconfig.json' || basename === 'tsconfig.build.json';\n const isJsonSchema =\n content.includes('$schema') || content.includes('$id') || content.includes('$ref');\n const isOpenApi = content.includes('openapi') || content.includes('swagger');\n\n const lines = content.split('\\n');\n\n // Build line offset map\n const lineOffsets: number[] = [0];\n for (let i = 0; i < lines.length; i++) {\n lineOffsets.push(lineOffsets[i]! + lines[i]!.length + 1);\n }\n\n function lineFromOffset(offset: number): number {\n let lo = 0;\n let hi = lineOffsets.length - 1;\n while (lo < hi) {\n const mid = (lo + hi + 1) >>> 1;\n if (lineOffsets[mid]! <= offset) lo = mid;\n else hi = mid - 1;\n }\n return lo + 1;\n }\n\n // Root object symbol\n const rootMatch = content.match(/^\\s*\\{/m);\n if (rootMatch) {\n const offset = rootMatch.index!;\n const line = lineFromOffset(offset);\n symbols.push(\n makeSymbol({\n name: path.basename(file),\n kind: 'object',\n line,\n col: 0,\n signature: `\"${path.basename(file)}\" = { ... }`,\n file,\n lang,\n }),\n );\n }\n\n // Extract top-level keys\n const topLevelKeyRegex = /^\\s*\"([^\"]+)\"\\s*:/gm;\n for (\n let match = topLevelKeyRegex.exec(content);\n match !== null;\n match = topLevelKeyRegex.exec(content)\n ) {\n const key = match[1]!;\n const offset = match.index!;\n const line = lineFromOffset(offset);\n const col = offset - (lineOffsets[line - 1] ?? 0);\n\n let kind: IndexSymbol['kind'] = 'property';\n let signature = `\"${key}\": ...\"`;\n\n // Special casing for known file types\n if (isPackageJson) {\n if (\n key === 'scripts' ||\n key === 'dependencies' ||\n key === 'devDependencies' ||\n key === 'peerDependencies' ||\n key === 'optionalDependencies'\n ) {\n kind = 'const';\n signature = `\"${key}\": { ... }`;\n }\n } else if (isTsconfig) {\n if (key === 'compilerOptions') {\n kind = 'property';\n signature = `\"compilerOptions\": { ... }`;\n }\n }\n\n // JSON Schema / OpenAPI special keys\n if (isJsonSchema || isOpenApi) {\n if (key === '$schema' || key === '$id') {\n kind = 'schema';\n signature = `\"${key}\": \"...\"`;\n } else if (key === '$ref') {\n kind = 'schema';\n signature = `\"$ref\": \"...\"`;\n }\n }\n\n symbols.push(\n makeSymbol({\n name: key,\n kind,\n line,\n col,\n signature,\n file,\n lang,\n }),\n );\n\n // For package.json, also extract individual scripts as 'function'\n if (isPackageJson && key === 'scripts') {\n extractPackageScripts(content, symbols, file, lang, lineOffsets, lineFromOffset);\n }\n\n // For tsconfig.json compilerOptions, extract nested keys\n if (isTsconfig && key === 'compilerOptions') {\n extractCompilerOptions(content, symbols, file, lang, lineOffsets, line, lineFromOffset);\n }\n }\n\n // Extract JSON Schema $defs or definitions\n const defsRegex = /\"\\$defs\"\\s*:|\"\\$defs\"\\s*:/g;\n const defsMatch = defsRegex.exec(content);\n if (defsMatch !== null) {\n const offset = defsMatch.index!;\n const line = lineFromOffset(offset);\n symbols.push(\n makeSymbol({\n name: '$defs',\n kind: 'property',\n line,\n col: offset - (lineOffsets[line - 1] ?? 0),\n signature: '\"$defs\": { ... }',\n file,\n lang,\n }),\n );\n }\n\n // Extract definitions (OpenAPI components, JSON Schema definitions)\n const defsPatterns = [\n /\"\\$defs\"\\s*:/g,\n /\"definitions\"\\s*:/g,\n /\"components\"\\s*:/g,\n /\"schemas\"\\s*:/g,\n ];\n for (const pat of defsPatterns) {\n pat.lastIndex = 0;\n for (let match = pat.exec(content); match !== null; match = pat.exec(content)) {\n const offset = match.index!;\n const line = lineFromOffset(offset);\n const key = match[0]!.match(/\"([^\"]+)\"/)?.[1] ?? match[0]!;\n symbols.push(\n makeSymbol({\n name: key,\n kind: 'property',\n line,\n col: offset - (lineOffsets[line - 1] ?? 0),\n signature: `\"${key}\": { ... }`,\n file,\n lang,\n }),\n );\n }\n }\n\n return { file, lang, symbols, mtimeMs: Date.now() };\n}\n\nfunction extractPackageScripts(\n content: string,\n symbols: IndexSymbol[],\n file: string,\n lang: SymbolLang,\n lineOffsets: number[],\n lineFromOffset: (offset: number) => number,\n): void {\n // Find the \"scripts\": { ... } block and extract each script key\n const scriptsBlockRegex = /\"scripts\"\\s*:\\s*\\{([^}]+)\\}/g;\n for (\n let match = scriptsBlockRegex.exec(content);\n match !== null;\n match = scriptsBlockRegex.exec(content)\n ) {\n const blockContent = match[0]!;\n const blockOffset = match.index!;\n\n // Extract each \"key\" inside the block (simple approach)\n const scriptKeyRegex = /\"(\\w[\\w-]*)\"\\s*:/g;\n for (\n let scriptMatch = scriptKeyRegex.exec(blockContent);\n scriptMatch !== null;\n scriptMatch = scriptKeyRegex.exec(blockContent)\n ) {\n const key = scriptMatch[1]!;\n const keyOffset = blockOffset + scriptMatch.index!;\n const line = lineFromOffset(keyOffset);\n symbols.push(\n makeSymbol({\n name: key,\n kind: 'function',\n line,\n col: keyOffset - (lineOffsets[line - 1] ?? 0),\n signature: `\"${key}\": \"...\"`,\n file,\n lang,\n }),\n );\n }\n }\n}\n\nfunction extractCompilerOptions(\n content: string,\n symbols: IndexSymbol[],\n file: string,\n lang: SymbolLang,\n lineOffsets: number[],\n parentLine: number,\n lineFromOffset: (offset: number) => number,\n): void {\n // Find the \"compilerOptions\": { ... } block\n const optsBlockRegex = /\"compilerOptions\"\\s*:\\s*\\{([^}]+)\\}/g;\n for (\n let match = optsBlockRegex.exec(content);\n match !== null;\n match = optsBlockRegex.exec(content)\n ) {\n const blockContent = match[0]!;\n const blockOffset = match.index!;\n\n // Extract nested key inside compilerOptions (up to depth 1)\n const optKeyRegex = /\"(\\w[\\w]*)\"\\s*:/g;\n for (\n let optMatch = optKeyRegex.exec(blockContent);\n optMatch !== null;\n optMatch = optKeyRegex.exec(blockContent)\n ) {\n const key = optMatch[1]!;\n const keyOffset = blockOffset + optMatch.index!;\n const line = lineFromOffset(keyOffset);\n if (line <= parentLine) continue; // Skip top-level (already captured)\n symbols.push(\n makeSymbol({\n name: key,\n kind: 'property',\n line,\n col: keyOffset - (lineOffsets[line - 1] ?? 0),\n signature: `\"${key}\": ...`,\n file,\n lang,\n }),\n );\n }\n }\n}\n\nfunction makeSymbol(opts: {\n name: string;\n kind: IndexSymbol['kind'];\n line: number;\n col: number;\n signature: string;\n file: string;\n lang: SymbolLang;\n}): IndexSymbol {\n return {\n id: 0,\n lang: opts.lang,\n kind: opts.kind,\n name: opts.name,\n file: opts.file,\n line: opts.line,\n col: opts.col,\n signature: opts.signature,\n docComment: '',\n scope: '',\n text: `${opts.name} ${opts.signature}`.trim(),\n };\n}\n","/**\n * YAML file symbol extraction.\n *\n * Uses regex-based extraction (no js-yaml dependency).\n * Extracts:\n * - Top-level and nested key-value pairs (up to depth 3)\n * - List items with key: `- key: value`\n * - Block scalars `key: |` and `key: >`\n * - Anchors `&anchor` and aliases `*alias`\n *\n * Kind taxonomy:\n * - `property` for keys\n * - `literal` for scalar values (strings, numbers, booleans)\n * - `const` for anchors\n */\n\nimport * as path from 'node:path';\nimport type { FileSymbols, Symbol as IndexSymbol, SymbolLang } from './schema.js';\n\n// ─── Public API ─────────────────────────────────────────────────────────────\n\nexport function parseSymbols(opts: {\n file: string;\n content: string;\n lang: SymbolLang;\n}): FileSymbols {\n const { file, content, lang } = opts;\n\n try {\n return regexParse({ file, content, lang });\n } catch {\n return { file, lang, symbols: [], mtimeMs: Date.now() };\n }\n}\n\nexport { detectLang } from './ts-parser.js';\n\n// ─── Regex parser ───────────────────────────────────────────────────────────\n\nfunction regexParse(opts: { file: string; content: string; lang: SymbolLang }): FileSymbols {\n const { file, content, lang } = opts;\n const symbols: IndexSymbol[] = [];\n\n const lines = content.split('\\n');\n\n // Build line offset map for accurate line/col\n const lineOffsets: number[] = [0];\n for (let i = 0; i < lines.length; i++) {\n lineOffsets.push(lineOffsets[i]! + lines[i]!.length + 1);\n }\n\n function lineFromOffset(offset: number): number {\n let lo = 0;\n let hi = lineOffsets.length - 1;\n while (lo < hi) {\n const mid = (lo + hi + 1) >>> 1;\n if (lineOffsets[mid]! <= offset) lo = mid;\n else hi = mid - 1;\n }\n return lo + 1;\n }\n\n // ── 1. Anchors and aliases ─────────────────────────────────────────────────\n // &anchor_name\n const anchorRegex = /&(\\w[\\w-]*)/g;\n for (let match = anchorRegex.exec(content); match !== null; match = anchorRegex.exec(content)) {\n const name = match[1]!;\n const offset = match.index!;\n const line = lineFromOffset(offset);\n const col = offset - (lineOffsets[line - 1] ?? 0);\n symbols.push(\n makeSymbol({\n name,\n kind: 'const',\n line,\n col,\n signature: `&${name}`,\n file,\n lang,\n }),\n );\n }\n\n // *alias_name\n const aliasRegex = /\\*(\\w[\\w-]*)/g;\n for (let match = aliasRegex.exec(content); match !== null; match = aliasRegex.exec(content)) {\n const name = match[1]!;\n const offset = match.index!;\n const line = lineFromOffset(offset);\n const col = offset - (lineOffsets[line - 1] ?? 0);\n symbols.push(\n makeSymbol({\n name,\n kind: 'const',\n line,\n col,\n signature: `*${name}`,\n file,\n lang,\n }),\n );\n }\n\n // ── 2. Top-level and nested key: value pairs ───────────────────────────────\n // Matches `key: value` (but not block scalars or document markers)\n // Uses negative lookbehind and context to avoid false positives\n const kvRegex = /^(\\s*)([^:#\\s][^:#\\s]*)\\s*:/gm;\n for (let match = kvRegex.exec(content); match !== null; match = kvRegex.exec(content)) {\n const indent = match[1]!.length;\n const key = match[2]!;\n const offset = match.index!;\n const line = lineFromOffset(offset);\n const col = offset - (lineOffsets[line - 1] ?? 0);\n\n // Skip block scalar indicators (| or > at column 0 with key name before :)\n const lineContent = lines[line - 1] ?? '';\n if (/^[|&>]/.test(lineContent.trim())) continue;\n // Skip YAML document markers\n if (key === '---' || key === '...') continue;\n // Skip keys that are clearly part of a string value (unusual indent)\n if (indent > 12) continue;\n\n const value = extractValue(content, match.index!);\n const kind: IndexSymbol['kind'] = isScalar(value) ? 'literal' : 'property';\n const signature = `${key}: ${truncate(value, 60)}`;\n\n symbols.push(makeSymbol({ name: key, kind, line, col, signature, file, lang }));\n }\n\n // ── 3. List item keys ──────────────────────────────────────────────────────\n // `- key: value` (list item that is a keyed object)\n const listItemRegex = /^-(\\s+)([^:#\\s][^:#\\s]*)\\s*:/gm;\n for (let match = listItemRegex.exec(content); match !== null; match = listItemRegex.exec(content)) {\n const key = match[2]!;\n const offset = match.index!;\n const line = lineFromOffset(offset);\n const col = offset - (lineOffsets[line - 1] ?? 0);\n const value = extractValue(content, offset + match[0]!.length);\n const kind: IndexSymbol['kind'] = isScalar(value) ? 'literal' : 'property';\n symbols.push(\n makeSymbol({\n name: key,\n kind,\n line,\n col,\n signature: `- ${key}: ${truncate(value, 60)}`,\n file,\n lang,\n }),\n );\n }\n\n // ── 4. Block scalar keys (key: | or key: >) ────────────────────────────────\n const blockScalarRegex = /^(\\s*)([^:#\\s][^:#\\s]*)\\s*:\\s*[|>](\\s|$)/gm;\n for (let match = blockScalarRegex.exec(content); match !== null; match = blockScalarRegex.exec(content)) {\n const key = match[2]!;\n const offset = match.index!;\n const line = lineFromOffset(offset);\n const col = offset - (lineOffsets[line - 1] ?? 0);\n symbols.push(\n makeSymbol({\n name: key,\n kind: 'property',\n line,\n col,\n signature: `${key}: | ...`,\n file,\n lang,\n }),\n );\n }\n\n return { file, lang, symbols, mtimeMs: Date.now() };\n}\n\n// ─── Helpers ───────────────────────────────────────────────────────────────\n\nfunction extractValue(content: string, afterColonOffset: number): string {\n // Get the rest of the line after the colon\n const lineEnd = content.indexOf('\\n', afterColonOffset);\n const rest = content.slice(afterColonOffset, lineEnd < 0 ? undefined : lineEnd);\n return rest.trim();\n}\n\nfunction isScalar(value: string): boolean {\n if (!value) return false;\n // Numbers, booleans, null, quoted strings\n if (/^-?\\d+(\\.\\d+)?([eE][+-]?\\d+)?$/.test(value)) return true;\n if (/^(true|false|null|undefined)$/i.test(value)) return true;\n if (/^'[^']*'$/.test(value) || /^\"[^\"]*\"$/.test(value)) return true;\n return false;\n}\n\nfunction truncate(s: string, max: number): string {\n if (s.length <= max) return s;\n return s.slice(0, max) + '...';\n}\n\nfunction makeSymbol(opts: {\n name: string;\n kind: IndexSymbol['kind'];\n line: number;\n col: number;\n signature: string;\n file: string;\n lang: SymbolLang;\n}): IndexSymbol {\n return {\n id: 0,\n lang: opts.lang,\n kind: opts.kind,\n name: opts.name,\n file: opts.file,\n line: opts.line,\n col: opts.col,\n signature: opts.signature,\n docComment: '',\n scope: '',\n text: `${opts.name} ${opts.signature}`.trim(),\n };\n}\n","/**\n * Main indexing orchestrator.\n *\n * Given a project root and a list of files:\n * 1. Parse each file with the appropriate parser (TS, Go, Python, Rust, JSON, YAML)\n * 2. Delete old symbols for changed/deleted files\n * 3. Insert new symbols\n * 4. Update file metadata\n * 5. Return index statistics\n */\n\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { Dirent, Stats } from 'node:fs';\nimport type { Context } from '@wrongstack/core';\nimport { compileGlob } from '@wrongstack/core';\nimport type { FileMeta, IndexResult, Symbol as IndexSymbol } from './schema.js';\nimport { IndexStore } from './writer.js';\nimport { parseSymbols as parseTs, detectLang } from './ts-parser.js';\nimport { parseSymbols as parseGo } from './go-parser.js';\nimport { parseSymbols as parsePy } from './py-parser.js';\nimport { parseSymbols as parseRs } from './rs-parser.js';\nimport { parseSymbols as parseJson } from './json-parser.js';\nimport { parseSymbols as parseYaml } from './yaml-parser.js';\n\nconst DEFAULT_IGNORE = [\n 'node_modules', '.git', 'dist', 'build', '.next', 'coverage',\n '.turbo', '__snapshots__', '.nyc_output',\n];\n\ninterface IndexerOptions {\n projectRoot: string;\n files?: string[];\n force?: boolean;\n langs?: string[];\n ignore?: string[];\n}\n\nasync function findSourceFiles(\n projectRoot: string,\n ignore: string[],\n): Promise<string[]> {\n const results: string[] = [];\n const ignoreSet = new Set([...DEFAULT_IGNORE, ...ignore]);\n // compileGlob does not support brace expansion — use one pattern per extension\n const globs = [\n { ext: '.ts', pat: compileGlob('**/*.ts') },\n { ext: '.tsx', pat: compileGlob('**/*.tsx') },\n { ext: '.js', pat: compileGlob('**/*.js') },\n { ext: '.jsx', pat: compileGlob('**/*.jsx') },\n { ext: '.go', pat: compileGlob('**/*.go') },\n { ext: '.py', pat: compileGlob('**/*.py') },\n { ext: '.rs', pat: compileGlob('**/*.rs') },\n { ext: '.json', pat: compileGlob('**/*.json') },\n { ext: '.yaml', pat: compileGlob('**/*.yaml') },\n { ext: '.yml', pat: compileGlob('**/*.yml') },\n ];\n\n const walk = async (dir: string): Promise<void> => {\n let entries: Dirent[];\n try {\n entries = await fs.readdir(dir, { withFileTypes: true });\n } catch {\n return;\n }\n for (const e of entries) {\n if (ignoreSet.has(e.name)) continue;\n const full = path.join(dir, e.name);\n if (e.isDirectory()) {\n await walk(full);\n } else if (e.isFile()) {\n // Normalize to forward-slash relative path for pattern matching\n const rel = path.relative(projectRoot, full).replace(/\\\\/g, '/');\n const ext = path.extname(e.name);\n for (const { ext: extName, pat } of globs) {\n if (ext === extName && (pat.test(rel) || pat.test(e.name))) {\n results.push(full);\n break;\n }\n }\n }\n }\n };\n\n await walk(projectRoot);\n return results;\n}\n\n/** Dispatch to the correct parser based on language. */\nasync function parseFile(\n file: string,\n content: string,\n lang: string,\n): Promise<ReturnType<typeof parseTs>> {\n switch (lang) {\n case 'ts':\n case 'tsx':\n case 'js':\n case 'jsx':\n return parseTs({ file, content, lang: lang as 'ts' | 'tsx' | 'js' | 'jsx' });\n case 'go':\n return parseGo({ file, content, lang: 'go' });\n case 'py':\n return parsePy({ file, content, lang: 'py' });\n case 'rs':\n return parseRs({ file, content, lang: 'rs' });\n case 'json':\n return parseJson({ file, content, lang: 'json' });\n case 'yaml':\n return parseYaml({ file, content, lang: 'yaml' });\n default:\n return { file, lang: lang as 'ts' | 'tsx' | 'js' | 'jsx', symbols: [], mtimeMs: Date.now() };\n }\n}\n\n/** Run a full or incremental index and return statistics. */\nexport async function runIndexer(\n ctx: Context,\n opts: IndexerOptions,\n): Promise<IndexResult> {\n const { projectRoot, force = false, langs, ignore = [] } = opts;\n\n const store = new IndexStore(projectRoot);\n const startMs = Date.now();\n const errors: string[] = [];\n const langStats: Record<string, number> = {};\n let filesIndexed = 0;\n let symbolsIndexed = 0;\n\n let files: string[];\n if (opts.files && opts.files.length > 0) {\n files = opts.files.map((f) => path.resolve(projectRoot, f));\n } else {\n files = await findSourceFiles(projectRoot, ignore);\n }\n\n if (langs && langs.length > 0) {\n const langSet = new Set(langs);\n files = files.filter((f) => {\n const lang = detectLang(f);\n return lang ? langSet.has(lang) : false;\n });\n }\n\n if (force) store.clearAll();\n\n // Collect existing file metadata for incremental check\n const existingMeta: Map<string, FileMeta> = new Map();\n if (!force) {\n for (const meta of store.getAllFileMetas()) existingMeta.set(meta.file, meta);\n }\n\n for (const file of files) {\n let stat: Stats;\n try {\n stat = await fs.stat(file);\n } catch {\n store.deleteFile(file);\n continue;\n }\n if (!stat.isFile()) continue;\n\n const lang = detectLang(file);\n if (!lang) continue;\n\n const meta = existingMeta.get(file);\n if (!force && meta && meta.mtimeMs === Math.floor(stat.mtimeMs)) {\n langStats[lang] = (langStats[lang] ?? 0) + meta.symbolCount;\n symbolsIndexed += meta.symbolCount;\n filesIndexed++;\n continue;\n }\n\n store.deleteSymbolsForFile(file);\n store.deleteRefsForFile(file);\n\n let content: string;\n try {\n content = await fs.readFile(file, 'utf8');\n } catch (e) {\n errors.push(`read error: ${file}: ${e instanceof Error ? e.message : String(e)}`);\n continue;\n }\n\n let parsed: ReturnType<typeof parseTs>;\n try {\n parsed = await parseFile(file, content, lang);\n } catch (e) {\n errors.push(`parse error: ${file}: ${e instanceof Error ? e.message : String(e)}`);\n continue;\n }\n\n if (parsed.symbols.length === 0) {\n store.upsertFile({\n file,\n lang,\n mtimeMs: Math.floor(stat.mtimeMs),\n symbolCount: 0,\n lastIndexed: Date.now(),\n });\n filesIndexed++;\n continue;\n }\n\n const nextId = store.getStats().totalSymbols + 1;\n const symbolsWithIds: IndexSymbol[] = parsed.symbols.map((s, i) => ({ ...s, id: nextId + i }));\n store.insertSymbols(symbolsWithIds, nextId);\n const count = symbolsWithIds.length;\n symbolsIndexed += count;\n langStats[lang] = (langStats[lang] ?? 0) + count;\n\n // Insert cross-references for each symbol\n if (parsed.refs && parsed.refs.length > 0) {\n for (let i = 0; i < symbolsWithIds.length; i++) {\n const sym = symbolsWithIds[i]!;\n const symRefs = parsed.refs.filter((r) => r.line === sym.line);\n if (symRefs.length > 0) {\n const refsWithFromId = symRefs.map((r) => ({ ...r, fromId: sym.id }));\n store.insertRefs(sym.id, refsWithFromId);\n }\n }\n }\n\n store.upsertFile({\n file,\n lang,\n mtimeMs: Math.floor(stat.mtimeMs),\n symbolCount: count,\n lastIndexed: Date.now(),\n });\n\n filesIndexed++;\n }\n\n // Remove stale entries for files deleted since last run\n for (const [file_] of existingMeta) {\n try {\n await fs.stat(file_);\n } catch {\n store.deleteFile(file_);\n }\n }\n\n const durationMs = Date.now() - startMs;\n store.setLastIndexed(Date.now());\n store.close();\n\n return {\n filesIndexed,\n symbolsIndexed,\n langStats,\n durationMs,\n errors,\n };\n}","/**\n * `codebase-index` tool — trigger a full or incremental reindex.\n *\n * Usage: codebase-index({ force?: boolean, langs?: string[] })\n *\n * - `force: true` → clear index and reindex everything from scratch\n * - `langs` → filter to specific languages (e.g. ['ts', 'tsx'])\n *\n * Returns: { filesIndexed, symbolsIndexed, langStats, durationMs, errors }\n */\n\nimport * as path from 'node:path';\nimport type { Tool } from '@wrongstack/core';\nimport { runIndexer } from './indexer.js';\n\nexport const codebaseIndexTool: Tool<CodebaseIndexInput, CodebaseIndexOutput> = {\n name: 'codebase-index',\n category: 'Project',\n description:\n 'Build or update the symbol index for the project. Runs incrementally by default — only re-indexes files that changed since the last run.',\n usageHint:\n 'Call with `force: true` to wipe and rebuild the index from scratch. Use `langs` to limit to specific languages. First call without arguments to do an incremental index.',\n permission: 'auto',\n mutating: true,\n timeoutMs: 120_000,\n inputSchema: {\n type: 'object',\n properties: {\n force: {\n type: 'boolean',\n description: 'Force a full reindex — clears the index first and reindexes all files.',\n },\n langs: {\n type: 'array',\n items: { type: 'string' },\n description: 'Limit reindex to specific languages: ts, tsx, js, jsx, go, py, rs',\n },\n },\n },\n async execute(input, ctx) {\n const result = await runIndexer(ctx, {\n projectRoot: ctx.projectRoot,\n force: input.force ?? false,\n langs: input.langs,\n });\n return result;\n },\n};\n\n// ─── Types for tool I/O ────────────────────────────────────────────────────────\n\ninterface CodebaseIndexInput {\n force?: boolean;\n langs?: string[];\n}\n\ninterface CodebaseIndexOutput {\n filesIndexed: number;\n symbolsIndexed: number;\n langStats: Record<string, number>;\n durationMs: number;\n errors: string[];\n}","/**\n * BM25 ranking implementation — no external dependencies.\n *\n * Algorithm: Okapi BM25 with standard parameters (k1=1.5, b=0.75).\n */\n\nconst K1 = 1.5;\nconst B = 0.75;\n\ninterface Bm25Doc {\n id: number;\n tokens: string[];\n raw: string;\n len: number;\n}\n\n/** Tokenise a string into lowercase word tokens. */\nexport function tokenise(text: string): string[] {\n // Preserve all Unicode letters + digits + $ + '. Split on everything else.\n const sanitised = text.replace(/[^\\p{L}\\p{N}$'_]/gu, ' ').replace(/_/g, ' ');\n return sanitised.toLowerCase().split(' ').filter(Boolean);\n}\n\nexport interface IndexableDoc {\n id: number;\n text: string;\n}\n\n/**\n * Split a camelCase/SnakeCase identifier into its constituent words.\n * e.g. \"complexOperation\" → \"complex Operation\"\n * \"foo_bar_baz\" → \"foo bar baz\"\n * This allows a query for \"complex\" to match \"complexOperation\"\n * via the shared \"complex\" token.\n */\nfunction splitName(name: string): string {\n return name\n .replace(/([a-z])([A-Z])/g, '$1 $2')\n .replace(/[_\\-]+/g, ' ')\n .trim();\n}\n\n/**\n * Build indexable text for BM25 from a symbol's fields.\n * The name is split into camelCase/SnakeCase words so that queries\n * like \"complex\" match \"complexOperation\". The verbatim name is\n * also included for exact-match queries.\n */\nexport function buildIndexableText(name: string, signature: string, docComment: string): string {\n return [splitName(name), name, signature, docComment].filter(Boolean).join(' ');\n}\n\nexport function buildBm25Index(docs: IndexableDoc[]): Bm25Index {\n const documents: Bm25Doc[] = docs.map((d) => {\n const tokens = tokenise(d.text);\n return { id: d.id, tokens, raw: d.text, len: tokens.length };\n });\n\n const df: Record<string, number> = {};\n for (const doc of documents) {\n const seen = new Set<string>();\n for (const t of doc.tokens) {\n if (!seen.has(t)) {\n df[t] = (df[t] ?? 0) + 1;\n seen.add(t);\n }\n }\n }\n\n const N = documents.length;\n const totalLen = documents.reduce((sum, d) => sum + d.len, 0);\n const avgLen = N === 0 ? 0 : totalLen / N;\n\n return new Bm25Index(documents, df, N, avgLen);\n}\n\nexport class Bm25Index {\n private readonly safeAvgLen: number;\n\n constructor(\n private documents: Bm25Doc[],\n private df: Record<string, number>,\n private N: number,\n avgLen: number,\n ) {\n this.safeAvgLen = avgLen === 0 ? 1 : avgLen;\n }\n\n score(query: string, filter?: (id: number) => boolean): Array<{ id: number; score: number }> {\n const qTokens = tokenise(query);\n if (qTokens.length === 0) return [];\n\n const results: Array<{ id: number; score: number }> = [];\n\n for (const doc of this.documents) {\n if (filter && !filter(doc.id)) continue;\n\n let docScore = 0;\n for (const qTerm of qTokens) {\n let tf = 0;\n for (const t of doc.tokens) {\n if (t === qTerm) tf++;\n }\n if (tf === 0) continue;\n\n const dfVal = this.df[qTerm] ?? 0;\n if (dfVal === 0) continue;\n\n const idf = Math.log((this.N - dfVal + 0.5) / (dfVal + 0.5) + 1);\n const lenRatio = B * (doc.len / this.safeAvgLen);\n const tfComponent = (tf * (K1 + 1)) / (tf + K1 * (1 - B + lenRatio));\n\n docScore += idf * tfComponent;\n }\n\n if (docScore > 0) results.push({ id: doc.id, score: docScore });\n }\n\n return results;\n }\n\n getDoc(id: number): Bm25Doc | undefined {\n return this.documents.find((d) => d.id === id);\n }\n\n extractSnippet(docId: number, queryTokens: string[], radius = 40): string {\n const doc = this.getDoc(docId);\n if (!doc) return '';\n\n for (const tok of queryTokens) {\n const idx = doc.raw.toLowerCase().indexOf(tok);\n if (idx !== -1) {\n const start = Math.max(0, idx - radius);\n const end = Math.min(doc.raw.length, idx + tok.length + radius);\n const excerpt = doc.raw.slice(start, end);\n const ellipsis = '\\u2026';\n return (start > 0 ? ellipsis : '') + excerpt + (end < doc.raw.length ? ellipsis : '');\n }\n }\n return doc.raw.slice(0, radius * 2) + (doc.raw.length > radius * 2 ? '\\u2026' : '');\n }\n}\n","/**\n * `codebase-search` tool — search the symbol index with BM25 ranking.\n *\n * Usage: codebase-search({\n * query: string, // search terms\n * kind?: string, // class|function|interface|method|const|...\n * lang?: string, // ts|tsx|js|jsx|go|py|rs\n * file?: string, // filter to a specific file path (substring match)\n * limit?: number, // max results (default 20, max 100)\n * })\n *\n * Returns: [{ name, kind, lang, file, line, signature, snippet, score }, ...]\n */\n\nimport type { Tool } from '@wrongstack/core';\nimport { IndexStore } from './writer.js';\nimport { buildBm25Index, buildIndexableText, tokenise } from './bm25.js';\nimport type { SearchResult, SymbolKind, SymbolLang } from './schema.js';\n\nexport const codebaseSearchTool: Tool<CodebaseSearchInput, CodebaseSearchOutput> = {\n name: 'codebase-search',\n category: 'Project',\n description:\n 'Search indexed code symbols by name, signature, or doc comment. Uses BM25 ranking for relevance.',\n usageHint:\n 'Pass `query` for keyword search. Filter with `kind` (class/function/interface/etc), `lang` (ts/js/etc), `file` (substring). `limit` caps results (default 20).',\n permission: 'auto',\n mutating: false,\n timeoutMs: 10_000,\n inputSchema: {\n type: 'object',\n properties: {\n query: {\n type: 'string',\n description: 'Search query — searches symbol names, signatures, and doc comments',\n },\n kind: {\n type: 'string',\n description: 'Filter by symbol kind: class, function, interface, method, const, let, var, property, type, enum',\n },\n lang: {\n type: 'string',\n description: 'Filter by language: ts, tsx, js, jsx',\n },\n lspKind: {\n type: 'integer',\n description: 'Filter by LSP SymbolKind number (e.g. 5=Class, 12=Function, 11=Interface, 10=Enum)',\n },\n file: {\n type: 'string',\n description: 'Filter to files matching this path substring',\n },\n limit: {\n type: 'integer',\n description: 'Maximum results to return (default 20, max 100)',\n minimum: 1,\n maximum: 100,\n },\n },\n required: ['query'],\n },\n async execute(input, ctx) {\n const store = new IndexStore(ctx.projectRoot);\n try {\n const limit = Math.min(input.limit ?? 20, 100);\n\n // 1. Get initial candidates from SQLite (broad filter)\n const candidates = store.search(input.query, {\n kind: input.kind as SymbolKind | undefined,\n lang: input.lang as SymbolLang | undefined,\n file: input.file,\n lspKind: input.lspKind,\n });\n\n if (candidates.length === 0) {\n return { results: [], total: 0, query: input.query };\n }\n\n // 2. Build BM25 index over candidates\n // Use buildIndexableText to split camelCase names so queries like\n // \"complex\" match \"complexOperation\" (split → \"complex Operation\")\n const indexable = candidates.map((c) => ({\n id: c.id,\n text: buildIndexableText(c.name, c.signature, c.docComment),\n }));\n const bm25 = buildBm25Index(indexable);\n\n // 3. Score and rank\n const scored = bm25.score(input.query, (id) => candidates.some((c) => c.id === id));\n\n // 4. Sort descending by score and take top N\n scored.sort((a, b) => b.score - a.score);\n const top = scored.slice(0, limit);\n\n const qTokens = tokenise(input.query);\n\n const results: SearchResult[] = top.map(({ id, score }) => {\n const c = candidates.find((c) => c.id === id)!;\n const snippet = bm25.extractSnippet(id, qTokens);\n return {\n ...c,\n score,\n snippet,\n };\n });\n\n return {\n results,\n total: candidates.length,\n query: input.query,\n };\n } finally {\n store.close();\n }\n },\n};\n\n// ─── Types ─────────────────────────────────────────────────────────────────────\n\ninterface CodebaseSearchInput {\n query: string;\n kind?: string;\n lang?: string;\n file?: string;\n limit?: number;\n lspKind?: number;\n}\n\ninterface CodebaseSearchOutput {\n results: SearchResult[];\n total: number; // total candidates before limit\n query: string;\n}\n","/**\n * `codebase-stats` tool — report index health and statistics.\n *\n * Usage: codebase-stats({})\n *\n * Returns: { totalSymbols, totalFiles, byLang, byKind, lastIndexed, sizeBytes, version }\n */\n\nimport type { Tool } from '@wrongstack/core';\nimport { IndexStore } from './writer.js';\n\nexport const codebaseStatsTool: Tool<Record<string, never>, CodebaseStatsOutput> = {\n name: 'codebase-stats',\n category: 'Project',\n description: 'Return statistics about the symbol index: total symbols, files, breakdown by language and kind, index size, and last update time.',\n usageHint: 'No arguments needed. Use to check if the index is stale or healthy before running a search.',\n permission: 'auto',\n mutating: false,\n timeoutMs: 5_000,\n inputSchema: {\n type: 'object',\n properties: {},\n additionalProperties: false,\n },\n async execute(_input, ctx) {\n const store = new IndexStore(ctx.projectRoot);\n try {\n const stats = store.getStats();\n return {\n totalSymbols: stats.totalSymbols,\n totalFiles: stats.totalFiles,\n byLang: stats.byLang,\n byKind: stats.byKind,\n lastIndexed: stats.lastIndexed,\n sizeBytes: stats.sizeBytes,\n indexPath: stats.indexPath,\n version: stats.version,\n };\n } finally {\n store.close();\n }\n },\n};\n\ninterface CodebaseStatsOutput {\n totalSymbols: number;\n totalFiles: number;\n byLang: Record<string, number>;\n byKind: Record<string, number>;\n lastIndexed: number | null;\n sizeBytes: number;\n indexPath: string;\n version: number;\n}"]}
1
+ {"version":3,"sources":["../../src/codebase-index/schema.ts","../../src/codebase-index/lsp-kind.ts","../../src/codebase-index/writer.ts","../../src/codebase-index/ts-parser.ts","../../src/codebase-index/go-parser.ts","../../src/codebase-index/py-parser.ts","../../src/codebase-index/rs-parser.ts","../../src/codebase-index/json-parser.ts","../../src/codebase-index/yaml-parser.ts","../../src/codebase-index/indexer.ts","../../src/codebase-index/codebase-index-tool.ts","../../src/codebase-index/bm25.ts","../../src/codebase-index/codebase-search-tool.ts","../../src/codebase-index/codebase-stats-tool.ts"],"names":["path","ts","parseSymbols","path2","mkdirSync","path3","os2","writeFileSync","execFileSync","regexParse","basename","path5","makeSymbol","path6","stat","c"],"mappings":"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","file":"index.js","sourcesContent":["// ─── Symbol kind taxonomy ───────────────────────────────────────────────────────\n\n/** Language a symbol belongs to. */\nexport type SymbolLang = 'ts' | 'js' | 'tsx' | 'jsx' | 'go' | 'py' | 'rs' | 'json' | 'yaml';\n\n/** What kind of symbol this is. */\nexport type SymbolKind =\n | 'class'\n | 'interface'\n | 'enum'\n | 'type'\n | 'function'\n | 'method'\n | 'var'\n | 'const'\n | 'let'\n | 'property'\n | 'parameter'\n | 'namespace'\n | 'object' // JSON root object\n | 'literal' // scalar value in JSON/YAML\n | 'schema' // JSON Schema $ref/$schema entry\n // Rust-specific\n | 'struct'\n | 'trait'\n | 'impl'\n | 'static'\n | 'mod';\n\n/** A single indexed code symbol. */\nexport interface Symbol {\n id: number;\n lang: SymbolLang;\n kind: SymbolKind;\n name: string;\n file: string; // absolute path\n line: number; // 1-based\n col: number; // 0-based\n signature: string; // e.g. \"function foo(a: string): Promise<void>\"\n docComment: string; // JSDoc / docstring first line\n scope: string; // e.g. \"MyClass.method\" or module-level \"\"\n text: string; // concatenated searchable text: name + signature + docComment\n}\n\n/** Extracted symbols and cross-references for one file. */\nexport interface FileSymbols {\n file: string;\n lang: SymbolLang;\n symbols: Symbol[];\n refs?: Ref[]; // cross-references extracted from this file (optional for back-compat)\n mtimeMs: number;\n}\n\n/** Source file metadata tracked for incremental indexing. */\nexport interface FileMeta {\n file: string;\n lang: SymbolLang;\n mtimeMs: number;\n symbolCount: number;\n lastIndexed: number; // unix ms\n}\n\n/** Statistics about the index. */\nexport interface IndexStats {\n totalSymbols: number;\n totalFiles: number;\n byLang: Record<SymbolLang, number>;\n byKind: Record<SymbolKind, number>;\n indexPath: string;\n lastIndexed: number | null;\n sizeBytes: number;\n version: number;\n}\n\n/** Result of a search query. */\nexport interface SearchResult {\n id: number;\n name: string;\n kind: SymbolKind;\n lang: SymbolLang;\n file: string;\n line: number;\n col: number;\n signature: string;\n docComment: string;\n score: number;\n snippet: string;\n /** Original LSP SymbolKind number if the result was filtered by an LSP kind. */\n lspKind?: number;\n}\n\n/** Result of a full reindex. */\nexport interface IndexResult {\n filesIndexed: number;\n symbolsIndexed: number;\n langStats: Record<SymbolLang, number>;\n durationMs: number;\n errors: string[];\n}\n\n// ─── Cross-reference types ───────────────────────────────────────────────────\n\n/** What kind of reference this is. */\nexport type CallType = 'call' | 'type_ref' | 'inherit' | 'implement' | 'import';\n\n/** A cross-reference between two symbols (who references whom). */\nexport interface Ref {\n id?: number;\n fromId: number; // symbol that makes the reference\n toName: string; // resolved name of the referenced symbol\n toId?: number; // resolved target symbol id (filled after index resolution)\n callType: CallType; // kind of reference\n line: number; // source line where the reference occurs\n}\n\n// ─── Schema version ───────────────────────────────────────────────────────────\n\nexport const SCHEMA_VERSION = 1;","/**\n * LSP SymbolKind mapping utilities.\n *\n * LSP SymbolKind numbers are defined by vscode-languageserver-protocol.\n * This module maps between LSP kind numbers and the internal SymbolKind taxonomy.\n */\n\nimport type { SymbolKind } from './schema.js';\n\n/**\n * LSP SymbolKind values (1–26) as defined by vscode-languageserver-protocol.\n */\nexport enum LSPSymbolKind {\n File = 1,\n Module = 2,\n Namespace = 3,\n Package = 4,\n Class = 5,\n Method = 6,\n Property = 7,\n Field = 8,\n Constructor = 9,\n Enum = 10,\n Interface = 11,\n Function = 12,\n Variable = 13,\n Constant = 14,\n String = 15,\n Number = 16,\n Boolean = 17,\n Array = 18,\n Object = 19,\n Key = 20,\n Null = 21,\n EnumMember = 22,\n Struct = 23,\n Event = 24,\n Operator = 25,\n TypeParameter = 26,\n}\n\n/**\n * Maps an LSP kind number to the corresponding internal SymbolKind.\n * Returns null if the LSP kind has no equivalent in the internal taxonomy.\n */\nexport function lspKindToInternalKind(k: number): SymbolKind | null {\n switch (k) {\n case LSPSymbolKind.Class: return 'class';\n case LSPSymbolKind.Method: return 'method';\n case LSPSymbolKind.Property:\n case LSPSymbolKind.Field: return 'property';\n case LSPSymbolKind.Constructor: return 'class';\n case LSPSymbolKind.Enum: return 'enum';\n case LSPSymbolKind.Interface: return 'interface';\n case LSPSymbolKind.Function: return 'function';\n case LSPSymbolKind.Variable: return 'var';\n case LSPSymbolKind.Constant: return 'const';\n case LSPSymbolKind.EnumMember: return 'enum';\n case LSPSymbolKind.TypeParameter:return 'type';\n case LSPSymbolKind.Namespace: return 'namespace';\n default: return null;\n }\n}\n\n/**\n * Maps an internal SymbolKind to the corresponding LSP kind number.\n * Returns null if the internal kind has no equivalent LSP kind.\n */\nexport function internalKindToLspKind(k: SymbolKind): number | null {\n switch (k) {\n case 'class': return LSPSymbolKind.Class;\n case 'method': return LSPSymbolKind.Method;\n case 'property': return LSPSymbolKind.Property;\n case 'function': return LSPSymbolKind.Function;\n case 'var': return LSPSymbolKind.Variable;\n case 'const': return LSPSymbolKind.Constant;\n case 'let': return LSPSymbolKind.Variable;\n case 'enum': return LSPSymbolKind.Enum;\n case 'interface': return LSPSymbolKind.Interface;\n case 'namespace': return LSPSymbolKind.Namespace;\n case 'type': return LSPSymbolKind.TypeParameter;\n // parameter and other internal-only kinds have no LSP equivalent\n default: return null;\n }\n}\n\n/**\n * Returns true if `k` is a valid LSP SymbolKind number (1–26).\n */\nexport function isLspKind(k: number): boolean {\n return Number.isInteger(k) && k >= 1 && k <= 26;\n}\n","/**\n * SQLite storage layer for the codebase index.\n *\n * Uses `node:sqlite` (synchronous API — DatabaseSync class).\n * Database file: {projectRoot}/.codebase-index/index.db\n */\n\nimport { createRequire } from 'node:module';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport type { DatabaseSync } from 'node:sqlite';\nimport type { FileMeta, IndexStats, Ref, SearchResult, Symbol as IndexSymbol, SymbolKind, SymbolLang } from './schema.js';\nimport { SCHEMA_VERSION } from './schema.js';\nimport { lspKindToInternalKind } from './lsp-kind.js';\n\nconst INDEX_DIR = '.codebase-index';\nconst DB_FILE = 'index.db';\n\nlet warningSilenced = false;\n/**\n * Swallow the one-time `ExperimentalWarning: SQLite ...` Node prints the first\n * time `node:sqlite` loads. Patched only once, and only filters that specific\n * warning — every other warning passes through untouched.\n */\nfunction silenceSqliteExperimentalWarning(): void {\n if (warningSilenced) return;\n warningSilenced = true;\n const original = process.emitWarning.bind(process);\n process.emitWarning = ((warning: unknown, ...rest: unknown[]): void => {\n const msg = typeof warning === 'string' ? warning : ((warning as Error)?.message ?? '');\n const name = typeof warning === 'string' ? String(rest[0] ?? '') : ((warning as Error)?.name ?? '');\n if (/sqlite/i.test(msg) && /experimental/i.test(`${name} ${msg}`)) return;\n (original as (w: unknown, ...r: unknown[]) => void)(warning, ...rest);\n }) as typeof process.emitWarning;\n}\n\nlet DatabaseSyncCtor: typeof DatabaseSync | undefined;\n/**\n * Load `node:sqlite`'s `DatabaseSync` lazily. Keeping this off the module's\n * top-level import means the codebase-index tools can be registered at CLI boot\n * without eagerly loading SQLite — so a runtime that lacks `node:sqlite` (it is\n * experimental, available since Node 22.5) only fails if the index is actually\n * used, with a clear message instead of a crash on import.\n */\nfunction loadDatabaseSync(): typeof DatabaseSync {\n if (DatabaseSyncCtor) return DatabaseSyncCtor;\n silenceSqliteExperimentalWarning();\n try {\n const req = createRequire(import.meta.url);\n DatabaseSyncCtor = (req('node:sqlite') as typeof import('node:sqlite')).DatabaseSync;\n } catch (err) {\n throw new Error(\n \"The codebase index needs Node's built-in SQLite (node:sqlite), available since Node 22.5. \" +\n `This runtime doesn't provide it: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n return DatabaseSyncCtor;\n}\n\nexport class IndexStore {\n private db: DatabaseSync;\n\n constructor(private projectRoot: string) {\n const dir = path.join(projectRoot, INDEX_DIR);\n fs.mkdirSync(dir, { recursive: true });\n const Database = loadDatabaseSync();\n this.db = new Database(path.join(dir, DB_FILE));\n this.initSchema();\n }\n\n private initSchema(): void {\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS metadata (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL\n );\n CREATE TABLE IF NOT EXISTS files (\n file TEXT PRIMARY KEY,\n lang TEXT NOT NULL,\n mtime_ms INTEGER NOT NULL,\n symbol_count INTEGER NOT NULL DEFAULT 0,\n last_indexed INTEGER NOT NULL\n );\n CREATE TABLE IF NOT EXISTS symbols (\n id INTEGER PRIMARY KEY,\n lang TEXT NOT NULL,\n kind TEXT NOT NULL,\n name TEXT NOT NULL,\n file TEXT NOT NULL,\n line INTEGER NOT NULL,\n col INTEGER NOT NULL,\n signature TEXT NOT NULL DEFAULT '',\n doc_comment TEXT NOT NULL DEFAULT '',\n scope TEXT NOT NULL DEFAULT '',\n text TEXT NOT NULL DEFAULT '',\n file_fk TEXT NOT NULL\n );\n `);\n\n this.db.exec('CREATE INDEX IF NOT EXISTS idx_s_name ON symbols(name)');\n this.db.exec('CREATE INDEX IF NOT EXISTS idx_s_kind ON symbols(kind)');\n this.db.exec('CREATE INDEX IF NOT EXISTS idx_s_lang ON symbols(lang)');\n this.db.exec('CREATE INDEX IF NOT EXISTS idx_s_file ON symbols(file)');\n\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS refs (\n id INTEGER PRIMARY KEY,\n from_id INTEGER NOT NULL,\n to_name TEXT NOT NULL,\n to_id INTEGER,\n call_type TEXT NOT NULL,\n line INTEGER NOT NULL\n );\n `);\n\n this.db.exec('CREATE INDEX IF NOT EXISTS idx_r_from ON refs(from_id)');\n this.db.exec('CREATE INDEX IF NOT EXISTS idx_r_to_id ON refs(to_id)');\n this.db.exec('CREATE INDEX IF NOT EXISTS idx_r_to_name ON refs(to_name)');\n this.db.exec('CREATE INDEX IF NOT EXISTS idx_r_call_type ON refs(call_type)');\n\n const versionRows = this.db.prepare('SELECT value FROM metadata WHERE key = ?').all('version');\n if (!versionRows.length) {\n this.db.prepare('INSERT INTO metadata(key, value) VALUES (?, ?)').run('version', String(SCHEMA_VERSION));\n }\n }\n\n // ─── Symbol CRUD ─────────────────────────────────────────────────────────────\n\n insertSymbols(symbols: IndexSymbol[], nextId: number): number {\n const stmt = this.db.prepare(\n `INSERT INTO symbols(id, lang, kind, name, file, line, col, signature, doc_comment, scope, text, file_fk)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n );\n\n let id = nextId;\n for (const s of symbols) {\n stmt.run(\n id++,\n s.lang,\n s.kind,\n s.name,\n s.file,\n s.line,\n s.col,\n s.signature,\n s.docComment,\n s.scope,\n s.text,\n s.file,\n );\n }\n return id;\n }\n\n deleteSymbolsForFile(file: string): void {\n this.db.prepare('DELETE FROM symbols WHERE file_fk = ?').run(file);\n }\n\n deleteFile(file: string): void {\n this.db.prepare('DELETE FROM files WHERE file = ?').run(file);\n }\n\n // ─── File metadata ──────────────────────────────────────────────────────────\n\n upsertFile(meta: FileMeta): void {\n this.db.prepare(\n `INSERT INTO files(file, lang, mtime_ms, symbol_count, last_indexed)\n VALUES (?, ?, ?, ?, ?)\n ON CONFLICT(file) DO UPDATE SET\n lang = excluded.lang,\n mtime_ms = excluded.mtime_ms,\n symbol_count = excluded.symbol_count,\n last_indexed = excluded.last_indexed`,\n ).run(meta.file, meta.lang, meta.mtimeMs, meta.symbolCount, meta.lastIndexed);\n }\n\n getFileMeta(file: string): FileMeta | null {\n const rows = this.db.prepare(\n 'SELECT file, lang, mtime_ms, symbol_count, last_indexed FROM files WHERE file = ?',\n ).all(file) as { file: string; lang: string; mtime_ms: number; symbol_count: number; last_indexed: number }[];\n if (!rows.length) return null;\n const r = rows[0]!;\n return { file: r.file, lang: r.lang as SymbolLang, mtimeMs: r.mtime_ms, symbolCount: r.symbol_count, lastIndexed: r.last_indexed };\n }\n\n getAllFileMetas(): FileMeta[] {\n return (this.db.prepare(\n 'SELECT file, lang, mtime_ms, symbol_count, last_indexed FROM files',\n ).all() as { file: string; lang: string; mtime_ms: number; symbol_count: number; last_indexed: number }[]).map(\n (r) => ({ file: r.file, lang: r.lang as SymbolLang, mtimeMs: r.mtime_ms, symbolCount: r.symbol_count, lastIndexed: r.last_indexed }),\n );\n }\n\n // ─── Search ──────────────────────────────────────────────────────────────────\n\n search(\n query: string,\n filter?: { kind?: SymbolKind; lang?: SymbolLang; file?: string; lspKind?: number },\n ): SearchResult[] {\n const conditions: string[] = [];\n const values: unknown[] = [];\n\n let effectiveKind: SymbolKind | undefined = filter?.kind;\n if (filter?.lspKind !== undefined) {\n const mapped = lspKindToInternalKind(filter.lspKind);\n if (mapped !== null) {\n effectiveKind = mapped;\n } else {\n // LSP kind was explicitly provided but has no internal mapping → no results\n return [];\n }\n }\n\n if (effectiveKind) {\n conditions.push('kind = ?');\n values.push(effectiveKind);\n }\n if (filter?.lang) {\n conditions.push('lang = ?');\n values.push(filter.lang);\n }\n if (filter?.file) {\n conditions.push('file LIKE ?');\n values.push(`%${filter.file}%`);\n }\n if (query.trim()) {\n const tokens = query.toLowerCase().split(/\\s+/).filter(Boolean);\n const tokenConds = tokens.map(() => 'text LIKE ?');\n conditions.push(`(${tokenConds.join(' OR ')})`);\n for (const t of tokens) values.push(`%${t}%`);\n }\n\n const where = conditions.length ? `WHERE ${conditions.join(' AND ')}` : '';\n const sql = `SELECT id, lang, kind, name, file, line, col, signature, doc_comment, text FROM symbols ${where}`;\n\n const stmt = this.db.prepare(sql);\n const rows = stmt.all(...values as (string | number)[]) as {\n id: number; lang: string; kind: string; name: string; file: string;\n line: number; col: number; signature: string; doc_comment: string; text: string;\n }[];\n\n return rows.map((r) => ({\n id: r.id,\n lang: r.lang as SymbolLang,\n kind: r.kind as SymbolKind,\n name: r.name,\n file: r.file,\n line: r.line,\n col: r.col,\n signature: r.signature,\n docComment: r.doc_comment,\n score: 0,\n snippet: '',\n lspKind: filter?.lspKind,\n }));\n }\n\n getAllIndexable(): Array<{ id: number; text: string }> {\n return (this.db.prepare('SELECT id, text FROM symbols').all() as { id: number; text: string }[]).map(\n ({ id, text }) => ({ id, text }),\n );\n }\n\n // ─── Stats ───────────────────────────────────────────────────────────────────\n\n getStats(): IndexStats {\n const sizeBytes = this.sizeBytes();\n\n const lastRows = this.db.prepare(\n \"SELECT value FROM metadata WHERE key = 'last_indexed'\",\n ).all() as { value: string }[];\n const lastIndexed = lastRows.length ? Number(lastRows[0]!.value) : null;\n\n const totalRows = this.db.prepare('SELECT COUNT(*) FROM symbols').all() as { 'COUNT(*)': number }[];\n const totalSymbols = totalRows[0] ? Number(totalRows[0]['COUNT(*)']) : 0;\n\n const fileRows = this.db.prepare('SELECT COUNT(*) FROM files').all() as { 'COUNT(*)': number }[];\n const totalFiles = fileRows[0] ? Number(fileRows[0]['COUNT(*)']) : 0;\n\n const langRows = this.db.prepare(\n 'SELECT lang, COUNT(*) FROM symbols GROUP BY lang',\n ).all() as { lang: string; 'COUNT(*)': number }[];\n const byLang = {} as Record<SymbolLang, number>;\n for (const row of langRows) byLang[row.lang as SymbolLang] = Number(row['COUNT(*)']);\n\n const kindRows = this.db.prepare(\n 'SELECT kind, COUNT(*) FROM symbols GROUP BY kind',\n ).all() as { kind: string; 'COUNT(*)': number }[];\n const byKind = {} as Record<SymbolKind, number>;\n for (const row of kindRows) byKind[row.kind as SymbolKind] = Number(row['COUNT(*)']);\n\n return {\n totalSymbols,\n totalFiles,\n byLang,\n byKind,\n indexPath: path.join(this.projectRoot, INDEX_DIR),\n lastIndexed,\n sizeBytes,\n version: SCHEMA_VERSION,\n };\n }\n\n setLastIndexed(ts: number): void {\n this.db.prepare(\n \"INSERT OR REPLACE INTO metadata(key, value) VALUES('last_indexed', ?)\",\n ).run(String(ts));\n }\n\n clearAll(): void {\n this.db.exec('DELETE FROM symbols');\n this.db.exec('DELETE FROM files');\n this.db.exec('DELETE FROM refs');\n }\n\n // ─── Ref CRUD ────────────────────────────────────────────────────────────────\n\n /**\n * Insert cross-references for a given source symbol id.\n * Replaces any existing refs from the same source (idempotent on re-index).\n */\n insertRefs(fromId: number, refs: Ref[]): void {\n // Delete old refs from this symbol (handles re-index)\n this.db.prepare('DELETE FROM refs WHERE from_id = ?').run(fromId);\n if (refs.length === 0) return;\n\n const stmt = this.db.prepare(\n `INSERT INTO refs(from_id, to_name, to_id, call_type, line)\n VALUES (?, ?, ?, ?, ?)`,\n );\n for (const ref of refs) {\n stmt.run(fromId, ref.toName, ref.toId ?? null, ref.callType, ref.line);\n }\n }\n\n /**\n * Delete all refs whose source symbols are in a given file.\n * Used when re-indexing a file to clear stale refs.\n */\n deleteRefsForFile(file: string): void {\n const ids = this.db.prepare(\n 'SELECT id FROM symbols WHERE file = ?',\n ).all(file) as { id: number }[];\n if (!ids.length) return;\n const placeholders = ids.map(() => '?').join(',');\n this.db.prepare(`DELETE FROM refs WHERE from_id IN (${placeholders})`).run(...ids.map((r) => r.id));\n }\n\n /**\n * Resolve `to_name` → `to_id` for all refs that have a name but no id.\n * Call this after all symbols have been inserted to fill in cross-references.\n */\n resolveRefs(): number {\n const unresolved = this.db.prepare(\n 'SELECT id, to_name FROM refs WHERE to_id IS NULL AND to_name IS NOT NULL',\n ).all() as { id: number; to_name: string }[];\n\n let resolved = 0;\n for (const row of unresolved) {\n const target = this.db.prepare('SELECT id FROM symbols WHERE name = ? LIMIT 1').all(row.to_name) as { id: number }[];\n if (target.length) {\n this.db.prepare('UPDATE refs SET to_id = ? WHERE id = ?').run(target[0]!.id, row.id);\n resolved++;\n }\n }\n return resolved;\n }\n\n /**\n * Find all references TO a given symbol (who calls / uses this symbol?).\n */\n findRefsTo(symbolId: number): Ref[] {\n return (this.db.prepare(\n 'SELECT id, from_id, to_name, to_id, call_type, line FROM refs WHERE to_id = ? OR to_name = (SELECT name FROM symbols WHERE id = ?)',\n ).all(symbolId, symbolId) as { id: number; from_id: number; to_name: string; to_id: number | null; call_type: string; line: number }[]).map((r) => ({\n id: r.id, fromId: r.from_id, toName: r.to_name, toId: r.to_id ?? undefined, callType: r.call_type as Ref['callType'], line: r.line,\n }));\n }\n\n /**\n * Find all references FROM a given symbol (what does this symbol call/use?).\n */\n findRefsFrom(symbolId: number): Ref[] {\n return (this.db.prepare(\n 'SELECT id, from_id, to_name, to_id, call_type, line FROM refs WHERE from_id = ?',\n ).all(symbolId) as { id: number; from_id: number; to_name: string; to_id: number | null; call_type: string; line: number }[]).map((r) => ({\n id: r.id, fromId: r.from_id, toName: r.to_name, toId: r.to_id ?? undefined, callType: r.call_type as Ref['callType'], line: r.line,\n }));\n }\n\n private sizeBytes(): number {\n const dbPath = path.join(this.projectRoot, INDEX_DIR, DB_FILE);\n try {\n return fs.statSync(dbPath).size;\n } catch {\n return 0;\n }\n }\n\n close(): void {\n try { this.db.close(); } catch { /* already closed */ }\n }\n}","/**\n * TypeScript/JavaScript symbol extraction using the TypeScript Compiler API.\n *\n * We traverse the AST and collect:\n * - classes, interfaces, enums, type aliases → class|interface|enum|type\n * - functions and methods → function|method\n * - const/let/var declarations → const|let|var\n * - property/accessor declarations → property\n *\n * The `id` field on each Symbol is always 0 — the caller is responsible for\n * assigning unique ids during insertion.\n */\n\nimport * as ts from 'typescript';\nimport type { CallType, FileSymbols, Ref, Symbol as IndexSymbol, SymbolKind, SymbolLang } from './schema.js';\n\n// Map TypeScript SyntaxKind → our SymbolKind taxonomy\nconst KIND_MAP: Partial<Record<ts.SyntaxKind, SymbolKind>> = {\n [ts.SyntaxKind.ClassDeclaration]: 'class',\n [ts.SyntaxKind.InterfaceDeclaration]: 'interface',\n [ts.SyntaxKind.EnumDeclaration]: 'enum',\n [ts.SyntaxKind.TypeAliasDeclaration]: 'type',\n [ts.SyntaxKind.FunctionDeclaration]: 'function',\n [ts.SyntaxKind.MethodDeclaration]: 'method',\n [ts.SyntaxKind.GetAccessor]: 'property',\n [ts.SyntaxKind.SetAccessor]: 'property',\n [ts.SyntaxKind.PropertyDeclaration]: 'property',\n [ts.SyntaxKind.Parameter]: 'parameter',\n [ts.SyntaxKind.NamespaceExportDeclaration]: 'namespace',\n};\n\nfunction kindOf(node: ts.Node): SymbolKind | null {\n // VariableDeclaration needs special handling — its parent tells us whether\n // it's `const`, `let`, or `var`.\n if (ts.isVariableDeclaration(node)) {\n const parent = node.parent;\n if (ts.isVariableDeclarationList(parent)) {\n const flags = parent.flags;\n if (flags & ts.NodeFlags.Let) return 'let';\n if (flags & ts.NodeFlags.Const) return 'const';\n return 'var';\n }\n }\n\n // Namespace (module) declaration\n if (ts.isModuleDeclaration(node)) return 'namespace';\n\n return KIND_MAP[node.kind] ?? null;\n}\n\nfunction extToLang(ext: string): SymbolLang | null {\n switch (ext) {\n case '.ts': return 'ts';\n case '.tsx': return 'tsx';\n case '.js': return 'js';\n case '.jsx': return 'jsx';\n case '.go': return 'go';\n case '.py': return 'py';\n case '.rs': return 'rs';\n case '.json': return 'json';\n case '.yaml': return 'yaml';\n case '.yml': return 'yaml';\n default: return null;\n }\n}\n\nfunction getSignature(node: ts.Declaration, sourceFile: ts.SourceFile): string {\n const printer = ts.createPrinter({});\n const raw = printer.printNode(ts.EmitHint.Unspecified, node, sourceFile);\n return raw.replace(/\\s+/g, ' ').slice(0, 500);\n}\n\n/**\n * Extract the first line of a JSDoc comment preceding a node.\n * Uses `ts.getLeadingCommentRanges` which is the modern replacement for\n * the removed `ts.getJSDocComments`.\n */\nfunction getJsDoc(node: ts.Node, sourceFile: ts.SourceFile): string {\n const fullText = sourceFile.getFullText();\n const nodePos = node.getFullWidth();\n const comments = ts.getLeadingCommentRanges(fullText, nodePos);\n if (!comments) return '';\n\n for (const range of comments) {\n const commentText = fullText.slice(range.pos, range.end);\n // Only process JSDoc comments (/** ... */)\n const trimmed = commentText.trim();\n if (trimmed.startsWith('/**') && trimmed.endsWith('*/')) {\n // Strip the /** and */ delimiters and leading * on each line\n const inner = trimmed\n .slice(3, -2) // remove /** and */\n .replace(/^[ \\t]*\\*[ ]?/gm, '') // remove leading \" * \" or \" *\" on each line\n .trim();\n return inner.split('\\n')[0]?.trim().slice(0, 200) ?? '';\n }\n }\n return '';\n}\n\n/** Build the scope path from a node up to the root (for class-method scope). */\nfunction buildScope(node: ts.Node): string {\n const parts: string[] = [];\n let current: ts.Node | undefined = node.parent;\n while (current) {\n if (\n ts.isClassDeclaration(current) ||\n ts.isInterfaceDeclaration(current) ||\n ts.isEnumDeclaration(current) ||\n ts.isTypeAliasDeclaration(current)\n ) {\n parts.unshift(current.name?.text ?? 'Anon');\n } else if (\n ts.isMethodDeclaration(current) ||\n ts.isGetAccessor(current) ||\n ts.isSetAccessor(current) ||\n ts.isPropertyDeclaration(current) ||\n ts.isFunctionDeclaration(current)\n ) {\n if (current.name && ts.isIdentifier(current.name)) {\n parts.unshift(current.name.text);\n }\n }\n current = current.parent;\n }\n return parts.join('.');\n}\n\nexport interface ParseOptions {\n file: string;\n content: string;\n lang: SymbolLang;\n}\n\n/**\n * Parse a TypeScript/JavaScript source file and extract all code symbols.\n *\n * The returned `Symbol.id` field is always `0` — the caller is responsible\n * for assigning unique numeric ids during bulk insertion.\n *\n * Returns an empty array for files that can't be parsed or contain no symbols.\n */\nexport function parseSymbols(opts: ParseOptions): FileSymbols {\n const { file, content, lang } = opts;\n\n let sourceFile: ts.SourceFile;\n try {\n sourceFile = ts.createSourceFile(file, content, ts.ScriptTarget.Latest, true);\n } catch {\n return { file, lang, symbols: [], mtimeMs: Date.now() };\n }\n\n const symbols: IndexSymbol[] = [];\n\n function visit(node: ts.Node): void {\n const kind = kindOf(node);\n\n if (kind) {\n const nameNode = (node as { name?: ts.Identifier }).name;\n if (!nameNode || !ts.isIdentifier(nameNode)) return;\n const name = nameNode.text;\n const pos = nameNode.getStart(sourceFile);\n const { line, character } = sourceFile.getLineAndCharacterOfPosition(pos);\n const scope = buildScope(node);\n const signature = getSignature(node as ts.Declaration, sourceFile);\n const docComment = getJsDoc(node, sourceFile);\n const text = [name, signature, docComment].filter(Boolean).join(' | ');\n\n symbols.push({\n id: 0,\n lang,\n kind,\n name,\n file,\n line: line + 1,\n col: character,\n signature,\n docComment,\n scope,\n text,\n });\n }\n\n ts.forEachChild(node, visit);\n }\n\n visit(sourceFile);\n\n // Second pass: collect cross-references (call/type/inherit refs)\n const refs = extractRefs(sourceFile);\n\n return { file, lang, symbols, refs, mtimeMs: Date.now() };\n}\n\n// ─── Reference extraction ──────────────────────────────────────────────────────\n\n/** Collect call/type/inherit references from a source file. */\nfunction extractRefs(sourceFile: ts.SourceFile): Ref[] {\n const refs: Ref[] = [];\n\n function visit(node: ts.Node): void {\n const pos = node.getStart(sourceFile);\n const { line } = sourceFile.getLineAndCharacterOfPosition(pos);\n const lineNum = line + 1;\n\n if (ts.isCallExpression(node)) {\n const expr = node.expression;\n if (ts.isIdentifier(expr)) {\n refs.push({ fromId: 0, toName: expr.text, callType: 'call', line: lineNum });\n }\n } else if (ts.isPropertyAccessExpression(node)) {\n if (ts.isIdentifier(node.expression)) {\n refs.push({ fromId: 0, toName: node.expression.text, callType: 'call', line: lineNum });\n }\n } else if (ts.isTypeReferenceNode(node)) {\n const name = getTypeName(node.typeName);\n if (name) refs.push({ fromId: 0, toName: name, callType: 'type_ref', line: lineNum });\n } else if (ts.isHeritageClause(node)) {\n for (const t of node.types) {\n const name = getTypeName(t.expression as ts.EntityName);\n if (name) refs.push({ fromId: 0, toName: name, callType: node.token === ts.SyntaxKind.ExtendsKeyword ? 'inherit' : 'implement', line: lineNum });\n }\n } else if (ts.isImportDeclaration(node)) {\n const moduleName = getModuleName(node);\n if (moduleName) refs.push({ fromId: 0, toName: moduleName, callType: 'import', line: lineNum });\n }\n\n ts.forEachChild(node, visit);\n }\n\n visit(sourceFile);\n return deduplicateRefs(refs);\n}\n\n/** Extract the name string from a type name node (simple or qualified). */\nfunction getTypeName(name: ts.EntityName): string {\n if (ts.isIdentifier(name)) return name.text;\n if (ts.isQualifiedName(name)) return `${getTypeName(name.left)}.${name.right.text}`;\n return '';\n}\n\n/** Get the module path string from an import declaration. */\nfunction getModuleName(node: ts.ImportDeclaration): string {\n const moduleSpecifier = node.moduleSpecifier;\n if (ts.isStringLiteral(moduleSpecifier)) return moduleSpecifier.text;\n return '';\n}\n\n/** Remove duplicate refs (same toName, callType, line). fromId is always 0 at this stage. */\nfunction deduplicateRefs(refs: Ref[]): Ref[] {\n const seen = new Set<string>();\n return refs.filter((r) => {\n const key = `${r.toName}:${r.callType}:${r.line}`;\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n}\n\n/** Detect SymbolLang from a file path extension. */\nexport function detectLang(file: string): SymbolLang | null {\n const idx = file.lastIndexOf('.');\n if (idx < 0) return null;\n return extToLang(file.slice(idx));\n}","/**\n * Go source symbol extraction using `go/parser`.\n *\n * Spawns a `go run -` child process that parses the file with go/ast and\n * emits JSON. Falls back to empty results on any error.\n *\n * Extracts: package, func, type, const, var\n */\n\nimport { execFileSync } from 'node:child_process';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport { mkdirSync, writeFileSync } from 'node:fs';\nimport type { FileSymbols, Symbol as IndexSymbol, SymbolLang } from './schema.js';\nimport { detectLang } from './ts-parser.js';\n\n// ─── Public API ─────────────────────────────────────────────────────────────\n\nexport function parseSymbols(opts: { file: string; content: string; lang: SymbolLang }): FileSymbols {\n const { file, content, lang } = opts;\n\n try {\n return syncGoParse(file, content, lang);\n } catch {\n return { file, lang, symbols: [], mtimeMs: Date.now() };\n }\n}\n\nexport { detectLang } from './ts-parser.js';\n\n// ─── Inline Go parser script ────────────────────────────────────────────────\n\nconst GO_PARSE_SCRIPT = `\npackage main\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"go/ast\"\n\t\"go/parser\"\n\t\"go/token\"\n\t\"io\"\n\t\"os\"\n\t\"strings\"\n)\n\ntype Sym struct {\n\tName string \\`json:\"name\"\\`\n\tKind string \\`json:\"kind\"\\`\n\tLine int \\`json:\"line\"\\`\n\tCol int \\`json:\"col\"\\`\n\tSignature string \\`json:\"signature\"\\`\n\tScope string \\`json:\"scope\"\\`\n}\n\nfunc main() {\n\tsrc, err := io.ReadAll(os.Stdin)\n\tif err != nil {\n\t\tfmt.Print(\"[]\")\n\t\treturn\n\t}\n\tfset := token.NewFileSet()\n\tnode, err := parser.ParseFile(fset, \"src.go\", src, 0)\n\tif err != nil {\n\t\tfmt.Print(\"[]\")\n\t\treturn\n\t}\n\n\tvar syms []Sym\n\n\t// Package-level scope\n\tpkgScope := node.Name.Name\n\n\t// Collect all top-level declarations\n\tfor _, decl := range node.Decls {\n\t\tswitch d := decl.(type) {\n\t\tcase *ast.FuncDecl:\n\t\t\tname := d.Name.Name\n\t\t\tkind := \"function\"\n\t\t\tscope := pkgScope\n\t\t\tif d.Recv != nil && len(d.Recv.List) > 0 {\n\t\t\t\tscope = pkgScope + \".\" + recvTypeName(d.Recv.List[0].Type) + \".\" + name\n\t\t\t\tkind = \"method\"\n\t\t\t} else {\n\t\t\t\tscope = pkgScope + \".\" + name\n\t\t\t}\n\t\t\tpos := fset.Position(d.Pos())\n\t\t\tsig := formatFuncSig(d)\n\t\t\tsyms = append(syms, Sym{Name: name, Kind: kind, Line: pos.Line, Col: pos.Column, Signature: sig, Scope: scope})\n\n\t\tcase *ast.GenDecl:\n\t\t\tfor _, spec := range d.Specs {\n\t\t\t\tswitch s := spec.(type) {\n\t\t\t\tcase *ast.TypeSpec:\n\t\t\t\t\tname := s.Name.Name\n\t\t\t\t\tpos := fset.Position(s.Pos())\n\t\t\t\t\tsig := \"type \" + name\n\t\t\t\t\tif s.TypeParams != nil {\n\t\t\t\t\t\tsig += formatTypeParams(s.TypeParams)\n\t\t\t\t\t}\n\t\t\t\t\tif st, ok := s.Type.(*ast.StructType); ok {\n\t\t\t\t\t\tsig += \" = struct { \" + formatFields(st.Fields.List) + \" }\"\n\t\t\t\t\t} else if it, ok := s.Type.(*ast.InterfaceType); ok {\n\t\t\t\t\t\tsig += \" = interface { \" + formatMethods(it.Methods.List) + \" }\"\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsig += \" = \" + formatType(s.Type)\n\t\t\t\t\t}\n\t\t\t\t\tsyms = append(syms, Sym{Name: name, Kind: \"type\", Line: pos.Line, Col: pos.Column, Signature: sig, Scope: pkgScope})\n\n\t\t\t\tcase *ast.ValueSpec:\n\t\t\t\t\tfor _, n := range s.Names {\n\t\t\t\t\t\tname := n.Name\n\t\t\t\t\t\tpos := fset.Position(n.Pos())\n\t\t\t\t\t\tkind := \"var\"\n\t\t\t\t\t\tif d.Tok == token.CONST {\n\t\t\t\t\t\t\tkind = \"const\"\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsig := kind + \" \" + name\n\t\t\t\t\t\tif s.Type != nil {\n\t\t\t\t\t\t\tsig += \" \" + formatType(s.Type)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsyms = append(syms, Sym{Name: name, Kind: kind, Line: pos.Line, Col: pos.Column, Signature: sig, Scope: pkgScope})\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tdata, err := json.Marshal(syms)\n\tif err != nil {\n\t\tfmt.Print(\"[]\")\n\t\treturn\n\t}\n\tfmt.Print(string(data))\n}\n\nfunc recvTypeName(t ast.Expr) string {\n\tswitch v := t.(type) {\n\tcase *ast.Ident:\n\t\treturn v.Name\n\tcase *ast.StarExpr:\n\t\treturn recvTypeName(v.X)\n\tdefault:\n\t\treturn \"?\"\n\t}\n}\n\nfunc formatFuncSig(d *ast.FuncDecl) string {\n\tscope := \"\"\n\tif d.Recv != nil && len(d.Recv.List) > 0 {\n\t\tscope = \"(\" + formatFieldList(d.Recv.List) + \") \"\n\t}\n\tscope += formatFuncType(d.Type)\n\treturn \"func \" + scope\n}\n\nfunc formatFuncType(f *ast.FuncType) string {\n\tparams := formatFieldList(f.Params.List)\n\tresults := \"\"\n\tif f.Results != nil {\n\t\tresults = \" -> \" + formatFieldList(f.Results.List)\n\t}\n\treturn params + results\n}\n\nfunc formatFieldList(fields []*ast.Field) string {\n\tif len(fields) == 0 {\n\t\treturn \"()\"\n\t}\n\tnames := make([]string, 0, len(fields))\n\tfor _, f := range fields {\n\t\tname := \"\"\n\t\tif len(f.Names) > 0 {\n\t\t\tname = f.Names[0].Name\n\t\t}\n\t\tt := formatType(f.Type)\n\t\tif name != \"\" {\n\t\t\tnames = append(names, name+\" \"+t)\n\t\t} else {\n\t\t\tnames = append(names, t)\n\t\t}\n\t}\n\treturn \"(\" + strings.Join(names, \", \") + \")\"\n}\n\nfunc formatFields(fields []*ast.Field) string {\n\tlines := make([]string, 0)\n\tfor _, f := range fields {\n\t\tname := \"\"\n\t\tif len(f.Names) > 0 {\n\t\t\tname = f.Names[0].Name\n\t\t}\n\t\tt := formatType(f.Type)\n\t\tif name != \"\" {\n\t\t\tlines = append(lines, name+\" \"+t)\n\t\t} else {\n\t\t\tlines = append(lines, t)\n\t\t}\n\t}\n\treturn strings.Join(lines, \"; \")\n}\n\nfunc formatMethods(fields []*ast.Field) string {\n\treturn formatFields(fields)\n}\n\nfunc formatTypeParams(tp *ast.FieldList) string {\n\tif tp == nil || len(tp.List) == 0 {\n\t\treturn \"\"\n\t}\n\tparams := make([]string, len(tp.List))\n\tfor i, p := range tp.List {\n\t\tif len(p.Names) > 0 {\n\t\t\tparams[i] = p.Names[0].Name\n\t\t} else {\n\t\t\tparams[i] = \"T\"\n\t\t}\n\t}\n\treturn \"[\" + strings.Join(params, \", \") + \"]\"\n}\n\nfunc formatType(t ast.Expr) string {\n\tif t == nil {\n\t\treturn \"?\"\n\t}\n\tswitch v := t.(type) {\n\tcase *ast.Ident:\n\t\treturn v.Name\n\tcase *ast.SelectorExpr:\n\t\treturn formatType(v.X) + \".\" + v.Sel.Name\n\tcase *ast.StarExpr:\n\t\treturn \"*\" + formatType(v.X)\n\tcase *ast.ArrayType:\n\t\tif v.Len == nil {\n\t\t\treturn \"[]\" + formatType(v.Elt)\n\t\t}\n\t\treturn \"[...]\" + formatType(v.Elt)\n\tcase *ast.MapType:\n\t\treturn \"map[\" + formatType(v.Key) + \"]\" + formatType(v.Value)\n\tcase *ast.InterfaceType:\n\t\treturn \"interface{}\"\n\tcase *ast.StructType:\n\t\treturn \"struct{}\"\n\tcase *ast.FuncType:\n\t\treturn formatFuncType(v)\n\tcase *ast.ChanType:\n\t\treturn \"chan \" + formatType(v.Value)\n\tcase *ast.BasicLit:\n\t\treturn v.Value\n\tcase *ast.IndexExpr:\n\t\t// Generic instantiation with one type arg, e.g. Logger[int].\n\t\treturn formatType(v.X) + \"[\" + formatType(v.Index) + \"]\"\n\tcase *ast.IndexListExpr:\n\t\t// Generic instantiation with multiple type args, e.g. Map[K, V].\n\t\targs := make([]string, len(v.Indices))\n\t\tfor i, idx := range v.Indices {\n\t\t\targs[i] = formatType(idx)\n\t\t}\n\t\treturn formatType(v.X) + \"[\" + strings.Join(args, \", \") + \"]\"\n\tdefault:\n\t\treturn \"?\"\n\t}\n}\n`;\n\nfunction syncGoParse(filePath: string, content: string, lang: SymbolLang): FileSymbols {\n\t// Feed the source over stdin — never pass the target .go file as a CLI arg.\n\t// `go run script.go target.go` makes the toolchain treat target.go as a\n\t// second package file (\"named files must all be in one directory\") and\n\t// refuses *_test.go outright. Reading from stdin sidesteps both, and lets\n\t// us parse the in-memory content without touching disk.\n\tconst tmpDir = path.join(os.tmpdir(), 'ws-go-parse');\n\ttry {\n\t\tmkdirSync(tmpDir, { recursive: true });\n\t\tconst scriptPath = path.join(tmpDir, 'parse.go');\n\t\twriteFileSync(scriptPath, GO_PARSE_SCRIPT, 'utf8');\n\n\t\t// argv-array form (no shell): avoids any quoting/metachar issues in the\n\t\t// temp script path. The target source is fed via stdin, not as an arg.\n\t\tconst stdout = execFileSync('go', ['run', scriptPath], {\n\t\t\tinput: content,\n\t\t\ttimeout: 15_000,\n\t\t\tencoding: 'utf8',\n\t\t\twindowsHide: true,\n\t\t});\n\n\t\tif (!stdout.trim()) {\n\t\t\treturn { file: filePath, lang, symbols: [], mtimeMs: Date.now() };\n\t\t}\n\n\t\tconst raw = JSON.parse(stdout.trim()) as Array<{ name: string; kind: string; line: number; col: number; signature: string; scope: string }>;\n\t\tconst symbols: IndexSymbol[] = raw.map((s) => ({\n\t\t\tid: 0,\n\t\t\tlang,\n\t\t\tkind: s.kind as IndexSymbol['kind'],\n\t\t\tname: s.name,\n\t\t\tfile: filePath,\n\t\t\tline: s.line,\n\t\t\tcol: s.col,\n\t\t\tsignature: s.signature ?? '',\n\t\t\tdocComment: '',\n\t\t\tscope: s.scope ?? '',\n\t\t\ttext: `${s.name} ${s.signature ?? ''}`.trim(),\n\t\t}));\n\t\treturn { file: filePath, lang, symbols, mtimeMs: Date.now() };\n\t} catch {\n\t\treturn { file: filePath, lang, symbols: [], mtimeMs: Date.now() };\n\t}\n}","/**\n * Python source symbol extraction using the `ast` module.\n *\n * Spawns a `python -c` child process that parses the file with Python's `ast`\n * module and emits JSON. Falls back to empty results on any error.\n *\n * Extracts: class, function, async function, const, var, import, import_from\n */\n\nimport { execFileSync } from 'node:child_process';\nimport { mkdirSync, writeFileSync } from 'node:fs';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport type { FileSymbols, Symbol as IndexSymbol, SymbolLang } from './schema.js';\nimport { detectLang } from './ts-parser.js';\n\n// ─── Public API ─────────────────────────────────────────────────────────────\n\nexport function parseSymbols(opts: { file: string; content: string; lang: SymbolLang }): FileSymbols {\n const { file, lang } = opts;\n\n try {\n return syncPyParse(file, lang);\n } catch {\n return { file, lang, symbols: [], mtimeMs: Date.now() };\n }\n}\n\nexport { detectLang } from './ts-parser.js';\n\n// ─── Inline Python parser script ────────────────────────────────────────────\n\nconst PY_PARSE_SCRIPT = `import ast, json, sys, os\n\ndef get_name(node):\n if isinstance(node, ast.Name):\n return node.id\n elif isinstance(node, ast.Attribute):\n return get_name(node.value) + \".\" + node.attr\n elif isinstance(node, ast.Subscript):\n return get_name(node.value)\n elif isinstance(node, ast.Call):\n return get_name(node.func)\n elif isinstance(node, ast.Constant):\n return str(node.value)\n return \"\"\n\ndef get_decorators(node):\n decs = []\n for dec in node.decorator_list:\n decs.append(get_name(dec))\n return decs\n\ndef get_bases(node):\n bases = []\n for base in node.bases:\n bases.append(get_name(base))\n return bases\n\ndef get_args(args):\n parts = []\n for arg in args.args:\n parts.append(arg.arg)\n return \", \".join(parts)\n\ndef get_returns(node):\n if node.returns is None:\n return \"\"\n return get_name(node.returns)\n\nclass Sym:\n def __init__(self, name, kind, line, col, signature, scope):\n self.name = name\n self.kind = kind\n self.line = line\n self.col = col\n self.signature = signature\n self.scope = scope\n def to_dict(self):\n return {\n \"name\": self.name,\n \"kind\": self.kind,\n \"line\": self.line,\n \"col\": self.col,\n \"signature\": self.signature,\n \"scope\": self.scope,\n }\n\ndef is_private(name):\n return name.startswith(\"__\") and not name.endswith(\"__\")\n\nsyms = []\nerrors = []\n\ntry:\n with open(sys.argv[1], \"r\", encoding=\"utf-8\") as f:\n source = f.read()\n tree = ast.parse(source, filename=sys.argv[1])\nexcept Exception as e:\n errors.append(str(e))\n print(\"[]\")\n sys.exit(0)\n\n# Module-level scope\nmodule_scope = os.path.basename(sys.argv[1])[:-3] # strip .py\n\nclass ModuleVisitor(ast.NodeVisitor):\n def __init__(self):\n self.scope_stack = [module_scope]\n\n def visit_ClassDef(self, node):\n bases = get_bases(node)\n decs = get_decorators(node)\n sig = \"class \" + node.name\n if bases:\n sig += \"(\" + \", \".join(bases) + \")\"\n sig += \": ...\"\n syms.append(Sym(\n name=node.name,\n kind=\"class\",\n line=node.lineno,\n col=node.col_offset,\n signature=sig,\n scope=\".\".join(self.scope_stack) + \".\" + node.name,\n ))\n self.scope_stack.append(node.name)\n self.generic_visit(node)\n self.scope_stack.pop()\n\n def visit_FunctionDef(self, node):\n decs = get_decorators(node)\n args = get_args(node.args)\n returns = get_returns(node)\n is_async = isinstance(node, ast.AsyncFunctionDef)\n\n kind = \"function\"\n prefix = \"def \"\n if decs:\n for d in decs:\n if d.endswith(\".staticmethod\"):\n kind = \"staticmethod\"\n elif d.endswith(\".classmethod\"):\n kind = \"classmethod\"\n elif d == \"property\":\n kind = \"property\"\n\n if is_async:\n kind = \"async_\" + kind\n\n sig = f\"{prefix}{node.name}({args})\"\n if returns:\n sig += f\" -> {returns}\"\n scope = \".\".join(self.scope_stack) + \".\" + node.name\n\n syms.append(Sym(\n name=node.name,\n kind=kind,\n line=node.lineno,\n col=node.col_offset,\n signature=sig,\n scope=scope,\n ))\n # Don't descend into function bodies to avoid local symbols\n # self.generic_visit(node)\n\n def visit_AsyncFunctionDef(self, node):\n # Treat as function\n self.visit_FunctionDef(node)\n\n def visit_Assign(self, node):\n for target in node.targets:\n if isinstance(target, ast.Name):\n name = target.id\n if is_private(name):\n continue\n # Infer constness from UPPER_CASE naming\n kind = \"const\" if name.isupper() else \"var\"\n col = target.col_offset if hasattr(target, 'col_offset') else 0\n syms.append(Sym(\n name=name,\n kind=kind,\n line=node.lineno,\n col=col,\n signature=f\"{name} = ...\",\n scope=\".\".join(self.scope_stack),\n ))\n\n def visit_AnnAssign(self, node):\n if isinstance(node.target, ast.Name):\n name = node.target.id\n if is_private(name):\n return\n kind = \"const\" if name.isupper() else \"var\"\n col = node.target.col_offset if hasattr(node.target, 'col_offset') else 0\n sig = f\"{name}: {get_name(node.annotation)}\"\n if node.value:\n sig += \" = ...\"\n syms.append(Sym(\n name=name,\n kind=kind,\n line=node.lineno,\n col=col,\n signature=sig,\n scope=\".\".join(self.scope_stack),\n ))\n\n def visit_Import(self, node):\n for alias in node.names:\n name = alias.asname or alias.name\n syms.append(Sym(\n name=name,\n kind=\"import\",\n line=node.lineno,\n col=node.col_offset,\n signature=f\"import {alias.name}\",\n scope=\".\".join(self.scope_stack),\n ))\n\n def visit_ImportFrom(self, node):\n module = node.module or \"\"\n for alias in node.names:\n name = alias.asname or alias.name\n syms.append(Sym(\n name=name,\n kind=\"import\",\n line=node.lineno,\n col=node.col_offset,\n signature=f\"from {module} import {alias.name}\",\n scope=\".\".join(self.scope_stack),\n ))\n\nvisitor = ModuleVisitor()\nvisitor.visit(tree)\n\nprint(json.dumps([s.to_dict() for s in syms]))\n`;\n\n// ─── Synchronous Python parse via child process ─────────────────────────────\n\nfunction syncPyParse(filePath: string, lang: SymbolLang): FileSymbols {\n\ttry {\n\t\t// Write the parser to a temp .py and run it as a script. Passing the\n\t\t// whole 200-line program via `python -c \"...\"` breaks under cmd.exe on\n\t\t// Windows (embedded newlines truncate the command), so the child saw a\n\t\t// mangled script and emitted nothing. A real file sidesteps all quoting.\n\t\tconst tmpDir = path.join(os.tmpdir(), 'ws-py-parse');\n\t\tmkdirSync(tmpDir, { recursive: true });\n\t\tconst scriptPath = path.join(tmpDir, 'parse.py');\n\t\twriteFileSync(scriptPath, PY_PARSE_SCRIPT, 'utf8');\n\n\t\t// argv-array form: no shell, so a hostile filename (e.g. one containing\n\t\t// shell metacharacters or command substitution) cannot inject commands.\n\t\tconst stdout = execFileSync('python', [scriptPath, filePath], {\n\t\t\ttimeout: 15_000,\n\t\t\tencoding: 'utf8',\n\t\t\twindowsHide: true,\n\t\t});\n\n\t\tif (!stdout.trim()) {\n\t\t\treturn { file: filePath, lang, symbols: [], mtimeMs: Date.now() };\n\t\t}\n\n\t\tconst raw = JSON.parse(stdout.trim()) as Array<{\n\t\t\tname: string;\n\t\t\tkind: string;\n\t\t\tline: number;\n\t\t\tcol: number;\n\t\t\tsignature: string;\n\t\t\tscope: string;\n\t\t}>;\n\t\tconst symbols: IndexSymbol[] = raw.map((s) => ({\n\t\t\tid: 0,\n\t\t\tlang,\n\t\t\tkind: s.kind as IndexSymbol['kind'],\n\t\t\tname: s.name,\n\t\t\tfile: filePath,\n\t\t\tline: s.line,\n\t\t\tcol: s.col,\n\t\t\tsignature: s.signature ?? '',\n\t\t\tdocComment: '',\n\t\t\tscope: s.scope ?? '',\n\t\t\ttext: `${s.name} ${s.signature ?? ''}`.trim(),\n\t\t}));\n\t\treturn { file: filePath, lang, symbols, mtimeMs: Date.now() };\n\t} catch {\n\t\treturn { file: filePath, lang, symbols: [], mtimeMs: Date.now() };\n\t}\n}","/**\n * Rust source symbol extraction.\n *\n * Tries to use the native `syn` crate via a cargo subproject (tools/syn-parser/).\n * Falls back to a robust regex-based extractor when cargo/syn is not available.\n *\n * The regex fallback extracts: fn, struct, enum, trait, impl, type, const, static, mod\n */\n\nimport { execFileSync, spawnSync } from 'node:child_process';\nimport * as path from 'node:path';\nimport type { FileSymbols, Symbol as IndexSymbol, SymbolLang } from './schema.js';\n\n// ─── Public API ─────────────────────────────────────────────────────────────\n\nexport function parseSymbols(opts: {\n file: string;\n content: string;\n lang: SymbolLang;\n}): FileSymbols {\n const { file, content, lang } = opts;\n\n // Try native parser first, fall back to regex\n const nativeAvailable = checkNativeParser();\n if (nativeAvailable) {\n const result = tryNativeParse(file, content);\n if (result) return result;\n }\n\n return regexParse({ file, content, lang });\n}\n\nexport { detectLang } from './ts-parser.js';\n\n// ─── Native parser (syn) ─────────────────────────────────────────────────────\n\nfunction checkNativeParser(): boolean {\n try {\n execFileSync('rustc', ['--version'], { stdio: 'pipe' });\n // Check if our syn-parser crate is available. argv-array form (no shell)\n // so a cwd path containing spaces or shell metacharacters can't break out.\n const toolsDir = path.join(process.cwd(), 'tools');\n try {\n execFileSync(\n 'cargo',\n [\n 'metadata',\n '--no-deps',\n '--format-version',\n '1',\n '--manifest-path',\n path.join(toolsDir, 'Cargo.toml'),\n ],\n { stdio: 'pipe' },\n );\n return true;\n } catch {\n return false;\n }\n } catch {\n return false;\n }\n}\n\nfunction tryNativeParse(file: string, content: string): FileSymbols | null {\n try {\n const toolsDir = path.join(process.cwd(), 'tools');\n const crateDir = path.join(toolsDir, 'syn-parser');\n\n // Write source to temp file for cargo to read\n const tmpFile = path.join(crateDir, 'src', 'input.rs');\n const { writeFileSync } = require('node:fs');\n writeFileSync(tmpFile, content, 'utf8');\n\n const result = spawnSync(\n 'cargo',\n ['run', '--manifest-path', path.join(toolsDir, 'Cargo.toml')],\n {\n cwd: process.cwd(),\n encoding: 'utf8',\n timeout: 15000,\n stdio: ['pipe', 'pipe', 'pipe'],\n },\n );\n\n if (result.status === 0 && result.stdout) {\n const symbols: IndexSymbol[] = JSON.parse(result.stdout);\n return {\n file,\n lang: 'rs',\n symbols: symbols.map((s) => ({ ...s, id: 0, lang: 'rs' as SymbolLang })),\n mtimeMs: Date.now(),\n };\n }\n } catch {\n // Fall through to regex\n }\n return null;\n}\n\n// ─── Regex fallback parser ───────────────────────────────────────────────────\n\ninterface RustPattern {\n regex: RegExp;\n kind: IndexSymbol['kind'];\n}\n\nconst RS_PATTERNS: RustPattern[] = [\n { regex: /fn\\s+(\\w+)\\s*\\([^)]*\\)/g, kind: 'function' },\n { regex: /struct\\s+(\\w+)/g, kind: 'struct' },\n { regex: /enum\\s+(\\w+)/g, kind: 'enum' },\n { regex: /trait\\s+(\\w+)/g, kind: 'trait' },\n { regex: /impl\\s+(?:<[^>]+>)?(\\w+)/g, kind: 'impl' },\n { regex: /type\\s+(\\w+)\\s*=/g, kind: 'type' },\n { regex: /const\\s+(\\w+)/g, kind: 'const' },\n { regex: /static\\s+(\\w+)/g, kind: 'static' },\n { regex: /mod\\s+(\\w+)/g, kind: 'mod' },\n];\n\nfunction regexParse(opts: { file: string; content: string; lang: SymbolLang }): FileSymbols {\n const { file, content, lang } = opts;\n const symbols: IndexSymbol[] = [];\n const lines = content.split('\\n');\n\n // Build line offset map\n const lineOffsets: number[] = [0];\n for (let i = 0; i < lines.length; i++) {\n lineOffsets.push(lineOffsets[i]! + lines[i]!.length + 1);\n }\n\n function lineFromOffset(offset: number): number {\n let lo = 0;\n let hi = lineOffsets.length - 1;\n while (lo < hi) {\n const mid = (lo + hi + 1) >>> 1;\n if (lineOffsets[mid]! <= offset) lo = mid;\n else hi = mid - 1;\n }\n return lo + 1; // 1-based\n }\n\n function extractDeclaration(lineIdx: number, match: RegExpExecArray): string {\n const line = lines[lineIdx] ?? '';\n return line.trim().slice(0, 500);\n }\n\n for (const pattern of RS_PATTERNS) {\n pattern.regex.lastIndex = 0;\n for (\n let match = pattern.regex.exec(content);\n match !== null;\n match = pattern.regex.exec(content)\n ) {\n const name = match[1]!;\n const offset = match.index!;\n const line = lineFromOffset(offset);\n const col = offset - (lineOffsets[line - 1] ?? 0);\n const lineIdx = line - 1;\n const signature = extractDeclaration(lineIdx, match);\n\n symbols.push({\n id: 0,\n lang,\n kind: pattern.kind,\n name,\n file,\n line,\n col,\n signature,\n docComment: '',\n scope: '',\n text: `${name} ${signature}`.trim(),\n });\n }\n }\n\n // Deduplicate by name+line\n const seen = new Set<string>();\n const deduped = symbols.filter((s) => {\n const key = `${s.name}:${s.line}`;\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n\n return { file, lang, symbols: deduped, mtimeMs: Date.now() };\n}\n","/**\n * JSON file symbol extraction.\n *\n * Extracts top-level keys as \"symbols\" with kind `property`.\n * Special handling for:\n * - package.json: scripts, dependencies, devDependencies → `const`\n * - tsconfig.json: compilerOptions keys → `property`\n * - JSON Schema / OpenAPI: $schema, $id, $ref → `schema`\n * - Root object itself → kind `object`\n *\n * Uses regex-based extraction for speed and zero dependencies.\n */\n\nimport * as path from 'node:path';\nimport type { FileSymbols, Symbol as IndexSymbol, SymbolLang } from './schema.js';\n\n// ─── Public API ─────────────────────────────────────────────────────────────\n\nexport function parseSymbols(opts: {\n file: string;\n content: string;\n lang: SymbolLang;\n}): FileSymbols {\n const { file, content, lang } = opts;\n\n try {\n return regexParse({ file, content, lang });\n } catch {\n return { file, lang, symbols: [], mtimeMs: Date.now() };\n }\n}\n\nexport { detectLang } from './ts-parser.js';\n\n// ─── Regex parser ───────────────────────────────────────────────────────────\n\ninterface JsonPattern {\n regex: RegExp;\n kind: IndexSymbol['kind'];\n}\n\nconst JSON_PATTERNS: JsonPattern[] = [\n // Top-level \"key\": value (on its own line)\n { regex: /^\\s*\"([^\"]+)\"\\s*:/gm, kind: 'property' },\n];\n\n/**\n * Extract key-value pairs from JSON content using regex.\n * Handles: \"key\": value, arrays with keyed objects, nested objects (depth ≤ 3).\n */\nfunction regexParse(opts: { file: string; content: string; lang: SymbolLang }): FileSymbols {\n const { file, content, lang } = opts;\n const symbols: IndexSymbol[] = [];\n const basename = path.basename(file).toLowerCase();\n\n const isPackageJson = basename === 'package.json';\n const isTsconfig = basename === 'tsconfig.json' || basename === 'tsconfig.build.json';\n const isJsonSchema =\n content.includes('$schema') || content.includes('$id') || content.includes('$ref');\n const isOpenApi = content.includes('openapi') || content.includes('swagger');\n\n const lines = content.split('\\n');\n\n // Build line offset map\n const lineOffsets: number[] = [0];\n for (let i = 0; i < lines.length; i++) {\n lineOffsets.push(lineOffsets[i]! + lines[i]!.length + 1);\n }\n\n function lineFromOffset(offset: number): number {\n let lo = 0;\n let hi = lineOffsets.length - 1;\n while (lo < hi) {\n const mid = (lo + hi + 1) >>> 1;\n if (lineOffsets[mid]! <= offset) lo = mid;\n else hi = mid - 1;\n }\n return lo + 1;\n }\n\n // Root object symbol\n const rootMatch = content.match(/^\\s*\\{/m);\n if (rootMatch) {\n const offset = rootMatch.index!;\n const line = lineFromOffset(offset);\n symbols.push(\n makeSymbol({\n name: path.basename(file),\n kind: 'object',\n line,\n col: 0,\n signature: `\"${path.basename(file)}\" = { ... }`,\n file,\n lang,\n }),\n );\n }\n\n // Extract top-level keys\n const topLevelKeyRegex = /^\\s*\"([^\"]+)\"\\s*:/gm;\n for (\n let match = topLevelKeyRegex.exec(content);\n match !== null;\n match = topLevelKeyRegex.exec(content)\n ) {\n const key = match[1]!;\n const offset = match.index!;\n const line = lineFromOffset(offset);\n const col = offset - (lineOffsets[line - 1] ?? 0);\n\n let kind: IndexSymbol['kind'] = 'property';\n let signature = `\"${key}\": ...\"`;\n\n // Special casing for known file types\n if (isPackageJson) {\n if (\n key === 'scripts' ||\n key === 'dependencies' ||\n key === 'devDependencies' ||\n key === 'peerDependencies' ||\n key === 'optionalDependencies'\n ) {\n kind = 'const';\n signature = `\"${key}\": { ... }`;\n }\n } else if (isTsconfig) {\n if (key === 'compilerOptions') {\n kind = 'property';\n signature = `\"compilerOptions\": { ... }`;\n }\n }\n\n // JSON Schema / OpenAPI special keys\n if (isJsonSchema || isOpenApi) {\n if (key === '$schema' || key === '$id') {\n kind = 'schema';\n signature = `\"${key}\": \"...\"`;\n } else if (key === '$ref') {\n kind = 'schema';\n signature = `\"$ref\": \"...\"`;\n }\n }\n\n symbols.push(\n makeSymbol({\n name: key,\n kind,\n line,\n col,\n signature,\n file,\n lang,\n }),\n );\n\n // For package.json, also extract individual scripts as 'function'\n if (isPackageJson && key === 'scripts') {\n extractPackageScripts(content, symbols, file, lang, lineOffsets, lineFromOffset);\n }\n\n // For tsconfig.json compilerOptions, extract nested keys\n if (isTsconfig && key === 'compilerOptions') {\n extractCompilerOptions(content, symbols, file, lang, lineOffsets, line, lineFromOffset);\n }\n }\n\n // Extract JSON Schema $defs or definitions\n const defsRegex = /\"\\$defs\"\\s*:|\"\\$defs\"\\s*:/g;\n const defsMatch = defsRegex.exec(content);\n if (defsMatch !== null) {\n const offset = defsMatch.index!;\n const line = lineFromOffset(offset);\n symbols.push(\n makeSymbol({\n name: '$defs',\n kind: 'property',\n line,\n col: offset - (lineOffsets[line - 1] ?? 0),\n signature: '\"$defs\": { ... }',\n file,\n lang,\n }),\n );\n }\n\n // Extract definitions (OpenAPI components, JSON Schema definitions)\n const defsPatterns = [\n /\"\\$defs\"\\s*:/g,\n /\"definitions\"\\s*:/g,\n /\"components\"\\s*:/g,\n /\"schemas\"\\s*:/g,\n ];\n for (const pat of defsPatterns) {\n pat.lastIndex = 0;\n for (let match = pat.exec(content); match !== null; match = pat.exec(content)) {\n const offset = match.index!;\n const line = lineFromOffset(offset);\n const key = match[0]!.match(/\"([^\"]+)\"/)?.[1] ?? match[0]!;\n symbols.push(\n makeSymbol({\n name: key,\n kind: 'property',\n line,\n col: offset - (lineOffsets[line - 1] ?? 0),\n signature: `\"${key}\": { ... }`,\n file,\n lang,\n }),\n );\n }\n }\n\n return { file, lang, symbols, mtimeMs: Date.now() };\n}\n\nfunction extractPackageScripts(\n content: string,\n symbols: IndexSymbol[],\n file: string,\n lang: SymbolLang,\n lineOffsets: number[],\n lineFromOffset: (offset: number) => number,\n): void {\n // Find the \"scripts\": { ... } block and extract each script key\n const scriptsBlockRegex = /\"scripts\"\\s*:\\s*\\{([^}]+)\\}/g;\n for (\n let match = scriptsBlockRegex.exec(content);\n match !== null;\n match = scriptsBlockRegex.exec(content)\n ) {\n const blockContent = match[0]!;\n const blockOffset = match.index!;\n\n // Extract each \"key\" inside the block (simple approach)\n const scriptKeyRegex = /\"(\\w[\\w-]*)\"\\s*:/g;\n for (\n let scriptMatch = scriptKeyRegex.exec(blockContent);\n scriptMatch !== null;\n scriptMatch = scriptKeyRegex.exec(blockContent)\n ) {\n const key = scriptMatch[1]!;\n const keyOffset = blockOffset + scriptMatch.index!;\n const line = lineFromOffset(keyOffset);\n symbols.push(\n makeSymbol({\n name: key,\n kind: 'function',\n line,\n col: keyOffset - (lineOffsets[line - 1] ?? 0),\n signature: `\"${key}\": \"...\"`,\n file,\n lang,\n }),\n );\n }\n }\n}\n\nfunction extractCompilerOptions(\n content: string,\n symbols: IndexSymbol[],\n file: string,\n lang: SymbolLang,\n lineOffsets: number[],\n parentLine: number,\n lineFromOffset: (offset: number) => number,\n): void {\n // Find the \"compilerOptions\": { ... } block\n const optsBlockRegex = /\"compilerOptions\"\\s*:\\s*\\{([^}]+)\\}/g;\n for (\n let match = optsBlockRegex.exec(content);\n match !== null;\n match = optsBlockRegex.exec(content)\n ) {\n const blockContent = match[0]!;\n const blockOffset = match.index!;\n\n // Extract nested key inside compilerOptions (up to depth 1)\n const optKeyRegex = /\"(\\w[\\w]*)\"\\s*:/g;\n for (\n let optMatch = optKeyRegex.exec(blockContent);\n optMatch !== null;\n optMatch = optKeyRegex.exec(blockContent)\n ) {\n const key = optMatch[1]!;\n const keyOffset = blockOffset + optMatch.index!;\n const line = lineFromOffset(keyOffset);\n if (line <= parentLine) continue; // Skip top-level (already captured)\n symbols.push(\n makeSymbol({\n name: key,\n kind: 'property',\n line,\n col: keyOffset - (lineOffsets[line - 1] ?? 0),\n signature: `\"${key}\": ...`,\n file,\n lang,\n }),\n );\n }\n }\n}\n\nfunction makeSymbol(opts: {\n name: string;\n kind: IndexSymbol['kind'];\n line: number;\n col: number;\n signature: string;\n file: string;\n lang: SymbolLang;\n}): IndexSymbol {\n return {\n id: 0,\n lang: opts.lang,\n kind: opts.kind,\n name: opts.name,\n file: opts.file,\n line: opts.line,\n col: opts.col,\n signature: opts.signature,\n docComment: '',\n scope: '',\n text: `${opts.name} ${opts.signature}`.trim(),\n };\n}\n","/**\n * YAML file symbol extraction.\n *\n * Uses regex-based extraction (no js-yaml dependency).\n * Extracts:\n * - Top-level and nested key-value pairs (up to depth 3)\n * - List items with key: `- key: value`\n * - Block scalars `key: |` and `key: >`\n * - Anchors `&anchor` and aliases `*alias`\n *\n * Kind taxonomy:\n * - `property` for keys\n * - `literal` for scalar values (strings, numbers, booleans)\n * - `const` for anchors\n */\n\nimport * as path from 'node:path';\nimport type { FileSymbols, Symbol as IndexSymbol, SymbolLang } from './schema.js';\n\n// ─── Public API ─────────────────────────────────────────────────────────────\n\nexport function parseSymbols(opts: {\n file: string;\n content: string;\n lang: SymbolLang;\n}): FileSymbols {\n const { file, content, lang } = opts;\n\n try {\n return regexParse({ file, content, lang });\n } catch {\n return { file, lang, symbols: [], mtimeMs: Date.now() };\n }\n}\n\nexport { detectLang } from './ts-parser.js';\n\n// ─── Regex parser ───────────────────────────────────────────────────────────\n\nfunction regexParse(opts: { file: string; content: string; lang: SymbolLang }): FileSymbols {\n const { file, content, lang } = opts;\n const symbols: IndexSymbol[] = [];\n\n const lines = content.split('\\n');\n\n // Build line offset map for accurate line/col\n const lineOffsets: number[] = [0];\n for (let i = 0; i < lines.length; i++) {\n lineOffsets.push(lineOffsets[i]! + lines[i]!.length + 1);\n }\n\n function lineFromOffset(offset: number): number {\n let lo = 0;\n let hi = lineOffsets.length - 1;\n while (lo < hi) {\n const mid = (lo + hi + 1) >>> 1;\n if (lineOffsets[mid]! <= offset) lo = mid;\n else hi = mid - 1;\n }\n return lo + 1;\n }\n\n // ── 1. Anchors and aliases ─────────────────────────────────────────────────\n // &anchor_name\n const anchorRegex = /&(\\w[\\w-]*)/g;\n for (let match = anchorRegex.exec(content); match !== null; match = anchorRegex.exec(content)) {\n const name = match[1]!;\n const offset = match.index!;\n const line = lineFromOffset(offset);\n const col = offset - (lineOffsets[line - 1] ?? 0);\n symbols.push(\n makeSymbol({\n name,\n kind: 'const',\n line,\n col,\n signature: `&${name}`,\n file,\n lang,\n }),\n );\n }\n\n // *alias_name\n const aliasRegex = /\\*(\\w[\\w-]*)/g;\n for (let match = aliasRegex.exec(content); match !== null; match = aliasRegex.exec(content)) {\n const name = match[1]!;\n const offset = match.index!;\n const line = lineFromOffset(offset);\n const col = offset - (lineOffsets[line - 1] ?? 0);\n symbols.push(\n makeSymbol({\n name,\n kind: 'const',\n line,\n col,\n signature: `*${name}`,\n file,\n lang,\n }),\n );\n }\n\n // ── 2. Top-level and nested key: value pairs ───────────────────────────────\n // Matches `key: value` (but not block scalars or document markers)\n // Uses negative lookbehind and context to avoid false positives\n const kvRegex = /^(\\s*)([^:#\\s][^:#\\s]*)\\s*:/gm;\n for (let match = kvRegex.exec(content); match !== null; match = kvRegex.exec(content)) {\n const indent = match[1]!.length;\n const key = match[2]!;\n const offset = match.index!;\n const line = lineFromOffset(offset);\n const col = offset - (lineOffsets[line - 1] ?? 0);\n\n // Skip block scalar indicators (| or > at column 0 with key name before :)\n const lineContent = lines[line - 1] ?? '';\n if (/^[|&>]/.test(lineContent.trim())) continue;\n // Skip YAML document markers\n if (key === '---' || key === '...') continue;\n // Skip keys that are clearly part of a string value (unusual indent)\n if (indent > 12) continue;\n\n const value = extractValue(content, match.index!);\n const kind: IndexSymbol['kind'] = isScalar(value) ? 'literal' : 'property';\n const signature = `${key}: ${truncate(value, 60)}`;\n\n symbols.push(makeSymbol({ name: key, kind, line, col, signature, file, lang }));\n }\n\n // ── 3. List item keys ──────────────────────────────────────────────────────\n // `- key: value` (list item that is a keyed object)\n const listItemRegex = /^-(\\s+)([^:#\\s][^:#\\s]*)\\s*:/gm;\n for (let match = listItemRegex.exec(content); match !== null; match = listItemRegex.exec(content)) {\n const key = match[2]!;\n const offset = match.index!;\n const line = lineFromOffset(offset);\n const col = offset - (lineOffsets[line - 1] ?? 0);\n const value = extractValue(content, offset + match[0]!.length);\n const kind: IndexSymbol['kind'] = isScalar(value) ? 'literal' : 'property';\n symbols.push(\n makeSymbol({\n name: key,\n kind,\n line,\n col,\n signature: `- ${key}: ${truncate(value, 60)}`,\n file,\n lang,\n }),\n );\n }\n\n // ── 4. Block scalar keys (key: | or key: >) ────────────────────────────────\n const blockScalarRegex = /^(\\s*)([^:#\\s][^:#\\s]*)\\s*:\\s*[|>](\\s|$)/gm;\n for (let match = blockScalarRegex.exec(content); match !== null; match = blockScalarRegex.exec(content)) {\n const key = match[2]!;\n const offset = match.index!;\n const line = lineFromOffset(offset);\n const col = offset - (lineOffsets[line - 1] ?? 0);\n symbols.push(\n makeSymbol({\n name: key,\n kind: 'property',\n line,\n col,\n signature: `${key}: | ...`,\n file,\n lang,\n }),\n );\n }\n\n return { file, lang, symbols, mtimeMs: Date.now() };\n}\n\n// ─── Helpers ───────────────────────────────────────────────────────────────\n\nfunction extractValue(content: string, afterColonOffset: number): string {\n // Get the rest of the line after the colon\n const lineEnd = content.indexOf('\\n', afterColonOffset);\n const rest = content.slice(afterColonOffset, lineEnd < 0 ? undefined : lineEnd);\n return rest.trim();\n}\n\nfunction isScalar(value: string): boolean {\n if (!value) return false;\n // Numbers, booleans, null, quoted strings\n if (/^-?\\d+(\\.\\d+)?([eE][+-]?\\d+)?$/.test(value)) return true;\n if (/^(true|false|null|undefined)$/i.test(value)) return true;\n if (/^'[^']*'$/.test(value) || /^\"[^\"]*\"$/.test(value)) return true;\n return false;\n}\n\nfunction truncate(s: string, max: number): string {\n if (s.length <= max) return s;\n return s.slice(0, max) + '...';\n}\n\nfunction makeSymbol(opts: {\n name: string;\n kind: IndexSymbol['kind'];\n line: number;\n col: number;\n signature: string;\n file: string;\n lang: SymbolLang;\n}): IndexSymbol {\n return {\n id: 0,\n lang: opts.lang,\n kind: opts.kind,\n name: opts.name,\n file: opts.file,\n line: opts.line,\n col: opts.col,\n signature: opts.signature,\n docComment: '',\n scope: '',\n text: `${opts.name} ${opts.signature}`.trim(),\n };\n}\n","/**\n * Main indexing orchestrator.\n *\n * Given a project root and a list of files:\n * 1. Parse each file with the appropriate parser (TS, Go, Python, Rust, JSON, YAML)\n * 2. Delete old symbols for changed/deleted files\n * 3. Insert new symbols\n * 4. Update file metadata\n * 5. Return index statistics\n */\n\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { Dirent, Stats } from 'node:fs';\nimport type { Context } from '@wrongstack/core';\nimport { compileGlob } from '@wrongstack/core';\nimport type { FileMeta, IndexResult, Symbol as IndexSymbol } from './schema.js';\nimport { IndexStore } from './writer.js';\nimport { parseSymbols as parseTs, detectLang } from './ts-parser.js';\nimport { parseSymbols as parseGo } from './go-parser.js';\nimport { parseSymbols as parsePy } from './py-parser.js';\nimport { parseSymbols as parseRs } from './rs-parser.js';\nimport { parseSymbols as parseJson } from './json-parser.js';\nimport { parseSymbols as parseYaml } from './yaml-parser.js';\n\nconst DEFAULT_IGNORE = [\n 'node_modules', '.git', 'dist', 'build', '.next', 'coverage',\n '.turbo', '__snapshots__', '.nyc_output',\n];\n\ninterface IndexerOptions {\n projectRoot: string;\n files?: string[];\n force?: boolean;\n langs?: string[];\n ignore?: string[];\n}\n\nasync function findSourceFiles(\n projectRoot: string,\n ignore: string[],\n): Promise<string[]> {\n const results: string[] = [];\n const ignoreSet = new Set([...DEFAULT_IGNORE, ...ignore]);\n // compileGlob does not support brace expansion — use one pattern per extension\n const globs = [\n { ext: '.ts', pat: compileGlob('**/*.ts') },\n { ext: '.tsx', pat: compileGlob('**/*.tsx') },\n { ext: '.js', pat: compileGlob('**/*.js') },\n { ext: '.jsx', pat: compileGlob('**/*.jsx') },\n { ext: '.go', pat: compileGlob('**/*.go') },\n { ext: '.py', pat: compileGlob('**/*.py') },\n { ext: '.rs', pat: compileGlob('**/*.rs') },\n { ext: '.json', pat: compileGlob('**/*.json') },\n { ext: '.yaml', pat: compileGlob('**/*.yaml') },\n { ext: '.yml', pat: compileGlob('**/*.yml') },\n ];\n\n const walk = async (dir: string): Promise<void> => {\n let entries: Dirent[];\n try {\n entries = await fs.readdir(dir, { withFileTypes: true });\n } catch {\n return;\n }\n for (const e of entries) {\n if (ignoreSet.has(e.name)) continue;\n const full = path.join(dir, e.name);\n if (e.isDirectory()) {\n await walk(full);\n } else if (e.isFile()) {\n // Normalize to forward-slash relative path for pattern matching\n const rel = path.relative(projectRoot, full).replace(/\\\\/g, '/');\n const ext = path.extname(e.name);\n for (const { ext: extName, pat } of globs) {\n if (ext === extName && (pat.test(rel) || pat.test(e.name))) {\n results.push(full);\n break;\n }\n }\n }\n }\n };\n\n await walk(projectRoot);\n return results;\n}\n\n/** Dispatch to the correct parser based on language. */\nasync function parseFile(\n file: string,\n content: string,\n lang: string,\n): Promise<ReturnType<typeof parseTs>> {\n switch (lang) {\n case 'ts':\n case 'tsx':\n case 'js':\n case 'jsx':\n return parseTs({ file, content, lang: lang as 'ts' | 'tsx' | 'js' | 'jsx' });\n case 'go':\n return parseGo({ file, content, lang: 'go' });\n case 'py':\n return parsePy({ file, content, lang: 'py' });\n case 'rs':\n return parseRs({ file, content, lang: 'rs' });\n case 'json':\n return parseJson({ file, content, lang: 'json' });\n case 'yaml':\n return parseYaml({ file, content, lang: 'yaml' });\n default:\n return { file, lang: lang as 'ts' | 'tsx' | 'js' | 'jsx', symbols: [], mtimeMs: Date.now() };\n }\n}\n\n/** Run a full or incremental index and return statistics. */\nexport async function runIndexer(\n ctx: Context,\n opts: IndexerOptions,\n): Promise<IndexResult> {\n const { projectRoot, force = false, langs, ignore = [] } = opts;\n\n const store = new IndexStore(projectRoot);\n const startMs = Date.now();\n const errors: string[] = [];\n const langStats: Record<string, number> = {};\n let filesIndexed = 0;\n let symbolsIndexed = 0;\n\n let files: string[];\n if (opts.files && opts.files.length > 0) {\n files = opts.files.map((f) => path.resolve(projectRoot, f));\n } else {\n files = await findSourceFiles(projectRoot, ignore);\n }\n\n if (langs && langs.length > 0) {\n const langSet = new Set(langs);\n files = files.filter((f) => {\n const lang = detectLang(f);\n return lang ? langSet.has(lang) : false;\n });\n }\n\n if (force) store.clearAll();\n\n // Collect existing file metadata for incremental check\n const existingMeta: Map<string, FileMeta> = new Map();\n if (!force) {\n for (const meta of store.getAllFileMetas()) existingMeta.set(meta.file, meta);\n }\n\n for (const file of files) {\n let stat: Stats;\n try {\n stat = await fs.stat(file);\n } catch {\n store.deleteFile(file);\n continue;\n }\n if (!stat.isFile()) continue;\n\n const lang = detectLang(file);\n if (!lang) continue;\n\n const meta = existingMeta.get(file);\n if (!force && meta && meta.mtimeMs === Math.floor(stat.mtimeMs)) {\n langStats[lang] = (langStats[lang] ?? 0) + meta.symbolCount;\n symbolsIndexed += meta.symbolCount;\n filesIndexed++;\n continue;\n }\n\n store.deleteSymbolsForFile(file);\n store.deleteRefsForFile(file);\n\n let content: string;\n try {\n content = await fs.readFile(file, 'utf8');\n } catch (e) {\n errors.push(`read error: ${file}: ${e instanceof Error ? e.message : String(e)}`);\n continue;\n }\n\n let parsed: ReturnType<typeof parseTs>;\n try {\n parsed = await parseFile(file, content, lang);\n } catch (e) {\n errors.push(`parse error: ${file}: ${e instanceof Error ? e.message : String(e)}`);\n continue;\n }\n\n if (parsed.symbols.length === 0) {\n store.upsertFile({\n file,\n lang,\n mtimeMs: Math.floor(stat.mtimeMs),\n symbolCount: 0,\n lastIndexed: Date.now(),\n });\n filesIndexed++;\n continue;\n }\n\n const nextId = store.getStats().totalSymbols + 1;\n const symbolsWithIds: IndexSymbol[] = parsed.symbols.map((s, i) => ({ ...s, id: nextId + i }));\n store.insertSymbols(symbolsWithIds, nextId);\n const count = symbolsWithIds.length;\n symbolsIndexed += count;\n langStats[lang] = (langStats[lang] ?? 0) + count;\n\n // Insert cross-references for each symbol\n if (parsed.refs && parsed.refs.length > 0) {\n for (let i = 0; i < symbolsWithIds.length; i++) {\n const sym = symbolsWithIds[i]!;\n const symRefs = parsed.refs.filter((r) => r.line === sym.line);\n if (symRefs.length > 0) {\n const refsWithFromId = symRefs.map((r) => ({ ...r, fromId: sym.id }));\n store.insertRefs(sym.id, refsWithFromId);\n }\n }\n }\n\n store.upsertFile({\n file,\n lang,\n mtimeMs: Math.floor(stat.mtimeMs),\n symbolCount: count,\n lastIndexed: Date.now(),\n });\n\n filesIndexed++;\n }\n\n // Remove stale entries for files deleted since last run\n for (const [file_] of existingMeta) {\n try {\n await fs.stat(file_);\n } catch {\n store.deleteFile(file_);\n }\n }\n\n const durationMs = Date.now() - startMs;\n store.setLastIndexed(Date.now());\n store.close();\n\n return {\n filesIndexed,\n symbolsIndexed,\n langStats,\n durationMs,\n errors,\n };\n}","/**\n * `codebase-index` tool — trigger a full or incremental reindex.\n *\n * Usage: codebase-index({ force?: boolean, langs?: string[] })\n *\n * - `force: true` → clear index and reindex everything from scratch\n * - `langs` → filter to specific languages (e.g. ['ts', 'tsx'])\n *\n * Returns: { filesIndexed, symbolsIndexed, langStats, durationMs, errors }\n */\n\nimport * as path from 'node:path';\nimport type { Tool } from '@wrongstack/core';\nimport { runIndexer } from './indexer.js';\n\nexport const codebaseIndexTool: Tool<CodebaseIndexInput, CodebaseIndexOutput> = {\n name: 'codebase-index',\n category: 'Project',\n description:\n 'Build or update the symbol index for the project. Runs incrementally by default — only re-indexes files that changed since the last run.',\n usageHint:\n 'Call with `force: true` to wipe and rebuild the index from scratch. Use `langs` to limit to specific languages. First call without arguments to do an incremental index.',\n permission: 'auto',\n mutating: true,\n timeoutMs: 120_000,\n inputSchema: {\n type: 'object',\n properties: {\n force: {\n type: 'boolean',\n description: 'Force a full reindex — clears the index first and reindexes all files.',\n },\n langs: {\n type: 'array',\n items: { type: 'string' },\n description: 'Limit reindex to specific languages: ts, tsx, js, jsx, go, py, rs',\n },\n },\n },\n async execute(input, ctx) {\n const result = await runIndexer(ctx, {\n projectRoot: ctx.projectRoot,\n force: input.force ?? false,\n langs: input.langs,\n });\n return result;\n },\n};\n\n// ─── Types for tool I/O ────────────────────────────────────────────────────────\n\ninterface CodebaseIndexInput {\n force?: boolean;\n langs?: string[];\n}\n\ninterface CodebaseIndexOutput {\n filesIndexed: number;\n symbolsIndexed: number;\n langStats: Record<string, number>;\n durationMs: number;\n errors: string[];\n}","/**\n * BM25 ranking implementation — no external dependencies.\n *\n * Algorithm: Okapi BM25 with standard parameters (k1=1.5, b=0.75).\n */\n\nconst K1 = 1.5;\nconst B = 0.75;\n\ninterface Bm25Doc {\n id: number;\n tokens: string[];\n raw: string;\n len: number;\n}\n\n/** Tokenise a string into lowercase word tokens. */\nexport function tokenise(text: string): string[] {\n // Preserve all Unicode letters + digits + $ + '. Split on everything else.\n const sanitised = text.replace(/[^\\p{L}\\p{N}$'_]/gu, ' ').replace(/_/g, ' ');\n return sanitised.toLowerCase().split(' ').filter(Boolean);\n}\n\nexport interface IndexableDoc {\n id: number;\n text: string;\n}\n\n/**\n * Split a camelCase/SnakeCase identifier into its constituent words.\n * e.g. \"complexOperation\" → \"complex Operation\"\n * \"foo_bar_baz\" → \"foo bar baz\"\n * This allows a query for \"complex\" to match \"complexOperation\"\n * via the shared \"complex\" token.\n */\nfunction splitName(name: string): string {\n return name\n .replace(/([a-z])([A-Z])/g, '$1 $2')\n .replace(/[_\\-]+/g, ' ')\n .trim();\n}\n\n/**\n * Build indexable text for BM25 from a symbol's fields.\n * The name is split into camelCase/SnakeCase words so that queries\n * like \"complex\" match \"complexOperation\". The verbatim name is\n * also included for exact-match queries.\n */\nexport function buildIndexableText(name: string, signature: string, docComment: string): string {\n return [splitName(name), name, signature, docComment].filter(Boolean).join(' ');\n}\n\nexport function buildBm25Index(docs: IndexableDoc[]): Bm25Index {\n const documents: Bm25Doc[] = docs.map((d) => {\n const tokens = tokenise(d.text);\n return { id: d.id, tokens, raw: d.text, len: tokens.length };\n });\n\n const df: Record<string, number> = {};\n for (const doc of documents) {\n const seen = new Set<string>();\n for (const t of doc.tokens) {\n if (!seen.has(t)) {\n df[t] = (df[t] ?? 0) + 1;\n seen.add(t);\n }\n }\n }\n\n const N = documents.length;\n const totalLen = documents.reduce((sum, d) => sum + d.len, 0);\n const avgLen = N === 0 ? 0 : totalLen / N;\n\n return new Bm25Index(documents, df, N, avgLen);\n}\n\nexport class Bm25Index {\n private readonly safeAvgLen: number;\n\n constructor(\n private documents: Bm25Doc[],\n private df: Record<string, number>,\n private N: number,\n avgLen: number,\n ) {\n this.safeAvgLen = avgLen === 0 ? 1 : avgLen;\n }\n\n score(query: string, filter?: (id: number) => boolean): Array<{ id: number; score: number }> {\n const qTokens = tokenise(query);\n if (qTokens.length === 0) return [];\n\n const results: Array<{ id: number; score: number }> = [];\n\n for (const doc of this.documents) {\n if (filter && !filter(doc.id)) continue;\n\n let docScore = 0;\n for (const qTerm of qTokens) {\n let tf = 0;\n for (const t of doc.tokens) {\n if (t === qTerm) tf++;\n }\n if (tf === 0) continue;\n\n const dfVal = this.df[qTerm] ?? 0;\n if (dfVal === 0) continue;\n\n const idf = Math.log((this.N - dfVal + 0.5) / (dfVal + 0.5) + 1);\n const lenRatio = B * (doc.len / this.safeAvgLen);\n const tfComponent = (tf * (K1 + 1)) / (tf + K1 * (1 - B + lenRatio));\n\n docScore += idf * tfComponent;\n }\n\n if (docScore > 0) results.push({ id: doc.id, score: docScore });\n }\n\n return results;\n }\n\n getDoc(id: number): Bm25Doc | undefined {\n return this.documents.find((d) => d.id === id);\n }\n\n extractSnippet(docId: number, queryTokens: string[], radius = 40): string {\n const doc = this.getDoc(docId);\n if (!doc) return '';\n\n for (const tok of queryTokens) {\n const idx = doc.raw.toLowerCase().indexOf(tok);\n if (idx !== -1) {\n const start = Math.max(0, idx - radius);\n const end = Math.min(doc.raw.length, idx + tok.length + radius);\n const excerpt = doc.raw.slice(start, end);\n const ellipsis = '\\u2026';\n return (start > 0 ? ellipsis : '') + excerpt + (end < doc.raw.length ? ellipsis : '');\n }\n }\n return doc.raw.slice(0, radius * 2) + (doc.raw.length > radius * 2 ? '\\u2026' : '');\n }\n}\n","/**\n * `codebase-search` tool — search the symbol index with BM25 ranking.\n *\n * Usage: codebase-search({\n * query: string, // search terms\n * kind?: string, // class|function|interface|method|const|...\n * lang?: string, // ts|tsx|js|jsx|go|py|rs\n * file?: string, // filter to a specific file path (substring match)\n * limit?: number, // max results (default 20, max 100)\n * })\n *\n * Returns: [{ name, kind, lang, file, line, signature, snippet, score }, ...]\n */\n\nimport type { Tool } from '@wrongstack/core';\nimport { IndexStore } from './writer.js';\nimport { buildBm25Index, buildIndexableText, tokenise } from './bm25.js';\nimport type { SearchResult, SymbolKind, SymbolLang } from './schema.js';\n\nexport const codebaseSearchTool: Tool<CodebaseSearchInput, CodebaseSearchOutput> = {\n name: 'codebase-search',\n category: 'Project',\n description:\n 'Search indexed code symbols by name, signature, or doc comment. Uses BM25 ranking for relevance.',\n usageHint:\n 'Pass `query` for keyword search. Filter with `kind` (class/function/interface/etc), `lang` (ts/js/etc), `file` (substring). `limit` caps results (default 20).',\n permission: 'auto',\n mutating: false,\n timeoutMs: 10_000,\n inputSchema: {\n type: 'object',\n properties: {\n query: {\n type: 'string',\n description: 'Search query — searches symbol names, signatures, and doc comments',\n },\n kind: {\n type: 'string',\n description: 'Filter by symbol kind: class, function, interface, method, const, let, var, property, type, enum',\n },\n lang: {\n type: 'string',\n description: 'Filter by language: ts, tsx, js, jsx',\n },\n lspKind: {\n type: 'integer',\n description: 'Filter by LSP SymbolKind number (e.g. 5=Class, 12=Function, 11=Interface, 10=Enum)',\n },\n file: {\n type: 'string',\n description: 'Filter to files matching this path substring',\n },\n limit: {\n type: 'integer',\n description: 'Maximum results to return (default 20, max 100)',\n minimum: 1,\n maximum: 100,\n },\n },\n required: ['query'],\n },\n async execute(input, ctx) {\n const store = new IndexStore(ctx.projectRoot);\n try {\n const limit = Math.min(input.limit ?? 20, 100);\n\n // 1. Get initial candidates from SQLite (broad filter)\n const candidates = store.search(input.query, {\n kind: input.kind as SymbolKind | undefined,\n lang: input.lang as SymbolLang | undefined,\n file: input.file,\n lspKind: input.lspKind,\n });\n\n if (candidates.length === 0) {\n return { results: [], total: 0, query: input.query };\n }\n\n // 2. Build BM25 index over candidates\n // Use buildIndexableText to split camelCase names so queries like\n // \"complex\" match \"complexOperation\" (split → \"complex Operation\")\n const indexable = candidates.map((c) => ({\n id: c.id,\n text: buildIndexableText(c.name, c.signature, c.docComment),\n }));\n const bm25 = buildBm25Index(indexable);\n\n // 3. Score and rank\n const scored = bm25.score(input.query, (id) => candidates.some((c) => c.id === id));\n\n // 4. Sort descending by score and take top N\n scored.sort((a, b) => b.score - a.score);\n const top = scored.slice(0, limit);\n\n const qTokens = tokenise(input.query);\n\n const results: SearchResult[] = top.map(({ id, score }) => {\n const c = candidates.find((c) => c.id === id)!;\n const snippet = bm25.extractSnippet(id, qTokens);\n return {\n ...c,\n score,\n snippet,\n };\n });\n\n return {\n results,\n total: candidates.length,\n query: input.query,\n };\n } finally {\n store.close();\n }\n },\n};\n\n// ─── Types ─────────────────────────────────────────────────────────────────────\n\ninterface CodebaseSearchInput {\n query: string;\n kind?: string;\n lang?: string;\n file?: string;\n limit?: number;\n lspKind?: number;\n}\n\ninterface CodebaseSearchOutput {\n results: SearchResult[];\n total: number; // total candidates before limit\n query: string;\n}\n","/**\n * `codebase-stats` tool — report index health and statistics.\n *\n * Usage: codebase-stats({})\n *\n * Returns: { totalSymbols, totalFiles, byLang, byKind, lastIndexed, sizeBytes, version }\n */\n\nimport type { Tool } from '@wrongstack/core';\nimport { IndexStore } from './writer.js';\n\nexport const codebaseStatsTool: Tool<Record<string, never>, CodebaseStatsOutput> = {\n name: 'codebase-stats',\n category: 'Project',\n description: 'Return statistics about the symbol index: total symbols, files, breakdown by language and kind, index size, and last update time.',\n usageHint: 'No arguments needed. Use to check if the index is stale or healthy before running a search.',\n permission: 'auto',\n mutating: false,\n timeoutMs: 5_000,\n inputSchema: {\n type: 'object',\n properties: {},\n additionalProperties: false,\n },\n async execute(_input, ctx) {\n const store = new IndexStore(ctx.projectRoot);\n try {\n const stats = store.getStats();\n return {\n totalSymbols: stats.totalSymbols,\n totalFiles: stats.totalFiles,\n byLang: stats.byLang,\n byKind: stats.byKind,\n lastIndexed: stats.lastIndexed,\n sizeBytes: stats.sizeBytes,\n indexPath: stats.indexPath,\n version: stats.version,\n };\n } finally {\n store.close();\n }\n },\n};\n\ninterface CodebaseStatsOutput {\n totalSymbols: number;\n totalFiles: number;\n byLang: Record<string, number>;\n byKind: Record<string, number>;\n lastIndexed: number | null;\n sizeBytes: number;\n indexPath: string;\n version: number;\n}"]}