@deepagents/text2sql 0.10.1 → 0.11.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.
Files changed (98) hide show
  1. package/README.md +32 -41
  2. package/dist/index.d.ts +1 -6
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +2338 -2395
  5. package/dist/index.js.map +4 -4
  6. package/dist/lib/adapters/adapter.d.ts +13 -1
  7. package/dist/lib/adapters/adapter.d.ts.map +1 -1
  8. package/dist/lib/adapters/groundings/abstract.grounding.d.ts +19 -3
  9. package/dist/lib/adapters/groundings/abstract.grounding.d.ts.map +1 -1
  10. package/dist/lib/adapters/groundings/column-stats.grounding.d.ts +1 -2
  11. package/dist/lib/adapters/groundings/column-stats.grounding.d.ts.map +1 -1
  12. package/dist/lib/adapters/groundings/column-values.grounding.d.ts +1 -2
  13. package/dist/lib/adapters/groundings/column-values.grounding.d.ts.map +1 -1
  14. package/dist/lib/adapters/groundings/constraint.grounding.d.ts +1 -1
  15. package/dist/lib/adapters/groundings/constraint.grounding.d.ts.map +1 -1
  16. package/dist/lib/adapters/groundings/index.js +15 -222
  17. package/dist/lib/adapters/groundings/index.js.map +3 -3
  18. package/dist/lib/adapters/groundings/indexes.grounding.d.ts +1 -1
  19. package/dist/lib/adapters/groundings/indexes.grounding.d.ts.map +1 -1
  20. package/dist/lib/adapters/groundings/info.grounding.d.ts +1 -1
  21. package/dist/lib/adapters/groundings/info.grounding.d.ts.map +1 -1
  22. package/dist/lib/adapters/groundings/report.grounding.d.ts +1 -1
  23. package/dist/lib/adapters/groundings/report.grounding.d.ts.map +1 -1
  24. package/dist/lib/adapters/groundings/row-count.grounding.d.ts +1 -1
  25. package/dist/lib/adapters/groundings/row-count.grounding.d.ts.map +1 -1
  26. package/dist/lib/adapters/groundings/table.grounding.d.ts +3 -3
  27. package/dist/lib/adapters/groundings/table.grounding.d.ts.map +1 -1
  28. package/dist/lib/adapters/groundings/view.grounding.d.ts +1 -1
  29. package/dist/lib/adapters/groundings/view.grounding.d.ts.map +1 -1
  30. package/dist/lib/adapters/mysql/index.js +343 -315
  31. package/dist/lib/adapters/mysql/index.js.map +4 -4
  32. package/dist/lib/adapters/postgres/index.js +385 -357
  33. package/dist/lib/adapters/postgres/index.js.map +4 -4
  34. package/dist/lib/adapters/spreadsheet/index.js +290 -223
  35. package/dist/lib/adapters/spreadsheet/index.js.map +4 -4
  36. package/dist/lib/adapters/sqlite/index.js +307 -279
  37. package/dist/lib/adapters/sqlite/index.js.map +4 -4
  38. package/dist/lib/adapters/sqlserver/index.js +383 -355
  39. package/dist/lib/adapters/sqlserver/index.js.map +4 -4
  40. package/dist/lib/agents/developer.agent.d.ts +33 -23
  41. package/dist/lib/agents/developer.agent.d.ts.map +1 -1
  42. package/dist/lib/agents/sql.agent.d.ts +4 -4
  43. package/dist/lib/agents/sql.agent.d.ts.map +1 -1
  44. package/dist/lib/agents/teachables.agent.d.ts +2 -2
  45. package/dist/lib/agents/teachables.agent.d.ts.map +1 -1
  46. package/dist/lib/agents/text2sql.agent.d.ts +18 -71
  47. package/dist/lib/agents/text2sql.agent.d.ts.map +1 -1
  48. package/dist/lib/fragments/schema.d.ts +214 -0
  49. package/dist/lib/fragments/schema.d.ts.map +1 -0
  50. package/dist/lib/instructions.d.ts +29 -2
  51. package/dist/lib/instructions.d.ts.map +1 -1
  52. package/dist/lib/instructions.js +336 -319
  53. package/dist/lib/instructions.js.map +4 -4
  54. package/dist/lib/sql.d.ts +13 -103
  55. package/dist/lib/sql.d.ts.map +1 -1
  56. package/dist/lib/synthesis/extractors/base-contextual-extractor.d.ts +2 -2
  57. package/dist/lib/synthesis/extractors/base-contextual-extractor.d.ts.map +1 -1
  58. package/dist/lib/synthesis/extractors/message-extractor.d.ts +1 -2
  59. package/dist/lib/synthesis/extractors/message-extractor.d.ts.map +1 -1
  60. package/dist/lib/synthesis/extractors/sql-extractor.d.ts.map +1 -1
  61. package/dist/lib/synthesis/index.js +1794 -572
  62. package/dist/lib/synthesis/index.js.map +4 -4
  63. package/dist/lib/synthesis/synthesizers/depth-evolver.d.ts.map +1 -1
  64. package/dist/lib/synthesis/synthesizers/persona-generator.d.ts +7 -17
  65. package/dist/lib/synthesis/synthesizers/persona-generator.d.ts.map +1 -1
  66. package/dist/lib/synthesis/synthesizers/schema-synthesizer.d.ts +2 -2
  67. package/dist/lib/synthesis/synthesizers/schema-synthesizer.d.ts.map +1 -1
  68. package/dist/lib/synthesis/synthesizers/teachings-generator.d.ts +8 -20
  69. package/dist/lib/synthesis/synthesizers/teachings-generator.d.ts.map +1 -1
  70. package/dist/lib/teach/teachings.d.ts +2 -2
  71. package/dist/lib/teach/teachings.d.ts.map +1 -1
  72. package/package.json +4 -3
  73. package/dist/lib/agents/chat1.agent.d.ts +0 -50
  74. package/dist/lib/agents/chat1.agent.d.ts.map +0 -1
  75. package/dist/lib/agents/chat2.agent.d.ts +0 -68
  76. package/dist/lib/agents/chat2.agent.d.ts.map +0 -1
  77. package/dist/lib/agents/chat3.agent.d.ts +0 -80
  78. package/dist/lib/agents/chat3.agent.d.ts.map +0 -1
  79. package/dist/lib/agents/chat4.agent.d.ts +0 -88
  80. package/dist/lib/agents/chat4.agent.d.ts.map +0 -1
  81. package/dist/lib/history/history.d.ts +0 -41
  82. package/dist/lib/history/history.d.ts.map +0 -1
  83. package/dist/lib/history/memory.history.d.ts +0 -5
  84. package/dist/lib/history/memory.history.d.ts.map +0 -1
  85. package/dist/lib/history/sqlite.history.d.ts +0 -15
  86. package/dist/lib/history/sqlite.history.d.ts.map +0 -1
  87. package/dist/lib/memory/memory.prompt.d.ts +0 -3
  88. package/dist/lib/memory/memory.prompt.d.ts.map +0 -1
  89. package/dist/lib/memory/memory.store.d.ts +0 -5
  90. package/dist/lib/memory/memory.store.d.ts.map +0 -1
  91. package/dist/lib/memory/sqlite.store.d.ts +0 -14
  92. package/dist/lib/memory/sqlite.store.d.ts.map +0 -1
  93. package/dist/lib/memory/store.d.ts +0 -40
  94. package/dist/lib/memory/store.d.ts.map +0 -1
  95. package/dist/lib/teach/teachables.d.ts +0 -648
  96. package/dist/lib/teach/teachables.d.ts.map +0 -1
  97. package/dist/lib/teach/xml.d.ts +0 -6
  98. package/dist/lib/teach/xml.d.ts.map +0 -1
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../../../src/lib/adapters/groundings/context.ts", "../../../../src/lib/adapters/adapter.ts", "../../../../src/lib/adapters/groundings/abstract.grounding.ts", "../../../../src/lib/adapters/groundings/column-stats.grounding.ts", "../../../../src/lib/adapters/groundings/column-values.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/mysql/column-stats.mysql.grounding.ts", "../../../../src/lib/adapters/mysql/column-values.mysql.grounding.ts", "../../../../src/lib/adapters/mysql/constraint.mysql.grounding.ts", "../../../../src/lib/adapters/mysql/indexes.mysql.grounding.ts", "../../../../src/lib/adapters/mysql/info.mysql.grounding.ts", "../../../../src/lib/adapters/mysql/mysql.ts", "../../../../src/lib/adapters/mysql/row-count.mysql.grounding.ts", "../../../../src/lib/adapters/mysql/table.mysql.grounding.ts", "../../../../src/lib/adapters/groundings/view.grounding.ts", "../../../../src/lib/adapters/mysql/view.mysql.grounding.ts", "../../../../src/lib/adapters/mysql/index.ts"],
4
- "sourcesContent": ["import type { AdapterInfo, ColumnStats, Relationship, Table } from '../adapter.ts';\nimport type { View } from './view.grounding.ts';\n\n/**\n * Column type for grounding operations.\n * Common interface between Table.columns and View.columns.\n */\nexport interface Column {\n name: string;\n type: string;\n kind?: 'LowCardinality' | 'Enum';\n values?: string[];\n stats?: ColumnStats;\n}\n\n/**\n * Entity with columns (Table or View).\n */\nexport interface ColumnContainer {\n name: string;\n columns: Column[];\n}\n\n/**\n * Shared context object passed to all groundings.\n * Groundings read from and write to this context.\n */\nexport interface GroundingContext {\n /** Tables discovered by TableGrounding */\n tables: Table[];\n\n /** Views discovered by ViewGrounding */\n views: View[];\n\n /** Relationships discovered by TableGrounding */\n relationships: Relationship[];\n\n /** Database info collected by InfoGrounding */\n info?: AdapterInfo;\n\n /** Business context report generated by ReportGrounding */\n report?: string;\n}\n\n/**\n * Create a new empty grounding context.\n */\nexport function createGroundingContext(): GroundingContext {\n return {\n tables: [],\n views: [],\n relationships: [],\n info: undefined,\n };\n}\n", "import type { AbstractGrounding } from './groundings/abstract.grounding.ts';\nimport { createGroundingContext } from './groundings/context.ts';\n\n/**\n * Filter type for view/table names.\n * - string[]: explicit list of view names\n * - RegExp: pattern to match view names\n * - function: predicate to filter view names\n */\nexport type Filter = string[] | RegExp | ((viewName: string) => boolean);\n\nexport interface Table {\n name: string;\n schema?: string;\n rawName?: string;\n columns: {\n name: string;\n type: string;\n kind?: 'LowCardinality' | 'Enum';\n values?: string[];\n isIndexed?: boolean;\n stats?: ColumnStats;\n }[];\n rowCount?: number;\n sizeHint?: 'tiny' | 'small' | 'medium' | 'large' | 'huge';\n indexes?: TableIndex[];\n constraints?: TableConstraint[];\n}\n\nexport interface TableIndex {\n name: string;\n columns: string[];\n unique?: boolean;\n type?: string;\n}\n\nexport interface TableConstraint {\n name: string;\n type:\n | 'CHECK'\n | 'UNIQUE'\n | 'NOT_NULL'\n | 'DEFAULT'\n | 'PRIMARY_KEY'\n | 'FOREIGN_KEY';\n columns?: string[];\n definition?: string;\n defaultValue?: string;\n referencedTable?: string;\n referencedColumns?: string[];\n}\n\nexport interface ColumnStats {\n min?: string;\n max?: string;\n nullFraction?: number;\n}\n\nexport type Relationship = {\n table: string;\n from: string[];\n referenced_table: string;\n to: string[];\n};\n\nexport type TablesFilter = string[] | RegExp;\n\nexport interface Introspection {\n tables: Table[];\n relationships: Relationship[];\n}\n\nexport interface AdapterInfo {\n dialect: string;\n version?: string;\n database?: string;\n details?: Record<string, unknown>;\n}\n\nexport type AdapterInfoProvider =\n | AdapterInfo\n | (() => Promise<AdapterInfo> | AdapterInfo);\n\nexport type IntrospectionPhase =\n | 'tables'\n | 'row_counts'\n | 'primary_keys'\n | 'indexes'\n | 'column_stats'\n | 'low_cardinality'\n | 'relationships';\n\nexport interface IntrospectionProgress {\n phase: IntrospectionPhase;\n message: string;\n current?: number;\n total?: number;\n}\n\nexport type OnProgress = (progress: IntrospectionProgress) => void;\n\nexport interface IntrospectOptions {\n onProgress?: OnProgress;\n}\n\nexport type GroundingFn = (adapter: Adapter) => AbstractGrounding;\n\nexport type ExecuteFunction = (sql: string) => Promise<any> | any;\nexport type ValidateFunction = (\n sql: string,\n) => Promise<string | void> | string | void;\n\nexport abstract class Adapter {\n abstract grounding: GroundingFn[];\n\n /**\n * Default schema name for this database.\n * PostgreSQL: 'public', SQL Server: 'dbo', SQLite: undefined\n */\n abstract readonly defaultSchema: string | undefined;\n\n /**\n * System schemas to exclude from introspection by default.\n */\n abstract readonly systemSchemas: string[];\n\n async introspect(ctx = createGroundingContext()) {\n const lines: { tag: string; fn: () => string | null }[] = [];\n for (const fn of this.grounding) {\n const grounding = fn(this);\n lines.push({\n tag: grounding.tag,\n fn: await grounding.execute(ctx),\n });\n }\n return lines\n .map(({ fn, tag }) => {\n const description = fn();\n if (description === null) {\n return '';\n }\n return `<${tag}>\\n${description}\\n</${tag}>`;\n })\n .join('\\n');\n }\n abstract execute(sql: string): Promise<any[]> | any[];\n abstract validate(sql: string): Promise<string | void> | string | void;\n abstract runQuery<Row>(sql: string): Promise<Row[]> | Row[];\n\n /**\n * Quote an identifier (table/column name) for safe use in SQL.\n * Each database uses different quoting styles.\n */\n abstract quoteIdentifier(name: string): string;\n\n /**\n * Escape a string value for safe use in SQL.\n * Each database escapes different characters.\n */\n abstract escape(value: string): string;\n\n /**\n * Build a SELECT query to sample rows from a table.\n * Each database uses different syntax for limiting rows (LIMIT vs TOP).\n */\n abstract buildSampleRowsQuery(\n tableName: string,\n columns: string[] | undefined,\n limit: number,\n ): string;\n\n /**\n * Convert unknown database value to number.\n * Handles number, bigint, and string types.\n */\n toNumber(value: unknown): number | undefined {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value;\n }\n if (typeof value === 'bigint') {\n return Number(value);\n }\n if (typeof value === 'string' && value.trim() !== '') {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : undefined;\n }\n return undefined;\n }\n\n /**\n * Parse a potentially qualified table name into schema and table parts.\n */\n parseTableName(name: string): { schema: string; table: string } {\n if (name.includes('.')) {\n const [schema, ...rest] = name.split('.');\n return { schema, table: rest.join('.') };\n }\n return { schema: this.defaultSchema ?? '', table: name };\n }\n\n /**\n * Escape a string value for use in SQL string literals (single quotes).\n * Used in WHERE clauses like: WHERE name = '${escapeString(value)}'\n */\n escapeString(value: string): string {\n return value.replace(/'/g, \"''\");\n }\n\n /**\n * Build a SQL filter clause to include/exclude schemas.\n * @param columnName - The schema column name (e.g., 'TABLE_SCHEMA')\n * @param allowedSchemas - If provided, filter to these schemas only\n */\n buildSchemaFilter(columnName: string, allowedSchemas?: string[]): string {\n if (allowedSchemas && allowedSchemas.length > 0) {\n const values = allowedSchemas\n .map((s) => `'${this.escapeString(s)}'`)\n .join(', ');\n return `AND ${columnName} IN (${values})`;\n }\n if (this.systemSchemas.length > 0) {\n const values = this.systemSchemas\n .map((s) => `'${this.escapeString(s)}'`)\n .join(', ');\n return `AND ${columnName} NOT IN (${values})`;\n }\n return '';\n }\n}\n\nexport function filterTablesByName<T extends { name: string }>(\n tables: T[],\n filter: TablesFilter | undefined,\n): T[] {\n if (!filter) return tables;\n return tables.filter((table) => matchesFilter(table.name, filter));\n}\n\nexport function filterRelationshipsByTables(\n relationships: Relationship[],\n tableNames: Set<string> | undefined,\n): Relationship[] {\n if (tableNames === undefined) {\n return relationships;\n }\n if (tableNames.size === 0) {\n return [];\n }\n return relationships.filter(\n (it) => tableNames.has(it.table) || tableNames.has(it.referenced_table),\n );\n}\n\nexport function applyTablesFilter(\n tables: Table[],\n relationships: Relationship[],\n filter: TablesFilter | undefined,\n): { tables: Table[]; relationships: Relationship[] } {\n if (!filter) {\n return { tables, relationships };\n }\n\n const allowedNames = new Set(\n getTablesWithRelated(tables, relationships, filter),\n );\n\n return {\n tables: tables.filter((table) => allowedNames.has(table.name)),\n relationships: filterRelationshipsByTables(relationships, allowedNames),\n };\n}\n\nexport function matchesFilter(\n tableName: string,\n filter: TablesFilter,\n): boolean {\n if (Array.isArray(filter)) {\n return filter.includes(tableName);\n }\n return filter.test(tableName);\n}\n\nexport function getTablesWithRelated(\n allTables: Table[],\n relationships: Relationship[],\n filter: TablesFilter,\n): string[] {\n const matchedTables = filterTablesByName(allTables, filter).map(\n (it) => it.name,\n );\n\n if (matchedTables.length === 0) {\n return [];\n }\n\n const adjacency = new Map<string, Set<string>>();\n\n for (const rel of relationships) {\n if (!adjacency.has(rel.table)) {\n adjacency.set(rel.table, new Set());\n }\n if (!adjacency.has(rel.referenced_table)) {\n adjacency.set(rel.referenced_table, new Set());\n }\n adjacency.get(rel.table)!.add(rel.referenced_table);\n adjacency.get(rel.referenced_table)!.add(rel.table);\n }\n\n const result = new Set<string>(matchedTables);\n const queue = [...matchedTables];\n\n while (queue.length > 0) {\n const current = queue.shift()!;\n const neighbors = adjacency.get(current);\n\n if (!neighbors) {\n continue;\n }\n\n for (const neighbor of neighbors) {\n if (!result.has(neighbor)) {\n result.add(neighbor);\n queue.push(neighbor);\n }\n }\n }\n\n return Array.from(result);\n}\n", "import type { Adapter } from '../adapter.ts';\nimport type { GroundingContext } from './context.ts';\n\n/**\n * Filter type for table names.\n * - string[]: explicit list of table names\n * - RegExp: pattern to match table names\n * - function: predicate to filter table names\n */\nexport type Filter = string[] | RegExp | ((tableName: string) => boolean);\n\nexport interface AdapterInfo {\n dialect: string;\n version?: string;\n database?: string;\n details?: Record<string, unknown>;\n}\nexport type AdapterInfoProvider =\n | AdapterInfo\n | (() => Promise<AdapterInfo> | AdapterInfo);\n\nexport abstract class AbstractGrounding {\n tag: string;\n constructor(tag: string) {\n this.tag = tag;\n }\n\n abstract execute(ctx: GroundingContext): Promise<() => string | null>;\n}\n\nclass SampleDataGrounding {\n // this will fetch sample data for tables matching the filter\n}\n\nclass FunctionGrounding {\n #filter: Filter;\n #adapter: Adapter;\n constructor(adapter: Adapter, filter: Filter) {\n this.#filter = filter;\n this.#adapter = adapter;\n }\n}\n", "import type { ColumnStats } from '../adapter.ts';\nimport { AbstractGrounding } from './abstract.grounding.ts';\nimport type { Column, ColumnContainer, GroundingContext } from './context.ts';\n\n/**\n * Configuration for ColumnStatsGrounding.\n */\nexport interface ColumnStatsGroundingConfig {\n // Future: filter which tables/columns to collect stats for\n}\n\n/**\n * Abstract base class for column statistics grounding.\n *\n * Reads tables and views from the context and annotates their columns\n * with statistics (min, max, nullFraction).\n *\n * Subclasses implement database-specific hooks:\n * - `collectStats()` - collect min/max/nullFraction for a column\n */\nexport abstract class ColumnStatsGrounding extends AbstractGrounding {\n constructor(config: ColumnStatsGroundingConfig = {}) {\n super('column_stats');\n }\n\n /**\n * Collect min/max/nullFraction statistics for a column.\n * Return undefined to skip this column.\n */\n protected abstract collectStats(\n tableName: string,\n column: Column,\n ): Promise<ColumnStats | undefined>;\n\n /**\n * Execute the grounding process.\n * Annotates columns in ctx.tables and ctx.views with statistics.\n */\n async execute(ctx: GroundingContext) {\n // Process both tables and views\n const allContainers: ColumnContainer[] = [...ctx.tables, ...ctx.views];\n for (const container of allContainers) {\n for (const column of container.columns) {\n // Collect min/max/nullFraction\n try {\n const stats = await this.collectStats(container.name, column);\n if (stats) {\n column.stats = stats;\n }\n } catch (error) {\n // Skip on error\n console.warn(\n 'Error collecting stats for',\n container.name,\n column.name,\n error,\n );\n }\n }\n }\n return () => this.#describe();\n }\n\n #describe() {\n return null;\n }\n}\n", "import type { Table, TableConstraint } from '../adapter.ts';\nimport { AbstractGrounding } from './abstract.grounding.ts';\nimport type { Column, ColumnContainer, GroundingContext } from './context.ts';\n\nexport type { Column, ColumnContainer };\n\n/**\n * Result of column value detection.\n */\nexport type ColumnValuesResult = {\n kind: 'Enum' | 'LowCardinality';\n values: string[];\n};\n\n/**\n * Configuration for ColumnValuesGrounding.\n */\nexport interface ColumnValuesGroundingConfig {\n /** Maximum number of distinct values to consider low cardinality (default: 20) */\n lowCardinalityLimit?: number;\n}\n\n/**\n * Abstract base class for column values grounding.\n *\n * Discovers possible values for columns from three sources (in priority order):\n * 1. Native ENUM types (PostgreSQL, MySQL) \u2192 kind: 'Enum'\n * 2. CHECK constraints with IN clauses \u2192 kind: 'Enum'\n * 3. Low cardinality data scan \u2192 kind: 'LowCardinality'\n *\n * Subclasses implement database-specific hooks:\n * - `collectEnumValues()` - get values for native ENUM columns\n * - `collectLowCardinality()` - collect distinct values via data scan\n */\nexport abstract class ColumnValuesGrounding extends AbstractGrounding {\n protected lowCardinalityLimit: number;\n\n constructor(config: ColumnValuesGroundingConfig = {}) {\n super('column_values');\n this.lowCardinalityLimit = config.lowCardinalityLimit ?? 20;\n }\n\n /**\n * Get values for native ENUM type columns.\n * Return undefined if column is not an ENUM type.\n * Default implementation returns undefined (no native ENUM support).\n */\n protected async collectEnumValues(\n _tableName: string,\n _column: Column,\n ): Promise<string[] | undefined> {\n return undefined;\n }\n\n /**\n * Collect distinct values for low cardinality columns via data scan.\n * Return undefined if column has too many distinct values.\n */\n protected abstract collectLowCardinality(\n tableName: string,\n column: Column,\n ): Promise<string[] | undefined>;\n\n /**\n * Parse CHECK constraint for enum-like IN clause.\n * Extracts values from patterns like:\n * - CHECK (status IN ('active', 'inactive'))\n * - CHECK ((status)::text = ANY (ARRAY['a'::text, 'b'::text]))\n * - CHECK (status = 'active' OR status = 'inactive')\n */\n protected parseCheckConstraint(\n constraint: TableConstraint,\n columnName: string,\n ): string[] | undefined {\n if (constraint.type !== 'CHECK' || !constraint.definition) {\n return undefined;\n }\n\n // Check if constraint applies to this column\n if (constraint.columns && !constraint.columns.includes(columnName)) {\n return undefined;\n }\n\n const def = constraint.definition;\n const escapedCol = this.escapeRegex(columnName);\n\n // Column pattern: matches column name with optional parens and type cast\n // e.g., \"status\", \"(status)\", \"((status)::text)\"\n const colPattern = `(?:\\\\(?\\\\(?${escapedCol}\\\\)?(?:::(?:text|varchar|character varying))?\\\\)?)`;\n\n // Pattern 1: column IN ('val1', 'val2', ...)\n const inMatch = def.match(\n new RegExp(`${colPattern}\\\\s+IN\\\\s*\\\\(([^)]+)\\\\)`, 'i'),\n );\n if (inMatch) {\n return this.extractStringValues(inMatch[1]);\n }\n\n // Pattern 2: PostgreSQL ANY(ARRAY[...])\n const anyMatch = def.match(\n new RegExp(\n `${colPattern}\\\\s*=\\\\s*ANY\\\\s*\\\\(\\\\s*(?:ARRAY)?\\\\s*\\\\[([^\\\\]]+)\\\\]`,\n 'i',\n ),\n );\n if (anyMatch) {\n return this.extractStringValues(anyMatch[1]);\n }\n\n // Pattern 3: column = 'val1' OR column = 'val2' ...\n const orPattern = new RegExp(\n `\\\\b${this.escapeRegex(columnName)}\\\\b\\\\s*=\\\\s*'([^']*)'`,\n 'gi',\n );\n const orMatches = [...def.matchAll(orPattern)];\n if (orMatches.length >= 2) {\n return orMatches.map((m) => m[1]);\n }\n\n return undefined;\n }\n\n /**\n * Extract string values from a comma-separated list.\n */\n private extractStringValues(input: string): string[] | undefined {\n const values: string[] = [];\n // Match quoted strings: 'value' or 'value'::type\n const matches = input.matchAll(/'([^']*)'/g);\n for (const match of matches) {\n values.push(match[1]);\n }\n return values.length > 0 ? values : undefined;\n }\n\n /**\n * Escape special regex characters in a string.\n */\n private escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n }\n\n /**\n * Get the table from context by name.\n */\n private getTable(ctx: GroundingContext, name: string): Table | undefined {\n return ctx.tables.find((t) => t.name === name);\n }\n\n /**\n * Execute the grounding process.\n * Annotates columns in ctx.tables and ctx.views with values.\n */\n async execute(ctx: GroundingContext) {\n // Process both tables and views\n const allContainers: ColumnContainer[] = [...ctx.tables, ...ctx.views];\n\n for (const container of allContainers) {\n const table = this.getTable(ctx, container.name);\n\n for (const column of container.columns) {\n try {\n const result = await this.resolveColumnValues(\n container.name,\n column,\n table?.constraints,\n );\n if (result) {\n column.kind = result.kind;\n column.values = result.values;\n }\n } catch (error) {\n console.warn(\n 'Error collecting column values for',\n container.name,\n column.name,\n error,\n );\n }\n }\n }\n\n return () => this.#describe();\n }\n\n /**\n * Resolve column values from all sources in priority order.\n */\n private async resolveColumnValues(\n tableName: string,\n column: Column,\n constraints?: TableConstraint[],\n ): Promise<ColumnValuesResult | undefined> {\n // Priority 1: Native ENUM type\n const enumValues = await this.collectEnumValues(tableName, column);\n if (enumValues?.length) {\n return { kind: 'Enum', values: enumValues };\n }\n\n // Priority 2: CHECK constraint with IN clause\n if (constraints) {\n for (const constraint of constraints) {\n const checkValues = this.parseCheckConstraint(constraint, column.name);\n if (checkValues?.length) {\n return { kind: 'Enum', values: checkValues };\n }\n }\n }\n\n // Priority 3: Low cardinality data scan\n const lowCardValues = await this.collectLowCardinality(tableName, column);\n if (lowCardValues?.length) {\n return { kind: 'LowCardinality', values: lowCardValues };\n }\n\n return undefined;\n }\n\n #describe() {\n return null;\n }\n}\n", "import 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('constraints');\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) {\n for (const table of ctx.tables) {\n try {\n table.constraints = await this.getConstraints(table.name);\n } catch (error) {\n // Skip on error - table might not exist or be inaccessible\n console.warn('Error collecting constraints for', table.name, error);\n }\n }\n // Return null - TableGrounding could describe constraints if needed\n return () => null;\n }\n}\n", "import type { TableIndex } from '../adapter.ts';\nimport { AbstractGrounding } from './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('indexes');\n }\n\n /**\n * Fetch indexes for a specific table.\n */\n protected abstract getIndexes(tableName: string): Promise<TableIndex[]>;\n\n /**\n * Execute the grounding process.\n * Annotates tables in ctx.tables with their indexes and marks indexed columns.\n */\n async execute(ctx: GroundingContext) {\n for (const table of ctx.tables) {\n table.indexes = await this.getIndexes(table.name);\n // Mark columns that are part of indexes\n for (const index of table.indexes ?? []) {\n for (const colName of index.columns) {\n const column = table.columns.find((c) => c.name === colName);\n if (column) {\n column.isIndexed = true;\n }\n }\n }\n }\n // Return null - TableGrounding already describes indexes in its output\n return () => null;\n }\n}\n", "import type { AdapterInfo } from '../adapter.ts';\nimport { AbstractGrounding } from './abstract.grounding.ts';\nimport type { GroundingContext } from './context.ts';\n\n/**\n * Configuration for InfoGrounding.\n */\nexport interface InfoGroundingConfig {\n // Future: options to control what info to collect\n}\n\n/**\n * Abstract base class for database info grounding.\n *\n * Collects database dialect, version, and connection info.\n *\n * Subclasses implement the database-specific hook:\n * - `collectInfo()` - collect database info\n */\nexport abstract class InfoGrounding extends AbstractGrounding {\n constructor(config: InfoGroundingConfig = {}) {\n super('dialect_info');\n }\n\n /**\n * Collect database dialect, version, and other info.\n */\n protected abstract collectInfo(): Promise<AdapterInfo>;\n\n /**\n * Execute the grounding process.\n * Writes database info to ctx.info.\n */\n async execute(ctx: GroundingContext) {\n ctx.info = await this.collectInfo();\n const lines = [`Dialect: ${ctx.info.dialect ?? 'unknown'}`];\n if (ctx.info.version) {\n lines.push(`Version: ${ctx.info.version}`);\n }\n if (ctx.info.database) {\n lines.push(`Database: ${ctx.info.database}`);\n }\n if (ctx.info.details && Object.keys(ctx.info.details).length) {\n lines.push(`Details: ${JSON.stringify(ctx.info.details)}`);\n }\n return () => lines.join('\\n');\n }\n}\n", "import { groq } from '@ai-sdk/groq';\nimport { tool } from 'ai';\nimport dedent from 'dedent';\nimport z from 'zod';\n\nimport {\n type AgentModel,\n agent,\n generate,\n toState,\n user,\n} from '@deepagents/agent';\n\nimport type { Adapter } from '../adapter.ts';\nimport { AbstractGrounding } from './abstract.grounding.ts';\nimport type { GroundingContext } from './context.ts';\n\n/**\n * Cache interface for storing generated reports.\n */\nexport interface ReportCache {\n get(): Promise<string | null>;\n set(value: string): Promise<void>;\n}\n\n/**\n * Configuration for ReportGrounding.\n */\nexport interface ReportGroundingConfig {\n /** LLM model to use for generating the report */\n model?: AgentModel;\n /** Optional cache for storing generated reports */\n cache?: ReportCache;\n /** Force regeneration even if cached */\n forceRefresh?: boolean;\n}\n\nconst reportAgent = agent<unknown, { adapter: Adapter }>({\n name: 'db-report-agent',\n model: groq('openai/gpt-oss-20b'),\n prompt: () => dedent`\n <identity>\n You are a database analyst expert. Your job is to understand what\n a database represents and provide business context about it.\n You have READ-ONLY access to the database.\n </identity>\n\n <instructions>\n Write a business context that helps another agent answer questions accurately.\n\n For EACH table, do queries ONE AT A TIME:\n 1. SELECT COUNT(*) to get row count\n 2. SELECT * LIMIT 3 to see sample data\n\n Then write a report with:\n - What business this database is for\n - For each table: purpose, row count, and example of what the data looks like\n\n Include concrete examples like \"Track prices are $0.99\",\n \"Customer names like 'Lu\u00EDs Gon\u00E7alves'\", etc.\n\n Keep it 400-600 words, conversational style.\n </instructions>\n `,\n tools: {\n query_database: tool({\n description:\n 'Execute a SELECT query to explore the database and gather insights.',\n inputSchema: z.object({\n sql: z.string().describe('The SELECT query to execute'),\n purpose: z\n .string()\n .describe('What insight you are trying to gather with this query'),\n }),\n execute: ({ sql }, options) => {\n const state = toState<{ adapter: Adapter }>(options);\n return state.adapter.execute(sql);\n },\n }),\n },\n});\n\n/**\n * Grounding that generates a business context report about the database.\n *\n * Uses an LLM agent to:\n * 1. Query COUNT(*) for each table\n * 2. Query SELECT * LIMIT 3 for sample data\n * 3. Generate a 400-600 word business context report\n *\n * The report helps downstream agents understand what the database represents.\n */\nexport class ReportGrounding extends AbstractGrounding {\n #adapter: Adapter;\n #model: AgentModel;\n #cache?: ReportCache;\n #forceRefresh: boolean;\n\n constructor(adapter: Adapter, config: ReportGroundingConfig = {}) {\n super('business_context');\n this.#adapter = adapter;\n this.#model = config.model ?? groq('openai/gpt-oss-20b');\n this.#cache = config.cache;\n this.#forceRefresh = config.forceRefresh ?? false;\n }\n\n async execute(ctx: GroundingContext): Promise<() => string | null> {\n // Check cache first (unless forcing refresh)\n if (!this.#forceRefresh && this.#cache) {\n const cached = await this.#cache.get();\n if (cached) {\n ctx.report = cached;\n return () => cached;\n }\n }\n\n // Generate report using LLM\n const report = await this.#generateReport();\n ctx.report = report;\n\n // Cache the result\n if (this.#cache) {\n await this.#cache.set(report);\n }\n\n return () => report;\n }\n\n async #generateReport(): Promise<string> {\n const { text } = await generate(\n reportAgent.clone({ model: this.#model }),\n [\n user(\n 'Please analyze the database and write a contextual report about what this database represents.',\n ),\n ],\n { adapter: this.#adapter },\n );\n\n return text;\n }\n}\n", "import type { Table } from '../adapter.ts';\nimport { AbstractGrounding } from './abstract.grounding.ts';\nimport type { GroundingContext } from './context.ts';\n\n/**\n * Configuration for RowCountGrounding.\n */\nexport interface RowCountGroundingConfig {\n // Future: filter which tables to count\n}\n\n/**\n * Abstract base class for row count grounding.\n *\n * Reads tables from the context and annotates them with row counts and size hints.\n * This grounding must run AFTER TableGrounding since it reads from ctx.tables.\n *\n * Subclasses implement the database-specific hook:\n * - `getRowCount()` - get row count for a table\n */\nexport abstract class RowCountGrounding extends AbstractGrounding {\n constructor(config: RowCountGroundingConfig = {}) {\n super('row_counts');\n }\n\n /**\n * Get row count for a specific table.\n */\n protected abstract getRowCount(\n tableName: string,\n ): Promise<number | undefined>;\n\n /**\n * Execute the grounding process.\n * Annotates tables in ctx.tables with row counts and size hints.\n */\n async execute(ctx: GroundingContext) {\n for (const table of ctx.tables) {\n const count = await this.getRowCount(table.name);\n if (count != null) {\n table.rowCount = count;\n table.sizeHint = this.#classifyRowCount(count);\n }\n }\n // Return null - TableGrounding already describes row counts in its output\n return () => null;\n }\n\n /**\n * Classify row count into a size hint category.\n */\n #classifyRowCount(count: number): Table['sizeHint'] {\n if (count < 100) return 'tiny';\n if (count < 1000) return 'small';\n if (count < 10000) return 'medium';\n if (count < 100000) return 'large';\n return 'huge';\n }\n}\n", "import pluralize from 'pluralize';\n\nimport type { Filter, Relationship, Table } from '../adapter.ts';\nimport { AbstractGrounding } from './abstract.grounding.ts';\nimport type { GroundingContext } from './context.ts';\n\n/**\n * Configuration for TableGrounding.\n */\nexport interface TableGroundingConfig {\n /** Filter to select seed tables */\n filter?: Filter;\n /**\n * Traverse forward (child\uFFFDparent) following FK direction.\n * - true: unlimited depth\n * - number: maximum depth\n * - false/undefined: no forward traversal\n */\n forward?: boolean | number;\n /**\n * Traverse backward (parent\uFFFDchild) finding tables that reference us.\n * - true: unlimited depth\n * - number: maximum depth\n * - false/undefined: no backward traversal\n */\n backward?: boolean | number;\n}\n\n/**\n * Abstract base class for table grounding.\n *\n * The `execute()` method implements a BFS traversal algorithm that discovers\n * tables and relationships. Subclasses implement the database-specific hooks:\n * - `getAllTableNames()` - list all tables\n * - `getTable()` - get table metadata\n * - `findOutgoingRelations()` - find FKs FROM a table\n * - `findIncomingRelations()` - find FKs TO a table\n */\nexport abstract class TableGrounding extends AbstractGrounding {\n #filter?: Filter;\n #forward?: boolean | number;\n #backward?: boolean | number;\n\n constructor(config: TableGroundingConfig = {}) {\n super('tables');\n this.#filter = config.filter;\n this.#forward = config.forward;\n this.#backward = config.backward;\n }\n\n /** Get all table names in the database */\n protected abstract getAllTableNames(): Promise<string[]>;\n\n /** Get full table metadata for a single table */\n protected abstract getTable(tableName: string): Promise<Table>;\n\n /** Find FKs FROM this table (outgoing relationships) */\n protected abstract findOutgoingRelations(\n tableName: string,\n ): Promise<Relationship[]>;\n\n /** Find FKs TO this table (incoming relationships) */\n protected abstract findIncomingRelations(\n tableName: string,\n ): Promise<Relationship[]>;\n\n /**\n * Execute the grounding process.\n * Writes discovered tables and relationships to the context.\n */\n async execute(ctx: GroundingContext) {\n const seedTables = await this.applyFilter();\n const forward = this.#forward;\n const backward = this.#backward;\n\n // No traversal at all - just add the seed tables\n if (!forward && !backward) {\n const tables = await Promise.all(\n seedTables.map((name) => this.getTable(name)),\n );\n ctx.tables.push(...tables);\n return () => this.#describeTables(tables);\n }\n\n const tables: Record<string, Table> = {};\n const allRelationships: Relationship[] = [];\n const seenRelationships = new Set<string>();\n\n // Track depth separately for forward/backward using BFS\n const forwardQueue: Array<{ name: string; depth: number }> = [];\n const backwardQueue: Array<{ name: string; depth: number }> = [];\n const forwardVisited = new Set<string>();\n const backwardVisited = new Set<string>();\n\n // Initialize queues with seed tables at depth 0\n for (const name of seedTables) {\n if (forward) forwardQueue.push({ name, depth: 0 });\n if (backward) backwardQueue.push({ name, depth: 0 });\n }\n\n // Process forward (child\u2192parent)\n const forwardLimit = forward === true ? Infinity : forward || 0;\n while (forwardQueue.length > 0) {\n const item = forwardQueue.shift();\n if (!item) break;\n const { name, depth } = item;\n\n if (forwardVisited.has(name)) continue;\n forwardVisited.add(name);\n\n if (!tables[name]) {\n tables[name] = await this.getTable(name);\n }\n\n if (depth < forwardLimit) {\n const rels = await this.findOutgoingRelations(name);\n for (const rel of rels) {\n this.addRelationship(rel, allRelationships, seenRelationships);\n if (!forwardVisited.has(rel.referenced_table)) {\n forwardQueue.push({ name: rel.referenced_table, depth: depth + 1 });\n }\n }\n }\n }\n\n // Process backward (parent\u2192child)\n const backwardLimit = backward === true ? Infinity : backward || 0;\n while (backwardQueue.length > 0) {\n const item = backwardQueue.shift();\n if (!item) break;\n const { name, depth } = item;\n\n if (backwardVisited.has(name)) continue;\n backwardVisited.add(name);\n\n if (!tables[name]) {\n tables[name] = await this.getTable(name);\n }\n\n if (depth < backwardLimit) {\n const rels = await this.findIncomingRelations(name);\n for (const rel of rels) {\n this.addRelationship(rel, allRelationships, seenRelationships);\n if (!backwardVisited.has(rel.table)) {\n backwardQueue.push({ name: rel.table, depth: depth + 1 });\n }\n }\n }\n }\n\n // Write to context\n const tablesList = Object.values(tables);\n ctx.tables.push(...tablesList);\n ctx.relationships.push(...allRelationships);\n return () => this.#describeTables(tablesList);\n }\n\n /**\n * Apply the filter to get seed table names.\n * If filter is an explicit array, skip querying all table names.\n */\n protected async applyFilter(): Promise<string[]> {\n const filter = this.#filter;\n if (Array.isArray(filter)) {\n return filter;\n }\n const names = await this.getAllTableNames();\n if (!filter) {\n return names;\n }\n if (filter instanceof RegExp) {\n return names.filter((name) => filter.test(name));\n }\n return names.filter(filter);\n }\n\n /**\n * Add a relationship to the collection, deduplicating by key.\n */\n protected addRelationship(\n rel: Relationship,\n all: Relationship[],\n seen: Set<string>,\n ): void {\n const key = `${rel.table}:${rel.from.join(',')}:${rel.referenced_table}:${rel.to.join(',')}`;\n if (!seen.has(key)) {\n seen.add(key);\n all.push(rel);\n }\n }\n\n #describeTables(tables: Table[]): string {\n if (!tables.length) {\n return 'Schema unavailable.';\n }\n\n return tables\n .map((table) => {\n const rowCountInfo =\n table.rowCount != null\n ? ` [rows: ${table.rowCount}${table.sizeHint ? `, size: ${table.sizeHint}` : ''}]`\n : '';\n\n // Build constraint lookup maps for column-level annotations\n const pkConstraint = table.constraints?.find(\n (c) => c.type === 'PRIMARY_KEY',\n );\n const pkColumns = new Set(pkConstraint?.columns ?? []);\n\n const notNullColumns = new Set(\n table.constraints\n ?.filter((c) => c.type === 'NOT_NULL')\n .flatMap((c) => c.columns ?? []) ?? [],\n );\n\n const defaultByColumn = new Map<string, string>();\n for (const c of table.constraints?.filter(\n (c) => c.type === 'DEFAULT',\n ) ?? []) {\n for (const col of c.columns ?? []) {\n if (c.defaultValue != null) {\n defaultByColumn.set(col, c.defaultValue);\n }\n }\n }\n\n // Single-column UNIQUE constraints\n const uniqueColumns = new Set(\n table.constraints\n ?.filter((c) => c.type === 'UNIQUE' && c.columns?.length === 1)\n .flatMap((c) => c.columns ?? []) ?? [],\n );\n\n // Foreign key lookup: column -> referenced table.column\n const fkByColumn = new Map<string, string>();\n for (const c of table.constraints?.filter(\n (c) => c.type === 'FOREIGN_KEY',\n ) ?? []) {\n const cols = c.columns ?? [];\n const refCols = c.referencedColumns ?? [];\n for (let i = 0; i < cols.length; i++) {\n const refCol = refCols[i] ?? refCols[0] ?? cols[i];\n fkByColumn.set(cols[i], `${c.referencedTable}.${refCol}`);\n }\n }\n\n const columns = table.columns\n .map((column) => {\n const annotations: string[] = [];\n const isPrimaryKey = pkColumns.has(column.name);\n if (isPrimaryKey) {\n annotations.push('PK');\n }\n if (fkByColumn.has(column.name)) {\n annotations.push(`FK -> ${fkByColumn.get(column.name)}`);\n }\n if (uniqueColumns.has(column.name)) {\n annotations.push('UNIQUE');\n }\n if (notNullColumns.has(column.name)) {\n annotations.push('NOT NULL');\n }\n if (defaultByColumn.has(column.name)) {\n annotations.push(`DEFAULT: ${defaultByColumn.get(column.name)}`);\n }\n if (column.isIndexed && !isPrimaryKey) {\n annotations.push('Indexed');\n }\n if (column.kind === 'Enum' && column.values?.length) {\n annotations.push(`Enum: ${column.values.join(', ')}`);\n } else if (\n column.kind === 'LowCardinality' &&\n column.values?.length\n ) {\n annotations.push(`LowCardinality: ${column.values.join(', ')}`);\n }\n if (column.stats) {\n const statParts: string[] = [];\n if (column.stats.min != null || column.stats.max != null) {\n const minText = column.stats.min ?? 'n/a';\n const maxText = column.stats.max ?? 'n/a';\n statParts.push(`range ${minText} \u2192 ${maxText}`);\n }\n if (\n column.stats.nullFraction != null &&\n Number.isFinite(column.stats.nullFraction)\n ) {\n const percent =\n Math.round(column.stats.nullFraction * 1000) / 10;\n statParts.push(`null\u2248${percent}%`);\n }\n if (statParts.length) {\n annotations.push(statParts.join(', '));\n }\n }\n const annotationText = annotations.length\n ? ` [${annotations.join(', ')}]`\n : '';\n return ` - ${column.name} (${column.type})${annotationText}`;\n })\n .join('\\n');\n\n // Indexes section\n const indexes = table.indexes?.length\n ? `\\n Indexes:\\n${table.indexes\n .map((index) => {\n const props: string[] = [];\n if (index.unique) {\n props.push('UNIQUE');\n }\n if (index.type) {\n props.push(index.type);\n }\n const propsText = props.length ? ` (${props.join(', ')})` : '';\n const columnsText = index.columns?.length\n ? index.columns.join(', ')\n : 'expression';\n return ` - ${index.name}${propsText}: ${columnsText}`;\n })\n .join('\\n')}`\n : '';\n\n // Multi-column UNIQUE constraints (not already shown in indexes)\n const multiColumnUniques =\n table.constraints?.filter(\n (c) => c.type === 'UNIQUE' && (c.columns?.length ?? 0) > 1,\n ) ?? [];\n const uniqueConstraints = multiColumnUniques.length\n ? `\\n Unique Constraints:\\n${multiColumnUniques\n .map((c) => ` - ${c.name}: (${c.columns?.join(', ')})`)\n .join('\\n')}`\n : '';\n\n // CHECK constraints\n const checkConstraints =\n table.constraints?.filter((c) => c.type === 'CHECK') ?? [];\n const checks = checkConstraints.length\n ? `\\n Check Constraints:\\n${checkConstraints\n .map((c) => ` - ${c.name}: ${c.definition}`)\n .join('\\n')}`\n : '';\n\n return `- Table: ${table.name}${rowCountInfo}\\n Columns:\\n${columns}${indexes}${uniqueConstraints}${checks}`;\n })\n .join('\\n\\n');\n }\n\n #formatTableLabel = (tableName: string) => {\n const base = tableName.split('.').pop() ?? tableName;\n return base.replace(/_/g, ' ');\n };\n\n #describeRelationships = (tables: Table[], relationships: Relationship[]) => {\n if (!relationships.length) {\n return 'None detected';\n }\n\n const tableMap = new Map(tables.map((table) => [table.name, table]));\n\n return relationships\n .map((relationship) => {\n const sourceLabel = this.#formatTableLabel(relationship.table);\n const targetLabel = this.#formatTableLabel(\n relationship.referenced_table,\n );\n const singularSource = pluralize.singular(sourceLabel);\n const pluralSource = pluralize.plural(sourceLabel);\n const singularTarget = pluralize.singular(targetLabel);\n const pluralTarget = pluralize.plural(targetLabel);\n const sourceTable = tableMap.get(relationship.table);\n const targetTable = tableMap.get(relationship.referenced_table);\n const sourceCount = sourceTable?.rowCount;\n const targetCount = targetTable?.rowCount;\n const ratio =\n sourceCount != null && targetCount != null && targetCount > 0\n ? sourceCount / targetCount\n : null;\n\n let cardinality = 'each';\n if (ratio != null) {\n if (ratio > 5) {\n cardinality = `many-to-one (\u2248${sourceCount} vs ${targetCount})`;\n } else if (ratio < 1.2 && ratio > 0.8) {\n cardinality = `roughly 1:1 (${sourceCount} vs ${targetCount})`;\n } else if (ratio < 0.2) {\n cardinality = `one-to-many (${sourceCount} vs ${targetCount})`;\n }\n }\n const mappings = relationship.from\n .map((fromCol, idx) => {\n const targetCol =\n relationship.to[idx] ?? relationship.to[0] ?? fromCol;\n return `${relationship.table}.${fromCol} -> ${relationship.referenced_table}.${targetCol}`;\n })\n .join(', ');\n\n return `- ${relationship.table} (${relationship.from.join(', ')}) -> ${relationship.referenced_table} (${relationship.to.join(', ')}) [${cardinality}]`;\n })\n .join('\\n');\n };\n}\n", "import type { Adapter, ColumnStats } from '../adapter.ts';\nimport {\n ColumnStatsGrounding,\n type ColumnStatsGroundingConfig,\n} from '../groundings/column-stats.grounding.ts';\nimport type { Column } from '../groundings/column-values.grounding.ts';\n\ntype StatsRow = {\n min_value: string | null;\n max_value: string | null;\n null_fraction: number | string | null;\n};\n\n/**\n * MySQL/MariaDB implementation of ColumnStatsGrounding.\n *\n * Collects min/max/null statistics for numeric, date, and boolean columns.\n */\nexport class MysqlColumnStatsGrounding extends ColumnStatsGrounding {\n #adapter: Adapter;\n\n constructor(adapter: Adapter, config: ColumnStatsGroundingConfig = {}) {\n super(config);\n this.#adapter = adapter;\n }\n\n protected override async collectStats(\n tableName: string,\n column: Column,\n ): Promise<ColumnStats | undefined> {\n if (!this.#shouldCollectStats(column.type)) {\n return undefined;\n }\n\n const { schema, table } = this.#adapter.parseTableName(tableName);\n const database = schema || (await this.#getCurrentDatabase());\n\n const tableIdentifier = `${this.#adapter.quoteIdentifier(database)}.${this.#adapter.quoteIdentifier(table)}`;\n const columnIdentifier = this.#adapter.quoteIdentifier(column.name);\n\n try {\n const rows = await this.#adapter.runQuery<StatsRow>(`\n SELECT\n CAST(MIN(${columnIdentifier}) AS CHAR) AS min_value,\n CAST(MAX(${columnIdentifier}) AS CHAR) AS max_value,\n AVG(CASE WHEN ${columnIdentifier} IS NULL THEN 1.0 ELSE 0.0 END) AS null_fraction\n FROM ${tableIdentifier}\n `);\n\n if (!rows.length) {\n return undefined;\n }\n\n const min = rows[0]?.min_value ?? undefined;\n const max = rows[0]?.max_value ?? undefined;\n const nullFraction = this.#toNumber(rows[0]?.null_fraction);\n\n if (min == null && max == null && nullFraction == null) {\n return undefined;\n }\n\n return {\n min,\n max,\n nullFraction:\n nullFraction != null && Number.isFinite(nullFraction)\n ? Math.max(0, Math.min(1, nullFraction))\n : undefined,\n };\n } catch {\n return undefined;\n }\n }\n\n #shouldCollectStats(type: string | undefined): boolean {\n if (!type) {\n return false;\n }\n const normalized = type.toLowerCase();\n // Include numeric, date/time, and boolean types\n return /int|numeric|decimal|double|float|real|date|time|timestamp|datetime|bool|bit|year/.test(\n normalized,\n );\n }\n\n #toNumber(value: unknown): number | null {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value;\n }\n if (typeof value === 'bigint') {\n return Number(value);\n }\n if (typeof value === 'string' && value.trim() !== '') {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : null;\n }\n return null;\n }\n\n async #getCurrentDatabase(): Promise<string> {\n const rows = await this.#adapter.runQuery<{ db: string | null }>(\n 'SELECT DATABASE() AS db',\n );\n return rows[0]?.db ?? '';\n }\n}\n", "import type { Adapter } from '../adapter.ts';\nimport {\n type Column,\n ColumnValuesGrounding,\n type ColumnValuesGroundingConfig,\n} from '../groundings/column-values.grounding.ts';\n\ntype ColumnTypeRow = {\n COLUMN_TYPE: string | null;\n};\n\n/**\n * MySQL/MariaDB implementation of ColumnValuesGrounding.\n *\n * Detects:\n * 1. Native ENUM types - parses values from COLUMN_TYPE\n * 2. Low cardinality columns - via data scan\n */\nexport class MysqlColumnValuesGrounding extends ColumnValuesGrounding {\n #adapter: Adapter;\n\n constructor(adapter: Adapter, config: ColumnValuesGroundingConfig = {}) {\n super(config);\n this.#adapter = adapter;\n }\n\n /**\n * Detect native MySQL ENUM types and extract their values.\n */\n protected override async collectEnumValues(\n tableName: string,\n column: Column,\n ): Promise<string[] | undefined> {\n const { schema, table } = this.#adapter.parseTableName(tableName);\n const database = schema || (await this.#getCurrentDatabase());\n\n const rows = await this.#adapter.runQuery<ColumnTypeRow>(`\n SELECT COLUMN_TYPE\n FROM INFORMATION_SCHEMA.COLUMNS\n WHERE TABLE_SCHEMA = '${this.#adapter.escapeString(database)}'\n AND TABLE_NAME = '${this.#adapter.escapeString(table)}'\n AND COLUMN_NAME = '${this.#adapter.escapeString(column.name)}'\n `);\n\n const columnType = rows[0]?.COLUMN_TYPE;\n if (!columnType) return undefined;\n\n // Check if it's an ENUM type: enum('val1','val2','val3')\n const enumMatch = columnType.match(/^enum\\((.+)\\)$/i);\n if (!enumMatch) return undefined;\n\n // Parse enum values\n return this.#parseEnumValues(enumMatch[1]);\n }\n\n /**\n * Collect distinct values for low cardinality columns.\n */\n protected override async collectLowCardinality(\n tableName: string,\n column: Column,\n ): Promise<string[] | undefined> {\n const { schema, table } = this.#adapter.parseTableName(tableName);\n const database = schema || (await this.#getCurrentDatabase());\n\n const tableIdentifier = `${this.#adapter.quoteIdentifier(database)}.${this.#adapter.quoteIdentifier(table)}`;\n const columnIdentifier = this.#adapter.quoteIdentifier(column.name);\n const limit = this.lowCardinalityLimit + 1;\n\n try {\n const rows = await this.#adapter.runQuery<{ value: unknown }>(`\n SELECT DISTINCT ${columnIdentifier} AS value\n FROM ${tableIdentifier}\n WHERE ${columnIdentifier} IS NOT NULL\n LIMIT ${limit}\n `);\n\n if (!rows.length || rows.length > this.lowCardinalityLimit) {\n return undefined;\n }\n\n const values: string[] = [];\n for (const row of rows) {\n const formatted = this.#normalizeValue(row.value);\n if (formatted === null) {\n return undefined;\n }\n values.push(formatted);\n }\n\n return values.length > 0 ? values : undefined;\n } catch {\n return undefined;\n }\n }\n\n /**\n * Parse ENUM values from the COLUMN_TYPE string.\n * Input: \"'val1','val2','val3'\"\n * Output: ['val1', 'val2', 'val3']\n */\n #parseEnumValues(enumString: string): string[] {\n const values: string[] = [];\n // Match quoted strings, handling escaped quotes\n const regex = /'((?:[^'\\\\]|\\\\.|'')*)'/g;\n let match;\n while ((match = regex.exec(enumString)) !== null) {\n // Unescape any escaped quotes\n const value = match[1]\n .replace(/''/g, \"'\")\n .replace(/\\\\'/g, \"'\")\n .replace(/\\\\\\\\/g, '\\\\');\n values.push(value);\n }\n return values;\n }\n\n #normalizeValue(value: unknown): string | null {\n if (value === null || value === undefined) {\n return null;\n }\n if (typeof value === 'string') {\n return value;\n }\n if (typeof value === 'number' || typeof value === 'bigint') {\n return String(value);\n }\n if (typeof value === 'boolean') {\n return value ? 'true' : 'false';\n }\n if (value instanceof Date) {\n return value.toISOString();\n }\n if (typeof Buffer !== 'undefined' && Buffer.isBuffer(value)) {\n return value.toString('utf-8');\n }\n return null;\n }\n\n async #getCurrentDatabase(): Promise<string> {\n const rows = await this.#adapter.runQuery<{ db: string | null }>(\n 'SELECT DATABASE() AS db',\n );\n return rows[0]?.db ?? '';\n }\n}\n", "import type { Adapter, TableConstraint } from '../adapter.ts';\nimport {\n ConstraintGrounding,\n type ConstraintGroundingConfig,\n} from '../groundings/constraint.grounding.ts';\n\ntype ConstraintRow = {\n CONSTRAINT_NAME: string | null;\n CONSTRAINT_TYPE: string | null;\n COLUMN_NAME: string | null;\n REFERENCED_TABLE_SCHEMA: string | null;\n REFERENCED_TABLE_NAME: string | null;\n REFERENCED_COLUMN_NAME: string | null;\n};\n\ntype ColumnRow = {\n COLUMN_NAME: string | null;\n IS_NULLABLE: string | null;\n COLUMN_DEFAULT: string | null;\n};\n\ntype CheckConstraintRow = {\n CONSTRAINT_NAME: string | null;\n CHECK_CLAUSE: string | null;\n};\n\n/**\n * MySQL/MariaDB implementation of ConstraintGrounding.\n *\n * Collects PRIMARY KEY, FOREIGN KEY, UNIQUE, NOT_NULL, DEFAULT, and CHECK constraints.\n */\nexport class MysqlConstraintGrounding extends ConstraintGrounding {\n #adapter: Adapter;\n\n constructor(adapter: Adapter, config: ConstraintGroundingConfig = {}) {\n super(config);\n this.#adapter = adapter;\n }\n\n protected override async getConstraints(\n tableName: string,\n ): Promise<TableConstraint[]> {\n const { schema, table } = this.#adapter.parseTableName(tableName);\n const database = schema || (await this.#getCurrentDatabase());\n const constraints: TableConstraint[] = [];\n\n // Get PRIMARY KEY, UNIQUE, and FOREIGN KEY constraints\n const constraintRows = await this.#adapter.runQuery<ConstraintRow>(`\n SELECT\n tc.CONSTRAINT_NAME,\n tc.CONSTRAINT_TYPE,\n kcu.COLUMN_NAME,\n kcu.REFERENCED_TABLE_SCHEMA,\n kcu.REFERENCED_TABLE_NAME,\n kcu.REFERENCED_COLUMN_NAME\n FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc\n LEFT JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu\n ON tc.CONSTRAINT_NAME = kcu.CONSTRAINT_NAME\n AND tc.TABLE_SCHEMA = kcu.TABLE_SCHEMA\n AND tc.TABLE_NAME = kcu.TABLE_NAME\n WHERE tc.TABLE_SCHEMA = '${this.#adapter.escapeString(database)}'\n AND tc.TABLE_NAME = '${this.#adapter.escapeString(table)}'\n AND tc.CONSTRAINT_TYPE IN ('PRIMARY KEY', 'UNIQUE', 'FOREIGN KEY')\n ORDER BY tc.CONSTRAINT_NAME, kcu.ORDINAL_POSITION\n `);\n\n // Group by constraint name\n const constraintMap = new Map<\n string,\n {\n type: TableConstraint['type'];\n columns: string[];\n referencedTable?: string;\n referencedColumns?: string[];\n }\n >();\n\n for (const row of constraintRows) {\n if (!row.CONSTRAINT_NAME || !row.COLUMN_NAME) continue;\n\n const existing = constraintMap.get(row.CONSTRAINT_NAME);\n if (existing) {\n existing.columns.push(row.COLUMN_NAME);\n if (row.REFERENCED_COLUMN_NAME) {\n existing.referencedColumns = existing.referencedColumns ?? [];\n existing.referencedColumns.push(row.REFERENCED_COLUMN_NAME);\n }\n } else {\n const type = this.#mapConstraintType(row.CONSTRAINT_TYPE);\n if (!type) continue;\n\n const entry: {\n type: TableConstraint['type'];\n columns: string[];\n referencedTable?: string;\n referencedColumns?: string[];\n } = {\n type,\n columns: [row.COLUMN_NAME],\n };\n\n if (type === 'FOREIGN_KEY' && row.REFERENCED_TABLE_NAME) {\n entry.referencedTable = row.REFERENCED_TABLE_SCHEMA\n ? `${row.REFERENCED_TABLE_SCHEMA}.${row.REFERENCED_TABLE_NAME}`\n : row.REFERENCED_TABLE_NAME;\n if (row.REFERENCED_COLUMN_NAME) {\n entry.referencedColumns = [row.REFERENCED_COLUMN_NAME];\n }\n }\n\n constraintMap.set(row.CONSTRAINT_NAME, entry);\n }\n }\n\n for (const [name, data] of constraintMap) {\n constraints.push({\n name,\n type: data.type,\n columns: data.columns,\n referencedTable: data.referencedTable,\n referencedColumns: data.referencedColumns,\n });\n }\n\n // Get NOT_NULL and DEFAULT constraints from column metadata\n const columnRows = await this.#adapter.runQuery<ColumnRow>(`\n SELECT COLUMN_NAME, IS_NULLABLE, COLUMN_DEFAULT\n FROM INFORMATION_SCHEMA.COLUMNS\n WHERE TABLE_SCHEMA = '${this.#adapter.escapeString(database)}'\n AND TABLE_NAME = '${this.#adapter.escapeString(table)}'\n `);\n\n // Find PK columns to exclude from NOT_NULL (PK columns are implicitly NOT NULL)\n const pkConstraint = constraints.find((c) => c.type === 'PRIMARY_KEY');\n const pkColumns = new Set(pkConstraint?.columns ?? []);\n\n for (const row of columnRows) {\n if (!row.COLUMN_NAME) continue;\n\n // NOT NULL constraint - exclude PK columns which are implicitly NOT NULL\n if (row.IS_NULLABLE === 'NO' && !pkColumns.has(row.COLUMN_NAME)) {\n constraints.push({\n name: `${row.COLUMN_NAME}_not_null`,\n type: 'NOT_NULL',\n columns: [row.COLUMN_NAME],\n });\n }\n\n if (row.COLUMN_DEFAULT !== null) {\n constraints.push({\n name: `${row.COLUMN_NAME}_default`,\n type: 'DEFAULT',\n columns: [row.COLUMN_NAME],\n defaultValue: row.COLUMN_DEFAULT,\n });\n }\n }\n\n // Get CHECK constraints (MySQL 8.0.16+ and MariaDB 10.2.1+)\n try {\n const checkRows = await this.#adapter.runQuery<CheckConstraintRow>(`\n SELECT CONSTRAINT_NAME, CHECK_CLAUSE\n FROM INFORMATION_SCHEMA.CHECK_CONSTRAINTS\n WHERE CONSTRAINT_SCHEMA = '${this.#adapter.escapeString(database)}'\n `);\n\n // Get constraint-to-table mapping\n const checkTableRows = await this.#adapter.runQuery<{\n CONSTRAINT_NAME: string;\n TABLE_NAME: string;\n }>(`\n SELECT CONSTRAINT_NAME, TABLE_NAME\n FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS\n WHERE TABLE_SCHEMA = '${this.#adapter.escapeString(database)}'\n AND TABLE_NAME = '${this.#adapter.escapeString(table)}'\n AND CONSTRAINT_TYPE = 'CHECK'\n `);\n\n const checkTableMap = new Map(\n checkTableRows.map((r) => [r.CONSTRAINT_NAME, r.TABLE_NAME]),\n );\n\n for (const row of checkRows) {\n if (!row.CONSTRAINT_NAME) continue;\n // Only include checks for this table\n if (checkTableMap.get(row.CONSTRAINT_NAME) !== table) continue;\n\n constraints.push({\n name: row.CONSTRAINT_NAME,\n type: 'CHECK',\n definition: row.CHECK_CLAUSE ?? undefined,\n });\n }\n } catch {\n // CHECK_CONSTRAINTS table might not exist in older MySQL versions\n }\n\n return constraints;\n }\n\n #mapConstraintType(type: string | null): TableConstraint['type'] | null {\n switch (type) {\n case 'PRIMARY KEY':\n return 'PRIMARY_KEY';\n case 'UNIQUE':\n return 'UNIQUE';\n case 'FOREIGN KEY':\n return 'FOREIGN_KEY';\n default:\n return null;\n }\n }\n\n async #getCurrentDatabase(): Promise<string> {\n const rows = await this.#adapter.runQuery<{ db: string | null }>(\n 'SELECT DATABASE() AS db',\n );\n return rows[0]?.db ?? '';\n }\n}\n", "import type { Adapter, TableIndex } from '../adapter.ts';\nimport {\n IndexesGrounding,\n type IndexesGroundingConfig,\n} from '../groundings/indexes.grounding.ts';\n\ntype IndexRow = {\n INDEX_NAME: string | null;\n COLUMN_NAME: string | null;\n NON_UNIQUE: number | null;\n INDEX_TYPE: string | null;\n SEQ_IN_INDEX: number | null;\n};\n\n/**\n * MySQL/MariaDB implementation of IndexesGrounding.\n *\n * Uses INFORMATION_SCHEMA.STATISTICS for index metadata.\n */\nexport class MysqlIndexesGrounding extends IndexesGrounding {\n #adapter: Adapter;\n\n constructor(adapter: Adapter, config: IndexesGroundingConfig = {}) {\n super(config);\n this.#adapter = adapter;\n }\n\n protected override async getIndexes(\n tableName: string,\n ): Promise<TableIndex[]> {\n const { schema, table } = this.#adapter.parseTableName(tableName);\n const database = schema || (await this.#getCurrentDatabase());\n\n const rows = await this.#adapter.runQuery<IndexRow>(`\n SELECT\n INDEX_NAME,\n COLUMN_NAME,\n NON_UNIQUE,\n INDEX_TYPE,\n SEQ_IN_INDEX\n FROM INFORMATION_SCHEMA.STATISTICS\n WHERE TABLE_SCHEMA = '${this.#adapter.escapeString(database)}'\n AND TABLE_NAME = '${this.#adapter.escapeString(table)}'\n ORDER BY INDEX_NAME, SEQ_IN_INDEX\n `);\n\n const indexMap = new Map<string, TableIndex>();\n\n for (const row of rows) {\n if (!row.INDEX_NAME) continue;\n\n let index = indexMap.get(row.INDEX_NAME);\n if (!index) {\n index = {\n name: row.INDEX_NAME,\n columns: [],\n unique: row.NON_UNIQUE === 0,\n type: row.INDEX_TYPE ?? undefined,\n };\n indexMap.set(row.INDEX_NAME, index);\n }\n\n if (row.COLUMN_NAME) {\n index.columns.push(row.COLUMN_NAME);\n }\n }\n\n return Array.from(indexMap.values());\n }\n\n async #getCurrentDatabase(): Promise<string> {\n const rows = await this.#adapter.runQuery<{ db: string | null }>(\n 'SELECT DATABASE() AS db',\n );\n return rows[0]?.db ?? '';\n }\n}\n", "import type { Adapter, AdapterInfo } from '../adapter.ts';\nimport {\n InfoGrounding,\n type InfoGroundingConfig,\n} from '../groundings/info.grounding.ts';\n\n/**\n * MySQL/MariaDB implementation of InfoGrounding.\n *\n * Detects whether the database is MySQL or MariaDB based on version string.\n */\nexport class MysqlInfoGrounding extends InfoGrounding {\n #adapter: Adapter;\n\n constructor(adapter: Adapter, config: InfoGroundingConfig = {}) {\n super(config);\n this.#adapter = adapter;\n }\n\n protected override async collectInfo(): Promise<AdapterInfo> {\n const [versionRows, dbRows] = await Promise.all([\n this.#adapter.runQuery<{ version: string }>(\n 'SELECT VERSION() AS version',\n ),\n this.#adapter.runQuery<{ db: string | null }>('SELECT DATABASE() AS db'),\n ]);\n\n const version = versionRows[0]?.version;\n const database = dbRows[0]?.db ?? undefined;\n\n // Detect dialect: MariaDB version strings contain 'MariaDB'\n const isMariadb = version?.toLowerCase().includes('mariadb') ?? false;\n const dialect = isMariadb ? 'mariadb' : 'mysql';\n\n return {\n dialect,\n version,\n database,\n details: {\n parameterPlaceholder: '?',\n },\n };\n }\n}\n", "import {\n Adapter,\n type ExecuteFunction,\n type GroundingFn,\n type ValidateFunction,\n} from '../adapter.ts';\n\nexport type MysqlAdapterOptions = {\n execute: ExecuteFunction;\n validate?: ValidateFunction;\n grounding: GroundingFn[];\n /** Database names to include (defaults to excluding system databases) */\n databases?: string[];\n};\n\nconst MYSQL_ERROR_MAP: Record<string, { type: string; hint: string }> = {\n '1146': {\n type: 'MISSING_TABLE',\n hint: 'Check the database for the correct table name. Include the database prefix if necessary.',\n },\n '1054': {\n type: 'INVALID_COLUMN',\n hint: 'Verify the column exists on the referenced table and use table aliases to disambiguate.',\n },\n '1064': {\n type: 'SYNTAX_ERROR',\n hint: 'There is a SQL syntax error. Review keywords, punctuation, and the overall query shape.',\n },\n '1630': {\n type: 'INVALID_FUNCTION',\n hint: 'The function does not exist or the arguments are invalid.',\n },\n '1305': {\n type: 'INVALID_FUNCTION',\n hint: 'The function or procedure you used is not recognized. Confirm its name and argument types.',\n },\n '1109': {\n type: 'MISSING_TABLE',\n hint: 'Unknown table in the query. Verify table name and database.',\n },\n '1051': {\n type: 'MISSING_TABLE',\n hint: 'Unknown table. Check if the table exists in the current database.',\n },\n};\n\nfunction isMysqlError(\n error: unknown,\n): error is { errno?: number; code?: string; message?: string } {\n return (\n typeof error === 'object' &&\n error !== null &&\n ('errno' in error || 'code' in error)\n );\n}\n\nexport function formatMysqlError(sql: string, error: unknown) {\n const errorMessage =\n error instanceof Error\n ? error.message\n : typeof error === 'string'\n ? error\n : 'Unknown error occurred';\n\n if (isMysqlError(error)) {\n const errorCode = error.errno?.toString() ?? error.code ?? '';\n const metadata = MYSQL_ERROR_MAP[errorCode];\n if (metadata) {\n return {\n error: errorMessage,\n error_type: metadata.type,\n suggestion: metadata.hint,\n sql_attempted: sql,\n };\n }\n }\n\n return {\n error: errorMessage,\n error_type: 'UNKNOWN_ERROR',\n suggestion: 'Review the query and try again',\n sql_attempted: sql,\n };\n}\n\nexport class Mysql extends Adapter {\n #options: MysqlAdapterOptions;\n override readonly grounding: GroundingFn[];\n override readonly defaultSchema: string | undefined = undefined;\n override readonly systemSchemas = [\n 'mysql',\n 'information_schema',\n 'performance_schema',\n 'sys',\n ];\n\n constructor(options: MysqlAdapterOptions) {\n super();\n if (!options || typeof options.execute !== 'function') {\n throw new Error('Mysql adapter requires an execute function.');\n }\n this.#options = {\n ...options,\n databases: options.databases?.length ? options.databases : undefined,\n };\n this.grounding = options.grounding;\n }\n\n override async execute(sql: string) {\n return this.#options.execute(sql);\n }\n\n override async validate(sql: string) {\n const validator: ValidateFunction =\n this.#options.validate ??\n (async (text: string) => {\n await this.#options.execute(`EXPLAIN ${text}`);\n });\n\n try {\n return await validator(sql);\n } catch (error) {\n return JSON.stringify(formatMysqlError(sql, error));\n }\n }\n\n override async runQuery<Row>(sql: string): Promise<Row[]> {\n return this.#runIntrospectionQuery<Row>(sql);\n }\n\n override quoteIdentifier(name: string): string {\n return `\\`${name.replace(/`/g, '``')}\\``;\n }\n\n override escape(value: string): string {\n return value.replace(/`/g, '``');\n }\n\n override buildSampleRowsQuery(\n tableName: string,\n columns: string[] | undefined,\n limit: number,\n ): string {\n const { schema, table } = this.parseTableName(tableName);\n const tableIdentifier = schema\n ? `${this.quoteIdentifier(schema)}.${this.quoteIdentifier(table)}`\n : this.quoteIdentifier(table);\n const columnList = columns?.length\n ? columns.map((c) => this.quoteIdentifier(c)).join(', ')\n : '*';\n return `SELECT ${columnList} FROM ${tableIdentifier} LIMIT ${limit}`;\n }\n\n /**\n * Get the configured databases filter.\n */\n get databases(): string[] | undefined {\n return this.#options.databases;\n }\n\n async #runIntrospectionQuery<Row>(sql: string): Promise<Row[]> {\n const result = await this.#options.execute(sql);\n\n // Handle mysql2 results: [rows, fields]\n if (Array.isArray(result)) {\n // If it's [rows, fields], use the first element\n if (\n result.length >= 1 &&\n Array.isArray(result[0]) &&\n (result.length === 1 ||\n (result.length === 2 && !Array.isArray(result[1]?.[0])))\n ) {\n return result[0] as Row[];\n }\n return result as Row[];\n }\n\n // Handle object with rows property\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 'Mysql adapter execute() must return an array of rows or an object with a rows array when introspecting.',\n );\n }\n}\n\n// Re-export as Mariadb for convenience\nexport { Mysql as Mariadb };\n", "import type { Adapter } from '../adapter.ts';\nimport {\n RowCountGrounding,\n type RowCountGroundingConfig,\n} from '../groundings/row-count.grounding.ts';\n\n/**\n * MySQL/MariaDB implementation of RowCountGrounding.\n *\n * Uses COUNT(*) for accurate row counts.\n */\nexport class MysqlRowCountGrounding extends RowCountGrounding {\n #adapter: Adapter;\n\n constructor(adapter: Adapter, config: RowCountGroundingConfig = {}) {\n super(config);\n this.#adapter = adapter;\n }\n\n protected override async getRowCount(\n tableName: string,\n ): Promise<number | undefined> {\n const { schema, table } = this.#adapter.parseTableName(tableName);\n const database = schema || (await this.#getCurrentDatabase());\n\n const tableIdentifier = `${this.#adapter.quoteIdentifier(database)}.${this.#adapter.quoteIdentifier(table)}`;\n\n try {\n const rows = await this.#adapter.runQuery<{\n count: number | string | bigint | null;\n }>(`SELECT COUNT(*) AS count FROM ${tableIdentifier}`);\n\n return this.#toNumber(rows[0]?.count);\n } catch {\n return undefined;\n }\n }\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 async #getCurrentDatabase(): Promise<string> {\n const rows = await this.#adapter.runQuery<{ db: string | null }>(\n 'SELECT DATABASE() AS db',\n );\n return rows[0]?.db ?? '';\n }\n}\n", "import type { Adapter, Relationship, Table } from '../adapter.ts';\nimport {\n TableGrounding,\n type TableGroundingConfig,\n} from '../groundings/table.grounding.ts';\nimport type { Mysql } from './mysql.ts';\n\ntype ColumnRow = {\n COLUMN_NAME: string | null;\n DATA_TYPE: string | null;\n COLUMN_TYPE: string | null;\n};\n\ntype RelationshipRow = {\n TABLE_SCHEMA: string | null;\n TABLE_NAME: string | null;\n COLUMN_NAME: string | null;\n REFERENCED_TABLE_SCHEMA: string | null;\n REFERENCED_TABLE_NAME: string | null;\n REFERENCED_COLUMN_NAME: string | null;\n CONSTRAINT_NAME: string | null;\n};\n\nexport interface MysqlTableGroundingConfig extends TableGroundingConfig {\n /** Databases to include (defaults to excluding system databases) */\n databases?: string[];\n}\n\n/**\n * MySQL/MariaDB implementation of TableGrounding.\n *\n * Uses INFORMATION_SCHEMA for introspection which is compatible\n * with both MySQL and MariaDB.\n */\nexport class MysqlTableGrounding extends TableGrounding {\n #adapter: Adapter;\n #databases?: string[];\n\n constructor(adapter: Adapter, config: MysqlTableGroundingConfig = {}) {\n super(config);\n this.#adapter = adapter;\n this.#databases = config.databases ?? (adapter as Mysql).databases;\n }\n\n protected override async getAllTableNames(): Promise<string[]> {\n const rows = await this.#adapter.runQuery<{ name: string }>(`\n SELECT DISTINCT CONCAT(TABLE_SCHEMA, '.', TABLE_NAME) AS name\n FROM INFORMATION_SCHEMA.TABLES\n WHERE TABLE_TYPE = 'BASE TABLE'\n ${this.#buildDatabaseFilter('TABLE_SCHEMA')}\n ORDER BY name\n `);\n return rows.map((r) => r.name);\n }\n\n protected override async getTable(tableName: string): Promise<Table> {\n const { schema, table } = this.#adapter.parseTableName(tableName);\n const database = schema || (await this.#getCurrentDatabase());\n\n const columns = await this.#adapter.runQuery<ColumnRow>(`\n SELECT COLUMN_NAME, DATA_TYPE, COLUMN_TYPE\n FROM INFORMATION_SCHEMA.COLUMNS\n WHERE TABLE_SCHEMA = '${this.#adapter.escapeString(database)}'\n AND TABLE_NAME = '${this.#adapter.escapeString(table)}'\n ORDER BY ORDINAL_POSITION\n `);\n\n return {\n name: tableName,\n schema: database,\n rawName: table,\n columns: columns.map((col) => ({\n name: col.COLUMN_NAME ?? 'unknown',\n type: col.DATA_TYPE ?? 'unknown',\n })),\n };\n }\n\n protected override async findOutgoingRelations(\n tableName: string,\n ): Promise<Relationship[]> {\n const { schema, table } = this.#adapter.parseTableName(tableName);\n const database = schema || (await this.#getCurrentDatabase());\n\n const rows = await this.#adapter.runQuery<RelationshipRow>(`\n SELECT\n kcu.CONSTRAINT_NAME,\n kcu.TABLE_SCHEMA,\n kcu.TABLE_NAME,\n kcu.COLUMN_NAME,\n kcu.REFERENCED_TABLE_SCHEMA,\n kcu.REFERENCED_TABLE_NAME,\n kcu.REFERENCED_COLUMN_NAME\n FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu\n WHERE kcu.TABLE_SCHEMA = '${this.#adapter.escapeString(database)}'\n AND kcu.TABLE_NAME = '${this.#adapter.escapeString(table)}'\n AND kcu.REFERENCED_TABLE_NAME IS NOT NULL\n ORDER BY kcu.CONSTRAINT_NAME, kcu.ORDINAL_POSITION\n `);\n\n return this.#groupRelationships(rows);\n }\n\n protected override async findIncomingRelations(\n tableName: string,\n ): Promise<Relationship[]> {\n const { schema, table } = this.#adapter.parseTableName(tableName);\n const database = schema || (await this.#getCurrentDatabase());\n\n const rows = await this.#adapter.runQuery<RelationshipRow>(`\n SELECT\n kcu.CONSTRAINT_NAME,\n kcu.TABLE_SCHEMA,\n kcu.TABLE_NAME,\n kcu.COLUMN_NAME,\n kcu.REFERENCED_TABLE_SCHEMA,\n kcu.REFERENCED_TABLE_NAME,\n kcu.REFERENCED_COLUMN_NAME\n FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu\n WHERE kcu.REFERENCED_TABLE_SCHEMA = '${this.#adapter.escapeString(database)}'\n AND kcu.REFERENCED_TABLE_NAME = '${this.#adapter.escapeString(table)}'\n ORDER BY kcu.CONSTRAINT_NAME, kcu.ORDINAL_POSITION\n `);\n\n return this.#groupRelationships(rows);\n }\n\n #groupRelationships(rows: RelationshipRow[]): Relationship[] {\n const relationships = new Map<string, Relationship>();\n\n for (const row of rows) {\n if (\n !row.TABLE_NAME ||\n !row.REFERENCED_TABLE_NAME ||\n !row.CONSTRAINT_NAME\n ) {\n continue;\n }\n\n const schema = row.TABLE_SCHEMA ?? '';\n const referencedSchema = row.REFERENCED_TABLE_SCHEMA ?? '';\n const key = `${schema}.${row.TABLE_NAME}:${row.CONSTRAINT_NAME}`;\n\n const relationship = relationships.get(key) ?? {\n table: `${schema}.${row.TABLE_NAME}`,\n from: [],\n referenced_table: `${referencedSchema}.${row.REFERENCED_TABLE_NAME}`,\n to: [],\n };\n\n relationship.from.push(row.COLUMN_NAME ?? 'unknown');\n relationship.to.push(row.REFERENCED_COLUMN_NAME ?? 'unknown');\n\n relationships.set(key, relationship);\n }\n\n return Array.from(relationships.values());\n }\n\n #buildDatabaseFilter(columnName: string): string {\n if (this.#databases && this.#databases.length > 0) {\n const values = this.#databases\n .map((db) => `'${this.#adapter.escapeString(db)}'`)\n .join(', ');\n return `AND ${columnName} IN (${values})`;\n }\n\n // Exclude system databases by default\n const systemDbs = this.#adapter.systemSchemas\n .map((db) => `'${this.#adapter.escapeString(db)}'`)\n .join(', ');\n return `AND ${columnName} NOT IN (${systemDbs})`;\n }\n\n async #getCurrentDatabase(): Promise<string> {\n const rows = await this.#adapter.runQuery<{ db: string | null }>(\n 'SELECT DATABASE() AS db',\n );\n return rows[0]?.db ?? '';\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('views');\n this.#filter = config.filter;\n }\n\n /** Get all view names in the database */\n protected abstract getAllViewNames(): Promise<string[]>;\n\n /** Get full view metadata for a single view */\n protected abstract getView(viewName: string): Promise<View>;\n\n /**\n * Execute the grounding process.\n * Writes discovered views to the context.\n */\n async execute(ctx: GroundingContext) {\n const viewNames = await this.applyFilter();\n const views = await Promise.all(\n viewNames.map((name) => this.getView(name)),\n );\n ctx.views.push(...views);\n return () => this.#describe(views);\n }\n\n #describe(views: View[]): string {\n if (!views.length) {\n return 'No views available.';\n }\n\n return views\n .map((view) => {\n const columns = view.columns\n .map((column) => {\n const annotations: string[] = [];\n if (column.kind === 'LowCardinality' && column.values?.length) {\n annotations.push(`LowCardinality: ${column.values.join(', ')}`);\n }\n if (column.stats) {\n const statParts: string[] = [];\n if (column.stats.min != null || column.stats.max != null) {\n const minText = column.stats.min ?? 'n/a';\n const maxText = column.stats.max ?? 'n/a';\n statParts.push(`range ${minText} \u2192 ${maxText}`);\n }\n if (\n column.stats.nullFraction != null &&\n Number.isFinite(column.stats.nullFraction)\n ) {\n const percent =\n Math.round(column.stats.nullFraction * 1000) / 10;\n statParts.push(`null\u2248${percent}%`);\n }\n if (statParts.length) {\n annotations.push(statParts.join(', '));\n }\n }\n const annotationText = annotations.length\n ? ` [${annotations.join(', ')}]`\n : '';\n return ` - ${column.name} (${column.type})${annotationText}`;\n })\n .join('\\n');\n\n const definition = view.definition\n ? `\\n Definition: ${view.definition.length > 200 ? view.definition.slice(0, 200) + '...' : view.definition}`\n : '';\n\n return `- View: ${view.name}${definition}\\n Columns:\\n${columns}`;\n })\n .join('\\n\\n');\n }\n\n /**\n * Apply the filter to get view names.\n * If filter is an explicit array, skip querying all view names.\n */\n protected async applyFilter(): Promise<string[]> {\n const filter = this.#filter;\n if (Array.isArray(filter)) {\n return filter;\n }\n const names = await this.getAllViewNames();\n if (!filter) {\n return names;\n }\n if (filter instanceof RegExp) {\n return names.filter((name) => filter.test(name));\n }\n return names.filter(filter);\n }\n}\n", "import type { Adapter } from '../adapter.ts';\nimport {\n type View,\n ViewGrounding,\n type ViewGroundingConfig,\n} from '../groundings/view.grounding.ts';\nimport type { Mysql } from './mysql.ts';\n\ntype ColumnRow = {\n COLUMN_NAME: string | null;\n DATA_TYPE: string | null;\n};\n\ntype ViewRow = {\n VIEW_DEFINITION: string | null;\n};\n\nexport interface MysqlViewGroundingConfig extends ViewGroundingConfig {\n /** Databases to include (defaults to excluding system databases) */\n databases?: string[];\n}\n\n/**\n * MySQL/MariaDB implementation of ViewGrounding.\n *\n * Uses INFORMATION_SCHEMA for view introspection.\n */\nexport class MysqlViewGrounding extends ViewGrounding {\n #adapter: Adapter;\n #databases?: string[];\n\n constructor(adapter: Adapter, config: MysqlViewGroundingConfig = {}) {\n super(config);\n this.#adapter = adapter;\n this.#databases = config.databases ?? (adapter as Mysql).databases;\n }\n\n protected override async getAllViewNames(): Promise<string[]> {\n const rows = await this.#adapter.runQuery<{ name: string }>(`\n SELECT DISTINCT CONCAT(TABLE_SCHEMA, '.', TABLE_NAME) AS name\n FROM INFORMATION_SCHEMA.VIEWS\n WHERE 1=1\n ${this.#buildDatabaseFilter('TABLE_SCHEMA')}\n ORDER BY name\n `);\n return rows.map((r) => r.name);\n }\n\n protected override async getView(viewName: string): Promise<View> {\n const { schema, table } = this.#adapter.parseTableName(viewName);\n const database = schema || (await this.#getCurrentDatabase());\n\n // Get columns\n const columns = await this.#adapter.runQuery<ColumnRow>(`\n SELECT COLUMN_NAME, DATA_TYPE\n FROM INFORMATION_SCHEMA.COLUMNS\n WHERE TABLE_SCHEMA = '${this.#adapter.escapeString(database)}'\n AND TABLE_NAME = '${this.#adapter.escapeString(table)}'\n ORDER BY ORDINAL_POSITION\n `);\n\n // Get view definition\n const viewRows = await this.#adapter.runQuery<ViewRow>(`\n SELECT VIEW_DEFINITION\n FROM INFORMATION_SCHEMA.VIEWS\n WHERE TABLE_SCHEMA = '${this.#adapter.escapeString(database)}'\n AND TABLE_NAME = '${this.#adapter.escapeString(table)}'\n `);\n\n return {\n name: viewName,\n schema: database,\n rawName: table,\n definition: viewRows[0]?.VIEW_DEFINITION ?? undefined,\n columns: columns.map((col) => ({\n name: col.COLUMN_NAME ?? 'unknown',\n type: col.DATA_TYPE ?? 'unknown',\n })),\n };\n }\n\n #buildDatabaseFilter(columnName: string): string {\n if (this.#databases && this.#databases.length > 0) {\n const values = this.#databases\n .map((db) => `'${this.#adapter.escapeString(db)}'`)\n .join(', ');\n return `AND ${columnName} IN (${values})`;\n }\n\n // Exclude system databases by default\n const systemDbs = this.#adapter.systemSchemas\n .map((db) => `'${this.#adapter.escapeString(db)}'`)\n .join(', ');\n return `AND ${columnName} NOT IN (${systemDbs})`;\n }\n\n async #getCurrentDatabase(): Promise<string> {\n const rows = await this.#adapter.runQuery<{ db: string | null }>(\n 'SELECT DATABASE() AS db',\n );\n return rows[0]?.db ?? '';\n }\n}\n", "import { type Adapter } from '../adapter.ts';\nimport { type ColumnStatsGroundingConfig } from '../groundings/column-stats.grounding.ts';\nimport { type ColumnValuesGroundingConfig } from '../groundings/column-values.grounding.ts';\nimport { type ConstraintGroundingConfig } from '../groundings/constraint.grounding.ts';\nimport { type IndexesGroundingConfig } from '../groundings/indexes.grounding.ts';\nimport { type InfoGroundingConfig } from '../groundings/info.grounding.ts';\nimport {\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 { MysqlColumnStatsGrounding } from './column-stats.mysql.grounding.ts';\nimport { MysqlColumnValuesGrounding } from './column-values.mysql.grounding.ts';\nimport { MysqlConstraintGrounding } from './constraint.mysql.grounding.ts';\nimport { MysqlIndexesGrounding } from './indexes.mysql.grounding.ts';\nimport { MysqlInfoGrounding } from './info.mysql.grounding.ts';\nimport { Mariadb, Mysql } from './mysql.ts';\nimport { MysqlRowCountGrounding } from './row-count.mysql.grounding.ts';\nimport { MysqlTableGrounding } from './table.mysql.grounding.ts';\nimport { MysqlViewGrounding } from './view.mysql.grounding.ts';\n\nexport * from './mysql.ts';\n\nexport function tables(config: TableGroundingConfig = {}) {\n return (adapter: Adapter) => new MysqlTableGrounding(adapter, config);\n}\n\nexport function info(config: InfoGroundingConfig = {}) {\n return (adapter: Adapter) => new MysqlInfoGrounding(adapter, config);\n}\n\nexport function views(config: ViewGroundingConfig = {}) {\n return (adapter: Adapter) => {\n return new MysqlViewGrounding(adapter, config);\n };\n}\n\nexport function columnStats(config: ColumnStatsGroundingConfig = {}) {\n return (adapter: Adapter) => {\n return new MysqlColumnStatsGrounding(adapter, config);\n };\n}\n\nexport function columnValues(config: ColumnValuesGroundingConfig = {}) {\n return (adapter: Adapter) => {\n return new MysqlColumnValuesGrounding(adapter, config);\n };\n}\n\nexport function indexes(config: IndexesGroundingConfig = {}) {\n return (adapter: Adapter) => {\n return new MysqlIndexesGrounding(adapter, config);\n };\n}\n\nexport function rowCount(config: RowCountGroundingConfig = {}) {\n return (adapter: Adapter) => {\n return new MysqlRowCountGrounding(adapter, config);\n };\n}\n\nexport function constraints(config: ConstraintGroundingConfig = {}) {\n return (adapter: Adapter) => {\n return new MysqlConstraintGrounding(adapter, config);\n };\n}\n\nexport function report(config: ReportGroundingConfig = {}) {\n return (adapter: Adapter) => new ReportGrounding(adapter, config);\n}\n\nexport default {\n tables,\n info,\n views,\n columnStats,\n columnValues,\n indexes,\n rowCount,\n constraints,\n report,\n Mysql,\n Mariadb,\n};\n"],
5
- "mappings": ";AA+CO,SAAS,yBAA2C;AACzD,SAAO;AAAA,IACL,QAAQ,CAAC;AAAA,IACT,OAAO,CAAC;AAAA,IACR,eAAe,CAAC;AAAA,IAChB,MAAM;AAAA,EACR;AACF;;;AC0DO,IAAe,UAAf,MAAuB;AAAA,EAc5B,MAAM,WAAW,MAAM,uBAAuB,GAAG;AAC/C,UAAM,QAAoD,CAAC;AAC3D,eAAW,MAAM,KAAK,WAAW;AAC/B,YAAM,YAAY,GAAG,IAAI;AACzB,YAAM,KAAK;AAAA,QACT,KAAK,UAAU;AAAA,QACf,IAAI,MAAM,UAAU,QAAQ,GAAG;AAAA,MACjC,CAAC;AAAA,IACH;AACA,WAAO,MACJ,IAAI,CAAC,EAAE,IAAI,IAAI,MAAM;AACpB,YAAM,cAAc,GAAG;AACvB,UAAI,gBAAgB,MAAM;AACxB,eAAO;AAAA,MACT;AACA,aAAO,IAAI,GAAG;AAAA,EAAM,WAAW;AAAA,IAAO,GAAG;AAAA,IAC3C,CAAC,EACA,KAAK,IAAI;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EA+BA,SAAS,OAAoC;AAC3C,QAAI,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,GAAG;AACvD,aAAO;AAAA,IACT;AACA,QAAI,OAAO,UAAU,UAAU;AAC7B,aAAO,OAAO,KAAK;AAAA,IACrB;AACA,QAAI,OAAO,UAAU,YAAY,MAAM,KAAK,MAAM,IAAI;AACpD,YAAM,SAAS,OAAO,KAAK;AAC3B,aAAO,OAAO,SAAS,MAAM,IAAI,SAAS;AAAA,IAC5C;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,MAAiD;AAC9D,QAAI,KAAK,SAAS,GAAG,GAAG;AACtB,YAAM,CAAC,QAAQ,GAAG,IAAI,IAAI,KAAK,MAAM,GAAG;AACxC,aAAO,EAAE,QAAQ,OAAO,KAAK,KAAK,GAAG,EAAE;AAAA,IACzC;AACA,WAAO,EAAE,QAAQ,KAAK,iBAAiB,IAAI,OAAO,KAAK;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAa,OAAuB;AAClC,WAAO,MAAM,QAAQ,MAAM,IAAI;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,kBAAkB,YAAoB,gBAAmC;AACvE,QAAI,kBAAkB,eAAe,SAAS,GAAG;AAC/C,YAAM,SAAS,eACZ,IAAI,CAAC,MAAM,IAAI,KAAK,aAAa,CAAC,CAAC,GAAG,EACtC,KAAK,IAAI;AACZ,aAAO,OAAO,UAAU,QAAQ,MAAM;AAAA,IACxC;AACA,QAAI,KAAK,cAAc,SAAS,GAAG;AACjC,YAAM,SAAS,KAAK,cACjB,IAAI,CAAC,MAAM,IAAI,KAAK,aAAa,CAAC,CAAC,GAAG,EACtC,KAAK,IAAI;AACZ,aAAO,OAAO,UAAU,YAAY,MAAM;AAAA,IAC5C;AACA,WAAO;AAAA,EACT;AACF;;;AC/MO,IAAe,oBAAf,MAAiC;AAAA,EACtC;AAAA,EACA,YAAY,KAAa;AACvB,SAAK,MAAM;AAAA,EACb;AAGF;;;ACRO,IAAe,uBAAf,cAA4C,kBAAkB;AAAA,EACnE,YAAY,SAAqC,CAAC,GAAG;AACnD,UAAM,cAAc;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,MAAM,QAAQ,KAAuB;AAEnC,UAAM,gBAAmC,CAAC,GAAG,IAAI,QAAQ,GAAG,IAAI,KAAK;AACrE,eAAW,aAAa,eAAe;AACrC,iBAAW,UAAU,UAAU,SAAS;AAEtC,YAAI;AACF,gBAAM,QAAQ,MAAM,KAAK,aAAa,UAAU,MAAM,MAAM;AAC5D,cAAI,OAAO;AACT,mBAAO,QAAQ;AAAA,UACjB;AAAA,QACF,SAAS,OAAO;AAEd,kBAAQ;AAAA,YACN;AAAA,YACA,UAAU;AAAA,YACV,OAAO;AAAA,YACP;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,WAAO,MAAM,KAAK,UAAU;AAAA,EAC9B;AAAA,EAEA,YAAY;AACV,WAAO;AAAA,EACT;AACF;;;AChCO,IAAe,wBAAf,cAA6C,kBAAkB;AAAA,EAC1D;AAAA,EAEV,YAAY,SAAsC,CAAC,GAAG;AACpD,UAAM,eAAe;AACrB,SAAK,sBAAsB,OAAO,uBAAuB;AAAA,EAC3D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAgB,kBACd,YACA,SAC+B;AAC/B,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBU,qBACR,YACA,YACsB;AACtB,QAAI,WAAW,SAAS,WAAW,CAAC,WAAW,YAAY;AACzD,aAAO;AAAA,IACT;AAGA,QAAI,WAAW,WAAW,CAAC,WAAW,QAAQ,SAAS,UAAU,GAAG;AAClE,aAAO;AAAA,IACT;AAEA,UAAM,MAAM,WAAW;AACvB,UAAM,aAAa,KAAK,YAAY,UAAU;AAI9C,UAAM,aAAa,cAAc,UAAU;AAG3C,UAAM,UAAU,IAAI;AAAA,MAClB,IAAI,OAAO,GAAG,UAAU,2BAA2B,GAAG;AAAA,IACxD;AACA,QAAI,SAAS;AACX,aAAO,KAAK,oBAAoB,QAAQ,CAAC,CAAC;AAAA,IAC5C;AAGA,UAAM,WAAW,IAAI;AAAA,MACnB,IAAI;AAAA,QACF,GAAG,UAAU;AAAA,QACb;AAAA,MACF;AAAA,IACF;AACA,QAAI,UAAU;AACZ,aAAO,KAAK,oBAAoB,SAAS,CAAC,CAAC;AAAA,IAC7C;AAGA,UAAM,YAAY,IAAI;AAAA,MACpB,MAAM,KAAK,YAAY,UAAU,CAAC;AAAA,MAClC;AAAA,IACF;AACA,UAAM,YAAY,CAAC,GAAG,IAAI,SAAS,SAAS,CAAC;AAC7C,QAAI,UAAU,UAAU,GAAG;AACzB,aAAO,UAAU,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;AAAA,IAClC;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,oBAAoB,OAAqC;AAC/D,UAAM,SAAmB,CAAC;AAE1B,UAAM,UAAU,MAAM,SAAS,YAAY;AAC3C,eAAW,SAAS,SAAS;AAC3B,aAAO,KAAK,MAAM,CAAC,CAAC;AAAA,IACtB;AACA,WAAO,OAAO,SAAS,IAAI,SAAS;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAY,KAAqB;AACvC,WAAO,IAAI,QAAQ,uBAAuB,MAAM;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA,EAKQ,SAAS,KAAuB,MAAiC;AACvE,WAAO,IAAI,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,QAAQ,KAAuB;AAEnC,UAAM,gBAAmC,CAAC,GAAG,IAAI,QAAQ,GAAG,IAAI,KAAK;AAErE,eAAW,aAAa,eAAe;AACrC,YAAM,QAAQ,KAAK,SAAS,KAAK,UAAU,IAAI;AAE/C,iBAAW,UAAU,UAAU,SAAS;AACtC,YAAI;AACF,gBAAM,SAAS,MAAM,KAAK;AAAA,YACxB,UAAU;AAAA,YACV;AAAA,YACA,OAAO;AAAA,UACT;AACA,cAAI,QAAQ;AACV,mBAAO,OAAO,OAAO;AACrB,mBAAO,SAAS,OAAO;AAAA,UACzB;AAAA,QACF,SAAS,OAAO;AACd,kBAAQ;AAAA,YACN;AAAA,YACA,UAAU;AAAA,YACV,OAAO;AAAA,YACP;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO,MAAM,KAAK,UAAU;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,oBACZ,WACA,QACAA,cACyC;AAEzC,UAAM,aAAa,MAAM,KAAK,kBAAkB,WAAW,MAAM;AACjE,QAAI,YAAY,QAAQ;AACtB,aAAO,EAAE,MAAM,QAAQ,QAAQ,WAAW;AAAA,IAC5C;AAGA,QAAIA,cAAa;AACf,iBAAW,cAAcA,cAAa;AACpC,cAAM,cAAc,KAAK,qBAAqB,YAAY,OAAO,IAAI;AACrE,YAAI,aAAa,QAAQ;AACvB,iBAAO,EAAE,MAAM,QAAQ,QAAQ,YAAY;AAAA,QAC7C;AAAA,MACF;AAAA,IACF;AAGA,UAAM,gBAAgB,MAAM,KAAK,sBAAsB,WAAW,MAAM;AACxE,QAAI,eAAe,QAAQ;AACzB,aAAO,EAAE,MAAM,kBAAkB,QAAQ,cAAc;AAAA,IACzD;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,YAAY;AACV,WAAO;AAAA,EACT;AACF;;;ACxMO,IAAe,sBAAf,cAA2C,kBAAkB;AAAA,EAClE,YAAY,SAAoC,CAAC,GAAG;AAClD,UAAM,aAAa;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAM,QAAQ,KAAuB;AACnC,eAAW,SAAS,IAAI,QAAQ;AAC9B,UAAI;AACF,cAAM,cAAc,MAAM,KAAK,eAAe,MAAM,IAAI;AAAA,MAC1D,SAAS,OAAO;AAEd,gBAAQ,KAAK,oCAAoC,MAAM,MAAM,KAAK;AAAA,MACpE;AAAA,IACF;AAEA,WAAO,MAAM;AAAA,EACf;AACF;;;AC7BO,IAAe,mBAAf,cAAwC,kBAAkB;AAAA,EAC/D,YAAY,SAAiC,CAAC,GAAG;AAC/C,UAAM,SAAS;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,QAAQ,KAAuB;AACnC,eAAW,SAAS,IAAI,QAAQ;AAC9B,YAAM,UAAU,MAAM,KAAK,WAAW,MAAM,IAAI;AAEhD,iBAAW,SAAS,MAAM,WAAW,CAAC,GAAG;AACvC,mBAAW,WAAW,MAAM,SAAS;AACnC,gBAAM,SAAS,MAAM,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,OAAO;AAC3D,cAAI,QAAQ;AACV,mBAAO,YAAY;AAAA,UACrB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO,MAAM;AAAA,EACf;AACF;;;AC/BO,IAAe,gBAAf,cAAqC,kBAAkB;AAAA,EAC5D,YAAY,SAA8B,CAAC,GAAG;AAC5C,UAAM,cAAc;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,QAAQ,KAAuB;AACnC,QAAI,OAAO,MAAM,KAAK,YAAY;AAClC,UAAM,QAAQ,CAAC,YAAY,IAAI,KAAK,WAAW,SAAS,EAAE;AAC1D,QAAI,IAAI,KAAK,SAAS;AACpB,YAAM,KAAK,YAAY,IAAI,KAAK,OAAO,EAAE;AAAA,IAC3C;AACA,QAAI,IAAI,KAAK,UAAU;AACrB,YAAM,KAAK,aAAa,IAAI,KAAK,QAAQ,EAAE;AAAA,IAC7C;AACA,QAAI,IAAI,KAAK,WAAW,OAAO,KAAK,IAAI,KAAK,OAAO,EAAE,QAAQ;AAC5D,YAAM,KAAK,YAAY,KAAK,UAAU,IAAI,KAAK,OAAO,CAAC,EAAE;AAAA,IAC3D;AACA,WAAO,MAAM,MAAM,KAAK,IAAI;AAAA,EAC9B;AACF;;;AC/CA,SAAS,YAAY;AACrB,SAAS,YAAY;AACrB,OAAO,YAAY;AACnB,OAAO,OAAO;AAEd;AAAA,EAEE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AA0BP,IAAM,cAAc,MAAqC;AAAA,EACvD,MAAM;AAAA,EACN,OAAO,KAAK,oBAAoB;AAAA,EAChC,QAAQ,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAwBd,OAAO;AAAA,IACL,gBAAgB,KAAK;AAAA,MACnB,aACE;AAAA,MACF,aAAa,EAAE,OAAO;AAAA,QACpB,KAAK,EAAE,OAAO,EAAE,SAAS,6BAA6B;AAAA,QACtD,SAAS,EACN,OAAO,EACP,SAAS,uDAAuD;AAAA,MACrE,CAAC;AAAA,MACD,SAAS,CAAC,EAAE,IAAI,GAAG,YAAY;AAC7B,cAAM,QAAQ,QAA8B,OAAO;AACnD,eAAO,MAAM,QAAQ,QAAQ,GAAG;AAAA,MAClC;AAAA,IACF,CAAC;AAAA,EACH;AACF,CAAC;AAYM,IAAM,kBAAN,cAA8B,kBAAkB;AAAA,EACrD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA,YAAY,SAAkB,SAAgC,CAAC,GAAG;AAChE,UAAM,kBAAkB;AACxB,SAAK,WAAW;AAChB,SAAK,SAAS,OAAO,SAAS,KAAK,oBAAoB;AACvD,SAAK,SAAS,OAAO;AACrB,SAAK,gBAAgB,OAAO,gBAAgB;AAAA,EAC9C;AAAA,EAEA,MAAM,QAAQ,KAAqD;AAEjE,QAAI,CAAC,KAAK,iBAAiB,KAAK,QAAQ;AACtC,YAAM,SAAS,MAAM,KAAK,OAAO,IAAI;AACrC,UAAI,QAAQ;AACV,YAAI,SAAS;AACb,eAAO,MAAM;AAAA,MACf;AAAA,IACF;AAGA,UAAMC,UAAS,MAAM,KAAK,gBAAgB;AAC1C,QAAI,SAASA;AAGb,QAAI,KAAK,QAAQ;AACf,YAAM,KAAK,OAAO,IAAIA,OAAM;AAAA,IAC9B;AAEA,WAAO,MAAMA;AAAA,EACf;AAAA,EAEA,MAAM,kBAAmC;AACvC,UAAM,EAAE,KAAK,IAAI,MAAM;AAAA,MACrB,YAAY,MAAM,EAAE,OAAO,KAAK,OAAO,CAAC;AAAA,MACxC;AAAA,QACE;AAAA,UACE;AAAA,QACF;AAAA,MACF;AAAA,MACA,EAAE,SAAS,KAAK,SAAS;AAAA,IAC3B;AAEA,WAAO;AAAA,EACT;AACF;;;ACzHO,IAAe,oBAAf,cAAyC,kBAAkB;AAAA,EAChE,YAAY,SAAkC,CAAC,GAAG;AAChD,UAAM,YAAY;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAM,QAAQ,KAAuB;AACnC,eAAW,SAAS,IAAI,QAAQ;AAC9B,YAAM,QAAQ,MAAM,KAAK,YAAY,MAAM,IAAI;AAC/C,UAAI,SAAS,MAAM;AACjB,cAAM,WAAW;AACjB,cAAM,WAAW,KAAK,kBAAkB,KAAK;AAAA,MAC/C;AAAA,IACF;AAEA,WAAO,MAAM;AAAA,EACf;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,OAAkC;AAClD,QAAI,QAAQ,IAAK,QAAO;AACxB,QAAI,QAAQ,IAAM,QAAO;AACzB,QAAI,QAAQ,IAAO,QAAO;AAC1B,QAAI,QAAQ,IAAQ,QAAO;AAC3B,WAAO;AAAA,EACT;AACF;;;AC1DA,OAAO,eAAe;AAsCf,IAAe,iBAAf,cAAsC,kBAAkB;AAAA,EAC7D;AAAA,EACA;AAAA,EACA;AAAA,EAEA,YAAY,SAA+B,CAAC,GAAG;AAC7C,UAAM,QAAQ;AACd,SAAK,UAAU,OAAO;AACtB,SAAK,WAAW,OAAO;AACvB,SAAK,YAAY,OAAO;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBA,MAAM,QAAQ,KAAuB;AACnC,UAAM,aAAa,MAAM,KAAK,YAAY;AAC1C,UAAM,UAAU,KAAK;AACrB,UAAM,WAAW,KAAK;AAGtB,QAAI,CAAC,WAAW,CAAC,UAAU;AACzB,YAAMC,UAAS,MAAM,QAAQ;AAAA,QAC3B,WAAW,IAAI,CAAC,SAAS,KAAK,SAAS,IAAI,CAAC;AAAA,MAC9C;AACA,UAAI,OAAO,KAAK,GAAGA,OAAM;AACzB,aAAO,MAAM,KAAK,gBAAgBA,OAAM;AAAA,IAC1C;AAEA,UAAMA,UAAgC,CAAC;AACvC,UAAM,mBAAmC,CAAC;AAC1C,UAAM,oBAAoB,oBAAI,IAAY;AAG1C,UAAM,eAAuD,CAAC;AAC9D,UAAM,gBAAwD,CAAC;AAC/D,UAAM,iBAAiB,oBAAI,IAAY;AACvC,UAAM,kBAAkB,oBAAI,IAAY;AAGxC,eAAW,QAAQ,YAAY;AAC7B,UAAI,QAAS,cAAa,KAAK,EAAE,MAAM,OAAO,EAAE,CAAC;AACjD,UAAI,SAAU,eAAc,KAAK,EAAE,MAAM,OAAO,EAAE,CAAC;AAAA,IACrD;AAGA,UAAM,eAAe,YAAY,OAAO,WAAW,WAAW;AAC9D,WAAO,aAAa,SAAS,GAAG;AAC9B,YAAM,OAAO,aAAa,MAAM;AAChC,UAAI,CAAC,KAAM;AACX,YAAM,EAAE,MAAM,MAAM,IAAI;AAExB,UAAI,eAAe,IAAI,IAAI,EAAG;AAC9B,qBAAe,IAAI,IAAI;AAEvB,UAAI,CAACA,QAAO,IAAI,GAAG;AACjB,QAAAA,QAAO,IAAI,IAAI,MAAM,KAAK,SAAS,IAAI;AAAA,MACzC;AAEA,UAAI,QAAQ,cAAc;AACxB,cAAM,OAAO,MAAM,KAAK,sBAAsB,IAAI;AAClD,mBAAW,OAAO,MAAM;AACtB,eAAK,gBAAgB,KAAK,kBAAkB,iBAAiB;AAC7D,cAAI,CAAC,eAAe,IAAI,IAAI,gBAAgB,GAAG;AAC7C,yBAAa,KAAK,EAAE,MAAM,IAAI,kBAAkB,OAAO,QAAQ,EAAE,CAAC;AAAA,UACpE;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,UAAM,gBAAgB,aAAa,OAAO,WAAW,YAAY;AACjE,WAAO,cAAc,SAAS,GAAG;AAC/B,YAAM,OAAO,cAAc,MAAM;AACjC,UAAI,CAAC,KAAM;AACX,YAAM,EAAE,MAAM,MAAM,IAAI;AAExB,UAAI,gBAAgB,IAAI,IAAI,EAAG;AAC/B,sBAAgB,IAAI,IAAI;AAExB,UAAI,CAACA,QAAO,IAAI,GAAG;AACjB,QAAAA,QAAO,IAAI,IAAI,MAAM,KAAK,SAAS,IAAI;AAAA,MACzC;AAEA,UAAI,QAAQ,eAAe;AACzB,cAAM,OAAO,MAAM,KAAK,sBAAsB,IAAI;AAClD,mBAAW,OAAO,MAAM;AACtB,eAAK,gBAAgB,KAAK,kBAAkB,iBAAiB;AAC7D,cAAI,CAAC,gBAAgB,IAAI,IAAI,KAAK,GAAG;AACnC,0BAAc,KAAK,EAAE,MAAM,IAAI,OAAO,OAAO,QAAQ,EAAE,CAAC;AAAA,UAC1D;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,UAAM,aAAa,OAAO,OAAOA,OAAM;AACvC,QAAI,OAAO,KAAK,GAAG,UAAU;AAC7B,QAAI,cAAc,KAAK,GAAG,gBAAgB;AAC1C,WAAO,MAAM,KAAK,gBAAgB,UAAU;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAgB,cAAiC;AAC/C,UAAM,SAAS,KAAK;AACpB,QAAI,MAAM,QAAQ,MAAM,GAAG;AACzB,aAAO;AAAA,IACT;AACA,UAAM,QAAQ,MAAM,KAAK,iBAAiB;AAC1C,QAAI,CAAC,QAAQ;AACX,aAAO;AAAA,IACT;AACA,QAAI,kBAAkB,QAAQ;AAC5B,aAAO,MAAM,OAAO,CAAC,SAAS,OAAO,KAAK,IAAI,CAAC;AAAA,IACjD;AACA,WAAO,MAAM,OAAO,MAAM;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKU,gBACR,KACA,KACA,MACM;AACN,UAAM,MAAM,GAAG,IAAI,KAAK,IAAI,IAAI,KAAK,KAAK,GAAG,CAAC,IAAI,IAAI,gBAAgB,IAAI,IAAI,GAAG,KAAK,GAAG,CAAC;AAC1F,QAAI,CAAC,KAAK,IAAI,GAAG,GAAG;AAClB,WAAK,IAAI,GAAG;AACZ,UAAI,KAAK,GAAG;AAAA,IACd;AAAA,EACF;AAAA,EAEA,gBAAgBA,SAAyB;AACvC,QAAI,CAACA,QAAO,QAAQ;AAClB,aAAO;AAAA,IACT;AAEA,WAAOA,QACJ,IAAI,CAAC,UAAU;AACd,YAAM,eACJ,MAAM,YAAY,OACd,WAAW,MAAM,QAAQ,GAAG,MAAM,WAAW,WAAW,MAAM,QAAQ,KAAK,EAAE,MAC7E;AAGN,YAAM,eAAe,MAAM,aAAa;AAAA,QACtC,CAAC,MAAM,EAAE,SAAS;AAAA,MACpB;AACA,YAAM,YAAY,IAAI,IAAI,cAAc,WAAW,CAAC,CAAC;AAErD,YAAM,iBAAiB,IAAI;AAAA,QACzB,MAAM,aACF,OAAO,CAAC,MAAM,EAAE,SAAS,UAAU,EACpC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,KAAK,CAAC;AAAA,MACzC;AAEA,YAAM,kBAAkB,oBAAI,IAAoB;AAChD,iBAAW,KAAK,MAAM,aAAa;AAAA,QACjC,CAACC,OAAMA,GAAE,SAAS;AAAA,MACpB,KAAK,CAAC,GAAG;AACP,mBAAW,OAAO,EAAE,WAAW,CAAC,GAAG;AACjC,cAAI,EAAE,gBAAgB,MAAM;AAC1B,4BAAgB,IAAI,KAAK,EAAE,YAAY;AAAA,UACzC;AAAA,QACF;AAAA,MACF;AAGA,YAAM,gBAAgB,IAAI;AAAA,QACxB,MAAM,aACF,OAAO,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,SAAS,WAAW,CAAC,EAC7D,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,KAAK,CAAC;AAAA,MACzC;AAGA,YAAM,aAAa,oBAAI,IAAoB;AAC3C,iBAAW,KAAK,MAAM,aAAa;AAAA,QACjC,CAACA,OAAMA,GAAE,SAAS;AAAA,MACpB,KAAK,CAAC,GAAG;AACP,cAAM,OAAO,EAAE,WAAW,CAAC;AAC3B,cAAM,UAAU,EAAE,qBAAqB,CAAC;AACxC,iBAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,gBAAM,SAAS,QAAQ,CAAC,KAAK,QAAQ,CAAC,KAAK,KAAK,CAAC;AACjD,qBAAW,IAAI,KAAK,CAAC,GAAG,GAAG,EAAE,eAAe,IAAI,MAAM,EAAE;AAAA,QAC1D;AAAA,MACF;AAEA,YAAM,UAAU,MAAM,QACnB,IAAI,CAAC,WAAW;AACf,cAAM,cAAwB,CAAC;AAC/B,cAAM,eAAe,UAAU,IAAI,OAAO,IAAI;AAC9C,YAAI,cAAc;AAChB,sBAAY,KAAK,IAAI;AAAA,QACvB;AACA,YAAI,WAAW,IAAI,OAAO,IAAI,GAAG;AAC/B,sBAAY,KAAK,SAAS,WAAW,IAAI,OAAO,IAAI,CAAC,EAAE;AAAA,QACzD;AACA,YAAI,cAAc,IAAI,OAAO,IAAI,GAAG;AAClC,sBAAY,KAAK,QAAQ;AAAA,QAC3B;AACA,YAAI,eAAe,IAAI,OAAO,IAAI,GAAG;AACnC,sBAAY,KAAK,UAAU;AAAA,QAC7B;AACA,YAAI,gBAAgB,IAAI,OAAO,IAAI,GAAG;AACpC,sBAAY,KAAK,YAAY,gBAAgB,IAAI,OAAO,IAAI,CAAC,EAAE;AAAA,QACjE;AACA,YAAI,OAAO,aAAa,CAAC,cAAc;AACrC,sBAAY,KAAK,SAAS;AAAA,QAC5B;AACA,YAAI,OAAO,SAAS,UAAU,OAAO,QAAQ,QAAQ;AACnD,sBAAY,KAAK,SAAS,OAAO,OAAO,KAAK,IAAI,CAAC,EAAE;AAAA,QACtD,WACE,OAAO,SAAS,oBAChB,OAAO,QAAQ,QACf;AACA,sBAAY,KAAK,mBAAmB,OAAO,OAAO,KAAK,IAAI,CAAC,EAAE;AAAA,QAChE;AACA,YAAI,OAAO,OAAO;AAChB,gBAAM,YAAsB,CAAC;AAC7B,cAAI,OAAO,MAAM,OAAO,QAAQ,OAAO,MAAM,OAAO,MAAM;AACxD,kBAAM,UAAU,OAAO,MAAM,OAAO;AACpC,kBAAM,UAAU,OAAO,MAAM,OAAO;AACpC,sBAAU,KAAK,SAAS,OAAO,WAAM,OAAO,EAAE;AAAA,UAChD;AACA,cACE,OAAO,MAAM,gBAAgB,QAC7B,OAAO,SAAS,OAAO,MAAM,YAAY,GACzC;AACA,kBAAM,UACJ,KAAK,MAAM,OAAO,MAAM,eAAe,GAAI,IAAI;AACjD,sBAAU,KAAK,aAAQ,OAAO,GAAG;AAAA,UACnC;AACA,cAAI,UAAU,QAAQ;AACpB,wBAAY,KAAK,UAAU,KAAK,IAAI,CAAC;AAAA,UACvC;AAAA,QACF;AACA,cAAM,iBAAiB,YAAY,SAC/B,KAAK,YAAY,KAAK,IAAI,CAAC,MAC3B;AACJ,eAAO,SAAS,OAAO,IAAI,KAAK,OAAO,IAAI,IAAI,cAAc;AAAA,MAC/D,CAAC,EACA,KAAK,IAAI;AAGZ,YAAMC,WAAU,MAAM,SAAS,SAC3B;AAAA;AAAA,EAAiB,MAAM,QACpB,IAAI,CAAC,UAAU;AACd,cAAM,QAAkB,CAAC;AACzB,YAAI,MAAM,QAAQ;AAChB,gBAAM,KAAK,QAAQ;AAAA,QACrB;AACA,YAAI,MAAM,MAAM;AACd,gBAAM,KAAK,MAAM,IAAI;AAAA,QACvB;AACA,cAAM,YAAY,MAAM,SAAS,KAAK,MAAM,KAAK,IAAI,CAAC,MAAM;AAC5D,cAAM,cAAc,MAAM,SAAS,SAC/B,MAAM,QAAQ,KAAK,IAAI,IACvB;AACJ,eAAO,SAAS,MAAM,IAAI,GAAG,SAAS,KAAK,WAAW;AAAA,MACxD,CAAC,EACA,KAAK,IAAI,CAAC,KACb;AAGJ,YAAM,qBACJ,MAAM,aAAa;AAAA,QACjB,CAAC,MAAM,EAAE,SAAS,aAAa,EAAE,SAAS,UAAU,KAAK;AAAA,MAC3D,KAAK,CAAC;AACR,YAAM,oBAAoB,mBAAmB,SACzC;AAAA;AAAA,EAA4B,mBACzB,IAAI,CAAC,MAAM,SAAS,EAAE,IAAI,MAAM,EAAE,SAAS,KAAK,IAAI,CAAC,GAAG,EACxD,KAAK,IAAI,CAAC,KACb;AAGJ,YAAM,mBACJ,MAAM,aAAa,OAAO,CAAC,MAAM,EAAE,SAAS,OAAO,KAAK,CAAC;AAC3D,YAAM,SAAS,iBAAiB,SAC5B;AAAA;AAAA,EAA2B,iBACxB,IAAI,CAAC,MAAM,SAAS,EAAE,IAAI,KAAK,EAAE,UAAU,EAAE,EAC7C,KAAK,IAAI,CAAC,KACb;AAEJ,aAAO,YAAY,MAAM,IAAI,GAAG,YAAY;AAAA;AAAA,EAAiB,OAAO,GAAGA,QAAO,GAAG,iBAAiB,GAAG,MAAM;AAAA,IAC7G,CAAC,EACA,KAAK,MAAM;AAAA,EAChB;AAAA,EAEA,oBAAoB,CAAC,cAAsB;AACzC,UAAM,OAAO,UAAU,MAAM,GAAG,EAAE,IAAI,KAAK;AAC3C,WAAO,KAAK,QAAQ,MAAM,GAAG;AAAA,EAC/B;AAAA,EAEA,yBAAyB,CAACF,SAAiB,kBAAkC;AAC3E,QAAI,CAAC,cAAc,QAAQ;AACzB,aAAO;AAAA,IACT;AAEA,UAAM,WAAW,IAAI,IAAIA,QAAO,IAAI,CAAC,UAAU,CAAC,MAAM,MAAM,KAAK,CAAC,CAAC;AAEnE,WAAO,cACJ,IAAI,CAAC,iBAAiB;AACrB,YAAM,cAAc,KAAK,kBAAkB,aAAa,KAAK;AAC7D,YAAM,cAAc,KAAK;AAAA,QACvB,aAAa;AAAA,MACf;AACA,YAAM,iBAAiB,UAAU,SAAS,WAAW;AACrD,YAAM,eAAe,UAAU,OAAO,WAAW;AACjD,YAAM,iBAAiB,UAAU,SAAS,WAAW;AACrD,YAAM,eAAe,UAAU,OAAO,WAAW;AACjD,YAAM,cAAc,SAAS,IAAI,aAAa,KAAK;AACnD,YAAM,cAAc,SAAS,IAAI,aAAa,gBAAgB;AAC9D,YAAM,cAAc,aAAa;AACjC,YAAM,cAAc,aAAa;AACjC,YAAM,QACJ,eAAe,QAAQ,eAAe,QAAQ,cAAc,IACxD,cAAc,cACd;AAEN,UAAI,cAAc;AAClB,UAAI,SAAS,MAAM;AACjB,YAAI,QAAQ,GAAG;AACb,wBAAc,sBAAiB,WAAW,OAAO,WAAW;AAAA,QAC9D,WAAW,QAAQ,OAAO,QAAQ,KAAK;AACrC,wBAAc,gBAAgB,WAAW,OAAO,WAAW;AAAA,QAC7D,WAAW,QAAQ,KAAK;AACtB,wBAAc,gBAAgB,WAAW,OAAO,WAAW;AAAA,QAC7D;AAAA,MACF;AACA,YAAM,WAAW,aAAa,KAC3B,IAAI,CAAC,SAAS,QAAQ;AACrB,cAAM,YACJ,aAAa,GAAG,GAAG,KAAK,aAAa,GAAG,CAAC,KAAK;AAChD,eAAO,GAAG,aAAa,KAAK,IAAI,OAAO,OAAO,aAAa,gBAAgB,IAAI,SAAS;AAAA,MAC1F,CAAC,EACA,KAAK,IAAI;AAEZ,aAAO,KAAK,aAAa,KAAK,KAAK,aAAa,KAAK,KAAK,IAAI,CAAC,QAAQ,aAAa,gBAAgB,KAAK,aAAa,GAAG,KAAK,IAAI,CAAC,MAAM,WAAW;AAAA,IACtJ,CAAC,EACA,KAAK,IAAI;AAAA,EACd;AACF;;;AC9XO,IAAM,4BAAN,cAAwC,qBAAqB;AAAA,EAClE;AAAA,EAEA,YAAY,SAAkB,SAAqC,CAAC,GAAG;AACrE,UAAM,MAAM;AACZ,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,MAAyB,aACvB,WACA,QACkC;AAClC,QAAI,CAAC,KAAK,oBAAoB,OAAO,IAAI,GAAG;AAC1C,aAAO;AAAA,IACT;AAEA,UAAM,EAAE,QAAQ,MAAM,IAAI,KAAK,SAAS,eAAe,SAAS;AAChE,UAAM,WAAW,UAAW,MAAM,KAAK,oBAAoB;AAE3D,UAAM,kBAAkB,GAAG,KAAK,SAAS,gBAAgB,QAAQ,CAAC,IAAI,KAAK,SAAS,gBAAgB,KAAK,CAAC;AAC1G,UAAM,mBAAmB,KAAK,SAAS,gBAAgB,OAAO,IAAI;AAElE,QAAI;AACF,YAAM,OAAO,MAAM,KAAK,SAAS,SAAmB;AAAA;AAAA,qBAErC,gBAAgB;AAAA,qBAChB,gBAAgB;AAAA,0BACX,gBAAgB;AAAA,eAC3B,eAAe;AAAA,OACvB;AAED,UAAI,CAAC,KAAK,QAAQ;AAChB,eAAO;AAAA,MACT;AAEA,YAAM,MAAM,KAAK,CAAC,GAAG,aAAa;AAClC,YAAM,MAAM,KAAK,CAAC,GAAG,aAAa;AAClC,YAAM,eAAe,KAAK,UAAU,KAAK,CAAC,GAAG,aAAa;AAE1D,UAAI,OAAO,QAAQ,OAAO,QAAQ,gBAAgB,MAAM;AACtD,eAAO;AAAA,MACT;AAEA,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA,cACE,gBAAgB,QAAQ,OAAO,SAAS,YAAY,IAChD,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,YAAY,CAAC,IACrC;AAAA,MACR;AAAA,IACF,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,oBAAoB,MAAmC;AACrD,QAAI,CAAC,MAAM;AACT,aAAO;AAAA,IACT;AACA,UAAM,aAAa,KAAK,YAAY;AAEpC,WAAO,mFAAmF;AAAA,MACxF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,UAAU,OAA+B;AACvC,QAAI,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,GAAG;AACvD,aAAO;AAAA,IACT;AACA,QAAI,OAAO,UAAU,UAAU;AAC7B,aAAO,OAAO,KAAK;AAAA,IACrB;AACA,QAAI,OAAO,UAAU,YAAY,MAAM,KAAK,MAAM,IAAI;AACpD,YAAM,SAAS,OAAO,KAAK;AAC3B,aAAO,OAAO,SAAS,MAAM,IAAI,SAAS;AAAA,IAC5C;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,sBAAuC;AAC3C,UAAM,OAAO,MAAM,KAAK,SAAS;AAAA,MAC/B;AAAA,IACF;AACA,WAAO,KAAK,CAAC,GAAG,MAAM;AAAA,EACxB;AACF;;;ACvFO,IAAM,6BAAN,cAAyC,sBAAsB;AAAA,EACpE;AAAA,EAEA,YAAY,SAAkB,SAAsC,CAAC,GAAG;AACtE,UAAM,MAAM;AACZ,SAAK,WAAW;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAyB,kBACvB,WACA,QAC+B;AAC/B,UAAM,EAAE,QAAQ,MAAM,IAAI,KAAK,SAAS,eAAe,SAAS;AAChE,UAAM,WAAW,UAAW,MAAM,KAAK,oBAAoB;AAE3D,UAAM,OAAO,MAAM,KAAK,SAAS,SAAwB;AAAA;AAAA;AAAA,8BAG/B,KAAK,SAAS,aAAa,QAAQ,CAAC;AAAA,4BACtC,KAAK,SAAS,aAAa,KAAK,CAAC;AAAA,6BAChC,KAAK,SAAS,aAAa,OAAO,IAAI,CAAC;AAAA,KAC/D;AAED,UAAM,aAAa,KAAK,CAAC,GAAG;AAC5B,QAAI,CAAC,WAAY,QAAO;AAGxB,UAAM,YAAY,WAAW,MAAM,iBAAiB;AACpD,QAAI,CAAC,UAAW,QAAO;AAGvB,WAAO,KAAK,iBAAiB,UAAU,CAAC,CAAC;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAyB,sBACvB,WACA,QAC+B;AAC/B,UAAM,EAAE,QAAQ,MAAM,IAAI,KAAK,SAAS,eAAe,SAAS;AAChE,UAAM,WAAW,UAAW,MAAM,KAAK,oBAAoB;AAE3D,UAAM,kBAAkB,GAAG,KAAK,SAAS,gBAAgB,QAAQ,CAAC,IAAI,KAAK,SAAS,gBAAgB,KAAK,CAAC;AAC1G,UAAM,mBAAmB,KAAK,SAAS,gBAAgB,OAAO,IAAI;AAClE,UAAM,QAAQ,KAAK,sBAAsB;AAEzC,QAAI;AACF,YAAM,OAAO,MAAM,KAAK,SAAS,SAA6B;AAAA,0BAC1C,gBAAgB;AAAA,eAC3B,eAAe;AAAA,gBACd,gBAAgB;AAAA,gBAChB,KAAK;AAAA,OACd;AAED,UAAI,CAAC,KAAK,UAAU,KAAK,SAAS,KAAK,qBAAqB;AAC1D,eAAO;AAAA,MACT;AAEA,YAAM,SAAmB,CAAC;AAC1B,iBAAW,OAAO,MAAM;AACtB,cAAM,YAAY,KAAK,gBAAgB,IAAI,KAAK;AAChD,YAAI,cAAc,MAAM;AACtB,iBAAO;AAAA,QACT;AACA,eAAO,KAAK,SAAS;AAAA,MACvB;AAEA,aAAO,OAAO,SAAS,IAAI,SAAS;AAAA,IACtC,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,iBAAiB,YAA8B;AAC7C,UAAM,SAAmB,CAAC;AAE1B,UAAM,QAAQ;AACd,QAAI;AACJ,YAAQ,QAAQ,MAAM,KAAK,UAAU,OAAO,MAAM;AAEhD,YAAM,QAAQ,MAAM,CAAC,EAClB,QAAQ,OAAO,GAAG,EAClB,QAAQ,QAAQ,GAAG,EACnB,QAAQ,SAAS,IAAI;AACxB,aAAO,KAAK,KAAK;AAAA,IACnB;AACA,WAAO;AAAA,EACT;AAAA,EAEA,gBAAgB,OAA+B;AAC7C,QAAI,UAAU,QAAQ,UAAU,QAAW;AACzC,aAAO;AAAA,IACT;AACA,QAAI,OAAO,UAAU,UAAU;AAC7B,aAAO;AAAA,IACT;AACA,QAAI,OAAO,UAAU,YAAY,OAAO,UAAU,UAAU;AAC1D,aAAO,OAAO,KAAK;AAAA,IACrB;AACA,QAAI,OAAO,UAAU,WAAW;AAC9B,aAAO,QAAQ,SAAS;AAAA,IAC1B;AACA,QAAI,iBAAiB,MAAM;AACzB,aAAO,MAAM,YAAY;AAAA,IAC3B;AACA,QAAI,OAAO,WAAW,eAAe,OAAO,SAAS,KAAK,GAAG;AAC3D,aAAO,MAAM,SAAS,OAAO;AAAA,IAC/B;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,sBAAuC;AAC3C,UAAM,OAAO,MAAM,KAAK,SAAS;AAAA,MAC/B;AAAA,IACF;AACA,WAAO,KAAK,CAAC,GAAG,MAAM;AAAA,EACxB;AACF;;;AClHO,IAAM,2BAAN,cAAuC,oBAAoB;AAAA,EAChE;AAAA,EAEA,YAAY,SAAkB,SAAoC,CAAC,GAAG;AACpE,UAAM,MAAM;AACZ,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,MAAyB,eACvB,WAC4B;AAC5B,UAAM,EAAE,QAAQ,MAAM,IAAI,KAAK,SAAS,eAAe,SAAS;AAChE,UAAM,WAAW,UAAW,MAAM,KAAK,oBAAoB;AAC3D,UAAMG,eAAiC,CAAC;AAGxC,UAAM,iBAAiB,MAAM,KAAK,SAAS,SAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iCAatC,KAAK,SAAS,aAAa,QAAQ,CAAC;AAAA,+BACtC,KAAK,SAAS,aAAa,KAAK,CAAC;AAAA;AAAA;AAAA,KAG3D;AAGD,UAAM,gBAAgB,oBAAI,IAQxB;AAEF,eAAW,OAAO,gBAAgB;AAChC,UAAI,CAAC,IAAI,mBAAmB,CAAC,IAAI,YAAa;AAE9C,YAAM,WAAW,cAAc,IAAI,IAAI,eAAe;AACtD,UAAI,UAAU;AACZ,iBAAS,QAAQ,KAAK,IAAI,WAAW;AACrC,YAAI,IAAI,wBAAwB;AAC9B,mBAAS,oBAAoB,SAAS,qBAAqB,CAAC;AAC5D,mBAAS,kBAAkB,KAAK,IAAI,sBAAsB;AAAA,QAC5D;AAAA,MACF,OAAO;AACL,cAAM,OAAO,KAAK,mBAAmB,IAAI,eAAe;AACxD,YAAI,CAAC,KAAM;AAEX,cAAM,QAKF;AAAA,UACF;AAAA,UACA,SAAS,CAAC,IAAI,WAAW;AAAA,QAC3B;AAEA,YAAI,SAAS,iBAAiB,IAAI,uBAAuB;AACvD,gBAAM,kBAAkB,IAAI,0BACxB,GAAG,IAAI,uBAAuB,IAAI,IAAI,qBAAqB,KAC3D,IAAI;AACR,cAAI,IAAI,wBAAwB;AAC9B,kBAAM,oBAAoB,CAAC,IAAI,sBAAsB;AAAA,UACvD;AAAA,QACF;AAEA,sBAAc,IAAI,IAAI,iBAAiB,KAAK;AAAA,MAC9C;AAAA,IACF;AAEA,eAAW,CAAC,MAAM,IAAI,KAAK,eAAe;AACxC,MAAAA,aAAY,KAAK;AAAA,QACf;AAAA,QACA,MAAM,KAAK;AAAA,QACX,SAAS,KAAK;AAAA,QACd,iBAAiB,KAAK;AAAA,QACtB,mBAAmB,KAAK;AAAA,MAC1B,CAAC;AAAA,IACH;AAGA,UAAM,aAAa,MAAM,KAAK,SAAS,SAAoB;AAAA;AAAA;AAAA,8BAGjC,KAAK,SAAS,aAAa,QAAQ,CAAC;AAAA,4BACtC,KAAK,SAAS,aAAa,KAAK,CAAC;AAAA,KACxD;AAGD,UAAM,eAAeA,aAAY,KAAK,CAAC,MAAM,EAAE,SAAS,aAAa;AACrE,UAAM,YAAY,IAAI,IAAI,cAAc,WAAW,CAAC,CAAC;AAErD,eAAW,OAAO,YAAY;AAC5B,UAAI,CAAC,IAAI,YAAa;AAGtB,UAAI,IAAI,gBAAgB,QAAQ,CAAC,UAAU,IAAI,IAAI,WAAW,GAAG;AAC/D,QAAAA,aAAY,KAAK;AAAA,UACf,MAAM,GAAG,IAAI,WAAW;AAAA,UACxB,MAAM;AAAA,UACN,SAAS,CAAC,IAAI,WAAW;AAAA,QAC3B,CAAC;AAAA,MACH;AAEA,UAAI,IAAI,mBAAmB,MAAM;AAC/B,QAAAA,aAAY,KAAK;AAAA,UACf,MAAM,GAAG,IAAI,WAAW;AAAA,UACxB,MAAM;AAAA,UACN,SAAS,CAAC,IAAI,WAAW;AAAA,UACzB,cAAc,IAAI;AAAA,QACpB,CAAC;AAAA,MACH;AAAA,IACF;AAGA,QAAI;AACF,YAAM,YAAY,MAAM,KAAK,SAAS,SAA6B;AAAA;AAAA;AAAA,qCAGpC,KAAK,SAAS,aAAa,QAAQ,CAAC;AAAA,OAClE;AAGD,YAAM,iBAAiB,MAAM,KAAK,SAAS,SAGxC;AAAA;AAAA;AAAA,gCAGuB,KAAK,SAAS,aAAa,QAAQ,CAAC;AAAA,8BACtC,KAAK,SAAS,aAAa,KAAK,CAAC;AAAA;AAAA,OAExD;AAED,YAAM,gBAAgB,IAAI;AAAA,QACxB,eAAe,IAAI,CAAC,MAAM,CAAC,EAAE,iBAAiB,EAAE,UAAU,CAAC;AAAA,MAC7D;AAEA,iBAAW,OAAO,WAAW;AAC3B,YAAI,CAAC,IAAI,gBAAiB;AAE1B,YAAI,cAAc,IAAI,IAAI,eAAe,MAAM,MAAO;AAEtD,QAAAA,aAAY,KAAK;AAAA,UACf,MAAM,IAAI;AAAA,UACV,MAAM;AAAA,UACN,YAAY,IAAI,gBAAgB;AAAA,QAClC,CAAC;AAAA,MACH;AAAA,IACF,QAAQ;AAAA,IAER;AAEA,WAAOA;AAAA,EACT;AAAA,EAEA,mBAAmB,MAAqD;AACtE,YAAQ,MAAM;AAAA,MACZ,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT;AACE,eAAO;AAAA,IACX;AAAA,EACF;AAAA,EAEA,MAAM,sBAAuC;AAC3C,UAAM,OAAO,MAAM,KAAK,SAAS;AAAA,MAC/B;AAAA,IACF;AACA,WAAO,KAAK,CAAC,GAAG,MAAM;AAAA,EACxB;AACF;;;ACxMO,IAAM,wBAAN,cAAoC,iBAAiB;AAAA,EAC1D;AAAA,EAEA,YAAY,SAAkB,SAAiC,CAAC,GAAG;AACjE,UAAM,MAAM;AACZ,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,MAAyB,WACvB,WACuB;AACvB,UAAM,EAAE,QAAQ,MAAM,IAAI,KAAK,SAAS,eAAe,SAAS;AAChE,UAAM,WAAW,UAAW,MAAM,KAAK,oBAAoB;AAE3D,UAAM,OAAO,MAAM,KAAK,SAAS,SAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,8BAQ1B,KAAK,SAAS,aAAa,QAAQ,CAAC;AAAA,4BACtC,KAAK,SAAS,aAAa,KAAK,CAAC;AAAA;AAAA,KAExD;AAED,UAAM,WAAW,oBAAI,IAAwB;AAE7C,eAAW,OAAO,MAAM;AACtB,UAAI,CAAC,IAAI,WAAY;AAErB,UAAI,QAAQ,SAAS,IAAI,IAAI,UAAU;AACvC,UAAI,CAAC,OAAO;AACV,gBAAQ;AAAA,UACN,MAAM,IAAI;AAAA,UACV,SAAS,CAAC;AAAA,UACV,QAAQ,IAAI,eAAe;AAAA,UAC3B,MAAM,IAAI,cAAc;AAAA,QAC1B;AACA,iBAAS,IAAI,IAAI,YAAY,KAAK;AAAA,MACpC;AAEA,UAAI,IAAI,aAAa;AACnB,cAAM,QAAQ,KAAK,IAAI,WAAW;AAAA,MACpC;AAAA,IACF;AAEA,WAAO,MAAM,KAAK,SAAS,OAAO,CAAC;AAAA,EACrC;AAAA,EAEA,MAAM,sBAAuC;AAC3C,UAAM,OAAO,MAAM,KAAK,SAAS;AAAA,MAC/B;AAAA,IACF;AACA,WAAO,KAAK,CAAC,GAAG,MAAM;AAAA,EACxB;AACF;;;ACjEO,IAAM,qBAAN,cAAiC,cAAc;AAAA,EACpD;AAAA,EAEA,YAAY,SAAkB,SAA8B,CAAC,GAAG;AAC9D,UAAM,MAAM;AACZ,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,MAAyB,cAAoC;AAC3D,UAAM,CAAC,aAAa,MAAM,IAAI,MAAM,QAAQ,IAAI;AAAA,MAC9C,KAAK,SAAS;AAAA,QACZ;AAAA,MACF;AAAA,MACA,KAAK,SAAS,SAAgC,yBAAyB;AAAA,IACzE,CAAC;AAED,UAAM,UAAU,YAAY,CAAC,GAAG;AAChC,UAAM,WAAW,OAAO,CAAC,GAAG,MAAM;AAGlC,UAAM,YAAY,SAAS,YAAY,EAAE,SAAS,SAAS,KAAK;AAChE,UAAM,UAAU,YAAY,YAAY;AAExC,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS;AAAA,QACP,sBAAsB;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AACF;;;AC5BA,IAAM,kBAAkE;AAAA,EACtE,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAAA,EACA,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAAA,EACA,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAAA,EACA,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAAA,EACA,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAAA,EACA,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAAA,EACA,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AACF;AAEA,SAAS,aACP,OAC8D;AAC9D,SACE,OAAO,UAAU,YACjB,UAAU,SACT,WAAW,SAAS,UAAU;AAEnC;AAEO,SAAS,iBAAiB,KAAa,OAAgB;AAC5D,QAAM,eACJ,iBAAiB,QACb,MAAM,UACN,OAAO,UAAU,WACf,QACA;AAER,MAAI,aAAa,KAAK,GAAG;AACvB,UAAM,YAAY,MAAM,OAAO,SAAS,KAAK,MAAM,QAAQ;AAC3D,UAAM,WAAW,gBAAgB,SAAS;AAC1C,QAAI,UAAU;AACZ,aAAO;AAAA,QACL,OAAO;AAAA,QACP,YAAY,SAAS;AAAA,QACrB,YAAY,SAAS;AAAA,QACrB,eAAe;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,eAAe;AAAA,EACjB;AACF;AAEO,IAAM,QAAN,cAAoB,QAAQ;AAAA,EACjC;AAAA,EACkB;AAAA,EACA,gBAAoC;AAAA,EACpC,gBAAgB;AAAA,IAChC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EAEA,YAAY,SAA8B;AACxC,UAAM;AACN,QAAI,CAAC,WAAW,OAAO,QAAQ,YAAY,YAAY;AACrD,YAAM,IAAI,MAAM,6CAA6C;AAAA,IAC/D;AACA,SAAK,WAAW;AAAA,MACd,GAAG;AAAA,MACH,WAAW,QAAQ,WAAW,SAAS,QAAQ,YAAY;AAAA,IAC7D;AACA,SAAK,YAAY,QAAQ;AAAA,EAC3B;AAAA,EAEA,MAAe,QAAQ,KAAa;AAClC,WAAO,KAAK,SAAS,QAAQ,GAAG;AAAA,EAClC;AAAA,EAEA,MAAe,SAAS,KAAa;AACnC,UAAM,YACJ,KAAK,SAAS,aACb,OAAO,SAAiB;AACvB,YAAM,KAAK,SAAS,QAAQ,WAAW,IAAI,EAAE;AAAA,IAC/C;AAEF,QAAI;AACF,aAAO,MAAM,UAAU,GAAG;AAAA,IAC5B,SAAS,OAAO;AACd,aAAO,KAAK,UAAU,iBAAiB,KAAK,KAAK,CAAC;AAAA,IACpD;AAAA,EACF;AAAA,EAEA,MAAe,SAAc,KAA6B;AACxD,WAAO,KAAK,uBAA4B,GAAG;AAAA,EAC7C;AAAA,EAES,gBAAgB,MAAsB;AAC7C,WAAO,KAAK,KAAK,QAAQ,MAAM,IAAI,CAAC;AAAA,EACtC;AAAA,EAES,OAAO,OAAuB;AACrC,WAAO,MAAM,QAAQ,MAAM,IAAI;AAAA,EACjC;AAAA,EAES,qBACP,WACA,SACA,OACQ;AACR,UAAM,EAAE,QAAQ,MAAM,IAAI,KAAK,eAAe,SAAS;AACvD,UAAM,kBAAkB,SACpB,GAAG,KAAK,gBAAgB,MAAM,CAAC,IAAI,KAAK,gBAAgB,KAAK,CAAC,KAC9D,KAAK,gBAAgB,KAAK;AAC9B,UAAM,aAAa,SAAS,SACxB,QAAQ,IAAI,CAAC,MAAM,KAAK,gBAAgB,CAAC,CAAC,EAAE,KAAK,IAAI,IACrD;AACJ,WAAO,UAAU,UAAU,SAAS,eAAe,UAAU,KAAK;AAAA,EACpE;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,YAAkC;AACpC,WAAO,KAAK,SAAS;AAAA,EACvB;AAAA,EAEA,MAAM,uBAA4B,KAA6B;AAC7D,UAAM,SAAS,MAAM,KAAK,SAAS,QAAQ,GAAG;AAG9C,QAAI,MAAM,QAAQ,MAAM,GAAG;AAEzB,UACE,OAAO,UAAU,KACjB,MAAM,QAAQ,OAAO,CAAC,CAAC,MACtB,OAAO,WAAW,KAChB,OAAO,WAAW,KAAK,CAAC,MAAM,QAAQ,OAAO,CAAC,IAAI,CAAC,CAAC,IACvD;AACA,eAAO,OAAO,CAAC;AAAA,MACjB;AACA,aAAO;AAAA,IACT;AAGA,QACE,UACA,OAAO,WAAW,YAClB,UAAU,UACV,MAAM,QAAS,OAA8B,IAAI,GACjD;AACA,aAAQ,OAA2B;AAAA,IACrC;AAEA,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;;;ACpLO,IAAM,yBAAN,cAAqC,kBAAkB;AAAA,EAC5D;AAAA,EAEA,YAAY,SAAkB,SAAkC,CAAC,GAAG;AAClE,UAAM,MAAM;AACZ,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,MAAyB,YACvB,WAC6B;AAC7B,UAAM,EAAE,QAAQ,MAAM,IAAI,KAAK,SAAS,eAAe,SAAS;AAChE,UAAM,WAAW,UAAW,MAAM,KAAK,oBAAoB;AAE3D,UAAM,kBAAkB,GAAG,KAAK,SAAS,gBAAgB,QAAQ,CAAC,IAAI,KAAK,SAAS,gBAAgB,KAAK,CAAC;AAE1G,QAAI;AACF,YAAM,OAAO,MAAM,KAAK,SAAS,SAE9B,iCAAiC,eAAe,EAAE;AAErD,aAAO,KAAK,UAAU,KAAK,CAAC,GAAG,KAAK;AAAA,IACtC,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,UAAU,OAAoC;AAC5C,QAAI,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,GAAG;AACvD,aAAO;AAAA,IACT;AACA,QAAI,OAAO,UAAU,UAAU;AAC7B,aAAO,OAAO,KAAK;AAAA,IACrB;AACA,QAAI,OAAO,UAAU,YAAY,MAAM,KAAK,MAAM,IAAI;AACpD,YAAM,SAAS,OAAO,KAAK;AAC3B,aAAO,OAAO,SAAS,MAAM,IAAI,SAAS;AAAA,IAC5C;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,sBAAuC;AAC3C,UAAM,OAAO,MAAM,KAAK,SAAS;AAAA,MAC/B;AAAA,IACF;AACA,WAAO,KAAK,CAAC,GAAG,MAAM;AAAA,EACxB;AACF;;;ACxBO,IAAM,sBAAN,cAAkC,eAAe;AAAA,EACtD;AAAA,EACA;AAAA,EAEA,YAAY,SAAkB,SAAoC,CAAC,GAAG;AACpE,UAAM,MAAM;AACZ,SAAK,WAAW;AAChB,SAAK,aAAa,OAAO,aAAc,QAAkB;AAAA,EAC3D;AAAA,EAEA,MAAyB,mBAAsC;AAC7D,UAAM,OAAO,MAAM,KAAK,SAAS,SAA2B;AAAA;AAAA;AAAA;AAAA,UAItD,KAAK,qBAAqB,cAAc,CAAC;AAAA;AAAA,KAE9C;AACD,WAAO,KAAK,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,EAC/B;AAAA,EAEA,MAAyB,SAAS,WAAmC;AACnE,UAAM,EAAE,QAAQ,MAAM,IAAI,KAAK,SAAS,eAAe,SAAS;AAChE,UAAM,WAAW,UAAW,MAAM,KAAK,oBAAoB;AAE3D,UAAM,UAAU,MAAM,KAAK,SAAS,SAAoB;AAAA;AAAA;AAAA,8BAG9B,KAAK,SAAS,aAAa,QAAQ,CAAC;AAAA,4BACtC,KAAK,SAAS,aAAa,KAAK,CAAC;AAAA;AAAA,KAExD;AAED,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,SAAS,QAAQ,IAAI,CAAC,SAAS;AAAA,QAC7B,MAAM,IAAI,eAAe;AAAA,QACzB,MAAM,IAAI,aAAa;AAAA,MACzB,EAAE;AAAA,IACJ;AAAA,EACF;AAAA,EAEA,MAAyB,sBACvB,WACyB;AACzB,UAAM,EAAE,QAAQ,MAAM,IAAI,KAAK,SAAS,eAAe,SAAS;AAChE,UAAM,WAAW,UAAW,MAAM,KAAK,oBAAoB;AAE3D,UAAM,OAAO,MAAM,KAAK,SAAS,SAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kCAU7B,KAAK,SAAS,aAAa,QAAQ,CAAC;AAAA,gCACtC,KAAK,SAAS,aAAa,KAAK,CAAC;AAAA;AAAA;AAAA,KAG5D;AAED,WAAO,KAAK,oBAAoB,IAAI;AAAA,EACtC;AAAA,EAEA,MAAyB,sBACvB,WACyB;AACzB,UAAM,EAAE,QAAQ,MAAM,IAAI,KAAK,SAAS,eAAe,SAAS;AAChE,UAAM,WAAW,UAAW,MAAM,KAAK,oBAAoB;AAE3D,UAAM,OAAO,MAAM,KAAK,SAAS,SAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,6CAUlB,KAAK,SAAS,aAAa,QAAQ,CAAC;AAAA,2CACtC,KAAK,SAAS,aAAa,KAAK,CAAC;AAAA;AAAA,KAEvE;AAED,WAAO,KAAK,oBAAoB,IAAI;AAAA,EACtC;AAAA,EAEA,oBAAoB,MAAyC;AAC3D,UAAM,gBAAgB,oBAAI,IAA0B;AAEpD,eAAW,OAAO,MAAM;AACtB,UACE,CAAC,IAAI,cACL,CAAC,IAAI,yBACL,CAAC,IAAI,iBACL;AACA;AAAA,MACF;AAEA,YAAM,SAAS,IAAI,gBAAgB;AACnC,YAAM,mBAAmB,IAAI,2BAA2B;AACxD,YAAM,MAAM,GAAG,MAAM,IAAI,IAAI,UAAU,IAAI,IAAI,eAAe;AAE9D,YAAM,eAAe,cAAc,IAAI,GAAG,KAAK;AAAA,QAC7C,OAAO,GAAG,MAAM,IAAI,IAAI,UAAU;AAAA,QAClC,MAAM,CAAC;AAAA,QACP,kBAAkB,GAAG,gBAAgB,IAAI,IAAI,qBAAqB;AAAA,QAClE,IAAI,CAAC;AAAA,MACP;AAEA,mBAAa,KAAK,KAAK,IAAI,eAAe,SAAS;AACnD,mBAAa,GAAG,KAAK,IAAI,0BAA0B,SAAS;AAE5D,oBAAc,IAAI,KAAK,YAAY;AAAA,IACrC;AAEA,WAAO,MAAM,KAAK,cAAc,OAAO,CAAC;AAAA,EAC1C;AAAA,EAEA,qBAAqB,YAA4B;AAC/C,QAAI,KAAK,cAAc,KAAK,WAAW,SAAS,GAAG;AACjD,YAAM,SAAS,KAAK,WACjB,IAAI,CAAC,OAAO,IAAI,KAAK,SAAS,aAAa,EAAE,CAAC,GAAG,EACjD,KAAK,IAAI;AACZ,aAAO,OAAO,UAAU,QAAQ,MAAM;AAAA,IACxC;AAGA,UAAM,YAAY,KAAK,SAAS,cAC7B,IAAI,CAAC,OAAO,IAAI,KAAK,SAAS,aAAa,EAAE,CAAC,GAAG,EACjD,KAAK,IAAI;AACZ,WAAO,OAAO,UAAU,YAAY,SAAS;AAAA,EAC/C;AAAA,EAEA,MAAM,sBAAuC;AAC3C,UAAM,OAAO,MAAM,KAAK,SAAS;AAAA,MAC/B;AAAA,IACF;AACA,WAAO,KAAK,CAAC,GAAG,MAAM;AAAA,EACxB;AACF;;;AC3IO,IAAe,gBAAf,cAAqC,kBAAkB;AAAA,EAC5D;AAAA,EAEA,YAAY,SAA8B,CAAC,GAAG;AAC5C,UAAM,OAAO;AACb,SAAK,UAAU,OAAO;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,QAAQ,KAAuB;AACnC,UAAM,YAAY,MAAM,KAAK,YAAY;AACzC,UAAMC,SAAQ,MAAM,QAAQ;AAAA,MAC1B,UAAU,IAAI,CAAC,SAAS,KAAK,QAAQ,IAAI,CAAC;AAAA,IAC5C;AACA,QAAI,MAAM,KAAK,GAAGA,MAAK;AACvB,WAAO,MAAM,KAAK,UAAUA,MAAK;AAAA,EACnC;AAAA,EAEA,UAAUA,QAAuB;AAC/B,QAAI,CAACA,OAAM,QAAQ;AACjB,aAAO;AAAA,IACT;AAEA,WAAOA,OACJ,IAAI,CAAC,SAAS;AACb,YAAM,UAAU,KAAK,QAClB,IAAI,CAAC,WAAW;AACf,cAAM,cAAwB,CAAC;AAC/B,YAAI,OAAO,SAAS,oBAAoB,OAAO,QAAQ,QAAQ;AAC7D,sBAAY,KAAK,mBAAmB,OAAO,OAAO,KAAK,IAAI,CAAC,EAAE;AAAA,QAChE;AACA,YAAI,OAAO,OAAO;AAChB,gBAAM,YAAsB,CAAC;AAC7B,cAAI,OAAO,MAAM,OAAO,QAAQ,OAAO,MAAM,OAAO,MAAM;AACxD,kBAAM,UAAU,OAAO,MAAM,OAAO;AACpC,kBAAM,UAAU,OAAO,MAAM,OAAO;AACpC,sBAAU,KAAK,SAAS,OAAO,WAAM,OAAO,EAAE;AAAA,UAChD;AACA,cACE,OAAO,MAAM,gBAAgB,QAC7B,OAAO,SAAS,OAAO,MAAM,YAAY,GACzC;AACA,kBAAM,UACJ,KAAK,MAAM,OAAO,MAAM,eAAe,GAAI,IAAI;AACjD,sBAAU,KAAK,aAAQ,OAAO,GAAG;AAAA,UACnC;AACA,cAAI,UAAU,QAAQ;AACpB,wBAAY,KAAK,UAAU,KAAK,IAAI,CAAC;AAAA,UACvC;AAAA,QACF;AACA,cAAM,iBAAiB,YAAY,SAC/B,KAAK,YAAY,KAAK,IAAI,CAAC,MAC3B;AACJ,eAAO,SAAS,OAAO,IAAI,KAAK,OAAO,IAAI,IAAI,cAAc;AAAA,MAC/D,CAAC,EACA,KAAK,IAAI;AAEZ,YAAM,aAAa,KAAK,aACpB;AAAA,gBAAmB,KAAK,WAAW,SAAS,MAAM,KAAK,WAAW,MAAM,GAAG,GAAG,IAAI,QAAQ,KAAK,UAAU,KACzG;AAEJ,aAAO,WAAW,KAAK,IAAI,GAAG,UAAU;AAAA;AAAA,EAAiB,OAAO;AAAA,IAClE,CAAC,EACA,KAAK,MAAM;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAgB,cAAiC;AAC/C,UAAM,SAAS,KAAK;AACpB,QAAI,MAAM,QAAQ,MAAM,GAAG;AACzB,aAAO;AAAA,IACT;AACA,UAAM,QAAQ,MAAM,KAAK,gBAAgB;AACzC,QAAI,CAAC,QAAQ;AACX,aAAO;AAAA,IACT;AACA,QAAI,kBAAkB,QAAQ;AAC5B,aAAO,MAAM,OAAO,CAAC,SAAS,OAAO,KAAK,IAAI,CAAC;AAAA,IACjD;AACA,WAAO,MAAM,OAAO,MAAM;AAAA,EAC5B;AACF;;;AC3GO,IAAM,qBAAN,cAAiC,cAAc;AAAA,EACpD;AAAA,EACA;AAAA,EAEA,YAAY,SAAkB,SAAmC,CAAC,GAAG;AACnE,UAAM,MAAM;AACZ,SAAK,WAAW;AAChB,SAAK,aAAa,OAAO,aAAc,QAAkB;AAAA,EAC3D;AAAA,EAEA,MAAyB,kBAAqC;AAC5D,UAAM,OAAO,MAAM,KAAK,SAAS,SAA2B;AAAA;AAAA;AAAA;AAAA,UAItD,KAAK,qBAAqB,cAAc,CAAC;AAAA;AAAA,KAE9C;AACD,WAAO,KAAK,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,EAC/B;AAAA,EAEA,MAAyB,QAAQ,UAAiC;AAChE,UAAM,EAAE,QAAQ,MAAM,IAAI,KAAK,SAAS,eAAe,QAAQ;AAC/D,UAAM,WAAW,UAAW,MAAM,KAAK,oBAAoB;AAG3D,UAAM,UAAU,MAAM,KAAK,SAAS,SAAoB;AAAA;AAAA;AAAA,8BAG9B,KAAK,SAAS,aAAa,QAAQ,CAAC;AAAA,4BACtC,KAAK,SAAS,aAAa,KAAK,CAAC;AAAA;AAAA,KAExD;AAGD,UAAM,WAAW,MAAM,KAAK,SAAS,SAAkB;AAAA;AAAA;AAAA,8BAG7B,KAAK,SAAS,aAAa,QAAQ,CAAC;AAAA,4BACtC,KAAK,SAAS,aAAa,KAAK,CAAC;AAAA,KACxD;AAED,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,YAAY,SAAS,CAAC,GAAG,mBAAmB;AAAA,MAC5C,SAAS,QAAQ,IAAI,CAAC,SAAS;AAAA,QAC7B,MAAM,IAAI,eAAe;AAAA,QACzB,MAAM,IAAI,aAAa;AAAA,MACzB,EAAE;AAAA,IACJ;AAAA,EACF;AAAA,EAEA,qBAAqB,YAA4B;AAC/C,QAAI,KAAK,cAAc,KAAK,WAAW,SAAS,GAAG;AACjD,YAAM,SAAS,KAAK,WACjB,IAAI,CAAC,OAAO,IAAI,KAAK,SAAS,aAAa,EAAE,CAAC,GAAG,EACjD,KAAK,IAAI;AACZ,aAAO,OAAO,UAAU,QAAQ,MAAM;AAAA,IACxC;AAGA,UAAM,YAAY,KAAK,SAAS,cAC7B,IAAI,CAAC,OAAO,IAAI,KAAK,SAAS,aAAa,EAAE,CAAC,GAAG,EACjD,KAAK,IAAI;AACZ,WAAO,OAAO,UAAU,YAAY,SAAS;AAAA,EAC/C;AAAA,EAEA,MAAM,sBAAuC;AAC3C,UAAM,OAAO,MAAM,KAAK,SAAS;AAAA,MAC/B;AAAA,IACF;AACA,WAAO,KAAK,CAAC,GAAG,MAAM;AAAA,EACxB;AACF;;;AC7EO,SAAS,OAAO,SAA+B,CAAC,GAAG;AACxD,SAAO,CAAC,YAAqB,IAAI,oBAAoB,SAAS,MAAM;AACtE;AAEO,SAAS,KAAK,SAA8B,CAAC,GAAG;AACrD,SAAO,CAAC,YAAqB,IAAI,mBAAmB,SAAS,MAAM;AACrE;AAEO,SAAS,MAAM,SAA8B,CAAC,GAAG;AACtD,SAAO,CAAC,YAAqB;AAC3B,WAAO,IAAI,mBAAmB,SAAS,MAAM;AAAA,EAC/C;AACF;AAEO,SAAS,YAAY,SAAqC,CAAC,GAAG;AACnE,SAAO,CAAC,YAAqB;AAC3B,WAAO,IAAI,0BAA0B,SAAS,MAAM;AAAA,EACtD;AACF;AAEO,SAAS,aAAa,SAAsC,CAAC,GAAG;AACrE,SAAO,CAAC,YAAqB;AAC3B,WAAO,IAAI,2BAA2B,SAAS,MAAM;AAAA,EACvD;AACF;AAEO,SAAS,QAAQ,SAAiC,CAAC,GAAG;AAC3D,SAAO,CAAC,YAAqB;AAC3B,WAAO,IAAI,sBAAsB,SAAS,MAAM;AAAA,EAClD;AACF;AAEO,SAAS,SAAS,SAAkC,CAAC,GAAG;AAC7D,SAAO,CAAC,YAAqB;AAC3B,WAAO,IAAI,uBAAuB,SAAS,MAAM;AAAA,EACnD;AACF;AAEO,SAAS,YAAY,SAAoC,CAAC,GAAG;AAClE,SAAO,CAAC,YAAqB;AAC3B,WAAO,IAAI,yBAAyB,SAAS,MAAM;AAAA,EACrD;AACF;AAEO,SAAS,OAAO,SAAgC,CAAC,GAAG;AACzD,SAAO,CAAC,YAAqB,IAAI,gBAAgB,SAAS,MAAM;AAClE;AAEA,IAAO,gBAAQ;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;",
6
- "names": ["constraints", "report", "tables", "c", "indexes", "constraints", "views"]
3
+ "sources": ["../../../../src/lib/fragments/schema.ts", "../../../../src/lib/adapters/groundings/context.ts", "../../../../src/lib/adapters/adapter.ts", "../../../../src/lib/adapters/groundings/abstract.grounding.ts", "../../../../src/lib/adapters/groundings/column-stats.grounding.ts", "../../../../src/lib/adapters/groundings/column-values.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/mysql/column-stats.mysql.grounding.ts", "../../../../src/lib/adapters/mysql/column-values.mysql.grounding.ts", "../../../../src/lib/adapters/mysql/constraint.mysql.grounding.ts", "../../../../src/lib/adapters/mysql/indexes.mysql.grounding.ts", "../../../../src/lib/adapters/mysql/info.mysql.grounding.ts", "../../../../src/lib/adapters/mysql/mysql.ts", "../../../../src/lib/adapters/mysql/row-count.mysql.grounding.ts", "../../../../src/lib/adapters/mysql/table.mysql.grounding.ts", "../../../../src/lib/adapters/groundings/view.grounding.ts", "../../../../src/lib/adapters/mysql/view.mysql.grounding.ts", "../../../../src/lib/adapters/mysql/index.ts"],
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 };\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}\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 { ColumnStats } from '../adapter.ts';\nimport { AbstractGrounding } from './abstract.grounding.ts';\nimport type { Column, ColumnContainer, GroundingContext } from './context.ts';\n\n/**\n * Configuration for ColumnStatsGrounding.\n */\nexport interface ColumnStatsGroundingConfig {\n // Future: filter which tables/columns to collect stats for\n}\n\n/**\n * Abstract base class for column statistics grounding.\n *\n * Reads tables and views from the context and annotates their columns\n * with statistics (min, max, nullFraction).\n *\n * Subclasses implement database-specific hooks:\n * - `collectStats()` - collect min/max/nullFraction for a column\n */\nexport abstract class ColumnStatsGrounding extends AbstractGrounding {\n constructor(config: ColumnStatsGroundingConfig = {}) {\n super('columnStats');\n }\n\n /**\n * Collect min/max/nullFraction statistics for a column.\n * Return undefined to skip this column.\n */\n protected abstract collectStats(\n tableName: string,\n column: Column,\n ): Promise<ColumnStats | undefined>;\n\n /**\n * Execute the grounding process.\n * Annotates columns in ctx.tables and ctx.views with statistics.\n */\n async execute(ctx: GroundingContext): Promise<void> {\n // Process both tables and views\n const allContainers: ColumnContainer[] = [...ctx.tables, ...ctx.views];\n for (const container of allContainers) {\n for (const column of container.columns) {\n // Collect min/max/nullFraction\n try {\n const stats = await this.collectStats(container.name, column);\n if (stats) {\n column.stats = stats;\n }\n } catch (error) {\n // Skip on error\n console.warn(\n 'Error collecting stats for',\n container.name,\n column.name,\n error,\n );\n }\n }\n }\n }\n}\n", "import type { Table, TableConstraint } from '../adapter.ts';\nimport { AbstractGrounding } from './abstract.grounding.ts';\nimport type { Column, ColumnContainer, GroundingContext } from './context.ts';\n\nexport type { Column, ColumnContainer };\n\n/**\n * Result of column value detection.\n */\nexport type ColumnValuesResult = {\n kind: 'Enum' | 'LowCardinality';\n values: string[];\n};\n\n/**\n * Configuration for ColumnValuesGrounding.\n */\nexport interface ColumnValuesGroundingConfig {\n /** Maximum number of distinct values to consider low cardinality (default: 20) */\n lowCardinalityLimit?: number;\n}\n\n/**\n * Abstract base class for column values grounding.\n *\n * Discovers possible values for columns from three sources (in priority order):\n * 1. Native ENUM types (PostgreSQL, MySQL) \u2192 kind: 'Enum'\n * 2. CHECK constraints with IN clauses \u2192 kind: 'Enum'\n * 3. Low cardinality data scan \u2192 kind: 'LowCardinality'\n *\n * Subclasses implement database-specific hooks:\n * - `collectEnumValues()` - get values for native ENUM columns\n * - `collectLowCardinality()` - collect distinct values via data scan\n */\nexport abstract class ColumnValuesGrounding extends AbstractGrounding {\n protected lowCardinalityLimit: number;\n\n constructor(config: ColumnValuesGroundingConfig = {}) {\n super('columnValues');\n this.lowCardinalityLimit = config.lowCardinalityLimit ?? 20;\n }\n\n /**\n * Get values for native ENUM type columns.\n * Return undefined if column is not an ENUM type.\n * Default implementation returns undefined (no native ENUM support).\n */\n protected async collectEnumValues(\n _tableName: string,\n _column: Column,\n ): Promise<string[] | undefined> {\n return undefined;\n }\n\n /**\n * Collect distinct values for low cardinality columns via data scan.\n * Return undefined if column has too many distinct values.\n */\n protected abstract collectLowCardinality(\n tableName: string,\n column: Column,\n ): Promise<string[] | undefined>;\n\n /**\n * Parse CHECK constraint for enum-like IN clause.\n * Extracts values from patterns like:\n * - CHECK (status IN ('active', 'inactive'))\n * - CHECK ((status)::text = ANY (ARRAY['a'::text, 'b'::text]))\n * - CHECK (status = 'active' OR status = 'inactive')\n */\n protected parseCheckConstraint(\n constraint: TableConstraint,\n columnName: string,\n ): string[] | undefined {\n if (constraint.type !== 'CHECK' || !constraint.definition) {\n return undefined;\n }\n\n // Check if constraint applies to this column\n if (constraint.columns && !constraint.columns.includes(columnName)) {\n return undefined;\n }\n\n const def = constraint.definition;\n const escapedCol = this.escapeRegex(columnName);\n\n // Column pattern: matches column name with optional parens and type cast\n // e.g., \"status\", \"(status)\", \"((status)::text)\"\n const colPattern = `(?:\\\\(?\\\\(?${escapedCol}\\\\)?(?:::(?:text|varchar|character varying))?\\\\)?)`;\n\n // Pattern 1: column IN ('val1', 'val2', ...)\n const inMatch = def.match(\n new RegExp(`${colPattern}\\\\s+IN\\\\s*\\\\(([^)]+)\\\\)`, 'i'),\n );\n if (inMatch) {\n return this.extractStringValues(inMatch[1]);\n }\n\n // Pattern 2: PostgreSQL ANY(ARRAY[...])\n const anyMatch = def.match(\n new RegExp(\n `${colPattern}\\\\s*=\\\\s*ANY\\\\s*\\\\(\\\\s*(?:ARRAY)?\\\\s*\\\\[([^\\\\]]+)\\\\]`,\n 'i',\n ),\n );\n if (anyMatch) {\n return this.extractStringValues(anyMatch[1]);\n }\n\n // Pattern 3: column = 'val1' OR column = 'val2' ...\n const orPattern = new RegExp(\n `\\\\b${this.escapeRegex(columnName)}\\\\b\\\\s*=\\\\s*'([^']*)'`,\n 'gi',\n );\n const orMatches = [...def.matchAll(orPattern)];\n if (orMatches.length >= 2) {\n return orMatches.map((m) => m[1]);\n }\n\n return undefined;\n }\n\n /**\n * Extract string values from a comma-separated list.\n */\n private extractStringValues(input: string): string[] | undefined {\n const values: string[] = [];\n // Match quoted strings: 'value' or 'value'::type\n const matches = input.matchAll(/'([^']*)'/g);\n for (const match of matches) {\n values.push(match[1]);\n }\n return values.length > 0 ? values : undefined;\n }\n\n /**\n * Escape special regex characters in a string.\n */\n private escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n }\n\n /**\n * Get the table from context by name.\n */\n private getTable(ctx: GroundingContext, name: string): Table | undefined {\n return ctx.tables.find((t) => t.name === name);\n }\n\n /**\n * Execute the grounding process.\n * Annotates columns in ctx.tables and ctx.views with values.\n */\n async execute(ctx: GroundingContext): Promise<void> {\n // Process both tables and views\n const allContainers: ColumnContainer[] = [...ctx.tables, ...ctx.views];\n\n for (const container of allContainers) {\n const table = this.getTable(ctx, container.name);\n\n for (const column of container.columns) {\n try {\n const result = await this.resolveColumnValues(\n container.name,\n column,\n table?.constraints,\n );\n if (result) {\n column.kind = result.kind;\n column.values = result.values;\n }\n } catch (error) {\n console.warn(\n 'Error collecting column values for',\n container.name,\n column.name,\n error,\n );\n }\n }\n }\n }\n\n /**\n * Resolve column values from all sources in priority order.\n */\n private async resolveColumnValues(\n tableName: string,\n column: Column,\n constraints?: TableConstraint[],\n ): Promise<ColumnValuesResult | undefined> {\n // Priority 1: Native ENUM type\n const enumValues = await this.collectEnumValues(tableName, column);\n if (enumValues?.length) {\n return { kind: 'Enum', values: enumValues };\n }\n\n // Priority 2: CHECK constraint with IN clause\n if (constraints) {\n for (const constraint of constraints) {\n const checkValues = this.parseCheckConstraint(constraint, column.name);\n if (checkValues?.length) {\n return { kind: 'Enum', values: checkValues };\n }\n }\n }\n\n // Priority 3: Low cardinality data scan\n const lowCardValues = await this.collectLowCardinality(tableName, column);\n if (lowCardValues?.length) {\n return { kind: 'LowCardinality', values: lowCardValues };\n }\n\n return undefined;\n }\n}\n", "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 {\n type AgentModel,\n agent,\n generate,\n toState,\n user,\n} from '@deepagents/agent';\n\nimport type { Adapter } from '../adapter.ts';\nimport { AbstractGrounding } from './abstract.grounding.ts';\nimport type { GroundingContext } from './context.ts';\n\n/**\n * Cache interface for storing generated reports.\n */\nexport interface ReportCache {\n get(): Promise<string | null>;\n set(value: string): Promise<void>;\n}\n\n/**\n * Configuration for ReportGrounding.\n */\nexport interface ReportGroundingConfig {\n /** LLM model to use for generating the report */\n model?: AgentModel;\n /** Optional cache for storing generated reports */\n cache?: ReportCache;\n /** Force regeneration even if cached */\n forceRefresh?: boolean;\n}\n\nconst reportAgent = agent<unknown, { adapter: Adapter }>({\n name: 'db-report-agent',\n model: groq('openai/gpt-oss-20b'),\n prompt: () => dedent`\n <identity>\n You are a database analyst expert. Your job is to understand what\n a database represents and provide business context about it.\n You have READ-ONLY access to the database.\n </identity>\n\n <instructions>\n Write a business context that helps another agent answer questions accurately.\n\n For EACH table, do queries ONE AT A TIME:\n 1. SELECT COUNT(*) to get row count\n 2. SELECT * LIMIT 3 to see sample data\n\n Then write a report with:\n - What business this database is for\n - For each table: purpose, row count, and example of what the data looks like\n\n Include concrete examples like \"Track prices are $0.99\",\n \"Customer names like 'Lu\u00EDs Gon\u00E7alves'\", etc.\n\n Keep it 400-600 words, conversational style.\n </instructions>\n `,\n tools: {\n query_database: tool({\n description:\n 'Execute a SELECT query to explore the database and gather insights.',\n inputSchema: z.object({\n sql: z.string().describe('The SELECT query to execute'),\n purpose: z\n .string()\n .describe('What insight you are trying to gather with this query'),\n }),\n execute: ({ sql }, options) => {\n const state = toState<{ adapter: Adapter }>(options);\n return state.adapter.execute(sql);\n },\n }),\n },\n});\n\n/**\n * Grounding that generates a business context report about the database.\n *\n * Uses an LLM agent to:\n * 1. Query COUNT(*) for each table\n * 2. Query SELECT * LIMIT 3 for sample data\n * 3. Generate a 400-600 word business context report\n *\n * The report helps downstream agents understand what the database represents.\n */\nexport class ReportGrounding extends AbstractGrounding {\n #adapter: Adapter;\n #model: AgentModel;\n #cache?: ReportCache;\n #forceRefresh: boolean;\n\n constructor(adapter: Adapter, config: ReportGroundingConfig = {}) {\n super('business_context');\n this.#adapter = adapter;\n this.#model = config.model ?? groq('openai/gpt-oss-20b');\n this.#cache = config.cache;\n this.#forceRefresh = config.forceRefresh ?? false;\n }\n\n async execute(ctx: GroundingContext): Promise<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 { text } = await generate(\n reportAgent.clone({ model: this.#model }),\n [\n user(\n 'Please analyze the database and write a contextual report about what this database represents.',\n ),\n ],\n { adapter: this.#adapter },\n );\n\n return text;\n }\n}\n", "import type { Table } from '../adapter.ts';\nimport { AbstractGrounding } from './abstract.grounding.ts';\nimport type { GroundingContext } from './context.ts';\n\n/**\n * Configuration for RowCountGrounding.\n */\nexport interface RowCountGroundingConfig {\n // Future: filter which tables to count\n}\n\n/**\n * Abstract base class for row count grounding.\n *\n * Reads tables from the context and annotates them with row counts and size hints.\n * This grounding must run AFTER TableGrounding since it reads from ctx.tables.\n *\n * Subclasses implement the database-specific hook:\n * - `getRowCount()` - get row count for a table\n */\nexport abstract class RowCountGrounding extends AbstractGrounding {\n constructor(config: RowCountGroundingConfig = {}) {\n super('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 type { Adapter, ColumnStats } from '../adapter.ts';\nimport {\n ColumnStatsGrounding,\n type ColumnStatsGroundingConfig,\n} from '../groundings/column-stats.grounding.ts';\nimport type { Column } from '../groundings/column-values.grounding.ts';\n\ntype StatsRow = {\n min_value: string | null;\n max_value: string | null;\n null_fraction: number | string | null;\n};\n\n/**\n * MySQL/MariaDB implementation of ColumnStatsGrounding.\n *\n * Collects min/max/null statistics for numeric, date, and boolean columns.\n */\nexport class MysqlColumnStatsGrounding extends ColumnStatsGrounding {\n #adapter: Adapter;\n\n constructor(adapter: Adapter, config: ColumnStatsGroundingConfig = {}) {\n super(config);\n this.#adapter = adapter;\n }\n\n protected override async collectStats(\n tableName: string,\n column: Column,\n ): Promise<ColumnStats | undefined> {\n if (!this.#shouldCollectStats(column.type)) {\n return undefined;\n }\n\n const { schema, table } = this.#adapter.parseTableName(tableName);\n const database = schema || (await this.#getCurrentDatabase());\n\n const tableIdentifier = `${this.#adapter.quoteIdentifier(database)}.${this.#adapter.quoteIdentifier(table)}`;\n const columnIdentifier = this.#adapter.quoteIdentifier(column.name);\n\n try {\n const rows = await this.#adapter.runQuery<StatsRow>(`\n SELECT\n CAST(MIN(${columnIdentifier}) AS CHAR) AS min_value,\n CAST(MAX(${columnIdentifier}) AS CHAR) AS max_value,\n AVG(CASE WHEN ${columnIdentifier} IS NULL THEN 1.0 ELSE 0.0 END) AS null_fraction\n FROM ${tableIdentifier}\n `);\n\n if (!rows.length) {\n return undefined;\n }\n\n const min = rows[0]?.min_value ?? undefined;\n const max = rows[0]?.max_value ?? undefined;\n const nullFraction = this.#toNumber(rows[0]?.null_fraction);\n\n if (min == null && max == null && nullFraction == null) {\n return undefined;\n }\n\n return {\n min,\n max,\n nullFraction:\n nullFraction != null && Number.isFinite(nullFraction)\n ? Math.max(0, Math.min(1, nullFraction))\n : undefined,\n };\n } catch {\n return undefined;\n }\n }\n\n #shouldCollectStats(type: string | undefined): boolean {\n if (!type) {\n return false;\n }\n const normalized = type.toLowerCase();\n // Include numeric, date/time, and boolean types\n return /int|numeric|decimal|double|float|real|date|time|timestamp|datetime|bool|bit|year/.test(\n normalized,\n );\n }\n\n #toNumber(value: unknown): number | null {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value;\n }\n if (typeof value === 'bigint') {\n return Number(value);\n }\n if (typeof value === 'string' && value.trim() !== '') {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : null;\n }\n return null;\n }\n\n async #getCurrentDatabase(): Promise<string> {\n const rows = await this.#adapter.runQuery<{ db: string | null }>(\n 'SELECT DATABASE() AS db',\n );\n return rows[0]?.db ?? '';\n }\n}\n", "import type { Adapter } from '../adapter.ts';\nimport {\n type Column,\n ColumnValuesGrounding,\n type ColumnValuesGroundingConfig,\n} from '../groundings/column-values.grounding.ts';\n\ntype ColumnTypeRow = {\n COLUMN_TYPE: string | null;\n};\n\n/**\n * MySQL/MariaDB implementation of ColumnValuesGrounding.\n *\n * Detects:\n * 1. Native ENUM types - parses values from COLUMN_TYPE\n * 2. Low cardinality columns - via data scan\n */\nexport class MysqlColumnValuesGrounding extends ColumnValuesGrounding {\n #adapter: Adapter;\n\n constructor(adapter: Adapter, config: ColumnValuesGroundingConfig = {}) {\n super(config);\n this.#adapter = adapter;\n }\n\n /**\n * Detect native MySQL ENUM types and extract their values.\n */\n protected override async collectEnumValues(\n tableName: string,\n column: Column,\n ): Promise<string[] | undefined> {\n const { schema, table } = this.#adapter.parseTableName(tableName);\n const database = schema || (await this.#getCurrentDatabase());\n\n const rows = await this.#adapter.runQuery<ColumnTypeRow>(`\n SELECT COLUMN_TYPE\n FROM INFORMATION_SCHEMA.COLUMNS\n WHERE TABLE_SCHEMA = '${this.#adapter.escapeString(database)}'\n AND TABLE_NAME = '${this.#adapter.escapeString(table)}'\n AND COLUMN_NAME = '${this.#adapter.escapeString(column.name)}'\n `);\n\n const columnType = rows[0]?.COLUMN_TYPE;\n if (!columnType) return undefined;\n\n // Check if it's an ENUM type: enum('val1','val2','val3')\n const enumMatch = columnType.match(/^enum\\((.+)\\)$/i);\n if (!enumMatch) return undefined;\n\n // Parse enum values\n return this.#parseEnumValues(enumMatch[1]);\n }\n\n /**\n * Collect distinct values for low cardinality columns.\n */\n protected override async collectLowCardinality(\n tableName: string,\n column: Column,\n ): Promise<string[] | undefined> {\n const { schema, table } = this.#adapter.parseTableName(tableName);\n const database = schema || (await this.#getCurrentDatabase());\n\n const tableIdentifier = `${this.#adapter.quoteIdentifier(database)}.${this.#adapter.quoteIdentifier(table)}`;\n const columnIdentifier = this.#adapter.quoteIdentifier(column.name);\n const limit = this.lowCardinalityLimit + 1;\n\n try {\n const rows = await this.#adapter.runQuery<{ value: unknown }>(`\n SELECT DISTINCT ${columnIdentifier} AS value\n FROM ${tableIdentifier}\n WHERE ${columnIdentifier} IS NOT NULL\n LIMIT ${limit}\n `);\n\n if (!rows.length || rows.length > this.lowCardinalityLimit) {\n return undefined;\n }\n\n const values: string[] = [];\n for (const row of rows) {\n const formatted = this.#normalizeValue(row.value);\n if (formatted === null) {\n return undefined;\n }\n values.push(formatted);\n }\n\n return values.length > 0 ? values : undefined;\n } catch {\n return undefined;\n }\n }\n\n /**\n * Parse ENUM values from the COLUMN_TYPE string.\n * Input: \"'val1','val2','val3'\"\n * Output: ['val1', 'val2', 'val3']\n */\n #parseEnumValues(enumString: string): string[] {\n const values: string[] = [];\n // Match quoted strings, handling escaped quotes\n const regex = /'((?:[^'\\\\]|\\\\.|'')*)'/g;\n let match;\n while ((match = regex.exec(enumString)) !== null) {\n // Unescape any escaped quotes\n const value = match[1]\n .replace(/''/g, \"'\")\n .replace(/\\\\'/g, \"'\")\n .replace(/\\\\\\\\/g, '\\\\');\n values.push(value);\n }\n return values;\n }\n\n #normalizeValue(value: unknown): string | null {\n if (value === null || value === undefined) {\n return null;\n }\n if (typeof value === 'string') {\n return value;\n }\n if (typeof value === 'number' || typeof value === 'bigint') {\n return String(value);\n }\n if (typeof value === 'boolean') {\n return value ? 'true' : 'false';\n }\n if (value instanceof Date) {\n return value.toISOString();\n }\n if (typeof Buffer !== 'undefined' && Buffer.isBuffer(value)) {\n return value.toString('utf-8');\n }\n return null;\n }\n\n async #getCurrentDatabase(): Promise<string> {\n const rows = await this.#adapter.runQuery<{ db: string | null }>(\n 'SELECT DATABASE() AS db',\n );\n return rows[0]?.db ?? '';\n }\n}\n", "import type { Adapter, TableConstraint } from '../adapter.ts';\nimport {\n ConstraintGrounding,\n type ConstraintGroundingConfig,\n} from '../groundings/constraint.grounding.ts';\n\ntype ConstraintRow = {\n CONSTRAINT_NAME: string | null;\n CONSTRAINT_TYPE: string | null;\n COLUMN_NAME: string | null;\n REFERENCED_TABLE_SCHEMA: string | null;\n REFERENCED_TABLE_NAME: string | null;\n REFERENCED_COLUMN_NAME: string | null;\n};\n\ntype ColumnRow = {\n COLUMN_NAME: string | null;\n IS_NULLABLE: string | null;\n COLUMN_DEFAULT: string | null;\n};\n\ntype CheckConstraintRow = {\n CONSTRAINT_NAME: string | null;\n CHECK_CLAUSE: string | null;\n};\n\n/**\n * MySQL/MariaDB implementation of ConstraintGrounding.\n *\n * Collects PRIMARY KEY, FOREIGN KEY, UNIQUE, NOT_NULL, DEFAULT, and CHECK constraints.\n */\nexport class MysqlConstraintGrounding extends ConstraintGrounding {\n #adapter: Adapter;\n\n constructor(adapter: Adapter, config: ConstraintGroundingConfig = {}) {\n super(config);\n this.#adapter = adapter;\n }\n\n protected override async getConstraints(\n tableName: string,\n ): Promise<TableConstraint[]> {\n const { schema, table } = this.#adapter.parseTableName(tableName);\n const database = schema || (await this.#getCurrentDatabase());\n const constraints: TableConstraint[] = [];\n\n // Get PRIMARY KEY, UNIQUE, and FOREIGN KEY constraints\n const constraintRows = await this.#adapter.runQuery<ConstraintRow>(`\n SELECT\n tc.CONSTRAINT_NAME,\n tc.CONSTRAINT_TYPE,\n kcu.COLUMN_NAME,\n kcu.REFERENCED_TABLE_SCHEMA,\n kcu.REFERENCED_TABLE_NAME,\n kcu.REFERENCED_COLUMN_NAME\n FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc\n LEFT JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu\n ON tc.CONSTRAINT_NAME = kcu.CONSTRAINT_NAME\n AND tc.TABLE_SCHEMA = kcu.TABLE_SCHEMA\n AND tc.TABLE_NAME = kcu.TABLE_NAME\n WHERE tc.TABLE_SCHEMA = '${this.#adapter.escapeString(database)}'\n AND tc.TABLE_NAME = '${this.#adapter.escapeString(table)}'\n AND tc.CONSTRAINT_TYPE IN ('PRIMARY KEY', 'UNIQUE', 'FOREIGN KEY')\n ORDER BY tc.CONSTRAINT_NAME, kcu.ORDINAL_POSITION\n `);\n\n // Group by constraint name\n const constraintMap = new Map<\n string,\n {\n type: TableConstraint['type'];\n columns: string[];\n referencedTable?: string;\n referencedColumns?: string[];\n }\n >();\n\n for (const row of constraintRows) {\n if (!row.CONSTRAINT_NAME || !row.COLUMN_NAME) continue;\n\n const existing = constraintMap.get(row.CONSTRAINT_NAME);\n if (existing) {\n existing.columns.push(row.COLUMN_NAME);\n if (row.REFERENCED_COLUMN_NAME) {\n existing.referencedColumns = existing.referencedColumns ?? [];\n existing.referencedColumns.push(row.REFERENCED_COLUMN_NAME);\n }\n } else {\n const type = this.#mapConstraintType(row.CONSTRAINT_TYPE);\n if (!type) continue;\n\n const entry: {\n type: TableConstraint['type'];\n columns: string[];\n referencedTable?: string;\n referencedColumns?: string[];\n } = {\n type,\n columns: [row.COLUMN_NAME],\n };\n\n if (type === 'FOREIGN_KEY' && row.REFERENCED_TABLE_NAME) {\n entry.referencedTable = row.REFERENCED_TABLE_SCHEMA\n ? `${row.REFERENCED_TABLE_SCHEMA}.${row.REFERENCED_TABLE_NAME}`\n : row.REFERENCED_TABLE_NAME;\n if (row.REFERENCED_COLUMN_NAME) {\n entry.referencedColumns = [row.REFERENCED_COLUMN_NAME];\n }\n }\n\n constraintMap.set(row.CONSTRAINT_NAME, entry);\n }\n }\n\n for (const [name, data] of constraintMap) {\n constraints.push({\n name,\n type: data.type,\n columns: data.columns,\n referencedTable: data.referencedTable,\n referencedColumns: data.referencedColumns,\n });\n }\n\n // Get NOT_NULL and DEFAULT constraints from column metadata\n const columnRows = await this.#adapter.runQuery<ColumnRow>(`\n SELECT COLUMN_NAME, IS_NULLABLE, COLUMN_DEFAULT\n FROM INFORMATION_SCHEMA.COLUMNS\n WHERE TABLE_SCHEMA = '${this.#adapter.escapeString(database)}'\n AND TABLE_NAME = '${this.#adapter.escapeString(table)}'\n `);\n\n // Find PK columns to exclude from NOT_NULL (PK columns are implicitly NOT NULL)\n const pkConstraint = constraints.find((c) => c.type === 'PRIMARY_KEY');\n const pkColumns = new Set(pkConstraint?.columns ?? []);\n\n for (const row of columnRows) {\n if (!row.COLUMN_NAME) continue;\n\n // NOT NULL constraint - exclude PK columns which are implicitly NOT NULL\n if (row.IS_NULLABLE === 'NO' && !pkColumns.has(row.COLUMN_NAME)) {\n constraints.push({\n name: `${row.COLUMN_NAME}_not_null`,\n type: 'NOT_NULL',\n columns: [row.COLUMN_NAME],\n });\n }\n\n if (row.COLUMN_DEFAULT !== null) {\n constraints.push({\n name: `${row.COLUMN_NAME}_default`,\n type: 'DEFAULT',\n columns: [row.COLUMN_NAME],\n defaultValue: row.COLUMN_DEFAULT,\n });\n }\n }\n\n // Get CHECK constraints (MySQL 8.0.16+ and MariaDB 10.2.1+)\n try {\n const checkRows = await this.#adapter.runQuery<CheckConstraintRow>(`\n SELECT CONSTRAINT_NAME, CHECK_CLAUSE\n FROM INFORMATION_SCHEMA.CHECK_CONSTRAINTS\n WHERE CONSTRAINT_SCHEMA = '${this.#adapter.escapeString(database)}'\n `);\n\n // Get constraint-to-table mapping\n const checkTableRows = await this.#adapter.runQuery<{\n CONSTRAINT_NAME: string;\n TABLE_NAME: string;\n }>(`\n SELECT CONSTRAINT_NAME, TABLE_NAME\n FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS\n WHERE TABLE_SCHEMA = '${this.#adapter.escapeString(database)}'\n AND TABLE_NAME = '${this.#adapter.escapeString(table)}'\n AND CONSTRAINT_TYPE = 'CHECK'\n `);\n\n const checkTableMap = new Map(\n checkTableRows.map((r) => [r.CONSTRAINT_NAME, r.TABLE_NAME]),\n );\n\n for (const row of checkRows) {\n if (!row.CONSTRAINT_NAME) continue;\n // Only include checks for this table\n if (checkTableMap.get(row.CONSTRAINT_NAME) !== table) continue;\n\n constraints.push({\n name: row.CONSTRAINT_NAME,\n type: 'CHECK',\n definition: row.CHECK_CLAUSE ?? undefined,\n });\n }\n } catch {\n // CHECK_CONSTRAINTS table might not exist in older MySQL versions\n }\n\n return constraints;\n }\n\n #mapConstraintType(type: string | null): TableConstraint['type'] | null {\n switch (type) {\n case 'PRIMARY KEY':\n return 'PRIMARY_KEY';\n case 'UNIQUE':\n return 'UNIQUE';\n case 'FOREIGN KEY':\n return 'FOREIGN_KEY';\n default:\n return null;\n }\n }\n\n async #getCurrentDatabase(): Promise<string> {\n const rows = await this.#adapter.runQuery<{ db: string | null }>(\n 'SELECT DATABASE() AS db',\n );\n return rows[0]?.db ?? '';\n }\n}\n", "import type { Adapter, TableIndex } from '../adapter.ts';\nimport {\n IndexesGrounding,\n type IndexesGroundingConfig,\n} from '../groundings/indexes.grounding.ts';\n\ntype IndexRow = {\n INDEX_NAME: string | null;\n COLUMN_NAME: string | null;\n NON_UNIQUE: number | null;\n INDEX_TYPE: string | null;\n SEQ_IN_INDEX: number | null;\n};\n\n/**\n * MySQL/MariaDB implementation of IndexesGrounding.\n *\n * Uses INFORMATION_SCHEMA.STATISTICS for index metadata.\n */\nexport class MysqlIndexesGrounding extends IndexesGrounding {\n #adapter: Adapter;\n\n constructor(adapter: Adapter, config: IndexesGroundingConfig = {}) {\n super(config);\n this.#adapter = adapter;\n }\n\n protected override async getIndexes(\n tableName: string,\n ): Promise<TableIndex[]> {\n const { schema, table } = this.#adapter.parseTableName(tableName);\n const database = schema || (await this.#getCurrentDatabase());\n\n const rows = await this.#adapter.runQuery<IndexRow>(`\n SELECT\n INDEX_NAME,\n COLUMN_NAME,\n NON_UNIQUE,\n INDEX_TYPE,\n SEQ_IN_INDEX\n FROM INFORMATION_SCHEMA.STATISTICS\n WHERE TABLE_SCHEMA = '${this.#adapter.escapeString(database)}'\n AND TABLE_NAME = '${this.#adapter.escapeString(table)}'\n ORDER BY INDEX_NAME, SEQ_IN_INDEX\n `);\n\n const indexMap = new Map<string, TableIndex>();\n\n for (const row of rows) {\n if (!row.INDEX_NAME) continue;\n\n let index = indexMap.get(row.INDEX_NAME);\n if (!index) {\n index = {\n name: row.INDEX_NAME,\n columns: [],\n unique: row.NON_UNIQUE === 0,\n type: row.INDEX_TYPE ?? undefined,\n };\n indexMap.set(row.INDEX_NAME, index);\n }\n\n if (row.COLUMN_NAME) {\n index.columns.push(row.COLUMN_NAME);\n }\n }\n\n return Array.from(indexMap.values());\n }\n\n async #getCurrentDatabase(): Promise<string> {\n const rows = await this.#adapter.runQuery<{ db: string | null }>(\n 'SELECT DATABASE() AS db',\n );\n return rows[0]?.db ?? '';\n }\n}\n", "import type { Adapter, AdapterInfo } from '../adapter.ts';\nimport {\n InfoGrounding,\n type InfoGroundingConfig,\n} from '../groundings/info.grounding.ts';\n\n/**\n * MySQL/MariaDB implementation of InfoGrounding.\n *\n * Detects whether the database is MySQL or MariaDB based on version string.\n */\nexport class MysqlInfoGrounding extends InfoGrounding {\n #adapter: Adapter;\n\n constructor(adapter: Adapter, config: InfoGroundingConfig = {}) {\n super(config);\n this.#adapter = adapter;\n }\n\n protected override async collectInfo(): Promise<AdapterInfo> {\n const [versionRows, dbRows] = await Promise.all([\n this.#adapter.runQuery<{ version: string }>(\n 'SELECT VERSION() AS version',\n ),\n this.#adapter.runQuery<{ db: string | null }>('SELECT DATABASE() AS db'),\n ]);\n\n const version = versionRows[0]?.version;\n const database = dbRows[0]?.db ?? undefined;\n\n // Detect dialect: MariaDB version strings contain 'MariaDB'\n const isMariadb = version?.toLowerCase().includes('mariadb') ?? false;\n const dialect = isMariadb ? 'mariadb' : 'mysql';\n\n return {\n dialect,\n version,\n database,\n details: {\n parameterPlaceholder: '?',\n },\n };\n }\n}\n", "import {\n Adapter,\n type ExecuteFunction,\n type GroundingFn,\n type ValidateFunction,\n} from '../adapter.ts';\n\nexport type MysqlAdapterOptions = {\n execute: ExecuteFunction;\n validate?: ValidateFunction;\n grounding: GroundingFn[];\n /** Database names to include (defaults to excluding system databases) */\n databases?: string[];\n};\n\nconst MYSQL_ERROR_MAP: Record<string, { type: string; hint: string }> = {\n '1146': {\n type: 'MISSING_TABLE',\n hint: 'Check the database for the correct table name. Include the database prefix if necessary.',\n },\n '1054': {\n type: 'INVALID_COLUMN',\n hint: 'Verify the column exists on the referenced table and use table aliases to disambiguate.',\n },\n '1064': {\n type: 'SYNTAX_ERROR',\n hint: 'There is a SQL syntax error. Review keywords, punctuation, and the overall query shape.',\n },\n '1630': {\n type: 'INVALID_FUNCTION',\n hint: 'The function does not exist or the arguments are invalid.',\n },\n '1305': {\n type: 'INVALID_FUNCTION',\n hint: 'The function or procedure you used is not recognized. Confirm its name and argument types.',\n },\n '1109': {\n type: 'MISSING_TABLE',\n hint: 'Unknown table in the query. Verify table name and database.',\n },\n '1051': {\n type: 'MISSING_TABLE',\n hint: 'Unknown table. Check if the table exists in the current database.',\n },\n};\n\nfunction isMysqlError(\n error: unknown,\n): error is { errno?: number; code?: string; message?: string } {\n return (\n typeof error === 'object' &&\n error !== null &&\n ('errno' in error || 'code' in error)\n );\n}\n\nexport function formatMysqlError(sql: string, error: unknown) {\n const errorMessage =\n error instanceof Error\n ? error.message\n : typeof error === 'string'\n ? error\n : 'Unknown error occurred';\n\n if (isMysqlError(error)) {\n const errorCode = error.errno?.toString() ?? error.code ?? '';\n const metadata = MYSQL_ERROR_MAP[errorCode];\n if (metadata) {\n return {\n error: errorMessage,\n error_type: metadata.type,\n suggestion: metadata.hint,\n sql_attempted: sql,\n };\n }\n }\n\n return {\n error: errorMessage,\n error_type: 'UNKNOWN_ERROR',\n suggestion: 'Review the query and try again',\n sql_attempted: sql,\n };\n}\n\nexport class Mysql extends Adapter {\n #options: MysqlAdapterOptions;\n override readonly grounding: GroundingFn[];\n override readonly defaultSchema: string | undefined = undefined;\n override readonly systemSchemas = [\n 'mysql',\n 'information_schema',\n 'performance_schema',\n 'sys',\n ];\n\n constructor(options: MysqlAdapterOptions) {\n super();\n if (!options || typeof options.execute !== 'function') {\n throw new Error('Mysql adapter requires an execute function.');\n }\n this.#options = {\n ...options,\n databases: options.databases?.length ? options.databases : undefined,\n };\n this.grounding = options.grounding;\n }\n\n override async execute(sql: string) {\n return this.#options.execute(sql);\n }\n\n override async validate(sql: string) {\n const validator: ValidateFunction =\n this.#options.validate ??\n (async (text: string) => {\n await this.#options.execute(`EXPLAIN ${text}`);\n });\n\n try {\n return await validator(sql);\n } catch (error) {\n return JSON.stringify(formatMysqlError(sql, error));\n }\n }\n\n override async runQuery<Row>(sql: string): Promise<Row[]> {\n return this.#runIntrospectionQuery<Row>(sql);\n }\n\n override quoteIdentifier(name: string): string {\n return `\\`${name.replace(/`/g, '``')}\\``;\n }\n\n override escape(value: string): string {\n return value.replace(/`/g, '``');\n }\n\n override buildSampleRowsQuery(\n tableName: string,\n columns: string[] | undefined,\n limit: number,\n ): string {\n const { schema, table } = this.parseTableName(tableName);\n const tableIdentifier = schema\n ? `${this.quoteIdentifier(schema)}.${this.quoteIdentifier(table)}`\n : this.quoteIdentifier(table);\n const columnList = columns?.length\n ? columns.map((c) => this.quoteIdentifier(c)).join(', ')\n : '*';\n return `SELECT ${columnList} FROM ${tableIdentifier} LIMIT ${limit}`;\n }\n\n /**\n * Get the configured databases filter.\n */\n get databases(): string[] | undefined {\n return this.#options.databases;\n }\n\n async #runIntrospectionQuery<Row>(sql: string): Promise<Row[]> {\n const result = await this.#options.execute(sql);\n\n // Handle mysql2 results: [rows, fields]\n if (Array.isArray(result)) {\n // If it's [rows, fields], use the first element\n if (\n result.length >= 1 &&\n Array.isArray(result[0]) &&\n (result.length === 1 ||\n (result.length === 2 && !Array.isArray(result[1]?.[0])))\n ) {\n return result[0] as Row[];\n }\n return result as Row[];\n }\n\n // Handle object with rows property\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 'Mysql adapter execute() must return an array of rows or an object with a rows array when introspecting.',\n );\n }\n}\n\n// Re-export as Mariadb for convenience\nexport { Mysql as Mariadb };\n", "import type { Adapter } from '../adapter.ts';\nimport {\n RowCountGrounding,\n type RowCountGroundingConfig,\n} from '../groundings/row-count.grounding.ts';\n\n/**\n * MySQL/MariaDB implementation of RowCountGrounding.\n *\n * Uses COUNT(*) for accurate row counts.\n */\nexport class MysqlRowCountGrounding extends RowCountGrounding {\n #adapter: Adapter;\n\n constructor(adapter: Adapter, config: RowCountGroundingConfig = {}) {\n super(config);\n this.#adapter = adapter;\n }\n\n protected override async getRowCount(\n tableName: string,\n ): Promise<number | undefined> {\n const { schema, table } = this.#adapter.parseTableName(tableName);\n const database = schema || (await this.#getCurrentDatabase());\n\n const tableIdentifier = `${this.#adapter.quoteIdentifier(database)}.${this.#adapter.quoteIdentifier(table)}`;\n\n try {\n const rows = await this.#adapter.runQuery<{\n count: number | string | bigint | null;\n }>(`SELECT COUNT(*) AS count FROM ${tableIdentifier}`);\n\n return this.#toNumber(rows[0]?.count);\n } catch {\n return undefined;\n }\n }\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 async #getCurrentDatabase(): Promise<string> {\n const rows = await this.#adapter.runQuery<{ db: string | null }>(\n 'SELECT DATABASE() AS db',\n );\n return rows[0]?.db ?? '';\n }\n}\n", "import type { Adapter, Relationship, Table } from '../adapter.ts';\nimport {\n TableGrounding,\n type TableGroundingConfig,\n} from '../groundings/table.grounding.ts';\nimport type { Mysql } from './mysql.ts';\n\ntype ColumnRow = {\n COLUMN_NAME: string | null;\n DATA_TYPE: string | null;\n COLUMN_TYPE: string | null;\n};\n\ntype RelationshipRow = {\n TABLE_SCHEMA: string | null;\n TABLE_NAME: string | null;\n COLUMN_NAME: string | null;\n REFERENCED_TABLE_SCHEMA: string | null;\n REFERENCED_TABLE_NAME: string | null;\n REFERENCED_COLUMN_NAME: string | null;\n CONSTRAINT_NAME: string | null;\n};\n\nexport interface MysqlTableGroundingConfig extends TableGroundingConfig {\n /** Databases to include (defaults to excluding system databases) */\n databases?: string[];\n}\n\n/**\n * MySQL/MariaDB implementation of TableGrounding.\n *\n * Uses INFORMATION_SCHEMA for introspection which is compatible\n * with both MySQL and MariaDB.\n */\nexport class MysqlTableGrounding extends TableGrounding {\n #adapter: Adapter;\n #databases?: string[];\n\n constructor(adapter: Adapter, config: MysqlTableGroundingConfig = {}) {\n super(config);\n this.#adapter = adapter;\n this.#databases = config.databases ?? (adapter as Mysql).databases;\n }\n\n protected override async getAllTableNames(): Promise<string[]> {\n const rows = await this.#adapter.runQuery<{ name: string }>(`\n SELECT DISTINCT CONCAT(TABLE_SCHEMA, '.', TABLE_NAME) AS name\n FROM INFORMATION_SCHEMA.TABLES\n WHERE TABLE_TYPE = 'BASE TABLE'\n ${this.#buildDatabaseFilter('TABLE_SCHEMA')}\n ORDER BY name\n `);\n return rows.map((r) => r.name);\n }\n\n protected override async getTable(tableName: string): Promise<Table> {\n const { schema, table } = this.#adapter.parseTableName(tableName);\n const database = schema || (await this.#getCurrentDatabase());\n\n const columns = await this.#adapter.runQuery<ColumnRow>(`\n SELECT COLUMN_NAME, DATA_TYPE, COLUMN_TYPE\n FROM INFORMATION_SCHEMA.COLUMNS\n WHERE TABLE_SCHEMA = '${this.#adapter.escapeString(database)}'\n AND TABLE_NAME = '${this.#adapter.escapeString(table)}'\n ORDER BY ORDINAL_POSITION\n `);\n\n return {\n name: tableName,\n schema: database,\n rawName: table,\n columns: columns.map((col) => ({\n name: col.COLUMN_NAME ?? 'unknown',\n type: col.DATA_TYPE ?? 'unknown',\n })),\n };\n }\n\n protected override async findOutgoingRelations(\n tableName: string,\n ): Promise<Relationship[]> {\n const { schema, table } = this.#adapter.parseTableName(tableName);\n const database = schema || (await this.#getCurrentDatabase());\n\n const rows = await this.#adapter.runQuery<RelationshipRow>(`\n SELECT\n kcu.CONSTRAINT_NAME,\n kcu.TABLE_SCHEMA,\n kcu.TABLE_NAME,\n kcu.COLUMN_NAME,\n kcu.REFERENCED_TABLE_SCHEMA,\n kcu.REFERENCED_TABLE_NAME,\n kcu.REFERENCED_COLUMN_NAME\n FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu\n WHERE kcu.TABLE_SCHEMA = '${this.#adapter.escapeString(database)}'\n AND kcu.TABLE_NAME = '${this.#adapter.escapeString(table)}'\n AND kcu.REFERENCED_TABLE_NAME IS NOT NULL\n ORDER BY kcu.CONSTRAINT_NAME, kcu.ORDINAL_POSITION\n `);\n\n return this.#groupRelationships(rows);\n }\n\n protected override async findIncomingRelations(\n tableName: string,\n ): Promise<Relationship[]> {\n const { schema, table } = this.#adapter.parseTableName(tableName);\n const database = schema || (await this.#getCurrentDatabase());\n\n const rows = await this.#adapter.runQuery<RelationshipRow>(`\n SELECT\n kcu.CONSTRAINT_NAME,\n kcu.TABLE_SCHEMA,\n kcu.TABLE_NAME,\n kcu.COLUMN_NAME,\n kcu.REFERENCED_TABLE_SCHEMA,\n kcu.REFERENCED_TABLE_NAME,\n kcu.REFERENCED_COLUMN_NAME\n FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu\n WHERE kcu.REFERENCED_TABLE_SCHEMA = '${this.#adapter.escapeString(database)}'\n AND kcu.REFERENCED_TABLE_NAME = '${this.#adapter.escapeString(table)}'\n ORDER BY kcu.CONSTRAINT_NAME, kcu.ORDINAL_POSITION\n `);\n\n return this.#groupRelationships(rows);\n }\n\n #groupRelationships(rows: RelationshipRow[]): Relationship[] {\n const relationships = new Map<string, Relationship>();\n\n for (const row of rows) {\n if (\n !row.TABLE_NAME ||\n !row.REFERENCED_TABLE_NAME ||\n !row.CONSTRAINT_NAME\n ) {\n continue;\n }\n\n const schema = row.TABLE_SCHEMA ?? '';\n const referencedSchema = row.REFERENCED_TABLE_SCHEMA ?? '';\n const key = `${schema}.${row.TABLE_NAME}:${row.CONSTRAINT_NAME}`;\n\n const relationship = relationships.get(key) ?? {\n table: `${schema}.${row.TABLE_NAME}`,\n from: [],\n referenced_table: `${referencedSchema}.${row.REFERENCED_TABLE_NAME}`,\n to: [],\n };\n\n relationship.from.push(row.COLUMN_NAME ?? 'unknown');\n relationship.to.push(row.REFERENCED_COLUMN_NAME ?? 'unknown');\n\n relationships.set(key, relationship);\n }\n\n return Array.from(relationships.values());\n }\n\n #buildDatabaseFilter(columnName: string): string {\n if (this.#databases && this.#databases.length > 0) {\n const values = this.#databases\n .map((db) => `'${this.#adapter.escapeString(db)}'`)\n .join(', ');\n return `AND ${columnName} IN (${values})`;\n }\n\n // Exclude system databases by default\n const systemDbs = this.#adapter.systemSchemas\n .map((db) => `'${this.#adapter.escapeString(db)}'`)\n .join(', ');\n return `AND ${columnName} NOT IN (${systemDbs})`;\n }\n\n async #getCurrentDatabase(): Promise<string> {\n const rows = await this.#adapter.runQuery<{ db: string | null }>(\n 'SELECT DATABASE() AS db',\n );\n return rows[0]?.db ?? '';\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 { Mysql } from './mysql.ts';\n\ntype ColumnRow = {\n COLUMN_NAME: string | null;\n DATA_TYPE: string | null;\n};\n\ntype ViewRow = {\n VIEW_DEFINITION: string | null;\n};\n\nexport interface MysqlViewGroundingConfig extends ViewGroundingConfig {\n /** Databases to include (defaults to excluding system databases) */\n databases?: string[];\n}\n\n/**\n * MySQL/MariaDB implementation of ViewGrounding.\n *\n * Uses INFORMATION_SCHEMA for view introspection.\n */\nexport class MysqlViewGrounding extends ViewGrounding {\n #adapter: Adapter;\n #databases?: string[];\n\n constructor(adapter: Adapter, config: MysqlViewGroundingConfig = {}) {\n super(config);\n this.#adapter = adapter;\n this.#databases = config.databases ?? (adapter as Mysql).databases;\n }\n\n protected override async getAllViewNames(): Promise<string[]> {\n const rows = await this.#adapter.runQuery<{ name: string }>(`\n SELECT DISTINCT CONCAT(TABLE_SCHEMA, '.', TABLE_NAME) AS name\n FROM INFORMATION_SCHEMA.VIEWS\n WHERE 1=1\n ${this.#buildDatabaseFilter('TABLE_SCHEMA')}\n ORDER BY name\n `);\n return rows.map((r) => r.name);\n }\n\n protected override async getView(viewName: string): Promise<View> {\n const { schema, table } = this.#adapter.parseTableName(viewName);\n const database = schema || (await this.#getCurrentDatabase());\n\n // Get columns\n const columns = await this.#adapter.runQuery<ColumnRow>(`\n SELECT COLUMN_NAME, DATA_TYPE\n FROM INFORMATION_SCHEMA.COLUMNS\n WHERE TABLE_SCHEMA = '${this.#adapter.escapeString(database)}'\n AND TABLE_NAME = '${this.#adapter.escapeString(table)}'\n ORDER BY ORDINAL_POSITION\n `);\n\n // Get view definition\n const viewRows = await this.#adapter.runQuery<ViewRow>(`\n SELECT VIEW_DEFINITION\n FROM INFORMATION_SCHEMA.VIEWS\n WHERE TABLE_SCHEMA = '${this.#adapter.escapeString(database)}'\n AND TABLE_NAME = '${this.#adapter.escapeString(table)}'\n `);\n\n return {\n name: viewName,\n schema: database,\n rawName: table,\n definition: viewRows[0]?.VIEW_DEFINITION ?? undefined,\n columns: columns.map((col) => ({\n name: col.COLUMN_NAME ?? 'unknown',\n type: col.DATA_TYPE ?? 'unknown',\n })),\n };\n }\n\n #buildDatabaseFilter(columnName: string): string {\n if (this.#databases && this.#databases.length > 0) {\n const values = this.#databases\n .map((db) => `'${this.#adapter.escapeString(db)}'`)\n .join(', ');\n return `AND ${columnName} IN (${values})`;\n }\n\n // Exclude system databases by default\n const systemDbs = this.#adapter.systemSchemas\n .map((db) => `'${this.#adapter.escapeString(db)}'`)\n .join(', ');\n return `AND ${columnName} NOT IN (${systemDbs})`;\n }\n\n async #getCurrentDatabase(): Promise<string> {\n const rows = await this.#adapter.runQuery<{ db: string | null }>(\n 'SELECT DATABASE() AS db',\n );\n return rows[0]?.db ?? '';\n }\n}\n", "import { type Adapter } from '../adapter.ts';\nimport { type ColumnStatsGroundingConfig } from '../groundings/column-stats.grounding.ts';\nimport { type ColumnValuesGroundingConfig } from '../groundings/column-values.grounding.ts';\nimport { type ConstraintGroundingConfig } from '../groundings/constraint.grounding.ts';\nimport { type IndexesGroundingConfig } from '../groundings/indexes.grounding.ts';\nimport { type InfoGroundingConfig } from '../groundings/info.grounding.ts';\nimport {\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 { MysqlColumnStatsGrounding } from './column-stats.mysql.grounding.ts';\nimport { MysqlColumnValuesGrounding } from './column-values.mysql.grounding.ts';\nimport { MysqlConstraintGrounding } from './constraint.mysql.grounding.ts';\nimport { MysqlIndexesGrounding } from './indexes.mysql.grounding.ts';\nimport { MysqlInfoGrounding } from './info.mysql.grounding.ts';\nimport { Mariadb, Mysql } from './mysql.ts';\nimport { MysqlRowCountGrounding } from './row-count.mysql.grounding.ts';\nimport { MysqlTableGrounding } from './table.mysql.grounding.ts';\nimport { MysqlViewGrounding } from './view.mysql.grounding.ts';\n\nexport * from './mysql.ts';\n\nexport function tables(config: TableGroundingConfig = {}) {\n return (adapter: Adapter) => new MysqlTableGrounding(adapter, config);\n}\n\nexport function info(config: InfoGroundingConfig = {}) {\n return (adapter: Adapter) => new MysqlInfoGrounding(adapter, config);\n}\n\nexport function views(config: ViewGroundingConfig = {}) {\n return (adapter: Adapter) => {\n return new MysqlViewGrounding(adapter, config);\n };\n}\n\nexport function columnStats(config: ColumnStatsGroundingConfig = {}) {\n return (adapter: Adapter) => {\n return new MysqlColumnStatsGrounding(adapter, config);\n };\n}\n\nexport function columnValues(config: ColumnValuesGroundingConfig = {}) {\n return (adapter: Adapter) => {\n return new MysqlColumnValuesGrounding(adapter, config);\n };\n}\n\nexport function indexes(config: IndexesGroundingConfig = {}) {\n return (adapter: Adapter) => {\n return new MysqlIndexesGrounding(adapter, config);\n };\n}\n\nexport function rowCount(config: RowCountGroundingConfig = {}) {\n return (adapter: Adapter) => {\n return new MysqlRowCountGrounding(adapter, config);\n };\n}\n\nexport function constraints(config: ConstraintGroundingConfig = {}) {\n return (adapter: Adapter) => {\n return new MysqlConstraintGrounding(adapter, config);\n };\n}\n\nexport function report(config: ReportGroundingConfig = {}) {\n return (adapter: Adapter) => new ReportGrounding(adapter, config);\n}\n\nexport default {\n tables,\n info,\n views,\n columnStats,\n columnValues,\n indexes,\n rowCount,\n constraints,\n report,\n Mysql,\n Mariadb,\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["c", "column", "constraint", "table", "column", "constraints", "table", "table", "index", "column", "report", "table", "tables", "column", "table", "column", "table", "table", "constraints", "table", "index", "table", "table", "table", "relationship", "views", "table"]
7
7
  }