@askdb/rag 0.2.0-beta.22 → 0.2.0-beta.24

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 (69) hide show
  1. package/README.md +14 -10
  2. package/bin/askdb-rag.js +8 -1
  3. package/dist/chunker/chunker.d.ts +5 -1
  4. package/dist/chunker/chunker.d.ts.map +1 -1
  5. package/dist/chunker/chunker.js +218 -125
  6. package/dist/chunker/chunker.js.map +1 -1
  7. package/dist/chunker/ids.d.ts +15 -0
  8. package/dist/chunker/ids.d.ts.map +1 -0
  9. package/dist/chunker/ids.js +22 -0
  10. package/dist/chunker/ids.js.map +1 -0
  11. package/dist/chunker/index.d.ts +1 -0
  12. package/dist/chunker/index.d.ts.map +1 -1
  13. package/dist/chunker/index.js +1 -0
  14. package/dist/chunker/index.js.map +1 -1
  15. package/dist/chunker/sources.d.ts.map +1 -1
  16. package/dist/chunker/sources.js +1 -0
  17. package/dist/chunker/sources.js.map +1 -1
  18. package/dist/embedders/ai-sdk.d.ts +15 -0
  19. package/dist/embedders/ai-sdk.d.ts.map +1 -1
  20. package/dist/embedders/ai-sdk.js +9 -0
  21. package/dist/embedders/ai-sdk.js.map +1 -1
  22. package/dist/embedders/dimensions.d.ts +9 -0
  23. package/dist/embedders/dimensions.d.ts.map +1 -0
  24. package/dist/embedders/dimensions.js +18 -0
  25. package/dist/embedders/dimensions.js.map +1 -0
  26. package/dist/embedders/openai.d.ts +1 -1
  27. package/dist/embedders/openai.js +1 -1
  28. package/dist/index.d.ts +5 -4
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +4 -3
  31. package/dist/index.js.map +1 -1
  32. package/dist/indexer/hash.d.ts +7 -0
  33. package/dist/indexer/hash.d.ts.map +1 -1
  34. package/dist/indexer/hash.js +13 -0
  35. package/dist/indexer/hash.js.map +1 -1
  36. package/dist/indexer/index.d.ts +10 -4
  37. package/dist/indexer/index.d.ts.map +1 -1
  38. package/dist/indexer/index.js +167 -30
  39. package/dist/indexer/index.js.map +1 -1
  40. package/dist/indexer/lock-file.d.ts +85 -4
  41. package/dist/indexer/lock-file.d.ts.map +1 -1
  42. package/dist/indexer/lock-file.js +108 -9
  43. package/dist/indexer/lock-file.js.map +1 -1
  44. package/dist/log-events.d.ts +11 -0
  45. package/dist/log-events.d.ts.map +1 -1
  46. package/dist/log-events.js +11 -0
  47. package/dist/log-events.js.map +1 -1
  48. package/dist/stores/file.d.ts +7 -1
  49. package/dist/stores/file.d.ts.map +1 -1
  50. package/dist/stores/file.js +52 -10
  51. package/dist/stores/file.js.map +1 -1
  52. package/dist/stores/memory.d.ts.map +1 -1
  53. package/dist/stores/memory.js +31 -3
  54. package/dist/stores/memory.js.map +1 -1
  55. package/dist/stores/pgvector.d.ts +36 -3
  56. package/dist/stores/pgvector.d.ts.map +1 -1
  57. package/dist/stores/pgvector.js +125 -17
  58. package/dist/stores/pgvector.js.map +1 -1
  59. package/dist/types.d.ts +69 -9
  60. package/dist/types.d.ts.map +1 -1
  61. package/package.json +13 -11
  62. package/dist/bin.d.ts +0 -3
  63. package/dist/bin.d.ts.map +0 -1
  64. package/dist/bin.js +0 -7
  65. package/dist/bin.js.map +0 -1
  66. package/dist/cli.d.ts +0 -11
  67. package/dist/cli.d.ts.map +0 -1
  68. package/dist/cli.js +0 -356
  69. package/dist/cli.js.map +0 -1
