import type { SemanticLayerQueryInput, SemanticLayerSource } from './types.js'; export interface KtxConnectionInfo { id: string; name: string; connectionType: string; } export interface KtxQueryResult { headers?: string[]; rows?: unknown[][]; totalRows?: number; } export interface SlConnectionCatalogPort { listEnabledConnections(ids: string[]): Promise; getConnectionById(connectionId: string): Promise; executeQuery(connectionId: string, sql: string): Promise; } export interface SlPythonPort { validateSources(input: { sources: SemanticLayerSource[]; dialect: string; recently_touched?: string[]; }): Promise<{ data?: { errors?: string[]; warnings?: string[]; per_source_warnings?: Record } | null; error?: unknown; }>; query(input: { sources: SemanticLayerSource[]; query: SemanticLayerQueryInput; dialect: string; }): Promise<{ data?: { sql?: string; plan?: Record } | null; error?: unknown }>; } export interface SlSourcesIndexPort { upsertSources( connectionId: string, sources: Array<{ sourceName: string; searchText: string; embedding: number[] | null; contentHash?: string | null }>, ): Promise; getExistingSearchTexts(connectionId: string): Promise>; deleteStale(connectionId: string, keepNames: string[]): Promise; deleteByConnection(connectionId: string): Promise; deleteByConnectionAndName(connectionId: string, sourceName: string): Promise; search( connectionId: string, queryEmbedding: number[] | null, queryText: string, limit: number, minRrfScore?: number, ): Promise>; }