@askdb/core 0.5.0-beta.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 (120) hide show
  1. package/LICENSE +201 -0
  2. package/NOTICE +10 -0
  3. package/README.md +74 -0
  4. package/dist/ai/provider.d.ts +122 -0
  5. package/dist/ai/provider.d.ts.map +1 -0
  6. package/dist/ai/provider.js +224 -0
  7. package/dist/ai/provider.js.map +1 -0
  8. package/dist/ask.d.ts +81 -0
  9. package/dist/ask.d.ts.map +1 -0
  10. package/dist/ask.js +83 -0
  11. package/dist/ask.js.map +1 -0
  12. package/dist/enrichment/index.d.ts +4 -0
  13. package/dist/enrichment/index.d.ts.map +1 -0
  14. package/dist/enrichment/index.js +3 -0
  15. package/dist/enrichment/index.js.map +1 -0
  16. package/dist/enrichment/prompt.d.ts +4 -0
  17. package/dist/enrichment/prompt.d.ts.map +1 -0
  18. package/dist/enrichment/prompt.js +72 -0
  19. package/dist/enrichment/prompt.js.map +1 -0
  20. package/dist/enrichment/suggest.d.ts +23 -0
  21. package/dist/enrichment/suggest.d.ts.map +1 -0
  22. package/dist/enrichment/suggest.js +38 -0
  23. package/dist/enrichment/suggest.js.map +1 -0
  24. package/dist/enrichment/types.d.ts +44 -0
  25. package/dist/enrichment/types.d.ts.map +1 -0
  26. package/dist/enrichment/types.js +2 -0
  27. package/dist/enrichment/types.js.map +1 -0
  28. package/dist/errors.d.ts +21 -0
  29. package/dist/errors.d.ts.map +1 -0
  30. package/dist/errors.js +33 -0
  31. package/dist/errors.js.map +1 -0
  32. package/dist/index.d.ts +20 -0
  33. package/dist/index.d.ts.map +1 -0
  34. package/dist/index.js +15 -0
  35. package/dist/index.js.map +1 -0
  36. package/dist/logging/askdb-logger.d.ts +13 -0
  37. package/dist/logging/askdb-logger.d.ts.map +1 -0
  38. package/dist/logging/askdb-logger.js +2 -0
  39. package/dist/logging/askdb-logger.js.map +1 -0
  40. package/dist/logging/create-askdb-logger.d.ts +25 -0
  41. package/dist/logging/create-askdb-logger.d.ts.map +1 -0
  42. package/dist/logging/create-askdb-logger.js +47 -0
  43. package/dist/logging/create-askdb-logger.js.map +1 -0
  44. package/dist/logging/log-contract.d.ts +16 -0
  45. package/dist/logging/log-contract.d.ts.map +1 -0
  46. package/dist/logging/log-contract.js +23 -0
  47. package/dist/logging/log-contract.js.map +1 -0
  48. package/dist/logging/log-events.d.ts +32 -0
  49. package/dist/logging/log-events.d.ts.map +1 -0
  50. package/dist/logging/log-events.js +31 -0
  51. package/dist/logging/log-events.js.map +1 -0
  52. package/dist/logging/pino-supported-levels.d.ts +9 -0
  53. package/dist/logging/pino-supported-levels.d.ts.map +1 -0
  54. package/dist/logging/pino-supported-levels.js +16 -0
  55. package/dist/logging/pino-supported-levels.js.map +1 -0
  56. package/dist/modes/types.d.ts +8 -0
  57. package/dist/modes/types.d.ts.map +1 -0
  58. package/dist/modes/types.js +20 -0
  59. package/dist/modes/types.js.map +1 -0
  60. package/dist/retrieval/synthesize-ddl.d.ts +29 -0
  61. package/dist/retrieval/synthesize-ddl.d.ts.map +1 -0
  62. package/dist/retrieval/synthesize-ddl.js +160 -0
  63. package/dist/retrieval/synthesize-ddl.js.map +1 -0
  64. package/dist/retrieval/types.d.ts +31 -0
  65. package/dist/retrieval/types.d.ts.map +1 -0
  66. package/dist/retrieval/types.js +2 -0
  67. package/dist/retrieval/types.js.map +1 -0
  68. package/dist/schema/format.d.ts +76 -0
  69. package/dist/schema/format.d.ts.map +1 -0
  70. package/dist/schema/format.js +20 -0
  71. package/dist/schema/format.js.map +1 -0
  72. package/dist/schema/normalize.d.ts +31 -0
  73. package/dist/schema/normalize.d.ts.map +1 -0
  74. package/dist/schema/normalize.js +89 -0
  75. package/dist/schema/normalize.js.map +1 -0
  76. package/dist/schema/parse.d.ts +5 -0
  77. package/dist/schema/parse.d.ts.map +1 -0
  78. package/dist/schema/parse.js +37 -0
  79. package/dist/schema/parse.js.map +1 -0
  80. package/dist/schema/types.d.ts +23 -0
  81. package/dist/schema/types.d.ts.map +1 -0
  82. package/dist/schema/types.js +2 -0
  83. package/dist/schema/types.js.map +1 -0
  84. package/dist/schema/v2/describable.d.ts +155 -0
  85. package/dist/schema/v2/describable.d.ts.map +1 -0
  86. package/dist/schema/v2/describable.js +44 -0
  87. package/dist/schema/v2/describable.js.map +1 -0
  88. package/dist/schema/v2/format.d.ts +15 -0
  89. package/dist/schema/v2/format.d.ts.map +1 -0
  90. package/dist/schema/v2/format.js +97 -0
  91. package/dist/schema/v2/format.js.map +1 -0
  92. package/dist/schema/v2/index.d.ts +10 -0
  93. package/dist/schema/v2/index.d.ts.map +1 -0
  94. package/dist/schema/v2/index.js +7 -0
  95. package/dist/schema/v2/index.js.map +1 -0
  96. package/dist/schema/v2/loader.d.ts +18 -0
  97. package/dist/schema/v2/loader.d.ts.map +1 -0
  98. package/dist/schema/v2/loader.js +230 -0
  99. package/dist/schema/v2/loader.js.map +1 -0
  100. package/dist/schema/v2/normalized.d.ts +58 -0
  101. package/dist/schema/v2/normalized.d.ts.map +1 -0
  102. package/dist/schema/v2/normalized.js +2 -0
  103. package/dist/schema/v2/normalized.js.map +1 -0
  104. package/dist/schema/v2/parser.d.ts +12 -0
  105. package/dist/schema/v2/parser.d.ts.map +1 -0
  106. package/dist/schema/v2/parser.js +48 -0
  107. package/dist/schema/v2/parser.js.map +1 -0
  108. package/dist/schema/v2/physical.d.ts +229 -0
  109. package/dist/schema/v2/physical.d.ts.map +1 -0
  110. package/dist/schema/v2/physical.js +28 -0
  111. package/dist/schema/v2/physical.js.map +1 -0
  112. package/dist/schema/v2/writer.d.ts +14 -0
  113. package/dist/schema/v2/writer.d.ts.map +1 -0
  114. package/dist/schema/v2/writer.js +49 -0
  115. package/dist/schema/v2/writer.js.map +1 -0
  116. package/dist/sql/extract-sql.d.ts +5 -0
  117. package/dist/sql/extract-sql.d.ts.map +1 -0
  118. package/dist/sql/extract-sql.js +12 -0
  119. package/dist/sql/extract-sql.js.map +1 -0
  120. package/package.json +60 -0
