@deepagents/text2sql 7.0.2 → 7.1.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 (162) hide show
  1. package/README.md +3 -2
  2. package/dist/bin/sql.js +57 -32
  3. package/dist/index.js +793 -498
  4. package/dist/index.js.map +4 -4
  5. package/dist/lib/adapters/adapter.d.ts +23 -1
  6. package/dist/lib/adapters/adapter.d.ts.map +1 -1
  7. package/dist/lib/adapters/bigquery/bigquery-fk.d.ts +0 -11
  8. package/dist/lib/adapters/bigquery/bigquery-fk.d.ts.map +1 -1
  9. package/dist/lib/adapters/bigquery/bigquery-rows.d.ts +22 -0
  10. package/dist/lib/adapters/bigquery/bigquery-rows.d.ts.map +1 -0
  11. package/dist/lib/adapters/bigquery/bigquery.d.ts +1 -1
  12. package/dist/lib/adapters/bigquery/bigquery.d.ts.map +1 -1
  13. package/dist/lib/adapters/bigquery/constraint.bigquery.grounding.d.ts.map +1 -1
  14. package/dist/lib/adapters/bigquery/index.d.ts +6 -13
  15. package/dist/lib/adapters/bigquery/index.d.ts.map +1 -1
  16. package/dist/lib/adapters/bigquery/index.js +244 -51
  17. package/dist/lib/adapters/bigquery/index.js.map +4 -4
  18. package/dist/lib/adapters/bigquery/indexes.bigquery.grounding.d.ts.map +1 -1
  19. package/dist/lib/adapters/bigquery/row-count.bigquery.grounding.d.ts.map +1 -1
  20. package/dist/lib/adapters/bigquery/table.bigquery.grounding.d.ts.map +1 -1
  21. package/dist/lib/adapters/bigquery/view.bigquery.grounding.d.ts.map +1 -1
  22. package/dist/lib/adapters/clickhouse/clickhouse-rows.d.ts +7 -0
  23. package/dist/lib/adapters/clickhouse/clickhouse-rows.d.ts.map +1 -0
  24. package/dist/lib/adapters/clickhouse/clickhouse.d.ts +1 -1
  25. package/dist/lib/adapters/clickhouse/clickhouse.d.ts.map +1 -1
  26. package/dist/lib/adapters/clickhouse/constraint.clickhouse.grounding.d.ts.map +1 -1
  27. package/dist/lib/adapters/clickhouse/index.js +133 -44
  28. package/dist/lib/adapters/clickhouse/index.js.map +4 -4
  29. package/dist/lib/adapters/clickhouse/indexes.clickhouse.grounding.d.ts.map +1 -1
  30. package/dist/lib/adapters/clickhouse/info.clickhouse.grounding.d.ts.map +1 -1
  31. package/dist/lib/adapters/clickhouse/row-count.clickhouse.grounding.d.ts.map +1 -1
  32. package/dist/lib/adapters/clickhouse/table.clickhouse.grounding.d.ts.map +1 -1
  33. package/dist/lib/adapters/clickhouse/view.clickhouse.grounding.d.ts.map +1 -1
  34. package/dist/lib/adapters/duckdb/duckdb.d.ts +1 -1
  35. package/dist/lib/adapters/duckdb/duckdb.d.ts.map +1 -1
  36. package/dist/lib/adapters/duckdb/duckdb.groundings.d.ts.map +1 -1
  37. package/dist/lib/adapters/duckdb/index.d.ts +8 -10
  38. package/dist/lib/adapters/duckdb/index.d.ts.map +1 -1
  39. package/dist/lib/adapters/duckdb/index.js +1549 -1412
  40. package/dist/lib/adapters/duckdb/index.js.map +4 -4
  41. package/dist/lib/adapters/groundings/index.js.map +1 -1
  42. package/dist/lib/adapters/groundings/rows.d.ts +32 -0
  43. package/dist/lib/adapters/groundings/rows.d.ts.map +1 -0
  44. package/dist/lib/adapters/mysql/column-stats.mysql.grounding.d.ts.map +1 -1
  45. package/dist/lib/adapters/mysql/column-values.mysql.grounding.d.ts.map +1 -1
  46. package/dist/lib/adapters/mysql/constraint.mysql.grounding.d.ts.map +1 -1
  47. package/dist/lib/adapters/mysql/index.d.ts +2 -4
  48. package/dist/lib/adapters/mysql/index.d.ts.map +1 -1
  49. package/dist/lib/adapters/mysql/index.js +230 -76
  50. package/dist/lib/adapters/mysql/index.js.map +4 -4
  51. package/dist/lib/adapters/mysql/indexes.mysql.grounding.d.ts.map +1 -1
  52. package/dist/lib/adapters/mysql/info.mysql.grounding.d.ts.map +1 -1
  53. package/dist/lib/adapters/mysql/mysql-rows.d.ts +11 -0
  54. package/dist/lib/adapters/mysql/mysql-rows.d.ts.map +1 -0
  55. package/dist/lib/adapters/mysql/mysql.d.ts +1 -1
  56. package/dist/lib/adapters/mysql/mysql.d.ts.map +1 -1
  57. package/dist/lib/adapters/mysql/row-count.mysql.grounding.d.ts.map +1 -1
  58. package/dist/lib/adapters/mysql/table.mysql.grounding.d.ts +3 -2
  59. package/dist/lib/adapters/mysql/table.mysql.grounding.d.ts.map +1 -1
  60. package/dist/lib/adapters/mysql/view.mysql.grounding.d.ts +2 -2
  61. package/dist/lib/adapters/mysql/view.mysql.grounding.d.ts.map +1 -1
  62. package/dist/lib/adapters/postgres/column-stats.postgres.grounding.d.ts.map +1 -1
  63. package/dist/lib/adapters/postgres/column-values.postgres.grounding.d.ts.map +1 -1
  64. package/dist/lib/adapters/postgres/constraint.postgres.grounding.d.ts.map +1 -1
  65. package/dist/lib/adapters/postgres/index.d.ts +2 -4
  66. package/dist/lib/adapters/postgres/index.d.ts.map +1 -1
  67. package/dist/lib/adapters/postgres/index.js +266 -487
  68. package/dist/lib/adapters/postgres/index.js.map +4 -4
  69. package/dist/lib/adapters/postgres/indexes.postgres.grounding.d.ts +1 -5
  70. package/dist/lib/adapters/postgres/indexes.postgres.grounding.d.ts.map +1 -1
  71. package/dist/lib/adapters/postgres/info.postgres.grounding.d.ts.map +1 -1
  72. package/dist/lib/adapters/postgres/postgres-rows.d.ts +7 -0
  73. package/dist/lib/adapters/postgres/postgres-rows.d.ts.map +1 -0
  74. package/dist/lib/adapters/postgres/postgres.d.ts +6 -1
  75. package/dist/lib/adapters/postgres/postgres.d.ts.map +1 -1
  76. package/dist/lib/adapters/postgres/row-count.postgres.grounding.d.ts.map +1 -1
  77. package/dist/lib/adapters/postgres/table.postgres.grounding.d.ts +5 -4
  78. package/dist/lib/adapters/postgres/table.postgres.grounding.d.ts.map +1 -1
  79. package/dist/lib/adapters/postgres/view.postgres.grounding.d.ts +3 -3
  80. package/dist/lib/adapters/postgres/view.postgres.grounding.d.ts.map +1 -1
  81. package/dist/lib/adapters/posthog/definitions.posthog.grounding.d.ts.map +1 -1
  82. package/dist/lib/adapters/posthog/index.d.ts +4 -5
  83. package/dist/lib/adapters/posthog/index.d.ts.map +1 -1
  84. package/dist/lib/adapters/posthog/index.js +349 -287
  85. package/dist/lib/adapters/posthog/index.js.map +4 -4
  86. package/dist/lib/adapters/posthog/posthog.d.ts +2 -2
  87. package/dist/lib/adapters/posthog/posthog.d.ts.map +1 -1
  88. package/dist/lib/adapters/posthog/posthog.sql-policy.d.ts.map +1 -1
  89. package/dist/lib/adapters/posthog/schema.posthog.grounding.d.ts.map +1 -1
  90. package/dist/lib/adapters/posthog/transport.d.ts.map +1 -1
  91. package/dist/lib/adapters/posthog/types.d.ts +16 -6
  92. package/dist/lib/adapters/posthog/types.d.ts.map +1 -1
  93. package/dist/lib/adapters/spreadsheet/index.js +113 -34
  94. package/dist/lib/adapters/spreadsheet/index.js.map +4 -4
  95. package/dist/lib/adapters/sqlite/column-stats.sqlite.grounding.d.ts.map +1 -1
  96. package/dist/lib/adapters/sqlite/column-values.sqlite.grounding.d.ts.map +1 -1
  97. package/dist/lib/adapters/sqlite/constraint.sqlite.grounding.d.ts.map +1 -1
  98. package/dist/lib/adapters/sqlite/index.js +136 -49
  99. package/dist/lib/adapters/sqlite/index.js.map +4 -4
  100. package/dist/lib/adapters/sqlite/indexes.sqlite.grounding.d.ts.map +1 -1
  101. package/dist/lib/adapters/sqlite/info.sqlite.grounding.d.ts.map +1 -1
  102. package/dist/lib/adapters/sqlite/row-count.sqlite.grounding.d.ts.map +1 -1
  103. package/dist/lib/adapters/sqlite/sqlite-rows.d.ts +41 -0
  104. package/dist/lib/adapters/sqlite/sqlite-rows.d.ts.map +1 -0
  105. package/dist/lib/adapters/sqlite/sqlite.d.ts +1 -1
  106. package/dist/lib/adapters/sqlite/sqlite.d.ts.map +1 -1
  107. package/dist/lib/adapters/sqlite/table.sqlite.grounding.d.ts.map +1 -1
  108. package/dist/lib/adapters/sqlite/view.sqlite.grounding.d.ts.map +1 -1
  109. package/dist/lib/adapters/sqlserver/column-stats.sqlserver.grounding.d.ts.map +1 -1
  110. package/dist/lib/adapters/sqlserver/column-values.sqlserver.grounding.d.ts.map +1 -1
  111. package/dist/lib/adapters/sqlserver/constraint.sqlserver.grounding.d.ts.map +1 -1
  112. package/dist/lib/adapters/sqlserver/index.d.ts +2 -4
  113. package/dist/lib/adapters/sqlserver/index.d.ts.map +1 -1
  114. package/dist/lib/adapters/sqlserver/index.js +223 -455
  115. package/dist/lib/adapters/sqlserver/index.js.map +4 -4
  116. package/dist/lib/adapters/sqlserver/indexes.sqlserver.grounding.d.ts +1 -5
  117. package/dist/lib/adapters/sqlserver/indexes.sqlserver.grounding.d.ts.map +1 -1
  118. package/dist/lib/adapters/sqlserver/info.sqlserver.grounding.d.ts.map +1 -1
  119. package/dist/lib/adapters/sqlserver/row-count.sqlserver.grounding.d.ts.map +1 -1
  120. package/dist/lib/adapters/sqlserver/sqlserver-rows.d.ts +7 -0
  121. package/dist/lib/adapters/sqlserver/sqlserver-rows.d.ts.map +1 -0
  122. package/dist/lib/adapters/sqlserver/sqlserver.d.ts +6 -1
  123. package/dist/lib/adapters/sqlserver/sqlserver.d.ts.map +1 -1
  124. package/dist/lib/adapters/sqlserver/table.sqlserver.grounding.d.ts +4 -3
  125. package/dist/lib/adapters/sqlserver/table.sqlserver.grounding.d.ts.map +1 -1
  126. package/dist/lib/adapters/sqlserver/view.sqlserver.grounding.d.ts +3 -3
  127. package/dist/lib/adapters/sqlserver/view.sqlserver.grounding.d.ts.map +1 -1
  128. package/dist/lib/agents/sql-transform-plugins.d.ts.map +1 -1
  129. package/dist/lib/checkpoint.d.ts +34 -21
  130. package/dist/lib/checkpoint.d.ts.map +1 -1
  131. package/dist/lib/file-cache.d.ts +6 -1
  132. package/dist/lib/file-cache.d.ts.map +1 -1
  133. package/dist/lib/fs/columns.d.ts +14 -0
  134. package/dist/lib/fs/columns.d.ts.map +1 -0
  135. package/dist/lib/fs/mssql/mssql-fs.d.ts +4 -4
  136. package/dist/lib/fs/mssql/mssql-fs.d.ts.map +1 -1
  137. package/dist/lib/fs/postgres/postgres-fs.d.ts +4 -4
  138. package/dist/lib/fs/postgres/postgres-fs.d.ts.map +1 -1
  139. package/dist/lib/fs/sqlite/sqlite-fs.d.ts +4 -4
  140. package/dist/lib/fs/sqlite/sqlite-fs.d.ts.map +1 -1
  141. package/dist/lib/index-cache.d.ts +4 -3
  142. package/dist/lib/index-cache.d.ts.map +1 -1
  143. package/dist/lib/sql.d.ts.map +1 -1
  144. package/dist/lib/synthesis/decorators/deduplicated-producer.d.ts +1 -2
  145. package/dist/lib/synthesis/decorators/deduplicated-producer.d.ts.map +1 -1
  146. package/dist/lib/synthesis/decorators/filtered-producer.d.ts +0 -2
  147. package/dist/lib/synthesis/decorators/filtered-producer.d.ts.map +1 -1
  148. package/dist/lib/synthesis/decorators/validated-producer.d.ts +1 -3
  149. package/dist/lib/synthesis/decorators/validated-producer.d.ts.map +1 -1
  150. package/dist/lib/synthesis/extractors/base-contextual-extractor.d.ts.map +1 -1
  151. package/dist/lib/synthesis/extractors/message-extractor.d.ts.map +1 -1
  152. package/dist/lib/synthesis/extractors/tool-input.d.ts +6 -0
  153. package/dist/lib/synthesis/extractors/tool-input.d.ts.map +1 -0
  154. package/dist/lib/synthesis/index.js +124 -114
  155. package/dist/lib/synthesis/index.js.map +4 -4
  156. package/dist/lib/synthesis/synthesizers/breadth-evolver.d.ts +0 -2
  157. package/dist/lib/synthesis/synthesizers/breadth-evolver.d.ts.map +1 -1
  158. package/dist/lib/synthesis/synthesizers/depth-evolver.d.ts +0 -3
  159. package/dist/lib/synthesis/synthesizers/depth-evolver.d.ts.map +1 -1
  160. package/dist/lib/synthesis/synthesizers/schema-synthesizer.d.ts +0 -2
  161. package/dist/lib/synthesis/synthesizers/schema-synthesizer.d.ts.map +1 -1
  162. package/package.json +4 -4
