@unlimiting/qsc 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (117) hide show
  1. package/dist/chunker/ast.d.ts +7 -0
  2. package/dist/chunker/ast.d.ts.map +1 -0
  3. package/dist/chunker/ast.js +302 -0
  4. package/dist/chunker/ast.js.map +1 -0
  5. package/dist/chunker/index.d.ts +15 -0
  6. package/dist/chunker/index.d.ts.map +1 -0
  7. package/dist/chunker/index.js +26 -0
  8. package/dist/chunker/index.js.map +1 -0
  9. package/dist/chunker/languages/dart.d.ts +3 -0
  10. package/dist/chunker/languages/dart.d.ts.map +1 -0
  11. package/dist/chunker/languages/dart.js +22 -0
  12. package/dist/chunker/languages/dart.js.map +1 -0
  13. package/dist/chunker/languages/go.d.ts +3 -0
  14. package/dist/chunker/languages/go.d.ts.map +1 -0
  15. package/dist/chunker/languages/go.js +20 -0
  16. package/dist/chunker/languages/go.js.map +1 -0
  17. package/dist/chunker/languages/index.d.ts +12 -0
  18. package/dist/chunker/languages/index.d.ts.map +1 -0
  19. package/dist/chunker/languages/index.js +35 -0
  20. package/dist/chunker/languages/index.js.map +1 -0
  21. package/dist/chunker/languages/kotlin.d.ts +3 -0
  22. package/dist/chunker/languages/kotlin.d.ts.map +1 -0
  23. package/dist/chunker/languages/kotlin.js +23 -0
  24. package/dist/chunker/languages/kotlin.js.map +1 -0
  25. package/dist/chunker/languages/python.d.ts +3 -0
  26. package/dist/chunker/languages/python.d.ts.map +1 -0
  27. package/dist/chunker/languages/python.js +21 -0
  28. package/dist/chunker/languages/python.js.map +1 -0
  29. package/dist/chunker/languages/swift.d.ts +3 -0
  30. package/dist/chunker/languages/swift.d.ts.map +1 -0
  31. package/dist/chunker/languages/swift.js +24 -0
  32. package/dist/chunker/languages/swift.js.map +1 -0
  33. package/dist/chunker/languages/typescript.d.ts +4 -0
  34. package/dist/chunker/languages/typescript.d.ts.map +1 -0
  35. package/dist/chunker/languages/typescript.js +34 -0
  36. package/dist/chunker/languages/typescript.js.map +1 -0
  37. package/dist/chunker/token.d.ts +6 -0
  38. package/dist/chunker/token.d.ts.map +1 -0
  39. package/dist/chunker/token.js +107 -0
  40. package/dist/chunker/token.js.map +1 -0
  41. package/dist/collection.d.ts +22 -0
  42. package/dist/collection.d.ts.map +1 -0
  43. package/dist/collection.js +154 -0
  44. package/dist/collection.js.map +1 -0
  45. package/dist/config/index.d.ts +95 -0
  46. package/dist/config/index.d.ts.map +1 -0
  47. package/dist/config/index.js +103 -0
  48. package/dist/config/index.js.map +1 -0
  49. package/dist/embedder/index.d.ts +14 -0
  50. package/dist/embedder/index.d.ts.map +1 -0
  51. package/dist/embedder/index.js +18 -0
  52. package/dist/embedder/index.js.map +1 -0
  53. package/dist/embedder/local.d.ts +11 -0
  54. package/dist/embedder/local.d.ts.map +1 -0
  55. package/dist/embedder/local.js +60 -0
  56. package/dist/embedder/local.js.map +1 -0
  57. package/dist/embedder/openai.d.ts +10 -0
  58. package/dist/embedder/openai.d.ts.map +1 -0
  59. package/dist/embedder/openai.js +69 -0
  60. package/dist/embedder/openai.js.map +1 -0
  61. package/dist/index.d.ts +3 -0
  62. package/dist/index.d.ts.map +1 -0
  63. package/dist/index.js +824 -0
  64. package/dist/index.js.map +1 -0
  65. package/dist/llm/index.d.ts +17 -0
  66. package/dist/llm/index.d.ts.map +1 -0
  67. package/dist/llm/index.js +18 -0
  68. package/dist/llm/index.js.map +1 -0
  69. package/dist/llm/local.d.ts +10 -0
  70. package/dist/llm/local.d.ts.map +1 -0
  71. package/dist/llm/local.js +76 -0
  72. package/dist/llm/local.js.map +1 -0
  73. package/dist/llm/openai.d.ts +10 -0
  74. package/dist/llm/openai.d.ts.map +1 -0
  75. package/dist/llm/openai.js +76 -0
  76. package/dist/llm/openai.js.map +1 -0
  77. package/dist/mcp.d.ts +3 -0
  78. package/dist/mcp.d.ts.map +1 -0
  79. package/dist/mcp.js +393 -0
  80. package/dist/mcp.js.map +1 -0
  81. package/dist/scanner/git.d.ts +26 -0
  82. package/dist/scanner/git.d.ts.map +1 -0
  83. package/dist/scanner/git.js +134 -0
  84. package/dist/scanner/git.js.map +1 -0
  85. package/dist/scanner/index.d.ts +17 -0
  86. package/dist/scanner/index.d.ts.map +1 -0
  87. package/dist/scanner/index.js +174 -0
  88. package/dist/scanner/index.js.map +1 -0
  89. package/dist/search/bm25.d.ts +17 -0
  90. package/dist/search/bm25.d.ts.map +1 -0
  91. package/dist/search/bm25.js +27 -0
  92. package/dist/search/bm25.js.map +1 -0
  93. package/dist/search/expander.d.ts +12 -0
  94. package/dist/search/expander.d.ts.map +1 -0
  95. package/dist/search/expander.js +60 -0
  96. package/dist/search/expander.js.map +1 -0
  97. package/dist/search/fusion.d.ts +32 -0
  98. package/dist/search/fusion.d.ts.map +1 -0
  99. package/dist/search/fusion.js +80 -0
  100. package/dist/search/fusion.js.map +1 -0
  101. package/dist/search/index.d.ts +61 -0
  102. package/dist/search/index.d.ts.map +1 -0
  103. package/dist/search/index.js +137 -0
  104. package/dist/search/index.js.map +1 -0
  105. package/dist/search/reranker.d.ts +18 -0
  106. package/dist/search/reranker.d.ts.map +1 -0
  107. package/dist/search/reranker.js +56 -0
  108. package/dist/search/reranker.js.map +1 -0
  109. package/dist/search/vector.d.ts +23 -0
  110. package/dist/search/vector.d.ts.map +1 -0
  111. package/dist/search/vector.js +47 -0
  112. package/dist/search/vector.js.map +1 -0
  113. package/dist/store.d.ts +119 -0
  114. package/dist/store.d.ts.map +1 -0
  115. package/dist/store.js +500 -0
  116. package/dist/store.js.map +1 -0
  117. package/package.json +48 -0
