@askdb/rag 0.2.0-beta.1

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 (73) hide show
  1. package/LICENSE +201 -0
  2. package/NOTICE +10 -0
  3. package/README.md +76 -0
  4. package/bin/askdb-rag.js +2 -0
  5. package/dist/bin.d.ts +3 -0
  6. package/dist/bin.d.ts.map +1 -0
  7. package/dist/bin.js +7 -0
  8. package/dist/bin.js.map +1 -0
  9. package/dist/chunker/chunker.d.ts +36 -0
  10. package/dist/chunker/chunker.d.ts.map +1 -0
  11. package/dist/chunker/chunker.js +426 -0
  12. package/dist/chunker/chunker.js.map +1 -0
  13. package/dist/chunker/index.d.ts +10 -0
  14. package/dist/chunker/index.d.ts.map +1 -0
  15. package/dist/chunker/index.js +14 -0
  16. package/dist/chunker/index.js.map +1 -0
  17. package/dist/chunker/options.d.ts +24 -0
  18. package/dist/chunker/options.d.ts.map +1 -0
  19. package/dist/chunker/options.js +3 -0
  20. package/dist/chunker/options.js.map +1 -0
  21. package/dist/chunker/sources.d.ts +30 -0
  22. package/dist/chunker/sources.d.ts.map +1 -0
  23. package/dist/chunker/sources.js +68 -0
  24. package/dist/chunker/sources.js.map +1 -0
  25. package/dist/cli.d.ts +11 -0
  26. package/dist/cli.d.ts.map +1 -0
  27. package/dist/cli.js +332 -0
  28. package/dist/cli.js.map +1 -0
  29. package/dist/embedders/ai-sdk.d.ts +22 -0
  30. package/dist/embedders/ai-sdk.d.ts.map +1 -0
  31. package/dist/embedders/ai-sdk.js +36 -0
  32. package/dist/embedders/ai-sdk.js.map +1 -0
  33. package/dist/embedders/openai.d.ts +21 -0
  34. package/dist/embedders/openai.d.ts.map +1 -0
  35. package/dist/embedders/openai.js +24 -0
  36. package/dist/embedders/openai.js.map +1 -0
  37. package/dist/index.d.ts +6 -0
  38. package/dist/index.d.ts.map +1 -0
  39. package/dist/index.js +13 -0
  40. package/dist/index.js.map +1 -0
  41. package/dist/indexer/hash.d.ts +3 -0
  42. package/dist/indexer/hash.d.ts.map +1 -0
  43. package/dist/indexer/hash.js +6 -0
  44. package/dist/indexer/hash.js.map +1 -0
  45. package/dist/indexer/index.d.ts +72 -0
  46. package/dist/indexer/index.d.ts.map +1 -0
  47. package/dist/indexer/index.js +196 -0
  48. package/dist/indexer/index.js.map +1 -0
  49. package/dist/indexer/lock-file.d.ts +23 -0
  50. package/dist/indexer/lock-file.d.ts.map +1 -0
  51. package/dist/indexer/lock-file.js +33 -0
  52. package/dist/indexer/lock-file.js.map +1 -0
  53. package/dist/log-events.d.ts +23 -0
  54. package/dist/log-events.d.ts.map +1 -0
  55. package/dist/log-events.js +22 -0
  56. package/dist/log-events.js.map +1 -0
  57. package/dist/stores/file.d.ts +42 -0
  58. package/dist/stores/file.d.ts.map +1 -0
  59. package/dist/stores/file.js +127 -0
  60. package/dist/stores/file.js.map +1 -0
  61. package/dist/stores/memory.d.ts +34 -0
  62. package/dist/stores/memory.d.ts.map +1 -0
  63. package/dist/stores/memory.js +118 -0
  64. package/dist/stores/memory.js.map +1 -0
  65. package/dist/stores/pgvector.d.ts +41 -0
  66. package/dist/stores/pgvector.d.ts.map +1 -0
  67. package/dist/stores/pgvector.js +176 -0
  68. package/dist/stores/pgvector.js.map +1 -0
  69. package/dist/types.d.ts +89 -0
  70. package/dist/types.d.ts.map +1 -0
  71. package/dist/types.js +9 -0
  72. package/dist/types.js.map +1 -0
  73. package/package.json +100 -0
