@deepagents/text2sql 0.24.0 → 0.26.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 (35) hide show
  1. package/dist/index.d.ts +0 -1
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +149 -241
  4. package/dist/index.js.map +4 -4
  5. package/dist/lib/adapters/adapter.d.ts +6 -0
  6. package/dist/lib/adapters/adapter.d.ts.map +1 -1
  7. package/dist/lib/adapters/bigquery/index.js +30 -8
  8. package/dist/lib/adapters/bigquery/index.js.map +2 -2
  9. package/dist/lib/adapters/bigquery/view.bigquery.grounding.d.ts.map +1 -1
  10. package/dist/lib/adapters/groundings/index.js +2 -0
  11. package/dist/lib/adapters/groundings/index.js.map +2 -2
  12. package/dist/lib/adapters/groundings/view.grounding.d.ts +3 -0
  13. package/dist/lib/adapters/groundings/view.grounding.d.ts.map +1 -1
  14. package/dist/lib/adapters/mysql/index.js +29 -7
  15. package/dist/lib/adapters/mysql/index.js.map +2 -2
  16. package/dist/lib/adapters/mysql/view.mysql.grounding.d.ts.map +1 -1
  17. package/dist/lib/adapters/postgres/index.js +29 -7
  18. package/dist/lib/adapters/postgres/index.js.map +2 -2
  19. package/dist/lib/adapters/postgres/view.postgres.grounding.d.ts.map +1 -1
  20. package/dist/lib/adapters/spreadsheet/index.js +16 -0
  21. package/dist/lib/adapters/spreadsheet/index.js.map +2 -2
  22. package/dist/lib/adapters/sqlite/index.js +26 -4
  23. package/dist/lib/adapters/sqlite/index.js.map +2 -2
  24. package/dist/lib/adapters/sqlite/view.sqlite.grounding.d.ts.map +1 -1
  25. package/dist/lib/adapters/sqlserver/column-stats.sqlserver.grounding.d.ts +2 -4
  26. package/dist/lib/adapters/sqlserver/column-stats.sqlserver.grounding.d.ts.map +1 -1
  27. package/dist/lib/adapters/sqlserver/column-values.sqlserver.grounding.d.ts +0 -9
  28. package/dist/lib/adapters/sqlserver/column-values.sqlserver.grounding.d.ts.map +1 -1
  29. package/dist/lib/adapters/sqlserver/index.js +107 -11
  30. package/dist/lib/adapters/sqlserver/index.js.map +3 -3
  31. package/dist/lib/adapters/sqlserver/view.sqlserver.grounding.d.ts.map +1 -1
  32. package/dist/lib/agents/result-tools.d.ts.map +1 -1
  33. package/package.json +4 -4
  34. package/dist/lib/agents/developer.agent.d.ts +0 -41
  35. package/dist/lib/agents/developer.agent.d.ts.map +0 -1
@@ -1,14 +1,5 @@
1
1
  import type { Adapter } from '../adapter.ts';
2
2
  import { type Column, ColumnValuesGrounding, type ColumnValuesGroundingConfig } from '../groundings/column-values.grounding.ts';
