@deepagents/text2sql 0.10.0 → 0.10.1

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.
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/lib/adapters/groundings/context.ts", "../../../../src/lib/adapters/adapter.ts", "../../../../src/lib/adapters/groundings/abstract.grounding.ts", "../../../../src/lib/adapters/groundings/column-stats.grounding.ts", "../../../../src/lib/adapters/groundings/info.grounding.ts", "../../../../src/lib/adapters/groundings/column-values.grounding.ts", "../../../../src/lib/adapters/groundings/report.grounding.ts", "../../../../src/lib/adapters/groundings/row-count.grounding.ts", "../../../../src/lib/adapters/groundings/table.grounding.ts", "../../../../src/lib/adapters/sqlite/column-stats.sqlite.grounding.ts", "../../../../src/lib/adapters/sqlite/info.sqlite.grounding.ts", "../../../../src/lib/adapters/sqlite/column-values.sqlite.grounding.ts", "../../../../src/lib/adapters/sqlite/row-count.sqlite.grounding.ts", "../../../../src/lib/adapters/sqlite/sqlite.ts", "../../../../src/lib/adapters/sqlite/table.sqlite.grounding.ts", "../../../../src/lib/adapters/sqlite/index.ts", "../../../../src/lib/adapters/spreadsheet/spreadsheet.ts", "../../../../src/lib/adapters/spreadsheet/parser.ts"],
4
+ "sourcesContent": ["import type { AdapterInfo, ColumnStats, Relationship, Table } from '../adapter.ts';\nimport type { View } from './view.grounding.ts';\n\n/**\n * Column type for grounding operations.\n * Common interface between Table.columns and View.columns.\n */\nexport interface Column {\n name: string;\n type: string;\n kind?: 'LowCardinality' | 'Enum';\n values?: string[];\n stats?: ColumnStats;\n}\n\n/**\n * Entity with columns (Table or View).\n */\nexport interface ColumnContainer {\n name: string;\n columns: Column[];\n}\n\n/**\n * Shared context object passed to all groundings.\n * Groundings read from and write to this context.\n */\nexport interface GroundingContext {\n /** Tables discovered by TableGrounding */\n tables: Table[];\n\n /** Views discovered by ViewGrounding */\n views: View[];\n\n /** Relationships discovered by TableGrounding */\n relationships: Relationship[];\n\n /** Database info collected by InfoGrounding */\n info?: AdapterInfo;\n\n /** Business context report generated by ReportGrounding */\n report?: string;\n}\n\n/**\n * Create a new empty grounding context.\n */\nexport function createGroundingContext(): GroundingContext {\n return {\n tables: [],\n views: [],\n relationships: [],\n info: undefined,\n };\n}\n", "import type { AbstractGrounding } from './groundings/abstract.grounding.ts';\nimport { createGroundingContext } from './groundings/context.ts';\n\n/**\n * Filter type for view/table names.\n * - string[]: explicit list of view names\n * - RegExp: pattern to match view names\n * - function: predicate to filter view names\n */\nexport type Filter = string[] | RegExp | ((viewName: string) => boolean);\n\nexport interface Table {\n name: string;\n schema?: string;\n rawName?: string;\n columns: {\n name: string;\n type: string;\n kind?: 'LowCardinality' | 'Enum';\n values?: string[];\n isIndexed?: boolean;\n stats?: ColumnStats;\n }[];\n rowCount?: number;\n sizeHint?: 'tiny' | 'small' | 'medium' | 'large' | 'huge';\n indexes?: TableIndex[];\n constraints?: TableConstraint[];\n}\n\nexport interface TableIndex {\n name: string;\n columns: string[];\n unique?: boolean;\n type?: string;\n}\n\nexport interface TableConstraint {\n name: string;\n type:\n | 'CHECK'\n | 'UNIQUE'\n | 'NOT_NULL'\n | 'DEFAULT'\n | 'PRIMARY_KEY'\n | 'FOREIGN_KEY';\n columns?: string[];\n definition?: string;\n defaultValue?: string;\n referencedTable?: string;\n referencedColumns?: string[];\n}\n\nexport interface ColumnStats {\n min?: string;\n max?: string;\n nullFraction?: number;\n}\n\nexport type Relationship = {\n table: string;\n from: string[];\n referenced_table: string;\n to: string[];\n};\n\nexport type TablesFilter = string[] | RegExp;\n\nexport interface Introspection {\n tables: Table[];\n relationships: Relationship[];\n}\n\nexport interface AdapterInfo {\n dialect: string;\n version?: string;\n database?: string;\n details?: Record<string, unknown>;\n}\n\nexport type AdapterInfoProvider =\n | AdapterInfo\n | (() => Promise<AdapterInfo> | AdapterInfo);\n\nexport type IntrospectionPhase =\n | 'tables'\n | 'row_counts'\n | 'primary_keys'\n | 'indexes'\n | 'column_stats'\n | 'low_cardinality'\n | 'relationships';\n\nexport interface IntrospectionProgress {\n phase: IntrospectionPhase;\n message: string;\n current?: number;\n total?: number;\n}\n\nexport type OnProgress = (progress: IntrospectionProgress) => void;\n\nexport interface IntrospectOptions {\n onProgress?: OnProgress;\n}\n\nexport type GroundingFn = (adapter: Adapter) => AbstractGrounding;\n\nexport type ExecuteFunction = (sql: string) => Promise<any> | any;\nexport type ValidateFunction = (\n sql: string,\n) => Promise<string | void> | string | void;\n\nexport abstract class Adapter {\n abstract grounding: GroundingFn[];\n\n /**\n * Default schema name for this database.\n * PostgreSQL: 'public', SQL Server: 'dbo', SQLite: undefined\n */\n abstract readonly defaultSchema: string | undefined;\n\n /**\n * System schemas to exclude from introspection by default.\n */\n abstract readonly systemSchemas: string[];\n\n async introspect(ctx = createGroundingContext()) {\n const lines: { tag: string; fn: () => string | null }[] = [];\n for (const fn of this.grounding) {\n const grounding = fn(this);\n lines.push({\n tag: grounding.tag,\n fn: await grounding.execute(ctx),\n });\n }\n return lines\n .map(({ fn, tag }) => {\n const description = fn();\n if (description === null) {\n return '';\n }\n return `<${tag}>\\n${description}\\n</${tag}>`;\n })\n .join('\\n');\n }\n abstract execute(sql: string): Promise<any[]> | any[];\n abstract validate(sql: string): Promise<string | void> | string | void;\n abstract runQuery<Row>(sql: string): Promise<Row[]> | Row[];\n\n /**\n * Quote an identifier (table/column name) for safe use in SQL.\n * Each database uses different quoting styles.\n */\n abstract quoteIdentifier(name: string): string;\n\n /**\n * Escape a string value for safe use in SQL.\n * Each database escapes different characters.\n */\n abstract escape(value: string): string;\n\n /**\n * Build a SELECT query to sample rows from a table.\n * Each database uses different syntax for limiting rows (LIMIT vs TOP).\n */\n abstract buildSampleRowsQuery(\n tableName: string,\n columns: string[] | undefined,\n limit: number,\n ): string;\n\n /**\n * Convert unknown database value to number.\n * Handles number, bigint, and string types.\n */\n toNumber(value: unknown): number | undefined {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value;\n }\n if (typeof value === 'bigint') {\n return Number(value);\n }\n if (typeof value === 'string' && value.trim() !== '') {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : undefined;\n }\n return undefined;\n }\n\n /**\n * Parse a potentially qualified table name into schema and table parts.\n */\n parseTableName(name: string): { schema: string; table: string } {\n if (name.includes('.')) {\n const [schema, ...rest] = name.split('.');\n return { schema, table: rest.join('.') };\n }\n return { schema: this.defaultSchema ?? '', table: name };\n }\n\n /**\n * Escape a string value for use in SQL string literals (single quotes).\n * Used in WHERE clauses like: WHERE name = '${escapeString(value)}'\n */\n escapeString(value: string): string {\n return value.replace(/'/g, \"''\");\n }\n\n /**\n * Build a SQL filter clause to include/exclude schemas.\n * @param columnName - The schema column name (e.g., 'TABLE_SCHEMA')\n * @param allowedSchemas - If provided, filter to these schemas only\n */\n buildSchemaFilter(columnName: string, allowedSchemas?: string[]): string {\n if (allowedSchemas && allowedSchemas.length > 0) {\n const values = allowedSchemas\n .map((s) => `'${this.escapeString(s)}'`)\n .join(', ');\n return `AND ${columnName} IN (${values})`;\n }\n if (this.systemSchemas.length > 0) {\n const values = this.systemSchemas\n .map((s) => `'${this.escapeString(s)}'`)\n .join(', ');\n return `AND ${columnName} NOT IN (${values})`;\n }\n return '';\n }\n}\n\nexport function filterTablesByName<T extends { name: string }>(\n tables: T[],\n filter: TablesFilter | undefined,\n): T[] {\n if (!filter) return tables;\n return tables.filter((table) => matchesFilter(table.name, filter));\n}\n\nexport function filterRelationshipsByTables(\n relationships: Relationship[],\n tableNames: Set<string> | undefined,\n): Relationship[] {\n if (tableNames === undefined) {\n return relationships;\n }\n if (tableNames.size === 0) {\n return [];\n }\n return relationships.filter(\n (it) => tableNames.has(it.table) || tableNames.has(it.referenced_table),\n );\n}\n\nexport function applyTablesFilter(\n tables: Table[],\n relationships: Relationship[],\n filter: TablesFilter | undefined,\n): { tables: Table[]; relationships: Relationship[] } {\n if (!filter) {\n return { tables, relationships };\n }\n\n const allowedNames = new Set(\n getTablesWithRelated(tables, relationships, filter),\n );\n\n return {\n tables: tables.filter((table) => allowedNames.has(table.name)),\n relationships: filterRelationshipsByTables(relationships, allowedNames),\n };\n}\n\nexport function matchesFilter(\n tableName: string,\n filter: TablesFilter,\n): boolean {\n if (Array.isArray(filter)) {\n return filter.includes(tableName);\n }\n return filter.test(tableName);\n}\n\nexport function getTablesWithRelated(\n allTables: Table[],\n relationships: Relationship[],\n filter: TablesFilter,\n): string[] {\n const matchedTables = filterTablesByName(allTables, filter).map(\n (it) => it.name,\n );\n\n if (matchedTables.length === 0) {\n return [];\n }\n\n const adjacency = new Map<string, Set<string>>();\n\n for (const rel of relationships) {\n if (!adjacency.has(rel.table)) {\n adjacency.set(rel.table, new Set());\n }\n if (!adjacency.has(rel.referenced_table)) {\n adjacency.set(rel.referenced_table, new Set());\n }\n adjacency.get(rel.table)!.add(rel.referenced_table);\n adjacency.get(rel.referenced_table)!.add(rel.table);\n }\n\n const result = new Set<string>(matchedTables);\n const queue = [...matchedTables];\n\n while (queue.length > 0) {\n const current = queue.shift()!;\n const neighbors = adjacency.get(current);\n\n if (!neighbors) {\n continue;\n }\n\n for (const neighbor of neighbors) {\n if (!result.has(neighbor)) {\n result.add(neighbor);\n queue.push(neighbor);\n }\n }\n }\n\n return Array.from(result);\n}\n", "import type { Adapter } from '../adapter.ts';\nimport type { GroundingContext } from './context.ts';\n\n/**\n * Filter type for table names.\n * - string[]: explicit list of table names\n * - RegExp: pattern to match table names\n * - function: predicate to filter table names\n */\nexport type Filter = string[] | RegExp | ((tableName: string) => boolean);\n\nexport interface AdapterInfo {\n dialect: string;\n version?: string;\n database?: string;\n details?: Record<string, unknown>;\n}\nexport type AdapterInfoProvider =\n | AdapterInfo\n | (() => Promise<AdapterInfo> | AdapterInfo);\n\nexport abstract class AbstractGrounding {\n tag: string;\n constructor(tag: string) {\n this.tag = tag;\n }\n\n abstract execute(ctx: GroundingContext): Promise<() => string | null>;\n}\n\nclass SampleDataGrounding {\n // this will fetch sample data for tables matching the filter\n}\n\nclass FunctionGrounding {\n #filter: Filter;\n #adapter: Adapter;\n constructor(adapter: Adapter, filter: Filter) {\n this.#filter = filter;\n this.#adapter = adapter;\n }\n}\n", "import type { ColumnStats } from '../adapter.ts';\nimport { AbstractGrounding } from './abstract.grounding.ts';\nimport type { Column, ColumnContainer, GroundingContext } from './context.ts';\n\n/**\n * Configuration for ColumnStatsGrounding.\n */\nexport interface ColumnStatsGroundingConfig {\n // Future: filter which tables/columns to collect stats for\n}\n\n/**\n * Abstract base class for column statistics grounding.\n *\n * Reads tables and views from the context and annotates their columns\n * with statistics (min, max, nullFraction).\n *\n * Subclasses implement database-specific hooks:\n * - `collectStats()` - collect min/max/nullFraction for a column\n */\nexport abstract class ColumnStatsGrounding extends AbstractGrounding {\n constructor(config: ColumnStatsGroundingConfig = {}) {\n super('column_stats');\n }\n\n /**\n * Collect min/max/nullFraction statistics for a column.\n * Return undefined to skip this column.\n */\n protected abstract collectStats(\n tableName: string,\n column: Column,\n ): Promise<ColumnStats | undefined>;\n\n /**\n * Execute the grounding process.\n * Annotates columns in ctx.tables and ctx.views with statistics.\n */\n async execute(ctx: GroundingContext) {\n // Process both tables and views\n const allContainers: ColumnContainer[] = [...ctx.tables, ...ctx.views];\n for (const container of allContainers) {\n for (const column of container.columns) {\n // Collect min/max/nullFraction\n try {\n const stats = await this.collectStats(container.name, column);\n if (stats) {\n column.stats = stats;\n }\n } catch (error) {\n // Skip on error\n console.warn(\n 'Error collecting stats for',\n container.name,\n column.name,\n error,\n );\n }\n }\n }\n return () => this.#describe();\n }\n\n #describe() {\n return null;\n }\n}\n", "import type { AdapterInfo } from '../adapter.ts';\nimport { AbstractGrounding } from './abstract.grounding.ts';\nimport type { GroundingContext } from './context.ts';\n\n/**\n * Configuration for InfoGrounding.\n */\nexport interface InfoGroundingConfig {\n // Future: options to control what info to collect\n}\n\n/**\n * Abstract base class for database info grounding.\n *\n * Collects database dialect, version, and connection info.\n *\n * Subclasses implement the database-specific hook:\n * - `collectInfo()` - collect database info\n */\nexport abstract class InfoGrounding extends AbstractGrounding {\n constructor(config: InfoGroundingConfig = {}) {\n super('dialect_info');\n }\n\n /**\n * Collect database dialect, version, and other info.\n */\n protected abstract collectInfo(): Promise<AdapterInfo>;\n\n /**\n * Execute the grounding process.\n * Writes database info to ctx.info.\n */\n async execute(ctx: GroundingContext) {\n ctx.info = await this.collectInfo();\n const lines = [`Dialect: ${ctx.info.dialect ?? 'unknown'}`];\n if (ctx.info.version) {\n lines.push(`Version: ${ctx.info.version}`);\n }\n if (ctx.info.database) {\n lines.push(`Database: ${ctx.info.database}`);\n }\n if (ctx.info.details && Object.keys(ctx.info.details).length) {\n lines.push(`Details: ${JSON.stringify(ctx.info.details)}`);\n }\n return () => lines.join('\\n');\n }\n}\n", "import type { Table, TableConstraint } from '../adapter.ts';\nimport { AbstractGrounding } from './abstract.grounding.ts';\nimport type { Column, ColumnContainer, GroundingContext } from './context.ts';\n\nexport type { Column, ColumnContainer };\n\n/**\n * Result of column value detection.\n */\nexport type ColumnValuesResult = {\n kind: 'Enum' | 'LowCardinality';\n values: string[];\n};\n\n/**\n * Configuration for ColumnValuesGrounding.\n */\nexport interface ColumnValuesGroundingConfig {\n /** Maximum number of distinct values to consider low cardinality (default: 20) */\n lowCardinalityLimit?: number;\n}\n\n/**\n * Abstract base class for column values grounding.\n *\n * Discovers possible values for columns from three sources (in priority order):\n * 1. Native ENUM types (PostgreSQL, MySQL) \u2192 kind: 'Enum'\n * 2. CHECK constraints with IN clauses \u2192 kind: 'Enum'\n * 3. Low cardinality data scan \u2192 kind: 'LowCardinality'\n *\n * Subclasses implement database-specific hooks:\n * - `collectEnumValues()` - get values for native ENUM columns\n * - `collectLowCardinality()` - collect distinct values via data scan\n */\nexport abstract class ColumnValuesGrounding extends AbstractGrounding {\n protected lowCardinalityLimit: number;\n\n constructor(config: ColumnValuesGroundingConfig = {}) {\n super('column_values');\n this.lowCardinalityLimit = config.lowCardinalityLimit ?? 20;\n }\n\n /**\n * Get values for native ENUM type columns.\n * Return undefined if column is not an ENUM type.\n * Default implementation returns undefined (no native ENUM support).\n */\n protected async collectEnumValues(\n _tableName: string,\n _column: Column,\n ): Promise<string[] | undefined> {\n return undefined;\n }\n\n /**\n * Collect distinct values for low cardinality columns via data scan.\n * Return undefined if column has too many distinct values.\n */\n protected abstract collectLowCardinality(\n tableName: string,\n column: Column,\n ): Promise<string[] | undefined>;\n\n /**\n * Parse CHECK constraint for enum-like IN clause.\n * Extracts values from patterns like:\n * - CHECK (status IN ('active', 'inactive'))\n * - CHECK ((status)::text = ANY (ARRAY['a'::text, 'b'::text]))\n * - CHECK (status = 'active' OR status = 'inactive')\n */\n protected parseCheckConstraint(\n constraint: TableConstraint,\n columnName: string,\n ): string[] | undefined {\n if (constraint.type !== 'CHECK' || !constraint.definition) {\n return undefined;\n }\n\n // Check if constraint applies to this column\n if (constraint.columns && !constraint.columns.includes(columnName)) {\n return undefined;\n }\n\n const def = constraint.definition;\n const escapedCol = this.escapeRegex(columnName);\n\n // Column pattern: matches column name with optional parens and type cast\n // e.g., \"status\", \"(status)\", \"((status)::text)\"\n const colPattern = `(?:\\\\(?\\\\(?${escapedCol}\\\\)?(?:::(?:text|varchar|character varying))?\\\\)?)`;\n\n // Pattern 1: column IN ('val1', 'val2', ...)\n const inMatch = def.match(\n new RegExp(`${colPattern}\\\\s+IN\\\\s*\\\\(([^)]+)\\\\)`, 'i'),\n );\n if (inMatch) {\n return this.extractStringValues(inMatch[1]);\n }\n\n // Pattern 2: PostgreSQL ANY(ARRAY[...])\n const anyMatch = def.match(\n new RegExp(\n `${colPattern}\\\\s*=\\\\s*ANY\\\\s*\\\\(\\\\s*(?:ARRAY)?\\\\s*\\\\[([^\\\\]]+)\\\\]`,\n 'i',\n ),\n );\n if (anyMatch) {\n return this.extractStringValues(anyMatch[1]);\n }\n\n // Pattern 3: column = 'val1' OR column = 'val2' ...\n const orPattern = new RegExp(\n `\\\\b${this.escapeRegex(columnName)}\\\\b\\\\s*=\\\\s*'([^']*)'`,\n 'gi',\n );\n const orMatches = [...def.matchAll(orPattern)];\n if (orMatches.length >= 2) {\n return orMatches.map((m) => m[1]);\n }\n\n return undefined;\n }\n\n /**\n * Extract string values from a comma-separated list.\n */\n private extractStringValues(input: string): string[] | undefined {\n const values: string[] = [];\n // Match quoted strings: 'value' or 'value'::type\n const matches = input.matchAll(/'([^']*)'/g);\n for (const match of matches) {\n values.push(match[1]);\n }\n return values.length > 0 ? values : undefined;\n }\n\n /**\n * Escape special regex characters in a string.\n */\n private escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n }\n\n /**\n * Get the table from context by name.\n */\n private getTable(ctx: GroundingContext, name: string): Table | undefined {\n return ctx.tables.find((t) => t.name === name);\n }\n\n /**\n * Execute the grounding process.\n * Annotates columns in ctx.tables and ctx.views with values.\n */\n async execute(ctx: GroundingContext) {\n // Process both tables and views\n const allContainers: ColumnContainer[] = [...ctx.tables, ...ctx.views];\n\n for (const container of allContainers) {\n const table = this.getTable(ctx, container.name);\n\n for (const column of container.columns) {\n try {\n const result = await this.resolveColumnValues(\n container.name,\n column,\n table?.constraints,\n );\n if (result) {\n column.kind = result.kind;\n column.values = result.values;\n }\n } catch (error) {\n console.warn(\n 'Error collecting column values for',\n container.name,\n column.name,\n error,\n );\n }\n }\n }\n\n return () => this.#describe();\n }\n\n /**\n * Resolve column values from all sources in priority order.\n */\n private async resolveColumnValues(\n tableName: string,\n column: Column,\n constraints?: TableConstraint[],\n ): Promise<ColumnValuesResult | undefined> {\n // Priority 1: Native ENUM type\n const enumValues = await this.collectEnumValues(tableName, column);\n if (enumValues?.length) {\n return { kind: 'Enum', values: enumValues };\n }\n\n // Priority 2: CHECK constraint with IN clause\n if (constraints) {\n for (const constraint of constraints) {\n const checkValues = this.parseCheckConstraint(constraint, column.name);\n if (checkValues?.length) {\n return { kind: 'Enum', values: checkValues };\n }\n }\n }\n\n // Priority 3: Low cardinality data scan\n const lowCardValues = await this.collectLowCardinality(tableName, column);\n if (lowCardValues?.length) {\n return { kind: 'LowCardinality', values: lowCardValues };\n }\n\n return undefined;\n }\n\n #describe() {\n return null;\n }\n}\n", "import { groq } from '@ai-sdk/groq';\nimport { tool } from 'ai';\nimport dedent from 'dedent';\nimport z from 'zod';\n\nimport {\n type AgentModel,\n agent,\n generate,\n toState,\n user,\n} from '@deepagents/agent';\n\nimport type { Adapter } from '../adapter.ts';\nimport { AbstractGrounding } from './abstract.grounding.ts';\nimport type { GroundingContext } from './context.ts';\n\n/**\n * Cache interface for storing generated reports.\n */\nexport interface ReportCache {\n get(): Promise<string | null>;\n set(value: string): Promise<void>;\n}\n\n/**\n * Configuration for ReportGrounding.\n */\nexport interface ReportGroundingConfig {\n /** LLM model to use for generating the report */\n model?: AgentModel;\n /** Optional cache for storing generated reports */\n cache?: ReportCache;\n /** Force regeneration even if cached */\n forceRefresh?: boolean;\n}\n\nconst reportAgent = agent<unknown, { adapter: Adapter }>({\n name: 'db-report-agent',\n model: groq('openai/gpt-oss-20b'),\n prompt: () => dedent`\n <identity>\n You are a database analyst expert. Your job is to understand what\n a database represents and provide business context about it.\n You have READ-ONLY access to the database.\n </identity>\n\n <instructions>\n Write a business context that helps another agent answer questions accurately.\n\n For EACH table, do queries ONE AT A TIME:\n 1. SELECT COUNT(*) to get row count\n 2. SELECT * LIMIT 3 to see sample data\n\n Then write a report with:\n - What business this database is for\n - For each table: purpose, row count, and example of what the data looks like\n\n Include concrete examples like \"Track prices are $0.99\",\n \"Customer names like 'Lu\u00EDs Gon\u00E7alves'\", etc.\n\n Keep it 400-600 words, conversational style.\n </instructions>\n `,\n tools: {\n query_database: tool({\n description:\n 'Execute a SELECT query to explore the database and gather insights.',\n inputSchema: z.object({\n sql: z.string().describe('The SELECT query to execute'),\n purpose: z\n .string()\n .describe('What insight you are trying to gather with this query'),\n }),\n execute: ({ sql }, options) => {\n const state = toState<{ adapter: Adapter }>(options);\n return state.adapter.execute(sql);\n },\n }),\n },\n});\n\n/**\n * Grounding that generates a business context report about the database.\n *\n * Uses an LLM agent to:\n * 1. Query COUNT(*) for each table\n * 2. Query SELECT * LIMIT 3 for sample data\n * 3. Generate a 400-600 word business context report\n *\n * The report helps downstream agents understand what the database represents.\n */\nexport class ReportGrounding extends AbstractGrounding {\n #adapter: Adapter;\n #model: AgentModel;\n #cache?: ReportCache;\n #forceRefresh: boolean;\n\n constructor(adapter: Adapter, config: ReportGroundingConfig = {}) {\n super('business_context');\n this.#adapter = adapter;\n this.#model = config.model ?? groq('openai/gpt-oss-20b');\n this.#cache = config.cache;\n this.#forceRefresh = config.forceRefresh ?? false;\n }\n\n async execute(ctx: GroundingContext): Promise<() => string | null> {\n // Check cache first (unless forcing refresh)\n if (!this.#forceRefresh && this.#cache) {\n const cached = await this.#cache.get();\n if (cached) {\n ctx.report = cached;\n return () => cached;\n }\n }\n\n // Generate report using LLM\n const report = await this.#generateReport();\n ctx.report = report;\n\n // Cache the result\n if (this.#cache) {\n await this.#cache.set(report);\n }\n\n return () => report;\n }\n\n async #generateReport(): Promise<string> {\n const { text } = await generate(\n reportAgent.clone({ model: this.#model }),\n [\n user(\n 'Please analyze the database and write a contextual report about what this database represents.',\n ),\n ],\n { adapter: this.#adapter },\n );\n\n return text;\n }\n}\n", "import type { Table } from '../adapter.ts';\nimport { AbstractGrounding } from './abstract.grounding.ts';\nimport type { GroundingContext } from './context.ts';\n\n/**\n * Configuration for RowCountGrounding.\n */\nexport interface RowCountGroundingConfig {\n // Future: filter which tables to count\n}\n\n/**\n * Abstract base class for row count grounding.\n *\n * Reads tables from the context and annotates them with row counts and size hints.\n * This grounding must run AFTER TableGrounding since it reads from ctx.tables.\n *\n * Subclasses implement the database-specific hook:\n * - `getRowCount()` - get row count for a table\n */\nexport abstract class RowCountGrounding extends AbstractGrounding {\n constructor(config: RowCountGroundingConfig = {}) {\n super('row_counts');\n }\n\n /**\n * Get row count for a specific table.\n */\n protected abstract getRowCount(\n tableName: string,\n ): Promise<number | undefined>;\n\n /**\n * Execute the grounding process.\n * Annotates tables in ctx.tables with row counts and size hints.\n */\n async execute(ctx: GroundingContext) {\n for (const table of ctx.tables) {\n const count = await this.getRowCount(table.name);\n if (count != null) {\n table.rowCount = count;\n table.sizeHint = this.#classifyRowCount(count);\n }\n }\n // Return null - TableGrounding already describes row counts in its output\n return () => null;\n }\n\n /**\n * Classify row count into a size hint category.\n */\n #classifyRowCount(count: number): Table['sizeHint'] {\n if (count < 100) return 'tiny';\n if (count < 1000) return 'small';\n if (count < 10000) return 'medium';\n if (count < 100000) return 'large';\n return 'huge';\n }\n}\n", "import pluralize from 'pluralize';\n\nimport type { Filter, Relationship, Table } from '../adapter.ts';\nimport { AbstractGrounding } from './abstract.grounding.ts';\nimport type { GroundingContext } from './context.ts';\n\n/**\n * Configuration for TableGrounding.\n */\nexport interface TableGroundingConfig {\n /** Filter to select seed tables */\n filter?: Filter;\n /**\n * Traverse forward (child\uFFFDparent) following FK direction.\n * - true: unlimited depth\n * - number: maximum depth\n * - false/undefined: no forward traversal\n */\n forward?: boolean | number;\n /**\n * Traverse backward (parent\uFFFDchild) finding tables that reference us.\n * - true: unlimited depth\n * - number: maximum depth\n * - false/undefined: no backward traversal\n */\n backward?: boolean | number;\n}\n\n/**\n * Abstract base class for table grounding.\n *\n * The `execute()` method implements a BFS traversal algorithm that discovers\n * tables and relationships. Subclasses implement the database-specific hooks:\n * - `getAllTableNames()` - list all tables\n * - `getTable()` - get table metadata\n * - `findOutgoingRelations()` - find FKs FROM a table\n * - `findIncomingRelations()` - find FKs TO a table\n */\nexport abstract class TableGrounding extends AbstractGrounding {\n #filter?: Filter;\n #forward?: boolean | number;\n #backward?: boolean | number;\n\n constructor(config: TableGroundingConfig = {}) {\n super('tables');\n this.#filter = config.filter;\n this.#forward = config.forward;\n this.#backward = config.backward;\n }\n\n /** Get all table names in the database */\n protected abstract getAllTableNames(): Promise<string[]>;\n\n /** Get full table metadata for a single table */\n protected abstract getTable(tableName: string): Promise<Table>;\n\n /** Find FKs FROM this table (outgoing relationships) */\n protected abstract findOutgoingRelations(\n tableName: string,\n ): Promise<Relationship[]>;\n\n /** Find FKs TO this table (incoming relationships) */\n protected abstract findIncomingRelations(\n tableName: string,\n ): Promise<Relationship[]>;\n\n /**\n * Execute the grounding process.\n * Writes discovered tables and relationships to the context.\n */\n async execute(ctx: GroundingContext) {\n const seedTables = await this.applyFilter();\n const forward = this.#forward;\n const backward = this.#backward;\n\n // No traversal at all - just add the seed tables\n if (!forward && !backward) {\n const tables = await Promise.all(\n seedTables.map((name) => this.getTable(name)),\n );\n ctx.tables.push(...tables);\n return () => this.#describeTables(tables);\n }\n\n const tables: Record<string, Table> = {};\n const allRelationships: Relationship[] = [];\n const seenRelationships = new Set<string>();\n\n // Track depth separately for forward/backward using BFS\n const forwardQueue: Array<{ name: string; depth: number }> = [];\n const backwardQueue: Array<{ name: string; depth: number }> = [];\n const forwardVisited = new Set<string>();\n const backwardVisited = new Set<string>();\n\n // Initialize queues with seed tables at depth 0\n for (const name of seedTables) {\n if (forward) forwardQueue.push({ name, depth: 0 });\n if (backward) backwardQueue.push({ name, depth: 0 });\n }\n\n // Process forward (child\u2192parent)\n const forwardLimit = forward === true ? Infinity : forward || 0;\n while (forwardQueue.length > 0) {\n const item = forwardQueue.shift();\n if (!item) break;\n const { name, depth } = item;\n\n if (forwardVisited.has(name)) continue;\n forwardVisited.add(name);\n\n if (!tables[name]) {\n tables[name] = await this.getTable(name);\n }\n\n if (depth < forwardLimit) {\n const rels = await this.findOutgoingRelations(name);\n for (const rel of rels) {\n this.addRelationship(rel, allRelationships, seenRelationships);\n if (!forwardVisited.has(rel.referenced_table)) {\n forwardQueue.push({ name: rel.referenced_table, depth: depth + 1 });\n }\n }\n }\n }\n\n // Process backward (parent\u2192child)\n const backwardLimit = backward === true ? Infinity : backward || 0;\n while (backwardQueue.length > 0) {\n const item = backwardQueue.shift();\n if (!item) break;\n const { name, depth } = item;\n\n if (backwardVisited.has(name)) continue;\n backwardVisited.add(name);\n\n if (!tables[name]) {\n tables[name] = await this.getTable(name);\n }\n\n if (depth < backwardLimit) {\n const rels = await this.findIncomingRelations(name);\n for (const rel of rels) {\n this.addRelationship(rel, allRelationships, seenRelationships);\n if (!backwardVisited.has(rel.table)) {\n backwardQueue.push({ name: rel.table, depth: depth + 1 });\n }\n }\n }\n }\n\n // Write to context\n const tablesList = Object.values(tables);\n ctx.tables.push(...tablesList);\n ctx.relationships.push(...allRelationships);\n return () => this.#describeTables(tablesList);\n }\n\n /**\n * Apply the filter to get seed table names.\n * If filter is an explicit array, skip querying all table names.\n */\n protected async applyFilter(): Promise<string[]> {\n const filter = this.#filter;\n if (Array.isArray(filter)) {\n return filter;\n }\n const names = await this.getAllTableNames();\n if (!filter) {\n return names;\n }\n if (filter instanceof RegExp) {\n return names.filter((name) => filter.test(name));\n }\n return names.filter(filter);\n }\n\n /**\n * Add a relationship to the collection, deduplicating by key.\n */\n protected addRelationship(\n rel: Relationship,\n all: Relationship[],\n seen: Set<string>,\n ): void {\n const key = `${rel.table}:${rel.from.join(',')}:${rel.referenced_table}:${rel.to.join(',')}`;\n if (!seen.has(key)) {\n seen.add(key);\n all.push(rel);\n }\n }\n\n #describeTables(tables: Table[]): string {\n if (!tables.length) {\n return 'Schema unavailable.';\n }\n\n return tables\n .map((table) => {\n const rowCountInfo =\n table.rowCount != null\n ? ` [rows: ${table.rowCount}${table.sizeHint ? `, size: ${table.sizeHint}` : ''}]`\n : '';\n\n // Build constraint lookup maps for column-level annotations\n const pkConstraint = table.constraints?.find(\n (c) => c.type === 'PRIMARY_KEY',\n );\n const pkColumns = new Set(pkConstraint?.columns ?? []);\n\n const notNullColumns = new Set(\n table.constraints\n ?.filter((c) => c.type === 'NOT_NULL')\n .flatMap((c) => c.columns ?? []) ?? [],\n );\n\n const defaultByColumn = new Map<string, string>();\n for (const c of table.constraints?.filter(\n (c) => c.type === 'DEFAULT',\n ) ?? []) {\n for (const col of c.columns ?? []) {\n if (c.defaultValue != null) {\n defaultByColumn.set(col, c.defaultValue);\n }\n }\n }\n\n // Single-column UNIQUE constraints\n const uniqueColumns = new Set(\n table.constraints\n ?.filter((c) => c.type === 'UNIQUE' && c.columns?.length === 1)\n .flatMap((c) => c.columns ?? []) ?? [],\n );\n\n // Foreign key lookup: column -> referenced table.column\n const fkByColumn = new Map<string, string>();\n for (const c of table.constraints?.filter(\n (c) => c.type === 'FOREIGN_KEY',\n ) ?? []) {\n const cols = c.columns ?? [];\n const refCols = c.referencedColumns ?? [];\n for (let i = 0; i < cols.length; i++) {\n const refCol = refCols[i] ?? refCols[0] ?? cols[i];\n fkByColumn.set(cols[i], `${c.referencedTable}.${refCol}`);\n }\n }\n\n const columns = table.columns\n .map((column) => {\n const annotations: string[] = [];\n const isPrimaryKey = pkColumns.has(column.name);\n if (isPrimaryKey) {\n annotations.push('PK');\n }\n if (fkByColumn.has(column.name)) {\n annotations.push(`FK -> ${fkByColumn.get(column.name)}`);\n }\n if (uniqueColumns.has(column.name)) {\n annotations.push('UNIQUE');\n }\n if (notNullColumns.has(column.name)) {\n annotations.push('NOT NULL');\n }\n if (defaultByColumn.has(column.name)) {\n annotations.push(`DEFAULT: ${defaultByColumn.get(column.name)}`);\n }\n if (column.isIndexed && !isPrimaryKey) {\n annotations.push('Indexed');\n }\n if (column.kind === 'Enum' && column.values?.length) {\n annotations.push(`Enum: ${column.values.join(', ')}`);\n } else if (\n column.kind === 'LowCardinality' &&\n column.values?.length\n ) {\n annotations.push(`LowCardinality: ${column.values.join(', ')}`);\n }\n if (column.stats) {\n const statParts: string[] = [];\n if (column.stats.min != null || column.stats.max != null) {\n const minText = column.stats.min ?? 'n/a';\n const maxText = column.stats.max ?? 'n/a';\n statParts.push(`range ${minText} \u2192 ${maxText}`);\n }\n if (\n column.stats.nullFraction != null &&\n Number.isFinite(column.stats.nullFraction)\n ) {\n const percent =\n Math.round(column.stats.nullFraction * 1000) / 10;\n statParts.push(`null\u2248${percent}%`);\n }\n if (statParts.length) {\n annotations.push(statParts.join(', '));\n }\n }\n const annotationText = annotations.length\n ? ` [${annotations.join(', ')}]`\n : '';\n return ` - ${column.name} (${column.type})${annotationText}`;\n })\n .join('\\n');\n\n // Indexes section\n const indexes = table.indexes?.length\n ? `\\n Indexes:\\n${table.indexes\n .map((index) => {\n const props: string[] = [];\n if (index.unique) {\n props.push('UNIQUE');\n }\n if (index.type) {\n props.push(index.type);\n }\n const propsText = props.length ? ` (${props.join(', ')})` : '';\n const columnsText = index.columns?.length\n ? index.columns.join(', ')\n : 'expression';\n return ` - ${index.name}${propsText}: ${columnsText}`;\n })\n .join('\\n')}`\n : '';\n\n // Multi-column UNIQUE constraints (not already shown in indexes)\n const multiColumnUniques =\n table.constraints?.filter(\n (c) => c.type === 'UNIQUE' && (c.columns?.length ?? 0) > 1,\n ) ?? [];\n const uniqueConstraints = multiColumnUniques.length\n ? `\\n Unique Constraints:\\n${multiColumnUniques\n .map((c) => ` - ${c.name}: (${c.columns?.join(', ')})`)\n .join('\\n')}`\n : '';\n\n // CHECK constraints\n const checkConstraints =\n table.constraints?.filter((c) => c.type === 'CHECK') ?? [];\n const checks = checkConstraints.length\n ? `\\n Check Constraints:\\n${checkConstraints\n .map((c) => ` - ${c.name}: ${c.definition}`)\n .join('\\n')}`\n : '';\n\n return `- Table: ${table.name}${rowCountInfo}\\n Columns:\\n${columns}${indexes}${uniqueConstraints}${checks}`;\n })\n .join('\\n\\n');\n }\n\n #formatTableLabel = (tableName: string) => {\n const base = tableName.split('.').pop() ?? tableName;\n return base.replace(/_/g, ' ');\n };\n\n #describeRelationships = (tables: Table[], relationships: Relationship[]) => {\n if (!relationships.length) {\n return 'None detected';\n }\n\n const tableMap = new Map(tables.map((table) => [table.name, table]));\n\n return relationships\n .map((relationship) => {\n const sourceLabel = this.#formatTableLabel(relationship.table);\n const targetLabel = this.#formatTableLabel(\n relationship.referenced_table,\n );\n const singularSource = pluralize.singular(sourceLabel);\n const pluralSource = pluralize.plural(sourceLabel);\n const singularTarget = pluralize.singular(targetLabel);\n const pluralTarget = pluralize.plural(targetLabel);\n const sourceTable = tableMap.get(relationship.table);\n const targetTable = tableMap.get(relationship.referenced_table);\n const sourceCount = sourceTable?.rowCount;\n const targetCount = targetTable?.rowCount;\n const ratio =\n sourceCount != null && targetCount != null && targetCount > 0\n ? sourceCount / targetCount\n : null;\n\n let cardinality = 'each';\n if (ratio != null) {\n if (ratio > 5) {\n cardinality = `many-to-one (\u2248${sourceCount} vs ${targetCount})`;\n } else if (ratio < 1.2 && ratio > 0.8) {\n cardinality = `roughly 1:1 (${sourceCount} vs ${targetCount})`;\n } else if (ratio < 0.2) {\n cardinality = `one-to-many (${sourceCount} vs ${targetCount})`;\n }\n }\n const mappings = relationship.from\n .map((fromCol, idx) => {\n const targetCol =\n relationship.to[idx] ?? relationship.to[0] ?? fromCol;\n return `${relationship.table}.${fromCol} -> ${relationship.referenced_table}.${targetCol}`;\n })\n .join(', ');\n\n return `- ${relationship.table} (${relationship.from.join(', ')}) -> ${relationship.referenced_table} (${relationship.to.join(', ')}) [${cardinality}]`;\n })\n .join('\\n');\n };\n}\n", "import type { Adapter, ColumnStats } from '../adapter.ts';\nimport {\n ColumnStatsGrounding,\n type ColumnStatsGroundingConfig,\n} from '../groundings/column-stats.grounding.ts';\nimport type { Column } from '../groundings/context.ts';\n\n/**\n * SQLite implementation of ColumnStatsGrounding.\n */\nexport class SqliteColumnStatsGrounding extends ColumnStatsGrounding {\n #adapter: Adapter;\n\n constructor(adapter: Adapter, config: ColumnStatsGroundingConfig = {}) {\n super(config);\n this.#adapter = adapter;\n }\n\n protected override async collectStats(\n tableName: string,\n column: Column,\n ): Promise<ColumnStats | undefined> {\n if (!this.#shouldCollectStats(column.type)) {\n return undefined;\n }\n\n const tableIdentifier = this.#adapter.quoteIdentifier(tableName);\n const columnIdentifier = this.#adapter.quoteIdentifier(column.name);\n\n const sql = `\n SELECT\n MIN(${columnIdentifier}) AS min_value,\n MAX(${columnIdentifier}) AS max_value,\n AVG(CASE WHEN ${columnIdentifier} IS NULL THEN 1.0 ELSE 0.0 END) AS null_fraction\n FROM ${tableIdentifier}\n `;\n\n const rows = await this.#adapter.runQuery<{\n min_value: unknown;\n max_value: unknown;\n null_fraction: number | string | null;\n }>(sql);\n\n if (!rows.length) {\n return undefined;\n }\n\n const min = this.#normalizeValue(rows[0]?.min_value);\n const max = this.#normalizeValue(rows[0]?.max_value);\n const nullFraction = this.#adapter.toNumber(rows[0]?.null_fraction);\n\n if (min == null && max == null && nullFraction == null) {\n return undefined;\n }\n\n return {\n min: min ?? undefined,\n max: max ?? undefined,\n nullFraction:\n nullFraction != null && Number.isFinite(nullFraction)\n ? Math.max(0, Math.min(1, nullFraction))\n : undefined,\n };\n }\n\n #shouldCollectStats(type: string | undefined): boolean {\n if (!type) {\n return false;\n }\n const normalized = type.toLowerCase();\n return /int|real|numeric|double|float|decimal|date|time|bool/.test(\n normalized,\n );\n }\n\n #normalizeValue(value: unknown): string | null {\n if (value === null || value === undefined) {\n return null;\n }\n if (typeof value === 'string') {\n return value;\n }\n if (typeof value === 'number' || typeof value === 'bigint') {\n return String(value);\n }\n if (typeof value === 'boolean') {\n return value ? 'true' : 'false';\n }\n if (value instanceof Date) {\n return value.toISOString();\n }\n if (typeof Buffer !== 'undefined' && Buffer.isBuffer(value)) {\n return value.toString('utf-8');\n }\n return null;\n }\n}\n", "import type { Adapter, AdapterInfo } from '../adapter.ts';\nimport {\n InfoGrounding,\n type InfoGroundingConfig,\n} from '../groundings/info.grounding.ts';\n\n/**\n * SQLite implementation of InfoGrounding.\n */\nexport class SqliteInfoGrounding extends InfoGrounding {\n #adapter: Adapter;\n\n constructor(adapter: Adapter, config: InfoGroundingConfig = {}) {\n super(config);\n this.#adapter = adapter;\n }\n\n protected override async collectInfo(): Promise<AdapterInfo> {\n const rows = await this.#adapter.runQuery<{ version: string }>(\n 'SELECT sqlite_version() AS version',\n );\n\n return {\n dialect: 'sqlite',\n version: rows[0]?.version,\n details: {\n parameterPlaceholder: '?',\n },\n };\n }\n}\n", "import type { Adapter } from '../adapter.ts';\nimport {\n type Column,\n ColumnValuesGrounding,\n type ColumnValuesGroundingConfig,\n} from '../groundings/column-values.grounding.ts';\n\n/**\n * SQLite implementation of ColumnValuesGrounding.\n *\n * Supports:\n * - CHECK constraints with IN clauses (inherited from base)\n * - Low cardinality data scan\n *\n * Note: SQLite does not have native ENUM types.\n */\nexport class SqliteColumnValuesGrounding extends ColumnValuesGrounding {\n #adapter: Adapter;\n\n constructor(adapter: Adapter, config: ColumnValuesGroundingConfig = {}) {\n super(config);\n this.#adapter = adapter;\n }\n\n protected override async collectLowCardinality(\n tableName: string,\n column: Column,\n ): Promise<string[] | undefined> {\n const tableIdentifier = this.#adapter.quoteIdentifier(tableName);\n const columnIdentifier = this.#adapter.quoteIdentifier(column.name);\n const limit = this.lowCardinalityLimit + 1;\n\n const sql = `\n SELECT DISTINCT ${columnIdentifier} AS value\n FROM ${tableIdentifier}\n WHERE ${columnIdentifier} IS NOT NULL\n LIMIT ${limit}\n `;\n\n const rows = await this.#adapter.runQuery<{ value: unknown }>(sql);\n\n if (!rows.length || rows.length > this.lowCardinalityLimit) {\n return undefined;\n }\n\n const values: string[] = [];\n for (const row of rows) {\n const formatted = this.#normalizeValue(row.value);\n if (formatted == null) {\n return undefined;\n }\n values.push(formatted);\n }\n\n return values.length ? values : undefined;\n }\n\n #normalizeValue(value: unknown): string | null {\n if (value === null || value === undefined) {\n return null;\n }\n if (typeof value === 'string') {\n return value;\n }\n if (typeof value === 'number' || typeof value === 'bigint') {\n return String(value);\n }\n if (typeof value === 'boolean') {\n return value ? 'true' : 'false';\n }\n if (value instanceof Date) {\n return value.toISOString();\n }\n if (typeof Buffer !== 'undefined' && Buffer.isBuffer(value)) {\n return value.toString('utf-8');\n }\n return null;\n }\n}\n", "import type { Adapter } from '../adapter.ts';\nimport {\n RowCountGrounding,\n type RowCountGroundingConfig,\n} from '../groundings/row-count.grounding.ts';\n\n/**\n * SQLite implementation of RowCountGrounding.\n */\nexport class SqliteRowCountGrounding extends RowCountGrounding {\n #adapter: Adapter;\n\n constructor(adapter: Adapter, config: RowCountGroundingConfig = {}) {\n super(config);\n this.#adapter = adapter;\n }\n\n protected override async getRowCount(tableName: string): Promise<number | undefined> {\n const rows = await this.#adapter.runQuery<{ count: number | string | bigint | null }>(\n `SELECT COUNT(*) as count FROM ${this.#adapter.quoteIdentifier(tableName)}`,\n );\n\n return this.#adapter.toNumber(rows[0]?.count);\n }\n}\n", "import {\n Adapter,\n type ExecuteFunction,\n type GroundingFn,\n type ValidateFunction,\n} from '../adapter.ts';\n\nconst SQL_ERROR_MAP: Array<{\n pattern: RegExp;\n type: string;\n hint: string;\n}> = [\n {\n pattern: /^no such table: .+$/,\n type: 'MISSING_TABLE',\n hint: 'Check the database schema for the correct table name. The table you referenced does not exist.',\n },\n {\n pattern: /^no such column: .+$/,\n type: 'INVALID_COLUMN',\n hint: 'Check the table schema for correct column names. The column may not exist or is ambiguous (exists in multiple joined tables).',\n },\n {\n pattern: /^ambiguous column name: .+$/,\n type: 'INVALID_COLUMN',\n hint: 'Check the table schema for correct column names. The column may not exist or is ambiguous (exists in multiple joined tables).',\n },\n {\n pattern: /^near \".+\": syntax error$/,\n type: 'SYNTAX_ERROR',\n hint: 'There is a SQL syntax error. Review the query structure, keywords, and punctuation.',\n },\n {\n pattern: /^no tables specified$/,\n type: 'SYNTAX_ERROR',\n hint: 'There is a SQL syntax error. Review the query structure, keywords, and punctuation.',\n },\n {\n pattern: /^attempt to write a readonly database$/,\n type: 'CONSTRAINT_ERROR',\n hint: 'A database constraint was violated. This should not happen with read-only queries.',\n },\n];\n\nexport type SqliteAdapterOptions = {\n execute: ExecuteFunction;\n validate?: ValidateFunction;\n grounding: GroundingFn[];\n};\n\ntype ColumnRow = {\n name: string | null | undefined;\n type: string | null | undefined;\n pk?: number | null | undefined;\n};\n\ntype IndexListRow = {\n seq?: number | null | undefined;\n name?: string | null | undefined;\n unique?: number | null | undefined;\n origin?: string | null | undefined;\n};\n\ntype IndexInfoRow = {\n seqno?: number | null | undefined;\n cid?: number | null | undefined;\n name?: string | null | undefined;\n};\ntype ForeignKeyRow = {\n id: number | null | undefined;\n table: string | null | undefined;\n from: string | null | undefined;\n to: string | null | undefined;\n};\n\nconst LOW_CARDINALITY_LIMIT = 20;\n\nexport function formatError(sql: string, error: unknown) {\n const errorMessage =\n error instanceof Error\n ? error.message\n : typeof error === 'string'\n ? error\n : 'Unknown error occurred';\n const errorInfo = SQL_ERROR_MAP.find((it) => it.pattern.test(errorMessage));\n\n if (!errorInfo) {\n return {\n error: errorMessage,\n error_type: 'UNKNOWN_ERROR',\n suggestion: 'Review the query and try again',\n sql_attempted: sql,\n };\n }\n\n return {\n error: errorMessage,\n error_type: errorInfo.type,\n suggestion: errorInfo.hint,\n sql_attempted: sql,\n };\n}\n\nexport class Sqlite extends Adapter {\n #options: SqliteAdapterOptions;\n override readonly grounding: GroundingFn[];\n override readonly defaultSchema = undefined;\n override readonly systemSchemas: string[] = [];\n\n constructor(options: SqliteAdapterOptions) {\n super();\n if (!options || typeof options.execute !== 'function') {\n throw new Error('Sqlite adapter requires an execute function.');\n }\n this.#options = options;\n this.grounding = options.grounding;\n }\n\n override async execute(sql: string) {\n return this.#options.execute(sql);\n }\n\n override async validate(sql: string) {\n const validator: ValidateFunction =\n this.#options.validate ??\n (async (text: string) => {\n await this.#options.execute(`EXPLAIN ${text}`);\n });\n\n try {\n return await validator(sql);\n } catch (error) {\n return JSON.stringify(formatError(sql, error));\n }\n }\n\n #quoteIdentifier(name: string) {\n return `'${name.replace(/'/g, \"''\")}'`;\n }\n\n override async runQuery<Row>(sql: string): Promise<Row[]> {\n const result = await this.#options.execute(sql);\n\n if (Array.isArray(result)) {\n return result as Row[];\n }\n\n if (\n result &&\n typeof result === 'object' &&\n 'rows' in result &&\n Array.isArray((result as { rows?: unknown }).rows)\n ) {\n return (result as { rows: Row[] }).rows;\n }\n\n throw new Error(\n 'Sqlite adapter execute() must return an array of rows or an object with a rows array when introspecting.',\n );\n }\n\n override quoteIdentifier(name: string): string {\n return `\"${name.replace(/\"/g, '\"\"')}\"`;\n }\n\n override escape(value: string): string {\n return value.replace(/\"/g, '\"\"');\n }\n\n override buildSampleRowsQuery(\n tableName: string,\n columns: string[] | undefined,\n limit: number,\n ): string {\n const columnList = columns?.length\n ? columns.map((c) => this.quoteIdentifier(c)).join(', ')\n : '*';\n return `SELECT ${columnList} FROM ${this.quoteIdentifier(tableName)} LIMIT ${limit}`;\n }\n}\n", "import type { Adapter, Relationship, Table } from '../adapter.ts';\nimport {\n TableGrounding,\n type TableGroundingConfig,\n} from '../groundings/table.grounding.ts';\n\ntype ColumnRow = {\n name: string | null | undefined;\n type: string | null | undefined;\n pk?: number | null | undefined;\n};\n\ntype ForeignKeyRow = {\n id: number | null | undefined;\n table: string | null | undefined;\n from: string | null | undefined;\n to: string | null | undefined;\n};\n\n/**\n * SQLite implementation of TableGrounding.\n *\n * SQLite requires caching all relationships for backward lookups because\n * PRAGMA foreign_key_list only returns outgoing FKs from a specific table.\n */\nexport class SqliteTableGrounding extends TableGrounding {\n #adapter: Adapter;\n #relationshipCache: Relationship[] | null = null;\n\n constructor(adapter: Adapter, config: TableGroundingConfig = {}) {\n super(config);\n this.#adapter = adapter;\n }\n\n protected override async getAllTableNames(): Promise<string[]> {\n const rows = await this.#adapter.runQuery<{\n name: string | null | undefined;\n }>(`SELECT name FROM sqlite_master WHERE type='table' ORDER BY name`);\n\n return rows\n .map((row) => row.name)\n .filter(\n (name): name is string =>\n typeof name === 'string' && !name.startsWith('sqlite_'),\n );\n }\n\n protected override async getTable(tableName: string): Promise<Table> {\n const columns = await this.#adapter.runQuery<ColumnRow>(\n `PRAGMA table_info(${this.#quoteIdentifier(tableName)})`,\n );\n\n return {\n name: tableName,\n rawName: tableName,\n columns: columns.map((col) => ({\n name: col.name ?? 'unknown',\n type: col.type ?? 'unknown',\n })),\n };\n }\n\n protected override async findOutgoingRelations(\n tableName: string,\n ): Promise<Relationship[]> {\n const rows = await this.#adapter.runQuery<ForeignKeyRow>(\n `PRAGMA foreign_key_list(${this.#quoteIdentifier(tableName)})`,\n );\n\n const groups = new Map<number, Relationship>();\n\n for (const row of rows) {\n if (\n row.id == null ||\n row.table == null ||\n row.from == null ||\n row.to == null\n ) {\n continue;\n }\n\n const id = Number(row.id);\n const existing = groups.get(id);\n if (!existing) {\n groups.set(id, {\n table: tableName,\n from: [String(row.from)],\n referenced_table: String(row.table),\n to: [String(row.to)],\n });\n } else {\n existing.from.push(String(row.from));\n existing.to.push(String(row.to));\n }\n }\n\n return Array.from(groups.values());\n }\n\n protected override async findIncomingRelations(\n tableName: string,\n ): Promise<Relationship[]> {\n // SQLite limitation: PRAGMA only shows outgoing FKs\n // Must scan all tables and cache the results\n if (!this.#relationshipCache) {\n this.#relationshipCache = await this.#loadAllRelationships();\n }\n return this.#relationshipCache.filter(\n (r) => r.referenced_table === tableName,\n );\n }\n\n async #loadAllRelationships(): Promise<Relationship[]> {\n const allNames = await this.getAllTableNames();\n const results: Relationship[] = [];\n for (const name of allNames) {\n results.push(...(await this.findOutgoingRelations(name)));\n }\n return results;\n }\n\n #quoteIdentifier(name: string) {\n return `'${name.replace(/'/g, \"''\")}'`;\n }\n}\n", "import { type Adapter } from '../adapter.ts';\nimport { type ColumnStatsGroundingConfig } from '../groundings/column-stats.grounding.ts';\nimport { type ConstraintGroundingConfig } from '../groundings/constraint.grounding.ts';\nimport { type IndexesGroundingConfig } from '../groundings/indexes.grounding.ts';\nimport { type InfoGroundingConfig } from '../groundings/info.grounding.ts';\nimport { type ColumnValuesGroundingConfig } from '../groundings/column-values.grounding.ts';\nimport {\n ReportGrounding,\n type ReportGroundingConfig,\n} from '../groundings/report.grounding.ts';\nimport { type RowCountGroundingConfig } from '../groundings/row-count.grounding.ts';\nimport { type TableGroundingConfig } from '../groundings/table.grounding.ts';\nimport type { ViewGroundingConfig } from '../groundings/view.grounding.ts';\nimport { SqliteColumnStatsGrounding } from './column-stats.sqlite.grounding.ts';\nimport { SqliteConstraintGrounding } from './constraint.sqlite.grounding.ts';\nimport { SqliteIndexesGrounding } from './indexes.sqlite.grounding.ts';\nimport { SqliteInfoGrounding } from './info.sqlite.grounding.ts';\nimport { SqliteColumnValuesGrounding } from './column-values.sqlite.grounding.ts';\nimport { SqliteRowCountGrounding } from './row-count.sqlite.grounding.ts';\nimport { Sqlite } from './sqlite.ts';\nimport { SqliteTableGrounding } from './table.sqlite.grounding.ts';\nimport { SqliteViewGrounding } from './view.sqlite.grounding.ts';\n\nexport * from './sqlite.ts';\n\nexport function tables(config: TableGroundingConfig = {}) {\n return (adapter: Adapter) => new SqliteTableGrounding(adapter, config);\n}\n\nexport function info(config: InfoGroundingConfig = {}) {\n return (adapter: Adapter) => new SqliteInfoGrounding(adapter, config);\n}\n\nexport function views(config: ViewGroundingConfig = {}) {\n return (adapter: Adapter) => {\n return new SqliteViewGrounding(adapter, config);\n };\n}\n\nexport function columnStats(config: ColumnStatsGroundingConfig = {}) {\n return (adapter: Adapter) => {\n return new SqliteColumnStatsGrounding(adapter, config);\n };\n}\n\nexport function columnValues(config: ColumnValuesGroundingConfig = {}) {\n return (adapter: Adapter) => {\n return new SqliteColumnValuesGrounding(adapter, config);\n };\n}\n\nexport function indexes(config: IndexesGroundingConfig = {}) {\n return (adapter: Adapter) => {\n return new SqliteIndexesGrounding(adapter, config);\n };\n}\n\nexport function rowCount(config: RowCountGroundingConfig = {}) {\n return (adapter: Adapter) => {\n return new SqliteRowCountGrounding(adapter, config);\n };\n}\n\nexport function constraints(config: ConstraintGroundingConfig = {}) {\n return (adapter: Adapter) => {\n return new SqliteConstraintGrounding(adapter, config);\n };\n}\n\nexport function report(config: ReportGroundingConfig = {}) {\n return (adapter: Adapter) => new ReportGrounding(adapter, config);\n}\n\nexport default {\n tables,\n info,\n views,\n columnStats,\n columnValues,\n indexes,\n rowCount,\n constraints,\n report,\n Sqlite,\n};\n", "import { DatabaseSync } from 'node:sqlite';\n\nimport type { GroundingFn } from '../adapter.ts';\nimport { Sqlite } from '../sqlite/sqlite.ts';\nimport { type ColumnType, type ParsedSheet, parseFile } from './parser.ts';\n\n/**\n * Options for creating a Spreadsheet adapter.\n */\nexport interface SpreadsheetOptions {\n /**\n * Path to the spreadsheet file (Excel .xlsx/.xls or CSV/TSV).\n */\n file: string;\n\n /**\n * Optional path to persist the SQLite database.\n * If not provided, uses in-memory database (':memory:').\n */\n database?: string;\n\n /**\n * Grounding functions to use for schema introspection.\n */\n grounding: GroundingFn[];\n}\n\n/**\n * Spreadsheet adapter that loads Excel/CSV files into SQLite.\n *\n * This adapter:\n * 1. Parses the spreadsheet file (Excel or CSV/TSV)\n * 2. Creates a SQLite database (in-memory or file-based)\n * 3. Creates tables from sheets and loads data\n * 4. Delegates all SQL operations to the SQLite adapter\n *\n * @example\n * ```typescript\n * import { Spreadsheet, tables, info } from '@deepagents/text2sql/spreadsheet';\n *\n * const adapter = new Spreadsheet({\n * file: './sales.xlsx',\n * grounding: [tables(), info()]\n * });\n *\n * const schema = await adapter.introspect();\n * const results = await adapter.execute('SELECT * FROM Customers');\n * ```\n */\nexport class Spreadsheet extends Sqlite {\n #db: DatabaseSync;\n\n constructor(options: SpreadsheetOptions) {\n // Parse the spreadsheet file\n const sheets = parseFile(options.file);\n\n // Create SQLite database\n const dbPath = options.database ?? ':memory:';\n const db = new DatabaseSync(dbPath);\n\n // Create tables and load data\n for (const sheet of sheets) {\n const createSQL = createTableSQL(sheet);\n db.exec(createSQL);\n loadData(db, sheet);\n }\n\n // Initialize the SQLite adapter with execute function\n super({\n execute: (sql: string) => db.prepare(sql).all(),\n grounding: options.grounding,\n });\n\n this.#db = db;\n }\n\n /**\n * Close the underlying SQLite database.\n * Call this when done to release resources.\n */\n close(): void {\n this.#db.close();\n }\n}\n\n/**\n * Generate CREATE TABLE SQL for a parsed sheet.\n */\nfunction createTableSQL(sheet: ParsedSheet): string {\n if (sheet.columns.length === 0) {\n throw new Error(`Cannot create table \"${sheet.name}\" with no columns.`);\n }\n\n const columns = sheet.columns\n .map((col) => `\"${escapeIdentifier(col.name)}\" ${col.type}`)\n .join(', ');\n\n return `CREATE TABLE \"${escapeIdentifier(sheet.name)}\" (${columns})`;\n}\n\n/**\n * SQLite input value type.\n */\ntype SQLiteValue = string | number | bigint | null | Uint8Array;\n\n/**\n * Load data from a parsed sheet into the SQLite database.\n * Uses transactions for performance.\n */\nfunction loadData(db: DatabaseSync, sheet: ParsedSheet): void {\n if (sheet.rows.length === 0) {\n return;\n }\n\n const columns = sheet.columns\n .map((c) => `\"${escapeIdentifier(c.name)}\"`)\n .join(', ');\n const placeholders = sheet.columns.map(() => '?').join(', ');\n\n const insertSQL = `INSERT INTO \"${escapeIdentifier(sheet.name)}\" (${columns}) VALUES (${placeholders})`;\n const stmt = db.prepare(insertSQL);\n\n db.exec('BEGIN TRANSACTION');\n\n try {\n for (const row of sheet.rows) {\n const values: SQLiteValue[] = sheet.columns.map((col) => {\n // Use originalKey to access row data (preserves original case)\n const rawValue = row[col.originalKey];\n return convertValue(rawValue, col.type);\n });\n stmt.run(...values);\n }\n db.exec('COMMIT');\n } catch (error) {\n db.exec('ROLLBACK');\n throw error;\n }\n}\n\n/**\n * Convert a JavaScript value to the appropriate SQLite type.\n * Type-aware conversion based on the inferred column type.\n */\nfunction convertValue(value: unknown, type: ColumnType): SQLiteValue {\n // Null/undefined/empty \u2192 NULL\n if (value == null || value === '') {\n return null;\n }\n\n // Handle Date objects - format as YYYY-MM-DD\n if (value instanceof Date) {\n return value.toISOString().split('T')[0];\n }\n\n switch (type) {\n case 'INTEGER': {\n // Convert to integer, floor decimals\n const num = Number(value);\n if (isNaN(num)) {\n return null; // Non-numeric values become NULL\n }\n return Math.floor(num);\n }\n\n case 'REAL': {\n // Convert to float\n const num = Number(value);\n if (isNaN(num)) {\n return null; // Non-numeric values become NULL\n }\n return num;\n }\n\n case 'TEXT':\n default: {\n // Convert to string\n if (typeof value === 'boolean') {\n return value ? 'true' : 'false';\n }\n if (typeof value === 'object') {\n return JSON.stringify(value);\n }\n return String(value);\n }\n }\n}\n\n/**\n * Escape double quotes in identifiers for SQLite.\n */\nfunction escapeIdentifier(name: string): string {\n return name.replace(/\"/g, '\"\"');\n}\n", "import * as path from 'node:path';\nimport XLSX from 'xlsx';\n\n/**\n * Column type for SQLite.\n */\nexport type ColumnType = 'TEXT' | 'INTEGER' | 'REAL';\n\n/**\n * Column definition with name and inferred type.\n */\nexport interface Column {\n /** Sanitized column name for SQL */\n name: string;\n /** Original column name from spreadsheet (for data access) */\n originalKey: string;\n /** Inferred SQLite type */\n type: ColumnType;\n}\n\n/**\n * Parsed sheet with table name, columns, and row data.\n */\nexport interface ParsedSheet {\n name: string;\n columns: Column[];\n rows: Record<string, unknown>[];\n}\n\n/**\n * Parse an Excel or CSV/TSV file into sheets.\n *\n * - Excel files: each sheet becomes a ParsedSheet\n * - CSV/TSV files: single ParsedSheet with filename as table name\n */\nexport function parseFile(filePath: string): ParsedSheet[] {\n const ext = path.extname(filePath).toLowerCase();\n\n let workbook: XLSX.WorkBook;\n try {\n workbook = XLSX.readFile(filePath, {\n cellDates: true, // Parse dates as Date objects\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to read spreadsheet \"${filePath}\": ${message}`);\n }\n\n const sheets: ParsedSheet[] = [];\n\n for (const sheetName of workbook.SheetNames) {\n const sheet = workbook.Sheets[sheetName];\n const rows = XLSX.utils.sheet_to_json<Record<string, unknown>>(sheet);\n\n // Skip empty sheets\n if (rows.length === 0) {\n continue;\n }\n\n // For CSV files, use filename as table name; for Excel, use sheet name\n const tableName =\n ext === '.csv' || ext === '.tsv'\n ? getTableNameFromFile(filePath)\n : sanitizeTableName(sheetName);\n\n const columns = inferColumns(rows);\n\n // Skip sheets with no columns (shouldn't happen if rows exist, but be safe)\n if (columns.length === 0) {\n continue;\n }\n\n sheets.push({\n name: tableName,\n columns,\n rows,\n });\n }\n\n if (sheets.length === 0) {\n throw new Error(\n `No valid sheets found in \"${filePath}\". All sheets are empty or have no columns.`,\n );\n }\n\n return sheets;\n}\n\n/**\n * Extract table name from filename.\n * './data/customers.csv' \u2192 'customers'\n */\nfunction getTableNameFromFile(filePath: string): string {\n const basename = path.basename(filePath, path.extname(filePath));\n return sanitizeTableName(basename);\n}\n\n/**\n * Sanitize a name to be a valid SQL table/column identifier.\n * - Lowercase for consistency\n * - Replace invalid chars with underscores\n * - Ensure it doesn't start with a number\n * - Trim and collapse multiple underscores\n * - Truncate to 64 characters\n */\nexport function sanitizeIdentifier(name: string): string {\n // Lowercase for consistent SQL identifiers\n let sanitized = name.toLowerCase();\n\n // Replace any non-alphanumeric (except underscore) with underscore\n sanitized = sanitized.replace(/[^a-z0-9_]/g, '_');\n\n // Collapse multiple underscores\n sanitized = sanitized.replace(/_+/g, '_');\n\n // Trim leading/trailing underscores\n sanitized = sanitized.replace(/^_+|_+$/g, '');\n\n // If starts with number, prefix with underscore\n if (/^[0-9]/.test(sanitized)) {\n sanitized = '_' + sanitized;\n }\n\n // If empty after sanitization, use a default\n if (!sanitized) {\n return 'column';\n }\n\n // Truncate to 64 characters (common SQL identifier limit)\n return sanitized.slice(0, 64);\n}\n\n// Alias for backwards compatibility\nexport const sanitizeTableName = sanitizeIdentifier;\n\n/**\n * Infer column definitions from row data.\n * Uses the first row's keys as column names and samples values for type inference.\n */\nfunction inferColumns(rows: Record<string, unknown>[]): Column[] {\n if (rows.length === 0) {\n return [];\n }\n\n // Get all unique keys from all rows (in case some rows have different keys)\n const keySet = new Set<string>();\n for (const row of rows) {\n for (const key of Object.keys(row)) {\n keySet.add(key);\n }\n }\n\n // Handle empty keys (sheets with no headers)\n if (keySet.size === 0) {\n return [];\n }\n\n const rawNames = Array.from(keySet);\n const dedupedNames = deduplicateColumnNames(rawNames);\n\n return dedupedNames.map((name, idx) => {\n const originalKey = rawNames[idx];\n const values = rows.map((row) => row[originalKey]);\n const type = inferColumnType(values);\n return { name, originalKey, type };\n });\n}\n\n/**\n * Deduplicate column names by appending _2, _3, etc. to duplicates.\n */\nfunction deduplicateColumnNames(names: string[]): string[] {\n const seen = new Map<string, number>();\n const result: string[] = [];\n\n for (const rawName of names) {\n // Sanitize the column name\n let name = sanitizeTableName(rawName);\n\n // Handle empty names (generate column_1, column_2, etc.)\n if (!name) {\n name = 'column';\n }\n\n const count = seen.get(name) ?? 0;\n if (count > 0) {\n result.push(`${name}_${count + 1}`);\n } else {\n result.push(name);\n }\n seen.set(name, count + 1);\n }\n\n return result;\n}\n\n/**\n * Infer SQLite column type from sample values.\n * Conservative approach: when in doubt, use TEXT.\n */\nfunction inferColumnType(values: unknown[]): ColumnType {\n let hasInteger = false;\n let hasReal = false;\n\n for (const value of values) {\n // Skip nullish or empty values\n if (value == null || value === '') {\n continue;\n }\n\n // Dates are stored as TEXT (ISO format)\n if (value instanceof Date) {\n return 'TEXT';\n }\n\n if (typeof value === 'number') {\n if (Number.isInteger(value)) {\n hasInteger = true;\n } else {\n hasReal = true;\n }\n } else if (typeof value === 'boolean') {\n // Booleans can be stored as INTEGER (0/1)\n hasInteger = true;\n } else {\n // Any non-number type means TEXT\n return 'TEXT';\n }\n }\n\n // If we have any REAL values, use REAL (even if some are integers)\n if (hasReal) {\n return 'REAL';\n }\n\n // If we only have integers, use INTEGER\n if (hasInteger) {\n return 'INTEGER';\n }\n\n // Default to TEXT (all values were null/empty)\n return 'TEXT';\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["tables", "c", "basename"]
7
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@deepagents/text2sql",
3
- "version": "0.10.0",
3
+ "version": "0.10.1",
4
4
  "license": "MIT",
5
5
  "repository": {
6
6
  "type": "git",
@@ -82,8 +82,8 @@
82
82
  },
83
83
  "dependencies": {
84
84
  "@ai-sdk/groq": "2.0.26",
85
- "@deepagents/agent": "0.10.0",
86
- "@deepagents/toolbox": "0.10.0",
85
+ "@deepagents/agent": "0.10.1",
86
+ "@deepagents/toolbox": "0.10.1",
87
87
  "ai": "^5.0.102",
88
88
  "autoevals": "^0.0.131",
89
89
  "dedent": "1.7.0",