package/dist/types.d.ts CHANGED
@@ -10,8 +10,14 @@ export type ChunkType = "table" | "column" | "cql" | "question" | "concept" | "r
10
10
  /**
11
11
  * One slice of the v2 artifact, embedded as a single vector.
12
12
  *
13
- * `text` is what gets embedded. `id` is stable across runs (re-embedding is
14
- * gated on text changes via `schema.lock.json`).
13
+ * `text` is what gets embedded. `id` is stable across runs and scoped to the
14
+ * schema (`chunk:<schemaId>:<local-id>`, `%`/`:` in the schema id
15
+ * percent-encoded; e.g.
16
+ * `chunk:orders-users:table:public.orders`) so several schemas can share one
17
+ * vector store without overwriting each other. Re-embedding is gated on the
18
+ * hash the store reports for the chunk, which covers its text and the
19
+ * embedder id (or on `schema.lock.json`'s text hashes, for stores that cannot
20
+ * report hashes).
15
21
  */
16
22
  export type Chunk = {
17
23
  id: string;
@@ -21,9 +27,10 @@ export type Chunk = {
21
27
  /** Schema-v2 ids referenced by this chunk (for cross-link filtering). */
22
28
  refs: string[];
23
29
  /**
24
- * True when the chunk's source content references a sensitive column.
25
- * Default chunker excludes such chunks; this metadata flows through anyway
26
- * so opt-in mode (`includeSensitiveDescribable: true`) can carry it for telemetry.
30
+ * True when the chunk carries describable content that references a
31
+ * sensitive column/table. The default chunker drops that content (or the
32
+ * whole chunk), so this is only `true` in opt-in mode
33
+ * (`includeSensitiveDescribable: true`) — it flows through for telemetry.
27
34
  */
28
35
  sensitive: boolean;
29
36
  };
@@ -53,7 +60,11 @@ export type UpsertRecord = {
53
60
  id: string;
54
61
  vector: number[];
55
62
  payload: ChunkPayload;
56
- /** Optional content hash. Stores may persist it for `hashesByPrefix` reuse. */
63
+ /**
64
+ * Hash of the chunk text and the embedder id that produced `vector`. Stores
65
+ * that persist it and return it from `hashesByPrefix` let the indexer skip
66
+ * chunks they already hold.
67
+ */
57
68
  hash?: string;
58
69
  };
59
70
  /**
@@ -63,6 +74,34 @@ export type UpsertRecord = {
63
74
  * embedded together. No model-specific concerns leak across this seam.
64
75
  */
65
76
  export type Embedder = (texts: string[]) => Promise<number[][]>;
77
+ /**
78
+ * Identity of a vector store, recorded in `schema.lock.json` so the indexer
79
+ * can tell when the lock was written against a different store.
80
+ */
81
+ export type VectorStoreDescriptor = {
82
+ /** Adapter kind, e.g. `"memory"`, `"file"`, `"pgvector"`. */
83
+ kind: string;
84
+ /**
85
+ * Where the vectors live, e.g. the pgvector table name. It is written to
86
+ * `schema.lock.json`, which is usually committed, so keep it stable across
87
+ * machines: no absolute paths, never credentials.
88
+ */
89
+ location?: string;
90
+ /** Vector dimensions the store holds/expects, when known. */
91
+ dimensions?: number;
92
+ /**
93
+ * The store keeps nothing past the process (the memory store). The indexer
94
+ * neither reads nor writes `schema.lock.json` for it, since the lock
95
+ * describes a persisted index another process can query.
96
+ */
97
+ ephemeral?: boolean;
98
+ /**
99
+ * How to give this store a different vector width, appended to the
100
+ * indexer's width-mismatch error (e.g. which files to delete or table to
101
+ * drop). Not written to the lock.
102
+ */
103
+ widthHint?: string;
104
+ };
66
105
  /**
67
106
  * BYO vector-store seam.
68
107
  *
@@ -74,11 +113,32 @@ export type VectorStore = {
74
113
  query(vector: number[], k: number, filter?: Filter): Promise<QueryResult[]>;
75
114
  delete(ids: string[]): Promise<void>;
76
115
  /**
77
- * Optional fast path used by the indexer to skip re-embedding unchanged
78
- * chunks. Returns `chunkId → contentHash` for ids whose stored hash starts
79
- * with `prefix`. Implementations without persistent hash storage can omit it.
116
+ * Returns `chunkId → hash` (the `UpsertRecord.hash` stored with it) for
117
+ * stored ids that start with `prefix` (records stored without a hash are
118
+ * omitted).
119
+ *
120
+ * When implemented, the indexer treats the store as the source of truth:
121
+ * a chunk is skipped only if the store reports the hash of the same text
122
+ * embedded by the same embedder for its id. Stores that omit it fall back to `schema.lock.json` bookkeeping
123
+ * (guarded by {@link VectorStore.describe} identity and dimensions); a store
124
+ * that implements neither re-embeds every chunk on each run.
80
125
  */
81
126
  hashesByPrefix?(prefix: string): Promise<Record<string, string>>;
127
+ /**
128
+ * Optional: every stored id whose payload `schemaId` matches. Lets the
129
+ * indexer prune orphaned chunks for one schema (including ids written in
130
+ * an older id format) without touching other schemas sharing the store.
131
+ * Without it, the indexer only prunes ids listed in the previous
132
+ * `schema.lock.json`.
133
+ */
134
+ idsBySchema?(schemaId: string): Promise<string[]>;
135
+ /**
136
+ * Optional: store identity recorded in the lock file. A store without
137
+ * `hashesByPrefix` needs it to reuse chunks from the lock: with neither,
138
+ * the indexer can't tell a fresh, empty instance from the one the lock
139
+ * describes, so it re-embeds everything.
140
+ */
141
+ describe?(): VectorStoreDescriptor;
82
142
  };
