@deepagents/text2sql 0.15.1 → 0.17.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.js +1149 -193
- package/dist/index.js.map +4 -4
- package/dist/lib/adapters/adapter.d.ts +3 -0
- package/dist/lib/adapters/adapter.d.ts.map +1 -1
- package/dist/lib/adapters/bigquery/bigquery.d.ts +1 -0
- package/dist/lib/adapters/bigquery/bigquery.d.ts.map +1 -1
- package/dist/lib/adapters/bigquery/index.js +11 -0
- package/dist/lib/adapters/bigquery/index.js.map +3 -3
- package/dist/lib/adapters/mysql/index.js +11 -0
- package/dist/lib/adapters/mysql/index.js.map +3 -3
- package/dist/lib/adapters/mysql/mysql.d.ts +1 -0
- package/dist/lib/adapters/mysql/mysql.d.ts.map +1 -1
- package/dist/lib/adapters/postgres/index.js +11 -0
- package/dist/lib/adapters/postgres/index.js.map +3 -3
- package/dist/lib/adapters/postgres/postgres.d.ts +1 -0
- package/dist/lib/adapters/postgres/postgres.d.ts.map +1 -1
- package/dist/lib/adapters/spreadsheet/index.js +11 -0
- package/dist/lib/adapters/spreadsheet/index.js.map +3 -3
- package/dist/lib/adapters/sqlite/index.js +11 -0
- package/dist/lib/adapters/sqlite/index.js.map +3 -3
- package/dist/lib/adapters/sqlite/sqlite.d.ts +1 -0
- package/dist/lib/adapters/sqlite/sqlite.d.ts.map +1 -1
- package/dist/lib/adapters/sqlserver/index.js +11 -0
- package/dist/lib/adapters/sqlserver/index.js.map +3 -3
- package/dist/lib/adapters/sqlserver/sqlserver.d.ts +1 -0
- package/dist/lib/adapters/sqlserver/sqlserver.d.ts.map +1 -1
- package/dist/lib/agents/result-tools.d.ts +9 -1
- package/dist/lib/agents/result-tools.d.ts.map +1 -1
- package/dist/lib/agents/sql.agent.d.ts.map +1 -1
- package/dist/lib/fs/index.d.ts +1 -0
- package/dist/lib/fs/index.d.ts.map +1 -1
- package/dist/lib/fs/mssql/ddl.mssql-fs.d.ts.map +1 -1
- package/dist/lib/fs/mssql/mssql-fs.d.ts +1 -0
- package/dist/lib/fs/mssql/mssql-fs.d.ts.map +1 -1
- package/dist/lib/fs/postgres/ddl.postgres-fs.d.ts +2 -0
- package/dist/lib/fs/postgres/ddl.postgres-fs.d.ts.map +1 -0
- package/dist/lib/fs/postgres/postgres-fs.d.ts +50 -0
- package/dist/lib/fs/postgres/postgres-fs.d.ts.map +1 -0
- package/dist/lib/sql.d.ts +1 -1
- package/dist/lib/sql.d.ts.map +1 -1
- package/dist/lib/synthesis/index.js +1 -9
- package/dist/lib/synthesis/index.js.map +2 -2
- package/package.json +23 -12
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../../../src/lib/
|
|
4
|
-
"sourcesContent": ["import type { ContextFragment } from '@deepagents/context';\n\n/**\n * Schema fragment builders.\n *\n * These fragments represent database schema metadata that can be injected\n * into AI prompts. Use with renderers (XML, Markdown, TOML, TOON) to format.\n *\n * @example\n * ```ts\n * import { dialectInfo, table, column, relationship } from '@deepagents/text2sql';\n *\n * const schemaFragments = [\n * dialectInfo({ dialect: 'PostgreSQL', version: '14.5' }),\n * table({\n * name: 'users',\n * columns: [\n * column({ name: 'id', type: 'integer', pk: true }),\n * column({ name: 'email', type: 'varchar', unique: true }),\n * ],\n * }),\n * ];\n * ```\n */\n\n/**\n * Database dialect and version information.\n *\n * @param input.dialect - Database type (PostgreSQL, SQLite, SQL Server, etc.)\n * @param input.version - Database version string\n * @param input.database - Database name\n *\n * @example\n * dialectInfo({ dialect: 'PostgreSQL', version: '14.5', database: 'myapp' })\n */\nexport function dialectInfo(input: {\n dialect: string;\n version?: string;\n database?: string;\n}): ContextFragment {\n return {\n name: 'dialectInfo',\n data: {\n dialect: input.dialect,\n ...(input.version && { version: input.version }),\n ...(input.database && { database: input.database }),\n },\n };\n}\n\n/**\n * Database table with columns and optional metadata.\n *\n * @param input.name - Table name\n * @param input.schema - Schema name (e.g., 'public' for PostgreSQL)\n * @param input.rowCount - Approximate row count\n * @param input.sizeHint - Size category for query optimization hints\n * @param input.columns - Array of column() fragments\n * @param input.indexes - Array of index() fragments\n * @param input.constraints - Array of constraint() fragments\n *\n * @example\n * table({\n * name: 'users',\n * rowCount: 1500,\n * sizeHint: 'medium',\n * columns: [\n * column({ name: 'id', type: 'integer', pk: true }),\n * column({ name: 'email', type: 'varchar', unique: true, indexed: true }),\n * ],\n * indexes: [\n * index({ name: 'idx_email', columns: ['email'], unique: true }),\n * ],\n * })\n */\nexport function table(input: {\n name: string;\n schema?: string;\n rowCount?: number;\n sizeHint?: 'tiny' | 'small' | 'medium' | 'large' | 'huge';\n columns: ContextFragment[];\n indexes?: ContextFragment[];\n constraints?: ContextFragment[];\n}): ContextFragment {\n return {\n name: 'table',\n data: {\n name: input.name,\n ...(input.schema && { schema: input.schema }),\n ...(input.rowCount != null && { rowCount: input.rowCount }),\n ...(input.sizeHint && { sizeHint: input.sizeHint }),\n columns: input.columns,\n ...(input.indexes?.length && { indexes: input.indexes }),\n ...(input.constraints?.length && { constraints: input.constraints }),\n },\n };\n}\n\n/**\n * Table column with type and annotations.\n *\n * @param input.name - Column name\n * @param input.type - Column data type (e.g., 'integer', 'varchar(255)')\n * @param input.pk - Is primary key\n * @param input.fk - Foreign key reference in \"table.column\" format\n * @param input.unique - Has unique constraint\n * @param input.notNull - Has NOT NULL constraint\n * @param input.default - Default value expression\n * @param input.indexed - Has index on this column\n * @param input.values - Enum or low cardinality values\n * @param input.stats - Column statistics (min, max, null fraction)\n *\n * @example\n * column({\n * name: 'status',\n * type: 'varchar',\n * notNull: true,\n * indexed: true,\n * values: ['active', 'inactive', 'suspended'],\n * })\n */\nexport function column(input: {\n name: string;\n type: string;\n pk?: boolean;\n fk?: string;\n unique?: boolean;\n notNull?: boolean;\n default?: string;\n indexed?: boolean;\n values?: string[];\n stats?: {\n min?: string;\n max?: string;\n nullFraction?: number;\n nDistinct?: number;\n correlation?: number;\n };\n}): ContextFragment {\n return {\n name: 'column',\n data: {\n name: input.name,\n type: input.type,\n ...(input.pk && { pk: true }),\n ...(input.fk && { fk: input.fk }),\n ...(input.unique && { unique: true }),\n ...(input.notNull && { notNull: true }),\n ...(input.default && { default: input.default }),\n ...(input.indexed && { indexed: true }),\n ...(input.values?.length && { values: input.values }),\n ...(input.stats && { stats: input.stats }),\n },\n };\n}\n\n/**\n * Table index.\n *\n * @param input.name - Index name\n * @param input.columns - Columns included in the index\n * @param input.unique - Is unique index\n * @param input.type - Index type (BTREE, HASH, GIN, etc.)\n *\n * @example\n * index({ name: 'idx_user_email', columns: ['email'], unique: true, type: 'BTREE' })\n */\nexport function index(input: {\n name: string;\n columns: string[];\n unique?: boolean;\n type?: string;\n}): ContextFragment {\n return {\n name: 'index',\n data: {\n name: input.name,\n columns: input.columns,\n ...(input.unique && { unique: true }),\n ...(input.type && { type: input.type }),\n },\n };\n}\n\n/**\n * Table constraint (CHECK, UNIQUE, PRIMARY_KEY, FOREIGN_KEY, etc).\n *\n * @param input.name - Constraint name\n * @param input.type - Constraint type\n * @param input.columns - Columns involved in the constraint\n * @param input.definition - CHECK constraint SQL definition\n * @param input.defaultValue - DEFAULT constraint value\n * @param input.referencedTable - For FK: referenced table name\n * @param input.referencedColumns - For FK: referenced column names\n *\n * @example\n * constraint({\n * name: 'chk_amount_positive',\n * type: 'CHECK',\n * definition: 'amount > 0',\n * })\n *\n * @example\n * constraint({\n * name: 'fk_order_user',\n * type: 'FOREIGN_KEY',\n * columns: ['user_id'],\n * referencedTable: 'users',\n * referencedColumns: ['id'],\n * })\n */\nexport function constraint(input: {\n name: string;\n type:\n | 'CHECK'\n | 'UNIQUE'\n | 'NOT_NULL'\n | 'DEFAULT'\n | 'PRIMARY_KEY'\n | 'FOREIGN_KEY';\n columns?: string[];\n definition?: string;\n defaultValue?: string;\n referencedTable?: string;\n referencedColumns?: string[];\n}): ContextFragment {\n return {\n name: 'constraint',\n data: {\n name: input.name,\n type: input.type,\n ...(input.columns?.length && { columns: input.columns }),\n ...(input.definition && { definition: input.definition }),\n ...(input.defaultValue && { defaultValue: input.defaultValue }),\n ...(input.referencedTable && { referencedTable: input.referencedTable }),\n ...(input.referencedColumns?.length && {\n referencedColumns: input.referencedColumns,\n }),\n },\n };\n}\n\n/**\n * Database view.\n *\n * @param input.name - View name\n * @param input.schema - Schema name\n * @param input.columns - Array of column() fragments\n * @param input.definition - View SQL definition\n *\n * @example\n * view({\n * name: 'active_users',\n * columns: [\n * column({ name: 'id', type: 'integer' }),\n * column({ name: 'email', type: 'varchar' }),\n * ],\n * definition: \"SELECT id, email FROM users WHERE status = 'active'\",\n * })\n */\nexport function view(input: {\n name: string;\n schema?: string;\n columns: ContextFragment[];\n definition?: string;\n}): ContextFragment {\n return {\n name: 'view',\n data: {\n name: input.name,\n ...(input.schema && { schema: input.schema }),\n columns: input.columns,\n ...(input.definition && { definition: input.definition }),\n },\n };\n}\n\n/**\n * Relationship between tables (foreign key connection).\n *\n * @param input.from - Source table and columns\n * @param input.to - Referenced table and columns\n * @param input.cardinality - Relationship cardinality\n *\n * @example\n * relationship({\n * from: { table: 'orders', columns: ['user_id'] },\n * to: { table: 'users', columns: ['id'] },\n * cardinality: 'many-to-one',\n * })\n */\nexport function relationship(input: {\n from: { table: string; columns: string[] };\n to: { table: string; columns: string[] };\n cardinality?: 'one-to-one' | 'one-to-many' | 'many-to-one' | 'many-to-many';\n}): ContextFragment {\n return {\n name: 'relationship',\n data: {\n from: input.from,\n to: input.to,\n ...(input.cardinality && { cardinality: input.cardinality }),\n },\n };\n}\n", "import type { AdapterInfo, ColumnStats, Relationship, Table } from '../adapter.ts';\nimport type { View } from './view.grounding.ts';\n\n/**\n * Column type for grounding operations.\n * Common interface between Table.columns and View.columns.\n */\nexport interface Column {\n name: string;\n type: string;\n kind?: 'LowCardinality' | 'Enum';\n values?: string[];\n stats?: ColumnStats;\n}\n\n/**\n * Entity with columns (Table or View).\n */\nexport interface ColumnContainer {\n name: string;\n columns: Column[];\n}\n\n/**\n * Shared context object passed to all groundings.\n * Groundings read from and write to this context.\n */\nexport interface GroundingContext {\n /** Tables discovered by TableGrounding */\n tables: Table[];\n\n /** Views discovered by ViewGrounding */\n views: View[];\n\n /** Relationships discovered by TableGrounding */\n relationships: Relationship[];\n\n /** Database info collected by InfoGrounding */\n info?: AdapterInfo;\n\n /** Business context report generated by ReportGrounding */\n report?: string;\n}\n\n/**\n * Create a new empty grounding context.\n */\nexport function createGroundingContext(): GroundingContext {\n return {\n tables: [],\n views: [],\n relationships: [],\n info: undefined,\n };\n}\n", "import type { ContextFragment } from '@deepagents/context';\n\nimport {\n column,\n constraint,\n dialectInfo,\n index,\n relationship,\n table,\n view,\n} from '../fragments/schema.ts';\nimport type { AbstractGrounding } from './groundings/abstract.grounding.ts';\nimport {\n type GroundingContext,\n createGroundingContext,\n} from './groundings/context.ts';\nimport type { View } from './groundings/view.grounding.ts';\n\n/**\n * Filter type for view/table names.\n * - string[]: explicit list of view names\n * - RegExp: pattern to match view names\n * - function: predicate to filter view names\n */\nexport type Filter = string[] | RegExp | ((viewName: string) => boolean);\n\nexport interface Table {\n name: string;\n schema?: string;\n rawName?: string;\n columns: {\n name: string;\n type: string;\n kind?: 'LowCardinality' | 'Enum';\n values?: string[];\n isIndexed?: boolean;\n stats?: ColumnStats;\n }[];\n rowCount?: number;\n sizeHint?: 'tiny' | 'small' | 'medium' | 'large' | 'huge';\n indexes?: TableIndex[];\n constraints?: TableConstraint[];\n}\n\nexport interface TableIndex {\n name: string;\n columns: string[];\n unique?: boolean;\n type?: string;\n}\n\nexport interface TableConstraint {\n name: string;\n type:\n | 'CHECK'\n | 'UNIQUE'\n | 'NOT_NULL'\n | 'DEFAULT'\n | 'PRIMARY_KEY'\n | 'FOREIGN_KEY';\n columns?: string[];\n definition?: string;\n defaultValue?: string;\n referencedTable?: string;\n referencedColumns?: string[];\n}\n\nexport interface ColumnStats {\n min?: string;\n max?: string;\n nullFraction?: number;\n nDistinct?: number;\n correlation?: 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 /**\n * Introspect the database schema and return context fragments.\n *\n * Executes all configured groundings to populate the context, then\n * generates fragments from the complete context data.\n *\n * @param ctx - Optional grounding context for sharing state between groundings\n * @returns Array of context fragments representing the database schema\n */\n async introspect(ctx = createGroundingContext()): Promise<ContextFragment[]> {\n // Phase 1: All groundings populate ctx\n for (const fn of this.grounding) {\n const grounding = fn(this);\n await grounding.execute(ctx);\n }\n\n // Phase 2: Generate fragments from complete ctx\n return this.#toSchemaFragments(ctx);\n }\n\n /**\n * Convert complete grounding context to schema fragments.\n * Called after all groundings have populated ctx with data.\n */\n #toSchemaFragments(ctx: GroundingContext): ContextFragment[] {\n const fragments: ContextFragment[] = [];\n\n // Dialect info\n if (ctx.info) {\n fragments.push(\n dialectInfo({\n dialect: ctx.info.dialect,\n version: ctx.info.version,\n database: ctx.info.database,\n }),\n );\n }\n\n // Tables (with all annotations now included)\n for (const t of ctx.tables) {\n fragments.push(this.#tableToFragment(t));\n }\n\n // Views\n for (const v of ctx.views) {\n fragments.push(this.#viewToFragment(v));\n }\n\n // Relationships\n const tableMap = new Map(ctx.tables.map((t) => [t.name, t]));\n for (const rel of ctx.relationships) {\n const sourceTable = tableMap.get(rel.table);\n const targetTable = tableMap.get(rel.referenced_table);\n fragments.push(\n this.#relationshipToFragment(rel, sourceTable, targetTable),\n );\n }\n\n // Business context\n if (ctx.report) {\n fragments.push({ name: 'businessContext', data: ctx.report });\n }\n\n return fragments;\n }\n\n /**\n * Convert a Table to a table fragment with nested column, index, and constraint fragments.\n */\n #tableToFragment(t: Table): ContextFragment {\n // Build constraint lookup maps for column-level annotations\n const pkConstraint = t.constraints?.find((c) => c.type === 'PRIMARY_KEY');\n const pkColumns = new Set(pkConstraint?.columns ?? []);\n\n const notNullColumns = new Set(\n t.constraints\n ?.filter((c) => c.type === 'NOT_NULL')\n .flatMap((c) => c.columns ?? []) ?? [],\n );\n\n const defaultByColumn = new Map<string, string>();\n for (const c of t.constraints?.filter((c) => c.type === 'DEFAULT') ?? []) {\n for (const col of c.columns ?? []) {\n if (c.defaultValue != null) {\n defaultByColumn.set(col, c.defaultValue);\n }\n }\n }\n\n // Single-column UNIQUE constraints\n const uniqueColumns = new Set(\n t.constraints\n ?.filter((c) => c.type === 'UNIQUE' && c.columns?.length === 1)\n .flatMap((c) => c.columns ?? []) ?? [],\n );\n\n // Foreign key lookup: column -> referenced table.column\n const fkByColumn = new Map<string, string>();\n for (const c of t.constraints?.filter((c) => c.type === 'FOREIGN_KEY') ??\n []) {\n const cols = c.columns ?? [];\n const refCols = c.referencedColumns ?? [];\n for (let i = 0; i < cols.length; i++) {\n const refCol = refCols[i] ?? refCols[0] ?? cols[i];\n fkByColumn.set(cols[i], `${c.referencedTable}.${refCol}`);\n }\n }\n\n // Build column fragments\n const columnFragments = t.columns.map((col) =>\n column({\n name: col.name,\n type: col.type,\n pk: pkColumns.has(col.name) || undefined,\n fk: fkByColumn.get(col.name),\n unique: uniqueColumns.has(col.name) || undefined,\n notNull: notNullColumns.has(col.name) || undefined,\n default: defaultByColumn.get(col.name),\n indexed: col.isIndexed || undefined,\n values: col.values,\n stats: col.stats,\n }),\n );\n\n // Build index fragments\n const indexFragments = (t.indexes ?? []).map((idx) =>\n index({\n name: idx.name,\n columns: idx.columns,\n unique: idx.unique,\n type: idx.type,\n }),\n );\n\n // Build constraint fragments for multi-column UNIQUE and CHECK constraints\n const constraintFragments = (t.constraints ?? [])\n .filter(\n (c) =>\n c.type === 'CHECK' ||\n (c.type === 'UNIQUE' && (c.columns?.length ?? 0) > 1),\n )\n .map((c) =>\n constraint({\n name: c.name,\n type: c.type,\n columns: c.columns,\n definition: c.definition,\n }),\n );\n\n return table({\n name: t.name,\n schema: t.schema,\n rowCount: t.rowCount,\n sizeHint: t.sizeHint,\n columns: columnFragments,\n indexes: indexFragments.length > 0 ? indexFragments : undefined,\n constraints:\n constraintFragments.length > 0 ? constraintFragments : undefined,\n });\n }\n\n /**\n * Convert a View to a view fragment with nested column fragments.\n */\n #viewToFragment(v: View): ContextFragment {\n const columnFragments = v.columns.map((col) =>\n column({\n name: col.name,\n type: col.type,\n values: col.values,\n stats: col.stats,\n }),\n );\n\n return view({\n name: v.name,\n schema: v.schema,\n columns: columnFragments,\n definition: v.definition,\n });\n }\n\n /**\n * Convert a Relationship to a relationship fragment.\n * Infers cardinality from row counts if available.\n */\n #relationshipToFragment(\n rel: Relationship,\n sourceTable?: Table,\n targetTable?: Table,\n ): ContextFragment {\n const sourceCount = sourceTable?.rowCount;\n const targetCount = targetTable?.rowCount;\n\n let cardinality:\n | 'one-to-one'\n | 'one-to-many'\n | 'many-to-one'\n | 'many-to-many'\n | undefined;\n\n if (sourceCount != null && targetCount != null && targetCount > 0) {\n const ratio = sourceCount / targetCount;\n if (ratio > 5) {\n cardinality = 'many-to-one';\n } else if (ratio < 1.2 && ratio > 0.8) {\n cardinality = 'one-to-one';\n } else if (ratio < 0.2) {\n cardinality = 'one-to-many';\n }\n }\n\n return relationship({\n from: { table: rel.table, columns: rel.from },\n to: { table: rel.referenced_table, columns: rel.to },\n cardinality,\n });\n }\n abstract execute(sql: string): Promise<any[]> | any[];\n abstract validate(sql: string): Promise<string | void> | string | void;\n abstract runQuery<Row>(sql: string): Promise<Row[]> | Row[];\n\n /**\n * Quote an identifier (table/column name) for safe use in SQL.\n * Each database uses different quoting styles.\n */\n abstract quoteIdentifier(name: string): string;\n\n /**\n * Escape a string value for safe use in SQL.\n * Each database escapes different characters.\n */\n abstract escape(value: string): string;\n\n /**\n * Build a SELECT query to sample rows from a table.\n * Each database uses different syntax for limiting rows (LIMIT vs TOP).\n */\n abstract buildSampleRowsQuery(\n tableName: string,\n columns: string[] | undefined,\n limit: number,\n ): string;\n\n /**\n * Convert unknown database value to number.\n * Handles number, bigint, and string types.\n */\n toNumber(value: unknown): number | undefined {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value;\n }\n if (typeof value === 'bigint') {\n return Number(value);\n }\n if (typeof value === 'string' && value.trim() !== '') {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : undefined;\n }\n return undefined;\n }\n\n /**\n * Parse a potentially qualified table name into schema and table parts.\n */\n parseTableName(name: string): { schema: string; table: string } {\n if (name.includes('.')) {\n const [schema, ...rest] = name.split('.');\n return { schema, table: rest.join('.') };\n }\n return { schema: this.defaultSchema ?? '', table: name };\n }\n\n /**\n * Escape a string value for use in SQL string literals (single quotes).\n * Used in WHERE clauses like: WHERE name = '${escapeString(value)}'\n */\n escapeString(value: string): string {\n return value.replace(/'/g, \"''\");\n }\n\n /**\n * Build a SQL filter clause to include/exclude schemas.\n * @param columnName - The schema column name (e.g., 'TABLE_SCHEMA')\n * @param allowedSchemas - If provided, filter to these schemas only\n */\n buildSchemaFilter(columnName: string, allowedSchemas?: string[]): string {\n if (allowedSchemas && allowedSchemas.length > 0) {\n const values = allowedSchemas\n .map((s) => `'${this.escapeString(s)}'`)\n .join(', ');\n return `AND ${columnName} IN (${values})`;\n }\n if (this.systemSchemas.length > 0) {\n const values = this.systemSchemas\n .map((s) => `'${this.escapeString(s)}'`)\n .join(', ');\n return `AND ${columnName} NOT IN (${values})`;\n }\n return '';\n }\n}\n\nexport function filterTablesByName<T extends { name: string }>(\n tables: T[],\n filter: TablesFilter | undefined,\n): T[] {\n if (!filter) return tables;\n return tables.filter((table) => matchesFilter(table.name, filter));\n}\n\nexport function filterRelationshipsByTables(\n relationships: Relationship[],\n tableNames: Set<string> | undefined,\n): Relationship[] {\n if (tableNames === undefined) {\n return relationships;\n }\n if (tableNames.size === 0) {\n return [];\n }\n return relationships.filter(\n (it) => tableNames.has(it.table) || tableNames.has(it.referenced_table),\n );\n}\n\nexport function applyTablesFilter(\n tables: Table[],\n relationships: Relationship[],\n filter: TablesFilter | undefined,\n): { tables: Table[]; relationships: Relationship[] } {\n if (!filter) {\n return { tables, relationships };\n }\n\n const allowedNames = new Set(\n getTablesWithRelated(tables, relationships, filter),\n );\n\n return {\n tables: tables.filter((table) => allowedNames.has(table.name)),\n relationships: filterRelationshipsByTables(relationships, allowedNames),\n };\n}\n\nexport function matchesFilter(\n tableName: string,\n filter: TablesFilter,\n): boolean {\n if (Array.isArray(filter)) {\n return filter.includes(tableName);\n }\n return filter.test(tableName);\n}\n\nexport function getTablesWithRelated(\n allTables: Table[],\n relationships: Relationship[],\n filter: TablesFilter,\n): string[] {\n const matchedTables = filterTablesByName(allTables, filter).map(\n (it) => it.name,\n );\n\n if (matchedTables.length === 0) {\n return [];\n }\n\n const adjacency = new Map<string, Set<string>>();\n\n for (const rel of relationships) {\n if (!adjacency.has(rel.table)) {\n adjacency.set(rel.table, new Set());\n }\n if (!adjacency.has(rel.referenced_table)) {\n adjacency.set(rel.referenced_table, new Set());\n }\n adjacency.get(rel.table)!.add(rel.referenced_table);\n adjacency.get(rel.referenced_table)!.add(rel.table);\n }\n\n const result = new Set<string>(matchedTables);\n const queue = [...matchedTables];\n\n while (queue.length > 0) {\n const current = queue.shift()!;\n const neighbors = adjacency.get(current);\n\n if (!neighbors) {\n continue;\n }\n\n for (const neighbor of neighbors) {\n if (!result.has(neighbor)) {\n result.add(neighbor);\n queue.push(neighbor);\n }\n }\n }\n\n return Array.from(result);\n}\n", "import type { Adapter } from '../adapter.ts';\nimport type { GroundingContext } from './context.ts';\n\n/**\n * Filter type for table names.\n * - string[]: explicit list of table names\n * - RegExp: pattern to match table names\n * - function: predicate to filter table names\n */\nexport type Filter = string[] | RegExp | ((tableName: string) => boolean);\n\nexport interface AdapterInfo {\n dialect: string;\n version?: string;\n database?: string;\n details?: Record<string, unknown>;\n}\nexport type AdapterInfoProvider =\n | AdapterInfo\n | (() => Promise<AdapterInfo> | AdapterInfo);\n\n/**\n * Abstract base class for database schema groundings.\n *\n * Groundings collect schema metadata into the shared GroundingContext.\n * Fragment generation is centralized in Adapter.introspect().\n */\nexport abstract class AbstractGrounding {\n /**\n * Grounding identifier for debugging/logging.\n */\n name: string;\n\n constructor(name: string) {\n this.name = name;\n }\n\n /**\n * Execute grounding to populate the shared context.\n * Groundings mutate ctx to add their collected data (tables, views, indexes, etc).\n * Fragment generation happens centrally in Adapter after all groundings complete.\n *\n * @param ctx - Shared context for accumulating schema data\n */\n abstract execute(ctx: GroundingContext): Promise<void>;\n}\n\nclass SampleDataGrounding {\n // this will fetch sample data for tables matching the filter\n}\n\nclass FunctionGrounding {\n #filter: Filter;\n #adapter: Adapter;\n constructor(adapter: Adapter, filter: Filter) {\n this.#filter = filter;\n this.#adapter = adapter;\n }\n}\n", "import type { TableConstraint } from '../adapter.ts';\nimport { AbstractGrounding } from './abstract.grounding.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('constraint');\n }\n\n /**\n * Fetch constraints for a specific table.\n */\n protected abstract getConstraints(\n tableName: string,\n ): Promise<TableConstraint[]>;\n\n /**\n * Execute the grounding process.\n * Annotates tables in ctx.tables with their constraints.\n */\n async execute(ctx: GroundingContext): Promise<void> {\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 }\n}\n", "import type { TableIndex } from '../adapter.ts';\nimport { AbstractGrounding } from './abstract.grounding.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('index');\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): Promise<void> {\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 }\n}\n", "import type { AdapterInfo } from '../adapter.ts';\nimport { AbstractGrounding } from './abstract.grounding.ts';\nimport type { GroundingContext } from './context.ts';\n\n/**\n * Configuration for InfoGrounding.\n */\nexport interface InfoGroundingConfig {\n // Future: options to control what info to collect\n}\n\n/**\n * Abstract base class for database info grounding.\n *\n * Collects database dialect, version, and connection info.\n *\n * Subclasses implement the database-specific hook:\n * - `collectInfo()` - collect database info\n */\nexport abstract class InfoGrounding extends AbstractGrounding {\n constructor(config: InfoGroundingConfig = {}) {\n super('dialectInfo');\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): Promise<void> {\n ctx.info = await this.collectInfo();\n }\n}\n", "import { groq } from '@ai-sdk/groq';\nimport { tool } from 'ai';\nimport dedent from 'dedent';\nimport z from 'zod';\n\nimport { type AgentModel } from '@deepagents/agent';\nimport {\n ContextEngine,\n InMemoryContextStore,\n agent,\n fragment,\n persona,\n user,\n} from '@deepagents/context';\n\nimport type { Adapter } from '../adapter.ts';\nimport { AbstractGrounding } from './abstract.grounding.ts';\nimport type { GroundingContext } from './context.ts';\n\n/**\n * Cache interface for storing generated reports.\n */\nexport interface ReportCache {\n get(): Promise<string | null>;\n set(value: string): Promise<void>;\n}\n\n/**\n * Configuration for ReportGrounding.\n */\nexport interface ReportGroundingConfig {\n /** LLM model to use for generating the report */\n model?: AgentModel;\n /** Optional cache for storing generated reports */\n cache?: ReportCache;\n /** Force regeneration even if cached */\n forceRefresh?: boolean;\n}\n\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<void> {\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;\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\n async #generateReport(): Promise<string> {\n const context = new ContextEngine({\n store: new InMemoryContextStore(),\n chatId: `report-gen-${crypto.randomUUID()}`,\n userId: 'system',\n });\n\n context.set(\n persona({\n name: 'db-report-agent',\n role: 'Database analyst',\n objective:\n 'Analyze the database and write a contextual report about what it represents',\n }),\n fragment(\n 'instructions',\n dedent`\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 `,\n ),\n user(\n 'Please analyze the database and write a contextual report about what this database represents.',\n ),\n );\n\n const adapter = this.#adapter;\n\n const reportAgent = agent({\n name: 'db-report-agent',\n model: this.#model,\n context,\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 }) => {\n return adapter.execute(sql);\n },\n }),\n },\n });\n\n const result = await reportAgent.generate({});\n return result.text;\n }\n}\n", "import type { Table } from '../adapter.ts';\nimport { AbstractGrounding } from './abstract.grounding.ts';\nimport type { GroundingContext } from './context.ts';\n\n/**\n * Configuration for RowCountGrounding.\n */\nexport interface RowCountGroundingConfig {\n // Future: filter which tables to count\n}\n\n/**\n * Abstract base class for row count grounding.\n *\n * Reads tables from the context and annotates them with row counts and size hints.\n * This grounding must run AFTER TableGrounding since it reads from ctx.tables.\n *\n * Subclasses implement the database-specific hook:\n * - `getRowCount()` - get row count for a table\n */\nexport abstract class RowCountGrounding extends AbstractGrounding {\n constructor(config: RowCountGroundingConfig = {}) {\n super('rowCount');\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): Promise<void> {\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 }\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 type { Filter, Relationship, Table } from '../adapter.ts';\nimport { AbstractGrounding } from './abstract.grounding.ts';\nimport type { GroundingContext } from './context.ts';\n\n/**\n * Configuration for TableGrounding.\n */\nexport interface TableGroundingConfig {\n /** Filter to select seed tables */\n filter?: Filter;\n /**\n * Traverse forward (child\u2192parent) 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\u2192child) 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('table');\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): Promise<void> {\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;\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 }\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", "import {\n Adapter,\n type ExecuteFunction,\n type GroundingFn,\n type ValidateFunction,\n} from '../adapter.ts';\n\nexport type BigQueryAdapterOptions = {\n execute: ExecuteFunction;\n /**\n * SQL validation is required for BigQuery.\n * Recommended implementation: BigQuery dry-run.\n */\n validate: ValidateFunction;\n grounding: GroundingFn[];\n /**\n * Datasets to introspect (scopes all metadata discovery).\n */\n datasets: string[];\n /**\n * Optional projectId used to qualify INFORMATION_SCHEMA references.\n * If omitted, the provided `execute()` implementation must supply a default project context.\n */\n projectId?: string;\n};\n\ntype BigQueryError = {\n message?: string;\n reason?: string;\n code?: number | string;\n};\n\nfunction formatBigQueryError(sql: string, error: unknown) {\n const errorMessage =\n error instanceof Error\n ? error.message\n : typeof error === 'string'\n ? error\n : typeof error === 'object' && error !== null\n ? ((error as BigQueryError).message ?? JSON.stringify(error))\n : 'Unknown error occurred';\n\n return {\n error: errorMessage,\n error_type: 'BIGQUERY_ERROR',\n suggestion:\n 'Validate the query (dry-run) and review table/dataset names, nested field paths, and parameter bindings.',\n sql_attempted: sql,\n };\n}\n\nexport class BigQuery extends Adapter {\n #options: BigQueryAdapterOptions;\n #datasetSet: Set<string>;\n\n override readonly grounding: GroundingFn[];\n override readonly defaultSchema: string | undefined;\n override readonly systemSchemas: string[] = [];\n\n constructor(options: BigQueryAdapterOptions) {\n super();\n\n if (!options || typeof options.execute !== 'function') {\n throw new Error('BigQuery adapter requires an execute(sql) function.');\n }\n if (typeof options.validate !== 'function') {\n throw new Error(\n 'BigQuery adapter requires a validate(sql) function. Provide a BigQuery dry-run validator (recommended) so generated SQL can be validated before execution.',\n );\n }\n\n const datasets = (options.datasets ?? [])\n .map((d) => d.trim())\n .filter(Boolean);\n if (datasets.length === 0) {\n throw new Error(\n \"BigQuery adapter requires a non-empty datasets list (e.g. datasets: ['analytics']). This scopes all introspection.\",\n );\n }\n\n this.#options = { ...options, datasets };\n this.#datasetSet = new Set(datasets);\n this.grounding = options.grounding;\n this.defaultSchema = datasets.length === 1 ? datasets[0] : undefined;\n }\n\n get datasets(): readonly string[] {\n return this.#options.datasets;\n }\n\n get projectId(): string | undefined {\n return this.#options.projectId;\n }\n\n isDatasetAllowed(dataset: string): boolean {\n return this.#datasetSet.has(dataset);\n }\n\n /**\n * Build a fully-qualified BigQuery INFORMATION_SCHEMA view reference.\n * Uses standard BigQuery backtick quoting on the full path.\n */\n infoSchemaView(dataset: string, viewName: string): string {\n const projectPrefix = this.projectId ? `${this.projectId}.` : '';\n return `\\`${projectPrefix}${dataset}.INFORMATION_SCHEMA.${viewName}\\``;\n }\n\n override async execute(sql: string) {\n return this.#options.execute(sql);\n }\n\n override async validate(sql: string) {\n try {\n return await this.#options.validate(sql);\n } catch (error) {\n return JSON.stringify(formatBigQueryError(sql, error));\n }\n }\n\n override async runQuery<Row>(sql: string): Promise<Row[]> {\n const result = await this.#options.execute(sql);\n\n if (Array.isArray(result)) {\n return result as Row[];\n }\n\n if (\n result &&\n typeof result === 'object' &&\n 'rows' in result &&\n Array.isArray((result as { rows?: unknown }).rows)\n ) {\n return (result as { rows: Row[] }).rows;\n }\n\n throw new Error(\n 'BigQuery adapter execute() must return an array of rows or an object with a rows array when introspecting.',\n );\n }\n\n override quoteIdentifier(name: string): string {\n // BigQuery uses backticks. Quote each segment so dotted paths work for both\n // dataset.table qualification and nested field paths (e.g. user.address.city).\n return name\n .split('.')\n .map((part) => `\\`${part.replace(/`/g, '``')}\\``)\n .join('.');\n }\n\n override escape(value: string): string {\n return value.replace(/`/g, '``');\n }\n\n override buildSampleRowsQuery(\n tableName: string,\n columns: string[] | undefined,\n limit: number,\n ): string {\n const qualifiedTableName = this.#qualifyTableName(tableName);\n const tableIdentifier = this.quoteIdentifier(qualifiedTableName);\n const columnList = columns?.length\n ? columns\n .map((c) => (c === '*' ? '*' : this.quoteIdentifier(c)))\n .join(', ')\n : '*';\n\n return `SELECT ${columnList} FROM ${tableIdentifier} LIMIT ${limit}`;\n }\n\n #qualifyTableName(tableName: string): string {\n if (!this.projectId) {\n return tableName;\n }\n // If already qualified as project.dataset.table, keep as-is.\n if (tableName.split('.').length >= 3) {\n return tableName;\n }\n return `${this.projectId}.${tableName}`;\n }\n}\n", "import type { TableConstraint } from '../adapter.ts';\nimport {\n ConstraintGrounding,\n type ConstraintGroundingConfig,\n} from '../groundings/constraint.grounding.ts';\nimport type { BigQuery } from './bigquery.ts';\n\ntype ColumnMetadataRow = {\n column_name: string | null;\n is_nullable: string | null;\n column_default: string | null;\n};\n\ntype KeyColumnUsageRow = {\n constraint_name: string | null;\n constraint_type: string | null;\n column_name: string | null;\n ordinal_position: number | null;\n position_in_unique_constraint: number | null;\n};\n\ntype ReferencedTableRow = {\n table_schema: string | null;\n table_name: string | null;\n};\n\ntype PrimaryKeyConstraintRow = {\n constraint_name: string | null;\n};\n\ntype PrimaryKeyColumnRow = {\n column_name: string | null;\n ordinal_position: number | null;\n};\n\nexport interface BigQueryConstraintGroundingConfig extends ConstraintGroundingConfig {}\n\nexport class BigQueryConstraintGrounding extends ConstraintGrounding {\n #adapter: BigQuery;\n\n constructor(\n adapter: BigQuery,\n config: BigQueryConstraintGroundingConfig = {},\n ) {\n super(config);\n this.#adapter = adapter;\n }\n\n protected override async getConstraints(\n tableName: string,\n ): Promise<TableConstraint[]> {\n const { schema: dataset, table } = this.#adapter.parseTableName(tableName);\n\n const constraints: TableConstraint[] = [];\n\n // NOT NULL / DEFAULT (best effort from column metadata)\n const columnRows = await this.#adapter.runQuery<ColumnMetadataRow>(`\n SELECT column_name, is_nullable, column_default\n FROM ${this.#adapter.infoSchemaView(dataset, 'COLUMNS')}\n WHERE table_name = '${this.#adapter.escapeString(table)}'\n ORDER BY ordinal_position\n `);\n\n for (const row of columnRows) {\n const col = row.column_name;\n if (!col) continue;\n\n if ((row.is_nullable ?? '').toUpperCase() === 'NO') {\n constraints.push({\n name: `${tableName}.${col}.NOT_NULL`,\n type: 'NOT_NULL',\n columns: [col],\n });\n }\n\n if (row.column_default != null && row.column_default !== '') {\n constraints.push({\n name: `${tableName}.${col}.DEFAULT`,\n type: 'DEFAULT',\n columns: [col],\n defaultValue: row.column_default,\n });\n }\n }\n\n // PRIMARY KEY / FOREIGN KEY constraints\n const keyRows = await this.#adapter.runQuery<KeyColumnUsageRow>(`\n SELECT\n tc.constraint_name,\n tc.constraint_type,\n kcu.column_name,\n kcu.ordinal_position,\n kcu.position_in_unique_constraint\n FROM ${this.#adapter.infoSchemaView(dataset, 'TABLE_CONSTRAINTS')} AS tc\n JOIN ${this.#adapter.infoSchemaView(dataset, 'KEY_COLUMN_USAGE')} AS kcu\n ON tc.constraint_name = kcu.constraint_name\n AND tc.constraint_schema = kcu.constraint_schema\n WHERE tc.table_name = '${this.#adapter.escapeString(table)}'\n AND tc.constraint_type IN ('PRIMARY KEY', 'FOREIGN KEY')\n ORDER BY tc.constraint_name, kcu.ordinal_position\n `);\n\n const pkByName = new Map<string, string[]>();\n const fkByName = new Map<\n string,\n Array<{\n column: string;\n ordinal: number;\n pkOrdinal: number | null;\n }>\n >();\n\n for (const row of keyRows) {\n if (!row.constraint_name || !row.column_name) continue;\n const type = (row.constraint_type ?? '').toUpperCase();\n\n if (type === 'PRIMARY KEY') {\n const cols = pkByName.get(row.constraint_name) ?? [];\n cols.push(row.column_name);\n pkByName.set(row.constraint_name, cols);\n continue;\n }\n\n if (type === 'FOREIGN KEY') {\n const cols = fkByName.get(row.constraint_name) ?? [];\n cols.push({\n column: row.column_name,\n ordinal: row.ordinal_position ?? 0,\n pkOrdinal: row.position_in_unique_constraint,\n });\n fkByName.set(row.constraint_name, cols);\n }\n }\n\n for (const [name, cols] of pkByName.entries()) {\n constraints.push({\n name,\n type: 'PRIMARY_KEY',\n columns: cols,\n });\n }\n\n for (const [constraintName, cols] of fkByName.entries()) {\n const fk = await this.#buildForeignKeyConstraint({\n constraintDataset: dataset,\n constraintName,\n childTableName: `${dataset}.${table}`,\n childColumns: cols,\n });\n if (fk) constraints.push(fk);\n }\n\n return constraints;\n }\n\n async #buildForeignKeyConstraint(args: {\n constraintDataset: string;\n constraintName: string;\n childTableName: string;\n childColumns: Array<{\n column: string;\n ordinal: number;\n pkOrdinal: number | null;\n }>;\n }): Promise<TableConstraint | undefined> {\n const refRows = await this.#adapter.runQuery<ReferencedTableRow>(`\n SELECT DISTINCT table_schema, table_name\n FROM ${this.#adapter.infoSchemaView(args.constraintDataset, 'CONSTRAINT_COLUMN_USAGE')}\n WHERE constraint_name = '${this.#adapter.escapeString(args.constraintName)}'\n `);\n\n const referenced = refRows.find((r) => r.table_schema && r.table_name);\n if (!referenced?.table_schema || !referenced.table_name) {\n return undefined;\n }\n\n const referencedDataset = referenced.table_schema;\n const referencedTable = referenced.table_name;\n\n // Dataset scoping: never surface FK references outside configured datasets.\n if (!this.#adapter.isDatasetAllowed(referencedDataset)) {\n return undefined;\n }\n\n const pkConstraintRows = await this.#adapter\n .runQuery<PrimaryKeyConstraintRow>(`\n SELECT constraint_name\n FROM ${this.#adapter.infoSchemaView(referencedDataset, 'TABLE_CONSTRAINTS')}\n WHERE constraint_type = 'PRIMARY KEY'\n AND table_name = '${this.#adapter.escapeString(referencedTable)}'\n LIMIT 1\n `);\n\n const pkConstraintName = pkConstraintRows[0]?.constraint_name;\n if (!pkConstraintName) return undefined;\n\n const pkColumns = await this.#adapter.runQuery<PrimaryKeyColumnRow>(`\n SELECT column_name, ordinal_position\n FROM ${this.#adapter.infoSchemaView(referencedDataset, 'KEY_COLUMN_USAGE')}\n WHERE constraint_name = '${this.#adapter.escapeString(pkConstraintName)}'\n AND table_name = '${this.#adapter.escapeString(referencedTable)}'\n ORDER BY ordinal_position\n `);\n\n const pkByOrdinal = new Map<number, string>();\n for (const row of pkColumns) {\n if (!row.column_name || row.ordinal_position == null) continue;\n pkByOrdinal.set(row.ordinal_position, row.column_name);\n }\n\n const orderedChild = [...args.childColumns].sort(\n (a, b) => a.ordinal - b.ordinal,\n );\n\n const columns = orderedChild.map((c) => c.column);\n const referencedColumns = orderedChild.map((c) => {\n const pkOrdinal = c.pkOrdinal ?? c.ordinal;\n return pkByOrdinal.get(pkOrdinal) ?? 'unknown';\n });\n\n return {\n name: args.constraintName,\n type: 'FOREIGN_KEY',\n columns,\n referencedTable: `${referencedDataset}.${referencedTable}`,\n referencedColumns,\n };\n }\n}\n", "import type { Adapter, TableIndex } from '../adapter.ts';\nimport {\n IndexesGrounding,\n type IndexesGroundingConfig,\n} from '../groundings/indexes.grounding.ts';\nimport type { BigQuery } from './bigquery.ts';\n\ntype IndexHintRow = {\n column_name: string | null;\n is_partitioning_column: string | null;\n clustering_ordinal_position: number | null;\n};\n\nexport interface BigQueryIndexesGroundingConfig extends IndexesGroundingConfig {}\n\n/**\n * BigQuery doesn't have traditional indexes; we map partitioning and clustering\n * metadata into index-like hints to guide query planning.\n */\nexport class BigQueryIndexesGrounding extends IndexesGrounding {\n #adapter: BigQuery;\n\n constructor(adapter: Adapter, config: BigQueryIndexesGroundingConfig = {}) {\n super(config);\n this.#adapter = adapter as BigQuery;\n }\n\n protected override async getIndexes(\n tableName: string,\n ): Promise<TableIndex[]> {\n const { schema: dataset, table } = this.#adapter.parseTableName(tableName);\n\n const rows = await this.#adapter.runQuery<IndexHintRow>(`\n SELECT column_name, is_partitioning_column, clustering_ordinal_position\n FROM ${this.#adapter.infoSchemaView(dataset, 'COLUMNS')}\n WHERE table_name = '${this.#adapter.escapeString(table)}'\n AND (is_partitioning_column = 'YES' OR clustering_ordinal_position IS NOT NULL)\n ORDER BY clustering_ordinal_position\n `);\n\n const partitionColumns: string[] = [];\n const clusteringColumns: Array<{ name: string; pos: number }> = [];\n\n for (const row of rows) {\n if (!row.column_name) continue;\n\n if ((row.is_partitioning_column ?? '').toUpperCase() === 'YES') {\n partitionColumns.push(row.column_name);\n }\n\n if (row.clustering_ordinal_position != null) {\n clusteringColumns.push({\n name: row.column_name,\n pos: row.clustering_ordinal_position,\n });\n }\n }\n\n const indexes: TableIndex[] = [];\n\n if (partitionColumns.length > 0) {\n indexes.push({\n name: `${table}_partition`,\n columns: partitionColumns,\n type: 'PARTITION',\n });\n }\n\n if (clusteringColumns.length > 0) {\n clusteringColumns.sort((a, b) => a.pos - b.pos);\n indexes.push({\n name: `${table}_clustering`,\n columns: clusteringColumns.map((c) => c.name),\n type: 'CLUSTERING',\n });\n }\n\n return indexes;\n }\n}\n", "import type { AdapterInfo } from '../adapter.ts';\nimport { InfoGrounding } from '../groundings/info.grounding.ts';\nimport type { BigQuery } from './bigquery.ts';\n\nexport class BigQueryInfoGrounding extends InfoGrounding {\n #adapter: BigQuery;\n\n constructor(adapter: BigQuery) {\n super();\n this.#adapter = adapter;\n }\n\n protected override async collectInfo(): Promise<AdapterInfo> {\n return {\n dialect: 'bigquery',\n database: this.#adapter.projectId,\n details: {\n identifierQuote: '`',\n identifiers: {\n qualifiedTable: 'dataset.table',\n nestedFieldPath: 'col.path.to.field',\n },\n parameters: {\n positional: '?',\n named: '@name',\n },\n },\n };\n }\n}\n", "import type { Adapter } from '../adapter.ts';\nimport {\n RowCountGrounding,\n type RowCountGroundingConfig,\n} from '../groundings/row-count.grounding.ts';\nimport type { BigQuery } from './bigquery.ts';\n\ntype RowCountRow = {\n total_rows: number | string | null;\n};\n\nexport interface BigQueryRowCountGroundingConfig extends RowCountGroundingConfig {}\n\n/**\n * BigQuery row counts are metadata-only.\n * Uses INFORMATION_SCHEMA.TABLE_STORAGE and never issues COUNT(*).\n */\nexport class BigQueryRowCountGrounding extends RowCountGrounding {\n #adapter: BigQuery;\n\n constructor(adapter: Adapter, config: BigQueryRowCountGroundingConfig = {}) {\n super(config);\n this.#adapter = adapter as BigQuery;\n }\n\n protected override async getRowCount(\n tableName: string,\n ): Promise<number | undefined> {\n const { schema: dataset, table } = this.#adapter.parseTableName(tableName);\n\n const rows = await this.#adapter.runQuery<RowCountRow>(`\n SELECT total_rows\n FROM ${this.#adapter.infoSchemaView(dataset, 'TABLE_STORAGE')}\n WHERE table_name = '${this.#adapter.escapeString(table)}'\n LIMIT 1\n `);\n\n const value = rows[0]?.total_rows;\n return this.#adapter.toNumber(value);\n }\n}\n", "import type { Relationship, Table } from '../adapter.ts';\nimport {\n TableGrounding,\n type TableGroundingConfig,\n} from '../groundings/table.grounding.ts';\nimport type { BigQuery } from './bigquery.ts';\n\ntype TableNameRow = {\n table_name: string | null;\n};\n\ntype ColumnFieldPathRow = {\n field_path: string | null;\n data_type: string | null;\n ordinal_position: number | null;\n};\n\ntype ForeignKeyKeyColumnRow = {\n constraint_name: string | null;\n column_name: string | null;\n ordinal_position: number | null;\n position_in_unique_constraint: number | null;\n};\n\ntype ReferencedTableRow = {\n table_schema: string | null;\n table_name: string | null;\n};\n\ntype PrimaryKeyConstraintRow = {\n constraint_name: string | null;\n};\n\ntype PrimaryKeyColumnRow = {\n column_name: string | null;\n ordinal_position: number | null;\n};\n\nexport interface BigQueryTableGroundingConfig extends TableGroundingConfig {}\n\nexport class BigQueryTableGrounding extends TableGrounding {\n #adapter: BigQuery;\n\n constructor(adapter: BigQuery, config: BigQueryTableGroundingConfig = {}) {\n super(config);\n this.#adapter = adapter;\n }\n\n protected override async applyFilter(): Promise<string[]> {\n const names = await super.applyFilter();\n return names.filter((name) => this.#isTableInScope(name));\n }\n\n protected override async getAllTableNames(): Promise<string[]> {\n const names: string[] = [];\n\n for (const dataset of this.#adapter.datasets) {\n const rows = await this.#adapter.runQuery<TableNameRow>(`\n SELECT table_name\n FROM ${this.#adapter.infoSchemaView(dataset, 'TABLES')}\n WHERE table_type = 'BASE TABLE'\n ORDER BY table_name\n `);\n\n for (const row of rows) {\n if (!row.table_name) continue;\n names.push(`${dataset}.${row.table_name}`);\n }\n }\n\n return names;\n }\n\n protected override async getTable(tableName: string): Promise<Table> {\n const { schema: dataset, table } = this.#adapter.parseTableName(tableName);\n\n const rows = await this.#adapter.runQuery<ColumnFieldPathRow>(`\n SELECT\n f.field_path,\n f.data_type,\n c.ordinal_position\n FROM ${this.#adapter.infoSchemaView(dataset, 'COLUMN_FIELD_PATHS')} AS f\n JOIN ${this.#adapter.infoSchemaView(dataset, 'COLUMNS')} AS c\n ON f.table_name = c.table_name\n AND f.column_name = c.column_name\n WHERE f.table_name = '${this.#adapter.escapeString(table)}'\n ORDER BY c.ordinal_position, f.field_path\n `);\n\n const seen = new Set<string>();\n const columns = rows\n .map((r) => ({\n name: r.field_path ?? 'unknown',\n type: r.data_type ?? 'unknown',\n ordinal: r.ordinal_position ?? 0,\n }))\n .filter((c) => {\n if (!c.name) return false;\n if (seen.has(c.name)) return false;\n seen.add(c.name);\n return true;\n })\n .map((c) => ({ name: c.name, type: c.type }));\n\n return {\n name: `${dataset}.${table}`,\n schema: dataset,\n rawName: table,\n columns,\n };\n }\n\n protected override async findOutgoingRelations(\n tableName: string,\n ): Promise<Relationship[]> {\n const { schema: dataset, table } = this.#adapter.parseTableName(tableName);\n\n const rows = await this.#adapter.runQuery<ForeignKeyKeyColumnRow>(`\n SELECT\n kcu.constraint_name,\n kcu.column_name,\n kcu.ordinal_position,\n kcu.position_in_unique_constraint\n FROM ${this.#adapter.infoSchemaView(dataset, 'TABLE_CONSTRAINTS')} AS tc\n JOIN ${this.#adapter.infoSchemaView(dataset, 'KEY_COLUMN_USAGE')} AS kcu\n ON tc.constraint_name = kcu.constraint_name\n AND tc.constraint_schema = kcu.constraint_schema\n WHERE tc.constraint_type = 'FOREIGN KEY'\n AND tc.table_name = '${this.#adapter.escapeString(table)}'\n ORDER BY kcu.constraint_name, kcu.ordinal_position\n `);\n\n const byConstraint = new Map<\n string,\n Array<{\n column: string;\n ordinal: number;\n pkOrdinal: number | null;\n }>\n >();\n\n for (const row of rows) {\n if (!row.constraint_name || !row.column_name) continue;\n const list = byConstraint.get(row.constraint_name) ?? [];\n list.push({\n column: row.column_name,\n ordinal: row.ordinal_position ?? 0,\n pkOrdinal: row.position_in_unique_constraint,\n });\n byConstraint.set(row.constraint_name, list);\n }\n\n const rels: Relationship[] = [];\n for (const [constraintName, columns] of byConstraint.entries()) {\n const rel = await this.#buildForeignKeyRelationship({\n constraintDataset: dataset,\n childDataset: dataset,\n childTable: table,\n constraintName,\n childColumns: columns,\n });\n if (rel) rels.push(rel);\n }\n\n return rels;\n }\n\n protected override async findIncomingRelations(\n tableName: string,\n ): Promise<Relationship[]> {\n const { schema: referencedDataset, table: referencedTable } =\n this.#adapter.parseTableName(tableName);\n\n const rels: Relationship[] = [];\n\n for (const constraintDataset of this.#adapter.datasets) {\n const rows = await this.#adapter.runQuery<{\n constraint_name: string | null;\n }>(`\n SELECT DISTINCT constraint_name\n FROM ${this.#adapter.infoSchemaView(constraintDataset, 'CONSTRAINT_COLUMN_USAGE')}\n WHERE table_schema = '${this.#adapter.escapeString(referencedDataset)}'\n AND table_name = '${this.#adapter.escapeString(referencedTable)}'\n `);\n\n for (const row of rows) {\n if (!row.constraint_name) continue;\n const rel = await this.#buildForeignKeyRelationshipFromConstraintName(\n constraintDataset,\n row.constraint_name,\n );\n if (\n rel &&\n rel.referenced_table === `${referencedDataset}.${referencedTable}`\n ) {\n rels.push(rel);\n }\n }\n }\n\n return rels;\n }\n\n #isTableInScope(tableName: string): boolean {\n const { schema } = this.#adapter.parseTableName(tableName);\n return this.#adapter.isDatasetAllowed(schema);\n }\n\n async #buildForeignKeyRelationshipFromConstraintName(\n constraintDataset: string,\n constraintName: string,\n ): Promise<Relationship | undefined> {\n const keyRows = await this.#adapter.runQuery<\n ForeignKeyKeyColumnRow & { child_table_name: string | null }\n >(`\n SELECT\n kcu.constraint_name,\n tc.table_name AS child_table_name,\n kcu.column_name,\n kcu.ordinal_position,\n kcu.position_in_unique_constraint\n FROM ${this.#adapter.infoSchemaView(constraintDataset, 'TABLE_CONSTRAINTS')} AS tc\n JOIN ${this.#adapter.infoSchemaView(constraintDataset, 'KEY_COLUMN_USAGE')} AS kcu\n ON tc.constraint_name = kcu.constraint_name\n AND tc.constraint_schema = kcu.constraint_schema\n WHERE tc.constraint_type = 'FOREIGN KEY'\n AND tc.constraint_name = '${this.#adapter.escapeString(constraintName)}'\n ORDER BY kcu.ordinal_position\n `);\n\n if (keyRows.length === 0) return undefined;\n const childTable = keyRows[0]?.child_table_name;\n if (!childTable) return undefined;\n\n const childColumns = keyRows\n .filter((r) => r.column_name)\n .map((r) => ({\n column: r.column_name ?? 'unknown',\n ordinal: r.ordinal_position ?? 0,\n pkOrdinal: r.position_in_unique_constraint,\n }));\n\n return this.#buildForeignKeyRelationship({\n constraintDataset,\n childDataset: constraintDataset,\n childTable,\n constraintName,\n childColumns,\n });\n }\n\n async #buildForeignKeyRelationship(args: {\n constraintDataset: string;\n childDataset: string;\n childTable: string;\n constraintName: string;\n childColumns: Array<{\n column: string;\n ordinal: number;\n pkOrdinal: number | null;\n }>;\n }): Promise<Relationship | undefined> {\n const refTableRows = await this.#adapter.runQuery<ReferencedTableRow>(`\n SELECT DISTINCT table_schema, table_name\n FROM ${this.#adapter.infoSchemaView(args.constraintDataset, 'CONSTRAINT_COLUMN_USAGE')}\n WHERE constraint_name = '${this.#adapter.escapeString(args.constraintName)}'\n `);\n\n const referenced = refTableRows.find((r) => r.table_schema && r.table_name);\n if (!referenced?.table_schema || !referenced.table_name) {\n return undefined;\n }\n\n const referencedDataset = referenced.table_schema;\n const referencedTable = referenced.table_name;\n\n // Dataset scoping: never traverse relationships outside configured datasets.\n if (!this.#adapter.isDatasetAllowed(referencedDataset)) {\n return undefined;\n }\n\n const pkConstraintRows = await this.#adapter\n .runQuery<PrimaryKeyConstraintRow>(`\n SELECT constraint_name\n FROM ${this.#adapter.infoSchemaView(referencedDataset, 'TABLE_CONSTRAINTS')}\n WHERE constraint_type = 'PRIMARY KEY'\n AND table_name = '${this.#adapter.escapeString(referencedTable)}'\n LIMIT 1\n `);\n\n const pkConstraintName = pkConstraintRows[0]?.constraint_name;\n if (!pkConstraintName) {\n return undefined;\n }\n\n const pkColumnRows = await this.#adapter.runQuery<PrimaryKeyColumnRow>(`\n SELECT column_name, ordinal_position\n FROM ${this.#adapter.infoSchemaView(referencedDataset, 'KEY_COLUMN_USAGE')}\n WHERE constraint_name = '${this.#adapter.escapeString(pkConstraintName)}'\n AND table_name = '${this.#adapter.escapeString(referencedTable)}'\n ORDER BY ordinal_position\n `);\n\n const pkByOrdinal = new Map<number, string>();\n for (const row of pkColumnRows) {\n if (!row.column_name || row.ordinal_position == null) continue;\n pkByOrdinal.set(row.ordinal_position, row.column_name);\n }\n\n const orderedChild = [...args.childColumns].sort(\n (a, b) => a.ordinal - b.ordinal,\n );\n const from = orderedChild.map((c) => c.column);\n const to = orderedChild.map((c) => {\n const pkOrdinal = c.pkOrdinal ?? c.ordinal;\n return pkByOrdinal.get(pkOrdinal) ?? 'unknown';\n });\n\n return {\n table: `${args.childDataset}.${args.childTable}`,\n from,\n referenced_table: `${referencedDataset}.${referencedTable}`,\n to,\n };\n }\n}\n", "import type { ColumnStats, Filter } from '../adapter.ts';\nimport { AbstractGrounding } from './abstract.grounding.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('view');\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): Promise<void> {\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 }\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';\nimport type { BigQuery } from './bigquery.ts';\n\ntype ViewNameRow = {\n table_name: string | null;\n};\n\ntype ViewDefinitionRow = {\n ddl: string | null;\n};\n\ntype ColumnRow = {\n column_name: string | null;\n data_type: string | null;\n};\n\nexport interface BigQueryViewGroundingConfig extends ViewGroundingConfig {}\n\nexport class BigQueryViewGrounding extends ViewGrounding {\n #adapter: BigQuery;\n\n constructor(adapter: Adapter, config: BigQueryViewGroundingConfig = {}) {\n super(config);\n this.#adapter = adapter as BigQuery;\n }\n\n protected override async applyFilter(): Promise<string[]> {\n const names = await super.applyFilter();\n return names.filter((name) => this.#isViewInScope(name));\n }\n\n protected override async getAllViewNames(): Promise<string[]> {\n const names: string[] = [];\n\n for (const dataset of this.#adapter.datasets) {\n const rows = await this.#adapter.runQuery<ViewNameRow>(`\n SELECT table_name\n FROM ${this.#adapter.infoSchemaView(dataset, 'TABLES')}\n WHERE table_type IN ('VIEW', 'MATERIALIZED VIEW')\n ORDER BY table_name\n `);\n\n for (const row of rows) {\n if (!row.table_name) continue;\n names.push(`${dataset}.${row.table_name}`);\n }\n }\n\n return names;\n }\n\n protected override async getView(viewName: string): Promise<View> {\n const { schema: dataset, table } = this.#adapter.parseTableName(viewName);\n\n const defRows = await this.#adapter.runQuery<ViewDefinitionRow>(`\n SELECT ddl\n FROM ${this.#adapter.infoSchemaView(dataset, 'TABLES')}\n WHERE table_name = '${this.#adapter.escapeString(table)}'\n AND table_type IN ('VIEW', 'MATERIALIZED VIEW')\n LIMIT 1\n `);\n\n const columns = await this.#adapter.runQuery<ColumnRow>(`\n SELECT column_name, data_type\n FROM ${this.#adapter.infoSchemaView(dataset, 'COLUMNS')}\n WHERE table_name = '${this.#adapter.escapeString(table)}'\n ORDER BY ordinal_position\n `);\n\n return {\n name: `${dataset}.${table}`,\n schema: dataset,\n rawName: table,\n definition: defRows[0]?.ddl ?? undefined,\n columns: columns.map((c) => ({\n name: c.column_name ?? 'unknown',\n type: c.data_type ?? 'unknown',\n })),\n };\n }\n\n #isViewInScope(viewName: string): boolean {\n const { schema } = this.#adapter.parseTableName(viewName);\n return this.#adapter.isDatasetAllowed(schema);\n }\n}\n", "import { type Adapter } from '../adapter.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 {\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 { BigQuery } from './bigquery.ts';\nimport { BigQueryConstraintGrounding } from './constraint.bigquery.grounding.ts';\nimport { BigQueryIndexesGrounding } from './indexes.bigquery.grounding.ts';\nimport { BigQueryInfoGrounding } from './info.bigquery.grounding.ts';\nimport { BigQueryRowCountGrounding } from './row-count.bigquery.grounding.ts';\nimport { BigQueryTableGrounding } from './table.bigquery.grounding.ts';\nimport { BigQueryViewGrounding } from './view.bigquery.grounding.ts';\n\nexport * from './bigquery.ts';\n\nexport function tables(config: TableGroundingConfig = {}) {\n return (adapter: Adapter) =>\n new BigQueryTableGrounding(adapter as unknown as BigQuery, config);\n}\n\nexport function info(config: InfoGroundingConfig = {}) {\n return (adapter: Adapter) => new BigQueryInfoGrounding(adapter as BigQuery);\n}\n\nexport function views(config: ViewGroundingConfig = {}) {\n return (adapter: Adapter) => new BigQueryViewGrounding(adapter, config);\n}\n\nexport function indexes(config: IndexesGroundingConfig = {}) {\n return (adapter: Adapter) => new BigQueryIndexesGrounding(adapter, config);\n}\n\nexport function rowCount(config: RowCountGroundingConfig = {}) {\n return (adapter: Adapter) => new BigQueryRowCountGrounding(adapter, config);\n}\n\nexport function constraints(config: ConstraintGroundingConfig = {}) {\n return (adapter: Adapter) =>\n new BigQueryConstraintGrounding(adapter as unknown as BigQuery, config);\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 indexes,\n rowCount,\n constraints,\n report,\n BigQuery,\n};\n"],
|
|
5
|
-
"mappings": "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",
|
|
3
|
+
"sources": ["../../../../src/lib/adapters/adapter.ts", "../../../../src/lib/fragments/schema.ts", "../../../../src/lib/adapters/groundings/context.ts", "../../../../src/lib/adapters/groundings/abstract.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/report.grounding.ts", "../../../../src/lib/adapters/groundings/row-count.grounding.ts", "../../../../src/lib/adapters/groundings/table.grounding.ts", "../../../../src/lib/adapters/bigquery/bigquery.ts", "../../../../src/lib/adapters/bigquery/constraint.bigquery.grounding.ts", "../../../../src/lib/adapters/bigquery/indexes.bigquery.grounding.ts", "../../../../src/lib/adapters/bigquery/info.bigquery.grounding.ts", "../../../../src/lib/adapters/bigquery/row-count.bigquery.grounding.ts", "../../../../src/lib/adapters/bigquery/table.bigquery.grounding.ts", "../../../../src/lib/adapters/groundings/view.grounding.ts", "../../../../src/lib/adapters/bigquery/view.bigquery.grounding.ts", "../../../../src/lib/adapters/bigquery/index.ts"],
|
|
4
|
+
"sourcesContent": ["import { type SqlLanguage, format as formatSql } from 'sql-formatter';\n\nimport type { ContextFragment } from '@deepagents/context';\n\nimport {\n column,\n constraint,\n dialectInfo,\n index,\n relationship,\n table,\n view,\n} from '../fragments/schema.ts';\nimport type { AbstractGrounding } from './groundings/abstract.grounding.ts';\nimport {\n type GroundingContext,\n createGroundingContext,\n} from './groundings/context.ts';\nimport type { View } from './groundings/view.grounding.ts';\n\n/**\n * Filter type for view/table names.\n * - string[]: explicit list of view names\n * - RegExp: pattern to match view names\n * - function: predicate to filter view names\n */\nexport type Filter = string[] | RegExp | ((viewName: string) => boolean);\n\nexport interface Table {\n name: string;\n schema?: string;\n rawName?: string;\n columns: {\n name: string;\n type: string;\n kind?: 'LowCardinality' | 'Enum';\n values?: string[];\n isIndexed?: boolean;\n stats?: ColumnStats;\n }[];\n rowCount?: number;\n sizeHint?: 'tiny' | 'small' | 'medium' | 'large' | 'huge';\n indexes?: TableIndex[];\n constraints?: TableConstraint[];\n}\n\nexport interface TableIndex {\n name: string;\n columns: string[];\n unique?: boolean;\n type?: string;\n}\n\nexport interface TableConstraint {\n name: string;\n type:\n | 'CHECK'\n | 'UNIQUE'\n | 'NOT_NULL'\n | 'DEFAULT'\n | 'PRIMARY_KEY'\n | 'FOREIGN_KEY';\n columns?: string[];\n definition?: string;\n defaultValue?: string;\n referencedTable?: string;\n referencedColumns?: string[];\n}\n\nexport interface ColumnStats {\n min?: string;\n max?: string;\n nullFraction?: number;\n nDistinct?: number;\n correlation?: 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 abstract readonly formatterLanguage: SqlLanguage;\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 /**\n * Introspect the database schema and return context fragments.\n *\n * Executes all configured groundings to populate the context, then\n * generates fragments from the complete context data.\n *\n * @param ctx - Optional grounding context for sharing state between groundings\n * @returns Array of context fragments representing the database schema\n */\n async introspect(ctx = createGroundingContext()): Promise<ContextFragment[]> {\n // Phase 1: All groundings populate ctx\n for (const fn of this.grounding) {\n const grounding = fn(this);\n await grounding.execute(ctx);\n }\n\n // Phase 2: Generate fragments from complete ctx\n return this.#toSchemaFragments(ctx);\n }\n\n /**\n * Convert complete grounding context to schema fragments.\n * Called after all groundings have populated ctx with data.\n */\n #toSchemaFragments(ctx: GroundingContext): ContextFragment[] {\n const fragments: ContextFragment[] = [];\n\n // Dialect info\n if (ctx.info) {\n fragments.push(\n dialectInfo({\n dialect: ctx.info.dialect,\n version: ctx.info.version,\n database: ctx.info.database,\n }),\n );\n }\n\n // Tables (with all annotations now included)\n for (const t of ctx.tables) {\n fragments.push(this.#tableToFragment(t));\n }\n\n // Views\n for (const v of ctx.views) {\n fragments.push(this.#viewToFragment(v));\n }\n\n // Relationships\n const tableMap = new Map(ctx.tables.map((t) => [t.name, t]));\n for (const rel of ctx.relationships) {\n const sourceTable = tableMap.get(rel.table);\n const targetTable = tableMap.get(rel.referenced_table);\n fragments.push(\n this.#relationshipToFragment(rel, sourceTable, targetTable),\n );\n }\n\n // Business context\n if (ctx.report) {\n fragments.push({ name: 'businessContext', data: ctx.report });\n }\n\n return fragments;\n }\n\n /**\n * Convert a Table to a table fragment with nested column, index, and constraint fragments.\n */\n #tableToFragment(t: Table): ContextFragment {\n // Build constraint lookup maps for column-level annotations\n const pkConstraint = t.constraints?.find((c) => c.type === 'PRIMARY_KEY');\n const pkColumns = new Set(pkConstraint?.columns ?? []);\n\n const notNullColumns = new Set(\n t.constraints\n ?.filter((c) => c.type === 'NOT_NULL')\n .flatMap((c) => c.columns ?? []) ?? [],\n );\n\n const defaultByColumn = new Map<string, string>();\n for (const c of t.constraints?.filter((c) => c.type === 'DEFAULT') ?? []) {\n for (const col of c.columns ?? []) {\n if (c.defaultValue != null) {\n defaultByColumn.set(col, c.defaultValue);\n }\n }\n }\n\n // Single-column UNIQUE constraints\n const uniqueColumns = new Set(\n t.constraints\n ?.filter((c) => c.type === 'UNIQUE' && c.columns?.length === 1)\n .flatMap((c) => c.columns ?? []) ?? [],\n );\n\n // Foreign key lookup: column -> referenced table.column\n const fkByColumn = new Map<string, string>();\n for (const c of t.constraints?.filter((c) => c.type === 'FOREIGN_KEY') ??\n []) {\n const cols = c.columns ?? [];\n const refCols = c.referencedColumns ?? [];\n for (let i = 0; i < cols.length; i++) {\n const refCol = refCols[i] ?? refCols[0] ?? cols[i];\n fkByColumn.set(cols[i], `${c.referencedTable}.${refCol}`);\n }\n }\n\n // Build column fragments\n const columnFragments = t.columns.map((col) =>\n column({\n name: col.name,\n type: col.type,\n pk: pkColumns.has(col.name) || undefined,\n fk: fkByColumn.get(col.name),\n unique: uniqueColumns.has(col.name) || undefined,\n notNull: notNullColumns.has(col.name) || undefined,\n default: defaultByColumn.get(col.name),\n indexed: col.isIndexed || undefined,\n values: col.values,\n stats: col.stats,\n }),\n );\n\n // Build index fragments\n const indexFragments = (t.indexes ?? []).map((idx) =>\n index({\n name: idx.name,\n columns: idx.columns,\n unique: idx.unique,\n type: idx.type,\n }),\n );\n\n // Build constraint fragments for multi-column UNIQUE and CHECK constraints\n const constraintFragments = (t.constraints ?? [])\n .filter(\n (c) =>\n c.type === 'CHECK' ||\n (c.type === 'UNIQUE' && (c.columns?.length ?? 0) > 1),\n )\n .map((c) =>\n constraint({\n name: c.name,\n type: c.type,\n columns: c.columns,\n definition: c.definition,\n }),\n );\n\n return table({\n name: t.name,\n schema: t.schema,\n rowCount: t.rowCount,\n sizeHint: t.sizeHint,\n columns: columnFragments,\n indexes: indexFragments.length > 0 ? indexFragments : undefined,\n constraints:\n constraintFragments.length > 0 ? constraintFragments : undefined,\n });\n }\n\n /**\n * Convert a View to a view fragment with nested column fragments.\n */\n #viewToFragment(v: View): ContextFragment {\n const columnFragments = v.columns.map((col) =>\n column({\n name: col.name,\n type: col.type,\n values: col.values,\n stats: col.stats,\n }),\n );\n\n return view({\n name: v.name,\n schema: v.schema,\n columns: columnFragments,\n definition: v.definition,\n });\n }\n\n /**\n * Convert a Relationship to a relationship fragment.\n * Infers cardinality from row counts if available.\n */\n #relationshipToFragment(\n rel: Relationship,\n sourceTable?: Table,\n targetTable?: Table,\n ): ContextFragment {\n const sourceCount = sourceTable?.rowCount;\n const targetCount = targetTable?.rowCount;\n\n let cardinality:\n | 'one-to-one'\n | 'one-to-many'\n | 'many-to-one'\n | 'many-to-many'\n | undefined;\n\n if (sourceCount != null && targetCount != null && targetCount > 0) {\n const ratio = sourceCount / targetCount;\n if (ratio > 5) {\n cardinality = 'many-to-one';\n } else if (ratio < 1.2 && ratio > 0.8) {\n cardinality = 'one-to-one';\n } else if (ratio < 0.2) {\n cardinality = 'one-to-many';\n }\n }\n\n return relationship({\n from: { table: rel.table, columns: rel.from },\n to: { table: rel.referenced_table, columns: rel.to },\n cardinality,\n });\n }\n format(sql: string): string {\n try {\n return formatSql(sql, { language: this.formatterLanguage });\n } catch {\n return sql;\n }\n }\n\n abstract execute(sql: string): Promise<any[]> | any[];\n abstract validate(sql: string): Promise<string | void> | string | void;\n abstract runQuery<Row>(sql: string): Promise<Row[]> | Row[];\n\n /**\n * Quote an identifier (table/column name) for safe use in SQL.\n * Each database uses different quoting styles.\n */\n abstract quoteIdentifier(name: string): string;\n\n /**\n * Escape a string value for safe use in SQL.\n * Each database escapes different characters.\n */\n abstract escape(value: string): string;\n\n /**\n * Build a SELECT query to sample rows from a table.\n * Each database uses different syntax for limiting rows (LIMIT vs TOP).\n */\n abstract buildSampleRowsQuery(\n tableName: string,\n columns: string[] | undefined,\n limit: number,\n ): string;\n\n /**\n * Convert unknown database value to number.\n * Handles number, bigint, and string types.\n */\n toNumber(value: unknown): number | undefined {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value;\n }\n if (typeof value === 'bigint') {\n return Number(value);\n }\n if (typeof value === 'string' && value.trim() !== '') {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : undefined;\n }\n return undefined;\n }\n\n /**\n * Parse a potentially qualified table name into schema and table parts.\n */\n parseTableName(name: string): { schema: string; table: string } {\n if (name.includes('.')) {\n const [schema, ...rest] = name.split('.');\n return { schema, table: rest.join('.') };\n }\n return { schema: this.defaultSchema ?? '', table: name };\n }\n\n /**\n * Escape a string value for use in SQL string literals (single quotes).\n * Used in WHERE clauses like: WHERE name = '${escapeString(value)}'\n */\n escapeString(value: string): string {\n return value.replace(/'/g, \"''\");\n }\n\n /**\n * Build a SQL filter clause to include/exclude schemas.\n * @param columnName - The schema column name (e.g., 'TABLE_SCHEMA')\n * @param allowedSchemas - If provided, filter to these schemas only\n */\n buildSchemaFilter(columnName: string, allowedSchemas?: string[]): string {\n if (allowedSchemas && allowedSchemas.length > 0) {\n const values = allowedSchemas\n .map((s) => `'${this.escapeString(s)}'`)\n .join(', ');\n return `AND ${columnName} IN (${values})`;\n }\n if (this.systemSchemas.length > 0) {\n const values = this.systemSchemas\n .map((s) => `'${this.escapeString(s)}'`)\n .join(', ');\n return `AND ${columnName} NOT IN (${values})`;\n }\n return '';\n }\n}\n\nexport function filterTablesByName<T extends { name: string }>(\n tables: T[],\n filter: TablesFilter | undefined,\n): T[] {\n if (!filter) return tables;\n return tables.filter((table) => matchesFilter(table.name, filter));\n}\n\nexport function filterRelationshipsByTables(\n relationships: Relationship[],\n tableNames: Set<string> | undefined,\n): Relationship[] {\n if (tableNames === undefined) {\n return relationships;\n }\n if (tableNames.size === 0) {\n return [];\n }\n return relationships.filter(\n (it) => tableNames.has(it.table) || tableNames.has(it.referenced_table),\n );\n}\n\nexport function applyTablesFilter(\n tables: Table[],\n relationships: Relationship[],\n filter: TablesFilter | undefined,\n): { tables: Table[]; relationships: Relationship[] } {\n if (!filter) {\n return { tables, relationships };\n }\n\n const allowedNames = new Set(\n getTablesWithRelated(tables, relationships, filter),\n );\n\n return {\n tables: tables.filter((table) => allowedNames.has(table.name)),\n relationships: filterRelationshipsByTables(relationships, allowedNames),\n };\n}\n\nexport function matchesFilter(\n tableName: string,\n filter: TablesFilter,\n): boolean {\n if (Array.isArray(filter)) {\n return filter.includes(tableName);\n }\n return filter.test(tableName);\n}\n\nexport function getTablesWithRelated(\n allTables: Table[],\n relationships: Relationship[],\n filter: TablesFilter,\n): string[] {\n const matchedTables = filterTablesByName(allTables, filter).map(\n (it) => it.name,\n );\n\n if (matchedTables.length === 0) {\n return [];\n }\n\n const adjacency = new Map<string, Set<string>>();\n\n for (const rel of relationships) {\n if (!adjacency.has(rel.table)) {\n adjacency.set(rel.table, new Set());\n }\n if (!adjacency.has(rel.referenced_table)) {\n adjacency.set(rel.referenced_table, new Set());\n }\n adjacency.get(rel.table)!.add(rel.referenced_table);\n adjacency.get(rel.referenced_table)!.add(rel.table);\n }\n\n const result = new Set<string>(matchedTables);\n const queue = [...matchedTables];\n\n while (queue.length > 0) {\n const current = queue.shift()!;\n const neighbors = adjacency.get(current);\n\n if (!neighbors) {\n continue;\n }\n\n for (const neighbor of neighbors) {\n if (!result.has(neighbor)) {\n result.add(neighbor);\n queue.push(neighbor);\n }\n }\n }\n\n return Array.from(result);\n}\n", "import type { ContextFragment } from '@deepagents/context';\n\n/**\n * Schema fragment builders.\n *\n * These fragments represent database schema metadata that can be injected\n * into AI prompts. Use with renderers (XML, Markdown, TOML, TOON) to format.\n *\n * @example\n * ```ts\n * import { dialectInfo, table, column, relationship } from '@deepagents/text2sql';\n *\n * const schemaFragments = [\n * dialectInfo({ dialect: 'PostgreSQL', version: '14.5' }),\n * table({\n * name: 'users',\n * columns: [\n * column({ name: 'id', type: 'integer', pk: true }),\n * column({ name: 'email', type: 'varchar', unique: true }),\n * ],\n * }),\n * ];\n * ```\n */\n\n/**\n * Database dialect and version information.\n *\n * @param input.dialect - Database type (PostgreSQL, SQLite, SQL Server, etc.)\n * @param input.version - Database version string\n * @param input.database - Database name\n *\n * @example\n * dialectInfo({ dialect: 'PostgreSQL', version: '14.5', database: 'myapp' })\n */\nexport function dialectInfo(input: {\n dialect: string;\n version?: string;\n database?: string;\n}): ContextFragment {\n return {\n name: 'dialectInfo',\n data: {\n dialect: input.dialect,\n ...(input.version && { version: input.version }),\n ...(input.database && { database: input.database }),\n },\n };\n}\n\n/**\n * Database table with columns and optional metadata.\n *\n * @param input.name - Table name\n * @param input.schema - Schema name (e.g., 'public' for PostgreSQL)\n * @param input.rowCount - Approximate row count\n * @param input.sizeHint - Size category for query optimization hints\n * @param input.columns - Array of column() fragments\n * @param input.indexes - Array of index() fragments\n * @param input.constraints - Array of constraint() fragments\n *\n * @example\n * table({\n * name: 'users',\n * rowCount: 1500,\n * sizeHint: 'medium',\n * columns: [\n * column({ name: 'id', type: 'integer', pk: true }),\n * column({ name: 'email', type: 'varchar', unique: true, indexed: true }),\n * ],\n * indexes: [\n * index({ name: 'idx_email', columns: ['email'], unique: true }),\n * ],\n * })\n */\nexport function table(input: {\n name: string;\n schema?: string;\n rowCount?: number;\n sizeHint?: 'tiny' | 'small' | 'medium' | 'large' | 'huge';\n columns: ContextFragment[];\n indexes?: ContextFragment[];\n constraints?: ContextFragment[];\n}): ContextFragment {\n return {\n name: 'table',\n data: {\n name: input.name,\n ...(input.schema && { schema: input.schema }),\n ...(input.rowCount != null && { rowCount: input.rowCount }),\n ...(input.sizeHint && { sizeHint: input.sizeHint }),\n columns: input.columns,\n ...(input.indexes?.length && { indexes: input.indexes }),\n ...(input.constraints?.length && { constraints: input.constraints }),\n },\n };\n}\n\n/**\n * Table column with type and annotations.\n *\n * @param input.name - Column name\n * @param input.type - Column data type (e.g., 'integer', 'varchar(255)')\n * @param input.pk - Is primary key\n * @param input.fk - Foreign key reference in \"table.column\" format\n * @param input.unique - Has unique constraint\n * @param input.notNull - Has NOT NULL constraint\n * @param input.default - Default value expression\n * @param input.indexed - Has index on this column\n * @param input.values - Enum or low cardinality values\n * @param input.stats - Column statistics (min, max, null fraction)\n *\n * @example\n * column({\n * name: 'status',\n * type: 'varchar',\n * notNull: true,\n * indexed: true,\n * values: ['active', 'inactive', 'suspended'],\n * })\n */\nexport function column(input: {\n name: string;\n type: string;\n pk?: boolean;\n fk?: string;\n unique?: boolean;\n notNull?: boolean;\n default?: string;\n indexed?: boolean;\n values?: string[];\n stats?: {\n min?: string;\n max?: string;\n nullFraction?: number;\n nDistinct?: number;\n correlation?: number;\n };\n}): ContextFragment {\n return {\n name: 'column',\n data: {\n name: input.name,\n type: input.type,\n ...(input.pk && { pk: true }),\n ...(input.fk && { fk: input.fk }),\n ...(input.unique && { unique: true }),\n ...(input.notNull && { notNull: true }),\n ...(input.default && { default: input.default }),\n ...(input.indexed && { indexed: true }),\n ...(input.values?.length && { values: input.values }),\n ...(input.stats && { stats: input.stats }),\n },\n };\n}\n\n/**\n * Table index.\n *\n * @param input.name - Index name\n * @param input.columns - Columns included in the index\n * @param input.unique - Is unique index\n * @param input.type - Index type (BTREE, HASH, GIN, etc.)\n *\n * @example\n * index({ name: 'idx_user_email', columns: ['email'], unique: true, type: 'BTREE' })\n */\nexport function index(input: {\n name: string;\n columns: string[];\n unique?: boolean;\n type?: string;\n}): ContextFragment {\n return {\n name: 'index',\n data: {\n name: input.name,\n columns: input.columns,\n ...(input.unique && { unique: true }),\n ...(input.type && { type: input.type }),\n },\n };\n}\n\n/**\n * Table constraint (CHECK, UNIQUE, PRIMARY_KEY, FOREIGN_KEY, etc).\n *\n * @param input.name - Constraint name\n * @param input.type - Constraint type\n * @param input.columns - Columns involved in the constraint\n * @param input.definition - CHECK constraint SQL definition\n * @param input.defaultValue - DEFAULT constraint value\n * @param input.referencedTable - For FK: referenced table name\n * @param input.referencedColumns - For FK: referenced column names\n *\n * @example\n * constraint({\n * name: 'chk_amount_positive',\n * type: 'CHECK',\n * definition: 'amount > 0',\n * })\n *\n * @example\n * constraint({\n * name: 'fk_order_user',\n * type: 'FOREIGN_KEY',\n * columns: ['user_id'],\n * referencedTable: 'users',\n * referencedColumns: ['id'],\n * })\n */\nexport function constraint(input: {\n name: string;\n type:\n | 'CHECK'\n | 'UNIQUE'\n | 'NOT_NULL'\n | 'DEFAULT'\n | 'PRIMARY_KEY'\n | 'FOREIGN_KEY';\n columns?: string[];\n definition?: string;\n defaultValue?: string;\n referencedTable?: string;\n referencedColumns?: string[];\n}): ContextFragment {\n return {\n name: 'constraint',\n data: {\n name: input.name,\n type: input.type,\n ...(input.columns?.length && { columns: input.columns }),\n ...(input.definition && { definition: input.definition }),\n ...(input.defaultValue && { defaultValue: input.defaultValue }),\n ...(input.referencedTable && { referencedTable: input.referencedTable }),\n ...(input.referencedColumns?.length && {\n referencedColumns: input.referencedColumns,\n }),\n },\n };\n}\n\n/**\n * Database view.\n *\n * @param input.name - View name\n * @param input.schema - Schema name\n * @param input.columns - Array of column() fragments\n * @param input.definition - View SQL definition\n *\n * @example\n * view({\n * name: 'active_users',\n * columns: [\n * column({ name: 'id', type: 'integer' }),\n * column({ name: 'email', type: 'varchar' }),\n * ],\n * definition: \"SELECT id, email FROM users WHERE status = 'active'\",\n * })\n */\nexport function view(input: {\n name: string;\n schema?: string;\n columns: ContextFragment[];\n definition?: string;\n}): ContextFragment {\n return {\n name: 'view',\n data: {\n name: input.name,\n ...(input.schema && { schema: input.schema }),\n columns: input.columns,\n ...(input.definition && { definition: input.definition }),\n },\n };\n}\n\n/**\n * Relationship between tables (foreign key connection).\n *\n * @param input.from - Source table and columns\n * @param input.to - Referenced table and columns\n * @param input.cardinality - Relationship cardinality\n *\n * @example\n * relationship({\n * from: { table: 'orders', columns: ['user_id'] },\n * to: { table: 'users', columns: ['id'] },\n * cardinality: 'many-to-one',\n * })\n */\nexport function relationship(input: {\n from: { table: string; columns: string[] };\n to: { table: string; columns: string[] };\n cardinality?: 'one-to-one' | 'one-to-many' | 'many-to-one' | 'many-to-many';\n}): ContextFragment {\n return {\n name: 'relationship',\n data: {\n from: input.from,\n to: input.to,\n ...(input.cardinality && { cardinality: input.cardinality }),\n },\n };\n}\n", "import type { AdapterInfo, ColumnStats, Relationship, Table } from '../adapter.ts';\nimport type { View } from './view.grounding.ts';\n\n/**\n * Column type for grounding operations.\n * Common interface between Table.columns and View.columns.\n */\nexport interface Column {\n name: string;\n type: string;\n kind?: 'LowCardinality' | 'Enum';\n values?: string[];\n stats?: ColumnStats;\n}\n\n/**\n * Entity with columns (Table or View).\n */\nexport interface ColumnContainer {\n name: string;\n columns: Column[];\n}\n\n/**\n * Shared context object passed to all groundings.\n * Groundings read from and write to this context.\n */\nexport interface GroundingContext {\n /** Tables discovered by TableGrounding */\n tables: Table[];\n\n /** Views discovered by ViewGrounding */\n views: View[];\n\n /** Relationships discovered by TableGrounding */\n relationships: Relationship[];\n\n /** Database info collected by InfoGrounding */\n info?: AdapterInfo;\n\n /** Business context report generated by ReportGrounding */\n report?: string;\n}\n\n/**\n * Create a new empty grounding context.\n */\nexport function createGroundingContext(): GroundingContext {\n return {\n tables: [],\n views: [],\n relationships: [],\n info: undefined,\n };\n}\n", "import type { Adapter } from '../adapter.ts';\nimport type { GroundingContext } from './context.ts';\n\n/**\n * Filter type for table names.\n * - string[]: explicit list of table names\n * - RegExp: pattern to match table names\n * - function: predicate to filter table names\n */\nexport type Filter = string[] | RegExp | ((tableName: string) => boolean);\n\nexport interface AdapterInfo {\n dialect: string;\n version?: string;\n database?: string;\n details?: Record<string, unknown>;\n}\nexport type AdapterInfoProvider =\n | AdapterInfo\n | (() => Promise<AdapterInfo> | AdapterInfo);\n\n/**\n * Abstract base class for database schema groundings.\n *\n * Groundings collect schema metadata into the shared GroundingContext.\n * Fragment generation is centralized in Adapter.introspect().\n */\nexport abstract class AbstractGrounding {\n /**\n * Grounding identifier for debugging/logging.\n */\n name: string;\n\n constructor(name: string) {\n this.name = name;\n }\n\n /**\n * Execute grounding to populate the shared context.\n * Groundings mutate ctx to add their collected data (tables, views, indexes, etc).\n * Fragment generation happens centrally in Adapter after all groundings complete.\n *\n * @param ctx - Shared context for accumulating schema data\n */\n abstract execute(ctx: GroundingContext): Promise<void>;\n}\n\nclass SampleDataGrounding {\n // this will fetch sample data for tables matching the filter\n}\n\nclass FunctionGrounding {\n #filter: Filter;\n #adapter: Adapter;\n constructor(adapter: Adapter, filter: Filter) {\n this.#filter = filter;\n this.#adapter = adapter;\n }\n}\n", "import type { TableConstraint } from '../adapter.ts';\nimport { AbstractGrounding } from './abstract.grounding.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('constraint');\n }\n\n /**\n * Fetch constraints for a specific table.\n */\n protected abstract getConstraints(\n tableName: string,\n ): Promise<TableConstraint[]>;\n\n /**\n * Execute the grounding process.\n * Annotates tables in ctx.tables with their constraints.\n */\n async execute(ctx: GroundingContext): Promise<void> {\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 }\n}\n", "import type { TableIndex } from '../adapter.ts';\nimport { AbstractGrounding } from './abstract.grounding.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('index');\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): Promise<void> {\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 }\n}\n", "import type { AdapterInfo } from '../adapter.ts';\nimport { AbstractGrounding } from './abstract.grounding.ts';\nimport type { GroundingContext } from './context.ts';\n\n/**\n * Configuration for InfoGrounding.\n */\nexport interface InfoGroundingConfig {\n // Future: options to control what info to collect\n}\n\n/**\n * Abstract base class for database info grounding.\n *\n * Collects database dialect, version, and connection info.\n *\n * Subclasses implement the database-specific hook:\n * - `collectInfo()` - collect database info\n */\nexport abstract class InfoGrounding extends AbstractGrounding {\n constructor(config: InfoGroundingConfig = {}) {\n super('dialectInfo');\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): Promise<void> {\n ctx.info = await this.collectInfo();\n }\n}\n", "import { groq } from '@ai-sdk/groq';\nimport { tool } from 'ai';\nimport dedent from 'dedent';\nimport z from 'zod';\n\nimport { type AgentModel } from '@deepagents/agent';\nimport {\n ContextEngine,\n InMemoryContextStore,\n agent,\n fragment,\n persona,\n user,\n} from '@deepagents/context';\n\nimport type { Adapter } from '../adapter.ts';\nimport { AbstractGrounding } from './abstract.grounding.ts';\nimport type { GroundingContext } from './context.ts';\n\n/**\n * Cache interface for storing generated reports.\n */\nexport interface ReportCache {\n get(): Promise<string | null>;\n set(value: string): Promise<void>;\n}\n\n/**\n * Configuration for ReportGrounding.\n */\nexport interface ReportGroundingConfig {\n /** LLM model to use for generating the report */\n model?: AgentModel;\n /** Optional cache for storing generated reports */\n cache?: ReportCache;\n /** Force regeneration even if cached */\n forceRefresh?: boolean;\n}\n\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<void> {\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;\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\n async #generateReport(): Promise<string> {\n const context = new ContextEngine({\n store: new InMemoryContextStore(),\n chatId: `report-gen-${crypto.randomUUID()}`,\n userId: 'system',\n });\n\n context.set(\n persona({\n name: 'db-report-agent',\n role: 'Database analyst',\n objective:\n 'Analyze the database and write a contextual report about what it represents',\n }),\n fragment(\n 'instructions',\n dedent`\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 `,\n ),\n user(\n 'Please analyze the database and write a contextual report about what this database represents.',\n ),\n );\n\n const adapter = this.#adapter;\n\n const reportAgent = agent({\n name: 'db-report-agent',\n model: this.#model,\n context,\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 }) => {\n return adapter.execute(sql);\n },\n }),\n },\n });\n\n const result = await reportAgent.generate({});\n return result.text;\n }\n}\n", "import type { Table } from '../adapter.ts';\nimport { AbstractGrounding } from './abstract.grounding.ts';\nimport type { GroundingContext } from './context.ts';\n\n/**\n * Configuration for RowCountGrounding.\n */\nexport interface RowCountGroundingConfig {\n // Future: filter which tables to count\n}\n\n/**\n * Abstract base class for row count grounding.\n *\n * Reads tables from the context and annotates them with row counts and size hints.\n * This grounding must run AFTER TableGrounding since it reads from ctx.tables.\n *\n * Subclasses implement the database-specific hook:\n * - `getRowCount()` - get row count for a table\n */\nexport abstract class RowCountGrounding extends AbstractGrounding {\n constructor(config: RowCountGroundingConfig = {}) {\n super('rowCount');\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): Promise<void> {\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 }\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 type { Filter, Relationship, Table } from '../adapter.ts';\nimport { AbstractGrounding } from './abstract.grounding.ts';\nimport type { GroundingContext } from './context.ts';\n\n/**\n * Configuration for TableGrounding.\n */\nexport interface TableGroundingConfig {\n /** Filter to select seed tables */\n filter?: Filter;\n /**\n * Traverse forward (child\u2192parent) 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\u2192child) 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('table');\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): Promise<void> {\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;\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 }\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", "import {\n Adapter,\n type ExecuteFunction,\n type GroundingFn,\n type ValidateFunction,\n} from '../adapter.ts';\n\nexport type BigQueryAdapterOptions = {\n execute: ExecuteFunction;\n /**\n * SQL validation is required for BigQuery.\n * Recommended implementation: BigQuery dry-run.\n */\n validate: ValidateFunction;\n grounding: GroundingFn[];\n /**\n * Datasets to introspect (scopes all metadata discovery).\n */\n datasets: string[];\n /**\n * Optional projectId used to qualify INFORMATION_SCHEMA references.\n * If omitted, the provided `execute()` implementation must supply a default project context.\n */\n projectId?: string;\n};\n\ntype BigQueryError = {\n message?: string;\n reason?: string;\n code?: number | string;\n};\n\nfunction formatBigQueryError(sql: string, error: unknown) {\n const errorMessage =\n error instanceof Error\n ? error.message\n : typeof error === 'string'\n ? error\n : typeof error === 'object' && error !== null\n ? ((error as BigQueryError).message ?? JSON.stringify(error))\n : 'Unknown error occurred';\n\n return {\n error: errorMessage,\n error_type: 'BIGQUERY_ERROR',\n suggestion:\n 'Validate the query (dry-run) and review table/dataset names, nested field paths, and parameter bindings.',\n sql_attempted: sql,\n };\n}\n\nexport class BigQuery extends Adapter {\n #options: BigQueryAdapterOptions;\n #datasetSet: Set<string>;\n\n override readonly grounding: GroundingFn[];\n override readonly defaultSchema: string | undefined;\n override readonly systemSchemas: string[] = [];\n override readonly formatterLanguage = 'bigquery';\n\n constructor(options: BigQueryAdapterOptions) {\n super();\n\n if (!options || typeof options.execute !== 'function') {\n throw new Error('BigQuery adapter requires an execute(sql) function.');\n }\n if (typeof options.validate !== 'function') {\n throw new Error(\n 'BigQuery adapter requires a validate(sql) function. Provide a BigQuery dry-run validator (recommended) so generated SQL can be validated before execution.',\n );\n }\n\n const datasets = (options.datasets ?? [])\n .map((d) => d.trim())\n .filter(Boolean);\n if (datasets.length === 0) {\n throw new Error(\n \"BigQuery adapter requires a non-empty datasets list (e.g. datasets: ['analytics']). This scopes all introspection.\",\n );\n }\n\n this.#options = { ...options, datasets };\n this.#datasetSet = new Set(datasets);\n this.grounding = options.grounding;\n this.defaultSchema = datasets.length === 1 ? datasets[0] : undefined;\n }\n\n get datasets(): readonly string[] {\n return this.#options.datasets;\n }\n\n get projectId(): string | undefined {\n return this.#options.projectId;\n }\n\n isDatasetAllowed(dataset: string): boolean {\n return this.#datasetSet.has(dataset);\n }\n\n /**\n * Build a fully-qualified BigQuery INFORMATION_SCHEMA view reference.\n * Uses standard BigQuery backtick quoting on the full path.\n */\n infoSchemaView(dataset: string, viewName: string): string {\n const projectPrefix = this.projectId ? `${this.projectId}.` : '';\n return `\\`${projectPrefix}${dataset}.INFORMATION_SCHEMA.${viewName}\\``;\n }\n\n override async execute(sql: string) {\n return this.#options.execute(sql);\n }\n\n override async validate(sql: string) {\n try {\n return await this.#options.validate(sql);\n } catch (error) {\n return JSON.stringify(formatBigQueryError(sql, error));\n }\n }\n\n override async runQuery<Row>(sql: string): Promise<Row[]> {\n const result = await this.#options.execute(sql);\n\n if (Array.isArray(result)) {\n return result as Row[];\n }\n\n if (\n result &&\n typeof result === 'object' &&\n 'rows' in result &&\n Array.isArray((result as { rows?: unknown }).rows)\n ) {\n return (result as { rows: Row[] }).rows;\n }\n\n throw new Error(\n 'BigQuery adapter execute() must return an array of rows or an object with a rows array when introspecting.',\n );\n }\n\n override quoteIdentifier(name: string): string {\n // BigQuery uses backticks. Quote each segment so dotted paths work for both\n // dataset.table qualification and nested field paths (e.g. user.address.city).\n return name\n .split('.')\n .map((part) => `\\`${part.replace(/`/g, '``')}\\``)\n .join('.');\n }\n\n override escape(value: string): string {\n return value.replace(/`/g, '``');\n }\n\n override buildSampleRowsQuery(\n tableName: string,\n columns: string[] | undefined,\n limit: number,\n ): string {\n const qualifiedTableName = this.#qualifyTableName(tableName);\n const tableIdentifier = this.quoteIdentifier(qualifiedTableName);\n const columnList = columns?.length\n ? columns\n .map((c) => (c === '*' ? '*' : this.quoteIdentifier(c)))\n .join(', ')\n : '*';\n\n return `SELECT ${columnList} FROM ${tableIdentifier} LIMIT ${limit}`;\n }\n\n #qualifyTableName(tableName: string): string {\n if (!this.projectId) {\n return tableName;\n }\n // If already qualified as project.dataset.table, keep as-is.\n if (tableName.split('.').length >= 3) {\n return tableName;\n }\n return `${this.projectId}.${tableName}`;\n }\n}\n", "import type { TableConstraint } from '../adapter.ts';\nimport {\n ConstraintGrounding,\n type ConstraintGroundingConfig,\n} from '../groundings/constraint.grounding.ts';\nimport type { BigQuery } from './bigquery.ts';\n\ntype ColumnMetadataRow = {\n column_name: string | null;\n is_nullable: string | null;\n column_default: string | null;\n};\n\ntype KeyColumnUsageRow = {\n constraint_name: string | null;\n constraint_type: string | null;\n column_name: string | null;\n ordinal_position: number | null;\n position_in_unique_constraint: number | null;\n};\n\ntype ReferencedTableRow = {\n table_schema: string | null;\n table_name: string | null;\n};\n\ntype PrimaryKeyConstraintRow = {\n constraint_name: string | null;\n};\n\ntype PrimaryKeyColumnRow = {\n column_name: string | null;\n ordinal_position: number | null;\n};\n\nexport interface BigQueryConstraintGroundingConfig extends ConstraintGroundingConfig {}\n\nexport class BigQueryConstraintGrounding extends ConstraintGrounding {\n #adapter: BigQuery;\n\n constructor(\n adapter: BigQuery,\n config: BigQueryConstraintGroundingConfig = {},\n ) {\n super(config);\n this.#adapter = adapter;\n }\n\n protected override async getConstraints(\n tableName: string,\n ): Promise<TableConstraint[]> {\n const { schema: dataset, table } = this.#adapter.parseTableName(tableName);\n\n const constraints: TableConstraint[] = [];\n\n // NOT NULL / DEFAULT (best effort from column metadata)\n const columnRows = await this.#adapter.runQuery<ColumnMetadataRow>(`\n SELECT column_name, is_nullable, column_default\n FROM ${this.#adapter.infoSchemaView(dataset, 'COLUMNS')}\n WHERE table_name = '${this.#adapter.escapeString(table)}'\n ORDER BY ordinal_position\n `);\n\n for (const row of columnRows) {\n const col = row.column_name;\n if (!col) continue;\n\n if ((row.is_nullable ?? '').toUpperCase() === 'NO') {\n constraints.push({\n name: `${tableName}.${col}.NOT_NULL`,\n type: 'NOT_NULL',\n columns: [col],\n });\n }\n\n if (row.column_default != null && row.column_default !== '') {\n constraints.push({\n name: `${tableName}.${col}.DEFAULT`,\n type: 'DEFAULT',\n columns: [col],\n defaultValue: row.column_default,\n });\n }\n }\n\n // PRIMARY KEY / FOREIGN KEY constraints\n const keyRows = await this.#adapter.runQuery<KeyColumnUsageRow>(`\n SELECT\n tc.constraint_name,\n tc.constraint_type,\n kcu.column_name,\n kcu.ordinal_position,\n kcu.position_in_unique_constraint\n FROM ${this.#adapter.infoSchemaView(dataset, 'TABLE_CONSTRAINTS')} AS tc\n JOIN ${this.#adapter.infoSchemaView(dataset, 'KEY_COLUMN_USAGE')} AS kcu\n ON tc.constraint_name = kcu.constraint_name\n AND tc.constraint_schema = kcu.constraint_schema\n WHERE tc.table_name = '${this.#adapter.escapeString(table)}'\n AND tc.constraint_type IN ('PRIMARY KEY', 'FOREIGN KEY')\n ORDER BY tc.constraint_name, kcu.ordinal_position\n `);\n\n const pkByName = new Map<string, string[]>();\n const fkByName = new Map<\n string,\n Array<{\n column: string;\n ordinal: number;\n pkOrdinal: number | null;\n }>\n >();\n\n for (const row of keyRows) {\n if (!row.constraint_name || !row.column_name) continue;\n const type = (row.constraint_type ?? '').toUpperCase();\n\n if (type === 'PRIMARY KEY') {\n const cols = pkByName.get(row.constraint_name) ?? [];\n cols.push(row.column_name);\n pkByName.set(row.constraint_name, cols);\n continue;\n }\n\n if (type === 'FOREIGN KEY') {\n const cols = fkByName.get(row.constraint_name) ?? [];\n cols.push({\n column: row.column_name,\n ordinal: row.ordinal_position ?? 0,\n pkOrdinal: row.position_in_unique_constraint,\n });\n fkByName.set(row.constraint_name, cols);\n }\n }\n\n for (const [name, cols] of pkByName.entries()) {\n constraints.push({\n name,\n type: 'PRIMARY_KEY',\n columns: cols,\n });\n }\n\n for (const [constraintName, cols] of fkByName.entries()) {\n const fk = await this.#buildForeignKeyConstraint({\n constraintDataset: dataset,\n constraintName,\n childTableName: `${dataset}.${table}`,\n childColumns: cols,\n });\n if (fk) constraints.push(fk);\n }\n\n return constraints;\n }\n\n async #buildForeignKeyConstraint(args: {\n constraintDataset: string;\n constraintName: string;\n childTableName: string;\n childColumns: Array<{\n column: string;\n ordinal: number;\n pkOrdinal: number | null;\n }>;\n }): Promise<TableConstraint | undefined> {\n const refRows = await this.#adapter.runQuery<ReferencedTableRow>(`\n SELECT DISTINCT table_schema, table_name\n FROM ${this.#adapter.infoSchemaView(args.constraintDataset, 'CONSTRAINT_COLUMN_USAGE')}\n WHERE constraint_name = '${this.#adapter.escapeString(args.constraintName)}'\n `);\n\n const referenced = refRows.find((r) => r.table_schema && r.table_name);\n if (!referenced?.table_schema || !referenced.table_name) {\n return undefined;\n }\n\n const referencedDataset = referenced.table_schema;\n const referencedTable = referenced.table_name;\n\n // Dataset scoping: never surface FK references outside configured datasets.\n if (!this.#adapter.isDatasetAllowed(referencedDataset)) {\n return undefined;\n }\n\n const pkConstraintRows = await this.#adapter\n .runQuery<PrimaryKeyConstraintRow>(`\n SELECT constraint_name\n FROM ${this.#adapter.infoSchemaView(referencedDataset, 'TABLE_CONSTRAINTS')}\n WHERE constraint_type = 'PRIMARY KEY'\n AND table_name = '${this.#adapter.escapeString(referencedTable)}'\n LIMIT 1\n `);\n\n const pkConstraintName = pkConstraintRows[0]?.constraint_name;\n if (!pkConstraintName) return undefined;\n\n const pkColumns = await this.#adapter.runQuery<PrimaryKeyColumnRow>(`\n SELECT column_name, ordinal_position\n FROM ${this.#adapter.infoSchemaView(referencedDataset, 'KEY_COLUMN_USAGE')}\n WHERE constraint_name = '${this.#adapter.escapeString(pkConstraintName)}'\n AND table_name = '${this.#adapter.escapeString(referencedTable)}'\n ORDER BY ordinal_position\n `);\n\n const pkByOrdinal = new Map<number, string>();\n for (const row of pkColumns) {\n if (!row.column_name || row.ordinal_position == null) continue;\n pkByOrdinal.set(row.ordinal_position, row.column_name);\n }\n\n const orderedChild = [...args.childColumns].sort(\n (a, b) => a.ordinal - b.ordinal,\n );\n\n const columns = orderedChild.map((c) => c.column);\n const referencedColumns = orderedChild.map((c) => {\n const pkOrdinal = c.pkOrdinal ?? c.ordinal;\n return pkByOrdinal.get(pkOrdinal) ?? 'unknown';\n });\n\n return {\n name: args.constraintName,\n type: 'FOREIGN_KEY',\n columns,\n referencedTable: `${referencedDataset}.${referencedTable}`,\n referencedColumns,\n };\n }\n}\n", "import type { Adapter, TableIndex } from '../adapter.ts';\nimport {\n IndexesGrounding,\n type IndexesGroundingConfig,\n} from '../groundings/indexes.grounding.ts';\nimport type { BigQuery } from './bigquery.ts';\n\ntype IndexHintRow = {\n column_name: string | null;\n is_partitioning_column: string | null;\n clustering_ordinal_position: number | null;\n};\n\nexport interface BigQueryIndexesGroundingConfig extends IndexesGroundingConfig {}\n\n/**\n * BigQuery doesn't have traditional indexes; we map partitioning and clustering\n * metadata into index-like hints to guide query planning.\n */\nexport class BigQueryIndexesGrounding extends IndexesGrounding {\n #adapter: BigQuery;\n\n constructor(adapter: Adapter, config: BigQueryIndexesGroundingConfig = {}) {\n super(config);\n this.#adapter = adapter as BigQuery;\n }\n\n protected override async getIndexes(\n tableName: string,\n ): Promise<TableIndex[]> {\n const { schema: dataset, table } = this.#adapter.parseTableName(tableName);\n\n const rows = await this.#adapter.runQuery<IndexHintRow>(`\n SELECT column_name, is_partitioning_column, clustering_ordinal_position\n FROM ${this.#adapter.infoSchemaView(dataset, 'COLUMNS')}\n WHERE table_name = '${this.#adapter.escapeString(table)}'\n AND (is_partitioning_column = 'YES' OR clustering_ordinal_position IS NOT NULL)\n ORDER BY clustering_ordinal_position\n `);\n\n const partitionColumns: string[] = [];\n const clusteringColumns: Array<{ name: string; pos: number }> = [];\n\n for (const row of rows) {\n if (!row.column_name) continue;\n\n if ((row.is_partitioning_column ?? '').toUpperCase() === 'YES') {\n partitionColumns.push(row.column_name);\n }\n\n if (row.clustering_ordinal_position != null) {\n clusteringColumns.push({\n name: row.column_name,\n pos: row.clustering_ordinal_position,\n });\n }\n }\n\n const indexes: TableIndex[] = [];\n\n if (partitionColumns.length > 0) {\n indexes.push({\n name: `${table}_partition`,\n columns: partitionColumns,\n type: 'PARTITION',\n });\n }\n\n if (clusteringColumns.length > 0) {\n clusteringColumns.sort((a, b) => a.pos - b.pos);\n indexes.push({\n name: `${table}_clustering`,\n columns: clusteringColumns.map((c) => c.name),\n type: 'CLUSTERING',\n });\n }\n\n return indexes;\n }\n}\n", "import type { AdapterInfo } from '../adapter.ts';\nimport { InfoGrounding } from '../groundings/info.grounding.ts';\nimport type { BigQuery } from './bigquery.ts';\n\nexport class BigQueryInfoGrounding extends InfoGrounding {\n #adapter: BigQuery;\n\n constructor(adapter: BigQuery) {\n super();\n this.#adapter = adapter;\n }\n\n protected override async collectInfo(): Promise<AdapterInfo> {\n return {\n dialect: 'bigquery',\n database: this.#adapter.projectId,\n details: {\n identifierQuote: '`',\n identifiers: {\n qualifiedTable: 'dataset.table',\n nestedFieldPath: 'col.path.to.field',\n },\n parameters: {\n positional: '?',\n named: '@name',\n },\n },\n };\n }\n}\n", "import type { Adapter } from '../adapter.ts';\nimport {\n RowCountGrounding,\n type RowCountGroundingConfig,\n} from '../groundings/row-count.grounding.ts';\nimport type { BigQuery } from './bigquery.ts';\n\ntype RowCountRow = {\n total_rows: number | string | null;\n};\n\nexport interface BigQueryRowCountGroundingConfig extends RowCountGroundingConfig {}\n\n/**\n * BigQuery row counts are metadata-only.\n * Uses INFORMATION_SCHEMA.TABLE_STORAGE and never issues COUNT(*).\n */\nexport class BigQueryRowCountGrounding extends RowCountGrounding {\n #adapter: BigQuery;\n\n constructor(adapter: Adapter, config: BigQueryRowCountGroundingConfig = {}) {\n super(config);\n this.#adapter = adapter as BigQuery;\n }\n\n protected override async getRowCount(\n tableName: string,\n ): Promise<number | undefined> {\n const { schema: dataset, table } = this.#adapter.parseTableName(tableName);\n\n const rows = await this.#adapter.runQuery<RowCountRow>(`\n SELECT total_rows\n FROM ${this.#adapter.infoSchemaView(dataset, 'TABLE_STORAGE')}\n WHERE table_name = '${this.#adapter.escapeString(table)}'\n LIMIT 1\n `);\n\n const value = rows[0]?.total_rows;\n return this.#adapter.toNumber(value);\n }\n}\n", "import type { Relationship, Table } from '../adapter.ts';\nimport {\n TableGrounding,\n type TableGroundingConfig,\n} from '../groundings/table.grounding.ts';\nimport type { BigQuery } from './bigquery.ts';\n\ntype TableNameRow = {\n table_name: string | null;\n};\n\ntype ColumnFieldPathRow = {\n field_path: string | null;\n data_type: string | null;\n ordinal_position: number | null;\n};\n\ntype ForeignKeyKeyColumnRow = {\n constraint_name: string | null;\n column_name: string | null;\n ordinal_position: number | null;\n position_in_unique_constraint: number | null;\n};\n\ntype ReferencedTableRow = {\n table_schema: string | null;\n table_name: string | null;\n};\n\ntype PrimaryKeyConstraintRow = {\n constraint_name: string | null;\n};\n\ntype PrimaryKeyColumnRow = {\n column_name: string | null;\n ordinal_position: number | null;\n};\n\nexport interface BigQueryTableGroundingConfig extends TableGroundingConfig {}\n\nexport class BigQueryTableGrounding extends TableGrounding {\n #adapter: BigQuery;\n\n constructor(adapter: BigQuery, config: BigQueryTableGroundingConfig = {}) {\n super(config);\n this.#adapter = adapter;\n }\n\n protected override async applyFilter(): Promise<string[]> {\n const names = await super.applyFilter();\n return names.filter((name) => this.#isTableInScope(name));\n }\n\n protected override async getAllTableNames(): Promise<string[]> {\n const names: string[] = [];\n\n for (const dataset of this.#adapter.datasets) {\n const rows = await this.#adapter.runQuery<TableNameRow>(`\n SELECT table_name\n FROM ${this.#adapter.infoSchemaView(dataset, 'TABLES')}\n WHERE table_type = 'BASE TABLE'\n ORDER BY table_name\n `);\n\n for (const row of rows) {\n if (!row.table_name) continue;\n names.push(`${dataset}.${row.table_name}`);\n }\n }\n\n return names;\n }\n\n protected override async getTable(tableName: string): Promise<Table> {\n const { schema: dataset, table } = this.#adapter.parseTableName(tableName);\n\n const rows = await this.#adapter.runQuery<ColumnFieldPathRow>(`\n SELECT\n f.field_path,\n f.data_type,\n c.ordinal_position\n FROM ${this.#adapter.infoSchemaView(dataset, 'COLUMN_FIELD_PATHS')} AS f\n JOIN ${this.#adapter.infoSchemaView(dataset, 'COLUMNS')} AS c\n ON f.table_name = c.table_name\n AND f.column_name = c.column_name\n WHERE f.table_name = '${this.#adapter.escapeString(table)}'\n ORDER BY c.ordinal_position, f.field_path\n `);\n\n const seen = new Set<string>();\n const columns = rows\n .map((r) => ({\n name: r.field_path ?? 'unknown',\n type: r.data_type ?? 'unknown',\n ordinal: r.ordinal_position ?? 0,\n }))\n .filter((c) => {\n if (!c.name) return false;\n if (seen.has(c.name)) return false;\n seen.add(c.name);\n return true;\n })\n .map((c) => ({ name: c.name, type: c.type }));\n\n return {\n name: `${dataset}.${table}`,\n schema: dataset,\n rawName: table,\n columns,\n };\n }\n\n protected override async findOutgoingRelations(\n tableName: string,\n ): Promise<Relationship[]> {\n const { schema: dataset, table } = this.#adapter.parseTableName(tableName);\n\n const rows = await this.#adapter.runQuery<ForeignKeyKeyColumnRow>(`\n SELECT\n kcu.constraint_name,\n kcu.column_name,\n kcu.ordinal_position,\n kcu.position_in_unique_constraint\n FROM ${this.#adapter.infoSchemaView(dataset, 'TABLE_CONSTRAINTS')} AS tc\n JOIN ${this.#adapter.infoSchemaView(dataset, 'KEY_COLUMN_USAGE')} AS kcu\n ON tc.constraint_name = kcu.constraint_name\n AND tc.constraint_schema = kcu.constraint_schema\n WHERE tc.constraint_type = 'FOREIGN KEY'\n AND tc.table_name = '${this.#adapter.escapeString(table)}'\n ORDER BY kcu.constraint_name, kcu.ordinal_position\n `);\n\n const byConstraint = new Map<\n string,\n Array<{\n column: string;\n ordinal: number;\n pkOrdinal: number | null;\n }>\n >();\n\n for (const row of rows) {\n if (!row.constraint_name || !row.column_name) continue;\n const list = byConstraint.get(row.constraint_name) ?? [];\n list.push({\n column: row.column_name,\n ordinal: row.ordinal_position ?? 0,\n pkOrdinal: row.position_in_unique_constraint,\n });\n byConstraint.set(row.constraint_name, list);\n }\n\n const rels: Relationship[] = [];\n for (const [constraintName, columns] of byConstraint.entries()) {\n const rel = await this.#buildForeignKeyRelationship({\n constraintDataset: dataset,\n childDataset: dataset,\n childTable: table,\n constraintName,\n childColumns: columns,\n });\n if (rel) rels.push(rel);\n }\n\n return rels;\n }\n\n protected override async findIncomingRelations(\n tableName: string,\n ): Promise<Relationship[]> {\n const { schema: referencedDataset, table: referencedTable } =\n this.#adapter.parseTableName(tableName);\n\n const rels: Relationship[] = [];\n\n for (const constraintDataset of this.#adapter.datasets) {\n const rows = await this.#adapter.runQuery<{\n constraint_name: string | null;\n }>(`\n SELECT DISTINCT constraint_name\n FROM ${this.#adapter.infoSchemaView(constraintDataset, 'CONSTRAINT_COLUMN_USAGE')}\n WHERE table_schema = '${this.#adapter.escapeString(referencedDataset)}'\n AND table_name = '${this.#adapter.escapeString(referencedTable)}'\n `);\n\n for (const row of rows) {\n if (!row.constraint_name) continue;\n const rel = await this.#buildForeignKeyRelationshipFromConstraintName(\n constraintDataset,\n row.constraint_name,\n );\n if (\n rel &&\n rel.referenced_table === `${referencedDataset}.${referencedTable}`\n ) {\n rels.push(rel);\n }\n }\n }\n\n return rels;\n }\n\n #isTableInScope(tableName: string): boolean {\n const { schema } = this.#adapter.parseTableName(tableName);\n return this.#adapter.isDatasetAllowed(schema);\n }\n\n async #buildForeignKeyRelationshipFromConstraintName(\n constraintDataset: string,\n constraintName: string,\n ): Promise<Relationship | undefined> {\n const keyRows = await this.#adapter.runQuery<\n ForeignKeyKeyColumnRow & { child_table_name: string | null }\n >(`\n SELECT\n kcu.constraint_name,\n tc.table_name AS child_table_name,\n kcu.column_name,\n kcu.ordinal_position,\n kcu.position_in_unique_constraint\n FROM ${this.#adapter.infoSchemaView(constraintDataset, 'TABLE_CONSTRAINTS')} AS tc\n JOIN ${this.#adapter.infoSchemaView(constraintDataset, 'KEY_COLUMN_USAGE')} AS kcu\n ON tc.constraint_name = kcu.constraint_name\n AND tc.constraint_schema = kcu.constraint_schema\n WHERE tc.constraint_type = 'FOREIGN KEY'\n AND tc.constraint_name = '${this.#adapter.escapeString(constraintName)}'\n ORDER BY kcu.ordinal_position\n `);\n\n if (keyRows.length === 0) return undefined;\n const childTable = keyRows[0]?.child_table_name;\n if (!childTable) return undefined;\n\n const childColumns = keyRows\n .filter((r) => r.column_name)\n .map((r) => ({\n column: r.column_name ?? 'unknown',\n ordinal: r.ordinal_position ?? 0,\n pkOrdinal: r.position_in_unique_constraint,\n }));\n\n return this.#buildForeignKeyRelationship({\n constraintDataset,\n childDataset: constraintDataset,\n childTable,\n constraintName,\n childColumns,\n });\n }\n\n async #buildForeignKeyRelationship(args: {\n constraintDataset: string;\n childDataset: string;\n childTable: string;\n constraintName: string;\n childColumns: Array<{\n column: string;\n ordinal: number;\n pkOrdinal: number | null;\n }>;\n }): Promise<Relationship | undefined> {\n const refTableRows = await this.#adapter.runQuery<ReferencedTableRow>(`\n SELECT DISTINCT table_schema, table_name\n FROM ${this.#adapter.infoSchemaView(args.constraintDataset, 'CONSTRAINT_COLUMN_USAGE')}\n WHERE constraint_name = '${this.#adapter.escapeString(args.constraintName)}'\n `);\n\n const referenced = refTableRows.find((r) => r.table_schema && r.table_name);\n if (!referenced?.table_schema || !referenced.table_name) {\n return undefined;\n }\n\n const referencedDataset = referenced.table_schema;\n const referencedTable = referenced.table_name;\n\n // Dataset scoping: never traverse relationships outside configured datasets.\n if (!this.#adapter.isDatasetAllowed(referencedDataset)) {\n return undefined;\n }\n\n const pkConstraintRows = await this.#adapter\n .runQuery<PrimaryKeyConstraintRow>(`\n SELECT constraint_name\n FROM ${this.#adapter.infoSchemaView(referencedDataset, 'TABLE_CONSTRAINTS')}\n WHERE constraint_type = 'PRIMARY KEY'\n AND table_name = '${this.#adapter.escapeString(referencedTable)}'\n LIMIT 1\n `);\n\n const pkConstraintName = pkConstraintRows[0]?.constraint_name;\n if (!pkConstraintName) {\n return undefined;\n }\n\n const pkColumnRows = await this.#adapter.runQuery<PrimaryKeyColumnRow>(`\n SELECT column_name, ordinal_position\n FROM ${this.#adapter.infoSchemaView(referencedDataset, 'KEY_COLUMN_USAGE')}\n WHERE constraint_name = '${this.#adapter.escapeString(pkConstraintName)}'\n AND table_name = '${this.#adapter.escapeString(referencedTable)}'\n ORDER BY ordinal_position\n `);\n\n const pkByOrdinal = new Map<number, string>();\n for (const row of pkColumnRows) {\n if (!row.column_name || row.ordinal_position == null) continue;\n pkByOrdinal.set(row.ordinal_position, row.column_name);\n }\n\n const orderedChild = [...args.childColumns].sort(\n (a, b) => a.ordinal - b.ordinal,\n );\n const from = orderedChild.map((c) => c.column);\n const to = orderedChild.map((c) => {\n const pkOrdinal = c.pkOrdinal ?? c.ordinal;\n return pkByOrdinal.get(pkOrdinal) ?? 'unknown';\n });\n\n return {\n table: `${args.childDataset}.${args.childTable}`,\n from,\n referenced_table: `${referencedDataset}.${referencedTable}`,\n to,\n };\n }\n}\n", "import type { ColumnStats, Filter } from '../adapter.ts';\nimport { AbstractGrounding } from './abstract.grounding.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('view');\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): Promise<void> {\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 }\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';\nimport type { BigQuery } from './bigquery.ts';\n\ntype ViewNameRow = {\n table_name: string | null;\n};\n\ntype ViewDefinitionRow = {\n ddl: string | null;\n};\n\ntype ColumnRow = {\n column_name: string | null;\n data_type: string | null;\n};\n\nexport interface BigQueryViewGroundingConfig extends ViewGroundingConfig {}\n\nexport class BigQueryViewGrounding extends ViewGrounding {\n #adapter: BigQuery;\n\n constructor(adapter: Adapter, config: BigQueryViewGroundingConfig = {}) {\n super(config);\n this.#adapter = adapter as BigQuery;\n }\n\n protected override async applyFilter(): Promise<string[]> {\n const names = await super.applyFilter();\n return names.filter((name) => this.#isViewInScope(name));\n }\n\n protected override async getAllViewNames(): Promise<string[]> {\n const names: string[] = [];\n\n for (const dataset of this.#adapter.datasets) {\n const rows = await this.#adapter.runQuery<ViewNameRow>(`\n SELECT table_name\n FROM ${this.#adapter.infoSchemaView(dataset, 'TABLES')}\n WHERE table_type IN ('VIEW', 'MATERIALIZED VIEW')\n ORDER BY table_name\n `);\n\n for (const row of rows) {\n if (!row.table_name) continue;\n names.push(`${dataset}.${row.table_name}`);\n }\n }\n\n return names;\n }\n\n protected override async getView(viewName: string): Promise<View> {\n const { schema: dataset, table } = this.#adapter.parseTableName(viewName);\n\n const defRows = await this.#adapter.runQuery<ViewDefinitionRow>(`\n SELECT ddl\n FROM ${this.#adapter.infoSchemaView(dataset, 'TABLES')}\n WHERE table_name = '${this.#adapter.escapeString(table)}'\n AND table_type IN ('VIEW', 'MATERIALIZED VIEW')\n LIMIT 1\n `);\n\n const columns = await this.#adapter.runQuery<ColumnRow>(`\n SELECT column_name, data_type\n FROM ${this.#adapter.infoSchemaView(dataset, 'COLUMNS')}\n WHERE table_name = '${this.#adapter.escapeString(table)}'\n ORDER BY ordinal_position\n `);\n\n return {\n name: `${dataset}.${table}`,\n schema: dataset,\n rawName: table,\n definition: defRows[0]?.ddl ?? undefined,\n columns: columns.map((c) => ({\n name: c.column_name ?? 'unknown',\n type: c.data_type ?? 'unknown',\n })),\n };\n }\n\n #isViewInScope(viewName: string): boolean {\n const { schema } = this.#adapter.parseTableName(viewName);\n return this.#adapter.isDatasetAllowed(schema);\n }\n}\n", "import { type Adapter } from '../adapter.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 {\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 { BigQuery } from './bigquery.ts';\nimport { BigQueryConstraintGrounding } from './constraint.bigquery.grounding.ts';\nimport { BigQueryIndexesGrounding } from './indexes.bigquery.grounding.ts';\nimport { BigQueryInfoGrounding } from './info.bigquery.grounding.ts';\nimport { BigQueryRowCountGrounding } from './row-count.bigquery.grounding.ts';\nimport { BigQueryTableGrounding } from './table.bigquery.grounding.ts';\nimport { BigQueryViewGrounding } from './view.bigquery.grounding.ts';\n\nexport * from './bigquery.ts';\n\nexport function tables(config: TableGroundingConfig = {}) {\n return (adapter: Adapter) =>\n new BigQueryTableGrounding(adapter as unknown as BigQuery, config);\n}\n\nexport function info(config: InfoGroundingConfig = {}) {\n return (adapter: Adapter) => new BigQueryInfoGrounding(adapter as BigQuery);\n}\n\nexport function views(config: ViewGroundingConfig = {}) {\n return (adapter: Adapter) => new BigQueryViewGrounding(adapter, config);\n}\n\nexport function indexes(config: IndexesGroundingConfig = {}) {\n return (adapter: Adapter) => new BigQueryIndexesGrounding(adapter, config);\n}\n\nexport function rowCount(config: RowCountGroundingConfig = {}) {\n return (adapter: Adapter) => new BigQueryRowCountGrounding(adapter, config);\n}\n\nexport function constraints(config: ConstraintGroundingConfig = {}) {\n return (adapter: Adapter) =>\n new BigQueryConstraintGrounding(adapter as unknown as BigQuery, config);\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 indexes,\n rowCount,\n constraints,\n report,\n BigQuery,\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["c", "table", "table", "index", "column", "report", "table", "tables", "table", "constraints", "table", "indexes", "table", "table", "views", "table"]
|
|
7
7
|
}
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
// packages/text2sql/src/lib/adapters/adapter.ts
|
|
2
|
+
import { format as formatSql } from "sql-formatter";
|
|
3
|
+
|
|
1
4
|
// packages/text2sql/src/lib/fragments/schema.ts
|
|
2
5
|
function dialectInfo(input) {
|
|
3
6
|
return {
|
|
@@ -265,6 +268,13 @@ var Adapter = class {
|
|
|
265
268
|
cardinality
|
|
266
269
|
});
|
|
267
270
|
}
|
|
271
|
+
format(sql) {
|
|
272
|
+
try {
|
|
273
|
+
return formatSql(sql, { language: this.formatterLanguage });
|
|
274
|
+
} catch {
|
|
275
|
+
return sql;
|
|
276
|
+
}
|
|
277
|
+
}
|
|
268
278
|
/**
|
|
269
279
|
* Convert unknown database value to number.
|
|
270
280
|
* Handles number, bigint, and string types.
|
|
@@ -1241,6 +1251,7 @@ var Mysql = class extends Adapter {
|
|
|
1241
1251
|
#options;
|
|
1242
1252
|
grounding;
|
|
1243
1253
|
defaultSchema = void 0;
|
|
1254
|
+
formatterLanguage = "mysql";
|
|
1244
1255
|
systemSchemas = [
|
|
1245
1256
|
"mysql",
|
|
1246
1257
|
"information_schema",
|