package/dist/ask.d.ts ADDED
@@ -0,0 +1,81 @@
1
+ import type { LanguageModel, generateText as defaultGenerateText } from "ai";
2
+ import type { AskDbLogger } from "./logging/askdb-logger.js";
3
+ import type { AnyNormalizedSchema } from "./schema/types.js";
4
+ import { type AskDbModeV1 } from "./modes/types.js";
5
+ import type { Retriever } from "./retrieval/types.js";
6
+ /** Options forwarded to a dialect's generator. Stable across dialects. */
7
+ export type AskDialectGenerateOptions = {
8
+ logger?: AskDbLogger;
9
+ explain?: boolean;
10
+ omitSensitiveIdentifiersFromNlToSqlPrompt?: boolean;
11
+ generateText?: typeof defaultGenerateText;
12
+ prebuiltDdl?: string;
13
+ };
14
+ /** Output of a dialect's generator: validated SQL plus optional dialect-specific explain metadata. */
15
+ export type AskDialectGenerateResult = {
16
+ sql: string;
17
+ explain?: unknown;
18
+ };
19
+ /** Adapter that knows how to turn a question + schema + model into validated dialect-specific SQL. */
20
+ export type AskDialect = {
21
+ generate(question: string, schema: AnyNormalizedSchema, model: LanguageModel, options?: AskDialectGenerateOptions): Promise<AskDialectGenerateResult>;
22
+ };
23
+ /** Generic deps the pipeline forwards into the dialect (test-time mock for `generateText`, etc.). */
24
+ export type AskGenerateDeps = {
25
+ generateText?: typeof defaultGenerateText;
26
+ };
27
+ export type AskPipelineOptions = {
28
+ question: string;
29
+ schema: AnyNormalizedSchema;
30
+ model: LanguageModel;
31
+ /** Required: the SQL dialect adapter to use (e.g. `postgresDialect` from `@askdb/postgres`). */
32
+ dialect: AskDialect;
33
+ /** When true, callers may inspect heuristic guardrail metadata (hosts/CLI). */
34
+ explain?: boolean;
35
+ /**
36
+ * When true, omit sensitive table/column names from NL→SQL DDL. Default false — names are included
37
+ * with `(sensitive)` tags so the model can ground SQL.
38
+ */
39
+ omitSensitiveIdentifiersFromNlToSqlPrompt?: boolean;
40
+ deps?: AskGenerateDeps;
41
+ /** Optional structured logger (host-provided — e.g. `createAskDbLogger` wraps Pino). */
42
+ logger?: AskDbLogger;
43
+ /**
44
+ * Trust boundary for optional post-execute model paths. Default {@link DEFAULT_ASKDB_MODE}.
45
+ * @see `docs/contracts/modes-v1.md`
46
+ */
47
+ mode?: AskDbModeV1;
48
+ /**
49
+ * Optional retriever from `@askdb/rag` (or any compatible implementation).
50
+ * When supplied **and** the schema's chunk count exceeds
51
+ * {@link retrievalThresholdChunks} (default 30), the retriever is called
52
+ * with the user question and the retrieved chunks replace the full DDL
53
+ * block in the NL→SQL prompt.
54
+ *
55
+ * When omitted, the Phase 5 behavior is preserved (full DDL inlined when
56
+ * v2 fields exist).
57
+ */
58
+ retriever?: Retriever;
59
+ /** Top-k forwarded to the retriever. Default 8. */
60
+ retrievalK?: number;
61
+ /**
62
+ * Chunk-count threshold above which retrieval is preferred. When the
63
+ * total chunk count for the schema is at or below this number, the full
64
+ * DDL is inlined even if a retriever is supplied. Default 30.
65
+ */
66
+ retrievalThresholdChunks?: number;
67
+ /**
68
+ * Total chunk count for the indexed schema. Hosts that built the index
69
+ * via `buildSchemaIndex` should pass `result.stats.chunksTotal` here so
70
+ * the threshold check is meaningful. Defaults to `Infinity` — i.e. always
71
+ * use the retriever when one is supplied — which matches the spec's
72
+ * "consumer decides" stance for hosts that don't surface a count.
73
+ */
74
+ totalSchemaChunkCount?: number;
75
+ };
76
+ export type AskPipelineResult = {
77
+ sql: string;
78
+ explain?: unknown;
79
+ };
80
+ export declare function ask(options: AskPipelineOptions): Promise<AskPipelineResult>;
81
+ //# sourceMappingURL=ask.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ask.d.ts","sourceRoot":"","sources":["../src/ask.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,IAAI,mBAAmB,EAAE,MAAM,IAAI,CAAC;AAC7E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAE7D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAsB,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACxE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAItD,0EAA0E;AAC1E,MAAM,MAAM,yBAAyB,GAAG;IACtC,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,yCAAyC,CAAC,EAAE,OAAO,CAAC;IACpD,YAAY,CAAC,EAAE,OAAO,mBAAmB,CAAC;IAC1C,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,sGAAsG;AACtG,MAAM,MAAM,wBAAwB,GAAG;IACrC,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,sGAAsG;AACtG,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,CACN,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,mBAAmB,EAC3B,KAAK,EAAE,aAAa,EACpB,OAAO,CAAC,EAAE,yBAAyB,GAClC,OAAO,CAAC,wBAAwB,CAAC,CAAC;CACtC,CAAC;AAEF,qGAAqG;AACrG,MAAM,MAAM,eAAe,GAAG;IAC5B,YAAY,CAAC,EAAE,OAAO,mBAAmB,CAAC;CAC3C,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,mBAAmB,CAAC;IAC5B,KAAK,EAAE,aAAa,CAAC;IACrB,gGAAgG;IAChG,OAAO,EAAE,UAAU,CAAC;IACpB,+EAA+E;IAC/E,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;OAGG;IACH,yCAAyC,CAAC,EAAE,OAAO,CAAC;IACpD,IAAI,CAAC,EAAE,eAAe,CAAC;IACvB,wFAAwF;IACxF,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB;;;OAGG;IACH,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB;;;;;;;;;OASG;IACH,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,mDAAmD;IACnD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC;;;;;;OAMG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,wBAAsB,GAAG,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA2BjF"}
package/dist/ask.js ADDED
@@ -0,0 +1,83 @@
1
+ import { AskDbLogEvent } from "./logging/log-events.js";
2
+ import { DEFAULT_ASKDB_MODE } from "./modes/types.js";
3
+ import { synthesizeRetrievedDdl } from "./retrieval/synthesize-ddl.js";
4
+ export async function ask(options) {
5
+ const logger = options.logger;
6
+ const mode = options.mode ?? DEFAULT_ASKDB_MODE;
7
+ logger?.info({ event: AskDbLogEvent.PipelineMode, mode }, "pipeline mode");
8
+ const explainRequested = options.explain ?? false;
9
+ const omitSensitive = options.omitSensitiveIdentifiersFromNlToSqlPrompt ?? false;
10
+ const prebuiltDdl = await maybeRetrieveDdl({
11
+ options,
12
+ logger,
13
+ omitSensitive,
14
+ });
15
+ const generated = await options.dialect.generate(options.question, options.schema, options.model, {
16
+ logger,
17
+ explain: explainRequested,
18
+ omitSensitiveIdentifiersFromNlToSqlPrompt: omitSensitive || undefined,
19
+ generateText: options.deps?.generateText,
20
+ prebuiltDdl,
21
+ });
22
+ const sql = generated.sql;
23
+ const explain = generated.explain;
24
+ return explain !== undefined ? { sql, explain } : { sql };
25
+ }
26
+ /** Default chunk-count threshold below which the full DDL is preferred. */
27
+ const DEFAULT_RETRIEVAL_THRESHOLD_CHUNKS = 30;
28
+ const DEFAULT_RETRIEVAL_K = 8;
29
+ async function maybeRetrieveDdl(args) {
30
+ const { options, logger, omitSensitive } = args;
31
+ const retriever = options.retriever;
32
+ if (!retriever)
33
+ return undefined;
34
+ if (!isV2Schema(options.schema)) {
35
+ logger?.info({ event: AskDbLogEvent.PipelineRetrievalSkipped, reason: "schema_not_v2" }, "retriever supplied but schema is not v2 — skipping retrieval");
36
+ return undefined;
37
+ }
38
+ const threshold = options.retrievalThresholdChunks ?? DEFAULT_RETRIEVAL_THRESHOLD_CHUNKS;
39
+ const total = options.totalSchemaChunkCount ?? Number.POSITIVE_INFINITY;
40
+ if (total <= threshold) {
41
+ logger?.info({
42
+ event: AskDbLogEvent.PipelineRetrievalSkipped,
43
+ reason: "below_threshold",
44
+ totalChunks: total,
45
+ threshold,
46
+ }, "retriever supplied but schema is below threshold — using full DDL");
47
+ return undefined;
48
+ }
49
+ const k = options.retrievalK ?? DEFAULT_RETRIEVAL_K;
50
+ const results = await retriever({
51
+ question: options.question,
52
+ k,
53
+ filter: { schemaId: options.schema.schemaId },
54
+ });
55
+ if (results.length === 0) {
56
+ logger?.info({
57
+ event: AskDbLogEvent.PipelineRetrievalSkipped,
58
+ reason: "no_results",
59
+ k,
60
+ threshold,
61
+ totalChunks: total === Number.POSITIVE_INFINITY ? null : total,
62
+ }, "retriever returned no chunks — using full DDL");
63
+ return undefined;
64
+ }
65
+ const synth = synthesizeRetrievedDdl({
66
+ schema: options.schema,
67
+ results,
68
+ omitSensitiveIdentifiersFromPrompt: omitSensitive,
69
+ });
70
+ logger?.info({
71
+ event: AskDbLogEvent.PipelineRetrievalUsed,
72
+ k,
73
+ resultCount: results.length,
74
+ tablesEmitted: synth.tablesEmitted,
75
+ threshold,
76
+ totalChunks: total === Number.POSITIVE_INFINITY ? null : total,
77
+ }, "retriever supplied focused DDL");
78
+ return synth.ddl;
79
+ }
80
+ function isV2Schema(schema) {
81
+ return "schemaId" in schema;
82
+ }
83
+ //# sourceMappingURL=ask.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ask.js","sourceRoot":"","sources":["../src/ask.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAExD,OAAO,EAAE,kBAAkB,EAAoB,MAAM,kBAAkB,CAAC;AAExE,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAwFvE,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,OAA2B;IACnD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAC9B,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,kBAAkB,CAAC;IAChD,MAAM,EAAE,IAAI,CAAC,EAAE,KAAK,EAAE,aAAa,CAAC,YAAY,EAAE,IAAI,EAAE,EAAE,eAAe,CAAC,CAAC;IAE3E,MAAM,gBAAgB,GAAG,OAAO,CAAC,OAAO,IAAI,KAAK,CAAC;IAClD,MAAM,aAAa,GAAG,OAAO,CAAC,yCAAyC,IAAI,KAAK,CAAC;IACjF,MAAM,WAAW,GAAG,MAAM,gBAAgB,CAAC;QACzC,OAAO;QACP,MAAM;QACN,aAAa;KACd,CAAC,CAAC;IACH,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,QAAQ,CAC9C,OAAO,CAAC,QAAQ,EAChB,OAAO,CAAC,MAAM,EACd,OAAO,CAAC,KAAK,EACb;QACE,MAAM;QACN,OAAO,EAAE,gBAAgB;QACzB,yCAAyC,EAAE,aAAa,IAAI,SAAS;QACrE,YAAY,EAAE,OAAO,CAAC,IAAI,EAAE,YAAY;QACxC,WAAW;KACZ,CACF,CAAC;IACF,MAAM,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC;IAC1B,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC;IAClC,OAAO,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC;AAC5D,CAAC;AAED,2EAA2E;AAC3E,MAAM,kCAAkC,GAAG,EAAE,CAAC;AAC9C,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAE9B,KAAK,UAAU,gBAAgB,CAAC,IAI/B;IACC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG,IAAI,CAAC;IAChD,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;IACpC,IAAI,CAAC,SAAS;QAAE,OAAO,SAAS,CAAC;IAEjC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAChC,MAAM,EAAE,IAAI,CACV,EAAE,KAAK,EAAE,aAAa,CAAC,wBAAwB,EAAE,MAAM,EAAE,eAAe,EAAE,EAC1E,8DAA8D,CAC/D,CAAC;QACF,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,wBAAwB,IAAI,kCAAkC,CAAC;IACzF,MAAM,KAAK,GAAG,OAAO,CAAC,qBAAqB,IAAI,MAAM,CAAC,iBAAiB,CAAC;IACxE,IAAI,KAAK,IAAI,SAAS,EAAE,CAAC;QACvB,MAAM,EAAE,IAAI,CACV;YACE,KAAK,EAAE,aAAa,CAAC,wBAAwB;YAC7C,MAAM,EAAE,iBAAiB;YACzB,WAAW,EAAE,KAAK;YAClB,SAAS;SACV,EACD,mEAAmE,CACpE,CAAC;QACF,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,CAAC,GAAG,OAAO,CAAC,UAAU,IAAI,mBAAmB,CAAC;IACpD,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC;QAC9B,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,CAAC;QACD,MAAM,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE;KAC9C,CAAC,CAAC;IACH,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,EAAE,IAAI,CACV;YACE,KAAK,EAAE,aAAa,CAAC,wBAAwB;YAC7C,MAAM,EAAE,YAAY;YACpB,CAAC;YACD,SAAS;YACT,WAAW,EAAE,KAAK,KAAK,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK;SAC/D,EACD,+CAA+C,CAChD,CAAC;QACF,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,KAAK,GAAG,sBAAsB,CAAC;QACnC,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,OAAO;QACP,kCAAkC,EAAE,aAAa;KAClD,CAAC,CAAC;IACH,MAAM,EAAE,IAAI,CACV;QACE,KAAK,EAAE,aAAa,CAAC,qBAAqB;QAC1C,CAAC;QACD,WAAW,EAAE,OAAO,CAAC,MAAM;QAC3B,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,SAAS;QACT,WAAW,EAAE,KAAK,KAAK,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK;KAC/D,EACD,gCAAgC,CACjC,CAAC;IACF,OAAO,KAAK,CAAC,GAAG,CAAC;AACnB,CAAC;AAED,SAAS,UAAU,CAAC,MAA2B;IAC7C,OAAO,UAAU,IAAI,MAAM,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { ENRICHMENT_SYSTEM_PROMPT, buildEnrichmentUserPrompt, } from "./prompt.js";
2
+ export { parseCandidates, suggestEnrichment, type SuggestEnrichmentDeps, } from "./suggest.js";
3
+ export type { EnrichmentCandidate, EnrichmentContext, EnrichmentTarget, } from "./types.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/enrichment/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,EACxB,yBAAyB,GAC1B,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,KAAK,qBAAqB,GAC3B,MAAM,cAAc,CAAC;AACtB,YAAY,EACV,mBAAmB,EACnB,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,YAAY,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { ENRICHMENT_SYSTEM_PROMPT, buildEnrichmentUserPrompt, } from "./prompt.js";
2
+ export { parseCandidates, suggestEnrichment, } from "./suggest.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/enrichment/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,EACxB,yBAAyB,GAC1B,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,eAAe,EACf,iBAAiB,GAElB,MAAM,cAAc,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { EnrichmentContext, EnrichmentTarget } from "./types.js";
2
+ export declare const ENRICHMENT_SYSTEM_PROMPT = "You enrich AskDB Schema v2 describable metadata.\n\nRules:\n- Be concise. Descriptions: one sentence, no marketing language.\n- Aliases: 2\u20134 lowercase, comma-separated, the way people *say* the thing\n in plain English. No quotes, no synonyms of synonyms.\n- Common query language: 2\u20134 short bullet lines mapping a colloquial term\n to the SQL filter or aggregation it implies.\n- Never invent columns, tables, or relationships not in the schema.\n- Never suggest values for sensitive columns (they will be excluded by RAG).\n- Reply with 1\u20133 candidate options separated by exactly the line \"---\".\n Do not number, prefix, or label the candidates.";
3
+ export declare function buildEnrichmentUserPrompt(target: EnrichmentTarget, ctx: EnrichmentContext): string;
4
+ //# sourceMappingURL=prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../src/enrichment/prompt.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEtE,eAAO,MAAM,wBAAwB,gqBAWa,CAAC;AAEnD,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,gBAAgB,EACxB,GAAG,EAAE,iBAAiB,GACrB,MAAM,CAuBR"}
@@ -0,0 +1,72 @@
1
+ export const ENRICHMENT_SYSTEM_PROMPT = `You enrich AskDB Schema v2 describable metadata.
2
+
3
+ Rules:
4
+ - Be concise. Descriptions: one sentence, no marketing language.
5
+ - Aliases: 2–4 lowercase, comma-separated, the way people *say* the thing
6
+ in plain English. No quotes, no synonyms of synonyms.
7
+ - Common query language: 2–4 short bullet lines mapping a colloquial term
8
+ to the SQL filter or aggregation it implies.
9
+ - Never invent columns, tables, or relationships not in the schema.
10
+ - Never suggest values for sensitive columns (they will be excluded by RAG).
11
+ - Reply with 1–3 candidate options separated by exactly the line "---".
12
+ Do not number, prefix, or label the candidates.`;
13
+ export function buildEnrichmentUserPrompt(target, ctx) {
14
+ const lines = [];
15
+ lines.push(`Schema: ${ctx.schemaId}`);
16
+ lines.push(`Table: ${qualifiedName(target.table)}`);
17
+ // Always include the column list for context.
18
+ lines.push("Columns:");
19
+ for (const c of target.table.columns) {
20
+ lines.push(` - ${describeColumn(c)}`);
21
+ }
22
+ if (ctx.neighbors && ctx.neighbors.length > 0) {
23
+ lines.push("");
24
+ lines.push("Related tables (FK neighbors):");
25
+ for (const t of ctx.neighbors) {
26
+ lines.push(` - ${qualifiedName(t)} (${t.columns.length} columns)`);
27
+ }
28
+ }
29
+ lines.push("");
30
+ lines.push(targetInstruction(target));
31
+ return lines.join("\n");
32
+ }
33
+ function targetInstruction(target) {
34
+ switch (target.kind) {
35
+ case "table-description":
36
+ return `Suggest a one-sentence description of what the \`${target.table.name}\` table holds and what each row represents.`;
37
+ case "table-aliases":
38
+ return `Suggest 2–4 short aliases (comma-separated) people might use to refer to the \`${target.table.name}\` table in plain English.`;
39
+ case "table-primary-entity":
40
+ return `Suggest the primary entity (a single noun) that one row of \`${target.table.name}\` represents.`;
41
+ case "column-description": {
42
+ const col = findColumn(target.table, target.columnId);
43
+ return `Suggest a one-sentence description of the \`${col.name}\` column (type \`${col.type}\`) on \`${target.table.name}\`.`;
44
+ }
45
+ case "column-aliases": {
46
+ const col = findColumn(target.table, target.columnId);
47
+ return `Suggest 2–4 short aliases (comma-separated) people might use for the \`${col.name}\` column on \`${target.table.name}\`.`;
48
+ }
49
+ case "common-query-language":
50
+ return `Suggest 2–4 "common query language" bullet lines for \`${target.table.name}\` that map colloquial business terms to the SQL conditions they imply.`;
51
+ }
52
+ }
53
+ function describeColumn(c) {
54
+ const parts = [c.name, c.type];
55
+ if (c.primaryKey)
56
+ parts.push("[pk]");
57
+ if (c.sensitive)
58
+ parts.push("[sensitive]");
59
+ if (c.nullable)
60
+ parts.push("[nullable]");
61
+ return parts.join(" ");
62
+ }
63
+ function findColumn(table, columnId) {
64
+ const col = table.columns.find((c) => c.id === columnId);
65
+ if (!col)
66
+ throw new Error(`Column not found: ${columnId} in ${qualifiedName(table)}`);
67
+ return col;
68
+ }
69
+ function qualifiedName(t) {
70
+ return `${t.schema}.${t.name}`;
71
+ }
72
+ //# sourceMappingURL=prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/enrichment/prompt.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { LanguageModel } from "ai";
2
+ import { generateText as defaultGenerateText } from "ai";
3
+ import type { EnrichmentCandidate, EnrichmentContext, EnrichmentTarget } from "./types.js";
4
+ export type SuggestEnrichmentDeps = {
5
+ generateText?: typeof defaultGenerateText;
6
+ /** Optional cap on the number of candidates returned. Default 3. */
7
+ maxCandidates?: number;
8
+ /** Sampling temperature. Default 0.4 — small variety, mostly grounded. */
9
+ temperature?: number;
10
+ };
11
+ /**
12
+ * Ask the model for 1–3 enrichment candidates for the given target. The model
13
+ * is expected to reply with candidates separated by lines containing only `---`.
14
+ *
15
+ * Falls back to a single candidate if no `---` separators are present.
16
+ */
17
+ export declare function suggestEnrichment(target: EnrichmentTarget, context: EnrichmentContext, model: LanguageModel, deps?: SuggestEnrichmentDeps): Promise<EnrichmentCandidate[]>;
18
+ /**
19
+ * Parse the model's reply into candidates. Splits on lines containing only
20
+ * three or more dashes (`---`, `----`, …). Trims each candidate; drops empties.
21
+ */
22
+ export declare function parseCandidates(raw: string, max: number): EnrichmentCandidate[];
23
+ //# sourceMappingURL=suggest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suggest.d.ts","sourceRoot":"","sources":["../../src/enrichment/suggest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AACxC,OAAO,EAAE,YAAY,IAAI,mBAAmB,EAAE,MAAM,IAAI,CAAC;AAKzD,OAAO,KAAK,EACV,mBAAmB,EACnB,iBAAiB,EACjB,gBAAgB,EACjB,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,qBAAqB,GAAG;IAClC,YAAY,CAAC,EAAE,OAAO,mBAAmB,CAAC;IAC1C,oEAAoE;IACpE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,0EAA0E;IAC1E,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,gBAAgB,EACxB,OAAO,EAAE,iBAAiB,EAC1B,KAAK,EAAE,aAAa,EACpB,IAAI,GAAE,qBAA0B,GAC/B,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAYhC;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,mBAAmB,EAAE,CAU/E"}
@@ -0,0 +1,38 @@
1
+ import { generateText as defaultGenerateText } from "ai";
2
+ import { ENRICHMENT_SYSTEM_PROMPT, buildEnrichmentUserPrompt, } from "./prompt.js";
3
+ /**
4
+ * Ask the model for 1–3 enrichment candidates for the given target. The model
5
+ * is expected to reply with candidates separated by lines containing only `---`.
6
+ *
7
+ * Falls back to a single candidate if no `---` separators are present.
8
+ */
9
+ export async function suggestEnrichment(target, context, model, deps = {}) {
10
+ const generateText = deps.generateText ?? defaultGenerateText;
11
+ const maxCandidates = deps.maxCandidates ?? 3;
12
+ const result = await generateText({
13
+ model,
14
+ system: ENRICHMENT_SYSTEM_PROMPT,
15
+ prompt: buildEnrichmentUserPrompt(target, context),
16
+ temperature: deps.temperature ?? 0.4,
17
+ });
18
+ const text = result.text;
19
+ return parseCandidates(text, maxCandidates);
20
+ }
21
+ /**
22
+ * Parse the model's reply into candidates. Splits on lines containing only
23
+ * three or more dashes (`---`, `----`, …). Trims each candidate; drops empties.
24
+ */
25
+ export function parseCandidates(raw, max) {
26
+ const parts = raw.split(/^-{3,}\s*$/m);
27
+ const candidates = [];
28
+ for (const part of parts) {
29
+ const text = part.trim();
30
+ if (!text)
31
+ continue;
32
+ candidates.push({ text });
33
+ if (candidates.length >= max)
34
+ break;
35
+ }
36
+ return candidates;
37
+ }
38
+ //# sourceMappingURL=suggest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suggest.js","sourceRoot":"","sources":["../../src/enrichment/suggest.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,IAAI,mBAAmB,EAAE,MAAM,IAAI,CAAC;AACzD,OAAO,EACL,wBAAwB,EACxB,yBAAyB,GAC1B,MAAM,aAAa,CAAC;AAerB;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,MAAwB,EACxB,OAA0B,EAC1B,KAAoB,EACpB,OAA8B,EAAE;IAEhC,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,IAAI,mBAAmB,CAAC;IAC9D,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,IAAI,CAAC,CAAC;IAE9C,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC;QAChC,KAAK;QACL,MAAM,EAAE,wBAAwB;QAChC,MAAM,EAAE,yBAAyB,CAAC,MAAM,EAAE,OAAO,CAAC;QAClD,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,GAAG;KACrC,CAAC,CAAC;IACH,MAAM,IAAI,GAAI,MAA2B,CAAC,IAAI,CAAC;IAC/C,OAAO,eAAe,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;AAC9C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,GAAW,EAAE,GAAW;IACtD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IACvC,MAAM,UAAU,GAA0B,EAAE,CAAC;IAC7C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI;YAAE,SAAS;QACpB,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1B,IAAI,UAAU,CAAC,MAAM,IAAI,GAAG;YAAE,MAAM;IACtC,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC"}
@@ -0,0 +1,44 @@
1
+ import type { V2Table } from "../schema/v2/physical.js";
2
+ /**
3
+ * What to suggest for. The TUI builds one of these per active prompt and asks
4
+ * `suggestEnrichment` for 1–3 candidates the user reviews and confirms.
5
+ */
6
+ export type EnrichmentTarget = {
7
+ kind: "table-description";
8
+ table: V2Table;
9
+ } | {
10
+ kind: "table-aliases";
11
+ table: V2Table;
12
+ } | {
13
+ kind: "table-primary-entity";
14
+ table: V2Table;
15
+ } | {
16
+ kind: "column-description";
17
+ table: V2Table;
18
+ columnId: string;
19
+ } | {
20
+ kind: "column-aliases";
21
+ table: V2Table;
22
+ columnId: string;
23
+ } | {
24
+ kind: "common-query-language";
25
+ table: V2Table;
26
+ };
27
+ /**
28
+ * One suggestion candidate. For free-text fields, `text` is the value.
29
+ * For list fields (aliases), the TUI splits on `,` after editing.
30
+ */
31
+ export type EnrichmentCandidate = {
32
+ /** The suggested text. Whitespace at the ends is stripped. */
33
+ text: string;
34
+ };
35
+ /**
36
+ * Optional context: neighboring tables (joined via FK) and the schema id, so
37
+ * the model can ground suggestions beyond the immediate table.
38
+ */
39
+ export type EnrichmentContext = {
40
+ schemaId: string;
41
+ /** Tables linked to the target table by foreign keys. Capped by the caller. */
42
+ neighbors?: V2Table[];
43
+ };
44
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/enrichment/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAExD;;;GAGG;AACH,MAAM,MAAM,gBAAgB,GACxB;IAAE,IAAI,EAAE,mBAAmB,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GAC7C;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GACzC;IAAE,IAAI,EAAE,sBAAsB,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GAChD;IAAE,IAAI,EAAE,oBAAoB,CAAC;IAAC,KAAK,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAChE;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,KAAK,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAC5D;IAAE,IAAI,EAAE,uBAAuB,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC;AAEtD;;;GAGG;AACH,MAAM,MAAM,mBAAmB,GAAG;IAChC,8DAA8D;IAC9D,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,+EAA+E;IAC/E,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC;CACvB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/enrichment/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,21 @@
1
+ export declare class AskDbError extends Error {
2
+ readonly cause?: unknown | undefined;
3
+ constructor(message: string, cause?: unknown | undefined);
4
+ }
5
+ export declare class SchemaParseError extends AskDbError {
6
+ constructor(message: string, cause?: unknown);
7
+ }
8
+ /** Machine-readable ids for CLI and logs (Phase 2 guardrails). */
9
+ export type SqlValidationRuleCode = "SQL_EMPTY" | "SQL_MULTI_STATEMENT" | "SQL_COMMENT" | "SQL_NOT_SELECT_OR_WITH" | "SQL_FORBIDDEN_KEYWORD";
10
+ export declare class SqlValidationError extends AskDbError {
11
+ readonly rule: SqlValidationRuleCode;
12
+ /** Extra human context (why the rule exists, remediation). */
13
+ readonly hint?: string | undefined;
14
+ constructor(message: string, rule: SqlValidationRuleCode,
15
+ /** Extra human context (why the rule exists, remediation). */
16
+ hint?: string | undefined);
17
+ }
18
+ export declare class SqlGenerationError extends AskDbError {
19
+ constructor(message: string, cause?: unknown);
20
+ }
21
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,UAAW,SAAQ,KAAK;aAGjB,KAAK,CAAC,EAAE,OAAO;gBAD/B,OAAO,EAAE,MAAM,EACC,KAAK,CAAC,EAAE,OAAO,YAAA;CAKlC;AAED,qBAAa,gBAAiB,SAAQ,UAAU;gBAClC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;CAI7C;AAED,kEAAkE;AAClE,MAAM,MAAM,qBAAqB,GAC7B,WAAW,GACX,qBAAqB,GACrB,aAAa,GACb,wBAAwB,GACxB,uBAAuB,CAAC;AAE5B,qBAAa,kBAAmB,SAAQ,UAAU;aAG9B,IAAI,EAAE,qBAAqB;IAC3C,8DAA8D;aAC9C,IAAI,CAAC,EAAE,MAAM;gBAH7B,OAAO,EAAE,MAAM,EACC,IAAI,EAAE,qBAAqB;IAC3C,8DAA8D;IAC9C,IAAI,CAAC,EAAE,MAAM,YAAA;CAKhC;AAED,qBAAa,kBAAmB,SAAQ,UAAU;gBACpC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;CAI7C"}
package/dist/errors.js ADDED
@@ -0,0 +1,33 @@
1
+ export class AskDbError extends Error {
2
+ cause;
3
+ constructor(message, cause) {
4
+ super(message);
5
+ this.cause = cause;
6
+ this.name = "AskDbError";
7
+ }
8
+ }
9
+ export class SchemaParseError extends AskDbError {
10
+ constructor(message, cause) {
11
+ super(message, cause);
12
+ this.name = "SchemaParseError";
13
+ }
14
+ }
15
+ export class SqlValidationError extends AskDbError {
16
+ rule;
17
+ hint;
18
+ constructor(message, rule,
19
+ /** Extra human context (why the rule exists, remediation). */
20
+ hint) {
21
+ super(message);
22
+ this.rule = rule;
23
+ this.hint = hint;
24
+ this.name = "SqlValidationError";
25
+ }
26
+ }
27
+ export class SqlGenerationError extends AskDbError {
28
+ constructor(message, cause) {
29
+ super(message, cause);
30
+ this.name = "SqlGenerationError";
31
+ }
32
+ }
33
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,UAAW,SAAQ,KAAK;IAGjB;IAFlB,YACE,OAAe,EACC,KAAe;QAE/B,KAAK,CAAC,OAAO,CAAC,CAAC;QAFC,UAAK,GAAL,KAAK,CAAU;QAG/B,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;IAC3B,CAAC;CACF;AAED,MAAM,OAAO,gBAAiB,SAAQ,UAAU;IAC9C,YAAY,OAAe,EAAE,KAAe;QAC1C,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACtB,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IACjC,CAAC;CACF;AAUD,MAAM,OAAO,kBAAmB,SAAQ,UAAU;IAG9B;IAEA;IAJlB,YACE,OAAe,EACC,IAA2B;IAC3C,8DAA8D;IAC9C,IAAa;QAE7B,KAAK,CAAC,OAAO,CAAC,CAAC;QAJC,SAAI,GAAJ,IAAI,CAAuB;QAE3B,SAAI,GAAJ,IAAI,CAAS;QAG7B,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AAED,MAAM,OAAO,kBAAmB,SAAQ,UAAU;IAChD,YAAY,OAAe,EAAE,KAAe;QAC1C,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACtB,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF"}
@@ -0,0 +1,20 @@
1
+ export * from "./errors.js";
2
+ export { ask, type AskPipelineOptions, type AskPipelineResult, type AskDialect, type AskDialectGenerateOptions, type AskDialectGenerateResult, type AskGenerateDeps, } from "./ask.js";
3
+ export { parseAskDbModeV1, formatAskDbModesV1, DEFAULT_ASKDB_MODE, ASKDB_MODES_V1, type AskDbModeV1, } from "./modes/types.js";
4
+ export { AskDbLogEvent } from "./logging/log-events.js";
5
+ export type { AskDbLogger } from "./logging/askdb-logger.js";
6
+ export { ASKDB_LOG_REQUIRED_EVENTS, ASKDB_LOG_REQUIRED_FIELDS, } from "./logging/log-contract.js";
7
+ export { createAskDbLogger, type AskDbLogLevel, type CreateAskDbLoggerOptions, } from "./logging/create-askdb-logger.js";
8
+ export { formatSupportedAskDbLogLevels, isSupportedAskDbLogLevel, SUPPORTED_ASKDB_LOG_LEVELS, } from "./logging/pino-supported-levels.js";
9
+ export { loadNormalizedSchemaFromJson, parseAskDbSchemaJson } from "./schema/parse.js";
10
+ export type { AskDbSchemaFile, NormalizedSchema, AnyNormalizedSchema, } from "./schema/types.js";
11
+ export { loadSchema, loadSchemaFromJson, parseTableMarkdown, parseConceptsMarkdown, writeTableMarkdown, writeConceptsMarkdown, formatSchemaV2ForNlToSql, v2SchemaJsonSchema, v2TableSchema, v2ColumnSchema, v2TableFrontmatterSchema, v2ColumnFrontmatterSchema, v2ConceptsFrontmatterSchema, v2ConceptSchema, RECOGNIZED_H2_SECTIONS, } from "./schema/v2/index.js";
12
+ export type { V2SchemaJson, V2Table, V2Column, V2TableFrontmatter, V2ColumnFrontmatter, V2ConceptsFrontmatter, V2Concept, ParsedTableMarkdown, ParsedConceptsMarkdown, RecognizedH2Section, NormalizedSchemaV2, NormalizedV2Table, NormalizedV2Column, SchemaV2Warning, } from "./schema/v2/index.js";
13
+ export { ENRICHMENT_SYSTEM_PROMPT, buildEnrichmentUserPrompt, parseCandidates, suggestEnrichment, } from "./enrichment/index.js";
14
+ export type { EnrichmentCandidate, EnrichmentContext, EnrichmentTarget, SuggestEnrichmentDeps, } from "./enrichment/index.js";
15
+ export { formatSchemaForNlToSql, formatSchemaForPrompt, normalizeAskDbSchema, type FormatNlToSqlOptions, type NlToSqlSchemaFormatStats, } from "./schema/normalize.js";
16
+ export { extractSqlFromModelText } from "./sql/extract-sql.js";
17
+ export { resolveAskDbAiConfig, resolveAskDbEmbeddingConfig, createAskDbLanguageModel, createAskDbLanguageModelFromEnv, createAskDbEmbeddingModel, createAskDbEmbeddingModelFromEnv, askDbAiKeyMissingMessage, type AskDbAiProvider, type AskDbAiConfig, type AskDbAiEnv, type ResolveAskDbAiConfigOptions, type ResolveAskDbEmbeddingConfigOptions, type CreateAskDbEmbeddingModelOptions, } from "./ai/provider.js";
18
+ export type { Retriever, RetrievedChunk, RetrievedChunkType, RetrievedResult, } from "./retrieval/types.js";
19
+ export { synthesizeRetrievedDdl } from "./retrieval/synthesize-ddl.js";
20
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,OAAO,EACL,GAAG,EACH,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,UAAU,EACf,KAAK,yBAAyB,EAC9B,KAAK,wBAAwB,EAC7B,KAAK,eAAe,GACrB,MAAM,UAAU,CAAC;AAClB,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,EAClB,cAAc,EACd,KAAK,WAAW,GACjB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,YAAY,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EACL,yBAAyB,EACzB,yBAAyB,GAC1B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,iBAAiB,EACjB,KAAK,aAAa,EAClB,KAAK,wBAAwB,GAC9B,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EACL,6BAA6B,EAC7B,wBAAwB,EACxB,0BAA0B,GAC3B,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,4BAA4B,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACvF,YAAY,EACV,eAAe,EACf,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,UAAU,EACV,kBAAkB,EAClB,kBAAkB,EAClB,qBAAqB,EACrB,kBAAkB,EAClB,qBAAqB,EACrB,wBAAwB,EACxB,kBAAkB,EAClB,aAAa,EACb,cAAc,EACd,wBAAwB,EACxB,yBAAyB,EACzB,2BAA2B,EAC3B,eAAe,EACf,sBAAsB,GACvB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EACV,YAAY,EACZ,OAAO,EACP,QAAQ,EACR,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,EACrB,SAAS,EACT,mBAAmB,EACnB,sBAAsB,EACtB,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,GAChB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,wBAAwB,EACxB,yBAAyB,EACzB,eAAe,EACf,iBAAiB,GAClB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EACV,mBAAmB,EACnB,iBAAiB,EACjB,gBAAgB,EAChB,qBAAqB,GACtB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,sBAAsB,EACtB,qBAAqB,EACrB,oBAAoB,EACpB,KAAK,oBAAoB,EACzB,KAAK,wBAAwB,GAC9B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EACL,oBAAoB,EACpB,2BAA2B,EAC3B,wBAAwB,EACxB,+BAA+B,EAC/B,yBAAyB,EACzB,gCAAgC,EAChC,wBAAwB,EACxB,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,KAAK,2BAA2B,EAChC,KAAK,kCAAkC,EACvC,KAAK,gCAAgC,GACtC,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,SAAS,EACT,cAAc,EACd,kBAAkB,EAClB,eAAe,GAChB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,15 @@
1
+ export * from "./errors.js";
2
+ export { ask, } from "./ask.js";
3
+ export { parseAskDbModeV1, formatAskDbModesV1, DEFAULT_ASKDB_MODE, ASKDB_MODES_V1, } from "./modes/types.js";
4
+ export { AskDbLogEvent } from "./logging/log-events.js";
5
+ export { ASKDB_LOG_REQUIRED_EVENTS, ASKDB_LOG_REQUIRED_FIELDS, } from "./logging/log-contract.js";
6
+ export { createAskDbLogger, } from "./logging/create-askdb-logger.js";
7
+ export { formatSupportedAskDbLogLevels, isSupportedAskDbLogLevel, SUPPORTED_ASKDB_LOG_LEVELS, } from "./logging/pino-supported-levels.js";
8
+ export { loadNormalizedSchemaFromJson, parseAskDbSchemaJson } from "./schema/parse.js";
9
+ export { loadSchema, loadSchemaFromJson, parseTableMarkdown, parseConceptsMarkdown, writeTableMarkdown, writeConceptsMarkdown, formatSchemaV2ForNlToSql, v2SchemaJsonSchema, v2TableSchema, v2ColumnSchema, v2TableFrontmatterSchema, v2ColumnFrontmatterSchema, v2ConceptsFrontmatterSchema, v2ConceptSchema, RECOGNIZED_H2_SECTIONS, } from "./schema/v2/index.js";
10
+ export { ENRICHMENT_SYSTEM_PROMPT, buildEnrichmentUserPrompt, parseCandidates, suggestEnrichment, } from "./enrichment/index.js";
11
+ export { formatSchemaForNlToSql, formatSchemaForPrompt, normalizeAskDbSchema, } from "./schema/normalize.js";
12
+ export { extractSqlFromModelText } from "./sql/extract-sql.js";
13
+ export { resolveAskDbAiConfig, resolveAskDbEmbeddingConfig, createAskDbLanguageModel, createAskDbLanguageModelFromEnv, createAskDbEmbeddingModel, createAskDbEmbeddingModelFromEnv, askDbAiKeyMissingMessage, } from "./ai/provider.js";
14
+ export { synthesizeRetrievedDdl } from "./retrieval/synthesize-ddl.js";
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,OAAO,EACL,GAAG,GAOJ,MAAM,UAAU,CAAC;AAClB,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,EAClB,cAAc,GAEf,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAExD,OAAO,EACL,yBAAyB,EACzB,yBAAyB,GAC1B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,iBAAiB,GAGlB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EACL,6BAA6B,EAC7B,wBAAwB,EACxB,0BAA0B,GAC3B,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,4BAA4B,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAMvF,OAAO,EACL,UAAU,EACV,kBAAkB,EAClB,kBAAkB,EAClB,qBAAqB,EACrB,kBAAkB,EAClB,qBAAqB,EACrB,wBAAwB,EACxB,kBAAkB,EAClB,aAAa,EACb,cAAc,EACd,wBAAwB,EACxB,yBAAyB,EACzB,2BAA2B,EAC3B,eAAe,EACf,sBAAsB,GACvB,MAAM,sBAAsB,CAAC;AAiB9B,OAAO,EACL,wBAAwB,EACxB,yBAAyB,EACzB,eAAe,EACf,iBAAiB,GAClB,MAAM,uBAAuB,CAAC;AAO/B,OAAO,EACL,sBAAsB,EACtB,qBAAqB,EACrB,oBAAoB,GAGrB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EACL,oBAAoB,EACpB,2BAA2B,EAC3B,wBAAwB,EACxB,+BAA+B,EAC/B,yBAAyB,EACzB,gCAAgC,EAChC,wBAAwB,GAOzB,MAAM,kBAAkB,CAAC;AAO1B,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Structured logging port for the pipeline (`@askdb/core`).
3
+ * Keeps NL→SQL and execution free of vendor logger types (DIP).
4
+ *
5
+ * Implementations may wrap Pino, OpenTelemetry, or no-ops — consumers pass an instance from the host (CLI, HTTP, MCP).
6
+ */
7
+ export type AskDbLogger = {
8
+ info(context: Record<string, unknown>, message: string): void;
9
+ error(context: Record<string, unknown>, message: string): void;
10
+ /** Optional — used for prompt redaction notices without leaking sensitive identifiers. */
11
+ debug?(context: Record<string, unknown>, message: string): void;
12
+ };
13
+ //# sourceMappingURL=askdb-logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"askdb-logger.d.ts","sourceRoot":"","sources":["../../src/logging/askdb-logger.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9D,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/D,0FAA0F;IAC1F,KAAK,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACjE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=askdb-logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"askdb-logger.js","sourceRoot":"","sources":["../../src/logging/askdb-logger.ts"],"names":[],"mappings":""}
@@ -0,0 +1,25 @@
1
+ import pino from "pino";
2
+ import type { AskDbLogger } from "./askdb-logger.js";
3
+ /** Pino levels plus `silent` (no output). */
4
+ export type AskDbLogLevel = pino.LevelWithSilent;
5
+ export type CreateAskDbLoggerOptions = {
6
+ /** Included on every log line via `pino.child`. */
7
+ correlationId: string;
8
+ /** Default `silent` — no structured logs unless overridden. */
9
+ level?: AskDbLogLevel;
10
+ /**
11
+ * Write JSON logs to stderr (recommended for CLI so stdout stays clean for results).
12
+ * Default true when logging is enabled and no sinks are disabled explicitly.
13
+ */
14
+ stderr?: boolean;
15
+ /** Append JSON logs to this file path (parent directories are created). */
16
+ logFile?: string;
17
+ /** Duplicate logs to stdout (e.g. piping aggregated output). */
18
+ logStdout?: boolean;
19
+ };
20
+ /**
21
+ * Builds an {@link AskDbLogger} backed by Pino (multi-destination per ADR 0001).
22
+ * Uses a single `destination` when only one sink is configured (simpler flushing); otherwise `pino.multistream`.
23
+ */
24
+ export declare function createAskDbLogger(options: CreateAskDbLoggerOptions): AskDbLogger;
25
+ //# sourceMappingURL=create-askdb-logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-askdb-logger.d.ts","sourceRoot":"","sources":["../../src/logging/create-askdb-logger.ts"],"names":[],"mappings":"AAEA,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,6CAA6C;AAC7C,MAAM,MAAM,aAAa,GAAG,IAAI,CAAC,eAAe,CAAC;AAEjD,MAAM,MAAM,wBAAwB,GAAG;IACrC,mDAAmD;IACnD,aAAa,EAAE,MAAM,CAAC;IACtB,+DAA+D;IAC/D,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,2EAA2E;IAC3E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gEAAgE;IAChE,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AAgBF;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,wBAAwB,GAAG,WAAW,CA8BhF"}