83
143
  /** Retriever shape consumed by `@askdb/core` `ask({ retriever })`. */
84
144
  export type Retriever = (params: {
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,+EAA+E;AAC/E,MAAM,MAAM,SAAS,GACjB,OAAO,GACP,QAAQ,GACR,KAAK,GACL,UAAU,GACV,SAAS,GACT,cAAc,GACd,eAAe,CAAC;AAEpB;;;;;GAKG;AACH,MAAM,MAAM,KAAK,GAAG;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,yEAAyE;IACzE,IAAI,EAAE,MAAM,EAAE,CAAC;IACf;;;;OAIG;IACH,SAAS,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,+DAA+D;AAC/D,MAAM,MAAM,YAAY,GAAG;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,gEAAgE;AAChE,MAAM,MAAM,MAAM,GAAG;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,SAAS,EAAE,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB,CAAC;AAEF,iDAAiD;AACjD,MAAM,MAAM,WAAW,GAAG;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,YAAY,CAAC;CACvB,CAAC;AAEF,0DAA0D;AAC1D,MAAM,MAAM,YAAY,GAAG;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,YAAY,CAAC;IACtB,+EAA+E;IAC/E,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF;;;;;GAKG;AACH,MAAM,MAAM,QAAQ,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAEhE;;;;;GAKG;AACH,MAAM,MAAM,WAAW,GAAG;IACxB,MAAM,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAC5E,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC;;;;OAIG;IACH,cAAc,CAAC,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CAClE,CAAC;AAEF,sEAAsE;AACtE,MAAM,MAAM,SAAS,GAAG,CAAC,MAAM,EAAE;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,KAAK,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@askdb/rag",
3
- "version": "0.2.0-beta.22",
3
+ "version": "0.2.0-beta.24",
4
4
  "description": "AskDB RAG layer: deterministic chunker over Schema v2, BYO embedder + vector store (in-memory, file-backed, pgvector), and an optional retriever wired into @askdb/core ask().",
5
5
  "keywords": [
6
6
  "askdb",
@@ -11,7 +11,7 @@
11
11
  "pgvector",
12
12
  "ai"
13
13
  ],
14
- "homepage": "https://github.com/Ygilany/AskDB#readme",
14
+ "homepage": "https://askdb.tools/reference/rag-api/",
15
15
  "bugs": {
16
16
  "url": "https://github.com/Ygilany/AskDB/issues"
17
17
  },
@@ -23,6 +23,9 @@
23
23
  "license": "Apache-2.0",
24
24
  "author": "Yahya Gilany",
25
25
  "type": "module",
26
+ "sideEffects": [
27
+ "./bin/askdb-rag.js"
28
+ ],
26
29
  "main": "./dist/index.js",
27
30
  "types": "./dist/index.d.ts",
28
31
  "exports": {
@@ -68,15 +71,14 @@
68
71
  "NOTICE"
69
72
  ],
70
73
  "engines": {
71
- "node": ">=22.12"
74
+ "node": ">=22.23.4"
72
75
  },
73
76
  "dependencies": {
74
- "@askdb/config": "1.0.0-beta.11",
75
- "@askdb/core": "1.0.0-beta.42"
77
+ "@askdb/core": "1.0.0-beta.44"
76
78
  },
77
79
  "peerDependencies": {
78
- "@ai-sdk/openai": "^4.0.29",
79
- "ai": "^7.0.51",
80
+ "@ai-sdk/openai": "^3.0.0 || ^4.0.29",
81
+ "ai": "^6.0.0 || ^7.0.51",
80
82
  "pg": ">=8"
81
83
  },
82
84
  "peerDependenciesMeta": {
@@ -91,12 +93,12 @@
91
93
  }
92
94
  },
93
95
  "devDependencies": {
94
- "@ai-sdk/openai": "^4.0.29",
95
- "@types/pg": "^8.20.3",
96
+ "@ai-sdk/openai": "^4.0.106",
97
+ "@types/pg": "^8.23.1",
96
98
  "ai": "^7.0.51",
97
- "pg": "^8.21.0",
99
+ "pg": "^8.23.1",
98
100
  "typescript": "^6.0.3",
99
- "vitest": "^4.1.10"
101
+ "vitest": "^5.0.5"
100
102
  },
101
103
  "scripts": {
102
104
  "build": "tsc -p tsconfig.build.json",
package/dist/bin.d.ts DELETED
@@ -1,3 +0,0 @@
1
- #!/usr/bin/env node
2
- export {};
3
- //# sourceMappingURL=bin.d.ts.map
package/dist/bin.d.ts.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"bin.d.ts","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":""}
package/dist/bin.js DELETED
@@ -1,7 +0,0 @@
1
- #!/usr/bin/env node
2
- import { bootstrapAskDbEnv } from "@askdb/config";
3
- import { runRagCli } from "./cli.js";
4
- bootstrapAskDbEnv({ cwd: process.cwd() });
5
- const exitCode = await runRagCli(process.argv.slice(2));
6
- process.exit(exitCode);
7
- //# sourceMappingURL=bin.js.map
package/dist/bin.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAErC,iBAAiB,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;AAC1C,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACxD,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC"}
package/dist/cli.d.ts DELETED
@@ -1,11 +0,0 @@
1
- import type { Embedder } from "./types.js";
2
- export declare function runRagCli(argv: readonly string[]): Promise<number>;
3
- /**
4
- * Deterministic mock embedder used for tests, CI, and quick smoke-checks.
5
- *
6
- * Produces a stable lexical bag-of-words vector by hashing normalized tokens;
7
- * same text always yields the same vector. Not a real embedder, but useful for
8
- * local smoke tests because shared terms like "revenue" can rank related chunks.
9
- */
10
- export declare function createMockEmbedder(dim?: number): Embedder;
11
- //# sourceMappingURL=cli.d.ts.map
package/dist/cli.d.ts.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EACV,QAAQ,EAIT,MAAM,YAAY,CAAC;AAuBpB,wBAAsB,SAAS,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA4BxE;AA0ID;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,SAAK,GAAG,QAAQ,CAYrD"}
package/dist/cli.js DELETED
@@ -1,356 +0,0 @@
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" && cmd !== "setup-store") {
24
- throw new Error(`Unknown command: ${cmd} (expected 'index', 'query', or 'setup-store')`);
25
- }
26
- const opts = parseOptions(argv.slice(1));
27
- opts.command = cmd;
28
- if (cmd === "setup-store")
29
- return await runSetupStore(opts);
30
- if (!opts.schemaDir) {
31
- throw new Error("Missing positional <schema-dir>.");
32
- }
33
- const runtimeConfig = getAskDbRuntimeConfig();
34
- const logger = buildLogger(opts, runtimeConfig);
35
- if (cmd === "index")
36
- return await runIndex(opts, logger, runtimeConfig);
37
- return await runQuery(opts, logger, runtimeConfig);
38
- }
39
- catch (e) {
40
- process.stderr.write(`${e instanceof Error ? e.message : String(e)}\n`);
41
- return 1;
42
- }
43
- }
44
- async function runIndex(opts, logger, runtimeConfig) {
45
- const sources = loadChunkerSourcesFromDir(opts.schemaDir);
46
- const embedder = buildEmbedder(opts, runtimeConfig);
47
- const dimensions = embedderDimensions(opts);
48
- const store = await buildStore(opts, dimensions);
49
- const result = await buildSchemaIndex({
50
- schema: sources,
51
- embedder,
52
- store,
53
- embedderId: embedderId(opts),
54
- lockFilePath: join(resolve(opts.schemaDir), "schema.lock.json"),
55
- correlationId: opts.correlationId,
56
- logger,
57
- });
58
- process.stdout.write(`${JSON.stringify({
59
- schemaId: sources.schema.schemaId,
60
- chunksTotal: result.stats.chunksTotal,
61
- chunksIndexed: result.stats.chunksIndexed,
62
- chunksReused: result.stats.chunksReused,
63
- sensitiveExcluded: result.stats.sensitiveExcluded,
64
- sensitiveIncluded: result.stats.sensitiveIncluded,
65
- }, null, 2)}\n`);
66
- await closeStore(store);
67
- return 0;
68
- }
69
- async function runQuery(opts, logger, runtimeConfig) {
70
- if (!opts.question) {
71
- throw new Error("Missing --question for query command.");
72
- }
73
- const sources = loadChunkerSourcesFromDir(opts.schemaDir);
74
- const embedder = buildEmbedder(opts, runtimeConfig);
75
- const dimensions = embedderDimensions(opts);
76
- const store = await buildStore(opts, dimensions);
77
- const filter = { schemaId: sources.schema.schemaId };
78
- if (opts.filterTypes && opts.filterTypes.length > 0) {
79
- filter.types = opts.filterTypes;
80
- }
81
- const [vector] = await embedder([opts.question]);
82
- const k = opts.k ?? 8;
83
- const results = await store.query(vector, k, filter);
84
- logger.info({
85
- event: "askdb.rag.cli.query",
86
- questionChars: opts.question.length,
87
- k,
88
- resultCount: results.length,
89
- }, "rag query completed");
90
- process.stdout.write(`${JSON.stringify({
91
- question: opts.question,
92
- k,
93
- results: results.map((r) => ({
94
- id: r.id,
95
- score: Number(r.score.toFixed(6)),
96
- type: r.payload.type,
97
- schemaId: r.payload.schemaId,
98
- refs: r.payload.refs,
99
- textPreview: r.payload.text.slice(0, 200),
100
- })),
101
- }, null, 2)}\n`);
102
- await closeStore(store);
103
- return 0;
104
- }
105
- async function runSetupStore(opts) {
106
- if (!opts.pgUrl) {
107
- throw new Error("setup-store requires --pg-url <connection-string>.");
108
- }
109
- const dimensions = opts.dimensions ?? 1536;
110
- const store = createPgvectorStore({
111
- connectionString: opts.pgUrl,
112
- table: opts.pgTable,
113
- dimensions,
114
- });
115
- await store.ensureSchema();
116
- await store.close();
117
- const table = opts.pgTable ?? "askdb_rag_chunks";
118
- process.stdout.write(`pgvector schema ready: table "${table}" (dimensions=${dimensions})\n`);
119
- return 0;
120
- }
121
- function buildEmbedder(opts, runtimeConfig) {
122
- const choice = opts.embedder ?? "mock";
123
- if (choice === "mock")
124
- return createMockEmbedder();
125
- if (choice === "openai")
126
- return createOpenAiEmbedder(opts, runtimeConfig);
127
- throw new Error(`Unknown embedder: ${choice}`);
128
- }
129
- function embedderId(opts) {
130
- const choice = opts.embedder ?? "mock";
131
- if (choice === "openai") {
132
- const base = `openai:${opts.embedderModel ?? "text-embedding-3-small"}`;
133
- return opts.dimensions ? `${base}:${opts.dimensions}` : base;
134
- }
135
- return `mock:lexical-${embedderDimensions(opts)}`;
136
- }
137
- function embedderDimensions(opts) {
138
- if (opts.dimensions)
139
- return opts.dimensions;
140
- const choice = opts.embedder ?? "mock";
141
- if (choice === "openai") {
142
- const model = opts.embedderModel ?? "text-embedding-3-small";
143
- if (model === "text-embedding-3-small")
144
- return 1536;
145
- if (model === "text-embedding-3-large")
146
- return 3072;
147
- if (model === "text-embedding-ada-002")
148
- return 1536;
149
- throw new Error(`Pass --dimensions for unknown embedder model: ${model}`);
150
- }
151
- return 64;
152
- }
153
- /**
154
- * Deterministic mock embedder used for tests, CI, and quick smoke-checks.
155
- *
156
- * Produces a stable lexical bag-of-words vector by hashing normalized tokens;
157
- * same text always yields the same vector. Not a real embedder, but useful for
158
- * local smoke tests because shared terms like "revenue" can rank related chunks.
159
- */
160
- export function createMockEmbedder(dim = 64) {
161
- return async (texts) => {
162
- return texts.map((text) => {
163
- const v = new Array(dim).fill(0);
164
- const tokens = text.toLowerCase().match(/[a-z0-9_]+/g) ?? [];
165
- for (const token of tokens) {
166
- v[stableTokenHash(token) % dim] += 1;
167
- }
168
- const norm = Math.sqrt(v.reduce((s, x) => s + x * x, 0)) || 1;
169
- return v.map((x) => x / norm);
170
- });
171
- };
172
- }
173
- function stableTokenHash(token) {
174
- let h = 2166136261;
175
- for (let i = 0; i < token.length; i++) {
176
- h ^= token.charCodeAt(i);
177
- h = Math.imul(h, 16777619);
178
- }
179
- return h >>> 0;
180
- }
181
- function createOpenAiEmbedder(opts, runtimeConfig) {
182
- const apiKey = opts.apiKey ?? runtimeConfig.rag.embedder.apiKey;
183
- if (!apiKey) {
184
- 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`).");
185
- }
186
- return createAiSdkOpenAiEmbedder({
187
- apiKey,
188
- model: opts.embedderModel ?? "text-embedding-3-small",
189
- baseURL: runtimeConfig.rag.embedder.baseURL,
190
- dimensions: opts.dimensions,
191
- });
192
- }
193
- async function buildStore(opts, dimensions) {
194
- const choice = opts.store ?? "file";
195
- if (choice === "memory")
196
- return createMemoryStore();
197
- if (choice === "file") {
198
- const path = opts.filePath
199
- ? opts.filePath
200
- : join(resolve(opts.schemaDir), "schema");
201
- return createFileStore({ basePath: path });
202
- }
203
- if (choice === "pgvector") {
204
- if (!opts.pgUrl) {
205
- throw new Error("pgvector store requires --pg-url (or set PGURL/DATABASE_URL via your shell).");
206
- }
207
- const pgOptions = {
208
- connectionString: opts.pgUrl,
209
- table: opts.pgTable,
210
- dimensions,
211
- };
212
- return createPgvectorStore(pgOptions);
213
- }
214
- throw new Error(`Unknown store: ${choice}`);
215
- }
216
- async function closeStore(store) {
217
- if (typeof store.flush === "function")
218
- store.flush();
219
- if (typeof store.close === "function")
220
- await store.close();
221
- }
222
- function buildLogger(opts, runtimeConfig) {
223
- const level = resolveLogLevel(opts, runtimeConfig);
224
- return createAskDbLogger({
225
- correlationId: opts.correlationId ?? runtimeConfig.logging.correlationId ?? randomUUID(),
226
- level,
227
- logFile: opts.logFile ?? runtimeConfig.logging.logFile,
228
- logStdout: opts.logStdout ?? runtimeConfig.logging.logStdout,
229
- });
230
- }
231
- function resolveLogLevel(opts, runtimeConfig) {
232
- if (opts.logLevel !== undefined && opts.logLevel !== "") {
233
- const lvl = opts.logLevel.toLowerCase();
234
- if (!isSupportedAskDbLogLevel(lvl)) {
235
- throw new Error(`Invalid --log-level: ${opts.logLevel} (expected one of ${formatSupportedAskDbLogLevels()})`);
236
- }
237
- return lvl;
238
- }
239
- const envLevel = runtimeConfig.logging.level?.toLowerCase();
240
- if (envLevel && isSupportedAskDbLogLevel(envLevel))
241
- return envLevel;
242
- if (opts.verbose || opts.logFile || opts.logStdout)
243
- return "info";
244
- return "silent";
245
- }
246
- function parseOptions(argv) {
247
- const opts = {};
248
- let positional = 0;
249
- for (let i = 0; i < argv.length; i++) {
250
- const arg = argv[i];
251
- if (!arg.startsWith("-")) {
252
- if (positional === 0)
253
- opts.schemaDir = arg;
254
- else
255
- throw new Error(`Unexpected positional argument: ${arg}`);
256
- positional++;
257
- continue;
258
- }
259
- switch (arg) {
260
- case "--store":
261
- opts.store = readValue(argv, ++i, arg);
262
- break;
263
- case "--embedder":
264
- opts.embedder = readValue(argv, ++i, arg);
265
- break;
266
- case "--embedder-model":
267
- opts.embedderModel = readValue(argv, ++i, arg);
268
- break;
269
- case "--api-key":
270
- opts.apiKey = readValue(argv, ++i, arg);
271
- break;
272
- case "--question":
273
- opts.question = readValue(argv, ++i, arg);
274
- break;
275
- case "-k":
276
- case "--k":
277
- opts.k = Number(readValue(argv, ++i, arg));
278
- break;
279
- case "--pg-url":
280
- opts.pgUrl = readValue(argv, ++i, arg);
281
- break;
282
- case "--pg-table":
283
- opts.pgTable = readValue(argv, ++i, arg);
284
- break;
285
- case "--dimensions":
286
- opts.dimensions = Number(readValue(argv, ++i, arg));
287
- break;
288
- case "--types":
289
- opts.filterTypes = readValue(argv, ++i, arg).split(",").map((s) => s.trim()).filter(Boolean);
290
- break;
291
- case "--file-path":
292
- opts.filePath = readValue(argv, ++i, arg);
293
- break;
294
- case "-v":
295
- case "--verbose":
296
- opts.verbose = true;
297
- break;
298
- case "--log-level":
299
- opts.logLevel = readValue(argv, ++i, arg);
300
- break;
301
- case "--log-file":
302
- opts.logFile = readValue(argv, ++i, arg);
303
- break;
304
- case "--log-stdout":
305
- opts.logStdout = true;
306
- break;
307
- case "--correlation-id":
308
- opts.correlationId = readValue(argv, ++i, arg);
309
- break;
310
- default:
311
- throw new Error(`Unknown option: ${arg}`);
312
- }
313
- }
314
- return opts;
315
- }
316
- function readValue(argv, index, flag) {
317
- const value = argv[index];
318
- if (!value || (value.startsWith("--") && value !== flag)) {
319
- throw new Error(`${flag} requires a value.`);
320
- }
321
- return value;
322
- }
323
- function readPackageVersion() {
324
- const pkgPath = new URL("../package.json", import.meta.url);
325
- const parsed = JSON.parse(readFileSync(pkgPath, "utf8"));
326
- return typeof parsed.version === "string" ? parsed.version : "0.0.0";
327
- }
328
- function printHelp() {
329
- process.stdout.write([
330
- "askdb-rag - Chunk + index + query a Schema v2 directory.",
331
- "",
332
- "Usage:",
333
- " askdb-rag index <schema-dir> [--store memory|file|pgvector] [--embedder mock|openai] [--dimensions <n>]",
334
- " askdb-rag query <schema-dir> --question \"...\" [-k 8] [--types table,column,cql]",
335
- " askdb-rag setup-store --pg-url <conn> [--pg-table askdb_rag_chunks] [--dimensions <n>]",
336
- "",
337
- "Commands:",
338
- " index Chunk and embed a schema directory into the configured store.",
339
- " query Run a similarity query against an indexed store.",
340
- " setup-store Create the pgvector extension, table, and indexes. Idempotent — safe to re-run.",
341
- "",
342
- "Stores:",
343
- " memory in-memory cosine. Ephemeral. Default for `query`-only smoke checks against `index --store memory`.",
344
- " file persisted as <schema-dir>/schema.embeddings.{bin,json} (default).",
345
- " pgvector --pg-url <conn> [--pg-table askdb_rag_chunks] [--dimensions <n>]",
346
- "",
347
- "Embedders:",
348
- " mock deterministic lexical hash. Default. CI-safe.",
349
- " openai AI SDK OpenAI embeddings; OPENAI_API_KEY (or --api-key); --embedder-model text-embedding-3-small (default).",
350
- "",
351
- "Logging matches `askdb`:",
352
- " --log-level <level> --log-file <path> --log-stdout --correlation-id <id> -v/--verbose",
353
- "",
354
- ].join("\n"));
355
- }
356
- //# sourceMappingURL=cli.js.map
package/dist/cli.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}