package/README.md CHANGED
@@ -440,8 +440,9 @@ const text2sql = new Text2Sql({
440
440
  });
441
441
  ```
442
442
 
443
- `FileIndexCache` writes atomically (temp + rename) and treats an unparseable
444
- file as a miss, so a torn read self-heals into a re-introspect. `FileIndexLock`
443
+ `FileIndexCache` writes atomically (temp + rename) and treats a file that does
444
+ not parse to context fragments as a miss, so a torn read self-heals into a
445
+ re-introspect. `FileIndexLock`
445
446
  (built on `proper-lockfile`, options `{ dir?, namespace?, stale?, retries? }`)
446
447
  serializes processes that share a POSIX filesystem; a held lock auto-refreshes
447
448
  its mtime so a slow introspection is not mistaken for a crash, and acquisition
package/dist/bin/sql.js CHANGED
@@ -3,6 +3,12 @@
3
3
  // packages/text2sql/src/bin/sql.ts
4
4
  import { cac } from "cac";
5
5
 
6
+ // packages/text2sql/src/lib/index-cache.ts
7
+ import {
8
+ isFragment,
9
+ isFragmentData
10
+ } from "@deepagents/context";
11
+
6
12
  // packages/text2sql/src/lib/file-cache.ts
7
13
  import { createHash, randomUUID } from "node:crypto";
8
14
  import { existsSync } from "node:fs";
@@ -29,8 +35,14 @@ var FileCache = class {
29
35
  }
30
36
  };
31
37
  var JsonCache = class extends FileCache {
32
- constructor(watermark, baseDir) {
38
+ #isValid;
39
+ /**
40
+ * @param isValid - Checks that a parsed cache file holds a T; a file that
41
+ * fails it is read as a miss.
42
+ */
43
+ constructor(watermark, isValid, baseDir) {
33
44
  super(watermark, ".json", baseDir);
45
+ this.#isValid = isValid;
34
46
  }
35
47
  async read() {
36
48
  const content = await this.get();
@@ -38,7 +50,8 @@ var JsonCache = class extends FileCache {
38
50
  return null;
39
51
  }
40
52
  try {
41
- return JSON.parse(content);
53
+ const value = JSON.parse(content);
54
+ return this.#isValid(value) ? value : null;
42
55
  } catch {
43
56
  return null;
44
57
  }
@@ -64,9 +77,12 @@ var FileIndexCache = class {
64
77
  }
65
78
  #cacheFor(key) {
66
79
  const watermark = this.#namespace ? `${this.#namespace}-${key}` : key;
67
- return new JsonCache(watermark, this.#dir);
80
+ return new JsonCache(watermark, isFragmentList, this.#dir);
68
81
  }
69
82
  };
83
+ function isFragmentList(value) {
84
+ return Array.isArray(value) && value.every((item) => isFragment(item) && isFragmentData(item));
85
+ }
70
86
 
71
87
  // packages/text2sql/src/lib/index-lock.ts
72
88
  import { createHash as createHash2 } from "node:crypto";
@@ -141,6 +157,7 @@ function validateAdapterNames(names) {
141
157
 
142
158
  // packages/text2sql/src/lib/adapters/adapter.ts
143
159
  import { format as formatSql } from "sql-formatter";
160
+ import { z } from "zod";
144
161
 
145
162
  // packages/text2sql/src/lib/agents/exceptions.ts
146
163
  var sqlValidationMarker = /* @__PURE__ */ Symbol("SQLValidationError");
@@ -413,7 +430,7 @@ import {
413
430
  } from "ai";
414
431
  import dedent from "dedent";
415
432
  import pRetry from "p-retry";
416
- import z from "zod";
433
+ import z2 from "zod";
417
434
  import "@deepagents/agent";
418
435
  import {
419
436
  ContextEngine,
@@ -705,14 +722,14 @@ Question: ${options.input}
705
722
  const sqlOutput = structuredOutput({
706
723
  model,
707
724
  context,
708
- schema: z.object({
709
- result: z.union([
710
- z.object({
711
- sql: z.string().describe("The SQL query that answers the question"),
712
- reasoning: z.string().describe("The reasoning steps taken to generate the SQL")
725
+ schema: z2.object({
726
+ result: z2.union([
727
+ z2.object({
728
+ sql: z2.string().describe("The SQL query that answers the question"),
729
+ reasoning: z2.string().describe("The reasoning steps taken to generate the SQL")
713
730
  }),
714
- z.object({
715
- error: z.string().describe(
731
+ z2.object({
732
+ error: z2.string().describe(
716
733
  "Error message explaining why the question cannot be answered with the given schema"
717
734
  )
718
735
  })
@@ -763,11 +780,11 @@ Question: ${options.input}
763
780
  const forcedSqlOutput = structuredOutput({
764
781
  model,
765
782
  context,
766
- schema: z.object({
767
- sql: z.string().describe(
783
+ schema: z2.object({
784
+ sql: z2.string().describe(
768
785
  "Best-effort SQL query that answers the core intent using only available schema entities."
769
786
  ),
770
- reasoning: z.string().describe("Reasoning steps for best-effort schema mapping.")
787
+ reasoning: z2.string().describe("Reasoning steps for best-effort schema mapping.")
771
788
  })
772
789
  });
773
790
  try {
@@ -969,8 +986,10 @@ var Text2Sql = class {
969
986
  if (!Array.isArray(result)) {
970
987
  throw new Error("adapter.execute must return an array of rows");
971
988
  }
972
- const columns = result.length > 0 ? Object.keys(result[0]) : [];
973
- return { rows: result, columns };
989
+ const rows = result;
990
+ const [first] = rows;
991
+ const columns = typeof first === "object" && first !== null ? Object.keys(first) : [];
992
+ return { rows, columns };
974
993
  }
975
994
  async #validateWith(adapter, sql) {
976
995
  const formatted = adapter.format(sql);
@@ -1005,6 +1024,10 @@ var Text2Sql = class {
1005
1024
 
1006
1025
  // packages/text2sql/src/bin/command.ts
1007
1026
  import * as path3 from "node:path";
1027
+ import z3 from "zod";
1028
+ var cliWord = z3.union([z3.string(), z3.number()]).transform(String);
1029
+ var cliOptions = z3.record(z3.string(), z3.unknown());
1030
+ var queryArgs = z3.tuple([cliWord, z3.array(cliWord)]);
1008
1031
  var OUT_DIR_OPTION = {
1009
1032
  flag: "--out-dir <path>",
1010
1033
  description: "Output directory (default: $TEXT2SQL_OUT_DIR or ./sql)"
@@ -1047,9 +1070,9 @@ var SqlCommand = class {
1047
1070
  var SqlQueryCommand = class extends SqlCommand {
1048
1071
  args = "<db> <...sql>";
1049
1072
  async execute(ctx, args, options) {
1050
- const [db, sqlParts] = args;
1073
+ const [db, sqlParts] = queryArgs.parse(args);
1051
1074
  const name = this.resolveAdapterName(ctx.text2Sql, db);
1052
- const sql = (sqlParts ?? []).join(" ").trim();
1075
+ const sql = sqlParts.join(" ").trim();
1053
1076
  if (!sql) this.fail("no query provided");
1054
1077
  try {
1055
1078
  return await this.runQuery(ctx, name, sql, options);
@@ -1072,6 +1095,7 @@ import {
1072
1095
  import * as path4 from "node:path";
1073
1096
  import { finished } from "node:stream/promises";
1074
1097
  import { v7 } from "uuid";
1098
+ import z4 from "zod";
1075
1099
 
1076
1100
  // packages/text2sql/src/bin/commands/indexing-formatter.ts
1077
1101
  var REDUNDANT_MESSAGE_TYPES = /* @__PURE__ */ new Set([
@@ -1092,6 +1116,7 @@ function formatPretty(event) {
1092
1116
  }
1093
1117
 
1094
1118
  // packages/text2sql/src/bin/commands/index.ts
1119
+ var indexArgs = z4.tuple([z4.array(cliWord)]);
1095
1120
  var IndexCommand = class extends SqlCommand {
1096
1121
  name = "index";
1097
1122
  description = "Index adapter schemas and write context artifacts";
@@ -1107,7 +1132,7 @@ var IndexCommand = class extends SqlCommand {
1107
1132
  OUT_DIR_OPTION
1108
1133
  ];
1109
1134
  async execute(ctx, args, options) {
1110
- const adapterNames = args[0] ?? [];
1135
+ const [adapterNames] = indexArgs.parse(args);
1111
1136
  const requested = options.all ? [] : adapterNames;
1112
1137
  const names = this.resolveNames(ctx.text2Sql, requested);
1113
1138
  const verbose = this.resolveVerbose(options.verbose);
@@ -1203,14 +1228,14 @@ async function probeFifoWriter(eventsPath, stderr) {
1203
1228
  try {
1204
1229
  stats = await stat(eventsPath);
1205
1230
  } catch (err) {
1206
- if (err.code === "ENOENT") return null;
1231
+ if (hasErrorCode(err, "ENOENT")) return null;
1207
1232
  throw err;
1208
1233
  }
1209
1234
  if (!stats.isFIFO()) return null;
1210
1235
  try {
1211
1236
  return await open(eventsPath, constants.O_WRONLY | constants.O_NONBLOCK);
1212
1237
  } catch (err) {
1213
- if (err.code === "ENXIO") {
1238
+ if (hasErrorCode(err, "ENXIO")) {
1214
1239
  stderr.write(`sql index: waiting for reader on FIFO ${eventsPath}...
1215
1240
  `);
1216
1241
  return null;
@@ -1218,6 +1243,9 @@ async function probeFifoWriter(eventsPath, stderr) {
1218
1243
  throw err;
1219
1244
  }
1220
1245
  }
1246
+ function hasErrorCode(error, code) {
1247
+ return error instanceof Error && "code" in error && error.code === code;
1248
+ }
1221
1249
  function waitForOpen(stream) {
1222
1250
  return new Promise((resolve4, reject) => {
1223
1251
  if (!stream.pending) {
@@ -1301,15 +1329,12 @@ async function loadAdapters() {
1301
1329
  );
1302
1330
  }
1303
1331
  const specifier = target.startsWith(".") || target.startsWith("/") ? pathToFileURL(resolve3(target)).href : target;
1304
- let mod;
1305
- try {
1306
- mod = await import(specifier);
1307
- } catch (cause) {
1332
+ const mod = await import(specifier).catch((cause) => {
1308
1333
  throw new Error(
1309
1334
  `TEXT2SQL_ADAPTERS=${target}: failed to import module - ${errorMessage2(cause)}`
1310
1335
  );
1311
- }
1312
- const exported = mod.default;
1336
+ });
1337
+ const exported = typeof mod === "object" && mod !== null && "default" in mod ? mod.default : void 0;
1313
1338
  if (!exported || typeof exported !== "object" || Array.isArray(exported)) {
1314
1339
  throw new Error(
1315
1340
  `TEXT2SQL_ADAPTERS=${target}: default export must be a Record<string, Adapter> (got ${describe(exported)}).`
@@ -1321,24 +1346,24 @@ async function loadAdapters() {
1321
1346
  `TEXT2SQL_ADAPTERS=${target}: default export is an empty object - declare at least one adapter.`
1322
1347
  );
1323
1348
  }
1349
+ const adapters = {};
1324
1350
  for (const [name, value] of entries) {
1325
1351
  if (!isAdapterShape(value)) {
1326
1352
  throw new Error(
1327
1353
  `TEXT2SQL_ADAPTERS=${target}: adapter "${name}" is missing one of the required methods (format, validate, execute).`
1328
1354
  );
1329
1355
  }
1356
+ adapters[name] = value;
1330
1357
  }
1331
1358
  try {
1332
1359
  validateAdapterNames(entries.map(([name]) => name));
1333
1360
  } catch (cause) {
1334
1361
  throw new Error(`TEXT2SQL_ADAPTERS=${target}: ${errorMessage2(cause)}`);
1335
1362
  }
1336
- return exported;
1363
+ return adapters;
1337
1364
  }
1338
1365
  function isAdapterShape(value) {
1339
- if (!value || typeof value !== "object") return false;
1340
- const v = value;
1341
- return typeof v.format === "function" && typeof v.validate === "function" && typeof v.execute === "function";
1366
+ return typeof value === "object" && value !== null && "format" in value && typeof value.format === "function" && "validate" in value && typeof value.validate === "function" && "execute" in value && typeof value.execute === "function";
1342
1367
  }
1343
1368
  function describe(value) {
1344
1369
  if (value === null) return "null";
@@ -1387,7 +1412,7 @@ function registerCommand(cli2, command) {
1387
1412
  cliCommand.option(option.flag, option.description);
1388
1413
  }
1389
1414
  cliCommand.action(async (...callArgs) => {
1390
- const options = callArgs[callArgs.length - 1] ?? {};
1415
+ const options = cliOptions.parse(callArgs.at(-1));
1391
1416
  const positional = callArgs.slice(0, -1);
1392
1417
  return runCommand(command, positional, options);
1393
1418
  });