diff --git a/packages/core/src/indexer/utils/documents.ts b/packages/core/src/indexer/utils/documents.ts index 5b1e1a3..822e11c 100644 --- a/packages/core/src/indexer/utils/documents.ts +++ b/packages/core/src/indexer/utils/documents.ts @@ -39,6 +39,8 @@ export function prepareDocumentsForEmbedding(documents: Document[]): EmbeddingDo exported: doc.metadata.exported, signature: doc.metadata.signature, docstring: doc.metadata.docstring, + snippet: doc.metadata.snippet, + imports: doc.metadata.imports, }, })); } @@ -72,6 +74,8 @@ export function prepareDocumentForEmbedding(doc: Document): EmbeddingDocument { exported: doc.metadata.exported, signature: doc.metadata.signature, docstring: doc.metadata.docstring, + snippet: doc.metadata.snippet, + imports: doc.metadata.imports, }, }; } diff --git a/packages/core/src/vector/store.ts b/packages/core/src/vector/store.ts index 6485440..167bbb7 100644 --- a/packages/core/src/vector/store.ts +++ b/packages/core/src/vector/store.ts @@ -1,6 +1,12 @@ import type { Connection, Table } from '@lancedb/lancedb'; import * as lancedb from '@lancedb/lancedb'; -import type { EmbeddingDocument, SearchOptions, SearchResult, VectorStore } from './types'; +import type { + EmbeddingDocument, + SearchOptions, + SearchResult, + SearchResultMetadata, + VectorStore, +} from './types'; /** * Vector store implementation using LanceDB @@ -119,7 +125,7 @@ export class LanceDBVectorStore implements VectorStore { return { id: result.id as string, score, - metadata: JSON.parse(result.metadata as string) as Record, + metadata: JSON.parse(result.metadata as string) as SearchResultMetadata, }; }) .filter((result) => result.score >= scoreThreshold); diff --git a/packages/core/src/vector/types.ts b/packages/core/src/vector/types.ts index dc5994e..f22468f 100644 --- a/packages/core/src/vector/types.ts +++ b/packages/core/src/vector/types.ts @@ -2,6 +2,8 @@ * Vector storage and embedding types */ +import type { DocumentType } from '../scanner/types'; + /** * Document to be embedded and stored */ @@ -11,13 +13,37 @@ export interface EmbeddingDocument { metadata: Record; } +/** + * Metadata stored in search results + * Maps from DocumentMetadata with 'file' renamed to 'path' for convenience + * + * This interface provides type hints for common fields while allowing + * additional custom fields for different use cases (e.g., GitHub indexer). + */ +export interface SearchResultMetadata { + // Core fields (present in code search results) + path?: string; // File path (mapped from DocumentMetadata.file) + type?: DocumentType | string; // Type of code element (or custom type) + language?: string; // Programming language + name?: string; // Symbol name + startLine?: number; // Start line number + endLine?: number; // End line number + exported?: boolean; // Is it a public API? + signature?: string; // Full signature + docstring?: string; // Documentation comment + snippet?: string; // Actual code content (truncated if large) + imports?: string[]; // File-level imports (module specifiers) + // Allow additional custom fields for extensibility (e.g., GitHub indexer uses 'document') + [key: string]: unknown; +} + /** * Search result from vector store */ export interface SearchResult { id: string; score: number; // Cosine similarity score (0-1) - metadata: Record; + metadata: SearchResultMetadata; } /**