@zilliz/claude-context-core 0.1.11 → 0.1.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -2
- package/dist/.tsbuildinfo +1 -1
- package/dist/context.abort.test.d.ts +2 -0
- package/dist/context.abort.test.d.ts.map +1 -0
- package/dist/context.abort.test.js +212 -0
- package/dist/context.abort.test.js.map +1 -0
- package/dist/context.d.ts +25 -2
- package/dist/context.d.ts.map +1 -1
- package/dist/context.ignore-patterns.test.js +145 -14
- package/dist/context.ignore-patterns.test.js.map +1 -1
- package/dist/context.js +126 -32
- package/dist/context.js.map +1 -1
- package/dist/context.splitter.test.d.ts +2 -0
- package/dist/context.splitter.test.d.ts.map +1 -0
- package/dist/context.splitter.test.js +202 -0
- package/dist/context.splitter.test.js.map +1 -0
- package/dist/embedding/gemini-embedding.d.ts +9 -6
- package/dist/embedding/gemini-embedding.d.ts.map +1 -1
- package/dist/embedding/gemini-embedding.js +31 -16
- package/dist/embedding/gemini-embedding.js.map +1 -1
- package/dist/embedding/gemini-embedding.test.d.ts +2 -0
- package/dist/embedding/gemini-embedding.test.d.ts.map +1 -0
- package/dist/embedding/gemini-embedding.test.js +105 -0
- package/dist/embedding/gemini-embedding.test.js.map +1 -0
- package/dist/sync/synchronizer.d.ts +1 -0
- package/dist/sync/synchronizer.d.ts.map +1 -1
- package/dist/sync/synchronizer.js +32 -33
- package/dist/sync/synchronizer.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.abort.test.d.ts","sourceRoot":"","sources":["../src/context.abort.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
const fs = __importStar(require("fs/promises"));
|
|
37
|
+
const os = __importStar(require("os"));
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
const context_1 = require("./context");
|
|
40
|
+
const embedding_1 = require("./embedding");
|
|
41
|
+
class TestEmbedding extends embedding_1.Embedding {
|
|
42
|
+
constructor() {
|
|
43
|
+
super(...arguments);
|
|
44
|
+
this.maxTokens = 8192;
|
|
45
|
+
}
|
|
46
|
+
async detectDimension() {
|
|
47
|
+
return 3;
|
|
48
|
+
}
|
|
49
|
+
async embed(_text) {
|
|
50
|
+
return { vector: [1, 0, 0], dimension: 3 };
|
|
51
|
+
}
|
|
52
|
+
async embedBatch(texts) {
|
|
53
|
+
return texts.map(() => ({ vector: [1, 0, 0], dimension: 3 }));
|
|
54
|
+
}
|
|
55
|
+
getDimension() {
|
|
56
|
+
return 3;
|
|
57
|
+
}
|
|
58
|
+
getProvider() {
|
|
59
|
+
return 'test';
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
class CountingSplitter {
|
|
63
|
+
constructor(onCall) {
|
|
64
|
+
this.onCall = onCall;
|
|
65
|
+
this.calls = 0;
|
|
66
|
+
}
|
|
67
|
+
async split(code, language, filePath) {
|
|
68
|
+
this.calls += 1;
|
|
69
|
+
this.onCall?.(this.calls);
|
|
70
|
+
return [{
|
|
71
|
+
content: code,
|
|
72
|
+
metadata: {
|
|
73
|
+
startLine: 1,
|
|
74
|
+
endLine: code.split('\n').length,
|
|
75
|
+
language,
|
|
76
|
+
filePath,
|
|
77
|
+
},
|
|
78
|
+
}];
|
|
79
|
+
}
|
|
80
|
+
setChunkSize() { }
|
|
81
|
+
setChunkOverlap() { }
|
|
82
|
+
}
|
|
83
|
+
const createVectorDatabase = () => ({
|
|
84
|
+
createCollection: jest.fn().mockResolvedValue(undefined),
|
|
85
|
+
createHybridCollection: jest.fn().mockResolvedValue(undefined),
|
|
86
|
+
dropCollection: jest.fn().mockResolvedValue(undefined),
|
|
87
|
+
hasCollection: jest.fn().mockResolvedValue(false),
|
|
88
|
+
listCollections: jest.fn().mockResolvedValue([]),
|
|
89
|
+
insert: jest.fn().mockResolvedValue(undefined),
|
|
90
|
+
insertHybrid: jest.fn().mockResolvedValue(undefined),
|
|
91
|
+
search: jest.fn().mockResolvedValue([]),
|
|
92
|
+
hybridSearch: jest.fn().mockResolvedValue([]),
|
|
93
|
+
delete: jest.fn().mockResolvedValue(undefined),
|
|
94
|
+
query: jest.fn().mockResolvedValue([]),
|
|
95
|
+
getCollectionDescription: jest.fn().mockResolvedValue(''),
|
|
96
|
+
checkCollectionLimit: jest.fn().mockResolvedValue(true),
|
|
97
|
+
getCollectionRowCount: jest.fn().mockResolvedValue(0),
|
|
98
|
+
});
|
|
99
|
+
describe('Context indexCodebase AbortSignal support', () => {
|
|
100
|
+
let tempRoot;
|
|
101
|
+
let originalHome;
|
|
102
|
+
let originalHybridMode;
|
|
103
|
+
beforeEach(async () => {
|
|
104
|
+
tempRoot = await fs.mkdtemp(path.join(os.tmpdir(), 'claude-context-abort-'));
|
|
105
|
+
const homeDir = path.join(tempRoot, 'home');
|
|
106
|
+
await fs.mkdir(homeDir, { recursive: true });
|
|
107
|
+
originalHome = process.env.HOME;
|
|
108
|
+
originalHybridMode = process.env.HYBRID_MODE;
|
|
109
|
+
process.env.HOME = homeDir;
|
|
110
|
+
process.env.HYBRID_MODE = 'false';
|
|
111
|
+
});
|
|
112
|
+
afterEach(async () => {
|
|
113
|
+
if (originalHome === undefined) {
|
|
114
|
+
delete process.env.HOME;
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
process.env.HOME = originalHome;
|
|
118
|
+
}
|
|
119
|
+
if (originalHybridMode === undefined) {
|
|
120
|
+
delete process.env.HYBRID_MODE;
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
process.env.HYBRID_MODE = originalHybridMode;
|
|
124
|
+
}
|
|
125
|
+
await fs.rm(tempRoot, { recursive: true, force: true });
|
|
126
|
+
});
|
|
127
|
+
it('completes normally when no signal is provided (regression guard)', async () => {
|
|
128
|
+
const project = path.join(tempRoot, 'project');
|
|
129
|
+
await fs.mkdir(project);
|
|
130
|
+
for (let i = 0; i < 3; i++) {
|
|
131
|
+
await fs.writeFile(path.join(project, `file${i}.ts`), `const v${i} = ${i};`);
|
|
132
|
+
}
|
|
133
|
+
const vectorDatabase = createVectorDatabase();
|
|
134
|
+
const splitter = new CountingSplitter();
|
|
135
|
+
const context = new context_1.Context({
|
|
136
|
+
embedding: new TestEmbedding(),
|
|
137
|
+
vectorDatabase,
|
|
138
|
+
codeSplitter: splitter,
|
|
139
|
+
});
|
|
140
|
+
const stats = await context.indexCodebase(project);
|
|
141
|
+
expect(stats.indexedFiles).toBe(3);
|
|
142
|
+
expect(stats.status).toBe('completed');
|
|
143
|
+
expect(splitter.calls).toBe(3);
|
|
144
|
+
const insertedDocuments = vectorDatabase.insert.mock.calls
|
|
145
|
+
.flatMap(([, documents]) => documents);
|
|
146
|
+
expect(insertedDocuments).toHaveLength(3);
|
|
147
|
+
});
|
|
148
|
+
it('completes normally when signal is provided but never fires', async () => {
|
|
149
|
+
const project = path.join(tempRoot, 'project');
|
|
150
|
+
await fs.mkdir(project);
|
|
151
|
+
for (let i = 0; i < 3; i++) {
|
|
152
|
+
await fs.writeFile(path.join(project, `file${i}.ts`), `const v${i} = ${i};`);
|
|
153
|
+
}
|
|
154
|
+
const vectorDatabase = createVectorDatabase();
|
|
155
|
+
const splitter = new CountingSplitter();
|
|
156
|
+
const context = new context_1.Context({
|
|
157
|
+
embedding: new TestEmbedding(),
|
|
158
|
+
vectorDatabase,
|
|
159
|
+
codeSplitter: splitter,
|
|
160
|
+
});
|
|
161
|
+
const controller = new AbortController();
|
|
162
|
+
const stats = await context.indexCodebase(project, undefined, false, [], [], undefined, controller.signal);
|
|
163
|
+
expect(stats.indexedFiles).toBe(3);
|
|
164
|
+
expect(stats.status).toBe('completed');
|
|
165
|
+
});
|
|
166
|
+
it('throws IndexAbortError and stops processing when the signal fires mid-indexing', async () => {
|
|
167
|
+
const project = path.join(tempRoot, 'project');
|
|
168
|
+
await fs.mkdir(project);
|
|
169
|
+
// Five files; controller fires after the splitter has been called twice.
|
|
170
|
+
for (let i = 0; i < 5; i++) {
|
|
171
|
+
await fs.writeFile(path.join(project, `file${i}.ts`), `const v${i} = ${i};`);
|
|
172
|
+
}
|
|
173
|
+
const vectorDatabase = createVectorDatabase();
|
|
174
|
+
const controller = new AbortController();
|
|
175
|
+
const splitter = new CountingSplitter((callIndex) => {
|
|
176
|
+
if (callIndex === 2) {
|
|
177
|
+
controller.abort();
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
const context = new context_1.Context({
|
|
181
|
+
embedding: new TestEmbedding(),
|
|
182
|
+
vectorDatabase,
|
|
183
|
+
codeSplitter: splitter,
|
|
184
|
+
});
|
|
185
|
+
await expect(context.indexCodebase(project, undefined, false, [], [], undefined, controller.signal)).rejects.toBeInstanceOf(context_1.IndexAbortError);
|
|
186
|
+
// Two files were processed before the signal fired; the remaining
|
|
187
|
+
// three must NOT have been split.
|
|
188
|
+
expect(splitter.calls).toBe(2);
|
|
189
|
+
// No insert should fire after abort: chunks are buffered until the
|
|
190
|
+
// batch threshold (100) so a small project never flushes mid-loop, and
|
|
191
|
+
// the final-batch flush is skipped when the signal is aborted.
|
|
192
|
+
expect(vectorDatabase.insert).not.toHaveBeenCalled();
|
|
193
|
+
});
|
|
194
|
+
it('throws IndexAbortError when the signal is already aborted before indexing begins', async () => {
|
|
195
|
+
const project = path.join(tempRoot, 'project');
|
|
196
|
+
await fs.mkdir(project);
|
|
197
|
+
await fs.writeFile(path.join(project, 'only.ts'), 'const x = 1;');
|
|
198
|
+
const vectorDatabase = createVectorDatabase();
|
|
199
|
+
const splitter = new CountingSplitter();
|
|
200
|
+
const context = new context_1.Context({
|
|
201
|
+
embedding: new TestEmbedding(),
|
|
202
|
+
vectorDatabase,
|
|
203
|
+
codeSplitter: splitter,
|
|
204
|
+
});
|
|
205
|
+
const controller = new AbortController();
|
|
206
|
+
controller.abort();
|
|
207
|
+
await expect(context.indexCodebase(project, undefined, false, [], [], undefined, controller.signal)).rejects.toBeInstanceOf(context_1.IndexAbortError);
|
|
208
|
+
expect(splitter.calls).toBe(0);
|
|
209
|
+
expect(vectorDatabase.insert).not.toHaveBeenCalled();
|
|
210
|
+
});
|
|
211
|
+
});
|
|
212
|
+
//# sourceMappingURL=context.abort.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.abort.test.js","sourceRoot":"","sources":["../src/context.abort.test.ts"],"names":[],"mappings":"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"}
|
package/dist/context.d.ts
CHANGED
|
@@ -3,6 +3,14 @@ import { Embedding } from './embedding';
|
|
|
3
3
|
import { VectorDatabase } from './vectordb';
|
|
4
4
|
import { SemanticSearchResult } from './types';
|
|
5
5
|
import { FileSynchronizer } from './sync/synchronizer';
|
|
6
|
+
/**
|
|
7
|
+
* Thrown by indexCodebase / processFileList when an AbortSignal fires
|
|
8
|
+
* mid-indexing. Callers (e.g. the MCP server's clear_index handler) use
|
|
9
|
+
* this to detect a cooperative cancel vs. a real failure.
|
|
10
|
+
*/
|
|
11
|
+
export declare class IndexAbortError extends Error {
|
|
12
|
+
constructor(message?: string);
|
|
13
|
+
}
|
|
6
14
|
export interface ContextConfig {
|
|
7
15
|
embedding?: Embedding;
|
|
8
16
|
vectorDatabase?: VectorDatabase;
|
|
@@ -41,6 +49,11 @@ export declare class Context {
|
|
|
41
49
|
* Get supported extensions
|
|
42
50
|
*/
|
|
43
51
|
getSupportedExtensions(): string[];
|
|
52
|
+
/**
|
|
53
|
+
* Get supported extensions for the current operation without mutating
|
|
54
|
+
* the Context's persistent extension list.
|
|
55
|
+
*/
|
|
56
|
+
getEffectiveSupportedExtensions(additionalExtensions?: string[]): string[];
|
|
44
57
|
/**
|
|
45
58
|
* Get ignore patterns
|
|
46
59
|
*/
|
|
@@ -81,6 +94,9 @@ export declare class Context {
|
|
|
81
94
|
* @param codebasePath Codebase root path
|
|
82
95
|
* @param progressCallback Optional progress callback function
|
|
83
96
|
* @param forceReindex Whether to recreate the collection even if it exists
|
|
97
|
+
* @param additionalIgnorePatterns Request-scoped ignore patterns
|
|
98
|
+
* @param additionalSupportedExtensions Request-scoped file extensions
|
|
99
|
+
* @param requestSplitter Request-scoped splitter for this indexing run
|
|
84
100
|
* @returns Indexing statistics
|
|
85
101
|
*/
|
|
86
102
|
indexCodebase(codebasePath: string, progressCallback?: (progress: {
|
|
@@ -88,7 +104,7 @@ export declare class Context {
|
|
|
88
104
|
current: number;
|
|
89
105
|
total: number;
|
|
90
106
|
percentage: number;
|
|
91
|
-
}) => void, forceReindex?: boolean, additionalIgnorePatterns?: string[]): Promise<{
|
|
107
|
+
}) => void, forceReindex?: boolean, additionalIgnorePatterns?: string[], additionalSupportedExtensions?: string[], requestSplitter?: Splitter, signal?: AbortSignal): Promise<{
|
|
92
108
|
indexedFiles: number;
|
|
93
109
|
totalChunks: number;
|
|
94
110
|
status: 'completed' | 'limit_reached';
|
|
@@ -98,7 +114,7 @@ export declare class Context {
|
|
|
98
114
|
current: number;
|
|
99
115
|
total: number;
|
|
100
116
|
percentage: number;
|
|
101
|
-
}) => void): Promise<{
|
|
117
|
+
}) => void, additionalIgnorePatterns?: string[], additionalSupportedExtensions?: string[], requestSplitter?: Splitter): Promise<{
|
|
102
118
|
added: number;
|
|
103
119
|
removed: number;
|
|
104
120
|
modified: number;
|
|
@@ -112,6 +128,11 @@ export declare class Context {
|
|
|
112
128
|
* @param threshold Similarity threshold
|
|
113
129
|
*/
|
|
114
130
|
semanticSearch(codebasePath: string, query: string, topK?: number, threshold?: number, filterExpr?: string): Promise<SemanticSearchResult[]>;
|
|
131
|
+
/**
|
|
132
|
+
* Deduplicate search results by file + line range overlap.
|
|
133
|
+
* Keeps higher-scored result when two results from the same file overlap >50%.
|
|
134
|
+
*/
|
|
135
|
+
private deduplicateResults;
|
|
115
136
|
/**
|
|
116
137
|
* Check if index exists for codebase
|
|
117
138
|
* @param codebasePath Codebase path to check
|
|
@@ -241,6 +262,7 @@ export declare class Context {
|
|
|
241
262
|
* @returns True if pattern matches
|
|
242
263
|
*/
|
|
243
264
|
private isPatternMatch;
|
|
265
|
+
private matchesDirectoryPattern;
|
|
244
266
|
/**
|
|
245
267
|
* Simple glob matching supporting * wildcard
|
|
246
268
|
* @param text Text to test
|
|
@@ -261,6 +283,7 @@ export declare class Context {
|
|
|
261
283
|
* @returns Array of custom ignore patterns
|
|
262
284
|
*/
|
|
263
285
|
private getCustomIgnorePatternsFromEnv;
|
|
286
|
+
private normalizeExtensions;
|
|
264
287
|
/**
|
|
265
288
|
* Add custom extensions (from MCP or other sources) without replacing existing ones
|
|
266
289
|
* @param customExtensions Array of custom extensions to add
|
package/dist/context.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,QAAQ,EAGX,MAAM,YAAY,CAAC;AACpB,OAAO,EACH,SAAS,EAGZ,MAAM,aAAa,CAAC;AACrB,OAAO,EACH,cAAc,EAMjB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAK/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"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"}
|
|
@@ -37,31 +37,72 @@ const fs = __importStar(require("fs/promises"));
|
|
|
37
37
|
const os = __importStar(require("os"));
|
|
38
38
|
const path = __importStar(require("path"));
|
|
39
39
|
const context_1 = require("./context");
|
|
40
|
+
const embedding_1 = require("./embedding");
|
|
41
|
+
const synchronizer_1 = require("./sync/synchronizer");
|
|
42
|
+
class TestEmbedding extends embedding_1.Embedding {
|
|
43
|
+
constructor() {
|
|
44
|
+
super(...arguments);
|
|
45
|
+
this.maxTokens = 8192;
|
|
46
|
+
}
|
|
47
|
+
async detectDimension() {
|
|
48
|
+
return 3;
|
|
49
|
+
}
|
|
50
|
+
async embed(text) {
|
|
51
|
+
return { vector: [1, 0, 0], dimension: 3 };
|
|
52
|
+
}
|
|
53
|
+
async embedBatch(texts) {
|
|
54
|
+
return texts.map(() => ({ vector: [1, 0, 0], dimension: 3 }));
|
|
55
|
+
}
|
|
56
|
+
getDimension() {
|
|
57
|
+
return 3;
|
|
58
|
+
}
|
|
59
|
+
getProvider() {
|
|
60
|
+
return 'test';
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
class TestSplitter {
|
|
64
|
+
async split(code, language, filePath) {
|
|
65
|
+
return [{
|
|
66
|
+
content: code,
|
|
67
|
+
metadata: {
|
|
68
|
+
startLine: 1,
|
|
69
|
+
endLine: 1,
|
|
70
|
+
language,
|
|
71
|
+
filePath,
|
|
72
|
+
},
|
|
73
|
+
}];
|
|
74
|
+
}
|
|
75
|
+
setChunkSize() { }
|
|
76
|
+
setChunkOverlap() { }
|
|
77
|
+
}
|
|
40
78
|
const createVectorDatabase = () => ({
|
|
41
|
-
createCollection: jest.fn(),
|
|
42
|
-
createHybridCollection: jest.fn(),
|
|
43
|
-
dropCollection: jest.fn(),
|
|
44
|
-
hasCollection: jest.fn(),
|
|
45
|
-
listCollections: jest.fn(),
|
|
46
|
-
insert: jest.fn(),
|
|
47
|
-
insertHybrid: jest.fn(),
|
|
48
|
-
search: jest.fn(),
|
|
49
|
-
hybridSearch: jest.fn(),
|
|
50
|
-
delete: jest.fn(),
|
|
51
|
-
query: jest.fn(),
|
|
52
|
-
getCollectionDescription: jest.fn(),
|
|
53
|
-
checkCollectionLimit: jest.fn(),
|
|
54
|
-
getCollectionRowCount: jest.fn(),
|
|
79
|
+
createCollection: jest.fn().mockResolvedValue(undefined),
|
|
80
|
+
createHybridCollection: jest.fn().mockResolvedValue(undefined),
|
|
81
|
+
dropCollection: jest.fn().mockResolvedValue(undefined),
|
|
82
|
+
hasCollection: jest.fn().mockResolvedValue(false),
|
|
83
|
+
listCollections: jest.fn().mockResolvedValue([]),
|
|
84
|
+
insert: jest.fn().mockResolvedValue(undefined),
|
|
85
|
+
insertHybrid: jest.fn().mockResolvedValue(undefined),
|
|
86
|
+
search: jest.fn().mockResolvedValue([]),
|
|
87
|
+
hybridSearch: jest.fn().mockResolvedValue([]),
|
|
88
|
+
delete: jest.fn().mockResolvedValue(undefined),
|
|
89
|
+
query: jest.fn().mockResolvedValue([]),
|
|
90
|
+
getCollectionDescription: jest.fn().mockResolvedValue(''),
|
|
91
|
+
checkCollectionLimit: jest.fn().mockResolvedValue(true),
|
|
92
|
+
getCollectionRowCount: jest.fn().mockResolvedValue(0),
|
|
55
93
|
});
|
|
56
94
|
describe('Context ignore pattern isolation', () => {
|
|
57
95
|
let tempRoot;
|
|
58
96
|
let originalHome;
|
|
97
|
+
let originalHybridMode;
|
|
59
98
|
beforeEach(async () => {
|
|
60
99
|
tempRoot = await fs.mkdtemp(path.join(os.tmpdir(), 'claude-context-ignore-'));
|
|
61
100
|
const homeDir = path.join(tempRoot, 'home');
|
|
62
101
|
await fs.mkdir(homeDir, { recursive: true });
|
|
63
102
|
originalHome = process.env.HOME;
|
|
103
|
+
originalHybridMode = process.env.HYBRID_MODE;
|
|
64
104
|
process.env.HOME = homeDir;
|
|
105
|
+
process.env.HYBRID_MODE = 'false';
|
|
65
106
|
});
|
|
66
107
|
afterEach(async () => {
|
|
67
108
|
if (originalHome === undefined) {
|
|
@@ -70,6 +111,12 @@ describe('Context ignore pattern isolation', () => {
|
|
|
70
111
|
else {
|
|
71
112
|
process.env.HOME = originalHome;
|
|
72
113
|
}
|
|
114
|
+
if (originalHybridMode === undefined) {
|
|
115
|
+
delete process.env.HYBRID_MODE;
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
process.env.HYBRID_MODE = originalHybridMode;
|
|
119
|
+
}
|
|
73
120
|
await fs.rm(tempRoot, { recursive: true, force: true });
|
|
74
121
|
});
|
|
75
122
|
it('does not leak file-based ignore patterns between codebases', async () => {
|
|
@@ -93,5 +140,89 @@ describe('Context ignore pattern isolation', () => {
|
|
|
93
140
|
const withoutRequestIgnores = await context.getEffectiveIgnorePatterns(project);
|
|
94
141
|
expect(withoutRequestIgnores).not.toContain('*.txt');
|
|
95
142
|
});
|
|
143
|
+
it('does not leak request custom extensions into persistent supported extensions', () => {
|
|
144
|
+
const context = new context_1.Context({ vectorDatabase: createVectorDatabase() });
|
|
145
|
+
const withRequestExtensions = context.getEffectiveSupportedExtensions(['foo']);
|
|
146
|
+
expect(withRequestExtensions).toContain('.foo');
|
|
147
|
+
const withoutRequestExtensions = context.getSupportedExtensions();
|
|
148
|
+
expect(withoutRequestExtensions).not.toContain('.foo');
|
|
149
|
+
});
|
|
150
|
+
it('does not leak request custom extensions between codebase indexes', async () => {
|
|
151
|
+
const projectA = path.join(tempRoot, 'project-a');
|
|
152
|
+
const projectB = path.join(tempRoot, 'project-b');
|
|
153
|
+
await fs.mkdir(projectA);
|
|
154
|
+
await fs.mkdir(projectB);
|
|
155
|
+
await fs.writeFile(path.join(projectA, 'a.foo'), 'project a custom file');
|
|
156
|
+
await fs.writeFile(path.join(projectB, 'b.foo'), 'project b custom file');
|
|
157
|
+
const vectorDatabase = createVectorDatabase();
|
|
158
|
+
const context = new context_1.Context({
|
|
159
|
+
embedding: new TestEmbedding(),
|
|
160
|
+
vectorDatabase,
|
|
161
|
+
codeSplitter: new TestSplitter(),
|
|
162
|
+
});
|
|
163
|
+
await context.indexCodebase(projectA, undefined, false, [], ['foo']);
|
|
164
|
+
expect(vectorDatabase.insert).toHaveBeenCalledTimes(1);
|
|
165
|
+
expect(vectorDatabase.insert.mock.calls[0][1][0].relativePath).toBe('a.foo');
|
|
166
|
+
vectorDatabase.insert.mockClear();
|
|
167
|
+
await context.indexCodebase(projectB);
|
|
168
|
+
expect(vectorDatabase.insert).not.toHaveBeenCalled();
|
|
169
|
+
});
|
|
170
|
+
it('uses request options when recreating a synchronizer for change indexing', async () => {
|
|
171
|
+
const project = path.join(tempRoot, 'project-with-options');
|
|
172
|
+
await fs.mkdir(project);
|
|
173
|
+
await fs.writeFile(path.join(project, 'custom.foo'), 'custom extension file');
|
|
174
|
+
await fs.writeFile(path.join(project, 'ignored.ts'), 'ignored by request pattern');
|
|
175
|
+
const context = new context_1.Context({ vectorDatabase: createVectorDatabase() });
|
|
176
|
+
try {
|
|
177
|
+
await context.reindexByChange(project, undefined, ['*.ts'], ['foo']);
|
|
178
|
+
const collectionName = context.getCollectionName(project);
|
|
179
|
+
const synchronizer = context.getSynchronizers().get(collectionName);
|
|
180
|
+
expect(synchronizer).toBeDefined();
|
|
181
|
+
expect(synchronizer?.getFileHash('custom.foo')).toBeDefined();
|
|
182
|
+
expect(synchronizer?.getFileHash('ignored.ts')).toBeUndefined();
|
|
183
|
+
expect(context.getSupportedExtensions()).not.toContain('.foo');
|
|
184
|
+
}
|
|
185
|
+
finally {
|
|
186
|
+
await synchronizer_1.FileSynchronizer.deleteSnapshot(project);
|
|
187
|
+
}
|
|
188
|
+
});
|
|
189
|
+
it('treats leading-slash directory ignore patterns as root-anchored and recursive during indexing', async () => {
|
|
190
|
+
const project = path.join(tempRoot, 'project');
|
|
191
|
+
await fs.mkdir(path.join(project, 'Library'), { recursive: true });
|
|
192
|
+
await fs.mkdir(path.join(project, 'src', 'Library'), { recursive: true });
|
|
193
|
+
await fs.writeFile(path.join(project, '.gitignore'), '/Library/\n');
|
|
194
|
+
await fs.writeFile(path.join(project, 'Library', 'generated.md'), 'root library should be ignored');
|
|
195
|
+
await fs.writeFile(path.join(project, 'src', 'Library', 'nested.md'), 'nested library should stay');
|
|
196
|
+
await fs.writeFile(path.join(project, 'src', 'keep.md'), 'regular file should stay');
|
|
197
|
+
const vectorDatabase = createVectorDatabase();
|
|
198
|
+
const context = new context_1.Context({
|
|
199
|
+
embedding: new TestEmbedding(),
|
|
200
|
+
vectorDatabase,
|
|
201
|
+
codeSplitter: new TestSplitter(),
|
|
202
|
+
});
|
|
203
|
+
await context.indexCodebase(project);
|
|
204
|
+
const insertedDocuments = vectorDatabase.insert.mock.calls
|
|
205
|
+
.flatMap(([, documents]) => documents);
|
|
206
|
+
const indexedPaths = insertedDocuments
|
|
207
|
+
.map(document => document.relativePath.replace(/\\/g, '/'))
|
|
208
|
+
.sort();
|
|
209
|
+
expect(indexedPaths).toEqual([
|
|
210
|
+
'src/Library/nested.md',
|
|
211
|
+
'src/keep.md',
|
|
212
|
+
]);
|
|
213
|
+
});
|
|
214
|
+
it('treats leading-slash directory ignore patterns as root-anchored and recursive during sync', async () => {
|
|
215
|
+
const project = path.join(tempRoot, 'project');
|
|
216
|
+
await fs.mkdir(path.join(project, 'Library'), { recursive: true });
|
|
217
|
+
await fs.mkdir(path.join(project, 'src', 'Library'), { recursive: true });
|
|
218
|
+
await fs.writeFile(path.join(project, 'Library', 'generated.md'), 'root library should be ignored');
|
|
219
|
+
await fs.writeFile(path.join(project, 'src', 'Library', 'nested.md'), 'nested library should stay');
|
|
220
|
+
await fs.writeFile(path.join(project, 'src', 'keep.md'), 'regular file should stay');
|
|
221
|
+
const synchronizer = new synchronizer_1.FileSynchronizer(project, ['/Library/'], ['.md']);
|
|
222
|
+
const fileHashes = await synchronizer.generateFileHashes(project);
|
|
223
|
+
expect(fileHashes.has(path.join('Library', 'generated.md'))).toBe(false);
|
|
224
|
+
expect(fileHashes.has(path.join('src', 'Library', 'nested.md'))).toBe(true);
|
|
225
|
+
expect(fileHashes.has(path.join('src', 'keep.md'))).toBe(true);
|
|
226
|
+
});
|
|
96
227
|
});
|
|
97
228
|
//# sourceMappingURL=context.ignore-patterns.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.ignore-patterns.test.js","sourceRoot":"","sources":["../src/context.ignore-patterns.test.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,gDAAkC;AAClC,uCAAyB;AACzB,2CAA6B;AAC7B,uCAAoC;
|
|
1
|
+
{"version":3,"file":"context.ignore-patterns.test.js","sourceRoot":"","sources":["../src/context.ignore-patterns.test.ts"],"names":[],"mappings":"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"}
|