@contextosai/core 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 (58) hide show
  1. package/LICENSE +21 -0
  2. package/dist/config.d.ts +10 -0
  3. package/dist/config.d.ts.map +1 -0
  4. package/dist/config.js +39 -0
  5. package/dist/config.js.map +1 -0
  6. package/dist/database.d.ts +24 -0
  7. package/dist/database.d.ts.map +1 -0
  8. package/dist/database.js +204 -0
  9. package/dist/database.js.map +1 -0
  10. package/dist/embeddings.d.ts +19 -0
  11. package/dist/embeddings.d.ts.map +1 -0
  12. package/dist/embeddings.js +102 -0
  13. package/dist/embeddings.js.map +1 -0
  14. package/dist/export.d.ts +6 -0
  15. package/dist/export.d.ts.map +1 -0
  16. package/dist/export.js +89 -0
  17. package/dist/export.js.map +1 -0
  18. package/dist/git-analyzer.d.ts +3 -0
  19. package/dist/git-analyzer.d.ts.map +1 -0
  20. package/dist/git-analyzer.js +88 -0
  21. package/dist/git-analyzer.js.map +1 -0
  22. package/dist/index.d.ts +14 -0
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +14 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/indexer.d.ts +29 -0
  27. package/dist/indexer.d.ts.map +1 -0
  28. package/dist/indexer.js +188 -0
  29. package/dist/indexer.js.map +1 -0
  30. package/dist/mcp.d.ts +2 -0
  31. package/dist/mcp.d.ts.map +1 -0
  32. package/dist/mcp.js +95 -0
  33. package/dist/mcp.js.map +1 -0
  34. package/dist/parser.d.ts +10 -0
  35. package/dist/parser.d.ts.map +1 -0
  36. package/dist/parser.js +212 -0
  37. package/dist/parser.js.map +1 -0
  38. package/dist/rules.d.ts +5 -0
  39. package/dist/rules.d.ts.map +1 -0
  40. package/dist/rules.js +166 -0
  41. package/dist/rules.js.map +1 -0
  42. package/dist/scanner.d.ts +8 -0
  43. package/dist/scanner.d.ts.map +1 -0
  44. package/dist/scanner.js +51 -0
  45. package/dist/scanner.js.map +1 -0
  46. package/dist/search.d.ts +3 -0
  47. package/dist/search.d.ts.map +1 -0
  48. package/dist/search.js +20 -0
  49. package/dist/search.js.map +1 -0
  50. package/dist/vectors.d.ts +21 -0
  51. package/dist/vectors.d.ts.map +1 -0
  52. package/dist/vectors.js +92 -0
  53. package/dist/vectors.js.map +1 -0
  54. package/dist/watcher.d.ts +16 -0
  55. package/dist/watcher.d.ts.map +1 -0
  56. package/dist/watcher.js +102 -0
  57. package/dist/watcher.js.map +1 -0
  58. package/package.json +71 -0
