askdb 1.0.0-beta.43 → 1.0.0-beta.45

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/dist/rag.js ADDED
@@ -0,0 +1,593 @@
1
+ import { join, resolve } from "node:path";
2
+ import { createAiRegistry } from "@askdb/ai";
3
+ import { getAskDbRuntimeConfig } from "@askdb/config";
4
+ import { aiSdkEmbedderId, buildSchemaIndex, checkIndexMatches, createAiSdkEmbedder, createFileStore, createMemoryStore, createPgvectorStore, detectEmbeddingDimensions, loadChunkerSourcesFromDir, PgvectorDimensionMismatchError, } from "@askdb/rag";
5
+ import { labelled, showable } from "./error-values.js";
6
+ import { createCliLogger } from "./logger.js";
7
+ import { readCliVersion } from "./version.js";
8
+ // Every built-in provider is registered and loads its @ai-sdk/* package only when first used,
9
+ // so ai.embedding alone selects the provider.
10
+ const ai = createAiRegistry();
11
+ const CLI_EMBEDDERS = ["mock", "ai"];
12
+ /** Aliases of `ai` that mirror the deprecated `rag.embedder` values; removed at 1.0. */
13
+ const DEPRECATED_EMBEDDERS = {
14
+ openai: 'askdb rag: --embedder "openai" is deprecated; use --embedder ai with ai.embedding: { provider: "openai", model }.',
15
+ "ai-sdk": 'askdb rag: --embedder "ai-sdk" is deprecated; use --embedder ai.',
16
+ };
17
+ function isCliEmbedder(value) {
18
+ return CLI_EMBEDDERS.includes(value) || Object.hasOwn(DEPRECATED_EMBEDDERS, value);
19
+ }
20
+ const CLI_STORES = ["memory", "file", "pgvector"];
21
+ function isCliStore(value) {
22
+ return CLI_STORES.includes(value);
23
+ }
24
+ /** The chunk types `--types` accepts. A record, so a new `ChunkType` doesn't compile until it's listed here. */
25
+ const CHUNK_TYPES = {
26
+ table: true,
27
+ column: true,
28
+ cql: true,
29
+ question: true,
30
+ concept: true,
31
+ relationship: true,
32
+ "tenant-policy": true,
33
+ };
34
+ function isChunkType(value) {
35
+ return Object.hasOwn(CHUNK_TYPES, value);
36
+ }
37
+ /** The mock embedder is AskDB's own, so its width is the only one the CLI knows. */
38
+ const DEFAULT_MOCK_DIMENSIONS = 64;
39
+ const DEFAULT_PGVECTOR_TABLE = "askdb_rag_chunks";
40
+ export async function runRagCli(argv) {
41
+ try {
42
+ if (argv.includes("--version") || argv.includes("-V")) {
43
+ process.stdout.write(`${readCliVersion()}\n`);
44
+ return 0;
45
+ }
46
+ if (argv.length === 0 || argv.includes("--help") || argv.includes("-h")) {
47
+ printHelp();
48
+ return 0;
49
+ }
50
+ const cmd = argv[0];
51
+ if (cmd !== "index" && cmd !== "query" && cmd !== "setup-store") {
52
+ throw new Error(`${labelled("Unknown command", cmd)} (expected 'index', 'query', or 'setup-store')`);
53
+ }
54
+ const opts = parseOptions(argv.slice(1));
55
+ const runtimeConfig = getAskDbRuntimeConfig();
56
+ if (cmd === "setup-store")
57
+ return await runSetupStore(opts, runtimeConfig);
58
+ const logger = createCliLogger(opts, runtimeConfig);
59
+ if (cmd === "index")
60
+ return await runIndex(opts, logger, runtimeConfig);
61
+ return await runQuery(opts, logger, runtimeConfig);
62
+ }
63
+ catch (e) {
64
+ process.stderr.write(`${e instanceof Error ? e.message : String(e)}\n`);
65
+ return 1;
66
+ }
67
+ }
68
+ async function runIndex(opts, logger, runtimeConfig) {
69
+ const schemaDir = resolveSchemaDir(opts, runtimeConfig);
70
+ const sources = loadChunkerSourcesFromDir(schemaDir);
71
+ const storeConfig = resolveStoreConfig(opts, runtimeConfig, schemaDir);
72
+ const embedderConfig = resolveEmbedderConfig(opts, runtimeConfig);
73
+ const embedder = await createEmbedder(embedderConfig);
74
+ // A new pgvector table needs its width up front: the requested one, else the model's own. The
75
+ // memory and file stores learn it from the first vector.
76
+ const dimensions = storeConfig.kind === "pgvector"
77
+ ? (embedderConfig.dimensions ?? (await detectEmbeddingDimensions(embedder)))
78
+ : undefined;
79
+ // Provision (idempotent) and verify the table's vector dimensions up front
80
+ // so a mismatch fails with a clear message before any chunk is embedded.
81
+ const store = await openStore(storeConfig, {
82
+ dimensions,
83
+ provision: (width) => describeWidth(opts, embedderConfig, width),
84
+ });
85
+ const result = await buildSchemaIndex({
86
+ schema: sources,
87
+ embedder,
88
+ store,
89
+ embedderId: embedderConfig.id,
90
+ // The indexer leaves the lock alone for an ephemeral (memory) store.
91
+ lockFilePath: lockFilePathFor(schemaDir),
92
+ force: opts.force,
93
+ // The logger carries the correlation id; passing it here too would repeat the key on every event.
94
+ logger,
95
+ });
96
+ process.stdout.write(`${JSON.stringify({
97
+ schemaId: sources.schema.schemaId,
98
+ chunksTotal: result.stats.chunksTotal,
99
+ chunksIndexed: result.stats.chunksIndexed,
100
+ chunksReused: result.stats.chunksReused,
101
+ sensitiveExcluded: result.stats.sensitiveExcluded,
102
+ sensitiveIncluded: result.stats.sensitiveIncluded,
103
+ }, null, 2)}\n`);
104
+ await closeStore(store);
105
+ return 0;
106
+ }
107
+ async function runQuery(opts, logger, runtimeConfig) {
108
+ if (!opts.question) {
109
+ throw new Error("Missing --question for query command.");
110
+ }
111
+ const schemaDir = resolveSchemaDir(opts, runtimeConfig);
112
+ const storeConfig = resolveStoreConfig(opts, runtimeConfig, schemaDir);
113
+ if (storeConfig.kind === "memory") {
114
+ throw new Error("query has nothing to search in the memory store: the memory store lives only inside one process, " +
115
+ "so a separate `index` run cannot populate it. Use --store file or --store pgvector.");
116
+ }
117
+ const sources = loadChunkerSourcesFromDir(schemaDir);
118
+ const embedderConfig = resolveEmbedderConfig(opts, runtimeConfig);
119
+ assertQueryMatchesIndex(schemaDir, sources.schema.schemaId, embedderConfig);
120
+ const embedder = await createEmbedder(embedderConfig);
121
+ // Never detect here: without a known width, the pgvector store reads the existing table as it is.
122
+ const store = await openStore(storeConfig, { dimensions: embedderConfig.dimensions });
123
+ const filter = { schemaId: sources.schema.schemaId };
124
+ if (opts.filterTypes && opts.filterTypes.length > 0) {
125
+ filter.types = opts.filterTypes;
126
+ }
127
+ const [vector] = await embedder([opts.question]);
128
+ const k = opts.k ?? 8;
129
+ const results = await store.query(vector, k, filter);
130
+ logger.info({
131
+ event: "askdb.rag.cli.query",
132
+ questionChars: opts.question.length,
133
+ k,
134
+ resultCount: results.length,
135
+ }, "rag query completed");
136
+ process.stdout.write(`${JSON.stringify({
137
+ question: opts.question,
138
+ k,
139
+ results: results.map((r) => ({
140
+ id: r.id,
141
+ score: Number(r.score.toFixed(6)),
142
+ type: r.payload.type,
143
+ schemaId: r.payload.schemaId,
144
+ refs: r.payload.refs,
145
+ textPreview: r.payload.text.slice(0, 200),
146
+ })),
147
+ }, null, 2)}\n`);
148
+ await closeStore(store);
149
+ return 0;
150
+ }
151
+ /** The positional `<schema-dir>`, else `introspection.outputDir`, the same fallback as `askdb ask --schema`. */
152
+ function resolveSchemaDir(opts, runtimeConfig) {
153
+ return resolve(opts.schemaDir ?? runtimeConfig.introspection.outputDir);
154
+ }
155
+ function lockFilePathFor(schemaDir) {
156
+ return join(schemaDir, "schema.lock.json");
157
+ }
158
+ /**
159
+ * Refuse to query with a different embedder (or dimensions) than the index was
160
+ * built with — the similarity scores would be meaningless.
161
+ */
162
+ function assertQueryMatchesIndex(schemaDir, schemaId, embedderConfig) {
163
+ const match = checkIndexMatches({
164
+ lockFilePath: lockFilePathFor(schemaDir),
165
+ schemaId,
166
+ embedderId: embedderConfig.id,
167
+ dimensions: embedderConfig.dimensions,
168
+ });
169
+ if (match.ok)
170
+ return;
171
+ const fix = match.reason === "lock-outdated"
172
+ ? "Re-run `askdb rag index` before querying."
173
+ : "Pass the same --embedder/--embedder-model/--dimensions used for `index`, or re-run `index`.";
174
+ throw new Error(`${match.message} ${fix}`);
175
+ }
176
+ async function runSetupStore(opts, runtimeConfig) {
177
+ // There's no embedder to ask, so the width has no default; fail before anything connects.
178
+ const dimensions = opts.dimensions;
179
+ if (dimensions === undefined) {
180
+ throw new Error("setup-store requires --dimensions <n>: the vector width of your embedding model " +
181
+ "(the same value as ai.embedding.dimensions).");
182
+ }
183
+ assertSetupStoreFlags(opts);
184
+ const config = resolvePgvectorConfig(opts, readConfiguredStore(runtimeConfig));
185
+ const store = await openStore(config, { dimensions, provision: (width) => `--dimensions asks for ${width}` });
186
+ await closeStore(store);
187
+ process.stdout.write(`pgvector schema ready: table "${config.table ?? DEFAULT_PGVECTOR_TABLE}" (dimensions=${dimensions})\n`);
188
+ return 0;
189
+ }
190
+ /**
191
+ * `rag.embedder`, normalized: the runtime resolves `ai.embedding` exactly when `rag.embedder` is
192
+ * `"ai"` or one of its deprecated aliases (`"openai"`, `"ai-sdk"`), and leaves it undefined for
193
+ * `"mock"`. The runtime view exposes no normalized `rag.embedder` itself.
194
+ */
195
+ function configuredEmbedder(runtimeConfig) {
196
+ return runtimeConfig.ai.embedding ? "ai" : "mock";
197
+ }
198
+ /**
199
+ * `--embedder`, else `rag.embedder`. The `ai` embedder takes the same path and id as Studio's, so
200
+ * either accepts an index the other built.
201
+ */
202
+ function resolveEmbedderConfig(opts, runtimeConfig) {
203
+ const embedding = runtimeConfig.ai.embedding;
204
+ const choice = opts.embedder ?? configuredEmbedder(runtimeConfig);
205
+ if (choice === "mock") {
206
+ // Ignoring it would index with the lexical hash while the user believes the model embedded.
207
+ if (opts.embedderModel !== undefined) {
208
+ throw new Error(`--embedder-model applies to the ai embedder, but this run uses the mock embedder ` +
209
+ `(${opts.embedder ? "from --embedder" : configSource(runtimeConfig, "rag.embedder")}). Drop --embedder-model, ` +
210
+ 'or embed with ai.embedding (rag.embedder: "ai" in askdb.config.*).');
211
+ }
212
+ const dimensions = opts.dimensions ?? DEFAULT_MOCK_DIMENSIONS;
213
+ return { kind: "mock", id: `mock:lexical-${dimensions}`, dimensions };
214
+ }
215
+ if (choice !== "ai")
216
+ process.stderr.write(`${DEPRECATED_EMBEDDERS[choice]}\n`);
217
+ if (!embedding) {
218
+ throw new Error(`--embedder ${choice} needs ai.embedding in askdb.config.*: set rag.embedder: "ai" and ai.embedding.model.`);
219
+ }
220
+ if (choice === "openai" && embedding.provider !== "openai") {
221
+ throw new Error(`--embedder openai embeds with OpenAI, but ai.embedding.provider is "${embedding.provider}"; use --embedder ai.`);
222
+ }
223
+ // The registry reads ASKDB_AI_EMBEDDING_MODEL first, so --embedder-model overrides ai.embedding.model.
224
+ const env = opts.embedderModel
225
+ ? { ...embedding.env, ASKDB_AI_EMBEDDING_MODEL: opts.embedderModel }
226
+ : embedding.env;
227
+ const aiConfig = ai.resolveEmbeddingConfig(env);
228
+ if (!aiConfig) {
229
+ throw new Error(`askdb rag: embeddings need an API key on the ai.embedding connection ` +
230
+ `("${embedding.connection}" in ai.providerConfig.${embedding.provider}). ` +
231
+ "Set it in askdb.config.*, or pass --embedder mock.");
232
+ }
233
+ const model = opts.embedderModel ?? embedding.model;
234
+ const dimensions = opts.dimensions ?? embedding.dimensions;
235
+ return {
236
+ kind: "ai",
237
+ // Studio's id. The adapter's canonical provider name (`foundry` resolves to `azure`) keeps ids stable.
238
+ id: aiSdkEmbedderId({ provider: aiConfig.provider, model, dimensions }),
239
+ dimensions,
240
+ model,
241
+ aiConfig,
242
+ };
243
+ }
244
+ async function createEmbedder(config) {
245
+ if (config.kind === "mock")
246
+ return createMockEmbedder(config.dimensions);
247
+ const model = await ai.createEmbeddingModel(config.aiConfig, { dimensions: config.dimensions });
248
+ return createAiSdkEmbedder({ model });
249
+ }
250
+ /** Where the width a pgvector table refused came from, for the mismatch message. */
251
+ function describeWidth(opts, embedderConfig, width) {
252
+ if (opts.dimensions !== undefined)
253
+ return `--dimensions asks for ${width}`;
254
+ if (embedderConfig.kind === "mock")
255
+ return `the mock embedder writes ${width}`;
256
+ if (embedderConfig.dimensions !== undefined)
257
+ return `ai.embedding.dimensions asks for ${width}`;
258
+ return `embedding model ${embedderConfig.model} returns ${width}`;
259
+ }
260
+ /**
261
+ * Deterministic mock embedder used for tests, CI, and quick smoke-checks.
262
+ *
263
+ * Produces a stable lexical bag-of-words vector by hashing normalized tokens;
264
+ * same text always yields the same vector. Not a real embedder, but useful for
265
+ * local smoke tests because shared terms like "revenue" can rank related chunks.
266
+ */
267
+ function createMockEmbedder(dim = DEFAULT_MOCK_DIMENSIONS) {
268
+ return async (texts) => {
269
+ return texts.map((text) => {
270
+ const v = new Array(dim).fill(0);
271
+ const tokens = text.toLowerCase().match(/[a-z0-9_]+/g) ?? [];
272
+ for (const token of tokens) {
273
+ v[stableTokenHash(token) % dim] += 1;
274
+ }
275
+ const norm = Math.sqrt(v.reduce((s, x) => s + x * x, 0)) || 1;
276
+ return v.map((x) => x / norm);
277
+ });
278
+ };
279
+ }
280
+ function stableTokenHash(token) {
281
+ let h = 2166136261;
282
+ for (let i = 0; i < token.length; i++) {
283
+ h ^= token.charCodeAt(i);
284
+ h = Math.imul(h, 16777619);
285
+ }
286
+ return h >>> 0;
287
+ }
288
+ /**
289
+ * Every store setting the CLI reads from askdb.config.*, in one place: the store, the file base
290
+ * path, and the pgvector URL, table and index strategy. The pgvector settings come from the
291
+ * structured config, so they also serve `--store pgvector` and `setup-store` when another store
292
+ * is configured.
293
+ */
294
+ function readConfiguredStore(runtimeConfig) {
295
+ const { store, storeConfig } = runtimeConfig.rag;
296
+ return {
297
+ kind: store,
298
+ kindSource: configSource(runtimeConfig, "rag.store"),
299
+ fileBasePath: trimmed(storeConfig.file?.basePath),
300
+ pgUrl: trimmed(storeConfig.pgvector?.databaseUrl),
301
+ pgTable: trimmed(storeConfig.pgvector?.table),
302
+ pgIndexStrategy: trimmed(storeConfig.pgvector?.indexStrategy),
303
+ };
304
+ }
305
+ /** Flags first, then askdb.config.*, then the built-in default. */
306
+ function resolveStoreConfig(opts, runtimeConfig, schemaDir) {
307
+ const configured = readConfiguredStore(runtimeConfig);
308
+ const kind = opts.store ?? configured.kind;
309
+ assertStoreFlagsApply(opts, kind, opts.store ? "from --store" : configured.kindSource);
310
+ if (kind === "memory")
311
+ return { kind };
312
+ if (kind === "file") {
313
+ const basePath = opts.filePath ?? (configured.fileBasePath ? resolve(configured.fileBasePath) : join(schemaDir, "schema"));
314
+ return { kind, basePath };
315
+ }
316
+ return resolvePgvectorConfig(opts, configured);
317
+ }
318
+ function resolvePgvectorConfig(opts, configured) {
319
+ const connectionString = opts.pgUrl ?? configured.pgUrl;
320
+ if (!connectionString) {
321
+ throw new Error("pgvector store requires --pg-url, or rag.storeConfig.pgvector.databaseUrl in askdb.config.*.");
322
+ }
323
+ return {
324
+ kind: "pgvector",
325
+ connectionString,
326
+ table: opts.pgTable ?? configured.pgTable,
327
+ indexStrategy: parseIndexStrategy(configured.pgIndexStrategy),
328
+ };
329
+ }
330
+ const STORE_FLAGS = [
331
+ ["filePath", "--file-path", "file"],
332
+ ["pgUrl", "--pg-url", "pgvector"],
333
+ ["pgTable", "--pg-table", "pgvector"],
334
+ ];
335
+ /** A flag for another store than the one this run uses would be silently ignored, so refuse it. */
336
+ function assertStoreFlagsApply(opts, kind, kindSource) {
337
+ for (const [key, flag, store] of STORE_FLAGS) {
338
+ if (opts[key] === undefined || kind === store)
339
+ continue;
340
+ throw new Error(`${flag} applies to the ${store} store, but this run uses the ${kind} store ` +
341
+ `(${kindSource}). Pass --store ${store}, or drop ${flag}.`);
342
+ }
343
+ }
344
+ /**
345
+ * Where a setting the flags didn't give came from, for error messages: the `rag` key, or the
346
+ * default when askdb.config.* has no `rag` block, which a message must not send the user to.
347
+ */
348
+ function configSource(runtimeConfig, key) {
349
+ const { rag } = runtimeConfig.structured;
350
+ return rag === undefined || rag === null ? "the default: askdb.config.* has no rag block" : `from ${key}`;
351
+ }
352
+ /** setup-store provisions only the pgvector store, whatever `rag.store` is, so another store's flag is a mistake. */
353
+ function assertSetupStoreFlags(opts) {
354
+ // Ignored, it would provision the configured database while the user meant another.
355
+ if (opts.schemaDir !== undefined) {
356
+ throw new Error("setup-store takes no [schema-dir]; pass the connection string with --pg-url and the table with --pg-table.");
357
+ }
358
+ if (opts.store !== undefined && opts.store !== "pgvector") {
359
+ throw new Error(`setup-store provisions only the pgvector store; drop --store ${opts.store}.`);
360
+ }
361
+ if (opts.filePath !== undefined) {
362
+ throw new Error("setup-store provisions only the pgvector store; drop --file-path.");
363
+ }
364
+ }
365
+ /** A record, so a new `PgvectorIndexStrategy` doesn't compile until it's listed here. */
366
+ const PGVECTOR_INDEX_STRATEGIES = { ivfflat: true, hnsw: true, none: true };
367
+ function isIndexStrategy(value) {
368
+ return Object.hasOwn(PGVECTOR_INDEX_STRATEGIES, value);
369
+ }
370
+ /**
371
+ * Validated here because config load checks it only when `rag.store` is `pgvector`, while
372
+ * setup-store and `--store pgvector` read it whatever the store is. Retire this once
373
+ * @askdb/config validates the block wherever it's present (#476).
374
+ */
375
+ function parseIndexStrategy(raw) {
376
+ const value = raw?.toLowerCase();
377
+ if (value === undefined || isIndexStrategy(value))
378
+ return value;
379
+ throw new Error(`Invalid rag.storeConfig.pgvector.indexStrategy "${raw}" (expected ${Object.keys(PGVECTOR_INDEX_STRATEGIES).join(", ")}).`);
380
+ }
381
+ function trimmed(value) {
382
+ const t = value?.trim();
383
+ return t ? t : undefined;
384
+ }
385
+ /**
386
+ * Opens the store. `dimensions` reaches only a pgvector store, and only when known. With
387
+ * `provision`, a pgvector store creates its table when it's missing and refuses an existing table
388
+ * of another width, with the fix in flags; `provision` says where the refused width came from.
389
+ */
390
+ async function openStore(config, { dimensions, provision }) {
391
+ if (config.kind === "memory")
392
+ return createMemoryStore();
393
+ if (config.kind === "file")
394
+ return createFileStore({ basePath: config.basePath });
395
+ const store = createPgvectorStore({
396
+ connectionString: config.connectionString,
397
+ table: config.table,
398
+ ...(dimensions !== undefined ? { dimensions } : {}),
399
+ ...(config.indexStrategy ? { indexStrategy: config.indexStrategy } : {}),
400
+ });
401
+ if (!provision)
402
+ return store;
403
+ try {
404
+ await store.ensureSchema();
405
+ }
406
+ catch (error) {
407
+ // The caller never receives this store, so close its pool here.
408
+ await store.close().catch(() => { });
409
+ if (!(error instanceof PgvectorDimensionMismatchError))
410
+ throw error;
411
+ throw new Error(`pgvector table "${error.table}" holds ${error.tableDimensions}-dimension vectors, but ${provision(error.dimensions)}. ` +
412
+ `Drop the table (DROP TABLE "${error.table}";) and run again, pass --pg-table <name> for a new table, ` +
413
+ `or pass --dimensions ${error.tableDimensions} if your embedding model supports that width.`);
414
+ }
415
+ return store;
416
+ }
417
+ async function closeStore(store) {
418
+ if (typeof store.flush === "function")
419
+ store.flush();
420
+ if (typeof store.close === "function")
421
+ await store.close();
422
+ }
423
+ function parseOptions(argv) {
424
+ const opts = {};
425
+ for (let i = 0; i < argv.length; i++) {
426
+ const arg = argv[i];
427
+ if (!arg.startsWith("-")) {
428
+ if (opts.schemaDir !== undefined) {
429
+ // Not repeated: a stray value can be a secret, such as a connection string without its flag.
430
+ throw new Error("Unexpected extra argument: askdb rag takes one [schema-dir]. Pass other values with their flag, such as --pg-url <conn>.");
431
+ }
432
+ // Failing on it as a path would print it, password included.
433
+ if (/^[a-z][a-z0-9+.-]*:\/\//i.test(arg)) {
434
+ throw new Error("The [schema-dir] argument looks like a connection string; pass a connection string with --pg-url.");
435
+ }
436
+ opts.schemaDir = arg;
437
+ continue;
438
+ }
439
+ // `--flag=value` works like `--flag value`. Errors repeat a value only when it's `showable`.
440
+ const eq = arg.indexOf("=");
441
+ const flag = eq === -1 ? arg : arg.slice(0, eq);
442
+ const inline = eq === -1 ? undefined : arg.slice(eq + 1);
443
+ const value = () => {
444
+ if (inline === undefined)
445
+ return readValue(argv, ++i, flag);
446
+ if (!inline)
447
+ throw new Error(`${flag} requires a value.`);
448
+ return inline;
449
+ };
450
+ const set = () => {
451
+ if (inline !== undefined)
452
+ throw new Error(`${flag} takes no value.`);
453
+ return true;
454
+ };
455
+ switch (flag) {
456
+ case "--store": {
457
+ const raw = value();
458
+ if (!isCliStore(raw)) {
459
+ throw new Error(`${labelled("Unknown store", raw)} (expected 'memory', 'file', or 'pgvector').`);
460
+ }
461
+ opts.store = raw;
462
+ break;
463
+ }
464
+ case "--embedder": {
465
+ const raw = value();
466
+ if (!isCliEmbedder(raw)) {
467
+ throw new Error(`${labelled("Unknown embedder", raw)} (expected ${CLI_EMBEDDERS.map((e) => `'${e}'`).join(" or ")}).`);
468
+ }
469
+ opts.embedder = raw;
470
+ break;
471
+ }
472
+ case "--embedder-model": {
473
+ // Trimmed as the registry trims it, so the embedder id names the model that embeds.
474
+ const model = value().trim();
475
+ if (!model)
476
+ throw new Error(`${flag} requires a value.`);
477
+ opts.embedderModel = model;
478
+ break;
479
+ }
480
+ case "--api-key":
481
+ // Secrets on argv leak through shell history and the process list.
482
+ throw new Error("--api-key was removed; set the key on a connection in ai.providerConfig in askdb.config.*.");
483
+ case "--question":
484
+ opts.question = value();
485
+ break;
486
+ case "-k":
487
+ case "--k": {
488
+ const raw = value();
489
+ const n = Number(raw);
490
+ if (!Number.isInteger(n) || n <= 0) {
491
+ throw new Error(`-k must be a positive integer${showable(raw) ? ` (got ${raw})` : ""}.`);
492
+ }
493
+ opts.k = n;
494
+ break;
495
+ }
496
+ case "--pg-url":
497
+ opts.pgUrl = value();
498
+ break;
499
+ case "--pg-table":
500
+ opts.pgTable = value();
501
+ break;
502
+ case "--dimensions": {
503
+ const raw = value();
504
+ const n = Number(raw);
505
+ if (!Number.isInteger(n) || n <= 0) {
506
+ throw new Error(`--dimensions must be a positive integer${showable(raw) ? ` (got ${raw})` : ""}.`);
507
+ }
508
+ opts.dimensions = n;
509
+ break;
510
+ }
511
+ case "--force":
512
+ opts.force = set();
513
+ break;
514
+ case "--types": {
515
+ // A misspelt type would match nothing and look like an empty index.
516
+ const types = [];
517
+ for (const type of value().split(",").map((s) => s.trim()).filter(Boolean)) {
518
+ if (!isChunkType(type)) {
519
+ throw new Error(`${labelled("Unknown --types value", type)} (expected ${Object.keys(CHUNK_TYPES).join(", ")}).`);
520
+ }
521
+ types.push(type);
522
+ }
523
+ opts.filterTypes = types;
524
+ break;
525
+ }
526
+ case "--file-path":
527
+ opts.filePath = value();
528
+ break;
529
+ case "-v":
530
+ case "--verbose":
531
+ opts.verbose = set();
532
+ break;
533
+ case "--log-level":
534
+ opts.logLevel = value();
535
+ break;
536
+ case "--log-file":
537
+ opts.logFile = value();
538
+ break;
539
+ case "--log-stdout":
540
+ opts.logStdout = set();
541
+ break;
542
+ case "--correlation-id":
543
+ opts.correlationId = value();
544
+ break;
545
+ default:
546
+ throw new Error(`Unknown option: ${flag}`);
547
+ }
548
+ }
549
+ return opts;
550
+ }
551
+ function readValue(argv, index, flag) {
552
+ const value = argv[index];
553
+ if (!value || (value.startsWith("--") && value !== flag)) {
554
+ throw new Error(`${flag} requires a value.`);
555
+ }
556
+ return value;
557
+ }
558
+ function printHelp() {
559
+ process.stdout.write([
560
+ "askdb rag - Chunk, embed, and query a schema artifact directory.",
561
+ "",
562
+ "Usage:",
563
+ " askdb rag index [schema-dir] [--store memory|file|pgvector] [--embedder mock|ai] [--embedder-model <id>] [--dimensions <n>] [--force]",
564
+ " askdb rag query [schema-dir] --question \"...\" [-k 8] [--types <list>] [--store file|pgvector] [--embedder mock|ai] [--embedder-model <id>] [--dimensions <n>]",
565
+ " askdb rag setup-store --dimensions <n> [--pg-url <conn>] [--pg-table askdb_rag_chunks]",
566
+ "",
567
+ "Flags override askdb.config.*: [schema-dir] defaults to introspection.outputDir, --store to rag.store,",
568
+ "--pg-url, --pg-table and --file-path to rag.storeConfig, and --embedder to rag.embedder.",
569
+ "",
570
+ "Commands:",
571
+ " index Chunk and embed a schema directory into the store. Only chunks the store",
572
+ " doesn't already hold (same id + content hash) are embedded; --force re-embeds everything.",
573
+ " query Run a similarity query against an indexed store. Use the same embedder/dimensions as `index`.",
574
+ ` --types takes a comma-separated list of: ${Object.keys(CHUNK_TYPES).join(", ")}.`,
575
+ " setup-store Create the pgvector extension, table, and indexes at --dimensions, the vector width of",
576
+ " your embedding model. Idempotent — safe to re-run.",
577
+ "",
578
+ "Stores:",
579
+ " memory in-memory cosine, lives only for one process. Useful for `index` dry runs (writes no schema.lock.json); `query` can't use it.",
580
+ " file persisted as <schema-dir>/schema.embeddings.{bin,json}, or <path>.embeddings.{bin,json} with --file-path <path>.",
581
+ " pgvector --pg-url <conn> [--pg-table askdb_rag_chunks]",
582
+ "",
583
+ "Embedders:",
584
+ " mock deterministic lexical hash, 64 dimensions unless --dimensions. CI-safe.",
585
+ " ai the ai.embedding model from askdb.config.* (needs rag.embedder: \"ai\"). --embedder-model",
586
+ " overrides its model; --dimensions requests a width.",
587
+ "",
588
+ "Logging matches `askdb`:",
589
+ " --log-level <level> --log-file <path> --log-stdout --correlation-id <id> -v/--verbose",
590
+ "",
591
+ ].join("\n"));
592
+ }
593
+ //# sourceMappingURL=rag.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rag.js","sourceRoot":"","sources":["../src/rag.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAiB,MAAM,WAAW,CAAC;AAE5D,OAAO,EAAE,qBAAqB,EAA2B,MAAM,eAAe,CAAC;AAC/E,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,eAAe,EACf,iBAAiB,EACjB,mBAAmB,EACnB,yBAAyB,EACzB,yBAAyB,EACzB,8BAA8B,GAO/B,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,8FAA8F;AAC9F,8CAA8C;AAC9C,MAAM,EAAE,GAAG,gBAAgB,EAAE,CAAC;AAE9B,MAAM,aAAa,GAAG,CAAC,MAAM,EAAE,IAAI,CAAU,CAAC;AAC9C,wFAAwF;AACxF,MAAM,oBAAoB,GAAG;IAC3B,MAAM,EAAE,mHAAmH;IAC3H,QAAQ,EAAE,kEAAkE;CACpE,CAAC;AAGX,SAAS,aAAa,CAAC,KAAa;IAClC,OAAQ,aAAmC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAC;AAC5G,CAAC;AAED,MAAM,UAAU,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAU,CAAC;AAG3D,SAAS,UAAU,CAAC,KAAa;IAC/B,OAAQ,UAAgC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC3D,CAAC;AAED,gHAAgH;AAChH,MAAM,WAAW,GAA4B;IAC3C,KAAK,EAAE,IAAI;IACX,MAAM,EAAE,IAAI;IACZ,GAAG,EAAE,IAAI;IACT,QAAQ,EAAE,IAAI;IACd,OAAO,EAAE,IAAI;IACb,YAAY,EAAE,IAAI;IAClB,eAAe,EAAE,IAAI;CACtB,CAAC;AAEF,SAAS,WAAW,CAAC,KAAa;IAChC,OAAO,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;AAC3C,CAAC;AAED,oFAAoF;AACpF,MAAM,uBAAuB,GAAG,EAAE,CAAC;AACnC,MAAM,sBAAsB,GAAG,kBAAkB,CAAC;AAsBlD,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAuB;IACrD,IAAI,CAAC;QACH,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACtD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,cAAc,EAAE,IAAI,CAAC,CAAC;YAC9C,OAAO,CAAC,CAAC;QACX,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACxE,SAAS,EAAE,CAAC;YACZ,OAAO,CAAC,CAAC;QACX,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;QACrB,IAAI,GAAG,KAAK,OAAO,IAAI,GAAG,KAAK,OAAO,IAAI,GAAG,KAAK,aAAa,EAAE,CAAC;YAChE,MAAM,IAAI,KAAK,CAAC,GAAG,QAAQ,CAAC,iBAAiB,EAAE,GAAG,CAAC,gDAAgD,CAAC,CAAC;QACvG,CAAC;QACD,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACzC,MAAM,aAAa,GAAG,qBAAqB,EAAE,CAAC;QAC9C,IAAI,GAAG,KAAK,aAAa;YAAE,OAAO,MAAM,aAAa,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QAC3E,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QACpD,IAAI,GAAG,KAAK,OAAO;YAAE,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC;QACxE,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC;IACrD,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACxE,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,IAAgB,EAAE,MAAmB,EAAE,aAAiC;IAC9F,MAAM,SAAS,GAAG,gBAAgB,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IACxD,MAAM,OAAO,GAAG,yBAAyB,CAAC,SAAS,CAAC,CAAC;IACrD,MAAM,WAAW,GAAG,kBAAkB,CAAC,IAAI,EAAE,aAAa,EAAE,SAAS,CAAC,CAAC;IACvE,MAAM,cAAc,GAAG,qBAAqB,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IAClE,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,cAAc,CAAC,CAAC;IACtD,8FAA8F;IAC9F,yDAAyD;IACzD,MAAM,UAAU,GACd,WAAW,CAAC,IAAI,KAAK,UAAU;QAC7B,CAAC,CAAC,CAAC,cAAc,CAAC,UAAU,IAAI,CAAC,MAAM,yBAAyB,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC5E,CAAC,CAAC,SAAS,CAAC;IAChB,2EAA2E;IAC3E,yEAAyE;IACzE,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,WAAW,EAAE;QACzC,UAAU;QACV,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,cAAc,EAAE,KAAK,CAAC;KACjE,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC;QACpC,MAAM,EAAE,OAAO;QACf,QAAQ;QACR,KAAK;QACL,UAAU,EAAE,cAAc,CAAC,EAAE;QAC7B,qEAAqE;QACrE,YAAY,EAAE,eAAe,CAAC,SAAS,CAAC;QACxC,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,kGAAkG;QAClG,MAAM;KACP,CAAC,CAAC;IAEH,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,GAAG,IAAI,CAAC,SAAS,CACf;QACE,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,QAAQ;QACjC,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,WAAW;QACrC,aAAa,EAAE,MAAM,CAAC,KAAK,CAAC,aAAa;QACzC,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,YAAY;QACvC,iBAAiB,EAAE,MAAM,CAAC,KAAK,CAAC,iBAAiB;QACjD,iBAAiB,EAAE,MAAM,CAAC,KAAK,CAAC,iBAAiB;KAClD,EACD,IAAI,EACJ,CAAC,CACF,IAAI,CACN,CAAC;IAEF,MAAM,UAAU,CAAC,KAAK,CAAC,CAAC;IACxB,OAAO,CAAC,CAAC;AACX,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,IAAgB,EAAE,MAAmB,EAAE,aAAiC;IAC9F,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC3D,CAAC;IACD,MAAM,SAAS,GAAG,gBAAgB,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IACxD,MAAM,WAAW,GAAG,kBAAkB,CAAC,IAAI,EAAE,aAAa,EAAE,SAAS,CAAC,CAAC;IACvE,IAAI,WAAW,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CACb,mGAAmG;YACjG,qFAAqF,CACxF,CAAC;IACJ,CAAC;IACD,MAAM,OAAO,GAAG,yBAAyB,CAAC,SAAS,CAAC,CAAC;IACrD,MAAM,cAAc,GAAG,qBAAqB,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IAClE,uBAAuB,CAAC,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;IAC5E,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,cAAc,CAAC,CAAC;IACtD,kGAAkG;IAClG,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,WAAW,EAAE,EAAE,UAAU,EAAE,cAAc,CAAC,UAAU,EAAE,CAAC,CAAC;IAEtF,MAAM,MAAM,GAAW,EAAE,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;IAC7D,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpD,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC;IAClC,CAAC;IAED,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,QAAQ,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IACjD,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;IACtB,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;IAErD,MAAM,CAAC,IAAI,CACT;QACE,KAAK,EAAE,qBAAqB;QAC5B,aAAa,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM;QACnC,CAAC;QACD,WAAW,EAAE,OAAO,CAAC,MAAM;KAC5B,EACD,qBAAqB,CACtB,CAAC;IAEF,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,GAAG,IAAI,CAAC,SAAS,CACf;QACE,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,CAAC;QACD,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAc,EAAE,EAAE,CAAC,CAAC;YACxC,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACjC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI;YACpB,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ;YAC5B,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI;YACpB,WAAW,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;SAC1C,CAAC,CAAC;KACJ,EACD,IAAI,EACJ,CAAC,CACF,IAAI,CACN,CAAC;IAEF,MAAM,UAAU,CAAC,KAAK,CAAC,CAAC;IACxB,OAAO,CAAC,CAAC;AACX,CAAC;AAED,gHAAgH;AAChH,SAAS,gBAAgB,CAAC,IAAgB,EAAE,aAAiC;IAC3E,OAAO,OAAO,CAAC,IAAI,CAAC,SAAS,IAAI,aAAa,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;AAC1E,CAAC;AAED,SAAS,eAAe,CAAC,SAAiB;IACxC,OAAO,IAAI,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAC;AAC7C,CAAC;AAED;;;GAGG;AACH,SAAS,uBAAuB,CAAC,SAAiB,EAAE,QAAgB,EAAE,cAA8B;IAClG,MAAM,KAAK,GAAG,iBAAiB,CAAC;QAC9B,YAAY,EAAE,eAAe,CAAC,SAAS,CAAC;QACxC,QAAQ;QACR,UAAU,EAAE,cAAc,CAAC,EAAE;QAC7B,UAAU,EAAE,cAAc,CAAC,UAAU;KACtC,CAAC,CAAC;IACH,IAAI,KAAK,CAAC,EAAE;QAAE,OAAO;IACrB,MAAM,GAAG,GACP,KAAK,CAAC,MAAM,KAAK,eAAe;QAC9B,CAAC,CAAC,2CAA2C;QAC7C,CAAC,CAAC,6FAA6F,CAAC;IACpG,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,CAAC,OAAO,IAAI,GAAG,EAAE,CAAC,CAAC;AAC7C,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,IAAgB,EAAE,aAAiC;IAC9E,0FAA0F;IAC1F,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;IACnC,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CACb,kFAAkF;YAChF,8CAA8C,CACjD,CAAC;IACJ,CAAC;IACD,qBAAqB,CAAC,IAAI,CAAC,CAAC;IAC5B,MAAM,MAAM,GAAG,qBAAqB,CAAC,IAAI,EAAE,mBAAmB,CAAC,aAAa,CAAC,CAAC,CAAC;IAC/E,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,MAAM,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,yBAAyB,KAAK,EAAE,EAAE,CAAC,CAAC;IAC9G,MAAM,UAAU,CAAC,KAAK,CAAC,CAAC;IACxB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,iCAAiC,MAAM,CAAC,KAAK,IAAI,sBAAsB,iBAAiB,UAAU,KAAK,CACxG,CAAC;IACF,OAAO,CAAC,CAAC;AACX,CAAC;AAaD;;;;GAIG;AACH,SAAS,kBAAkB,CAAC,aAAiC;IAC3D,OAAO,aAAa,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;AACpD,CAAC;AAED;;;GAGG;AACH,SAAS,qBAAqB,CAAC,IAAgB,EAAE,aAAiC;IAChF,MAAM,SAAS,GAAG,aAAa,CAAC,EAAE,CAAC,SAAS,CAAC;IAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,IAAI,kBAAkB,CAAC,aAAa,CAAC,CAAC;IAClE,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,4FAA4F;QAC5F,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;YACrC,MAAM,IAAI,KAAK,CACb,mFAAmF;gBACjF,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,YAAY,CAAC,aAAa,EAAE,cAAc,CAAC,4BAA4B;gBAC/G,oEAAoE,CACvE,CAAC;QACJ,CAAC;QACD,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,uBAAuB,CAAC;QAC9D,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,gBAAgB,UAAU,EAAE,EAAE,UAAU,EAAE,CAAC;IACxE,CAAC;IACD,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,oBAAoB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC/E,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,cAAc,MAAM,uFAAuF,CAC5G,CAAC;IACJ,CAAC;IACD,IAAI,MAAM,KAAK,QAAQ,IAAI,SAAS,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC3D,MAAM,IAAI,KAAK,CACb,uEAAuE,SAAS,CAAC,QAAQ,uBAAuB,CACjH,CAAC;IACJ,CAAC;IACD,uGAAuG;IACvG,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa;QAC5B,CAAC,CAAC,EAAE,GAAG,SAAS,CAAC,GAAG,EAAE,wBAAwB,EAAE,IAAI,CAAC,aAAa,EAAE;QACpE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC;IAClB,MAAM,QAAQ,GAAG,EAAE,CAAC,sBAAsB,CAAC,GAAG,CAAC,CAAC;IAChD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CACb,uEAAuE;YACrE,KAAK,SAAS,CAAC,UAAU,0BAA0B,SAAS,CAAC,QAAQ,KAAK;YAC1E,oDAAoD,CACvD,CAAC;IACJ,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,IAAI,SAAS,CAAC,KAAK,CAAC;IACpD,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,SAAS,CAAC,UAAU,CAAC;IAC3D,OAAO;QACL,IAAI,EAAE,IAAI;QACV,uGAAuG;QACvG,EAAE,EAAE,eAAe,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;QACvE,UAAU;QACV,KAAK;QACL,QAAQ;KACT,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,MAAsB;IAClD,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,kBAAkB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IACzE,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,oBAAoB,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;IAChG,OAAO,mBAAmB,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;AACxC,CAAC;AAED,oFAAoF;AACpF,SAAS,aAAa,CAAC,IAAgB,EAAE,cAA8B,EAAE,KAAa;IACpF,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS;QAAE,OAAO,yBAAyB,KAAK,EAAE,CAAC;IAC3E,IAAI,cAAc,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,4BAA4B,KAAK,EAAE,CAAC;IAC/E,IAAI,cAAc,CAAC,UAAU,KAAK,SAAS;QAAE,OAAO,oCAAoC,KAAK,EAAE,CAAC;IAChG,OAAO,mBAAmB,cAAc,CAAC,KAAK,YAAY,KAAK,EAAE,CAAC;AACpE,CAAC;AAED;;;;;;GAMG;AACH,SAAS,kBAAkB,CAAC,GAAG,GAAG,uBAAuB;IACvD,OAAO,KAAK,EAAE,KAAe,EAAE,EAAE;QAC/B,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YACxB,MAAM,CAAC,GAAG,IAAI,KAAK,CAAS,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACzC,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;YAC7D,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBAC3B,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC;YACvC,CAAC;YACD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC9D,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,KAAa;IACpC,IAAI,CAAC,GAAG,UAAU,CAAC;IACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QACzB,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IAC7B,CAAC;IACD,OAAO,CAAC,KAAK,CAAC,CAAC;AACjB,CAAC;AAqBD;;;;;GAKG;AACH,SAAS,mBAAmB,CAAC,aAAiC;IAC5D,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,aAAa,CAAC,GAAG,CAAC;IACjD,OAAO;QACL,IAAI,EAAE,KAAK;QACX,UAAU,EAAE,YAAY,CAAC,aAAa,EAAE,WAAW,CAAC;QACpD,YAAY,EAAE,OAAO,CAAC,WAAW,CAAC,IAAI,EAAE,QAAQ,CAAC;QACjD,KAAK,EAAE,OAAO,CAAC,WAAW,CAAC,QAAQ,EAAE,WAAW,CAAC;QACjD,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,QAAQ,EAAE,KAAK,CAAC;QAC7C,eAAe,EAAE,OAAO,CAAC,WAAW,CAAC,QAAQ,EAAE,aAAa,CAAC;KAC9D,CAAC;AACJ,CAAC;AAED,mEAAmE;AACnE,SAAS,kBAAkB,CAAC,IAAgB,EAAE,aAAiC,EAAE,SAAiB;IAChG,MAAM,UAAU,GAAG,mBAAmB,CAAC,aAAa,CAAC,CAAC;IACtD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,IAAI,UAAU,CAAC,IAAI,CAAC;IAC3C,qBAAqB,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IACvF,IAAI,IAAI,KAAK,QAAQ;QAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IACvC,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACpB,MAAM,QAAQ,GACZ,IAAI,CAAC,QAAQ,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC5G,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAC5B,CAAC;IACD,OAAO,qBAAqB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,qBAAqB,CAAC,IAAgB,EAAE,UAA2B;IAC1E,MAAM,gBAAgB,GAAG,IAAI,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,CAAC;IACxD,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,8FAA8F,CAAC,CAAC;IAClH,CAAC;IACD,OAAO;QACL,IAAI,EAAE,UAAU;QAChB,gBAAgB;QAChB,KAAK,EAAE,IAAI,CAAC,OAAO,IAAI,UAAU,CAAC,OAAO;QACzC,aAAa,EAAE,kBAAkB,CAAC,UAAU,CAAC,eAAe,CAAC;KAC9D,CAAC;AACJ,CAAC;AAED,MAAM,WAAW,GAAG;IAClB,CAAC,UAAU,EAAE,aAAa,EAAE,MAAM,CAAC;IACnC,CAAC,OAAO,EAAE,UAAU,EAAE,UAAU,CAAC;IACjC,CAAC,SAAS,EAAE,YAAY,EAAE,UAAU,CAAC;CAC7B,CAAC;AAEX,mGAAmG;AACnG,SAAS,qBAAqB,CAAC,IAAgB,EAAE,IAAkB,EAAE,UAAkB;IACrF,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,WAAW,EAAE,CAAC;QAC7C,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,SAAS,IAAI,IAAI,KAAK,KAAK;YAAE,SAAS;QACxD,MAAM,IAAI,KAAK,CACb,GAAG,IAAI,mBAAmB,KAAK,iCAAiC,IAAI,SAAS;YAC3E,IAAI,UAAU,mBAAmB,KAAK,aAAa,IAAI,GAAG,CAC7D,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,YAAY,CAAC,aAAiC,EAAE,GAAiC;IACxF,MAAM,EAAE,GAAG,EAAE,GAAG,aAAa,CAAC,UAAU,CAAC;IACzC,OAAO,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,8CAA8C,CAAC,CAAC,CAAC,QAAQ,GAAG,EAAE,CAAC;AAC5G,CAAC;AAED,qHAAqH;AACrH,SAAS,qBAAqB,CAAC,IAAgB;IAC7C,oFAAoF;IACpF,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,4GAA4G,CAAC,CAAC;IAChI,CAAC;IACD,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,IAAI,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;QAC1D,MAAM,IAAI,KAAK,CAAC,gEAAgE,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;IACjG,CAAC;IACD,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAC;IACvF,CAAC;AACH,CAAC;AAED,yFAAyF;AACzF,MAAM,yBAAyB,GAAwC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AAEjH,SAAS,eAAe,CAAC,KAAa;IACpC,OAAO,MAAM,CAAC,MAAM,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;AACzD,CAAC;AAED;;;;GAIG;AACH,SAAS,kBAAkB,CAAC,GAAuB;IACjD,MAAM,KAAK,GAAG,GAAG,EAAE,WAAW,EAAE,CAAC;IACjC,IAAI,KAAK,KAAK,SAAS,IAAI,eAAe,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAChE,MAAM,IAAI,KAAK,CACb,mDAAmD,GAAG,eAAe,MAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAC3H,CAAC;AACJ,CAAC;AAED,SAAS,OAAO,CAAC,KAAyB;IACxC,MAAM,CAAC,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC;IACxB,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC3B,CAAC;AAOD;;;;GAIG;AACH,KAAK,UAAU,SAAS,CACtB,MAAmB,EACnB,EAAE,UAAU,EAAE,SAAS,EAAkE;IAEzF,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,iBAAiB,EAAE,CAAC;IACzD,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,eAAe,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;IAClF,MAAM,KAAK,GAAG,mBAAmB,CAAC;QAChC,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;QACzC,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,GAAG,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnD,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACzE,CAAC,CAAC;IACH,IAAI,CAAC,SAAS;QAAE,OAAO,KAAK,CAAC;IAC7B,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,YAAY,EAAE,CAAC;IAC7B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,gEAAgE;QAChE,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACpC,IAAI,CAAC,CAAC,KAAK,YAAY,8BAA8B,CAAC;YAAE,MAAM,KAAK,CAAC;QACpE,MAAM,IAAI,KAAK,CACb,mBAAmB,KAAK,CAAC,KAAK,WAAW,KAAK,CAAC,eAAe,2BAA2B,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI;YACtH,+BAA+B,KAAK,CAAC,KAAK,6DAA6D;YACvG,wBAAwB,KAAK,CAAC,eAAe,+CAA+C,CAC/F,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,KAAe;IACvC,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,UAAU;QAAE,KAAK,CAAC,KAAK,EAAE,CAAC;IACrD,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,UAAU;QAAE,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC;AAC7D,CAAC;AAED,SAAS,YAAY,CAAC,IAAuB;IAC3C,MAAM,IAAI,GAAe,EAAE,CAAC;IAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;QACrB,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACzB,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;gBACjC,6FAA6F;gBAC7F,MAAM,IAAI,KAAK,CACb,0HAA0H,CAC3H,CAAC;YACJ,CAAC;YACD,6DAA6D;YAC7D,IAAI,0BAA0B,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBACzC,MAAM,IAAI,KAAK,CAAC,mGAAmG,CAAC,CAAC;YACvH,CAAC;YACD,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC;YACrB,SAAS;QACX,CAAC;QACD,6FAA6F;QAC7F,MAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC5B,MAAM,IAAI,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;QACzD,MAAM,KAAK,GAAG,GAAW,EAAE;YACzB,IAAI,MAAM,KAAK,SAAS;gBAAE,OAAO,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;YAC5D,IAAI,CAAC,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,oBAAoB,CAAC,CAAC;YAC1D,OAAO,MAAM,CAAC;QAChB,CAAC,CAAC;QACF,MAAM,GAAG,GAAG,GAAS,EAAE;YACrB,IAAI,MAAM,KAAK,SAAS;gBAAE,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,kBAAkB,CAAC,CAAC;YACrE,OAAO,IAAI,CAAC;QACd,CAAC,CAAC;QACF,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,SAAS,CAAC,CAAC,CAAC;gBACf,MAAM,GAAG,GAAG,KAAK,EAAE,CAAC;gBACpB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;oBACrB,MAAM,IAAI,KAAK,CAAC,GAAG,QAAQ,CAAC,eAAe,EAAE,GAAG,CAAC,8CAA8C,CAAC,CAAC;gBACnG,CAAC;gBACD,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC;gBACjB,MAAM;YACR,CAAC;YACD,KAAK,YAAY,CAAC,CAAC,CAAC;gBAClB,MAAM,GAAG,GAAG,KAAK,EAAE,CAAC;gBACpB,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;oBACxB,MAAM,IAAI,KAAK,CACb,GAAG,QAAQ,CAAC,kBAAkB,EAAE,GAAG,CAAC,cAAc,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CACtG,CAAC;gBACJ,CAAC;gBACD,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC;gBACpB,MAAM;YACR,CAAC;YACD,KAAK,kBAAkB,CAAC,CAAC,CAAC;gBACxB,oFAAoF;gBACpF,MAAM,KAAK,GAAG,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC;gBAC7B,IAAI,CAAC,KAAK;oBAAE,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,oBAAoB,CAAC,CAAC;gBACzD,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;gBAC3B,MAAM;YACR,CAAC;YACD,KAAK,WAAW;gBACd,mEAAmE;gBACnE,MAAM,IAAI,KAAK,CAAC,4FAA4F,CAAC,CAAC;YAChH,KAAK,YAAY;gBACf,IAAI,CAAC,QAAQ,GAAG,KAAK,EAAE,CAAC;gBACxB,MAAM;YACR,KAAK,IAAI,CAAC;YACV,KAAK,KAAK,CAAC,CAAC,CAAC;gBACX,MAAM,GAAG,GAAG,KAAK,EAAE,CAAC;gBACpB,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;gBACtB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;oBACnC,MAAM,IAAI,KAAK,CAAC,gCAAgC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;gBAC3F,CAAC;gBACD,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;gBACX,MAAM;YACR,CAAC;YACD,KAAK,UAAU;gBACb,IAAI,CAAC,KAAK,GAAG,KAAK,EAAE,CAAC;gBACrB,MAAM;YACR,KAAK,YAAY;gBACf,IAAI,CAAC,OAAO,GAAG,KAAK,EAAE,CAAC;gBACvB,MAAM;YACR,KAAK,cAAc,CAAC,CAAC,CAAC;gBACpB,MAAM,GAAG,GAAG,KAAK,EAAE,CAAC;gBACpB,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;gBACtB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;oBACnC,MAAM,IAAI,KAAK,CAAC,0CAA0C,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;gBACrG,CAAC;gBACD,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;gBACpB,MAAM;YACR,CAAC;YACD,KAAK,SAAS;gBACZ,IAAI,CAAC,KAAK,GAAG,GAAG,EAAE,CAAC;gBACnB,MAAM;YACR,KAAK,SAAS,CAAC,CAAC,CAAC;gBACf,oEAAoE;gBACpE,MAAM,KAAK,GAAgB,EAAE,CAAC;gBAC9B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;oBAC3E,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;wBACvB,MAAM,IAAI,KAAK,CAAC,GAAG,QAAQ,CAAC,uBAAuB,EAAE,IAAI,CAAC,cAAc,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACnH,CAAC;oBACD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACnB,CAAC;gBACD,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;gBACzB,MAAM;YACR,CAAC;YACD,KAAK,aAAa;gBAChB,IAAI,CAAC,QAAQ,GAAG,KAAK,EAAE,CAAC;gBACxB,MAAM;YACR,KAAK,IAAI,CAAC;YACV,KAAK,WAAW;gBACd,IAAI,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC;gBACrB,MAAM;YACR,KAAK,aAAa;gBAChB,IAAI,CAAC,QAAQ,GAAG,KAAK,EAAE,CAAC;gBACxB,MAAM;YACR,KAAK,YAAY;gBACf,IAAI,CAAC,OAAO,GAAG,KAAK,EAAE,CAAC;gBACvB,MAAM;YACR,KAAK,cAAc;gBACjB,IAAI,CAAC,SAAS,GAAG,GAAG,EAAE,CAAC;gBACvB,MAAM;YACR,KAAK,kBAAkB;gBACrB,IAAI,CAAC,aAAa,GAAG,KAAK,EAAE,CAAC;gBAC7B,MAAM;YACR;gBACE,MAAM,IAAI,KAAK,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,SAAS,CAAC,IAAuB,EAAE,KAAa,EAAE,IAAY;IACrE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1B,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,KAAK,KAAK,IAAI,CAAC,EAAE,CAAC;QACzD,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,oBAAoB,CAAC,CAAC;IAC/C,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,SAAS;IAChB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB;QACE,kEAAkE;QAClE,EAAE;QACF,QAAQ;QACR,2IAA2I;QAC3I,qKAAqK;QACrK,mGAAmG;QACnG,EAAE;QACF,wGAAwG;QACxG,0FAA0F;QAC1F,EAAE;QACF,WAAW;QACX,yFAAyF;QACzF,0GAA0G;QAC1G,8GAA8G;QAC9G,2DAA2D,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;QACjG,uGAAuG;QACvG,mEAAmE;QACnE,EAAE;QACF,SAAS;QACT,4IAA4I;QAC5I,+HAA+H;QAC/H,4DAA4D;QAC5D,EAAE;QACF,YAAY;QACZ,sFAAsF;QACtF,wGAAwG;QACxG,kEAAkE;QAClE,EAAE;QACF,0BAA0B;QAC1B,yFAAyF;QACzF,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** The `askdb` package version, printed by `askdb --version` and `askdb introspect --version`. */
2
+ export declare function readCliVersion(): string;
3
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAEA,kGAAkG;AAClG,wBAAgB,cAAc,IAAI,MAAM,CAKvC"}
@@ -0,0 +1,7 @@
1
+ import { readFileSync } from "node:fs";
2
+ /** The `askdb` package version, printed by `askdb --version` and `askdb introspect --version`. */
3
+ export function readCliVersion() {
4
+ const parsed = JSON.parse(readFileSync(new URL("../package.json", import.meta.url), "utf8"));
5
+ return typeof parsed.version === "string" ? parsed.version : "0.0.0";
6
+ }
7
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,kGAAkG;AAClG,MAAM,UAAU,cAAc;IAC5B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAE1F,CAAC;IACF,OAAO,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;AACvE,CAAC"}