@@ -0,0 +1,34 @@
1
+ export const typescriptConfig = {
2
+ extensions: [".ts", ".js"],
3
+ treeSitterLanguage: "typescript",
4
+ treeSitterWasmFile: "tree-sitter-typescript.wasm",
5
+ chunkNodeTypes: [
6
+ "function_declaration",
7
+ "arrow_function",
8
+ "class_declaration",
9
+ "method_definition",
10
+ "interface_declaration",
11
+ "type_alias_declaration",
12
+ "enum_declaration",
13
+ "export_statement",
14
+ "lexical_declaration",
15
+ "variable_declaration",
16
+ ],
17
+ containerNodeTypes: [
18
+ "program",
19
+ "class_body",
20
+ "module",
21
+ "export_statement",
22
+ ],
23
+ importNodeTypes: [
24
+ "import_statement",
25
+ ],
26
+ nameFields: ["name", "property"],
27
+ };
28
+ export const tsxConfig = {
29
+ ...typescriptConfig,
30
+ extensions: [".tsx", ".jsx"],
31
+ treeSitterLanguage: "tsx",
32
+ treeSitterWasmFile: "tree-sitter-tsx.wasm",
33
+ };
34
+ //# sourceMappingURL=typescript.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typescript.js","sourceRoot":"","sources":["../../../src/chunker/languages/typescript.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,gBAAgB,GAAmB;IAC9C,UAAU,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC;IAC1B,kBAAkB,EAAE,YAAY;IAChC,kBAAkB,EAAE,6BAA6B;IACjD,cAAc,EAAE;QACd,sBAAsB;QACtB,gBAAgB;QAChB,mBAAmB;QACnB,mBAAmB;QACnB,uBAAuB;QACvB,wBAAwB;QACxB,kBAAkB;QAClB,kBAAkB;QAClB,qBAAqB;QACrB,sBAAsB;KACvB;IACD,kBAAkB,EAAE;QAClB,SAAS;QACT,YAAY;QACZ,QAAQ;QACR,kBAAkB;KACnB;IACD,eAAe,EAAE;QACf,kBAAkB;KACnB;IACD,UAAU,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC;CACjC,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAmB;IACvC,GAAG,gBAAgB;IACnB,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC;IAC5B,kBAAkB,EAAE,KAAK;IACzB,kBAAkB,EAAE,sBAAsB;CAC3C,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { Chunk } from "./index.js";
2
+ export interface TokenChunker {
3
+ chunk(content: string, filePath: string): Chunk[];
4
+ }
5
+ export declare function createTokenChunker(maxTokens: number, overlapRatio: number): TokenChunker;
6
+ //# sourceMappingURL=token.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token.d.ts","sourceRoot":"","sources":["../../src/chunker/token.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAyCxC,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,KAAK,EAAE,CAAC;CACnD;AAED,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,YAAY,CAuExF"}
@@ -0,0 +1,107 @@
1
+ import { extname } from "node:path";
2
+ /**
3
+ * Rough token count estimation: ~4 characters per token on average for code.
4
+ */
5
+ function estimateTokens(text) {
6
+ return Math.ceil(text.length / 4);
7
+ }
8
+ /**
9
+ * Find the best split point near a target line index, respecting code boundaries.
10
+ * Prefers splitting at blank lines, then at dedent boundaries.
11
+ */
12
+ function findBestSplit(lines, targetIdx, windowSize) {
13
+ const start = Math.max(0, targetIdx - windowSize);
14
+ const end = Math.min(lines.length - 1, targetIdx + windowSize);
15
+ // Prefer blank lines
16
+ for (let i = targetIdx; i >= start; i--) {
17
+ if (lines[i].trim() === "")
18
+ return i + 1;
19
+ }
20
+ for (let i = targetIdx + 1; i <= end; i++) {
21
+ if (lines[i].trim() === "")
22
+ return i + 1;
23
+ }
24
+ // Prefer lines with less indentation (scope boundary)
25
+ let bestIdx = targetIdx;
26
+ let bestIndent = Infinity;
27
+ for (let i = start; i <= end; i++) {
28
+ const line = lines[i];
29
+ if (line.trim() === "")
30
+ continue;
31
+ const indent = line.length - line.trimStart().length;
32
+ if (indent < bestIndent) {
33
+ bestIndent = indent;
34
+ bestIdx = i;
35
+ }
36
+ }
37
+ return bestIdx;
38
+ }
39
+ export function createTokenChunker(maxTokens, overlapRatio) {
40
+ return {
41
+ chunk(content, filePath) {
42
+ const lines = content.split("\n");
43
+ if (lines.length === 0)
44
+ return [];
45
+ const ext = extname(filePath).toLowerCase();
46
+ const language = ext ? ext.slice(1) : "unknown";
47
+ const totalTokens = estimateTokens(content);
48
+ if (totalTokens <= maxTokens) {
49
+ return [{
50
+ content,
51
+ startLine: 1,
52
+ endLine: lines.length,
53
+ type: "module",
54
+ language,
55
+ }];
56
+ }
57
+ const overlapTokens = Math.floor(maxTokens * overlapRatio);
58
+ const chunks = [];
59
+ let lineIdx = 0;
60
+ while (lineIdx < lines.length) {
61
+ // Accumulate lines until we reach maxTokens
62
+ let tokenCount = 0;
63
+ let endIdx = lineIdx;
64
+ while (endIdx < lines.length) {
65
+ const lineTokens = estimateTokens(lines[endIdx] + "\n");
66
+ if (tokenCount + lineTokens > maxTokens && endIdx > lineIdx)
67
+ break;
68
+ tokenCount += lineTokens;
69
+ endIdx++;
70
+ }
71
+ // Try to find a good split point if we're not at the end
72
+ if (endIdx < lines.length) {
73
+ const window = Math.min(10, Math.floor((endIdx - lineIdx) * 0.2));
74
+ endIdx = findBestSplit(lines, endIdx - 1, window);
75
+ if (endIdx <= lineIdx)
76
+ endIdx = lineIdx + 1;
77
+ }
78
+ const chunkLines = lines.slice(lineIdx, endIdx);
79
+ const chunkContent = chunkLines.join("\n");
80
+ if (chunkContent.trim().length > 0) {
81
+ chunks.push({
82
+ content: chunkContent,
83
+ startLine: lineIdx + 1,
84
+ endLine: endIdx,
85
+ type: "block",
86
+ language,
87
+ });
88
+ }
89
+ // Compute overlap: go back by overlapTokens worth of lines
90
+ if (endIdx >= lines.length)
91
+ break;
92
+ let overlapLines = 0;
93
+ let overlapCount = 0;
94
+ for (let i = endIdx - 1; i >= lineIdx; i--) {
95
+ const lt = estimateTokens(lines[i] + "\n");
96
+ if (overlapCount + lt > overlapTokens)
97
+ break;
98
+ overlapCount += lt;
99
+ overlapLines++;
100
+ }
101
+ lineIdx = endIdx - overlapLines;
102
+ }
103
+ return chunks;
104
+ },
105
+ };
106
+ }
107
+ //# sourceMappingURL=token.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token.js","sourceRoot":"","sources":["../../src/chunker/token.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ export interface CollectionMeta {
2
+ dbPath: string;
3
+ sourcePath: string;
4
+ createdAt: string;
5
+ updateCommand?: string;
6
+ }
7
+ export interface CollectionRegistry {
8
+ [name: string]: CollectionMeta;
9
+ }
10
+ export declare function ensureQscHome(): void;
11
+ export declare function getCollectionDbPath(name: string): string;
12
+ export declare function listCollections(): CollectionRegistry;
13
+ export declare function getCollection(name: string): CollectionMeta | undefined;
14
+ export declare function registerCollection(name: string, sourcePath: string, dbPath?: string, updateCommand?: string): CollectionMeta;
15
+ export declare function updateCollectionMeta(name: string, updates: Partial<Pick<CollectionMeta, "updateCommand">>): CollectionMeta;
16
+ export declare function removeCollection(name: string): boolean;
17
+ export declare function resolveCollectionDb(name: string): string;
18
+ export declare function resolveCollectionSourcePath(name: string): string;
19
+ export declare function copyCollection(sourceName: string, destName: string, newSourcePath: string): CollectionMeta;
20
+ export declare function importCollection(name: string, sqlitePath: string, sourcePath: string): CollectionMeta;
21
+ export declare function exportCollection(name: string, outputPath: string): void;
22
+ //# sourceMappingURL=collection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collection.d.ts","sourceRoot":"","sources":["../src/collection.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB;IACjC,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,CAAC;CAChC;AAkDD,wBAAgB,aAAa,IAAI,IAAI,CASpC;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGxD;AAED,wBAAgB,eAAe,IAAI,kBAAkB,CAEpD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAGtE;AAED,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,MAAM,EACf,aAAa,CAAC,EAAE,MAAM,GACrB,cAAc,CAkBhB;AAED,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,cAAc,EAAE,eAAe,CAAC,CAAC,GACtD,cAAc,CAqBhB;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAMtD;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQxD;AAED,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQhE;AAED,wBAAgB,cAAc,CAC5B,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,GACpB,cAAc,CAehB;AAED,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GACjB,cAAc,CAYhB;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAgBvE"}
@@ -0,0 +1,154 @@
1
+ import { existsSync, mkdirSync, readFileSync, writeFileSync, copyFileSync } from "node:fs";
2
+ import { resolve, join, dirname } from "node:path";
3
+ import { homedir } from "node:os";
4
+ // --- Paths ---
5
+ function getQscHome() {
6
+ return resolve(homedir(), ".qsc");
7
+ }
8
+ function getRegistryPath() {
9
+ return join(getQscHome(), "collections.json");
10
+ }
11
+ function getCollectionsDir() {
12
+ return join(getQscHome(), "collections");
13
+ }
14
+ // --- Registry I/O ---
15
+ function readRegistry() {
16
+ const registryPath = getRegistryPath();
17
+ if (!existsSync(registryPath)) {
18
+ return {};
19
+ }
20
+ const raw = readFileSync(registryPath, "utf-8");
21
+ return JSON.parse(raw);
22
+ }
23
+ function writeRegistry(registry) {
24
+ const registryPath = getRegistryPath();
25
+ const dir = dirname(registryPath);
26
+ if (!existsSync(dir)) {
27
+ mkdirSync(dir, { recursive: true });
28
+ }
29
+ writeFileSync(registryPath, JSON.stringify(registry, null, 2), "utf-8");
30
+ }
31
+ // --- Validation ---
32
+ const VALID_COLLECTION_NAME = /^[a-zA-Z0-9_-]+$/;
33
+ function validateCollectionName(name) {
34
+ if (!VALID_COLLECTION_NAME.test(name)) {
35
+ throw new Error(`Invalid collection name '${name}'. Only alphanumeric characters, hyphens, and underscores are allowed.`);
36
+ }
37
+ }
38
+ // --- Public API ---
39
+ export function ensureQscHome() {
40
+ const home = getQscHome();
41
+ if (!existsSync(home)) {
42
+ mkdirSync(home, { recursive: true });
43
+ }
44
+ const collectionsDir = getCollectionsDir();
45
+ if (!existsSync(collectionsDir)) {
46
+ mkdirSync(collectionsDir, { recursive: true });
47
+ }
48
+ }
49
+ export function getCollectionDbPath(name) {
50
+ validateCollectionName(name);
51
+ return join(getCollectionsDir(), `${name}.sqlite`);
52
+ }
53
+ export function listCollections() {
54
+ return readRegistry();
55
+ }
56
+ export function getCollection(name) {
57
+ const registry = readRegistry();
58
+ return registry[name];
59
+ }
60
+ export function registerCollection(name, sourcePath, dbPath, updateCommand) {
61
+ ensureQscHome();
62
+ const finalDbPath = dbPath ?? getCollectionDbPath(name);
63
+ const meta = {
64
+ dbPath: finalDbPath,
65
+ sourcePath: resolve(sourcePath),
66
+ createdAt: new Date().toISOString(),
67
+ };
68
+ if (updateCommand !== undefined) {
69
+ meta.updateCommand = updateCommand;
70
+ }
71
+ const registry = readRegistry();
72
+ registry[name] = meta;
73
+ writeRegistry(registry);
74
+ return meta;
75
+ }
76
+ export function updateCollectionMeta(name, updates) {
77
+ const registry = readRegistry();
78
+ const meta = registry[name];
79
+ if (!meta) {
80
+ throw new Error(`Collection '${name}' not found. Run 'qsc init ${name} <path>' first.`);
81
+ }
82
+ if (updates.updateCommand !== undefined) {
83
+ if (updates.updateCommand === "") {
84
+ delete meta.updateCommand;
85
+ }
86
+ else {
87
+ meta.updateCommand = updates.updateCommand;
88
+ }
89
+ }
90
+ registry[name] = meta;
91
+ writeRegistry(registry);
92
+ return meta;
93
+ }
94
+ export function removeCollection(name) {
95
+ const registry = readRegistry();
96
+ if (!registry[name])
97
+ return false;
98
+ delete registry[name];
99
+ writeRegistry(registry);
100
+ return true;
101
+ }
102
+ export function resolveCollectionDb(name) {
103
+ const meta = getCollection(name);
104
+ if (!meta) {
105
+ throw new Error(`Collection '${name}' not found. Run 'qsc init ${name} <path>' first.`);
106
+ }
107
+ return meta.dbPath;
108
+ }
109
+ export function resolveCollectionSourcePath(name) {
110
+ const meta = getCollection(name);
111
+ if (!meta) {
112
+ throw new Error(`Collection '${name}' not found. Run 'qsc init ${name} <path>' first.`);
113
+ }
114
+ return meta.sourcePath;
115
+ }
116
+ export function copyCollection(sourceName, destName, newSourcePath) {
117
+ const sourceMeta = getCollection(sourceName);
118
+ if (!sourceMeta) {
119
+ throw new Error(`Source collection '${sourceName}' not found.`);
120
+ }
121
+ if (!existsSync(sourceMeta.dbPath)) {
122
+ throw new Error(`Source database not found: ${sourceMeta.dbPath}`);
123
+ }
124
+ ensureQscHome();
125
+ const destDbPath = getCollectionDbPath(destName);
126
+ copyFileSync(sourceMeta.dbPath, destDbPath);
127
+ return registerCollection(destName, newSourcePath, destDbPath);
128
+ }
129
+ export function importCollection(name, sqlitePath, sourcePath) {
130
+ const absSource = resolve(sqlitePath);
131
+ if (!existsSync(absSource)) {
132
+ throw new Error(`SQLite file not found: ${absSource}`);
133
+ }
134
+ ensureQscHome();
135
+ const destDbPath = getCollectionDbPath(name);
136
+ copyFileSync(absSource, destDbPath);
137
+ return registerCollection(name, sourcePath, destDbPath);
138
+ }
139
+ export function exportCollection(name, outputPath) {
140
+ const meta = getCollection(name);
141
+ if (!meta) {
142
+ throw new Error(`Collection '${name}' not found.`);
143
+ }
144
+ if (!existsSync(meta.dbPath)) {
145
+ throw new Error(`Database not found: ${meta.dbPath}`);
146
+ }
147
+ const absOutput = resolve(outputPath);
148
+ const outDir = dirname(absOutput);
149
+ if (!existsSync(outDir)) {
150
+ mkdirSync(outDir, { recursive: true });
151
+ }
152
+ copyFileSync(meta.dbPath, absOutput);
153
+ }
154
+ //# sourceMappingURL=collection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collection.js","sourceRoot":"","sources":["../src/collection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC3F,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAelC,gBAAgB;AAEhB,SAAS,UAAU;IACjB,OAAO,OAAO,CAAC,OAAO,EAAE,EAAE,MAAM,CAAC,CAAC;AACpC,CAAC;AAED,SAAS,eAAe;IACtB,OAAO,IAAI,CAAC,UAAU,EAAE,EAAE,kBAAkB,CAAC,CAAC;AAChD,CAAC;AAED,SAAS,iBAAiB;IACxB,OAAO,IAAI,CAAC,UAAU,EAAE,EAAE,aAAa,CAAC,CAAC;AAC3C,CAAC;AAED,uBAAuB;AAEvB,SAAS,YAAY;IACnB,MAAM,YAAY,GAAG,eAAe,EAAE,CAAC;IACvC,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC9B,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,GAAG,GAAG,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IAChD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAuB,CAAC;AAC/C,CAAC;AAED,SAAS,aAAa,CAAC,QAA4B;IACjD,MAAM,YAAY,GAAG,eAAe,EAAE,CAAC;IACvC,MAAM,GAAG,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAClC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACrB,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtC,CAAC;IACD,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AAC1E,CAAC;AAED,qBAAqB;AAErB,MAAM,qBAAqB,GAAG,kBAAkB,CAAC;AAEjD,SAAS,sBAAsB,CAAC,IAAY;IAC1C,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CACb,4BAA4B,IAAI,wEAAwE,CACzG,CAAC;IACJ,CAAC;AACH,CAAC;AAED,qBAAqB;AAErB,MAAM,UAAU,aAAa;IAC3B,MAAM,IAAI,GAAG,UAAU,EAAE,CAAC;IAC1B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,SAAS,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvC,CAAC;IACD,MAAM,cAAc,GAAG,iBAAiB,EAAE,CAAC;IAC3C,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QAChC,SAAS,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACjD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,sBAAsB,CAAC,IAAI,CAAC,CAAC;IAC7B,OAAO,IAAI,CAAC,iBAAiB,EAAE,EAAE,GAAG,IAAI,SAAS,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO,YAAY,EAAE,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;IAChC,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,IAAY,EACZ,UAAkB,EAClB,MAAe,EACf,aAAsB;IAEtB,aAAa,EAAE,CAAC;IAEhB,MAAM,WAAW,GAAG,MAAM,IAAI,mBAAmB,CAAC,IAAI,CAAC,CAAC;IACxD,MAAM,IAAI,GAAmB;QAC3B,MAAM,EAAE,WAAW;QACnB,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC;QAC/B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC;IACF,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;QAChC,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;IACrC,CAAC;IAED,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;IAChC,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACtB,aAAa,CAAC,QAAQ,CAAC,CAAC;IAExB,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,IAAY,EACZ,OAAuD;IAEvD,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;IAChC,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC5B,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CACb,eAAe,IAAI,8BAA8B,IAAI,iBAAiB,CACvE,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;QACxC,IAAI,OAAO,CAAC,aAAa,KAAK,EAAE,EAAE,CAAC;YACjC,OAAO,IAAI,CAAC,aAAa,CAAC;QAC5B,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;QAC7C,CAAC;IACH,CAAC;IAED,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACtB,aAAa,CAAC,QAAQ,CAAC,CAAC;IAExB,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;IAChC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAClC,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC;IACtB,aAAa,CAAC,QAAQ,CAAC,CAAC;IACxB,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IACjC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CACb,eAAe,IAAI,8BAA8B,IAAI,iBAAiB,CACvE,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC,MAAM,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,IAAY;IACtD,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IACjC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CACb,eAAe,IAAI,8BAA8B,IAAI,iBAAiB,CACvE,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC,UAAU,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,UAAkB,EAClB,QAAgB,EAChB,aAAqB;IAErB,MAAM,UAAU,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;IAC7C,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,sBAAsB,UAAU,cAAc,CAAC,CAAC;IAClE,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,8BAA8B,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,aAAa,EAAE,CAAC;IAEhB,MAAM,UAAU,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IACjD,YAAY,CAAC,UAAU,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAE5C,OAAO,kBAAkB,CAAC,QAAQ,EAAE,aAAa,EAAE,UAAU,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,IAAY,EACZ,UAAkB,EAClB,UAAkB;IAElB,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACtC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,0BAA0B,SAAS,EAAE,CAAC,CAAC;IACzD,CAAC;IAED,aAAa,EAAE,CAAC;IAEhB,MAAM,UAAU,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAC7C,YAAY,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IAEpC,OAAO,kBAAkB,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAY,EAAE,UAAkB;IAC/D,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IACjC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,eAAe,IAAI,cAAc,CAAC,CAAC;IACrD,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,uBAAuB,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IACxD,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAClC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACxB,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;IAED,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AACvC,CAAC"}
@@ -0,0 +1,95 @@
1
+ import { z } from "zod";
2
+ declare const EmbedderConfigSchema: z.ZodObject<{
3
+ provider: z.ZodDefault<z.ZodEnum<{
4
+ openai: "openai";
5
+ local: "local";
6
+ }>>;
7
+ model: z.ZodDefault<z.ZodString>;
8
+ api_key_env: z.ZodDefault<z.ZodString>;
9
+ dimensions: z.ZodDefault<z.ZodNumber>;
10
+ }, z.core.$strip>;
11
+ declare const LLMConfigSchema: z.ZodObject<{
12
+ provider: z.ZodDefault<z.ZodEnum<{
13
+ openai: "openai";
14
+ local: "local";
15
+ }>>;
16
+ model: z.ZodDefault<z.ZodString>;
17
+ api_key_env: z.ZodDefault<z.ZodString>;
18
+ }, z.core.$strip>;
19
+ declare const ChunkerConfigSchema: z.ZodObject<{
20
+ max_tokens: z.ZodDefault<z.ZodNumber>;
21
+ overlap: z.ZodDefault<z.ZodNumber>;
22
+ }, z.core.$strip>;
23
+ declare const ScannerConfigSchema: z.ZodObject<{
24
+ exclude: z.ZodDefault<z.ZodArray<z.ZodString>>;
25
+ max_file_size: z.ZodDefault<z.ZodNumber>;
26
+ }, z.core.$strip>;
27
+ declare const QSCConfigSchema: z.ZodObject<{
28
+ embedder: z.ZodPipe<z.ZodOptional<z.ZodObject<{
29
+ provider: z.ZodDefault<z.ZodEnum<{
30
+ openai: "openai";
31
+ local: "local";
32
+ }>>;
33
+ model: z.ZodDefault<z.ZodString>;
34
+ api_key_env: z.ZodDefault<z.ZodString>;
35
+ dimensions: z.ZodDefault<z.ZodNumber>;
36
+ }, z.core.$strip>>, z.ZodTransform<{
37
+ provider: "openai" | "local";
38
+ model: string;
39
+ api_key_env: string;
40
+ dimensions: number;
41
+ }, {
42
+ provider: "openai" | "local";
43
+ model: string;
44
+ api_key_env: string;
45
+ dimensions: number;
46
+ } | undefined>>;
47
+ llm: z.ZodPipe<z.ZodOptional<z.ZodObject<{
48
+ provider: z.ZodDefault<z.ZodEnum<{
49
+ openai: "openai";
50
+ local: "local";
51
+ }>>;
52
+ model: z.ZodDefault<z.ZodString>;
53
+ api_key_env: z.ZodDefault<z.ZodString>;
54
+ }, z.core.$strip>>, z.ZodTransform<{
55
+ provider: "openai" | "local";
56
+ model: string;
57
+ api_key_env: string;
58
+ }, {
59
+ provider: "openai" | "local";
60
+ model: string;
61
+ api_key_env: string;
62
+ } | undefined>>;
63
+ chunker: z.ZodPipe<z.ZodOptional<z.ZodObject<{
64
+ max_tokens: z.ZodDefault<z.ZodNumber>;
65
+ overlap: z.ZodDefault<z.ZodNumber>;
66
+ }, z.core.$strip>>, z.ZodTransform<{
67
+ max_tokens: number;
68
+ overlap: number;
69
+ }, {
70
+ max_tokens: number;
71
+ overlap: number;
72
+ } | undefined>>;
73
+ scanner: z.ZodPipe<z.ZodOptional<z.ZodObject<{
74
+ exclude: z.ZodDefault<z.ZodArray<z.ZodString>>;
75
+ max_file_size: z.ZodDefault<z.ZodNumber>;
76
+ }, z.core.$strip>>, z.ZodTransform<{
77
+ exclude: string[];
78
+ max_file_size: number;
79
+ }, {
80
+ exclude: string[];
81
+ max_file_size: number;
82
+ } | undefined>>;
83
+ }, z.core.$strip>;
84
+ export type QSCConfig = z.infer<typeof QSCConfigSchema>;
85
+ export type EmbedderConfig = z.infer<typeof EmbedderConfigSchema>;
86
+ export type LLMConfig = z.infer<typeof LLMConfigSchema>;
87
+ export type ChunkerConfig = z.infer<typeof ChunkerConfigSchema>;
88
+ export type ScannerConfig = z.infer<typeof ScannerConfigSchema>;
89
+ /**
90
+ * Load configuration from a qsc.yml file, apply environment variable
91
+ * overrides, validate with zod, and return the merged config with defaults.
92
+ */
93
+ export declare function loadConfig(basePath?: string): QSCConfig;
94
+ export {};
95
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAOxB,QAAA,MAAM,oBAAoB;;;;;;;;iBAKxB,CAAC;AAEH,QAAA,MAAM,eAAe;;;;;;;iBAInB,CAAC;AAEH,QAAA,MAAM,mBAAmB;;;iBAGvB,CAAC;AAEH,QAAA,MAAM,mBAAmB;;;iBAUvB,CAAC;AAEH,QAAA,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAanB,CAAC;AAEH,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AACxD,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAClE,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AACxD,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAChE,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAgDhE;;;GAGG;AACH,wBAAgB,UAAU,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAevD"}
@@ -0,0 +1,103 @@
1
+ import { z } from "zod";
2
+ import { readFileSync, existsSync } from "node:fs";
3
+ import { resolve } from "node:path";
4
+ import { parse as parseYaml } from "yaml";
5
+ // --- Zod schemas ---
6
+ const EmbedderConfigSchema = z.object({
7
+ provider: z.enum(["openai", "local"]).default("openai"),
8
+ model: z.string().default("text-embedding-3-small"),
9
+ api_key_env: z.string().default("OPENAI_API_KEY"),
10
+ dimensions: z.number().int().positive().default(1536),
11
+ });
12
+ const LLMConfigSchema = z.object({
13
+ provider: z.enum(["openai", "local"]).default("openai"),
14
+ model: z.string().default("gpt-4o-mini"),
15
+ api_key_env: z.string().default("OPENAI_API_KEY"),
16
+ });
17
+ const ChunkerConfigSchema = z.object({
18
+ max_tokens: z.number().int().positive().default(900),
19
+ overlap: z.number().min(0).max(1).default(0.15),
20
+ });
21
+ const ScannerConfigSchema = z.object({
22
+ exclude: z
23
+ .array(z.string())
24
+ .default([
25
+ "node_modules/**",
26
+ ".git/**",
27
+ "dist/**",
28
+ "*.min.js",
29
+ ]),
30
+ max_file_size: z.number().int().positive().default(1_048_576),
31
+ });
32
+ const QSCConfigSchema = z.object({
33
+ embedder: EmbedderConfigSchema.optional().transform((v) => EmbedderConfigSchema.parse(v ?? {})),
34
+ llm: LLMConfigSchema.optional().transform((v) => LLMConfigSchema.parse(v ?? {})),
35
+ chunker: ChunkerConfigSchema.optional().transform((v) => ChunkerConfigSchema.parse(v ?? {})),
36
+ scanner: ScannerConfigSchema.optional().transform((v) => ScannerConfigSchema.parse(v ?? {})),
37
+ });
38
+ // --- Environment variable overrides ---
39
+ function applyEnvOverrides(raw) {
40
+ const result = { ...raw };
41
+ // embedder overrides
42
+ const embedder = {
43
+ ...(result.embedder ?? {}),
44
+ };
45
+ if (process.env.QSC_EMBEDDER_PROVIDER)
46
+ embedder.provider = process.env.QSC_EMBEDDER_PROVIDER;
47
+ if (process.env.QSC_EMBEDDER_MODEL)
48
+ embedder.model = process.env.QSC_EMBEDDER_MODEL;
49
+ if (process.env.QSC_EMBEDDER_API_KEY_ENV)
50
+ embedder.api_key_env = process.env.QSC_EMBEDDER_API_KEY_ENV;
51
+ if (process.env.QSC_EMBEDDER_DIMENSIONS)
52
+ embedder.dimensions = Number(process.env.QSC_EMBEDDER_DIMENSIONS);
53
+ result.embedder = embedder;
54
+ // llm overrides
55
+ const llm = {
56
+ ...(result.llm ?? {}),
57
+ };
58
+ if (process.env.QSC_LLM_PROVIDER)
59
+ llm.provider = process.env.QSC_LLM_PROVIDER;
60
+ if (process.env.QSC_LLM_MODEL)
61
+ llm.model = process.env.QSC_LLM_MODEL;
62
+ if (process.env.QSC_LLM_API_KEY_ENV)
63
+ llm.api_key_env = process.env.QSC_LLM_API_KEY_ENV;
64
+ result.llm = llm;
65
+ // chunker overrides
66
+ const chunker = {
67
+ ...(result.chunker ?? {}),
68
+ };
69
+ if (process.env.QSC_CHUNKER_MAX_TOKENS)
70
+ chunker.max_tokens = Number(process.env.QSC_CHUNKER_MAX_TOKENS);
71
+ if (process.env.QSC_CHUNKER_OVERLAP)
72
+ chunker.overlap = Number(process.env.QSC_CHUNKER_OVERLAP);
73
+ result.chunker = chunker;
74
+ // scanner overrides
75
+ const scanner = {
76
+ ...(result.scanner ?? {}),
77
+ };
78
+ if (process.env.QSC_SCANNER_MAX_FILE_SIZE)
79
+ scanner.max_file_size = Number(process.env.QSC_SCANNER_MAX_FILE_SIZE);
80
+ result.scanner = scanner;
81
+ return result;
82
+ }
83
+ // --- Public API ---
84
+ const CONFIG_FILENAMES = ["qsc.yml", "qsc.yaml"];
85
+ /**
86
+ * Load configuration from a qsc.yml file, apply environment variable
87
+ * overrides, validate with zod, and return the merged config with defaults.
88
+ */
89
+ export function loadConfig(basePath) {
90
+ const dir = basePath ?? process.cwd();
91
+ let raw = {};
92
+ for (const name of CONFIG_FILENAMES) {
93
+ const filePath = resolve(dir, name);
94
+ if (existsSync(filePath)) {
95
+ const content = readFileSync(filePath, "utf-8");
96
+ raw = parseYaml(content) ?? {};
97
+ break;
98
+ }
99
+ }
100
+ const withEnv = applyEnvOverrides(raw);
101
+ return QSCConfigSchema.parse(withEnv);
102
+ }
103
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { EmbedderConfig } from "../config/index.js";
2
+ /**
3
+ * Embedder interface: converts text strings into vector embeddings.
4
+ */
5
+ export interface Embedder {
6
+ embed(texts: string[]): Promise<number[][]>;
7
+ readonly dimensions: number;
8
+ readonly modelName: string;
9
+ }
10
+ /**
11
+ * Factory function: creates an Embedder instance based on config.
12
+ */
13
+ export declare function createEmbedder(config: EmbedderConfig): Promise<Embedder>;
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/embedder/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzD;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC5C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,QAAQ,CAAC,CAa9E"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Factory function: creates an Embedder instance based on config.
3
+ */
4
+ export async function createEmbedder(config) {
5
+ switch (config.provider) {
6
+ case "openai": {
7
+ const { createOpenAIEmbedder } = await import("./openai.js");
8
+ return createOpenAIEmbedder(config);
9
+ }
10
+ case "local": {
11
+ const { createLocalEmbedder } = await import("./local.js");
12
+ return createLocalEmbedder(config);
13
+ }
14
+ default:
15
+ throw new Error(`Unknown embedder provider: ${config.provider}`);
16
+ }
17
+ }
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/embedder/index.ts"],"names":[],"mappings":"AAWA;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,MAAsB;IACzD,QAAQ,MAAM,CAAC,QAAQ,EAAE,CAAC;QACxB,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,EAAE,oBAAoB,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;YAC7D,OAAO,oBAAoB,CAAC,MAAM,CAAC,CAAC;QACtC,CAAC;QACD,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,EAAE,mBAAmB,EAAE,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;YAC3D,OAAO,mBAAmB,CAAC,MAAM,CAAC,CAAC;QACrC,CAAC;QACD;YACE,MAAM,IAAI,KAAK,CAAC,8BAA8B,MAAM,CAAC,QAAkB,EAAE,CAAC,CAAC;IAC/E,CAAC;AACH,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { EmbedderConfig } from "../config/index.js";
2
+ import type { Embedder } from "./index.js";
3
+ /**
4
+ * Creates a local model Embedder using node-llama-cpp.
5
+ *
6
+ * NOTE: This is a stub implementation. Full functionality requires
7
+ * node-llama-cpp to be installed and a GGUF model file available.
8
+ * The interface and structure are ready for when the environment supports it.
9
+ */
10
+ export declare function createLocalEmbedder(config: EmbedderConfig): Embedder;
11
+ //# sourceMappingURL=local.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../src/embedder/local.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,cAAc,GAAG,QAAQ,CA4DpE"}