package/dist/cli.js ADDED
@@ -0,0 +1,332 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { readFileSync } from "node:fs";
3
+ import { join, resolve } from "node:path";
4
+ import { createAskDbLogger, formatSupportedAskDbLogLevels, isSupportedAskDbLogLevel, } from "@askdb/core";
5
+ import { getAskDbRuntimeConfig } from "@askdb/config";
6
+ import { buildSchemaIndex } from "./indexer/index.js";
7
+ import { loadChunkerSourcesFromDir } from "./chunker/sources.js";
8
+ import { createOpenAiEmbedder as createAiSdkOpenAiEmbedder } from "./embedders/openai.js";
9
+ import { createMemoryStore } from "./stores/memory.js";
10
+ import { createFileStore } from "./stores/file.js";
11
+ import { createPgvectorStore, } from "./stores/pgvector.js";
12
+ export async function runRagCli(argv) {
13
+ try {
14
+ if (argv.includes("--version") || argv.includes("-V")) {
15
+ process.stdout.write(`${readPackageVersion()}\n`);
16
+ return 0;
17
+ }
18
+ if (argv.length === 0 || argv.includes("--help") || argv.includes("-h")) {
19
+ printHelp();
20
+ return 0;
21
+ }
22
+ const cmd = argv[0];
23
+ if (cmd !== "index" && cmd !== "query") {
24
+ throw new Error(`Unknown command: ${cmd} (expected 'index' or 'query')`);
25
+ }
26
+ const opts = parseOptions(argv.slice(1));
27
+ opts.command = cmd;
28
+ if (!opts.schemaDir) {
29
+ throw new Error("Missing positional <schema-dir>.");
30
+ }
31
+ const runtimeConfig = getAskDbRuntimeConfig();
32
+ const logger = buildLogger(opts, runtimeConfig);
33
+ if (cmd === "index")
34
+ return await runIndex(opts, logger, runtimeConfig);
35
+ return await runQuery(opts, logger, runtimeConfig);
36
+ }
37
+ catch (e) {
38
+ process.stderr.write(`${e instanceof Error ? e.message : String(e)}\n`);
39
+ return 1;
40
+ }
41
+ }
42
+ async function runIndex(opts, logger, runtimeConfig) {
43
+ const sources = loadChunkerSourcesFromDir(opts.schemaDir);
44
+ const embedder = buildEmbedder(opts, runtimeConfig);
45
+ const dimensions = embedderDimensions(opts);
46
+ const store = await buildStore(opts, dimensions);
47
+ const result = await buildSchemaIndex({
48
+ schema: sources,
49
+ embedder,
50
+ store,
51
+ embedderId: embedderId(opts),
52
+ lockFilePath: join(resolve(opts.schemaDir), "schema.lock.json"),
53
+ correlationId: opts.correlationId,
54
+ logger,
55
+ });
56
+ process.stdout.write(`${JSON.stringify({
57
+ schemaId: sources.schema.schemaId,
58
+ chunksTotal: result.stats.chunksTotal,
59
+ chunksIndexed: result.stats.chunksIndexed,
60
+ chunksReused: result.stats.chunksReused,
61
+ sensitiveExcluded: result.stats.sensitiveExcluded,
62
+ sensitiveIncluded: result.stats.sensitiveIncluded,
63
+ }, null, 2)}\n`);
64
+ await closeStore(store);
65
+ return 0;
66
+ }
67
+ async function runQuery(opts, logger, runtimeConfig) {
68
+ if (!opts.question) {
69
+ throw new Error("Missing --question for query command.");
70
+ }
71
+ const sources = loadChunkerSourcesFromDir(opts.schemaDir);
72
+ const embedder = buildEmbedder(opts, runtimeConfig);
73
+ const dimensions = embedderDimensions(opts);
74
+ const store = await buildStore(opts, dimensions);
75
+ const filter = { schemaId: sources.schema.schemaId };
76
+ if (opts.filterTypes && opts.filterTypes.length > 0) {
77
+ filter.types = opts.filterTypes;
78
+ }
79
+ const [vector] = await embedder([opts.question]);
80
+ const k = opts.k ?? 8;
81
+ const results = await store.query(vector, k, filter);
82
+ logger.info({
83
+ event: "askdb.rag.cli.query",
84
+ questionChars: opts.question.length,
85
+ k,
86
+ resultCount: results.length,
87
+ }, "rag query completed");
88
+ process.stdout.write(`${JSON.stringify({
89
+ question: opts.question,
90
+ k,
91
+ results: results.map((r) => ({
92
+ id: r.id,
93
+ score: Number(r.score.toFixed(6)),
94
+ type: r.payload.type,
95
+ schemaId: r.payload.schemaId,
96
+ refs: r.payload.refs,
97
+ textPreview: r.payload.text.slice(0, 200),
98
+ })),
99
+ }, null, 2)}\n`);
100
+ await closeStore(store);
101
+ return 0;
102
+ }
103
+ function buildEmbedder(opts, runtimeConfig) {
104
+ const choice = opts.embedder ?? "mock";
105
+ if (choice === "mock")
106
+ return createMockEmbedder();
107
+ if (choice === "openai")
108
+ return createOpenAiEmbedder(opts, runtimeConfig);
109
+ throw new Error(`Unknown embedder: ${choice}`);
110
+ }
111
+ function embedderId(opts) {
112
+ const choice = opts.embedder ?? "mock";
113
+ if (choice === "openai") {
114
+ const base = `openai:${opts.embedderModel ?? "text-embedding-3-small"}`;
115
+ return opts.dimensions ? `${base}:${opts.dimensions}` : base;
116
+ }
117
+ return `mock:lexical-${embedderDimensions(opts)}`;
118
+ }
119
+ function embedderDimensions(opts) {
120
+ if (opts.dimensions)
121
+ return opts.dimensions;
122
+ const choice = opts.embedder ?? "mock";
123
+ if (choice === "openai") {
124
+ const model = opts.embedderModel ?? "text-embedding-3-small";
125
+ if (model === "text-embedding-3-small")
126
+ return 1536;
127
+ if (model === "text-embedding-3-large")
128
+ return 3072;
129
+ if (model === "text-embedding-ada-002")
130
+ return 1536;
131
+ throw new Error(`Pass --dimensions for unknown embedder model: ${model}`);
132
+ }
133
+ return 64;
134
+ }
135
+ /**
136
+ * Deterministic mock embedder used for tests, CI, and quick smoke-checks.
137
+ *
138
+ * Produces a stable lexical bag-of-words vector by hashing normalized tokens;
139
+ * same text always yields the same vector. Not a real embedder, but useful for
140
+ * local smoke tests because shared terms like "revenue" can rank related chunks.
141
+ */
142
+ export function createMockEmbedder(dim = 64) {
143
+ return async (texts) => {
144
+ return texts.map((text) => {
145
+ const v = new Array(dim).fill(0);
146
+ const tokens = text.toLowerCase().match(/[a-z0-9_]+/g) ?? [];
147
+ for (const token of tokens) {
148
+ v[stableTokenHash(token) % dim] += 1;
149
+ }
150
+ const norm = Math.sqrt(v.reduce((s, x) => s + x * x, 0)) || 1;
151
+ return v.map((x) => x / norm);
152
+ });
153
+ };
154
+ }
155
+ function stableTokenHash(token) {
156
+ let h = 2166136261;
157
+ for (let i = 0; i < token.length; i++) {
158
+ h ^= token.charCodeAt(i);
159
+ h = Math.imul(h, 16777619);
160
+ }
161
+ return h >>> 0;
162
+ }
163
+ function createOpenAiEmbedder(opts, runtimeConfig) {
164
+ const apiKey = opts.apiKey ?? runtimeConfig.rag.embedder.apiKey;
165
+ if (!apiKey) {
166
+ throw new Error("createOpenAiEmbedder: set OPENAI_API_KEY or pass --api-key. The OpenAI embedder uses the AI SDK optional peers (`ai` and `@ai-sdk/openai`).");
167
+ }
168
+ return createAiSdkOpenAiEmbedder({
169
+ apiKey,
170
+ model: opts.embedderModel ?? "text-embedding-3-small",
171
+ baseURL: runtimeConfig.rag.embedder.baseURL,
172
+ dimensions: opts.dimensions,
173
+ });
174
+ }
175
+ async function buildStore(opts, dimensions) {
176
+ const choice = opts.store ?? "file";
177
+ if (choice === "memory")
178
+ return createMemoryStore();
179
+ if (choice === "file") {
180
+ const path = opts.filePath
181
+ ? opts.filePath
182
+ : join(resolve(opts.schemaDir), "schema");
183
+ return createFileStore({ basePath: path });
184
+ }
185
+ if (choice === "pgvector") {
186
+ if (!opts.pgUrl) {
187
+ throw new Error("pgvector store requires --pg-url (or set PGURL/DATABASE_URL via your shell).");
188
+ }
189
+ const pgOptions = {
190
+ connectionString: opts.pgUrl,
191
+ table: opts.pgTable,
192
+ dimensions,
193
+ };
194
+ return createPgvectorStore(pgOptions);
195
+ }
196
+ throw new Error(`Unknown store: ${choice}`);
197
+ }
198
+ async function closeStore(store) {
199
+ if (typeof store.flush === "function")
200
+ store.flush();
201
+ if (typeof store.close === "function")
202
+ await store.close();
203
+ }
204
+ function buildLogger(opts, runtimeConfig) {
205
+ const level = resolveLogLevel(opts, runtimeConfig);
206
+ return createAskDbLogger({
207
+ correlationId: opts.correlationId ?? runtimeConfig.logging.correlationId ?? randomUUID(),
208
+ level,
209
+ logFile: opts.logFile ?? runtimeConfig.logging.logFile,
210
+ logStdout: opts.logStdout ?? runtimeConfig.logging.logStdout,
211
+ });
212
+ }
213
+ function resolveLogLevel(opts, runtimeConfig) {
214
+ if (opts.logLevel !== undefined && opts.logLevel !== "") {
215
+ const lvl = opts.logLevel.toLowerCase();
216
+ if (!isSupportedAskDbLogLevel(lvl)) {
217
+ throw new Error(`Invalid --log-level: ${opts.logLevel} (expected one of ${formatSupportedAskDbLogLevels()})`);
218
+ }
219
+ return lvl;
220
+ }
221
+ const envLevel = runtimeConfig.logging.level?.toLowerCase();
222
+ if (envLevel && isSupportedAskDbLogLevel(envLevel))
223
+ return envLevel;
224
+ if (opts.verbose || opts.logFile || opts.logStdout)
225
+ return "info";
226
+ return "silent";
227
+ }
228
+ function parseOptions(argv) {
229
+ const opts = {};
230
+ let positional = 0;
231
+ for (let i = 0; i < argv.length; i++) {
232
+ const arg = argv[i];
233
+ if (!arg.startsWith("-")) {
234
+ if (positional === 0)
235
+ opts.schemaDir = arg;
236
+ else
237
+ throw new Error(`Unexpected positional argument: ${arg}`);
238
+ positional++;
239
+ continue;
240
+ }
241
+ switch (arg) {
242
+ case "--store":
243
+ opts.store = readValue(argv, ++i, arg);
244
+ break;
245
+ case "--embedder":
246
+ opts.embedder = readValue(argv, ++i, arg);
247
+ break;
248
+ case "--embedder-model":
249
+ opts.embedderModel = readValue(argv, ++i, arg);
250
+ break;
251
+ case "--api-key":
252
+ opts.apiKey = readValue(argv, ++i, arg);
253
+ break;
254
+ case "--question":
255
+ opts.question = readValue(argv, ++i, arg);
256
+ break;
257
+ case "-k":
258
+ case "--k":
259
+ opts.k = Number(readValue(argv, ++i, arg));
260
+ break;
261
+ case "--pg-url":
262
+ opts.pgUrl = readValue(argv, ++i, arg);
263
+ break;
264
+ case "--pg-table":
265
+ opts.pgTable = readValue(argv, ++i, arg);
266
+ break;
267
+ case "--dimensions":
268
+ opts.dimensions = Number(readValue(argv, ++i, arg));
269
+ break;
270
+ case "--types":
271
+ opts.filterTypes = readValue(argv, ++i, arg).split(",").map((s) => s.trim()).filter(Boolean);
272
+ break;
273
+ case "--file-path":
274
+ opts.filePath = readValue(argv, ++i, arg);
275
+ break;
276
+ case "-v":
277
+ case "--verbose":
278
+ opts.verbose = true;
279
+ break;
280
+ case "--log-level":
281
+ opts.logLevel = readValue(argv, ++i, arg);
282
+ break;
283
+ case "--log-file":
284
+ opts.logFile = readValue(argv, ++i, arg);
285
+ break;
286
+ case "--log-stdout":
287
+ opts.logStdout = true;
288
+ break;
289
+ case "--correlation-id":
290
+ opts.correlationId = readValue(argv, ++i, arg);
291
+ break;
292
+ default:
293
+ throw new Error(`Unknown option: ${arg}`);
294
+ }
295
+ }
296
+ return opts;
297
+ }
298
+ function readValue(argv, index, flag) {
299
+ const value = argv[index];
300
+ if (!value || (value.startsWith("--") && value !== flag)) {
301
+ throw new Error(`${flag} requires a value.`);
302
+ }
303
+ return value;
304
+ }
305
+ function readPackageVersion() {
306
+ const pkgPath = new URL("../package.json", import.meta.url);
307
+ const parsed = JSON.parse(readFileSync(pkgPath, "utf8"));
308
+ return typeof parsed.version === "string" ? parsed.version : "0.0.0";
309
+ }
310
+ function printHelp() {
311
+ process.stdout.write([
312
+ "askdb-rag - Chunk + index + query a Schema v2 directory.",
313
+ "",
314
+ "Usage:",
315
+ " askdb-rag index <schema-dir> [--store memory|file|pgvector] [--embedder mock|openai] [--dimensions <n>]",
316
+ " askdb-rag query <schema-dir> --question \"...\" [-k 8] [--types table,column,cql]",
317
+ "",
318
+ "Stores:",
319
+ " memory in-memory cosine. Ephemeral. Default for `query`-only smoke checks against `index --store memory`.",
320
+ " file persisted as <schema-dir>/schema.embeddings.{bin,json} (default).",
321
+ " pgvector --pg-url <conn> [--pg-table askdb_rag_chunks] [--dimensions <n>]",
322
+ "",
323
+ "Embedders:",
324
+ " mock deterministic lexical hash. Default. CI-safe.",
325
+ " openai AI SDK OpenAI embeddings; OPENAI_API_KEY (or --api-key); --embedder-model text-embedding-3-small (default).",
326
+ "",
327
+ "Logging matches `askdb`:",
328
+ " --log-level <level> --log-file <path> --log-stdout --correlation-id <id> -v/--verbose",
329
+ "",
330
+ ].join("\n"));
331
+ }
332
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { EmbeddingModel } from "ai";
2
+ import type { Embedder } from "../types.js";
3
+ export type CreateAiSdkEmbedderOptions = {
4
+ model: EmbeddingModel<string>;
5
+ /** Maximum retries per AI SDK embedding call. Defaults to AI SDK's behavior. */
6
+ maxRetries?: number;
7
+ /** Called with provider-reported token usage for each embedding request when available. */
8
+ onUsage?: (usage: AiSdkEmbedderUsage) => void;
9
+ };
10
+ export type AiSdkEmbedderUsage = {
11
+ tokens?: number;
12
+ promptTokens?: number;
13
+ totalTokens?: number;
14
+ };
15
+ /**
16
+ * Generic AI SDK embedder adapter.
17
+ *
18
+ * Consumers can pass any AI SDK text embedding model here; provider selection,
19
+ * keys, base URLs, and gateway-specific behavior stay with the model factory.
20
+ */
21
+ export declare function createAiSdkEmbedder(options: CreateAiSdkEmbedderOptions): Embedder;
22
+ //# sourceMappingURL=ai-sdk.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-sdk.d.ts","sourceRoot":"","sources":["../../src/embedders/ai-sdk.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,IAAI,CAAC;AACzC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,MAAM,0BAA0B,GAAG;IACvC,KAAK,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC;IAC9B,gFAAgF;IAChF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2FAA2F;IAC3F,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,CAAC;CAC/C,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,0BAA0B,GAClC,QAAQ,CAYV"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Generic AI SDK embedder adapter.
3
+ *
4
+ * Consumers can pass any AI SDK text embedding model here; provider selection,
5
+ * keys, base URLs, and gateway-specific behavior stay with the model factory.
6
+ */
7
+ export function createAiSdkEmbedder(options) {
8
+ return async (texts) => {
9
+ const { embedMany } = await import("ai");
10
+ const result = await embedMany({
11
+ model: options.model,
12
+ values: texts,
13
+ maxRetries: options.maxRetries,
14
+ });
15
+ const usage = normalizeUsage(result.usage);
16
+ if (usage)
17
+ options.onUsage?.(usage);
18
+ return result.embeddings;
19
+ };
20
+ }
21
+ function normalizeUsage(value) {
22
+ if (!value || typeof value !== "object")
23
+ return undefined;
24
+ const record = value;
25
+ const tokens = readNumber(record.tokens);
26
+ const promptTokens = readNumber(record.promptTokens);
27
+ const totalTokens = readNumber(record.totalTokens);
28
+ if (tokens === undefined && promptTokens === undefined && totalTokens === undefined) {
29
+ return undefined;
30
+ }
31
+ return { tokens, promptTokens, totalTokens };
32
+ }
33
+ function readNumber(value) {
34
+ return typeof value === "number" && Number.isFinite(value) ? value : undefined;
35
+ }
36
+ //# sourceMappingURL=ai-sdk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-sdk.js","sourceRoot":"","sources":["../../src/embedders/ai-sdk.ts"],"names":[],"mappings":"AAiBA;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CACjC,OAAmC;IAEnC,OAAO,KAAK,EAAE,KAAe,EAAE,EAAE;QAC/B,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC;YAC7B,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,MAAM,EAAE,KAAK;YACb,UAAU,EAAE,OAAO,CAAC,UAAU;SAC/B,CAAC,CAAC;QACH,MAAM,KAAK,GAAG,cAAc,CAAE,MAA8B,CAAC,KAAK,CAAC,CAAC;QACpE,IAAI,KAAK;YAAE,OAAO,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;QACpC,OAAO,MAAM,CAAC,UAAU,CAAC;IAC3B,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,KAAc;IACpC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAC1D,MAAM,MAAM,GAAG,KAAgC,CAAC;IAChD,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACzC,MAAM,YAAY,GAAG,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IACrD,MAAM,WAAW,GAAG,UAAU,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IACnD,IAAI,MAAM,KAAK,SAAS,IAAI,YAAY,KAAK,SAAS,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;QACpF,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC;AAC/C,CAAC;AAED,SAAS,UAAU,CAAC,KAAc;IAChC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACjF,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { Embedder } from "../types.js";
2
+ export type CreateOpenAiEmbedderOptions = {
3
+ /** Defaults to `text-embedding-3-small`. */
4
+ model?: string;
5
+ /** Optional override; otherwise the OpenAI provider reads `OPENAI_API_KEY`. */
6
+ apiKey?: string;
7
+ /** Optional OpenAI-compatible base URL, e.g. an AI gateway ending in `/v1`. */
8
+ baseURL?: string;
9
+ /** Optional dimensionality override for text-embedding-3 models. */
10
+ dimensions?: number;
11
+ /** Optional end-user id forwarded to OpenAI embedding settings. */
12
+ user?: string;
13
+ };
14
+ /**
15
+ * Reference AI SDK embedder for OpenAI embeddings.
16
+ *
17
+ * `ai` and `@ai-sdk/openai` are optional peers of `@askdb/rag`; this helper
18
+ * lazy-loads them so chunking and non-OpenAI stores remain zero-provider.
19
+ */
20
+ export declare function createOpenAiEmbedder(options?: CreateOpenAiEmbedderOptions): Embedder;
21
+ //# sourceMappingURL=openai.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/embedders/openai.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAG5C,MAAM,MAAM,2BAA2B,GAAG;IACxC,4CAA4C;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+EAA+E;IAC/E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,+EAA+E;IAC/E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oEAAoE;IACpE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mEAAmE;IACnE,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,GAAE,2BAAgC,GACxC,QAAQ,CAeV"}
@@ -0,0 +1,24 @@
1
+ import { createAiSdkEmbedder } from "./ai-sdk.js";
2
+ /**
3
+ * Reference AI SDK embedder for OpenAI embeddings.
4
+ *
5
+ * `ai` and `@ai-sdk/openai` are optional peers of `@askdb/rag`; this helper
6
+ * lazy-loads them so chunking and non-OpenAI stores remain zero-provider.
7
+ */
8
+ export function createOpenAiEmbedder(options = {}) {
9
+ return async (texts) => {
10
+ const { createOpenAI } = await import("@ai-sdk/openai");
11
+ const provider = createOpenAI({
12
+ ...(options.apiKey ? { apiKey: options.apiKey } : {}),
13
+ ...(options.baseURL ? { baseURL: options.baseURL } : {}),
14
+ });
15
+ const embedder = createAiSdkEmbedder({
16
+ model: provider.embedding(options.model ?? "text-embedding-3-small", {
17
+ dimensions: options.dimensions,
18
+ user: options.user,
19
+ }),
20
+ });
21
+ return embedder(texts);
22
+ };
23
+ }
24
+ //# sourceMappingURL=openai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/embedders/openai.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAelD;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAClC,UAAuC,EAAE;IAEzC,OAAO,KAAK,EAAE,KAAe,EAAE,EAAE;QAC/B,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;QACxD,MAAM,QAAQ,GAAG,YAAY,CAAC;YAC5B,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACrD,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACzD,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,mBAAmB,CAAC;YACnC,KAAK,EAAE,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,IAAI,wBAAwB,EAAE;gBACnE,UAAU,EAAE,OAAO,CAAC,UAAU;gBAC9B,IAAI,EAAE,OAAO,CAAC,IAAI;aACnB,CAAC;SACH,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ export type { Chunk, ChunkPayload, ChunkType, Filter, QueryResult, UpsertRecord, Embedder, VectorStore, Retriever, } from "./types.js";
2
+ export { chunkSchema, chunkSchemaDir, chunkSchemaBundle, loadChunkerSourcesFromDir, loadChunkerSourcesFromBundleJson, DEFAULT_CHUNK_MAX_CHARS, type ChunkOptions, type ChunkResult, type ChunkStats, type ChunkerSources, } from "./chunker/index.js";
3
+ export { buildSchemaIndex, createRetriever, chunkContentHash, readLockFile, writeLockFile, type BuildSchemaIndexOptions, type BuildSchemaIndexResult, type IndexProgressEvent, type SchemaLockFile, } from "./indexer/index.js";
4
+ export { synthesizeRetrievedDdl } from "@askdb/core";
5
+ export { AskDbRagLogEvent, type AskDbRagLogEventName } from "./log-events.js";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAMA,YAAY,EACV,KAAK,EACL,YAAY,EACZ,SAAS,EACT,MAAM,EACN,WAAW,EACX,YAAY,EACZ,QAAQ,EACR,WAAW,EACX,SAAS,GACV,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,WAAW,EACX,cAAc,EACd,iBAAiB,EACjB,yBAAyB,EACzB,gCAAgC,EAChC,uBAAuB,EACvB,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,cAAc,GACpB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,YAAY,EACZ,aAAa,EACb,KAAK,uBAAuB,EAC5B,KAAK,sBAAsB,EAC3B,KAAK,kBAAkB,EACvB,KAAK,cAAc,GACpB,MAAM,oBAAoB,CAAC;AAK5B,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAErD,OAAO,EAAE,gBAAgB,EAAE,KAAK,oBAAoB,EAAE,MAAM,iBAAiB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,13 @@
1
+ // Public API surface for `@askdb/rag`.
2
+ //
3
+ // Adapters live behind `./stores/<name>` sub-exports so consumers only
4
+ // pay for what they import. The core (`.`) export ships chunker, indexer,
5
+ // retriever wiring, and the BYO interfaces.
6
+ export { chunkSchema, chunkSchemaDir, chunkSchemaBundle, loadChunkerSourcesFromDir, loadChunkerSourcesFromBundleJson, DEFAULT_CHUNK_MAX_CHARS, } from "./chunker/index.js";
7
+ export { buildSchemaIndex, createRetriever, chunkContentHash, readLockFile, writeLockFile, } from "./indexer/index.js";
8
+ // Re-export the synthesis helper from core so consumers can import it from
9
+ // `@askdb/rag` without reaching across packages. The function lives in core
10
+ // because `ask()` calls it internally when a retriever is supplied.
11
+ export { synthesizeRetrievedDdl } from "@askdb/core";
12
+ export { AskDbRagLogEvent } from "./log-events.js";
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,EAAE;AACF,uEAAuE;AACvE,0EAA0E;AAC1E,4CAA4C;AAc5C,OAAO,EACL,WAAW,EACX,cAAc,EACd,iBAAiB,EACjB,yBAAyB,EACzB,gCAAgC,EAChC,uBAAuB,GAKxB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,YAAY,EACZ,aAAa,GAKd,MAAM,oBAAoB,CAAC;AAE5B,2EAA2E;AAC3E,4EAA4E;AAC5E,oEAAoE;AACpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAErD,OAAO,EAAE,gBAAgB,EAA6B,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** Content hash used for skip-reembed bookkeeping. SHA-256, hex. */
2
+ export declare function chunkContentHash(text: string): string;
3
+ //# sourceMappingURL=hash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash.d.ts","sourceRoot":"","sources":["../../src/indexer/hash.ts"],"names":[],"mappings":"AAEA,oEAAoE;AACpE,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAErD"}
@@ -0,0 +1,6 @@
1
+ import { createHash } from "node:crypto";
2
+ /** Content hash used for skip-reembed bookkeeping. SHA-256, hex. */
3
+ export function chunkContentHash(text) {
4
+ return createHash("sha256").update(text, "utf8").digest("hex");
5
+ }
6
+ //# sourceMappingURL=hash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash.js","sourceRoot":"","sources":["../../src/indexer/hash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,oEAAoE;AACpE,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACjE,CAAC"}
@@ -0,0 +1,72 @@
1
+ import type { AskDbLogger, NormalizedSchemaV2 } from "@askdb/core";
2
+ import type { ChunkOptions } from "../chunker/options.js";
3
+ import type { ChunkerSources } from "../chunker/sources.js";
4
+ import type { Chunk, Embedder, Retriever, VectorStore } from "../types.js";
5
+ /** Optional progress event surfaced via `onProgress`. */
6
+ export type IndexProgressEvent = {
7
+ kind: "started";
8
+ totalChunks: number;
9
+ toEmbed: number;
10
+ reused: number;
11
+ } | {
12
+ kind: "embedded";
13
+ embedded: number;
14
+ total: number;
15
+ } | {
16
+ kind: "completed";
17
+ embedded: number;
18
+ reused: number;
19
+ };
20
+ export type BuildSchemaIndexOptions = {
21
+ /**
22
+ * Spec-compatible input. Pass `loadChunkerSourcesFromDir(...)` for full
23
+ * markdown-section chunking, or a `loadSchema(...)` result when raw table
24
+ * markdown is not available.
25
+ */
26
+ schema?: ChunkerSources | NormalizedSchemaV2;
27
+ /** Backwards-compatible alias for `schema` when callers already loaded raw sources. */
28
+ sources?: ChunkerSources;
29
+ embedder: Embedder;
30
+ store: VectorStore;
31
+ /**
32
+ * Embedder id (e.g. `"openai:text-embedding-3-small"`). Stored in the lock
33
+ * file; if it changes between runs, all chunks re-embed (model swap is a
34
+ * full invalidation).
35
+ */
36
+ embedderId?: string;
37
+ /** Path to `schema.lock.json`. When set, used for skip-reembed bookkeeping. */
38
+ lockFilePath?: string;
39
+ chunkOptions?: ChunkOptions;
40
+ /** Batch size for embedder calls. Default 64 — most providers cap around 100. */
41
+ batchSize?: number;
42
+ logger?: AskDbLogger;
43
+ correlationId?: string;
44
+ onProgress?: (e: IndexProgressEvent) => void;
45
+ };
46
+ export type BuildSchemaIndexResult = {
47
+ retriever: Retriever;
48
+ stats: {
49
+ chunksTotal: number;
50
+ chunksIndexed: number;
51
+ chunksReused: number;
52
+ sensitiveExcluded: number;
53
+ sensitiveIncluded: number;
54
+ };
55
+ /** Final chunk list (sorted by id). */
56
+ chunks: Chunk[];
57
+ };
58
+ export declare function buildSchemaIndex(options: BuildSchemaIndexOptions): Promise<BuildSchemaIndexResult>;
59
+ /**
60
+ * Build a `Retriever` bound to an existing store + embedder, **without**
61
+ * indexing. Useful when the store is already populated by another process
62
+ * (CI, an external pgvector instance, etc.).
63
+ */
64
+ export declare function createRetriever(args: {
65
+ embedder: Embedder;
66
+ store: VectorStore;
67
+ logger?: AskDbLogger;
68
+ correlationId?: string;
69
+ }): Retriever;
70
+ export { readLockFile, writeLockFile, type SchemaLockFile, } from "./lock-file.js";
71
+ export { chunkContentHash } from "./hash.js";
72
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/indexer/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAQ3E,yDAAyD;AACzD,MAAM,MAAM,kBAAkB,GAC1B;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACzE;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACrD;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAE5D,MAAM,MAAM,uBAAuB,GAAG;IACpC;;;;OAIG;IACH,MAAM,CAAC,EAAE,cAAc,GAAG,kBAAkB,CAAC;IAC7C,uFAAuF;IACvF,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,QAAQ,EAAE,QAAQ,CAAC;IACnB,KAAK,EAAE,WAAW,CAAC;IACnB;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,+EAA+E;IAC/E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,iFAAiF;IACjF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,CAAC,CAAC,EAAE,kBAAkB,KAAK,IAAI,CAAC;CAC9C,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,SAAS,EAAE,SAAS,CAAC;IACrB,KAAK,EAAE;QACL,WAAW,EAAE,MAAM,CAAC;QACpB,aAAa,EAAE,MAAM,CAAC;QACtB,YAAY,EAAE,MAAM,CAAC;QACrB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,iBAAiB,EAAE,MAAM,CAAC;KAC3B,CAAC;IACF,uCAAuC;IACvC,MAAM,EAAE,KAAK,EAAE,CAAC;CACjB,CAAC;AAIF,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,uBAAuB,GAC/B,OAAO,CAAC,sBAAsB,CAAC,CAiNjC;AAWD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE;IACpC,QAAQ,EAAE,QAAQ,CAAC;IACnB,KAAK,EAAE,WAAW,CAAC;IACnB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,GAAG,SAAS,CAgBZ;AAED,OAAO,EACL,YAAY,EACZ,aAAa,EACb,KAAK,cAAc,GACpB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC"}