3
- /**
4
- * SQL Server implementation of ColumnValuesGrounding.
5
- *
6
- * Supports:
7
- * - CHECK constraints with IN clauses (inherited from base)
8
- * - Low cardinality data scan
9
- *
10
- * Note: SQL Server does not have native ENUM types.
11
- */
12
3
  export declare class SqlServerColumnValuesGrounding extends ColumnValuesGrounding {
13
4
  #private;
14
5
  constructor(adapter: Adapter, config?: ColumnValuesGroundingConfig);
@@ -1 +1 @@
1
- {"version":3,"file":"column-values.sqlserver.grounding.d.ts","sourceRoot":"","sources":["../../../../src/lib/adapters/sqlserver/column-values.sqlserver.grounding.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EACL,KAAK,MAAM,EACX,qBAAqB,EACrB,KAAK,2BAA2B,EACjC,MAAM,0CAA0C,CAAC;AAElD;;;;;;;;GAQG;AACH,qBAAa,8BAA+B,SAAQ,qBAAqB;;gBAG3D,OAAO,EAAE,OAAO,EAAE,MAAM,GAAE,2BAAgC;cAK7C,qBAAqB,CAC5C,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,EAAE,GAAG,SAAS,CAAC;CA4BjC"}
1
+ {"version":3,"file":"column-values.sqlserver.grounding.d.ts","sourceRoot":"","sources":["../../../../src/lib/adapters/sqlserver/column-values.sqlserver.grounding.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EACL,KAAK,MAAM,EACX,qBAAqB,EACrB,KAAK,2BAA2B,EACjC,MAAM,0CAA0C,CAAC;AAElD,qBAAa,8BAA+B,SAAQ,qBAAqB;;gBAG3D,OAAO,EAAE,OAAO,EAAE,MAAM,GAAE,2BAAgC;cA2B7C,qBAAqB,CAC5C,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,EAAE,GAAG,SAAS,CAAC;CAgCjC"}
@@ -121,6 +121,22 @@ var Adapter = class {
121
121
  }
122
122
  return this.#toSchemaFragments(ctx);
123
123
  }
124
+ /**
125
+ * Resolve the allowed entity names (tables + views) from grounding config.
126
+ * Runs all configured groundings and returns the resolved set of names.
127
+ * Results are NOT cached — call once and store the result.
128
+ */
129
+ async resolveAllowedEntities() {
130
+ const ctx = createGroundingContext();
131
+ for (const fn of this.grounding) {
132
+ const grounding = fn(this);
133
+ await grounding.execute(ctx);
134
+ }
135
+ return [
136
+ ...ctx.tables.map((t) => t.name),
137
+ ...ctx.views.map((v) => v.name)
138
+ ];
139
+ }
124
140
  /**
125
141
  * Convert complete grounding context to schema fragments.
126
142
  * Called after all groundings have populated ctx with data.
@@ -811,12 +827,61 @@ var TableGrounding = class extends AbstractGrounding {
811
827
  // packages/text2sql/src/lib/adapters/sqlserver/column-stats.sqlserver.grounding.ts
812
828
  var SqlServerColumnStatsGrounding = class extends ColumnStatsGrounding {
813
829
  #adapter;
830
+ #nDistinctCache = /* @__PURE__ */ new Map();
814
831
  constructor(adapter, config = {}) {
815
832
  super(config);
816
833
  this.#adapter = adapter;
817
834
  }
835
+ async execute(ctx) {
836
+ await this.#fetchNDistinct(ctx);
837
+ await super.execute(ctx);
838
+ }
839
+ async #fetchNDistinct(ctx) {
840
+ if (ctx.tables.length === 0) return;
841
+ const objectIds = ctx.tables.map((t) => {
842
+ const { schema, table: table2 } = this.#adapter.parseTableName(t.name);
843
+ return `OBJECT_ID('[${this.#adapter.escape(schema)}].[${this.#adapter.escape(table2)}]')`;
844
+ });
845
+ try {
846
+ const rows = await this.#adapter.runQuery(`
847
+ SELECT
848
+ OBJECT_SCHEMA_NAME(s.object_id) AS schema_name,
849
+ OBJECT_NAME(s.object_id) AS table_name,
850
+ COL_NAME(sc.object_id, sc.column_id) AS column_name,
851
+ (
852
+ SELECT ISNULL(SUM(h.distinct_range_rows), 0) + COUNT(*)
853
+ FROM sys.dm_db_stats_histogram(s.object_id, s.stats_id) h
854
+ ) AS approx_n_distinct
855
+ FROM sys.stats s
856
+ INNER JOIN sys.stats_columns sc
857
+ ON s.object_id = sc.object_id AND s.stats_id = sc.stats_id
858
+ CROSS APPLY sys.dm_db_stats_properties(s.object_id, s.stats_id) sp
859
+ WHERE sc.stats_column_id = 1
860
+ AND sp.rows > 0
861
+ AND s.object_id IN (${objectIds.join(", ")})
862
+ `);
863
+ for (const row of rows) {
864
+ const tableName = ctx.tables.find((t) => {
865
+ const { schema, table: table2 } = this.#adapter.parseTableName(t.name);
866
+ return schema === row.schema_name && table2 === row.table_name;
867
+ })?.name;
868
+ if (!tableName) continue;
869
+ let map = this.#nDistinctCache.get(tableName);
870
+ if (!map) {
871
+ map = /* @__PURE__ */ new Map();
872
+ this.#nDistinctCache.set(tableName, map);
873
+ }
874
+ map.set(row.column_name, row.approx_n_distinct);
875
+ }
876
+ } catch {
877
+ }
878
+ }
818
879
  async collectStats(tableName, column2) {
880
+ const cachedNDistinct = this.#nDistinctCache.get(tableName)?.get(column2.name);
819
881
  if (!this.#shouldCollectStats(column2.type)) {
882
+ if (cachedNDistinct != null) {
883
+ return { nDistinct: cachedNDistinct };
884
+ }
820
885
  return void 0;
821
886
  }
822
887
  const { schema, table: table2 } = this.#adapter.parseTableName(tableName);
@@ -831,18 +896,22 @@ var SqlServerColumnStatsGrounding = class extends ColumnStatsGrounding {
831
896
  `;
832
897
  const rows = await this.#adapter.runQuery(sql);
833
898
  if (!rows.length) {
899
+ if (cachedNDistinct != null) {
900
+ return { nDistinct: cachedNDistinct };
901
+ }
834
902
  return void 0;
835
903
  }
836
904
  const min = rows[0]?.min_value;
837
905
  const max = rows[0]?.max_value;
838
906
  const nullFraction = this.#adapter.toNumber(rows[0]?.null_fraction);
839
- if (min == null && max == null && nullFraction == null) {
907
+ if (min == null && max == null && nullFraction == null && cachedNDistinct == null) {
840
908
  return void 0;
841
909
  }
842
910
  return {
843
911
  min: min ?? void 0,
844
912
  max: max ?? void 0,
845
- nullFraction: nullFraction != null && Number.isFinite(nullFraction) ? Math.max(0, Math.min(1, nullFraction)) : void 0
913
+ nullFraction: nullFraction != null && Number.isFinite(nullFraction) ? Math.max(0, Math.min(1, nullFraction)) : void 0,
914
+ ...cachedNDistinct != null && { nDistinct: cachedNDistinct }
846
915
  };
847
916
  }
848
917
  #shouldCollectStats(type) {
@@ -1092,7 +1161,28 @@ var SqlServerColumnValuesGrounding = class extends ColumnValuesGrounding {
1092
1161
  super(config);
1093
1162
  this.#adapter = adapter;
1094
1163
  }
1164
+ #isHighCardinality(column2) {
1165
+ const nDistinct = column2.stats?.nDistinct;
1166
+ if (nDistinct != null) {
1167
+ if (nDistinct > 0) return nDistinct > this.lowCardinalityLimit;
1168
+ return true;
1169
+ }
1170
+ const type = column2.type.toLowerCase();
1171
+ if (/nvarchar\s*\(\s*max\s*\)|varchar\s*\(\s*max\s*\)|text|ntext|xml|image|varbinary\s*\(\s*max\s*\)|uniqueidentifier/.test(
1172
+ type
1173
+ )) {
1174
+ return true;
1175
+ }
1176
+ const varcharMatch = type.match(/n?varchar\s*\(\s*(\d+)\s*\)/);
1177
+ if (varcharMatch && parseInt(varcharMatch[1]) > 255) {
1178
+ return true;
1179
+ }
1180
+ return false;
1181
+ }
1095
1182
  async collectLowCardinality(tableName, column2) {
1183
+ if (this.#isHighCardinality(column2)) {
1184
+ return void 0;
1185
+ }
1096
1186
  const { schema, table: table2 } = this.#adapter.parseTableName(tableName);
1097
1187
  const tableIdentifier = `[${this.#adapter.escape(schema)}].[${this.#adapter.escape(table2)}]`;
1098
1188
  const columnIdentifier = `[${this.#adapter.escape(column2.name)}]`;
@@ -1745,9 +1835,11 @@ var SqlServerTableGrounding = class extends TableGrounding {
1745
1835
  // packages/text2sql/src/lib/adapters/groundings/view.grounding.ts
1746
1836
  var ViewGrounding = class extends AbstractGrounding {
1747
1837
  #filter;
1838
+ includeDefinition;
1748
1839
  constructor(config = {}) {
1749
1840
  super("view");
1750
1841
  this.#filter = config.filter;
1842
+ this.includeDefinition = config.includeDefinition ?? true;
1751
1843
  }
1752
1844
  /**
1753
1845
  * Execute the grounding process.
@@ -1801,14 +1893,18 @@ var SqlServerViewGrounding = class extends ViewGrounding {
1801
1893
  }
1802
1894
  async getView(viewName) {
1803
1895
  const { schema, table: view2 } = this.#adapter.parseTableName(viewName);
1804
- const defRows = await this.#adapter.runQuery(`
1805
- SELECT m.definition
1806
- FROM sys.views v
1807
- JOIN sys.schemas s ON v.schema_id = s.schema_id
1808
- JOIN sys.sql_modules m ON v.object_id = m.object_id
1809
- WHERE s.name = '${this.#adapter.escapeString(schema)}'
1810
- AND v.name = '${this.#adapter.escapeString(view2)}'
1811
- `);
1896
+ let definition;
1897
+ if (this.includeDefinition) {
1898
+ const defRows = await this.#adapter.runQuery(`
1899
+ SELECT m.definition
1900
+ FROM sys.views v
1901
+ JOIN sys.schemas s ON v.schema_id = s.schema_id
1902
+ JOIN sys.sql_modules m ON v.object_id = m.object_id
1903
+ WHERE s.name = '${this.#adapter.escapeString(schema)}'
1904
+ AND v.name = '${this.#adapter.escapeString(view2)}'
1905
+ `);
1906
+ definition = defRows[0]?.definition ?? void 0;
1907
+ }
1812
1908
  const columns = await this.#adapter.runQuery(`
1813
1909
  SELECT COLUMN_NAME AS column_name, DATA_TYPE AS data_type
1814
1910
  FROM INFORMATION_SCHEMA.COLUMNS
@@ -1820,7 +1916,7 @@ var SqlServerViewGrounding = class extends ViewGrounding {
1820
1916
  name: viewName,
1821
1917
  schema,
1822
1918
  rawName: view2,
1823
- definition: defRows[0]?.definition ?? void 0,
1919
+ definition,
1824
1920
  columns: columns.map((col) => ({
1825
1921
  name: col.column_name ?? "unknown",
1826
1922
  type: col.data_type ?? "unknown"