@deepagents/text2sql 0.2.2 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +7 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +929 -2746
- package/dist/index.js.map +4 -4
- package/dist/lib/adapters/adapter.d.ts +67 -10
- package/dist/lib/adapters/adapter.d.ts.map +1 -1
- package/dist/lib/adapters/grounding.ticket.d.ts +21 -0
- package/dist/lib/adapters/grounding.ticket.d.ts.map +1 -0
- package/dist/lib/adapters/groundings/column-stats.grounding.d.ts +32 -0
- package/dist/lib/adapters/groundings/column-stats.grounding.d.ts.map +1 -0
- package/dist/lib/adapters/groundings/constraint.grounding.d.ts +31 -0
- package/dist/lib/adapters/groundings/constraint.grounding.d.ts.map +1 -0
- package/dist/lib/adapters/groundings/context.d.ts +41 -0
- package/dist/lib/adapters/groundings/context.d.ts.map +1 -0
- package/dist/lib/adapters/groundings/grounding.d.ts +8 -0
- package/dist/lib/adapters/groundings/grounding.d.ts.map +1 -0
- package/dist/lib/adapters/groundings/grounding.js +507 -0
- package/dist/lib/adapters/groundings/grounding.js.map +7 -0
- package/dist/lib/adapters/groundings/indexes.grounding.d.ts +30 -0
- package/dist/lib/adapters/groundings/indexes.grounding.d.ts.map +1 -0
- package/dist/lib/adapters/groundings/info.grounding.d.ts +29 -0
- package/dist/lib/adapters/groundings/info.grounding.d.ts.map +1 -0
- package/dist/lib/adapters/groundings/low-cardinality.grounding.d.ts +35 -0
- package/dist/lib/adapters/groundings/low-cardinality.grounding.d.ts.map +1 -0
- package/dist/lib/adapters/groundings/report.grounding.d.ts +38 -0
- package/dist/lib/adapters/groundings/report.grounding.d.ts.map +1 -0
- package/dist/lib/adapters/groundings/row-count.grounding.d.ts +30 -0
- package/dist/lib/adapters/groundings/row-count.grounding.d.ts.map +1 -0
- package/dist/lib/adapters/groundings/table.grounding.d.ts +61 -0
- package/dist/lib/adapters/groundings/table.grounding.d.ts.map +1 -0
- package/dist/lib/adapters/groundings/view.grounding.d.ts +57 -0
- package/dist/lib/adapters/groundings/view.grounding.d.ts.map +1 -0
- package/dist/lib/adapters/postgres/column-stats.postgres.grounding.d.ts +12 -0
- package/dist/lib/adapters/postgres/column-stats.postgres.grounding.d.ts.map +1 -0
- package/dist/lib/adapters/postgres/constraint.postgres.grounding.d.ts +11 -0
- package/dist/lib/adapters/postgres/constraint.postgres.grounding.d.ts.map +1 -0
- package/dist/lib/adapters/postgres/index.d.ts +43 -0
- package/dist/lib/adapters/postgres/index.d.ts.map +1 -0
- package/dist/lib/adapters/postgres/index.js +1640 -0
- package/dist/lib/adapters/postgres/index.js.map +7 -0
- package/dist/lib/adapters/postgres/indexes.postgres.grounding.d.ts +15 -0
- package/dist/lib/adapters/postgres/indexes.postgres.grounding.d.ts.map +1 -0
- package/dist/lib/adapters/postgres/info.postgres.grounding.d.ts +11 -0
- package/dist/lib/adapters/postgres/info.postgres.grounding.d.ts.map +1 -0
- package/dist/lib/adapters/postgres/low-cardinality.postgres.grounding.d.ts +14 -0
- package/dist/lib/adapters/postgres/low-cardinality.postgres.grounding.d.ts.map +1 -0
- package/dist/lib/adapters/postgres/postgres.d.ts +26 -0
- package/dist/lib/adapters/postgres/postgres.d.ts.map +1 -0
- package/dist/lib/adapters/postgres/row-count.postgres.grounding.d.ts +11 -0
- package/dist/lib/adapters/postgres/row-count.postgres.grounding.d.ts.map +1 -0
- package/dist/lib/adapters/postgres/table.postgres.grounding.d.ts +21 -0
- package/dist/lib/adapters/postgres/table.postgres.grounding.d.ts.map +1 -0
- package/dist/lib/adapters/postgres/view.postgres.grounding.d.ts +16 -0
- package/dist/lib/adapters/postgres/view.postgres.grounding.d.ts.map +1 -0
- package/dist/lib/adapters/sqlite/column-stats.sqlite.grounding.d.ts +12 -0
- package/dist/lib/adapters/sqlite/column-stats.sqlite.grounding.d.ts.map +1 -0
- package/dist/lib/adapters/sqlite/constraint.sqlite.grounding.d.ts +15 -0
- package/dist/lib/adapters/sqlite/constraint.sqlite.grounding.d.ts.map +1 -0
- package/dist/lib/adapters/sqlite/index.d.ts +43 -0
- package/dist/lib/adapters/sqlite/index.d.ts.map +1 -0
- package/dist/lib/adapters/sqlite/index.js +1215 -0
- package/dist/lib/adapters/sqlite/index.js.map +7 -0
- package/dist/lib/adapters/sqlite/indexes.sqlite.grounding.d.ts +11 -0
- package/dist/lib/adapters/sqlite/indexes.sqlite.grounding.d.ts.map +1 -0
- package/dist/lib/adapters/sqlite/info.sqlite.grounding.d.ts +11 -0
- package/dist/lib/adapters/sqlite/info.sqlite.grounding.d.ts.map +1 -0
- package/dist/lib/adapters/sqlite/low-cardinality.sqlite.grounding.d.ts +14 -0
- package/dist/lib/adapters/sqlite/low-cardinality.sqlite.grounding.d.ts.map +1 -0
- package/dist/lib/adapters/sqlite/row-count.sqlite.grounding.d.ts +11 -0
- package/dist/lib/adapters/sqlite/row-count.sqlite.grounding.d.ts.map +1 -0
- package/dist/lib/adapters/sqlite/sqlite.d.ts +25 -0
- package/dist/lib/adapters/sqlite/sqlite.d.ts.map +1 -0
- package/dist/lib/adapters/sqlite/table.sqlite.grounding.d.ts +17 -0
- package/dist/lib/adapters/sqlite/table.sqlite.grounding.d.ts.map +1 -0
- package/dist/lib/adapters/sqlite/view.sqlite.grounding.d.ts +12 -0
- package/dist/lib/adapters/sqlite/view.sqlite.grounding.d.ts.map +1 -0
- package/dist/lib/adapters/sqlserver/column-stats.sqlserver.grounding.d.ts +12 -0
- package/dist/lib/adapters/sqlserver/column-stats.sqlserver.grounding.d.ts.map +1 -0
- package/dist/lib/adapters/sqlserver/constraint.sqlserver.grounding.d.ts +11 -0
- package/dist/lib/adapters/sqlserver/constraint.sqlserver.grounding.d.ts.map +1 -0
- package/dist/lib/adapters/sqlserver/index.d.ts +43 -0
- package/dist/lib/adapters/sqlserver/index.d.ts.map +1 -0
- package/dist/lib/adapters/sqlserver/index.js +1693 -0
- package/dist/lib/adapters/sqlserver/index.js.map +7 -0
- package/dist/lib/adapters/sqlserver/indexes.sqlserver.grounding.d.ts +15 -0
- package/dist/lib/adapters/sqlserver/indexes.sqlserver.grounding.d.ts.map +1 -0
- package/dist/lib/adapters/sqlserver/info.sqlserver.grounding.d.ts +11 -0
- package/dist/lib/adapters/sqlserver/info.sqlserver.grounding.d.ts.map +1 -0
- package/dist/lib/adapters/sqlserver/low-cardinality.sqlserver.grounding.d.ts +14 -0
- package/dist/lib/adapters/sqlserver/low-cardinality.sqlserver.grounding.d.ts.map +1 -0
- package/dist/lib/adapters/sqlserver/row-count.sqlserver.grounding.d.ts +11 -0
- package/dist/lib/adapters/sqlserver/row-count.sqlserver.grounding.d.ts.map +1 -0
- package/dist/lib/adapters/sqlserver/sqlserver.d.ts +26 -0
- package/dist/lib/adapters/sqlserver/sqlserver.d.ts.map +1 -0
- package/dist/lib/adapters/sqlserver/table.sqlserver.grounding.d.ts +21 -0
- package/dist/lib/adapters/sqlserver/table.sqlserver.grounding.d.ts.map +1 -0
- package/dist/lib/adapters/sqlserver/view.sqlserver.grounding.d.ts +16 -0
- package/dist/lib/adapters/sqlserver/view.sqlserver.grounding.d.ts.map +1 -0
- package/dist/lib/agents/suggestions.agents.d.ts +0 -2
- package/dist/lib/agents/suggestions.agents.d.ts.map +1 -1
- package/dist/lib/agents/teachables.agent.d.ts +0 -3
- package/dist/lib/agents/teachables.agent.d.ts.map +1 -1
- package/dist/lib/agents/text2sql.agent.d.ts +69 -29
- package/dist/lib/agents/text2sql.agent.d.ts.map +1 -1
- package/dist/lib/file-cache.d.ts +12 -0
- package/dist/lib/file-cache.d.ts.map +1 -0
- package/dist/lib/instructions.d.ts +3 -0
- package/dist/lib/instructions.d.ts.map +1 -0
- package/dist/lib/instructions.js +386 -0
- package/dist/lib/instructions.js.map +7 -0
- package/dist/lib/memory/memory.prompt.d.ts +3 -0
- package/dist/lib/memory/memory.prompt.d.ts.map +1 -0
- package/dist/lib/memory/memory.store.d.ts +5 -0
- package/dist/lib/memory/memory.store.d.ts.map +1 -0
- package/dist/lib/memory/sqlite.store.d.ts +14 -0
- package/dist/lib/memory/sqlite.store.d.ts.map +1 -0
- package/dist/lib/memory/store.d.ts +40 -0
- package/dist/lib/memory/store.d.ts.map +1 -0
- package/dist/lib/prompt.d.ts +1 -6
- package/dist/lib/prompt.d.ts.map +1 -1
- package/dist/lib/sql.d.ts +27 -34
- package/dist/lib/sql.d.ts.map +1 -1
- package/dist/lib/teach/teachables.d.ts +184 -13
- package/dist/lib/teach/teachables.d.ts.map +1 -1
- package/dist/lib/teach/teachings.d.ts.map +1 -1
- package/dist/lib/teach/xml.d.ts.map +1 -1
- package/package.json +38 -4
- package/dist/lib/adapters/postgres.d.ts +0 -31
- package/dist/lib/adapters/postgres.d.ts.map +0 -1
- package/dist/lib/adapters/resolveTables.spec.d.ts +0 -2
- package/dist/lib/adapters/resolveTables.spec.d.ts.map +0 -1
- package/dist/lib/adapters/sqlite.d.ts +0 -30
- package/dist/lib/adapters/sqlite.d.ts.map +0 -1
- package/dist/lib/adapters/sqlserver.d.ts +0 -31
- package/dist/lib/adapters/sqlserver.d.ts.map +0 -1
- package/dist/lib/agents/brief.agent.d.ts +0 -16
- package/dist/lib/agents/brief.agent.d.ts.map +0 -1
- package/dist/lib/memory/user-profile.d.ts +0 -39
- package/dist/lib/memory/user-profile.d.ts.map +0 -1
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/lib/adapters/groundings/context.ts", "../../../../src/lib/adapters/adapter.ts", "../../../../src/lib/adapters/grounding.ticket.ts", "../../../../src/lib/adapters/groundings/column-stats.grounding.ts", "../../../../src/lib/adapters/groundings/constraint.grounding.ts", "../../../../src/lib/adapters/groundings/indexes.grounding.ts", "../../../../src/lib/adapters/groundings/info.grounding.ts", "../../../../src/lib/adapters/groundings/low-cardinality.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/postgres/column-stats.postgres.grounding.ts", "../../../../src/lib/adapters/postgres/constraint.postgres.grounding.ts", "../../../../src/lib/adapters/postgres/indexes.postgres.grounding.ts", "../../../../src/lib/adapters/postgres/info.postgres.grounding.ts", "../../../../src/lib/adapters/postgres/low-cardinality.postgres.grounding.ts", "../../../../src/lib/adapters/postgres/postgres.ts", "../../../../src/lib/adapters/postgres/row-count.postgres.grounding.ts", "../../../../src/lib/adapters/postgres/table.postgres.grounding.ts", "../../../../src/lib/adapters/groundings/view.grounding.ts", "../../../../src/lib/adapters/postgres/view.postgres.grounding.ts", "../../../../src/lib/adapters/postgres/index.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';\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 './grounding.ticket.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';\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: 'CHECK' | 'UNIQUE' | 'NOT_NULL' | 'DEFAULT' | 'PRIMARY_KEY' | '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() {\n const lines: { tag: string; fn: () => string | null }[] = [];\n const ctx = createGroundingContext();\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 * 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 './groundings/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}\nclass ExampleQueryGrounding {\n // this will create example queries for tables matching the filter\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 '../grounding.ticket.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 { TableConstraint } from '../adapter.ts';\nimport { AbstractGrounding } from '../grounding.ticket.ts';\nimport type { GroundingContext } from './context.ts';\n\n/**\n * Configuration for ConstraintGrounding.\n */\nexport interface ConstraintGroundingConfig {\n // Future: filter which tables/constraint types to collect\n}\n\n/**\n * Abstract base class for constraint grounding.\n *\n * Reads tables from the context and annotates them with constraints\n * (CHECK, UNIQUE, NOT_NULL, DEFAULT).\n * This grounding must run AFTER TableGrounding since it reads from ctx.tables.\n *\n * Subclasses implement the database-specific hook:\n * - `getConstraints()` - fetch constraints for a table\n */\nexport abstract class ConstraintGrounding extends AbstractGrounding {\n constructor(config: ConstraintGroundingConfig = {}) {\n super('constraints');\n }\n\n /**\n * Fetch constraints for a specific table.\n */\n protected abstract getConstraints(tableName: string): Promise<TableConstraint[]>;\n\n /**\n * Execute the grounding process.\n * Annotates tables in ctx.tables with their constraints.\n */\n async execute(ctx: GroundingContext) {\n for (const table of ctx.tables) {\n try {\n table.constraints = await this.getConstraints(table.name);\n } catch (error) {\n // Skip on error - table might not exist or be inaccessible\n console.warn('Error collecting constraints for', table.name, error);\n }\n }\n // Return null - TableGrounding could describe constraints if needed\n return () => null;\n }\n}\n", "import type { TableIndex } from '../adapter.ts';\nimport { AbstractGrounding } from '../grounding.ticket.ts';\nimport type { GroundingContext } from './context.ts';\n\n/**\n * Configuration for IndexesGrounding.\n */\nexport interface IndexesGroundingConfig {\n // Future: filter which tables to collect indexes for\n}\n\n/**\n * Abstract base class for indexes grounding.\n *\n * Reads tables from the context and annotates them with index metadata.\n * This grounding must run AFTER TableGrounding since it reads from ctx.tables.\n *\n * Subclasses implement the database-specific hook:\n * - `getIndexes()` - fetch indexes for a table\n */\nexport abstract class IndexesGrounding extends AbstractGrounding {\n constructor(config: IndexesGroundingConfig = {}) {\n super('indexes');\n }\n\n /**\n * Fetch indexes for a specific table.\n */\n protected abstract getIndexes(tableName: string): Promise<TableIndex[]>;\n\n /**\n * Execute the grounding process.\n * Annotates tables in ctx.tables with their indexes and marks indexed columns.\n */\n async execute(ctx: GroundingContext) {\n for (const table of ctx.tables) {\n table.indexes = await this.getIndexes(table.name);\n // Mark columns that are part of indexes\n for (const index of table.indexes ?? []) {\n for (const colName of index.columns) {\n const column = table.columns.find((c) => c.name === colName);\n if (column) {\n column.isIndexed = true;\n }\n }\n }\n }\n // Return null - TableGrounding already describes indexes in its output\n return () => null;\n }\n}\n", "import type { AdapterInfo } from '../adapter.ts';\nimport { AbstractGrounding } from '../grounding.ticket.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 { AbstractGrounding } from '../grounding.ticket.ts';\nimport type { Column, ColumnContainer, GroundingContext } from './context.ts';\n\nexport type { Column, ColumnContainer };\n\n/**\n * Configuration for LowCardinalityGrounding.\n */\nexport interface LowCardinalityGroundingConfig {\n // Future: filter which tables/columns to collect low cardinality values for\n}\n\n/**\n * Abstract base class for low cardinality column grounding.\n *\n * Reads tables and views from the context and annotates their columns\n * with low cardinality values (columns with few distinct values).\n *\n * Subclasses implement database-specific hooks:\n * - `collectLowCardinality()` - collect distinct values for low cardinality columns\n */\nexport abstract class LowCardinalityGrounding extends AbstractGrounding {\n constructor(config: LowCardinalityGroundingConfig = {}) {\n super('low_cardinality');\n }\n\n /**\n * Collect distinct values for low cardinality columns.\n * Return undefined if column has too many distinct values.\n */\n protected abstract collectLowCardinality(\n tableName: string,\n column: Column,\n ): Promise<{ kind: 'LowCardinality'; values: string[] } | undefined>;\n\n /**\n * Execute the grounding process.\n * Annotates columns in ctx.tables and ctx.views with low cardinality values.\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 low cardinality values\n try {\n const lowCard = await this.collectLowCardinality(\n container.name,\n column,\n );\n if (lowCard) {\n column.kind = lowCard.kind;\n column.values = lowCard.values;\n }\n } catch (error) {\n // Skip on error\n console.warn(\n 'Error collecting low cardinality values 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 { 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 '../grounding.ticket.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\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 reportAgent = agent<unknown, { adapter: Adapter }>({\n name: 'db-report-agent',\n model: this.#model,\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(\n 'What insight you are trying to gather with this query',\n ),\n }),\n execute: ({ sql }, options) => {\n const state = toState<{ adapter: Adapter }>(options);\n return state.adapter.execute(sql);\n },\n }),\n },\n });\n\n const { text } = await generate(\n reportAgent,\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 '../grounding.ticket.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 '../grounding.ticket.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 // Get primary key columns from constraints\n const pkConstraint = table.constraints?.find((c) => c.type === 'PRIMARY_KEY');\n const pkColumns = new Set(pkConstraint?.columns ?? []);\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 (column.isIndexed && !isPrimaryKey) {\n annotations.push('Indexed');\n }\n if (column.kind === 'LowCardinality' && column.values?.length) {\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 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 return `- Table: ${table.name}${rowCountInfo}\\n Columns:\\n${columns}${indexes}`;\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 * PostgreSQL implementation of ColumnStatsGrounding.\n */\nexport class PostgresColumnStatsGrounding 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 { schema, table } = this.#adapter.parseTableName(tableName);\n const tableIdentifier = `${this.#adapter.quoteIdentifier(schema)}.${this.#adapter.quoteIdentifier(table)}`;\n const columnIdentifier = this.#adapter.quoteIdentifier(column.name);\n\n const sql = `\n SELECT\n MIN(${columnIdentifier})::text AS min_value,\n MAX(${columnIdentifier})::text 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: string | null;\n max_value: string | null;\n null_fraction: number | string | null;\n }>(sql);\n\n if (!rows.length) {\n return undefined;\n }\n\n const min = rows[0]?.min_value;\n const max = 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|serial/.test(\n normalized,\n );\n }\n}\n", "import type { Adapter, TableConstraint } from '../adapter.ts';\nimport {\n ConstraintGrounding,\n type ConstraintGroundingConfig,\n} from '../groundings/constraint.grounding.ts';\n\ntype ConstraintRow = {\n constraint_name: string;\n constraint_type: string;\n definition: string | null;\n column_name: string | null;\n ref_schema: string | null;\n ref_table: string | null;\n ref_column: string | null;\n};\n\ntype ColumnDefaultRow = {\n column_name: string;\n column_default: string | null;\n is_nullable: string;\n};\n\n/**\n * PostgreSQL implementation of ConstraintGrounding.\n */\nexport class PostgresConstraintGrounding extends ConstraintGrounding {\n #adapter: Adapter;\n\n constructor(adapter: Adapter, config: ConstraintGroundingConfig = {}) {\n super(config);\n this.#adapter = adapter;\n }\n\n protected override async getConstraints(tableName: string): Promise<TableConstraint[]> {\n const { schema, table } = this.#adapter.parseTableName(tableName);\n const constraints: TableConstraint[] = [];\n\n // Get PRIMARY KEY, FOREIGN KEY, CHECK, and UNIQUE constraints from pg_constraint\n // contype: p=primary key, f=foreign key, c=check, u=unique\n const constraintRows = await this.#adapter.runQuery<ConstraintRow>(`\n SELECT\n con.conname AS constraint_name,\n con.contype AS constraint_type,\n pg_get_constraintdef(con.oid) AS definition,\n a.attname AS column_name,\n ref_nsp.nspname AS ref_schema,\n ref_rel.relname AS ref_table,\n ref_a.attname AS ref_column\n FROM pg_constraint con\n JOIN pg_class rel ON rel.oid = con.conrelid\n JOIN pg_namespace nsp ON nsp.oid = rel.relnamespace\n LEFT JOIN LATERAL unnest(con.conkey) WITH ORDINALITY AS key(attnum, ord) ON TRUE\n LEFT JOIN pg_attribute a ON a.attrelid = rel.oid AND a.attnum = key.attnum\n LEFT JOIN pg_class ref_rel ON ref_rel.oid = con.confrelid\n LEFT JOIN pg_namespace ref_nsp ON ref_nsp.oid = ref_rel.relnamespace\n LEFT JOIN LATERAL unnest(con.confkey) WITH ORDINALITY AS ref_key(attnum, ord) ON key.ord = ref_key.ord\n LEFT JOIN pg_attribute ref_a ON ref_a.attrelid = ref_rel.oid AND ref_a.attnum = ref_key.attnum\n WHERE nsp.nspname = '${this.#adapter.escapeString(schema)}'\n AND rel.relname = '${this.#adapter.escapeString(table)}'\n AND con.contype IN ('p', 'f', 'c', 'u')\n ORDER BY con.conname, key.ord\n `);\n\n // Group by constraint name\n const constraintMap = new Map<string, {\n type: string;\n definition: string | null;\n columns: string[];\n refSchema: string | null;\n refTable: string | null;\n refColumns: string[];\n }>();\n\n for (const row of constraintRows) {\n const existing = constraintMap.get(row.constraint_name);\n if (existing) {\n if (row.column_name && !existing.columns.includes(row.column_name)) {\n existing.columns.push(row.column_name);\n }\n if (row.ref_column && !existing.refColumns.includes(row.ref_column)) {\n existing.refColumns.push(row.ref_column);\n }\n } else {\n constraintMap.set(row.constraint_name, {\n type: row.constraint_type,\n definition: row.definition,\n columns: row.column_name ? [row.column_name] : [],\n refSchema: row.ref_schema,\n refTable: row.ref_table,\n refColumns: row.ref_column ? [row.ref_column] : [],\n });\n }\n }\n\n for (const [name, data] of constraintMap) {\n if (data.type === 'p') {\n // PRIMARY KEY constraint\n constraints.push({\n name,\n type: 'PRIMARY_KEY',\n columns: data.columns,\n });\n } else if (data.type === 'f') {\n // FOREIGN KEY constraint\n const referencedTable = data.refSchema && data.refTable\n ? `${data.refSchema}.${data.refTable}`\n : data.refTable ?? undefined;\n constraints.push({\n name,\n type: 'FOREIGN_KEY',\n columns: data.columns,\n referencedTable,\n referencedColumns: data.refColumns,\n });\n } else if (data.type === 'c') {\n // CHECK constraint\n constraints.push({\n name,\n type: 'CHECK',\n definition: data.definition?.replace(/^CHECK\\s*\\(/i, '').replace(/\\)$/, '') || undefined,\n columns: data.columns.length > 0 ? data.columns : undefined,\n });\n } else if (data.type === 'u') {\n // UNIQUE constraint\n constraints.push({\n name,\n type: 'UNIQUE',\n columns: data.columns,\n });\n }\n }\n\n // Get NOT NULL and DEFAULT from information_schema\n const columnRows = await this.#adapter.runQuery<ColumnDefaultRow>(`\n SELECT\n column_name,\n column_default,\n is_nullable\n FROM information_schema.columns\n WHERE table_schema = '${this.#adapter.escapeString(schema)}'\n AND table_name = '${this.#adapter.escapeString(table)}'\n `);\n\n for (const col of columnRows) {\n // NOT NULL constraint (exclude primary key columns which are implicitly NOT NULL)\n const pkConstraint = constraints.find((c) => c.type === 'PRIMARY_KEY');\n const isPkColumn = pkConstraint?.columns?.includes(col.column_name);\n if (col.is_nullable === 'NO' && !isPkColumn) {\n constraints.push({\n name: `${table}_${col.column_name}_notnull`,\n type: 'NOT_NULL',\n columns: [col.column_name],\n });\n }\n\n // DEFAULT constraint\n if (col.column_default != null) {\n constraints.push({\n name: `${table}_${col.column_name}_default`,\n type: 'DEFAULT',\n columns: [col.column_name],\n defaultValue: col.column_default,\n });\n }\n }\n\n return constraints;\n }\n}\n", "import type { Adapter, TableIndex } from '../adapter.ts';\nimport {\n IndexesGrounding,\n type IndexesGroundingConfig,\n} from '../groundings/indexes.grounding.ts';\n\ntype IndexRow = {\n index_name: string;\n column_name: string;\n is_unique: boolean;\n index_type: string;\n column_position: number;\n};\n\nexport interface PostgresIndexesGroundingConfig extends IndexesGroundingConfig {\n /** Schemas to include (defaults to excluding pg_catalog and information_schema) */\n schemas?: string[];\n}\n\n/**\n * PostgreSQL implementation of IndexesGrounding.\n */\nexport class PostgresIndexesGrounding extends IndexesGrounding {\n #adapter: Adapter;\n #schemas?: string[];\n\n constructor(adapter: Adapter, config: PostgresIndexesGroundingConfig = {}) {\n super(config);\n this.#adapter = adapter;\n this.#schemas = config.schemas;\n }\n\n protected override async getIndexes(tableName: string): Promise<TableIndex[]> {\n const { schema, table } = this.#adapter.parseTableName(tableName);\n\n const rows = await this.#adapter.runQuery<IndexRow>(`\n SELECT\n i.relname AS index_name,\n a.attname AS column_name,\n ix.indisunique AS is_unique,\n am.amname AS index_type,\n array_position(ix.indkey, a.attnum) AS column_position\n FROM pg_index ix\n JOIN pg_class i ON i.oid = ix.indexrelid\n JOIN pg_class t ON t.oid = ix.indrelid\n JOIN pg_namespace n ON n.oid = t.relnamespace\n JOIN pg_attribute a ON a.attrelid = t.oid AND a.attnum = ANY(ix.indkey)\n JOIN pg_am am ON am.oid = i.relam\n WHERE n.nspname = '${this.#adapter.escapeString(schema)}'\n AND t.relname = '${this.#adapter.escapeString(table)}'\n ORDER BY i.relname, array_position(ix.indkey, a.attnum)\n `);\n\n return this.#groupIndexes(rows);\n }\n\n #groupIndexes(rows: IndexRow[]): TableIndex[] {\n const indexes = new Map<string, TableIndex>();\n\n for (const row of rows) {\n if (!row.index_name || !row.column_name) continue;\n\n const existing = indexes.get(row.index_name);\n if (existing) {\n existing.columns.push(row.column_name);\n } else {\n indexes.set(row.index_name, {\n name: row.index_name,\n columns: [row.column_name],\n unique: row.is_unique,\n type: row.index_type?.toUpperCase(),\n });\n }\n }\n\n return Array.from(indexes.values());\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 * PostgreSQL implementation of InfoGrounding.\n */\nexport class PostgresInfoGrounding 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 [versionRows, dbRows] = await Promise.all([\n this.#adapter.runQuery<{ version: string }>(\n 'SELECT version() AS version',\n ),\n this.#adapter.runQuery<{ db: string }>('SELECT current_database() AS db'),\n ]);\n\n return {\n dialect: 'postgresql',\n version: versionRows[0]?.version,\n database: dbRows[0]?.db,\n };\n }\n}\n", "import type { Adapter } from '../adapter.ts';\nimport {\n type Column,\n LowCardinalityGrounding,\n type LowCardinalityGroundingConfig,\n} from '../groundings/low-cardinality.grounding.ts';\n\nconst LOW_CARDINALITY_LIMIT = 20;\n\n/**\n * PostgreSQL implementation of LowCardinalityGrounding.\n */\nexport class PostgresLowCardinalityGrounding extends LowCardinalityGrounding {\n #adapter: Adapter;\n\n constructor(adapter: Adapter, config: LowCardinalityGroundingConfig = {}) {\n super(config);\n this.#adapter = adapter;\n }\n\n protected override async collectLowCardinality(\n tableName: string,\n column: Column,\n ): Promise<{ kind: 'LowCardinality'; values: string[] } | undefined> {\n const { schema, table } = this.#adapter.parseTableName(tableName);\n const tableIdentifier = `${this.#adapter.quoteIdentifier(schema)}.${this.#adapter.quoteIdentifier(table)}`;\n const columnIdentifier = this.#adapter.quoteIdentifier(column.name);\n const limit = LOW_CARDINALITY_LIMIT + 1;\n\n const sql = `\n SELECT DISTINCT ${columnIdentifier}::text AS value\n FROM ${tableIdentifier}\n WHERE ${columnIdentifier} IS NOT NULL\n LIMIT ${limit}\n `;\n\n const rows = await this.#adapter.runQuery<{ value: string | null }>(sql);\n\n if (!rows.length || rows.length > LOW_CARDINALITY_LIMIT) {\n return undefined;\n }\n\n const values: string[] = [];\n for (const row of rows) {\n if (row.value == null) {\n return undefined;\n }\n values.push(row.value);\n }\n\n if (!values.length) {\n return undefined;\n }\n\n return { kind: 'LowCardinality', values };\n }\n}\n", "import {\n Adapter,\n type ExecuteFunction,\n type GroundingFn,\n type OnProgress,\n type Relationship,\n type Table,\n type TableIndex,\n type ValidateFunction,\n} from '../adapter.ts';\n\nexport type PostgresAdapterOptions = {\n execute: ExecuteFunction;\n validate?: ValidateFunction;\n grounding: GroundingFn[];\n schemas?: string[];\n};\n\ntype TableRow = {\n table_schema: string | null;\n table_name: string | null;\n column_name: string | null;\n data_type: string | null;\n};\n\ntype RelationshipRow = {\n table_schema: string | null;\n table_name: string | null;\n column_name: string | null;\n foreign_table_schema: string | null;\n foreign_table_name: string | null;\n foreign_column_name: string | null;\n constraint_name: string | null;\n};\n\ntype PrimaryKeyRow = {\n table_schema: string | null;\n table_name: string | null;\n column_name: string | null;\n};\n\ntype IndexRow = {\n table_schema: string | null;\n table_name: string | null;\n index_name: string | null;\n column_name: string | null;\n indisunique: boolean | null;\n indisprimary: boolean | null;\n indisclustered: boolean | null;\n method: string | null;\n};\n\nconst POSTGRES_ERROR_MAP: Record<string, { type: string; hint: string }> = {\n '42P01': {\n type: 'MISSING_TABLE',\n hint: 'Check the database schema for the correct table name. Include the schema prefix if necessary.',\n },\n '42703': {\n type: 'INVALID_COLUMN',\n hint: 'Verify the column exists on the referenced table and use table aliases to disambiguate.',\n },\n '42601': {\n type: 'SYNTAX_ERROR',\n hint: 'There is a SQL syntax error. Review keywords, punctuation, and the overall query shape.',\n },\n '42P10': {\n type: 'INVALID_COLUMN',\n hint: 'Columns referenced in GROUP BY/SELECT must exist. Double-check the column names and aliases.',\n },\n '42883': {\n type: 'INVALID_FUNCTION',\n hint: 'The function or operator you used is not recognized. Confirm its name and argument types.',\n },\n};\n\nconst LOW_CARDINALITY_LIMIT = 20;\n\nfunction isPostgresError(\n error: unknown,\n): error is { code?: string; message?: string } {\n return (\n typeof error === 'object' &&\n error !== null &&\n 'code' in error &&\n typeof (error as { code?: unknown }).code === 'string'\n );\n}\n\nexport function formatPostgresError(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\n if (isPostgresError(error)) {\n const metadata = POSTGRES_ERROR_MAP[error.code ?? ''];\n if (metadata) {\n return {\n error: errorMessage,\n error_type: metadata.type,\n suggestion: metadata.hint,\n sql_attempted: sql,\n };\n }\n }\n\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\nexport class Postgres extends Adapter {\n #options: PostgresAdapterOptions;\n override readonly grounding: GroundingFn[];\n override readonly defaultSchema = 'public';\n override readonly systemSchemas = ['pg_catalog', 'information_schema'];\n\n constructor(options: PostgresAdapterOptions) {\n super();\n if (!options || typeof options.execute !== 'function') {\n throw new Error('Postgres adapter requires an execute function.');\n }\n this.#options = {\n ...options,\n schemas: options.schemas?.length ? options.schemas : undefined,\n };\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(formatPostgresError(sql, error));\n }\n }\n\n override async runQuery<Row>(sql: string): Promise<Row[]> {\n return this.#runIntrospectionQuery<Row>(sql);\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 async #loadTables(): Promise<Table[]> {\n const rows = await this.#runIntrospectionQuery<TableRow>(`\n SELECT\n c.table_schema,\n c.table_name,\n c.column_name,\n c.data_type\n FROM information_schema.columns AS c\n JOIN information_schema.tables AS t\n ON c.table_schema = t.table_schema\n AND c.table_name = t.table_name\n WHERE t.table_type = 'BASE TABLE'\n ${this.#buildSchemaFilter('c.table_schema')}\n ORDER BY c.table_schema, c.table_name, c.ordinal_position\n `);\n\n const tables = new Map<string, Table>();\n\n for (const row of rows) {\n if (!row.table_name) {\n continue;\n }\n const schema = row.table_schema ?? 'public';\n const tableName = row.table_name;\n const qualifiedName = `${schema}.${tableName}`;\n const table = tables.get(qualifiedName) ?? {\n name: qualifiedName,\n schema,\n rawName: tableName,\n columns: [],\n };\n table.columns.push({\n name: row.column_name ?? 'unknown',\n type: row.data_type ?? 'unknown',\n });\n tables.set(qualifiedName, table);\n }\n\n return Array.from(tables.values());\n }\n\n async #loadRelationships(\n filterTableNames?: string[],\n ): Promise<Relationship[]> {\n const tableFilter = this.#buildTableNamesFilter(filterTableNames);\n const rows = await this.#runIntrospectionQuery<RelationshipRow>(`\n SELECT\n tc.constraint_name,\n tc.table_schema,\n tc.table_name,\n kcu.column_name,\n ccu.table_schema AS foreign_table_schema,\n ccu.table_name AS foreign_table_name,\n ccu.column_name AS foreign_column_name\n FROM information_schema.table_constraints AS tc\n JOIN information_schema.key_column_usage AS kcu\n ON tc.constraint_name = kcu.constraint_name\n AND tc.table_schema = kcu.table_schema\n JOIN information_schema.constraint_column_usage AS ccu\n ON ccu.constraint_name = tc.constraint_name\n AND ccu.table_schema = tc.table_schema\n WHERE tc.constraint_type = 'FOREIGN KEY'\n ${this.#buildSchemaFilter('tc.table_schema')}\n ${tableFilter}\n ORDER BY tc.table_schema, tc.table_name, tc.constraint_name, kcu.ordinal_position\n `);\n\n const relationships = new Map<string, Relationship>();\n\n for (const row of rows) {\n if (!row.table_name || !row.foreign_table_name || !row.constraint_name) {\n continue;\n }\n\n const schema = row.table_schema ?? 'public';\n const referencedSchema = row.foreign_table_schema ?? 'public';\n const key = `${schema}.${row.table_name}:${row.constraint_name}`;\n\n const relationship = relationships.get(key) ?? {\n table: `${schema}.${row.table_name}`,\n from: [],\n referenced_table: `${referencedSchema}.${row.foreign_table_name}`,\n to: [],\n };\n\n relationship.from.push(row.column_name ?? 'unknown');\n relationship.to.push(row.foreign_column_name ?? 'unknown');\n\n relationships.set(key, relationship);\n }\n\n return Array.from(relationships.values());\n }\n\n async #annotateRowCounts(tables: Table[], onProgress?: OnProgress) {\n const total = tables.length;\n for (let i = 0; i < tables.length; i++) {\n const table = tables[i];\n const tableIdentifier = this.#formatQualifiedTableName(table);\n onProgress?.({\n phase: 'row_counts',\n message: `Counting rows in ${table.name}...`,\n current: i + 1,\n total,\n });\n try {\n const rows = await this.#runIntrospectionQuery<{\n count: number | string | bigint | null;\n }>(`SELECT COUNT(*) as count FROM ${tableIdentifier}`);\n const rowCount = this.#toNumber(rows[0]?.count);\n if (rowCount != null) {\n table.rowCount = rowCount;\n table.sizeHint = this.#classifyRowCount(rowCount);\n }\n } catch {\n continue;\n }\n }\n }\n\n /**\n * @deprecated Primary keys are now handled via constraints grounding.\n * This method is kept for backward compatibility but does nothing.\n */\n async #annotatePrimaryKeys(_tables: Table[]) {\n // Primary keys are now derived from constraints, not stored on columns.\n // See ConstraintGrounding for the new approach.\n }\n\n async #annotateIndexes(tables: Table[]) {\n if (!tables.length) {\n return;\n }\n const tableMap = new Map(tables.map((table) => [table.name, table]));\n const rows = await this.#runIntrospectionQuery<IndexRow>(`\n SELECT\n n.nspname AS table_schema,\n t.relname AS table_name,\n i.relname AS index_name,\n a.attname AS column_name,\n ix.indisunique,\n ix.indisprimary,\n ix.indisclustered,\n am.amname AS method\n FROM pg_index ix\n JOIN pg_class t ON t.oid = ix.indrelid\n JOIN pg_namespace n ON n.oid = t.relnamespace\n JOIN pg_class i ON i.oid = ix.indexrelid\n JOIN pg_am am ON am.oid = i.relam\n LEFT JOIN LATERAL unnest(ix.indkey) WITH ORDINALITY AS key(attnum, ordinality) ON TRUE\n LEFT JOIN pg_attribute a ON a.attrelid = t.oid AND a.attnum = key.attnum\n WHERE t.relkind = 'r'\n ${this.#buildSchemaFilter('n.nspname')}\n ORDER BY n.nspname, t.relname, i.relname, key.ordinality\n `);\n\n const indexMap = new Map<string, TableIndex>();\n\n for (const row of rows) {\n if (!row.table_name || !row.index_name) {\n continue;\n }\n const schema = row.table_schema ?? 'public';\n const tableKey = `${schema}.${row.table_name}`;\n const table = tableMap.get(tableKey);\n if (!table) {\n continue;\n }\n const indexKey = `${tableKey}:${row.index_name}`;\n let index = indexMap.get(indexKey);\n if (!index) {\n index = {\n name: row.index_name,\n columns: [],\n unique: Boolean(row.indisunique ?? false),\n type: row.indisclustered ? 'clustered' : (row.method ?? undefined),\n };\n indexMap.set(indexKey, index);\n if (!table.indexes) {\n table.indexes = [];\n }\n table.indexes.push(index);\n }\n if (row.column_name) {\n index!.columns.push(row.column_name);\n const column = table.columns.find(\n (col) => col.name === row.column_name,\n );\n if (column) {\n column.isIndexed = true;\n }\n }\n }\n }\n\n async #annotateColumnStats(tables: Table[], onProgress?: OnProgress) {\n if (!tables.length) {\n return;\n }\n const total = tables.length;\n for (let i = 0; i < tables.length; i++) {\n const table = tables[i];\n const tableIdentifier = this.#formatQualifiedTableName(table);\n onProgress?.({\n phase: 'column_stats',\n message: `Collecting stats for ${table.name}...`,\n current: i + 1,\n total,\n });\n for (const column of table.columns) {\n if (!this.#shouldCollectStats(column.type)) {\n continue;\n }\n const columnIdentifier = this.#quoteIdentifier(column.name);\n const sql = `\n SELECT\n MIN(${columnIdentifier})::text AS min_value,\n MAX(${columnIdentifier})::text AS max_value,\n AVG(CASE WHEN ${columnIdentifier} IS NULL THEN 1.0 ELSE 0.0 END)::float AS null_fraction\n FROM ${tableIdentifier}\n `;\n try {\n const rows = await this.#runIntrospectionQuery<{\n min_value: string | null;\n max_value: string | null;\n null_fraction: number | string | null;\n }>(sql);\n if (!rows.length) {\n continue;\n }\n const min = rows[0]?.min_value ?? undefined;\n const max = rows[0]?.max_value ?? undefined;\n const nullFraction = this.#toNumber(rows[0]?.null_fraction);\n if (min != null || max != null || nullFraction != null) {\n column.stats = {\n min,\n max,\n nullFraction:\n nullFraction != null && Number.isFinite(nullFraction)\n ? Math.max(0, Math.min(1, nullFraction))\n : undefined,\n };\n }\n } catch {\n continue;\n }\n }\n }\n }\n\n async #annotateLowCardinalityColumns(\n tables: Table[],\n onProgress?: OnProgress,\n ) {\n const total = tables.length;\n for (let i = 0; i < tables.length; i++) {\n const table = tables[i];\n const tableIdentifier = this.#formatQualifiedTableName(table);\n onProgress?.({\n phase: 'low_cardinality',\n message: `Analyzing cardinality in ${table.name}...`,\n current: i + 1,\n total,\n });\n for (const column of table.columns) {\n const columnIdentifier = this.#quoteIdentifier(column.name);\n const limit = LOW_CARDINALITY_LIMIT + 1;\n const sql = `\n SELECT DISTINCT ${columnIdentifier} AS value\n FROM ${tableIdentifier}\n WHERE ${columnIdentifier} IS NOT NULL\n LIMIT ${limit}\n `;\n\n let rows: Array<{ value: unknown }> = [];\n try {\n rows = await this.#runIntrospectionQuery<{ value: unknown }>(sql);\n } catch {\n continue;\n }\n\n if (!rows.length || rows.length > LOW_CARDINALITY_LIMIT) {\n continue;\n }\n\n const values: string[] = [];\n let shouldSkip = false;\n for (const row of rows) {\n const formatted = this.#normalizeValue(row.value);\n if (formatted == null) {\n shouldSkip = true;\n break;\n }\n values.push(formatted);\n }\n\n if (shouldSkip || !values.length) {\n continue;\n }\n\n column.kind = 'LowCardinality';\n column.values = values;\n }\n }\n }\n\n #buildSchemaFilter(columnName: string) {\n if (this.#options.schemas && this.#options.schemas.length > 0) {\n const values = this.#options.schemas\n .map((schema) => `'${schema.replace(/'/g, \"''\")}'`)\n .join(', ');\n return `AND ${columnName} IN (${values})`;\n }\n\n return `AND ${columnName} NOT IN ('pg_catalog', 'information_schema')`;\n }\n\n /**\n * Build a filter for table names (qualified as schema.table).\n * Matches if either the source table or referenced table is in the list.\n */\n #buildTableNamesFilter(tableNames?: string[]): string {\n if (!tableNames || tableNames.length === 0) {\n return '';\n }\n\n const conditions: string[] = [];\n\n for (const name of tableNames) {\n if (name.includes('.')) {\n const [schema, ...rest] = name.split('.');\n const tableName = rest.join('.');\n const escapedSchema = schema.replace(/'/g, \"''\");\n const escapedTable = tableName.replace(/'/g, \"''\");\n // Match source table\n conditions.push(\n `(tc.table_schema = '${escapedSchema}' AND tc.table_name = '${escapedTable}')`,\n );\n // Match referenced table\n conditions.push(\n `(ccu.table_schema = '${escapedSchema}' AND ccu.table_name = '${escapedTable}')`,\n );\n } else {\n // Unqualified name - match just the table name\n const escaped = name.replace(/'/g, \"''\");\n conditions.push(`tc.table_name = '${escaped}'`);\n conditions.push(`ccu.table_name = '${escaped}'`);\n }\n }\n\n return `AND (${conditions.join(' OR ')})`;\n }\n\n async #runIntrospectionQuery<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 'Postgres adapter execute() must return an array of rows or an object with a rows array when introspecting.',\n );\n }\n\n #quoteIdentifier(name: string) {\n return `\"${name.replace(/\"/g, '\"\"')}\"`;\n }\n\n #formatQualifiedTableName(table: Table) {\n if (table.schema && table.rawName) {\n return `${this.#quoteIdentifier(table.schema)}.${this.#quoteIdentifier(table.rawName)}`;\n }\n\n if (table.name.includes('.')) {\n const [schemaPart, ...rest] = table.name.split('.');\n const tablePart = rest.join('.') || schemaPart;\n if (rest.length === 0) {\n return this.#quoteIdentifier(schemaPart);\n }\n return `${this.#quoteIdentifier(schemaPart)}.${this.#quoteIdentifier(tablePart)}`;\n }\n\n return this.#quoteIdentifier(table.name);\n }\n\n #toNumber(value: unknown): number | null {\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 : null;\n }\n return null;\n }\n\n #shouldCollectStats(type: string | undefined) {\n if (!type) {\n return false;\n }\n const normalized = type.toLowerCase();\n return /int|numeric|decimal|double|real|money|date|time|timestamp|bool/.test(\n normalized,\n );\n }\n\n #classifyRowCount(count: number): Table['sizeHint'] {\n if (count < 100) {\n return 'tiny';\n }\n if (count < 1000) {\n return 'small';\n }\n if (count < 10000) {\n return 'medium';\n }\n if (count < 100000) {\n return 'large';\n }\n return 'huge';\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 * PostgreSQL implementation of RowCountGrounding.\n */\nexport class PostgresRowCountGrounding 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 { schema, table } = this.#adapter.parseTableName(tableName);\n const tableIdentifier = `${this.#adapter.quoteIdentifier(schema)}.${this.#adapter.quoteIdentifier(table)}`;\n\n const rows = await this.#adapter.runQuery<{ count: number | string | bigint | null }>(\n `SELECT COUNT(*) as count FROM ${tableIdentifier}`,\n );\n\n return this.#adapter.toNumber(rows[0]?.count);\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 column_name: string | null;\n data_type: string | null;\n};\n\ntype RelationshipRow = {\n table_schema: string | null;\n table_name: string | null;\n column_name: string | null;\n foreign_table_schema: string | null;\n foreign_table_name: string | null;\n foreign_column_name: string | null;\n constraint_name: string | null;\n};\n\nexport interface PostgresTableGroundingConfig extends TableGroundingConfig {\n /** Schemas to include (defaults to excluding pg_catalog and information_schema) */\n schemas?: string[];\n}\n\n/**\n * PostgreSQL implementation of TableGrounding.\n *\n * PostgreSQL can query incoming relationships directly via information_schema,\n * so no caching is needed like SQLite.\n */\nexport class PostgresTableGrounding extends TableGrounding {\n #adapter: Adapter;\n #schemas?: string[];\n\n constructor(adapter: Adapter, config: PostgresTableGroundingConfig = {}) {\n super(config);\n this.#adapter = adapter;\n this.#schemas = config.schemas;\n }\n\n protected override async getAllTableNames(): Promise<string[]> {\n const rows = await this.#adapter.runQuery<{ name: string }>(`\n SELECT DISTINCT table_schema || '.' || table_name AS name\n FROM information_schema.tables\n WHERE table_type = 'BASE TABLE'\n ${this.#adapter.buildSchemaFilter('table_schema', this.#schemas)}\n ORDER BY name\n `);\n return rows.map((r) => r.name);\n }\n\n protected override async getTable(tableName: string): Promise<Table> {\n const { schema, table } = this.#adapter.parseTableName(tableName);\n\n const columns = await this.#adapter.runQuery<ColumnRow>(`\n SELECT column_name, data_type\n FROM information_schema.columns\n WHERE table_schema = '${this.#adapter.escapeString(schema)}'\n AND table_name = '${this.#adapter.escapeString(table)}'\n ORDER BY ordinal_position\n `);\n\n return {\n name: tableName,\n schema,\n rawName: table,\n columns: columns.map((col) => ({\n name: col.column_name ?? 'unknown',\n type: col.data_type ?? 'unknown',\n })),\n };\n }\n\n protected override async findOutgoingRelations(\n tableName: string,\n ): Promise<Relationship[]> {\n const { schema, table } = this.#adapter.parseTableName(tableName);\n\n const rows = await this.#adapter.runQuery<RelationshipRow>(`\n SELECT\n tc.constraint_name,\n tc.table_schema,\n tc.table_name,\n kcu.column_name,\n ccu.table_schema AS foreign_table_schema,\n ccu.table_name AS foreign_table_name,\n ccu.column_name AS foreign_column_name\n FROM information_schema.table_constraints AS tc\n JOIN information_schema.key_column_usage AS kcu\n ON tc.constraint_name = kcu.constraint_name\n AND tc.table_schema = kcu.table_schema\n JOIN information_schema.constraint_column_usage AS ccu\n ON ccu.constraint_name = tc.constraint_name\n AND ccu.table_schema = tc.table_schema\n WHERE tc.constraint_type = 'FOREIGN KEY'\n AND tc.table_schema = '${this.#adapter.escapeString(schema)}'\n AND tc.table_name = '${this.#adapter.escapeString(table)}'\n ORDER BY tc.constraint_name, kcu.ordinal_position\n `);\n\n return this.#groupRelationships(rows);\n }\n\n protected override async findIncomingRelations(\n tableName: string,\n ): Promise<Relationship[]> {\n const { schema, table } = this.#adapter.parseTableName(tableName);\n\n // PostgreSQL can query incoming relations directly - no cache needed\n const rows = await this.#adapter.runQuery<RelationshipRow>(`\n SELECT\n tc.constraint_name,\n tc.table_schema,\n tc.table_name,\n kcu.column_name,\n ccu.table_schema AS foreign_table_schema,\n ccu.table_name AS foreign_table_name,\n ccu.column_name AS foreign_column_name\n FROM information_schema.table_constraints AS tc\n JOIN information_schema.key_column_usage AS kcu\n ON tc.constraint_name = kcu.constraint_name\n AND tc.table_schema = kcu.table_schema\n JOIN information_schema.constraint_column_usage AS ccu\n ON ccu.constraint_name = tc.constraint_name\n AND ccu.table_schema = tc.table_schema\n WHERE tc.constraint_type = 'FOREIGN KEY'\n AND ccu.table_schema = '${this.#adapter.escapeString(schema)}'\n AND ccu.table_name = '${this.#adapter.escapeString(table)}'\n ORDER BY tc.constraint_name, kcu.ordinal_position\n `);\n\n return this.#groupRelationships(rows);\n }\n\n #groupRelationships(rows: RelationshipRow[]): Relationship[] {\n const relationships = new Map<string, Relationship>();\n const defaultSchema = this.#adapter.defaultSchema ?? 'public';\n\n for (const row of rows) {\n if (!row.table_name || !row.foreign_table_name || !row.constraint_name) {\n continue;\n }\n\n const schema = row.table_schema ?? defaultSchema;\n const referencedSchema = row.foreign_table_schema ?? defaultSchema;\n const key = `${schema}.${row.table_name}:${row.constraint_name}`;\n\n const relationship = relationships.get(key) ?? {\n table: `${schema}.${row.table_name}`,\n from: [],\n referenced_table: `${referencedSchema}.${row.foreign_table_name}`,\n to: [],\n };\n\n relationship.from.push(row.column_name ?? 'unknown');\n relationship.to.push(row.foreign_column_name ?? 'unknown');\n\n relationships.set(key, relationship);\n }\n\n return Array.from(relationships.values());\n }\n}\n", "import type { ColumnStats, Filter } from '../adapter.ts';\nimport { AbstractGrounding } from '../grounding.ticket.ts';\nimport type { GroundingContext } from './context.ts';\n\n/**\n * Represents a database view with its metadata.\n */\nexport interface View {\n name: string;\n schema?: string;\n rawName?: string;\n /** The SQL definition of the view (CREATE VIEW statement or query) */\n definition?: string;\n columns: {\n name: string;\n type: string;\n /** Low cardinality marker */\n kind?: 'LowCardinality';\n /** Distinct values for low cardinality columns */\n values?: string[];\n /** Column statistics (min, max, nullFraction) */\n stats?: ColumnStats;\n }[];\n}\n\n/**\n * Configuration for ViewGrounding.\n */\nexport interface ViewGroundingConfig {\n /** Filter to select views */\n filter?: Filter;\n}\n\n/**\n * Abstract base class for view grounding\n *\n * The `execute()` method implements the algorithm that discovers views.\n * Subclasses implement the database-specific hooks:\n * - `getAllViewNames()` - list all views\n * - `getView()` - get view metadata\n */\nexport abstract class ViewGrounding extends AbstractGrounding {\n #filter?: Filter;\n\n constructor(config: ViewGroundingConfig = {}) {\n super('views');\n this.#filter = config.filter;\n }\n\n /** Get all view names in the database */\n protected abstract getAllViewNames(): Promise<string[]>;\n\n /** Get full view metadata for a single view */\n protected abstract getView(viewName: string): Promise<View>;\n\n /**\n * Execute the grounding process.\n * Writes discovered views to the context.\n */\n async execute(ctx: GroundingContext) {\n const viewNames = await this.applyFilter();\n const views = await Promise.all(\n viewNames.map((name) => this.getView(name)),\n );\n ctx.views.push(...views);\n return () => this.#describe(views);\n }\n\n #describe(views: View[]): string {\n if (!views.length) {\n return 'No views available.';\n }\n\n return views\n .map((view) => {\n const columns = view.columns\n .map((column) => {\n const annotations: string[] = [];\n if (column.kind === 'LowCardinality' && column.values?.length) {\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 const definition = view.definition\n ? `\\n Definition: ${view.definition.length > 200 ? view.definition.slice(0, 200) + '...' : view.definition}`\n : '';\n\n return `- View: ${view.name}${definition}\\n Columns:\\n${columns}`;\n })\n .join('\\n\\n');\n }\n\n /**\n * Apply the filter to get view names.\n * If filter is an explicit array, skip querying all view 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.getAllViewNames();\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", "import type { Adapter } from '../adapter.ts';\nimport {\n type View,\n ViewGrounding,\n type ViewGroundingConfig,\n} from '../groundings/view.grounding.ts';\n\ntype ColumnRow = {\n column_name: string | null;\n data_type: string | null;\n};\n\nexport interface PostgresViewGroundingConfig extends ViewGroundingConfig {\n /** Schemas to include (defaults to excluding pg_catalog and information_schema) */\n schemas?: string[];\n}\n\n/**\n * PostgreSQL implementation of ViewGrounding.\n */\nexport class PostgresViewGrounding extends ViewGrounding {\n #adapter: Adapter;\n #schemas?: string[];\n\n constructor(adapter: Adapter, config: PostgresViewGroundingConfig = {}) {\n super(config);\n this.#adapter = adapter;\n this.#schemas = config.schemas;\n }\n\n protected override async getAllViewNames(): Promise<string[]> {\n const rows = await this.#adapter.runQuery<{ name: string }>(`\n SELECT table_schema || '.' || table_name AS name\n FROM information_schema.views\n WHERE 1=1\n ${this.#adapter.buildSchemaFilter('table_schema', this.#schemas)}\n ORDER BY name\n `);\n return rows.map((r) => r.name);\n }\n\n protected override async getView(viewName: string): Promise<View> {\n const { schema, table: view } = this.#adapter.parseTableName(viewName);\n\n // Get view definition from pg_views\n const defRows = await this.#adapter.runQuery<{\n definition: string | null;\n }>(`\n SELECT definition\n FROM pg_views\n WHERE schemaname = '${this.#adapter.escapeString(schema)}'\n AND viewname = '${this.#adapter.escapeString(view)}'\n `);\n\n // Get columns from information_schema\n const columns = await this.#adapter.runQuery<ColumnRow>(`\n SELECT column_name, data_type\n FROM information_schema.columns\n WHERE table_schema = '${this.#adapter.escapeString(schema)}'\n AND table_name = '${this.#adapter.escapeString(view)}'\n ORDER BY ordinal_position\n `);\n\n return {\n name: viewName,\n schema,\n rawName: view,\n definition: defRows[0]?.definition ?? undefined,\n columns: columns.map((col) => ({\n name: col.column_name ?? 'unknown',\n type: col.data_type ?? 'unknown',\n })),\n };\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 LowCardinalityGroundingConfig } from '../groundings/low-cardinality.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 { PostgresColumnStatsGrounding } from './column-stats.postgres.grounding.ts';\nimport { PostgresConstraintGrounding } from './constraint.postgres.grounding.ts';\nimport { PostgresIndexesGrounding } from './indexes.postgres.grounding.ts';\nimport { PostgresInfoGrounding } from './info.postgres.grounding.ts';\nimport { PostgresLowCardinalityGrounding } from './low-cardinality.postgres.grounding.ts';\nimport { Postgres } from './postgres.ts';\nimport { PostgresRowCountGrounding } from './row-count.postgres.grounding.ts';\nimport { PostgresTableGrounding } from './table.postgres.grounding.ts';\nimport { PostgresViewGrounding } from './view.postgres.grounding.ts';\n\nexport * from './postgres.ts';\n\nexport function tables(config: TableGroundingConfig = {}) {\n return (adapter: Adapter) => new PostgresTableGrounding(adapter, config);\n}\n\nexport function info(config: InfoGroundingConfig = {}) {\n return (adapter: Adapter) => new PostgresInfoGrounding(adapter, config);\n}\n\nexport function views(config: ViewGroundingConfig = {}) {\n return (adapter: Adapter) => {\n return new PostgresViewGrounding(adapter, config);\n };\n}\n\nexport function columnStats(config: ColumnStatsGroundingConfig = {}) {\n return (adapter: Adapter) => {\n return new PostgresColumnStatsGrounding(adapter, config);\n };\n}\n\nexport function lowCardinality(config: LowCardinalityGroundingConfig = {}) {\n return (adapter: Adapter) => {\n return new PostgresLowCardinalityGrounding(adapter, config);\n };\n}\n\nexport function indexes(config: IndexesGroundingConfig = {}) {\n return (adapter: Adapter) => {\n return new PostgresIndexesGrounding(adapter, config);\n };\n}\n\nexport function rowCount(config: RowCountGroundingConfig = {}) {\n return (adapter: Adapter) => {\n return new PostgresRowCountGrounding(adapter, config);\n };\n}\n\nexport function constraints(config: ConstraintGroundingConfig = {}) {\n return (adapter: Adapter) => {\n return new PostgresConstraintGrounding(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 lowCardinality,\n indexes,\n rowCount,\n constraints,\n report,\n Postgres,\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["report", "tables", "indexes", "constraints", "indexes", "LOW_CARDINALITY_LIMIT", "tables", "rowCount", "views"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Adapter, TableIndex } from '../adapter.ts';
|
|
2
|
+
import { IndexesGrounding, type IndexesGroundingConfig } from '../groundings/indexes.grounding.ts';
|
|
3
|
+
export interface PostgresIndexesGroundingConfig extends IndexesGroundingConfig {
|
|
4
|
+
/** Schemas to include (defaults to excluding pg_catalog and information_schema) */
|
|
5
|
+
schemas?: string[];
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* PostgreSQL implementation of IndexesGrounding.
|
|
9
|
+
*/
|
|
10
|
+
export declare class PostgresIndexesGrounding extends IndexesGrounding {
|
|
11
|
+
#private;
|
|
12
|
+
constructor(adapter: Adapter, config?: PostgresIndexesGroundingConfig);
|
|
13
|
+
protected getIndexes(tableName: string): Promise<TableIndex[]>;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=indexes.postgres.grounding.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"indexes.postgres.grounding.d.ts","sourceRoot":"","sources":["../../../../src/lib/adapters/postgres/indexes.postgres.grounding.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EACL,gBAAgB,EAChB,KAAK,sBAAsB,EAC5B,MAAM,oCAAoC,CAAC;AAU5C,MAAM,WAAW,8BAA+B,SAAQ,sBAAsB;IAC5E,mFAAmF;IACnF,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;GAEG;AACH,qBAAa,wBAAyB,SAAQ,gBAAgB;;gBAIhD,OAAO,EAAE,OAAO,EAAE,MAAM,GAAE,8BAAmC;cAMhD,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;CA6C9E"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Adapter, AdapterInfo } from '../adapter.ts';
|
|
2
|
+
import { InfoGrounding, type InfoGroundingConfig } from '../groundings/info.grounding.ts';
|
|
3
|
+
/**
|
|
4
|
+
* PostgreSQL implementation of InfoGrounding.
|
|
5
|
+
*/
|
|
6
|
+
export declare class PostgresInfoGrounding extends InfoGrounding {
|
|
7
|
+
#private;
|
|
8
|
+
constructor(adapter: Adapter, config?: InfoGroundingConfig);
|
|
9
|
+
protected collectInfo(): Promise<AdapterInfo>;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=info.postgres.grounding.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"info.postgres.grounding.d.ts","sourceRoot":"","sources":["../../../../src/lib/adapters/postgres/info.postgres.grounding.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EACL,aAAa,EACb,KAAK,mBAAmB,EACzB,MAAM,iCAAiC,CAAC;AAEzC;;GAEG;AACH,qBAAa,qBAAsB,SAAQ,aAAa;;gBAG1C,OAAO,EAAE,OAAO,EAAE,MAAM,GAAE,mBAAwB;cAKrC,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC;CAc7D"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Adapter } from '../adapter.ts';
|
|
2
|
+
import { type Column, LowCardinalityGrounding, type LowCardinalityGroundingConfig } from '../groundings/low-cardinality.grounding.ts';
|
|
3
|
+
/**
|
|
4
|
+
* PostgreSQL implementation of LowCardinalityGrounding.
|
|
5
|
+
*/
|
|
6
|
+
export declare class PostgresLowCardinalityGrounding extends LowCardinalityGrounding {
|
|
7
|
+
#private;
|
|
8
|
+
constructor(adapter: Adapter, config?: LowCardinalityGroundingConfig);
|
|
9
|
+
protected collectLowCardinality(tableName: string, column: Column): Promise<{
|
|
10
|
+
kind: 'LowCardinality';
|
|
11
|
+
values: string[];
|
|
12
|
+
} | undefined>;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=low-cardinality.postgres.grounding.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"low-cardinality.postgres.grounding.d.ts","sourceRoot":"","sources":["../../../../src/lib/adapters/postgres/low-cardinality.postgres.grounding.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EACL,KAAK,MAAM,EACX,uBAAuB,EACvB,KAAK,6BAA6B,EACnC,MAAM,4CAA4C,CAAC;AAIpD;;GAEG;AACH,qBAAa,+BAAgC,SAAQ,uBAAuB;;gBAG9D,OAAO,EAAE,OAAO,EAAE,MAAM,GAAE,6BAAkC;cAK/C,qBAAqB,CAC5C,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC;QAAE,IAAI,EAAE,gBAAgB,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,SAAS,CAAC;CAiCrE"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Adapter, type ExecuteFunction, type GroundingFn, type ValidateFunction } from '../adapter.ts';
|
|
2
|
+
export type PostgresAdapterOptions = {
|
|
3
|
+
execute: ExecuteFunction;
|
|
4
|
+
validate?: ValidateFunction;
|
|
5
|
+
grounding: GroundingFn[];
|
|
6
|
+
schemas?: string[];
|
|
7
|
+
};
|
|
8
|
+
export declare function formatPostgresError(sql: string, error: unknown): {
|
|
9
|
+
error: string;
|
|
10
|
+
error_type: string;
|
|
11
|
+
suggestion: string;
|
|
12
|
+
sql_attempted: string;
|
|
13
|
+
};
|
|
14
|
+
export declare class Postgres extends Adapter {
|
|
15
|
+
#private;
|
|
16
|
+
readonly grounding: GroundingFn[];
|
|
17
|
+
readonly defaultSchema = "public";
|
|
18
|
+
readonly systemSchemas: string[];
|
|
19
|
+
constructor(options: PostgresAdapterOptions);
|
|
20
|
+
execute(sql: string): Promise<any>;
|
|
21
|
+
validate(sql: string): Promise<string | void>;
|
|
22
|
+
runQuery<Row>(sql: string): Promise<Row[]>;
|
|
23
|
+
quoteIdentifier(name: string): string;
|
|
24
|
+
escape(value: string): string;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=postgres.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postgres.d.ts","sourceRoot":"","sources":["../../../../src/lib/adapters/postgres/postgres.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EACP,KAAK,eAAe,EACpB,KAAK,WAAW,EAKhB,KAAK,gBAAgB,EACtB,MAAM,eAAe,CAAC;AAEvB,MAAM,MAAM,sBAAsB,GAAG;IACnC,OAAO,EAAE,eAAe,CAAC;IACzB,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B,SAAS,EAAE,WAAW,EAAE,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB,CAAC;AAwEF,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO;;;;;EA0B9D;AAED,qBAAa,QAAS,SAAQ,OAAO;;IAEnC,SAAkB,SAAS,EAAE,WAAW,EAAE,CAAC;IAC3C,SAAkB,aAAa,YAAY;IAC3C,SAAkB,aAAa,WAAwC;gBAE3D,OAAO,EAAE,sBAAsB;IAY5B,OAAO,CAAC,GAAG,EAAE,MAAM;IAInB,QAAQ,CAAC,GAAG,EAAE,MAAM;IAcpB,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAIhD,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAIrC,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;CA4cvC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Adapter } from '../adapter.ts';
|
|
2
|
+
import { RowCountGrounding, type RowCountGroundingConfig } from '../groundings/row-count.grounding.ts';
|
|
3
|
+
/**
|
|
4
|
+
* PostgreSQL implementation of RowCountGrounding.
|
|
5
|
+
*/
|
|
6
|
+
export declare class PostgresRowCountGrounding extends RowCountGrounding {
|
|
7
|
+
#private;
|
|
8
|
+
constructor(adapter: Adapter, config?: RowCountGroundingConfig);
|
|
9
|
+
protected getRowCount(tableName: string): Promise<number | undefined>;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=row-count.postgres.grounding.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"row-count.postgres.grounding.d.ts","sourceRoot":"","sources":["../../../../src/lib/adapters/postgres/row-count.postgres.grounding.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EACL,iBAAiB,EACjB,KAAK,uBAAuB,EAC7B,MAAM,sCAAsC,CAAC;AAE9C;;GAEG;AACH,qBAAa,yBAA0B,SAAQ,iBAAiB;;gBAGlD,OAAO,EAAE,OAAO,EAAE,MAAM,GAAE,uBAA4B;cAKzC,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;CAUrF"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { Adapter, Relationship, Table } from '../adapter.ts';
|
|
2
|
+
import { TableGrounding, type TableGroundingConfig } from '../groundings/table.grounding.ts';
|
|
3
|
+
export interface PostgresTableGroundingConfig extends TableGroundingConfig {
|
|
4
|
+
/** Schemas to include (defaults to excluding pg_catalog and information_schema) */
|
|
5
|
+
schemas?: string[];
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* PostgreSQL implementation of TableGrounding.
|
|
9
|
+
*
|
|
10
|
+
* PostgreSQL can query incoming relationships directly via information_schema,
|
|
11
|
+
* so no caching is needed like SQLite.
|
|
12
|
+
*/
|
|
13
|
+
export declare class PostgresTableGrounding extends TableGrounding {
|
|
14
|
+
#private;
|
|
15
|
+
constructor(adapter: Adapter, config?: PostgresTableGroundingConfig);
|
|
16
|
+
protected getAllTableNames(): Promise<string[]>;
|
|
17
|
+
protected getTable(tableName: string): Promise<Table>;
|
|
18
|
+
protected findOutgoingRelations(tableName: string): Promise<Relationship[]>;
|
|
19
|
+
protected findIncomingRelations(tableName: string): Promise<Relationship[]>;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=table.postgres.grounding.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table.postgres.grounding.d.ts","sourceRoot":"","sources":["../../../../src/lib/adapters/postgres/table.postgres.grounding.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAClE,OAAO,EACL,cAAc,EACd,KAAK,oBAAoB,EAC1B,MAAM,kCAAkC,CAAC;AAiB1C,MAAM,WAAW,4BAA6B,SAAQ,oBAAoB;IACxE,mFAAmF;IACnF,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;;;;GAKG;AACH,qBAAa,sBAAuB,SAAQ,cAAc;;gBAI5C,OAAO,EAAE,OAAO,EAAE,MAAM,GAAE,4BAAiC;cAM9C,gBAAgB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;cAWrC,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;cAsB3C,qBAAqB,CAC5C,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,YAAY,EAAE,CAAC;cA4BD,qBAAqB,CAC5C,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,YAAY,EAAE,CAAC;CAyD3B"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Adapter } from '../adapter.ts';
|
|
2
|
+
import { type View, ViewGrounding, type ViewGroundingConfig } from '../groundings/view.grounding.ts';
|
|
3
|
+
export interface PostgresViewGroundingConfig extends ViewGroundingConfig {
|
|
4
|
+
/** Schemas to include (defaults to excluding pg_catalog and information_schema) */
|
|
5
|
+
schemas?: string[];
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* PostgreSQL implementation of ViewGrounding.
|
|
9
|
+
*/
|
|
10
|
+
export declare class PostgresViewGrounding extends ViewGrounding {
|
|
11
|
+
#private;
|
|
12
|
+
constructor(adapter: Adapter, config?: PostgresViewGroundingConfig);
|
|
13
|
+
protected getAllViewNames(): Promise<string[]>;
|
|
14
|
+
protected getView(viewName: string): Promise<View>;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=view.postgres.grounding.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"view.postgres.grounding.d.ts","sourceRoot":"","sources":["../../../../src/lib/adapters/postgres/view.postgres.grounding.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EACL,KAAK,IAAI,EACT,aAAa,EACb,KAAK,mBAAmB,EACzB,MAAM,iCAAiC,CAAC;AAOzC,MAAM,WAAW,2BAA4B,SAAQ,mBAAmB;IACtE,mFAAmF;IACnF,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;GAEG;AACH,qBAAa,qBAAsB,SAAQ,aAAa;;gBAI1C,OAAO,EAAE,OAAO,EAAE,MAAM,GAAE,2BAAgC;cAM7C,eAAe,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;cAWpC,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAiClE"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Adapter, ColumnStats } from '../adapter.ts';
|
|
2
|
+
import { ColumnStatsGrounding, type ColumnStatsGroundingConfig } from '../groundings/column-stats.grounding.ts';
|
|
3
|
+
import type { Column } from '../groundings/context.ts';
|
|
4
|
+
/**
|
|
5
|
+
* SQLite implementation of ColumnStatsGrounding.
|
|
6
|
+
*/
|
|
7
|
+
export declare class SqliteColumnStatsGrounding extends ColumnStatsGrounding {
|
|
8
|
+
#private;
|
|
9
|
+
constructor(adapter: Adapter, config?: ColumnStatsGroundingConfig);
|
|
10
|
+
protected collectStats(tableName: string, column: Column): Promise<ColumnStats | undefined>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=column-stats.sqlite.grounding.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"column-stats.sqlite.grounding.d.ts","sourceRoot":"","sources":["../../../../src/lib/adapters/sqlite/column-stats.sqlite.grounding.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EACL,oBAAoB,EACpB,KAAK,0BAA0B,EAChC,MAAM,yCAAyC,CAAC;AACjD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAEvD;;GAEG;AACH,qBAAa,0BAA2B,SAAQ,oBAAoB;;gBAGtD,OAAO,EAAE,OAAO,EAAE,MAAM,GAAE,0BAA+B;cAK5C,YAAY,CACnC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;CA2EpC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Adapter, TableConstraint } from '../adapter.ts';
|
|
2
|
+
import { ConstraintGrounding, type ConstraintGroundingConfig } from '../groundings/constraint.grounding.ts';
|
|
3
|
+
/**
|
|
4
|
+
* SQLite implementation of ConstraintGrounding.
|
|
5
|
+
*
|
|
6
|
+
* SQLite stores constraints in the CREATE TABLE DDL, so we need to:
|
|
7
|
+
* 1. Use PRAGMA table_info for NOT NULL and DEFAULT
|
|
8
|
+
* 2. Parse the DDL for CHECK constraints
|
|
9
|
+
*/
|
|
10
|
+
export declare class SqliteConstraintGrounding extends ConstraintGrounding {
|
|
11
|
+
#private;
|
|
12
|
+
constructor(adapter: Adapter, config?: ConstraintGroundingConfig);
|
|
13
|
+
protected getConstraints(tableName: string): Promise<TableConstraint[]>;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=constraint.sqlite.grounding.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constraint.sqlite.grounding.d.ts","sourceRoot":"","sources":["../../../../src/lib/adapters/sqlite/constraint.sqlite.grounding.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAC9D,OAAO,EACL,mBAAmB,EACnB,KAAK,yBAAyB,EAC/B,MAAM,uCAAuC,CAAC;AAuB/C;;;;;;GAMG;AACH,qBAAa,yBAA0B,SAAQ,mBAAmB;;gBAGpD,OAAO,EAAE,OAAO,EAAE,MAAM,GAAE,yBAA8B;cAK3C,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;CAgIvF"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { type Adapter } from '../adapter.ts';
|
|
2
|
+
import { type ColumnStatsGroundingConfig } from '../groundings/column-stats.grounding.ts';
|
|
3
|
+
import { type ConstraintGroundingConfig } from '../groundings/constraint.grounding.ts';
|
|
4
|
+
import { type IndexesGroundingConfig } from '../groundings/indexes.grounding.ts';
|
|
5
|
+
import { type InfoGroundingConfig } from '../groundings/info.grounding.ts';
|
|
6
|
+
import { type LowCardinalityGroundingConfig } from '../groundings/low-cardinality.grounding.ts';
|
|
7
|
+
import { ReportGrounding, type ReportGroundingConfig } from '../groundings/report.grounding.ts';
|
|
8
|
+
import { type RowCountGroundingConfig } from '../groundings/row-count.grounding.ts';
|
|
9
|
+
import { type TableGroundingConfig } from '../groundings/table.grounding.ts';
|
|
10
|
+
import type { ViewGroundingConfig } from '../groundings/view.grounding.ts';
|
|
11
|
+
import { SqliteColumnStatsGrounding } from './column-stats.sqlite.grounding.ts';
|
|
12
|
+
import { SqliteConstraintGrounding } from './constraint.sqlite.grounding.ts';
|
|
13
|
+
import { SqliteIndexesGrounding } from './indexes.sqlite.grounding.ts';
|
|
14
|
+
import { SqliteInfoGrounding } from './info.sqlite.grounding.ts';
|
|
15
|
+
import { SqliteLowCardinalityGrounding } from './low-cardinality.sqlite.grounding.ts';
|
|
16
|
+
import { SqliteRowCountGrounding } from './row-count.sqlite.grounding.ts';
|
|
17
|
+
import { Sqlite } from './sqlite.ts';
|
|
18
|
+
import { SqliteTableGrounding } from './table.sqlite.grounding.ts';
|
|
19
|
+
import { SqliteViewGrounding } from './view.sqlite.grounding.ts';
|
|
20
|
+
export * from './sqlite.ts';
|
|
21
|
+
export declare function tables(config?: TableGroundingConfig): (adapter: Adapter) => SqliteTableGrounding;
|
|
22
|
+
export declare function info(config?: InfoGroundingConfig): (adapter: Adapter) => SqliteInfoGrounding;
|
|
23
|
+
export declare function views(config?: ViewGroundingConfig): (adapter: Adapter) => SqliteViewGrounding;
|
|
24
|
+
export declare function columnStats(config?: ColumnStatsGroundingConfig): (adapter: Adapter) => SqliteColumnStatsGrounding;
|
|
25
|
+
export declare function lowCardinality(config?: LowCardinalityGroundingConfig): (adapter: Adapter) => SqliteLowCardinalityGrounding;
|
|
26
|
+
export declare function indexes(config?: IndexesGroundingConfig): (adapter: Adapter) => SqliteIndexesGrounding;
|
|
27
|
+
export declare function rowCount(config?: RowCountGroundingConfig): (adapter: Adapter) => SqliteRowCountGrounding;
|
|
28
|
+
export declare function constraints(config?: ConstraintGroundingConfig): (adapter: Adapter) => SqliteConstraintGrounding;
|
|
29
|
+
export declare function report(config?: ReportGroundingConfig): (adapter: Adapter) => ReportGrounding;
|
|
30
|
+
declare const _default: {
|
|
31
|
+
tables: typeof tables;
|
|
32
|
+
info: typeof info;
|
|
33
|
+
views: typeof views;
|
|
34
|
+
columnStats: typeof columnStats;
|
|
35
|
+
lowCardinality: typeof lowCardinality;
|
|
36
|
+
indexes: typeof indexes;
|
|
37
|
+
rowCount: typeof rowCount;
|
|
38
|
+
constraints: typeof constraints;
|
|
39
|
+
report: typeof report;
|
|
40
|
+
Sqlite: typeof Sqlite;
|
|
41
|
+
};
|
|
42
|
+
export default _default;
|
|
43
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/adapters/sqlite/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,KAAK,0BAA0B,EAAE,MAAM,yCAAyC,CAAC;AAC1F,OAAO,EAAE,KAAK,yBAAyB,EAAE,MAAM,uCAAuC,CAAC;AACvF,OAAO,EAAE,KAAK,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;AACjF,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,EAAE,KAAK,6BAA6B,EAAE,MAAM,4CAA4C,CAAC;AAChG,OAAO,EACL,eAAe,EACf,KAAK,qBAAqB,EAC3B,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,KAAK,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AACpF,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AAC7E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,EAAE,0BAA0B,EAAE,MAAM,oCAAoC,CAAC;AAChF,OAAO,EAAE,yBAAyB,EAAE,MAAM,kCAAkC,CAAC;AAC7E,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,6BAA6B,EAAE,MAAM,uCAAuC,CAAC;AACtF,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEjE,cAAc,aAAa,CAAC;AAE5B,wBAAgB,MAAM,CAAC,MAAM,GAAE,oBAAyB,IAC9C,SAAS,OAAO,0BACzB;AAED,wBAAgB,IAAI,CAAC,MAAM,GAAE,mBAAwB,IAC3C,SAAS,OAAO,yBACzB;AAED,wBAAgB,KAAK,CAAC,MAAM,GAAE,mBAAwB,IAC5C,SAAS,OAAO,yBAGzB;AAED,wBAAgB,WAAW,CAAC,MAAM,GAAE,0BAA+B,IACzD,SAAS,OAAO,gCAGzB;AAED,wBAAgB,cAAc,CAAC,MAAM,GAAE,6BAAkC,IAC/D,SAAS,OAAO,mCAGzB;AAED,wBAAgB,OAAO,CAAC,MAAM,GAAE,sBAA2B,IACjD,SAAS,OAAO,4BAGzB;AAED,wBAAgB,QAAQ,CAAC,MAAM,GAAE,uBAA4B,IACnD,SAAS,OAAO,6BAGzB;AAED,wBAAgB,WAAW,CAAC,MAAM,GAAE,yBAA8B,IACxD,SAAS,OAAO,+BAGzB;AAED,wBAAgB,MAAM,CAAC,MAAM,GAAE,qBAA0B,IAC/C,SAAS,OAAO,qBACzB;;;;;;;;;;;;;AAED,wBAWE"}
|