@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.
- package/README.md +3 -2
- package/dist/bin/sql.js +57 -32
- package/dist/index.js +793 -498
- package/dist/index.js.map +4 -4
- package/dist/lib/adapters/adapter.d.ts +23 -1
- package/dist/lib/adapters/adapter.d.ts.map +1 -1
- package/dist/lib/adapters/bigquery/bigquery-fk.d.ts +0 -11
- package/dist/lib/adapters/bigquery/bigquery-fk.d.ts.map +1 -1
- package/dist/lib/adapters/bigquery/bigquery-rows.d.ts +22 -0
- package/dist/lib/adapters/bigquery/bigquery-rows.d.ts.map +1 -0
- package/dist/lib/adapters/bigquery/bigquery.d.ts +1 -1
- package/dist/lib/adapters/bigquery/bigquery.d.ts.map +1 -1
- package/dist/lib/adapters/bigquery/constraint.bigquery.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/bigquery/index.d.ts +6 -13
- package/dist/lib/adapters/bigquery/index.d.ts.map +1 -1
- package/dist/lib/adapters/bigquery/index.js +244 -51
- package/dist/lib/adapters/bigquery/index.js.map +4 -4
- package/dist/lib/adapters/bigquery/indexes.bigquery.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/bigquery/row-count.bigquery.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/bigquery/table.bigquery.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/bigquery/view.bigquery.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/clickhouse/clickhouse-rows.d.ts +7 -0
- package/dist/lib/adapters/clickhouse/clickhouse-rows.d.ts.map +1 -0
- package/dist/lib/adapters/clickhouse/clickhouse.d.ts +1 -1
- package/dist/lib/adapters/clickhouse/clickhouse.d.ts.map +1 -1
- package/dist/lib/adapters/clickhouse/constraint.clickhouse.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/clickhouse/index.js +133 -44
- package/dist/lib/adapters/clickhouse/index.js.map +4 -4
- package/dist/lib/adapters/clickhouse/indexes.clickhouse.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/clickhouse/info.clickhouse.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/clickhouse/row-count.clickhouse.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/clickhouse/table.clickhouse.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/clickhouse/view.clickhouse.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/duckdb/duckdb.d.ts +1 -1
- package/dist/lib/adapters/duckdb/duckdb.d.ts.map +1 -1
- package/dist/lib/adapters/duckdb/duckdb.groundings.d.ts.map +1 -1
- package/dist/lib/adapters/duckdb/index.d.ts +8 -10
- package/dist/lib/adapters/duckdb/index.d.ts.map +1 -1
- package/dist/lib/adapters/duckdb/index.js +1549 -1412
- package/dist/lib/adapters/duckdb/index.js.map +4 -4
- package/dist/lib/adapters/groundings/index.js.map +1 -1
- package/dist/lib/adapters/groundings/rows.d.ts +32 -0
- package/dist/lib/adapters/groundings/rows.d.ts.map +1 -0
- package/dist/lib/adapters/mysql/column-stats.mysql.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/mysql/column-values.mysql.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/mysql/constraint.mysql.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/mysql/index.d.ts +2 -4
- package/dist/lib/adapters/mysql/index.d.ts.map +1 -1
- package/dist/lib/adapters/mysql/index.js +230 -76
- package/dist/lib/adapters/mysql/index.js.map +4 -4
- package/dist/lib/adapters/mysql/indexes.mysql.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/mysql/info.mysql.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/mysql/mysql-rows.d.ts +11 -0
- package/dist/lib/adapters/mysql/mysql-rows.d.ts.map +1 -0
- package/dist/lib/adapters/mysql/mysql.d.ts +1 -1
- package/dist/lib/adapters/mysql/mysql.d.ts.map +1 -1
- package/dist/lib/adapters/mysql/row-count.mysql.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/mysql/table.mysql.grounding.d.ts +3 -2
- package/dist/lib/adapters/mysql/table.mysql.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/mysql/view.mysql.grounding.d.ts +2 -2
- package/dist/lib/adapters/mysql/view.mysql.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/postgres/column-stats.postgres.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/postgres/column-values.postgres.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/postgres/constraint.postgres.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/postgres/index.d.ts +2 -4
- package/dist/lib/adapters/postgres/index.d.ts.map +1 -1
- package/dist/lib/adapters/postgres/index.js +266 -487
- package/dist/lib/adapters/postgres/index.js.map +4 -4
- package/dist/lib/adapters/postgres/indexes.postgres.grounding.d.ts +1 -5
- package/dist/lib/adapters/postgres/indexes.postgres.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/postgres/info.postgres.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/postgres/postgres-rows.d.ts +7 -0
- package/dist/lib/adapters/postgres/postgres-rows.d.ts.map +1 -0
- package/dist/lib/adapters/postgres/postgres.d.ts +6 -1
- package/dist/lib/adapters/postgres/postgres.d.ts.map +1 -1
- package/dist/lib/adapters/postgres/row-count.postgres.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/postgres/table.postgres.grounding.d.ts +5 -4
- package/dist/lib/adapters/postgres/table.postgres.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/postgres/view.postgres.grounding.d.ts +3 -3
- package/dist/lib/adapters/postgres/view.postgres.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/posthog/definitions.posthog.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/posthog/index.d.ts +4 -5
- package/dist/lib/adapters/posthog/index.d.ts.map +1 -1
- package/dist/lib/adapters/posthog/index.js +349 -287
- package/dist/lib/adapters/posthog/index.js.map +4 -4
- package/dist/lib/adapters/posthog/posthog.d.ts +2 -2
- package/dist/lib/adapters/posthog/posthog.d.ts.map +1 -1
- package/dist/lib/adapters/posthog/posthog.sql-policy.d.ts.map +1 -1
- package/dist/lib/adapters/posthog/schema.posthog.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/posthog/transport.d.ts.map +1 -1
- package/dist/lib/adapters/posthog/types.d.ts +16 -6
- package/dist/lib/adapters/posthog/types.d.ts.map +1 -1
- package/dist/lib/adapters/spreadsheet/index.js +113 -34
- package/dist/lib/adapters/spreadsheet/index.js.map +4 -4
- package/dist/lib/adapters/sqlite/column-stats.sqlite.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/sqlite/column-values.sqlite.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/sqlite/constraint.sqlite.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/sqlite/index.js +136 -49
- package/dist/lib/adapters/sqlite/index.js.map +4 -4
- package/dist/lib/adapters/sqlite/indexes.sqlite.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/sqlite/info.sqlite.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/sqlite/row-count.sqlite.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/sqlite/sqlite-rows.d.ts +41 -0
- package/dist/lib/adapters/sqlite/sqlite-rows.d.ts.map +1 -0
- package/dist/lib/adapters/sqlite/sqlite.d.ts +1 -1
- package/dist/lib/adapters/sqlite/sqlite.d.ts.map +1 -1
- package/dist/lib/adapters/sqlite/table.sqlite.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/sqlite/view.sqlite.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/sqlserver/column-stats.sqlserver.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/sqlserver/column-values.sqlserver.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/sqlserver/constraint.sqlserver.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/sqlserver/index.d.ts +2 -4
- package/dist/lib/adapters/sqlserver/index.d.ts.map +1 -1
- package/dist/lib/adapters/sqlserver/index.js +223 -455
- package/dist/lib/adapters/sqlserver/index.js.map +4 -4
- package/dist/lib/adapters/sqlserver/indexes.sqlserver.grounding.d.ts +1 -5
- package/dist/lib/adapters/sqlserver/indexes.sqlserver.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/sqlserver/info.sqlserver.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/sqlserver/row-count.sqlserver.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/sqlserver/sqlserver-rows.d.ts +7 -0
- package/dist/lib/adapters/sqlserver/sqlserver-rows.d.ts.map +1 -0
- package/dist/lib/adapters/sqlserver/sqlserver.d.ts +6 -1
- package/dist/lib/adapters/sqlserver/sqlserver.d.ts.map +1 -1
- package/dist/lib/adapters/sqlserver/table.sqlserver.grounding.d.ts +4 -3
- package/dist/lib/adapters/sqlserver/table.sqlserver.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/sqlserver/view.sqlserver.grounding.d.ts +3 -3
- package/dist/lib/adapters/sqlserver/view.sqlserver.grounding.d.ts.map +1 -1
- package/dist/lib/agents/sql-transform-plugins.d.ts.map +1 -1
- package/dist/lib/checkpoint.d.ts +34 -21
- package/dist/lib/checkpoint.d.ts.map +1 -1
- package/dist/lib/file-cache.d.ts +6 -1
- package/dist/lib/file-cache.d.ts.map +1 -1
- package/dist/lib/fs/columns.d.ts +14 -0
- package/dist/lib/fs/columns.d.ts.map +1 -0
- package/dist/lib/fs/mssql/mssql-fs.d.ts +4 -4
- package/dist/lib/fs/mssql/mssql-fs.d.ts.map +1 -1
- package/dist/lib/fs/postgres/postgres-fs.d.ts +4 -4
- package/dist/lib/fs/postgres/postgres-fs.d.ts.map +1 -1
- package/dist/lib/fs/sqlite/sqlite-fs.d.ts +4 -4
- package/dist/lib/fs/sqlite/sqlite-fs.d.ts.map +1 -1
- package/dist/lib/index-cache.d.ts +4 -3
- package/dist/lib/index-cache.d.ts.map +1 -1
- package/dist/lib/sql.d.ts.map +1 -1
- package/dist/lib/synthesis/decorators/deduplicated-producer.d.ts +1 -2
- package/dist/lib/synthesis/decorators/deduplicated-producer.d.ts.map +1 -1
- package/dist/lib/synthesis/decorators/filtered-producer.d.ts +0 -2
- package/dist/lib/synthesis/decorators/filtered-producer.d.ts.map +1 -1
- package/dist/lib/synthesis/decorators/validated-producer.d.ts +1 -3
- package/dist/lib/synthesis/decorators/validated-producer.d.ts.map +1 -1
- package/dist/lib/synthesis/extractors/base-contextual-extractor.d.ts.map +1 -1
- package/dist/lib/synthesis/extractors/message-extractor.d.ts.map +1 -1
- package/dist/lib/synthesis/extractors/tool-input.d.ts +6 -0
- package/dist/lib/synthesis/extractors/tool-input.d.ts.map +1 -0
- package/dist/lib/synthesis/index.js +124 -114
- package/dist/lib/synthesis/index.js.map +4 -4
- package/dist/lib/synthesis/synthesizers/breadth-evolver.d.ts +0 -2
- package/dist/lib/synthesis/synthesizers/breadth-evolver.d.ts.map +1 -1
- package/dist/lib/synthesis/synthesizers/depth-evolver.d.ts +0 -3
- package/dist/lib/synthesis/synthesizers/depth-evolver.d.ts.map +1 -1
- package/dist/lib/synthesis/synthesizers/schema-synthesizer.d.ts +0 -2
- package/dist/lib/synthesis/synthesizers/schema-synthesizer.d.ts.map +1 -1
- 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
|
|
444
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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:
|
|
709
|
-
result:
|
|
710
|
-
|
|
711
|
-
sql:
|
|
712
|
-
reasoning:
|
|
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
|
-
|
|
715
|
-
error:
|
|
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:
|
|
767
|
-
sql:
|
|
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:
|
|
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
|
|
973
|
-
|
|
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 =
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
1363
|
+
return adapters;
|
|
1337
1364
|
}
|
|
1338
1365
|
function isAdapterShape(value) {
|
|
1339
|
-
|
|
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
|
|
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
|
});
|