package/dist/parser.js ADDED
@@ -0,0 +1,212 @@
1
+ const IMPORT_RE = /(?:import\s+(?:type\s+)?(?:[\w*{}\s,]+\s+from\s+)?['"]([^'"]+)['"]|require\(['"]([^'"]+)['"]\)|from\s+([\w.]+)\s+import)/g;
2
+ const EXPORT_RE = /export\s+(?:default\s+)?(?:async\s+)?(?:function|class|const|let|var|type|interface|enum)\s+(\w+)/g;
3
+ const CLASS_RE = /(?:export\s+)?(?:abstract\s+)?class\s+(\w+)/g;
4
+ const FUNCTION_RE = /(?:export\s+)?(?:async\s+)?function\s+(\w+)|(?:const|let|var)\s+(\w+)\s*=\s*(?:async\s+)?(?:\([^)]*\)|[\w]+)\s*=>/g;
5
+ const COMMENT_RE = /\/\*\*?[\s\S]*?\*\/|\/\/.*$/gm;
6
+ const PY_IMPORT_RE = /^(?:from\s+(\S+)\s+import|import\s+(\S+))/gm;
7
+ const PY_CLASS_RE = /^class\s+(\w+)/gm;
8
+ const PY_FUNCTION_RE = /^def\s+(\w+)/gm;
9
+ const GO_IMPORT_RE = /import\s+(?:\([\s\S]*?\)|"([^"]+)")/g;
10
+ const GO_FUNC_RE = /^func\s+(?:\([^)]+\)\s+)?(\w+)/gm;
11
+ const JAVA_IMPORT_RE = /^import\s+([\w.]+);/gm;
12
+ const JAVA_CLASS_RE = /(?:public\s+)?(?:abstract\s+)?class\s+(\w+)/g;
13
+ function unique(items) {
14
+ return [...new Set(items.filter(Boolean))];
15
+ }
16
+ function parseWithRegex(content, extension) {
17
+ const imports = [];
18
+ const exports = [];
19
+ const classes = [];
20
+ const functions = [];
21
+ const comments = [];
22
+ const commentMatches = content.match(COMMENT_RE);
23
+ if (commentMatches)
24
+ comments.push(...commentMatches.map((c) => c.trim()));
25
+ if (['.ts', '.tsx', '.js', '.jsx', '.md', '.mdx'].includes(extension)) {
26
+ let m;
27
+ while ((m = IMPORT_RE.exec(content)) !== null) {
28
+ imports.push(m[1] ?? m[2] ?? m[3] ?? '');
29
+ }
30
+ while ((m = EXPORT_RE.exec(content)) !== null) {
31
+ exports.push(m[1] ?? '');
32
+ }
33
+ while ((m = CLASS_RE.exec(content)) !== null) {
34
+ classes.push(m[1] ?? '');
35
+ }
36
+ while ((m = FUNCTION_RE.exec(content)) !== null) {
37
+ functions.push(m[1] ?? m[2] ?? '');
38
+ }
39
+ }
40
+ else if (extension === '.py') {
41
+ let m;
42
+ while ((m = PY_IMPORT_RE.exec(content)) !== null) {
43
+ imports.push(m[1] ?? m[2] ?? '');
44
+ }
45
+ while ((m = PY_CLASS_RE.exec(content)) !== null) {
46
+ classes.push(m[1] ?? '');
47
+ }
48
+ while ((m = PY_FUNCTION_RE.exec(content)) !== null) {
49
+ functions.push(m[1] ?? '');
50
+ }
51
+ }
52
+ else if (extension === '.go') {
53
+ let m;
54
+ while ((m = GO_IMPORT_RE.exec(content)) !== null) {
55
+ if (m[1])
56
+ imports.push(m[1]);
57
+ }
58
+ while ((m = GO_FUNC_RE.exec(content)) !== null) {
59
+ functions.push(m[1] ?? '');
60
+ }
61
+ }
62
+ else if (extension === '.java') {
63
+ let m;
64
+ while ((m = JAVA_IMPORT_RE.exec(content)) !== null) {
65
+ imports.push(m[1] ?? '');
66
+ }
67
+ while ((m = JAVA_CLASS_RE.exec(content)) !== null) {
68
+ classes.push(m[1] ?? '');
69
+ }
70
+ }
71
+ return {
72
+ imports: unique(imports),
73
+ exports: unique(exports),
74
+ classes: unique(classes),
75
+ functions: unique(functions),
76
+ comments: unique(comments),
77
+ };
78
+ }
79
+ // Tree-sitter WASM parser (optional; regex fallback below)
80
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
81
+ let ParserClass = null;
82
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
83
+ let tsLang = null;
84
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
85
+ let jsLang = null;
86
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
87
+ let pyLang = null;
88
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
89
+ let tsxLang = null;
90
+ let parserInitialized = false;
91
+ function hasSymbols(symbols) {
92
+ return (symbols.imports.length > 0 ||
93
+ symbols.exports.length > 0 ||
94
+ symbols.classes.length > 0 ||
95
+ symbols.functions.length > 0);
96
+ }
97
+ async function initTreeSitter() {
98
+ if (parserInitialized)
99
+ return ParserClass !== null;
100
+ parserInitialized = true;
101
+ try {
102
+ const mod = await import('web-tree-sitter');
103
+ ParserClass = mod.default;
104
+ await ParserClass.init();
105
+ const { createRequire } = await import('node:module');
106
+ const require = createRequire(import.meta.url);
107
+ tsLang = await ParserClass.Language.load(require.resolve('tree-sitter-typescript/tree-sitter-typescript.wasm'));
108
+ try {
109
+ tsxLang = await ParserClass.Language.load(require.resolve('tree-sitter-typescript/tree-sitter-tsx.wasm'));
110
+ }
111
+ catch {
112
+ tsxLang = tsLang;
113
+ }
114
+ jsLang = await ParserClass.Language.load(require.resolve('tree-sitter-javascript/tree-sitter-javascript.wasm'));
115
+ pyLang = await ParserClass.Language.load(require.resolve('tree-sitter-python/tree-sitter-python.wasm'));
116
+ return true;
117
+ }
118
+ catch {
119
+ return false;
120
+ }
121
+ }
122
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
123
+ function extractFromTree(node, symbols) {
124
+ const type = node.type;
125
+ if (type === 'import_statement' || type === 'import_declaration') {
126
+ const text = node.text.trim();
127
+ if (text)
128
+ symbols.imports.push(text);
129
+ }
130
+ if (type === 'export_statement') {
131
+ const text = node.text.trim();
132
+ if (text)
133
+ symbols.exports.push(text);
134
+ }
135
+ if (type === 'class_declaration' || type === 'class_definition') {
136
+ const nameNode = node.childForFieldName('name');
137
+ if (nameNode)
138
+ symbols.classes.push(nameNode.text);
139
+ }
140
+ if (type === 'function_declaration' || type === 'function_definition') {
141
+ const nameNode = node.childForFieldName('name');
142
+ if (nameNode)
143
+ symbols.functions.push(nameNode.text);
144
+ }
145
+ if (type === 'comment') {
146
+ symbols.comments.push(node.text.trim());
147
+ }
148
+ for (let i = 0; i < node.childCount; i++) {
149
+ const child = node.child(i);
150
+ if (child)
151
+ extractFromTree(child, symbols);
152
+ }
153
+ }
154
+ async function parseWithTreeSitter(content, extension) {
155
+ const ready = await initTreeSitter();
156
+ if (!ready || !ParserClass)
157
+ return null;
158
+ let lang = null;
159
+ if (extension === '.tsx')
160
+ lang = tsxLang ?? tsLang;
161
+ else if (extension === '.ts')
162
+ lang = tsLang;
163
+ else if (['.js', '.jsx'].includes(extension))
164
+ lang = jsLang;
165
+ else if (extension === '.py')
166
+ lang = pyLang;
167
+ if (!lang)
168
+ return null;
169
+ const parser = new ParserClass();
170
+ parser.setLanguage(lang);
171
+ const tree = parser.parse(content);
172
+ const symbols = {
173
+ imports: [],
174
+ exports: [],
175
+ classes: [],
176
+ functions: [],
177
+ comments: [],
178
+ };
179
+ extractFromTree(tree.rootNode, symbols);
180
+ return {
181
+ imports: unique(symbols.imports),
182
+ exports: unique(symbols.exports),
183
+ classes: unique(symbols.classes),
184
+ functions: unique(symbols.functions),
185
+ comments: unique(symbols.comments),
186
+ };
187
+ }
188
+ export async function parseFile(content, extension) {
189
+ const treeResult = await parseWithTreeSitter(content, extension);
190
+ if (treeResult && hasSymbols(treeResult))
191
+ return treeResult;
192
+ return parseWithRegex(content, extension);
193
+ }
194
+ export function generateSummary(path, symbols, content) {
195
+ const parts = [`File: ${path}`];
196
+ if (symbols.classes.length)
197
+ parts.push(`Classes: ${symbols.classes.join(', ')}`);
198
+ if (symbols.functions.length)
199
+ parts.push(`Functions: ${symbols.functions.slice(0, 10).join(', ')}`);
200
+ if (symbols.imports.length)
201
+ parts.push(`Imports: ${symbols.imports.slice(0, 8).join(', ')}`);
202
+ if (path.endsWith('README.md') || path.endsWith('.md')) {
203
+ parts.push(content.slice(0, 500));
204
+ }
205
+ else if (symbols.comments.length) {
206
+ const docComment = symbols.comments.find((c) => c.startsWith('/**') || c.startsWith('"""'));
207
+ if (docComment)
208
+ parts.push(docComment.slice(0, 300));
209
+ }
210
+ return parts.join('\n');
211
+ }
212
+ //# sourceMappingURL=parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { ArchitectureRule, FileMetadata } from '@contextosai/shared';
2
+ export declare function extractArchitectureRules(rootPath: string, files: FileMetadata[]): ArchitectureRule[];
3
+ export declare function generateProjectMemory(rootPath: string, rules: ArchitectureRule[], files: FileMetadata[]): string;
4
+ export declare function writeProjectMemory(rootPath: string, content: string): void;
5
+ //# sourceMappingURL=rules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules.d.ts","sourceRoot":"","sources":["../src/rules.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AA8H1E,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,YAAY,EAAE,GACpB,gBAAgB,EAAE,CAoBpB;AAED,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,gBAAgB,EAAE,EACzB,KAAK,EAAE,YAAY,EAAE,GACpB,MAAM,CAmCR;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAG1E"}
package/dist/rules.js ADDED
@@ -0,0 +1,166 @@
1
+ import { readFileSync, writeFileSync, existsSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { FRAMEWORK_DEPS, FRAMEWORK_PATTERNS, PROJECT_MEMORY_FILE } from '@contextosai/shared';
4
+ import { generateId } from './config.js';
5
+ import { getContextOSPath } from './config.js';
6
+ const CONVENTION_RULES = [
7
+ {
8
+ name: 'Server Actions',
9
+ description: 'Use server actions for mutations.',
10
+ detect: (files) => files.some((f) => f.path.includes('actions') || f.summary?.includes("'use server'")),
11
+ confidence: 0.85,
12
+ },
13
+ {
14
+ name: 'App Router',
15
+ description: 'Use Next.js App Router (app/ directory).',
16
+ detect: (files) => files.some((f) => f.path.startsWith('app/')),
17
+ confidence: 0.9,
18
+ },
19
+ {
20
+ name: 'Colocated Tests',
21
+ description: 'Tests are colocated with source files.',
22
+ detect: (files) => files.some((f) => f.path.includes('.test.') || f.path.includes('.spec.')),
23
+ confidence: 0.8,
24
+ },
25
+ ];
26
+ function readPackageJson(rootPath) {
27
+ const pkgPath = join(rootPath, 'package.json');
28
+ if (!existsSync(pkgPath))
29
+ return null;
30
+ try {
31
+ return JSON.parse(readFileSync(pkgPath, 'utf-8'));
32
+ }
33
+ catch {
34
+ return null;
35
+ }
36
+ }
37
+ function detectFrameworks(rootPath, files) {
38
+ const rules = [];
39
+ const codeFiles = files.filter((f) => !f.path.endsWith('.md') && !f.path.endsWith('.mdx'));
40
+ const allContent = codeFiles
41
+ .slice(0, 100)
42
+ .map((f) => {
43
+ try {
44
+ return readFileSync(join(rootPath, f.path), 'utf-8');
45
+ }
46
+ catch {
47
+ return '';
48
+ }
49
+ })
50
+ .join('\n');
51
+ const pkg = readPackageJson(rootPath);
52
+ const deps = {
53
+ ...pkg?.dependencies,
54
+ ...pkg?.devDependencies,
55
+ };
56
+ for (const [framework, patterns] of Object.entries(FRAMEWORK_PATTERNS)) {
57
+ const depKeys = FRAMEWORK_DEPS[framework] ?? [];
58
+ const depMatch = depKeys.some((d) => d in (deps ?? {}));
59
+ const patternMatch = patterns.some((p) => p.test(allContent));
60
+ if (!depMatch && !patternMatch)
61
+ continue;
62
+ // Require dependency match unless pattern found in actual code files
63
+ if (!depMatch && !patternMatch)
64
+ continue;
65
+ if (!depMatch && patternMatch) {
66
+ // Regex-only in code — lower confidence, skip doc-driven false positives
67
+ const version = depKeys.find((d) => deps?.[d]) ?? '';
68
+ rules.push({
69
+ id: generateId(),
70
+ category: 'framework',
71
+ name: framework,
72
+ description: `Uses ${framework}`,
73
+ confidence: 0.65,
74
+ });
75
+ continue;
76
+ }
77
+ const matchedDep = depKeys.find((d) => deps?.[d]);
78
+ const version = matchedDep ? deps?.[matchedDep] : '';
79
+ rules.push({
80
+ id: generateId(),
81
+ category: 'framework',
82
+ name: framework,
83
+ description: version ? `${framework} ${version}` : `Uses ${framework}`,
84
+ confidence: depMatch && patternMatch ? 0.95 : 0.85,
85
+ });
86
+ }
87
+ return rules;
88
+ }
89
+ function detectImportantModules(files) {
90
+ const modulePatterns = [
91
+ { pattern: /(?:lib|src)\/auth/i, name: 'Authentication', desc: 'Authentication module' },
92
+ { pattern: /(?:lib|src)\/payment/i, name: 'Payments', desc: 'Payments module' },
93
+ { pattern: /(?:lib|src)\/db/i, name: 'Database', desc: 'Database layer' },
94
+ { pattern: /(?:lib|src)\/api/i, name: 'API', desc: 'API layer' },
95
+ { pattern: /components\/ui/i, name: 'UI Components', desc: 'Shared UI components (shadcn/ui)' },
96
+ ];
97
+ const rules = [];
98
+ for (const { pattern, name, desc } of modulePatterns) {
99
+ const matching = files.filter((f) => pattern.test(f.path));
100
+ if (matching.length > 0) {
101
+ const dir = matching[0].path.split('/').slice(0, 2).join('/');
102
+ rules.push({
103
+ id: generateId(),
104
+ category: 'module',
105
+ name,
106
+ description: `${desc}: ${dir}`,
107
+ confidence: 0.85,
108
+ });
109
+ }
110
+ }
111
+ return rules;
112
+ }
113
+ export function extractArchitectureRules(rootPath, files) {
114
+ const rules = [
115
+ ...detectFrameworks(rootPath, files),
116
+ ...detectImportantModules(files),
117
+ ];
118
+ const pkg = readPackageJson(rootPath);
119
+ for (const conv of CONVENTION_RULES) {
120
+ if (conv.detect(files, pkg)) {
121
+ rules.push({
122
+ id: generateId(),
123
+ category: 'convention',
124
+ name: conv.name,
125
+ description: conv.description,
126
+ confidence: conv.confidence,
127
+ });
128
+ }
129
+ }
130
+ return rules;
131
+ }
132
+ export function generateProjectMemory(rootPath, rules, files) {
133
+ const frameworks = rules.filter((r) => r.category === 'framework');
134
+ const conventions = rules.filter((r) => r.category === 'convention');
135
+ const modules = rules.filter((r) => r.category === 'module');
136
+ const lines = ['# Project Overview', ''];
137
+ if (frameworks.length) {
138
+ const primary = frameworks[0];
139
+ lines.push(`Framework: ${primary?.name}${primary?.description.includes(primary.name) ? '' : ''}`);
140
+ if (primary?.description && !primary.description.startsWith('Uses')) {
141
+ lines.push(`Version: ${primary.description.replace(/^Next\.js\s*/, '')}`);
142
+ }
143
+ lines.push('');
144
+ }
145
+ lines.push('## Architecture Rules', '');
146
+ for (const rule of [...frameworks, ...conventions]) {
147
+ lines.push(`* ${rule.description}`);
148
+ }
149
+ lines.push('');
150
+ if (modules.length) {
151
+ lines.push('## Important modules', '');
152
+ for (const mod of modules) {
153
+ lines.push(`* ${mod.name}: ${mod.description}`);
154
+ }
155
+ lines.push('');
156
+ }
157
+ lines.push('## Indexed Files', '');
158
+ lines.push(`Total: ${files.length} files`);
159
+ lines.push('');
160
+ return lines.join('\n');
161
+ }
162
+ export function writeProjectMemory(rootPath, content) {
163
+ const path = join(getContextOSPath(rootPath), PROJECT_MEMORY_FILE);
164
+ writeFileSync(path, content, 'utf-8');
165
+ }
166
+ //# sourceMappingURL=rules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules.js","sourceRoot":"","sources":["../src/rules.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export interface ScannedFile {
2
+ absolutePath: string;
3
+ relativePath: string;
4
+ extension: string;
5
+ size: number;
6
+ }
7
+ export declare function scanRepository(rootPath: string): ScannedFile[];
8
+ //# sourceMappingURL=scanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../src/scanner.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,WAAW;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd;AAOD,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,EAAE,CAuC9D"}
@@ -0,0 +1,51 @@
1
+ import { readdirSync, statSync } from 'node:fs';
2
+ import { join, relative, extname } from 'node:path';
3
+ import { IGNORED_DIRS, IGNORED_FILE_PATTERNS, SUPPORTED_EXTENSIONS, } from '@contextosai/shared';
4
+ function shouldIgnore(name, isDir) {
5
+ if (isDir && IGNORED_DIRS.has(name))
6
+ return true;
7
+ return IGNORED_FILE_PATTERNS.some((p) => p.test(name));
8
+ }
9
+ export function scanRepository(rootPath) {
10
+ const results = [];
11
+ function walk(dir) {
12
+ let entries;
13
+ try {
14
+ entries = readdirSync(dir);
15
+ }
16
+ catch {
17
+ return;
18
+ }
19
+ for (const entry of entries) {
20
+ const fullPath = join(dir, entry);
21
+ let stat;
22
+ try {
23
+ stat = statSync(fullPath);
24
+ }
25
+ catch {
26
+ continue;
27
+ }
28
+ if (stat.isDirectory()) {
29
+ if (shouldIgnore(entry, true))
30
+ continue;
31
+ walk(fullPath);
32
+ }
33
+ else if (stat.isFile()) {
34
+ if (shouldIgnore(entry, false))
35
+ continue;
36
+ const ext = extname(entry).toLowerCase();
37
+ if (!SUPPORTED_EXTENSIONS.has(ext))
38
+ continue;
39
+ results.push({
40
+ absolutePath: fullPath,
41
+ relativePath: relative(rootPath, fullPath),
42
+ extension: ext,
43
+ size: stat.size,
44
+ });
45
+ }
46
+ }
47
+ }
48
+ walk(rootPath);
49
+ return results;
50
+ }
51
+ //# sourceMappingURL=scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanner.js","sourceRoot":"","sources":["../src/scanner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EACL,YAAY,EACZ,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,qBAAqB,CAAC;AAS7B,SAAS,YAAY,CAAC,IAAY,EAAE,KAAc;IAChD,IAAI,KAAK,IAAI,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACjD,OAAO,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,QAAgB;IAC7C,MAAM,OAAO,GAAkB,EAAE,CAAC;IAElC,SAAS,IAAI,CAAC,GAAW;QACvB,IAAI,OAAiB,CAAC;QACtB,IAAI,CAAC;YACH,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;QAC7B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;QACT,CAAC;QAED,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAClC,IAAI,IAAI,CAAC;YACT,IAAI,CAAC;gBACH,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAC5B,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;YAED,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;gBACvB,IAAI,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC;oBAAE,SAAS;gBACxC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACjB,CAAC;iBAAM,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;gBACzB,IAAI,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC;oBAAE,SAAS;gBACzC,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;gBACzC,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,GAAG,CAAC;oBAAE,SAAS;gBAC7C,OAAO,CAAC,IAAI,CAAC;oBACX,YAAY,EAAE,QAAQ;oBACtB,YAAY,EAAE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;oBAC1C,SAAS,EAAE,GAAG;oBACd,IAAI,EAAE,IAAI,CAAC,IAAI;iBAChB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,CAAC,QAAQ,CAAC,CAAC;IACf,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { SearchResult } from '@contextosai/shared';
2
+ export declare function searchRepository(rootPath: string, query: string, limit?: number): Promise<SearchResult[]>;
3
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../src/search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AASxD,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,KAAK,SAAK,GACT,OAAO,CAAC,YAAY,EAAE,CAAC,CAiBzB"}
package/dist/search.js ADDED
@@ -0,0 +1,20 @@
1
+ import { loadConfig } from './config.js';
2
+ import { createEmbeddingProvider, validateEmbeddingDimensions, } from './embeddings.js';
3
+ import { ContextDatabase } from './database.js';
4
+ import { VectorStore } from './vectors.js';
5
+ export async function searchRepository(rootPath, query, limit = 10) {
6
+ const config = loadConfig(rootPath);
7
+ const db = new ContextDatabase(rootPath);
8
+ const indexDimensions = config.vectorDimensions ??
9
+ (parseInt(db.getMeta('vectorDimensions') ?? '', 10) || undefined);
10
+ db.close();
11
+ const embedder = await createEmbeddingProvider(config, { probe: false });
12
+ validateEmbeddingDimensions(indexDimensions, embedder.dimensions);
13
+ const vectors = new VectorStore(rootPath);
14
+ await vectors.init();
15
+ const queryVector = await embedder.embed(query);
16
+ const results = await vectors.search(queryVector, limit);
17
+ await vectors.close();
18
+ return results;
19
+ }
20
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../src/search.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EACL,uBAAuB,EACvB,2BAA2B,GAC5B,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,QAAgB,EAChB,KAAa,EACb,KAAK,GAAG,EAAE;IAEV,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IACpC,MAAM,EAAE,GAAG,IAAI,eAAe,CAAC,QAAQ,CAAC,CAAC;IACzC,MAAM,eAAe,GACnB,MAAM,CAAC,gBAAgB;QACvB,CAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,CAAC,kBAAkB,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,SAAS,CAAC,CAAC;IACpE,EAAE,CAAC,KAAK,EAAE,CAAC;IAEX,MAAM,QAAQ,GAAG,MAAM,uBAAuB,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IACzE,2BAA2B,CAAC,eAAe,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;IAElE,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC1C,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;IACrB,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAChD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IACzD,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;IACtB,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { SearchResult } from '@contextosai/shared';
2
+ type VectorRecord = Record<string, unknown> & {
3
+ id: string;
4
+ path: string;
5
+ summary: string;
6
+ vector: number[];
7
+ };
8
+ export declare function cosineDistanceToScore(distance: number): number;
9
+ export declare class VectorStore {
10
+ private db;
11
+ private table;
12
+ private readonly lancePath;
13
+ constructor(rootPath: string);
14
+ init(): Promise<void>;
15
+ upsert(record: VectorRecord): Promise<void>;
16
+ deleteByPath(path: string): Promise<void>;
17
+ search(queryVector: number[], limit?: number): Promise<SearchResult[]>;
18
+ close(): Promise<void>;
19
+ }
20
+ export {};
21
+ //# sourceMappingURL=vectors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vectors.d.ts","sourceRoot":"","sources":["../src/vectors.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAKxD,KAAK,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IAC5C,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB,CAAC;AAEF,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE9D;AAMD,qBAAa,WAAW;IACtB,OAAO,CAAC,EAAE,CAAmC;IAC7C,OAAO,CAAC,KAAK,CAA8B;IAC3C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEvB,QAAQ,EAAE,MAAM;IAMtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAQrB,MAAM,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAa3C,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAezC,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,KAAK,SAAK,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IA2BlE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAI7B"}
@@ -0,0 +1,92 @@
1
+ import * as lancedb from '@lancedb/lancedb';
2
+ import { join } from 'node:path';
3
+ import { existsSync, mkdirSync } from 'node:fs';
4
+ import { CONTEXTOS_LANCE } from '@contextosai/shared';
5
+ import { getContextOSPath } from './config.js';
6
+ const TABLE_NAME = 'embeddings';
7
+ export function cosineDistanceToScore(distance) {
8
+ return Math.max(0, Math.min(1, 1 - distance / 2));
9
+ }
10
+ function escapePath(path) {
11
+ return path.replace(/'/g, "''");
12
+ }
13
+ export class VectorStore {
14
+ db = null;
15
+ table = null;
16
+ lancePath;
17
+ constructor(rootPath) {
18
+ const dir = getContextOSPath(rootPath);
19
+ if (!existsSync(dir))
20
+ mkdirSync(dir, { recursive: true });
21
+ this.lancePath = join(dir, CONTEXTOS_LANCE);
22
+ }
23
+ async init() {
24
+ this.db = await lancedb.connect(this.lancePath);
25
+ const tables = await this.db.tableNames();
26
+ if (tables.includes(TABLE_NAME)) {
27
+ this.table = await this.db.openTable(TABLE_NAME);
28
+ }
29
+ }
30
+ async upsert(record) {
31
+ if (!this.db)
32
+ await this.init();
33
+ if (!this.db)
34
+ throw new Error('Vector store not initialized');
35
+ if (!this.table) {
36
+ this.table = await this.db.createTable(TABLE_NAME, [record]);
37
+ return;
38
+ }
39
+ await this.deleteByPath(record.path);
40
+ await this.table.add([record]);
41
+ }
42
+ async deleteByPath(path) {
43
+ if (!this.table) {
44
+ if (!this.db)
45
+ await this.init();
46
+ if (!this.db)
47
+ return;
48
+ const tables = await this.db.tableNames();
49
+ if (!tables.includes(TABLE_NAME))
50
+ return;
51
+ this.table = await this.db.openTable(TABLE_NAME);
52
+ }
53
+ try {
54
+ await this.table.delete(`path = '${escapePath(path)}'`);
55
+ }
56
+ catch {
57
+ // ignore
58
+ }
59
+ }
60
+ async search(queryVector, limit = 10) {
61
+ if (!this.table) {
62
+ if (!this.db)
63
+ await this.init();
64
+ if (!this.db)
65
+ return [];
66
+ const tables = await this.db.tableNames();
67
+ if (!tables.includes(TABLE_NAME))
68
+ return [];
69
+ this.table = await this.db.openTable(TABLE_NAME);
70
+ }
71
+ const results = await this.table
72
+ .vectorSearch(queryVector)
73
+ .distanceType('cosine')
74
+ .limit(limit)
75
+ .toArray();
76
+ return results.map((row) => {
77
+ const r = row;
78
+ const distance = r._distance ?? 2;
79
+ return {
80
+ path: r.path,
81
+ score: cosineDistanceToScore(distance),
82
+ summary: r.summary ?? '',
83
+ snippet: (r.summary ?? '').slice(0, 200),
84
+ };
85
+ });
86
+ }
87
+ async close() {
88
+ this.table = null;
89
+ this.db = null;
90
+ }
91
+ }
92
+ //# sourceMappingURL=vectors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vectors.js","sourceRoot":"","sources":["../src/vectors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,UAAU,GAAG,YAAY,CAAC;AAShC,MAAM,UAAU,qBAAqB,CAAC,QAAgB;IACpD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC;AACpD,CAAC;AAED,SAAS,UAAU,CAAC,IAAY;IAC9B,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,OAAO,WAAW;IACd,EAAE,GAA8B,IAAI,CAAC;IACrC,KAAK,GAAyB,IAAI,CAAC;IAC1B,SAAS,CAAS;IAEnC,YAAY,QAAgB;QAC1B,MAAM,GAAG,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QACvC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,EAAE,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC;QAC1C,IAAI,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YAChC,IAAI,CAAC,KAAK,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,MAAoB;QAC/B,IAAI,CAAC,IAAI,CAAC,EAAE;YAAE,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAChC,IAAI,CAAC,IAAI,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAE9D,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,KAAK,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;YAC7D,OAAO;QACT,CAAC;QAED,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,IAAc,CAAC,CAAC;QAC/C,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,IAAY;QAC7B,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,IAAI,CAAC,EAAE;gBAAE,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;YAChC,IAAI,CAAC,IAAI,CAAC,EAAE;gBAAE,OAAO;YACrB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC;YAC1C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC;gBAAE,OAAO;YACzC,IAAI,CAAC,KAAK,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACnD,CAAC;QACD,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,KAAM,CAAC,MAAM,CAAC,WAAW,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC3D,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,WAAqB,EAAE,KAAK,GAAG,EAAE;QAC5C,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,IAAI,CAAC,EAAE;gBAAE,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;YAChC,IAAI,CAAC,IAAI,CAAC,EAAE;gBAAE,OAAO,EAAE,CAAC;YACxB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC;YAC1C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC;gBAAE,OAAO,EAAE,CAAC;YAC5C,IAAI,CAAC,KAAK,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACnD,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,KAAM;aAC9B,YAAY,CAAC,WAAW,CAAC;aACzB,YAAY,CAAC,QAAQ,CAAC;aACtB,KAAK,CAAC,KAAK,CAAC;aACZ,OAAO,EAAE,CAAC;QAEb,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;YACzB,MAAM,CAAC,GAAG,GAA8B,CAAC;YACzC,MAAM,QAAQ,GAAI,CAAC,CAAC,SAAoB,IAAI,CAAC,CAAC;YAC9C,OAAO;gBACL,IAAI,EAAE,CAAC,CAAC,IAAc;gBACtB,KAAK,EAAE,qBAAqB,CAAC,QAAQ,CAAC;gBACtC,OAAO,EAAG,CAAC,CAAC,OAAkB,IAAI,EAAE;gBACpC,OAAO,EAAE,CAAE,CAAC,CAAC,OAAkB,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;aACrD,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC;IACjB,CAAC;CACF"}