codevault 1.7.2 → 1.7.4
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 +18 -5
- package/dist/chunking/semantic-chunker.d.ts.map +1 -1
- package/dist/chunking/semantic-chunker.js +20 -7
- package/dist/chunking/semantic-chunker.js.map +1 -1
- package/dist/cli/commands/index-cmd.d.ts +3 -0
- package/dist/cli/commands/index-cmd.d.ts.map +1 -0
- package/dist/cli/commands/index-cmd.js +118 -0
- package/dist/cli/commands/index-cmd.js.map +1 -0
- package/dist/cli/commands/info-cmd.d.ts +3 -0
- package/dist/cli/commands/info-cmd.d.ts.map +1 -0
- package/dist/cli/commands/info-cmd.js +47 -0
- package/dist/cli/commands/info-cmd.js.map +1 -0
- package/dist/cli/commands/mcp-cmd.d.ts +3 -0
- package/dist/cli/commands/mcp-cmd.d.ts.map +1 -0
- package/dist/cli/commands/mcp-cmd.js +33 -0
- package/dist/cli/commands/mcp-cmd.js.map +1 -0
- package/dist/cli/commands/search-cmd.d.ts +3 -0
- package/dist/cli/commands/search-cmd.d.ts.map +1 -0
- package/dist/cli/commands/search-cmd.js +52 -0
- package/dist/cli/commands/search-cmd.js.map +1 -0
- package/dist/cli/commands/search-with-code-cmd.d.ts +3 -0
- package/dist/cli/commands/search-with-code-cmd.d.ts.map +1 -0
- package/dist/cli/commands/search-with-code-cmd.js +74 -0
- package/dist/cli/commands/search-with-code-cmd.js.map +1 -0
- package/dist/cli/commands/update-cmd.d.ts +3 -0
- package/dist/cli/commands/update-cmd.d.ts.map +1 -0
- package/dist/cli/commands/update-cmd.js +24 -0
- package/dist/cli/commands/update-cmd.js.map +1 -0
- package/dist/cli/commands/watch-cmd.d.ts +3 -0
- package/dist/cli/commands/watch-cmd.d.ts.map +1 -0
- package/dist/cli/commands/watch-cmd.js +47 -0
- package/dist/cli/commands/watch-cmd.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +47 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli.d.ts +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +4 -398
- package/dist/cli.js.map +1 -1
- package/dist/codemap/io.d.ts +1 -0
- package/dist/codemap/io.d.ts.map +1 -1
- package/dist/codemap/io.js.map +1 -1
- package/dist/config/constants.d.ts +11 -0
- package/dist/config/constants.d.ts.map +1 -1
- package/dist/config/constants.js +9 -0
- package/dist/config/constants.js.map +1 -1
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +9 -2
- package/dist/config/loader.js.map +1 -1
- package/dist/core/IndexerEngine.d.ts +9 -17
- package/dist/core/IndexerEngine.d.ts.map +1 -1
- package/dist/core/IndexerEngine.js +72 -351
- package/dist/core/IndexerEngine.js.map +1 -1
- package/dist/core/SearchService.d.ts +13 -13
- package/dist/core/SearchService.d.ts.map +1 -1
- package/dist/core/SearchService.js +133 -325
- package/dist/core/SearchService.js.map +1 -1
- package/dist/core/batch-indexer.d.ts +5 -0
- package/dist/core/batch-indexer.d.ts.map +1 -1
- package/dist/core/batch-indexer.js +25 -27
- package/dist/core/batch-indexer.js.map +1 -1
- package/dist/core/indexer.d.ts +13 -0
- package/dist/core/indexer.d.ts.map +1 -1
- package/dist/core/indexer.js +13 -0
- package/dist/core/indexer.js.map +1 -1
- package/dist/core/indexing/FileProcessor.d.ts +42 -0
- package/dist/core/indexing/FileProcessor.d.ts.map +1 -0
- package/dist/core/indexing/FileProcessor.js +245 -0
- package/dist/core/indexing/FileProcessor.js.map +1 -0
- package/dist/core/indexing/IndexContext.d.ts +42 -0
- package/dist/core/indexing/IndexContext.d.ts.map +1 -0
- package/dist/core/indexing/IndexContext.js +133 -0
- package/dist/core/indexing/IndexContext.js.map +1 -0
- package/dist/core/indexing/IndexFinalizationStage.d.ts +39 -0
- package/dist/core/indexing/IndexFinalizationStage.d.ts.map +1 -0
- package/dist/core/indexing/IndexFinalizationStage.js +114 -0
- package/dist/core/indexing/IndexFinalizationStage.js.map +1 -0
- package/dist/core/indexing/IndexState.d.ts +50 -0
- package/dist/core/indexing/IndexState.d.ts.map +1 -0
- package/dist/core/indexing/IndexState.js +66 -0
- package/dist/core/indexing/IndexState.js.map +1 -0
- package/dist/core/indexing/chunk-pipeline.d.ts +39 -3
- package/dist/core/indexing/chunk-pipeline.d.ts.map +1 -1
- package/dist/core/indexing/chunk-pipeline.js +59 -24
- package/dist/core/indexing/chunk-pipeline.js.map +1 -1
- package/dist/core/search/CandidateRetriever.d.ts +51 -0
- package/dist/core/search/CandidateRetriever.d.ts.map +1 -0
- package/dist/core/search/CandidateRetriever.js +119 -0
- package/dist/core/search/CandidateRetriever.js.map +1 -0
- package/dist/core/search/HybridFusion.d.ts +89 -0
- package/dist/core/search/HybridFusion.d.ts.map +1 -0
- package/dist/core/search/HybridFusion.js +263 -0
- package/dist/core/search/HybridFusion.js.map +1 -0
- package/dist/core/search/ResultMapper.d.ts +31 -0
- package/dist/core/search/ResultMapper.d.ts.map +1 -0
- package/dist/core/search/ResultMapper.js +131 -0
- package/dist/core/search/ResultMapper.js.map +1 -0
- package/dist/core/search/SearchContextManager.d.ts +69 -0
- package/dist/core/search/SearchContextManager.d.ts.map +1 -0
- package/dist/core/search/SearchContextManager.js +139 -0
- package/dist/core/search/SearchContextManager.js.map +1 -0
- package/dist/core/search.d.ts +31 -0
- package/dist/core/search.d.ts.map +1 -1
- package/dist/core/search.js +33 -0
- package/dist/core/search.js.map +1 -1
- package/dist/core/types.d.ts +13 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/database/db.d.ts +36 -18
- package/dist/database/db.d.ts.map +1 -1
- package/dist/database/db.js +151 -24
- package/dist/database/db.js.map +1 -1
- package/dist/indexer/ChangeQueue.d.ts +67 -0
- package/dist/indexer/ChangeQueue.d.ts.map +1 -0
- package/dist/indexer/ChangeQueue.js +182 -0
- package/dist/indexer/ChangeQueue.js.map +1 -0
- package/dist/indexer/ProviderManager.d.ts +33 -0
- package/dist/indexer/ProviderManager.d.ts.map +1 -0
- package/dist/indexer/ProviderManager.js +75 -0
- package/dist/indexer/ProviderManager.js.map +1 -0
- package/dist/indexer/WatchService.d.ts +68 -0
- package/dist/indexer/WatchService.d.ts.map +1 -0
- package/dist/indexer/WatchService.js +155 -0
- package/dist/indexer/WatchService.js.map +1 -0
- package/dist/indexer/merkle.d.ts +5 -0
- package/dist/indexer/merkle.d.ts.map +1 -1
- package/dist/indexer/merkle.js +36 -12
- package/dist/indexer/merkle.js.map +1 -1
- package/dist/indexer/update.d.ts +14 -2
- package/dist/indexer/update.d.ts.map +1 -1
- package/dist/indexer/update.js +11 -0
- package/dist/indexer/update.js.map +1 -1
- package/dist/indexer/watch.d.ts +15 -20
- package/dist/indexer/watch.d.ts.map +1 -1
- package/dist/indexer/watch.js +14 -223
- package/dist/indexer/watch.js.map +1 -1
- package/dist/mcp/handlers/project.d.ts.map +1 -1
- package/dist/mcp/handlers/project.js +17 -1
- package/dist/mcp/handlers/project.js.map +1 -1
- package/dist/mcp-server.d.ts +6 -0
- package/dist/mcp-server.d.ts.map +1 -1
- package/dist/mcp-server.js +63 -2
- package/dist/mcp-server.js.map +1 -1
- package/dist/providers/base.d.ts +3 -0
- package/dist/providers/base.d.ts.map +1 -1
- package/dist/providers/base.js.map +1 -1
- package/dist/providers/index.d.ts +7 -0
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +15 -0
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/mock.d.ts +16 -0
- package/dist/providers/mock.d.ts.map +1 -0
- package/dist/providers/mock.js +46 -0
- package/dist/providers/mock.js.map +1 -0
- package/dist/providers/openai.d.ts.map +1 -1
- package/dist/providers/openai.js +4 -8
- package/dist/providers/openai.js.map +1 -1
- package/dist/ranking/api-reranker.d.ts.map +1 -1
- package/dist/ranking/api-reranker.js +9 -5
- package/dist/ranking/api-reranker.js.map +1 -1
- package/dist/search/bm25.d.ts.map +1 -1
- package/dist/search/bm25.js +21 -1
- package/dist/search/bm25.js.map +1 -1
- package/dist/search/scope.d.ts +1 -1
- package/dist/search/scope.d.ts.map +1 -1
- package/dist/search/scope.js +3 -3
- package/dist/search/scope.js.map +1 -1
- package/dist/storage/encrypted-chunks.d.ts +7 -1
- package/dist/storage/encrypted-chunks.d.ts.map +1 -1
- package/dist/storage/encrypted-chunks.js +187 -75
- package/dist/storage/encrypted-chunks.js.map +1 -1
- package/dist/symbols/extract.d.ts +2 -1
- package/dist/symbols/extract.d.ts.map +1 -1
- package/dist/symbols/extract.js +1 -1
- package/dist/symbols/extract.js.map +1 -1
- package/dist/symbols/graph.d.ts.map +1 -1
- package/dist/symbols/graph.js.map +1 -1
- package/dist/synthesis/conversational-synthesizer.d.ts.map +1 -1
- package/dist/synthesis/conversational-synthesizer.js +68 -76
- package/dist/synthesis/conversational-synthesizer.js.map +1 -1
- package/dist/synthesis/prompt-builder.d.ts +2 -0
- package/dist/synthesis/prompt-builder.d.ts.map +1 -1
- package/dist/synthesis/prompt-builder.js +80 -81
- package/dist/synthesis/prompt-builder.js.map +1 -1
- package/dist/synthesis/synthesizer.d.ts +11 -0
- package/dist/synthesis/synthesizer.d.ts.map +1 -1
- package/dist/synthesis/synthesizer.js +29 -1
- package/dist/synthesis/synthesizer.js.map +1 -1
- package/dist/tests/helpers/test-repo.d.ts +7 -0
- package/dist/tests/helpers/test-repo.d.ts.map +1 -0
- package/dist/tests/helpers/test-repo.js +21 -0
- package/dist/tests/helpers/test-repo.js.map +1 -0
- package/dist/tests/integration/index-search.integration.test.d.ts +2 -0
- package/dist/tests/integration/index-search.integration.test.d.ts.map +1 -0
- package/dist/tests/integration/index-search.integration.test.js +163 -0
- package/dist/tests/integration/index-search.integration.test.js.map +1 -0
- package/dist/tests/simple-lru.test.js +22 -10
- package/dist/tests/simple-lru.test.js.map +1 -1
- package/dist/utils/cli-ui.d.ts.map +1 -1
- package/dist/utils/cli-ui.js +9 -3
- package/dist/utils/cli-ui.js.map +1 -1
- package/dist/utils/logger.d.ts +4 -1
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/path-helpers.d.ts.map +1 -1
- package/dist/utils/path-helpers.js +17 -1
- package/dist/utils/path-helpers.js.map +1 -1
- package/dist/utils/scan-patterns.d.ts.map +1 -1
- package/dist/utils/scan-patterns.js +1 -2
- package/dist/utils/scan-patterns.js.map +1 -1
- package/dist/utils/simple-lru.d.ts +21 -2
- package/dist/utils/simple-lru.d.ts.map +1 -1
- package/dist/utils/simple-lru.js +126 -19
- package/dist/utils/simple-lru.js.map +1 -1
- package/package.json +13 -4
package/dist/providers/openai.js
CHANGED
|
@@ -84,15 +84,11 @@ export class OpenAIProvider extends EmbeddingProvider {
|
|
|
84
84
|
const text = remainingTexts[i];
|
|
85
85
|
const truncatedText = text.slice(0, maxChars);
|
|
86
86
|
const itemTokens = estimateTokens(truncatedText);
|
|
87
|
-
//
|
|
87
|
+
// Fail if item exceeds single item limit - don't create zero-vector pollution
|
|
88
88
|
if (itemTokens > MAX_ITEM_TOKENS) {
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
processedIndices.push(i);
|
|
93
|
-
// Add empty embedding as placeholder
|
|
94
|
-
allEmbeddings.push(new Array(this.getDimensions()).fill(0));
|
|
95
|
-
continue;
|
|
89
|
+
throw new Error(`Text at index ${i} exceeds maximum token limit (${itemTokens} > ${MAX_ITEM_TOKENS}). ` +
|
|
90
|
+
`This would create corrupted embeddings. Consider reducing chunk size or increasing ` +
|
|
91
|
+
`CODEVAULT_EMBEDDING_MAX_TOKENS. Text preview: ${text.slice(0, 100)}...`);
|
|
96
92
|
}
|
|
97
93
|
// Add to batch if it fits
|
|
98
94
|
if (currentBatchTokens + itemTokens <= MAX_BATCH_TOKENS) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-reranker.d.ts","sourceRoot":"","sources":["../../src/ranking/api-reranker.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"api-reranker.d.ts","sourceRoot":"","sources":["../../src/ranking/api-reranker.ts"],"names":[],"mappings":"AAsCA,wBAAgB,wBAAwB,IAAI,OAAO,CAIlD;AAuED,UAAU,SAAS;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,UAAU,aAAa;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,MAAM,CAAC;IAC3C,YAAY,CAAC,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACzD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CA0E7H"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { SEARCH_CONSTANTS, BATCH_CONSTANTS } from '../config/constants.js';
|
|
1
2
|
function getAPIUrl() {
|
|
2
3
|
return process.env.CODEVAULT_RERANK_API_URL || '';
|
|
3
4
|
}
|
|
@@ -8,12 +9,12 @@ function getModel() {
|
|
|
8
9
|
return process.env.CODEVAULT_RERANK_MODEL || 'rerank-v3.5';
|
|
9
10
|
}
|
|
10
11
|
function getMaxFromEnv() {
|
|
11
|
-
const envMax = Number.parseInt(process.env.CODEVAULT_RERANKER_MAX ||
|
|
12
|
-
return Number.isFinite(envMax) && envMax > 0 ? envMax :
|
|
12
|
+
const envMax = Number.parseInt(process.env.CODEVAULT_RERANKER_MAX || String(SEARCH_CONSTANTS.RERANKER_MAX_CANDIDATES), 10);
|
|
13
|
+
return Number.isFinite(envMax) && envMax > 0 ? envMax : SEARCH_CONSTANTS.RERANKER_MAX_CANDIDATES;
|
|
13
14
|
}
|
|
14
15
|
function getMaxTokensFromEnv() {
|
|
15
|
-
const envMax = Number.parseInt(process.env.CODEVAULT_RERANKER_MAX_TOKENS ||
|
|
16
|
-
return Number.isFinite(envMax) && envMax > 0 ? envMax :
|
|
16
|
+
const envMax = Number.parseInt(process.env.CODEVAULT_RERANKER_MAX_TOKENS || String(BATCH_CONSTANTS.MAX_ITEM_TOKENS), 10);
|
|
17
|
+
return Number.isFinite(envMax) && envMax > 0 ? envMax : BATCH_CONSTANTS.MAX_ITEM_TOKENS;
|
|
17
18
|
}
|
|
18
19
|
function truncateText(text, maxTokens) {
|
|
19
20
|
if (!text || typeof text !== 'string') {
|
|
@@ -130,7 +131,10 @@ export async function rerankWithAPI(query, candidates, options = {}) {
|
|
|
130
131
|
return [...rerankedTop, ...remainder];
|
|
131
132
|
}
|
|
132
133
|
catch (error) {
|
|
133
|
-
|
|
134
|
+
// Log the failure but gracefully fallback to original ranking
|
|
135
|
+
if (typeof console.error === 'function') {
|
|
136
|
+
console.error('API reranking failed, falling back to original ranking:', error.message);
|
|
137
|
+
}
|
|
134
138
|
return candidates;
|
|
135
139
|
}
|
|
136
140
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-reranker.js","sourceRoot":"","sources":["../../src/ranking/api-reranker.ts"],"names":[],"mappings":"AAAA,SAAS,SAAS;IAChB,OAAO,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,EAAE,CAAC;AACpD,CAAC;AAED,SAAS,SAAS;IAChB,OAAO,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,EAAE,CAAC;AACpD,CAAC;AAED,SAAS,QAAQ;IACf,OAAO,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,aAAa,CAAC;AAC7D,CAAC;AAED,SAAS,aAAa;IACpB,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,
|
|
1
|
+
{"version":3,"file":"api-reranker.js","sourceRoot":"","sources":["../../src/ranking/api-reranker.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bm25.d.ts","sourceRoot":"","sources":["../../src/search/bm25.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"bm25.d.ts","sourceRoot":"","sources":["../../src/search/bm25.ts"],"names":[],"mappings":"AAkBA,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAiC;IAC/C,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,YAAY,CAAS;;IAQ7B,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAc3C,YAAY,CAAC,OAAO,GAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAM,GAAG,IAAI;IAQrE,WAAW,IAAI,IAAI;IAsBnB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CAaxE"}
|
package/dist/search/bm25.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import bm25Factory from 'wink-bm25-text-search';
|
|
2
|
+
import { log } from '../utils/logger.js';
|
|
2
3
|
const DEFAULT_FIELD = 'body';
|
|
4
|
+
const MIN_DOCS_FOR_CONSOLIDATION = 3;
|
|
3
5
|
function defaultPrep(text) {
|
|
4
6
|
if (!text) {
|
|
5
7
|
return [];
|
|
@@ -39,8 +41,23 @@ export class BM25Index {
|
|
|
39
41
|
}
|
|
40
42
|
}
|
|
41
43
|
consolidate() {
|
|
42
|
-
if (
|
|
44
|
+
if (this.consolidated) {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
if (this.documents.size < MIN_DOCS_FOR_CONSOLIDATION) {
|
|
48
|
+
// wink-bm25-text-search throws when consolidating very small collections
|
|
49
|
+
this.consolidated = true;
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
try {
|
|
43
53
|
this.engine.consolidate();
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
log.warn('BM25 consolidation failed; skipping BM25 for this search', {
|
|
57
|
+
error: error instanceof Error ? error.message : String(error)
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
finally {
|
|
44
61
|
this.consolidated = true;
|
|
45
62
|
}
|
|
46
63
|
}
|
|
@@ -48,6 +65,9 @@ export class BM25Index {
|
|
|
48
65
|
if (!query || !query.trim()) {
|
|
49
66
|
return [];
|
|
50
67
|
}
|
|
68
|
+
if (this.documents.size < MIN_DOCS_FOR_CONSOLIDATION) {
|
|
69
|
+
return [];
|
|
70
|
+
}
|
|
51
71
|
this.consolidate();
|
|
52
72
|
const results = this.engine.search(query, limit);
|
|
53
73
|
return results.map(([id, score]) => ({ id, score }));
|
package/dist/search/bm25.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bm25.js","sourceRoot":"","sources":["../../src/search/bm25.ts"],"names":[],"mappings":"AAAA,OAAO,WAAW,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"bm25.js","sourceRoot":"","sources":["../../src/search/bm25.ts"],"names":[],"mappings":"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"}
|
package/dist/search/scope.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type ScopeFilters } from '../types/search.js';
|
|
2
|
-
export declare function normalizeScopeFilters(scope?: any): ScopeFilters;
|
|
3
2
|
import type { DatabaseChunk } from '../database/db.js';
|
|
3
|
+
export declare function normalizeScopeFilters(scope?: Partial<ScopeFilters>): ScopeFilters;
|
|
4
4
|
export declare function applyScope(chunks: DatabaseChunk[], scope?: ScopeFilters): DatabaseChunk[];
|
|
5
5
|
//# sourceMappingURL=scope.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scope.d.ts","sourceRoot":"","sources":["../../src/search/scope.ts"],"names":[],"mappings":"AACA,OAAO,EAAsC,KAAK,YAAY,EAAmB,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"scope.d.ts","sourceRoot":"","sources":["../../src/search/scope.ts"],"names":[],"mappings":"AACA,OAAO,EAAsC,KAAK,YAAY,EAAmB,MAAM,oBAAoB,CAAC;AAC5G,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAkCvD,wBAAgB,qBAAqB,CAAC,KAAK,GAAE,OAAO,CAAC,YAAY,CAAM,GAAG,YAAY,CAmCrF;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,aAAa,EAAE,EAAE,KAAK,GAAE,YAAiB,GAAG,aAAa,EAAE,CAwD7F"}
|
package/dist/search/scope.js
CHANGED
|
@@ -28,15 +28,15 @@ function normalizeToggle(value, defaultValue) {
|
|
|
28
28
|
}
|
|
29
29
|
export function normalizeScopeFilters(scope = {}) {
|
|
30
30
|
const normalized = {};
|
|
31
|
-
const normalizedPath = normalizeList(scope.path_glob
|
|
31
|
+
const normalizedPath = normalizeList(scope.path_glob);
|
|
32
32
|
if (normalizedPath.length > 0) {
|
|
33
33
|
normalized.path_glob = normalizedPath;
|
|
34
34
|
}
|
|
35
|
-
const normalizedTags = normalizeList(scope.tags
|
|
35
|
+
const normalizedTags = normalizeList(scope.tags);
|
|
36
36
|
if (normalizedTags.length > 0) {
|
|
37
37
|
normalized.tags = normalizedTags.map(tag => tag.toLowerCase());
|
|
38
38
|
}
|
|
39
|
-
const normalizedLang = normalizeList(scope.lang
|
|
39
|
+
const normalizedLang = normalizeList(scope.lang);
|
|
40
40
|
if (normalizedLang.length > 0) {
|
|
41
41
|
normalized.lang = normalizedLang.map(lang => lang.toLowerCase());
|
|
42
42
|
}
|
package/dist/search/scope.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scope.js","sourceRoot":"","sources":["../../src/search/scope.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,YAAY,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAsC,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"scope.js","sourceRoot":"","sources":["../../src/search/scope.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,11 @@
|
|
|
1
|
+
export interface EncryptionKeySet {
|
|
2
|
+
primary: Buffer | null;
|
|
3
|
+
deprecated: Buffer[];
|
|
4
|
+
}
|
|
1
5
|
export declare function resetEncryptionCacheForTests(): void;
|
|
2
6
|
export declare function getActiveEncryptionKey(): Buffer | null;
|
|
3
7
|
export declare function getEncryptionKeyError(): Error | null;
|
|
8
|
+
export declare function getEncryptionKeySet(): EncryptionKeySet;
|
|
4
9
|
interface Logger {
|
|
5
10
|
warn?: (message: string) => void;
|
|
6
11
|
}
|
|
@@ -28,12 +33,13 @@ export interface ReadChunkOptions {
|
|
|
28
33
|
chunkDir: string;
|
|
29
34
|
sha: string;
|
|
30
35
|
key?: Buffer | null;
|
|
36
|
+
keySet?: EncryptionKeySet;
|
|
31
37
|
}
|
|
32
38
|
export interface ReadChunkResult {
|
|
33
39
|
code: string;
|
|
34
40
|
encrypted: boolean;
|
|
35
41
|
}
|
|
36
|
-
export declare function readChunkFromDisk({ chunkDir, sha, key }: ReadChunkOptions): ReadChunkResult | null;
|
|
42
|
+
export declare function readChunkFromDisk({ chunkDir, sha, key, keySet }: ReadChunkOptions): ReadChunkResult | null;
|
|
37
43
|
export declare function removeChunkArtifacts(chunkDir: string, sha: string): void;
|
|
38
44
|
export declare function isChunkEncryptedOnDisk(chunkDir: string, sha: string): boolean;
|
|
39
45
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"encrypted-chunks.d.ts","sourceRoot":"","sources":["../../src/storage/encrypted-chunks.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"encrypted-chunks.d.ts","sourceRoot":"","sources":["../../src/storage/encrypted-chunks.ts"],"names":[],"mappings":"AA6DA,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAsGD,wBAAgB,4BAA4B,IAAI,IAAI,CAEnD;AAED,wBAAgB,sBAAsB,IAAI,MAAM,GAAG,IAAI,CAEtD;AAED,wBAAgB,qBAAqB,IAAI,KAAK,GAAG,IAAI,CAEpD;AAED,wBAAgB,mBAAmB,IAAI,gBAAgB,CAEtD;AAYD,UAAU,MAAM;IACd,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAClC;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,2BAA2B,CAAC,EAAE,IAAI,EAAE,MAAgB,EAAE,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,oBAAoB,CA4BrI;AAmGD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,oBAAoB,CAAC;CACnC;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,gBAAgB,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,iBAAiB,GAAG,gBAAgB,CAmBzG;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,CAAC,EAAE,gBAAgB,CAAC;CAC3B;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,wBAAgB,iBAAiB,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,gBAAgB,GAAG,eAAe,GAAG,IAAI,CAwE1G;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAQxE;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAG7E"}
|
|
@@ -3,15 +3,13 @@ import fs from 'fs';
|
|
|
3
3
|
import path from 'path';
|
|
4
4
|
import zlib from 'zlib';
|
|
5
5
|
import { log } from '../utils/logger.js';
|
|
6
|
+
import { ENCRYPTION_CONSTANTS } from '../config/constants.js';
|
|
7
|
+
const { MAGIC_HEADER, SALT_LENGTH, IV_LENGTH, TAG_LENGTH, HKDF_INFO, REQUIRED_KEY_LENGTH } = ENCRYPTION_CONSTANTS;
|
|
8
|
+
const MAGIC_HEADER_BUFFER = Buffer.from(MAGIC_HEADER, 'utf8');
|
|
9
|
+
const HKDF_INFO_BUFFER = Buffer.from(HKDF_INFO, 'utf8');
|
|
6
10
|
const KEY_ENV_VAR = 'CODEVAULT_ENCRYPTION_KEY';
|
|
7
|
-
const
|
|
8
|
-
const
|
|
9
|
-
const IV_LENGTH = 12;
|
|
10
|
-
const TAG_LENGTH = 16;
|
|
11
|
-
const HKDF_INFO = Buffer.from('codevault-chunk-v1', 'utf8');
|
|
12
|
-
let cachedNormalizedKey = null;
|
|
13
|
-
let cachedKeyBuffer = null;
|
|
14
|
-
let cachedKeyError = null;
|
|
11
|
+
const DEPRECATED_KEYS_ENV_VAR = 'CODEVAULT_ENCRYPTION_DEPRECATED_KEYS';
|
|
12
|
+
const CURRENT_ENCRYPTION_VERSION = 1;
|
|
15
13
|
function decodeKey(raw) {
|
|
16
14
|
if (typeof raw !== 'string') {
|
|
17
15
|
return null;
|
|
@@ -22,53 +20,123 @@ function decodeKey(raw) {
|
|
|
22
20
|
}
|
|
23
21
|
try {
|
|
24
22
|
const base64 = Buffer.from(trimmed, 'base64');
|
|
25
|
-
if (base64.length ===
|
|
23
|
+
if (base64.length === REQUIRED_KEY_LENGTH) {
|
|
26
24
|
return base64;
|
|
27
25
|
}
|
|
28
26
|
}
|
|
29
27
|
catch (error) {
|
|
30
|
-
log.debug('Failed to decode key as base64, will try hex', {
|
|
28
|
+
log.debug('Failed to decode key as base64, will try hex', {
|
|
29
|
+
error: error instanceof Error ? error.message : String(error)
|
|
30
|
+
});
|
|
31
31
|
}
|
|
32
32
|
try {
|
|
33
33
|
const hex = Buffer.from(trimmed, 'hex');
|
|
34
|
-
if (hex.length ===
|
|
34
|
+
if (hex.length === REQUIRED_KEY_LENGTH) {
|
|
35
35
|
return hex;
|
|
36
36
|
}
|
|
37
37
|
}
|
|
38
38
|
catch (error) {
|
|
39
|
-
log.debug('Failed to decode key as hex', {
|
|
39
|
+
log.debug('Failed to decode key as hex', {
|
|
40
|
+
error: error instanceof Error ? error.message : String(error)
|
|
41
|
+
});
|
|
40
42
|
}
|
|
41
43
|
return null;
|
|
42
44
|
}
|
|
45
|
+
class EncryptionKeyManager {
|
|
46
|
+
static instance = null;
|
|
47
|
+
primaryKey = null;
|
|
48
|
+
deprecatedKeys = [];
|
|
49
|
+
primaryError = null;
|
|
50
|
+
lastEnvSignature = null;
|
|
51
|
+
lastChecked = 0;
|
|
52
|
+
refreshIntervalMs = 5000;
|
|
53
|
+
static getInstance() {
|
|
54
|
+
if (!this.instance) {
|
|
55
|
+
this.instance = new EncryptionKeyManager();
|
|
56
|
+
}
|
|
57
|
+
return this.instance;
|
|
58
|
+
}
|
|
59
|
+
static resetForTests() {
|
|
60
|
+
this.instance = new EncryptionKeyManager();
|
|
61
|
+
}
|
|
62
|
+
getKeySet() {
|
|
63
|
+
this.refreshKeysIfNeeded();
|
|
64
|
+
return {
|
|
65
|
+
primary: this.primaryKey,
|
|
66
|
+
deprecated: this.deprecatedKeys
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
getPrimaryKey() {
|
|
70
|
+
return this.getKeySet().primary;
|
|
71
|
+
}
|
|
72
|
+
getPrimaryError() {
|
|
73
|
+
this.refreshKeysIfNeeded();
|
|
74
|
+
return this.primaryError;
|
|
75
|
+
}
|
|
76
|
+
refreshKeysIfNeeded() {
|
|
77
|
+
const now = Date.now();
|
|
78
|
+
const signature = this.getEnvSignature();
|
|
79
|
+
const shouldRefresh = !this.lastEnvSignature ||
|
|
80
|
+
signature !== this.lastEnvSignature ||
|
|
81
|
+
now - this.lastChecked > this.refreshIntervalMs;
|
|
82
|
+
if (!shouldRefresh) {
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
this.lastEnvSignature = signature;
|
|
86
|
+
this.lastChecked = now;
|
|
87
|
+
this.loadKeys();
|
|
88
|
+
}
|
|
89
|
+
loadKeys() {
|
|
90
|
+
const primary = this.decodeWithError(process.env[KEY_ENV_VAR] || '');
|
|
91
|
+
const deprecatedRaw = (process.env[DEPRECATED_KEYS_ENV_VAR] || '')
|
|
92
|
+
.split(',')
|
|
93
|
+
.map(key => key.trim())
|
|
94
|
+
.filter(Boolean);
|
|
95
|
+
this.primaryKey = primary.key;
|
|
96
|
+
this.primaryError = primary.error;
|
|
97
|
+
const decodedDeprecated = [];
|
|
98
|
+
for (const candidate of deprecatedRaw) {
|
|
99
|
+
const decoded = decodeKey(candidate);
|
|
100
|
+
if (decoded) {
|
|
101
|
+
decodedDeprecated.push(decoded);
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
log.warn('Failed to decode deprecated encryption key; skipping', {
|
|
105
|
+
env: DEPRECATED_KEYS_ENV_VAR
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
this.deprecatedKeys = decodedDeprecated;
|
|
110
|
+
}
|
|
111
|
+
getEnvSignature() {
|
|
112
|
+
return `${process.env[KEY_ENV_VAR] || ''}::${process.env[DEPRECATED_KEYS_ENV_VAR] || ''}`;
|
|
113
|
+
}
|
|
114
|
+
decodeWithError(raw) {
|
|
115
|
+
const normalized = typeof raw === 'string' ? raw.trim() : '';
|
|
116
|
+
if (!normalized) {
|
|
117
|
+
return { key: null, error: null };
|
|
118
|
+
}
|
|
119
|
+
const decoded = decodeKey(normalized);
|
|
120
|
+
if (!decoded) {
|
|
121
|
+
return {
|
|
122
|
+
key: null,
|
|
123
|
+
error: new Error(`${KEY_ENV_VAR} must be a ${REQUIRED_KEY_LENGTH}-byte key encoded as base64 or hex.`)
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
return { key: decoded, error: null };
|
|
127
|
+
}
|
|
128
|
+
}
|
|
43
129
|
export function resetEncryptionCacheForTests() {
|
|
44
|
-
|
|
45
|
-
cachedKeyBuffer = null;
|
|
46
|
-
cachedKeyError = null;
|
|
130
|
+
EncryptionKeyManager.resetForTests();
|
|
47
131
|
}
|
|
48
132
|
export function getActiveEncryptionKey() {
|
|
49
|
-
|
|
50
|
-
const normalized = typeof raw === 'string' ? raw.trim() : '';
|
|
51
|
-
// FIX: Always check if env var changed to support runtime updates
|
|
52
|
-
if (normalized === cachedNormalizedKey && cachedKeyBuffer) {
|
|
53
|
-
return cachedKeyBuffer;
|
|
54
|
-
}
|
|
55
|
-
// Invalidate cache when environment variable changes
|
|
56
|
-
cachedNormalizedKey = normalized;
|
|
57
|
-
cachedKeyError = null;
|
|
58
|
-
cachedKeyBuffer = null;
|
|
59
|
-
if (!normalized) {
|
|
60
|
-
return null;
|
|
61
|
-
}
|
|
62
|
-
const decoded = decodeKey(normalized);
|
|
63
|
-
if (!decoded) {
|
|
64
|
-
cachedKeyError = new Error(`${KEY_ENV_VAR} must be a 32-byte key encoded as base64 or hex.`);
|
|
65
|
-
return null;
|
|
66
|
-
}
|
|
67
|
-
cachedKeyBuffer = decoded;
|
|
68
|
-
return cachedKeyBuffer;
|
|
133
|
+
return EncryptionKeyManager.getInstance().getPrimaryKey();
|
|
69
134
|
}
|
|
70
135
|
export function getEncryptionKeyError() {
|
|
71
|
-
return
|
|
136
|
+
return EncryptionKeyManager.getInstance().getPrimaryError();
|
|
137
|
+
}
|
|
138
|
+
export function getEncryptionKeySet() {
|
|
139
|
+
return EncryptionKeyManager.getInstance().getKeySet();
|
|
72
140
|
}
|
|
73
141
|
const warnedInvalidMode = new Set();
|
|
74
142
|
let warnedInvalidKey = false;
|
|
@@ -104,7 +172,7 @@ export function resolveEncryptionPreference({ mode, logger = console } = {}) {
|
|
|
104
172
|
return { enabled: true, key, reason: 'enabled' };
|
|
105
173
|
}
|
|
106
174
|
function deriveChunkKey(masterKey, salt) {
|
|
107
|
-
return Buffer.from(crypto.hkdfSync('sha256', masterKey, salt,
|
|
175
|
+
return Buffer.from(crypto.hkdfSync('sha256', masterKey, salt, HKDF_INFO_BUFFER, REQUIRED_KEY_LENGTH));
|
|
108
176
|
}
|
|
109
177
|
function encryptBuffer(plaintext, masterKey) {
|
|
110
178
|
const salt = crypto.randomBytes(SALT_LENGTH);
|
|
@@ -113,42 +181,67 @@ function encryptBuffer(plaintext, masterKey) {
|
|
|
113
181
|
const cipher = crypto.createCipheriv('aes-256-gcm', derivedKey, iv);
|
|
114
182
|
const encrypted = Buffer.concat([cipher.update(plaintext), cipher.final()]);
|
|
115
183
|
const tag = cipher.getAuthTag();
|
|
116
|
-
const
|
|
184
|
+
const versionByte = Buffer.from([CURRENT_ENCRYPTION_VERSION]);
|
|
185
|
+
const payload = Buffer.concat([MAGIC_HEADER_BUFFER, versionByte, salt, iv, encrypted, tag]);
|
|
117
186
|
return { payload, salt, iv, tag };
|
|
118
187
|
}
|
|
119
|
-
function
|
|
120
|
-
const
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
throw error;
|
|
188
|
+
function buildDecryptionAttempts(payload) {
|
|
189
|
+
const attempts = [];
|
|
190
|
+
const versionCandidate = payload[MAGIC_HEADER_BUFFER.length];
|
|
191
|
+
if (versionCandidate >= 1 && versionCandidate <= CURRENT_ENCRYPTION_VERSION) {
|
|
192
|
+
attempts.push({ version: versionCandidate, offset: MAGIC_HEADER_BUFFER.length + 1 });
|
|
125
193
|
}
|
|
126
|
-
|
|
127
|
-
|
|
194
|
+
// Always include legacy offset (no version byte) for backward compatibility
|
|
195
|
+
attempts.push({ version: 1, offset: MAGIC_HEADER_BUFFER.length });
|
|
196
|
+
return attempts;
|
|
197
|
+
}
|
|
198
|
+
function decryptBuffer(payload, masterKey) {
|
|
199
|
+
const header = payload.subarray(0, MAGIC_HEADER_BUFFER.length);
|
|
200
|
+
if (!header.equals(MAGIC_HEADER_BUFFER)) {
|
|
128
201
|
const error = new Error('Encrypted chunk payload has an unknown header.');
|
|
129
202
|
error.code = 'ENCRYPTION_FORMAT_UNRECOGNIZED';
|
|
130
203
|
throw error;
|
|
131
204
|
}
|
|
132
|
-
const
|
|
133
|
-
const
|
|
134
|
-
const
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
205
|
+
const attempts = buildDecryptionAttempts(payload);
|
|
206
|
+
const errors = [];
|
|
207
|
+
for (const attempt of attempts) {
|
|
208
|
+
const { version, offset } = attempt;
|
|
209
|
+
if (version > CURRENT_ENCRYPTION_VERSION) {
|
|
210
|
+
errors.push(Object.assign(new Error(`Unsupported encryption version ${version}`), {
|
|
211
|
+
code: 'ENCRYPTION_VERSION_UNSUPPORTED'
|
|
212
|
+
}));
|
|
213
|
+
continue;
|
|
214
|
+
}
|
|
215
|
+
const minimumLength = offset + SALT_LENGTH + IV_LENGTH + TAG_LENGTH + 1;
|
|
216
|
+
if (!payload || payload.length < minimumLength) {
|
|
217
|
+
errors.push(Object.assign(new Error('Encrypted chunk payload is truncated.'), {
|
|
218
|
+
code: 'ENCRYPTION_PAYLOAD_INVALID'
|
|
219
|
+
}));
|
|
220
|
+
continue;
|
|
221
|
+
}
|
|
222
|
+
const saltStart = offset;
|
|
223
|
+
const ivStart = saltStart + SALT_LENGTH;
|
|
224
|
+
const cipherStart = ivStart + IV_LENGTH;
|
|
225
|
+
const cipherEnd = payload.length - TAG_LENGTH;
|
|
226
|
+
const salt = payload.subarray(saltStart, saltStart + SALT_LENGTH);
|
|
227
|
+
const iv = payload.subarray(ivStart, ivStart + IV_LENGTH);
|
|
228
|
+
const ciphertext = payload.subarray(cipherStart, cipherEnd);
|
|
229
|
+
const tag = payload.subarray(cipherEnd);
|
|
230
|
+
const derivedKey = deriveChunkKey(masterKey, salt);
|
|
231
|
+
const decipher = crypto.createDecipheriv('aes-256-gcm', derivedKey, iv);
|
|
232
|
+
decipher.setAuthTag(tag);
|
|
233
|
+
try {
|
|
234
|
+
return Buffer.concat([decipher.update(ciphertext), decipher.final()]);
|
|
235
|
+
}
|
|
236
|
+
catch (error) {
|
|
237
|
+
const authError = new Error('authentication failed');
|
|
238
|
+
authError.code = 'ENCRYPTION_AUTH_FAILED';
|
|
239
|
+
authError.cause = error;
|
|
240
|
+
errors.push(authError);
|
|
241
|
+
}
|
|
151
242
|
}
|
|
243
|
+
const finalError = errors[errors.length - 1] || new Error('Decryption failed');
|
|
244
|
+
throw finalError;
|
|
152
245
|
}
|
|
153
246
|
function getChunkPaths(chunkDir, sha) {
|
|
154
247
|
const plainPath = path.join(chunkDir, `${sha}.gz`);
|
|
@@ -173,28 +266,47 @@ export function writeChunkToDisk({ chunkDir, sha, code, encryption }) {
|
|
|
173
266
|
}
|
|
174
267
|
return { encrypted: false, path: plainPath };
|
|
175
268
|
}
|
|
176
|
-
export function readChunkFromDisk({ chunkDir, sha, key
|
|
269
|
+
export function readChunkFromDisk({ chunkDir, sha, key, keySet }) {
|
|
177
270
|
const { plainPath, encryptedPath } = getChunkPaths(chunkDir, sha);
|
|
271
|
+
const keys = keySet || getEncryptionKeySet();
|
|
272
|
+
const primaryKey = key ?? keys.primary;
|
|
178
273
|
if (fs.existsSync(encryptedPath)) {
|
|
179
|
-
|
|
274
|
+
const candidateKeys = [];
|
|
275
|
+
if (primaryKey)
|
|
276
|
+
candidateKeys.push(primaryKey);
|
|
277
|
+
if (keys.deprecated.length > 0) {
|
|
278
|
+
candidateKeys.push(...keys.deprecated);
|
|
279
|
+
}
|
|
280
|
+
if (candidateKeys.length === 0) {
|
|
180
281
|
const error = new Error(`Chunk ${sha} is encrypted and no CODEVAULT_ENCRYPTION_KEY is configured.`);
|
|
181
282
|
error.code = 'ENCRYPTION_KEY_REQUIRED';
|
|
182
283
|
throw error;
|
|
183
284
|
}
|
|
184
285
|
const payload = fs.readFileSync(encryptedPath);
|
|
185
|
-
let decrypted;
|
|
186
|
-
|
|
187
|
-
|
|
286
|
+
let decrypted = null;
|
|
287
|
+
const errors = [];
|
|
288
|
+
for (const candidate of candidateKeys) {
|
|
289
|
+
try {
|
|
290
|
+
decrypted = decryptBuffer(payload, candidate);
|
|
291
|
+
break;
|
|
292
|
+
}
|
|
293
|
+
catch (error) {
|
|
294
|
+
errors.push(error);
|
|
295
|
+
continue;
|
|
296
|
+
}
|
|
188
297
|
}
|
|
189
|
-
|
|
190
|
-
|
|
298
|
+
if (!decrypted) {
|
|
299
|
+
const lastError = errors[errors.length - 1];
|
|
300
|
+
if (lastError && lastError.code === 'ENCRYPTION_AUTH_FAILED') {
|
|
191
301
|
const authError = new Error(`Failed to decrypt chunk ${sha}: authentication failed.`);
|
|
192
302
|
authError.code = 'ENCRYPTION_AUTH_FAILED';
|
|
193
|
-
authError.cause =
|
|
303
|
+
authError.cause = lastError;
|
|
194
304
|
throw authError;
|
|
195
305
|
}
|
|
196
|
-
|
|
197
|
-
|
|
306
|
+
const genericError = new Error(`Failed to decrypt chunk ${sha}: ${lastError?.message || 'unknown error'}`);
|
|
307
|
+
genericError.code = lastError?.code || 'ENCRYPTION_DECRYPT_FAILED';
|
|
308
|
+
genericError.cause = lastError;
|
|
309
|
+
throw genericError;
|
|
198
310
|
}
|
|
199
311
|
try {
|
|
200
312
|
const code = zlib.gunzipSync(decrypted).toString('utf8');
|