codebase-context 1.4.1 → 1.6.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 (89) hide show
  1. package/README.md +193 -45
  2. package/dist/analyzers/generic/index.d.ts +0 -1
  3. package/dist/analyzers/generic/index.d.ts.map +1 -1
  4. package/dist/analyzers/generic/index.js +0 -13
  5. package/dist/analyzers/generic/index.js.map +1 -1
  6. package/dist/constants/codebase-context.d.ts +2 -0
  7. package/dist/constants/codebase-context.d.ts.map +1 -1
  8. package/dist/constants/codebase-context.js +2 -0
  9. package/dist/constants/codebase-context.js.map +1 -1
  10. package/dist/constants/git-patterns.d.ts +12 -0
  11. package/dist/constants/git-patterns.d.ts.map +1 -0
  12. package/dist/constants/git-patterns.js +11 -0
  13. package/dist/constants/git-patterns.js.map +1 -0
  14. package/dist/core/analyzer-registry.d.ts.map +1 -1
  15. package/dist/core/analyzer-registry.js +3 -1
  16. package/dist/core/analyzer-registry.js.map +1 -1
  17. package/dist/core/indexer.d.ts +2 -0
  18. package/dist/core/indexer.d.ts.map +1 -1
  19. package/dist/core/indexer.js +179 -34
  20. package/dist/core/indexer.js.map +1 -1
  21. package/dist/core/manifest.d.ts +39 -0
  22. package/dist/core/manifest.d.ts.map +1 -0
  23. package/dist/core/manifest.js +86 -0
  24. package/dist/core/manifest.js.map +1 -0
  25. package/dist/core/reranker.d.ts +23 -0
  26. package/dist/core/reranker.d.ts.map +1 -0
  27. package/dist/core/reranker.js +120 -0
  28. package/dist/core/reranker.js.map +1 -0
  29. package/dist/core/search-quality.d.ts +10 -0
  30. package/dist/core/search-quality.d.ts.map +1 -0
  31. package/dist/core/search-quality.js +64 -0
  32. package/dist/core/search-quality.js.map +1 -0
  33. package/dist/core/search.d.ts +26 -2
  34. package/dist/core/search.d.ts.map +1 -1
  35. package/dist/core/search.js +508 -69
  36. package/dist/core/search.js.map +1 -1
  37. package/dist/embeddings/transformers.d.ts.map +1 -1
  38. package/dist/embeddings/transformers.js +17 -7
  39. package/dist/embeddings/transformers.js.map +1 -1
  40. package/dist/embeddings/types.d.ts.map +1 -1
  41. package/dist/embeddings/types.js +3 -0
  42. package/dist/embeddings/types.js.map +1 -1
  43. package/dist/index.d.ts +1 -1
  44. package/dist/index.d.ts.map +1 -1
  45. package/dist/index.js +460 -55
  46. package/dist/index.js.map +1 -1
  47. package/dist/memory/git-memory.d.ts +9 -0
  48. package/dist/memory/git-memory.d.ts.map +1 -0
  49. package/dist/memory/git-memory.js +51 -0
  50. package/dist/memory/git-memory.js.map +1 -0
  51. package/dist/memory/store.d.ts +16 -0
  52. package/dist/memory/store.d.ts.map +1 -1
  53. package/dist/memory/store.js +40 -1
  54. package/dist/memory/store.js.map +1 -1
  55. package/dist/patterns/semantics.d.ts +4 -0
  56. package/dist/patterns/semantics.d.ts.map +1 -0
  57. package/dist/patterns/semantics.js +24 -0
  58. package/dist/patterns/semantics.js.map +1 -0
  59. package/dist/preflight/evidence-lock.d.ts +50 -0
  60. package/dist/preflight/evidence-lock.d.ts.map +1 -0
  61. package/dist/preflight/evidence-lock.js +130 -0
  62. package/dist/preflight/evidence-lock.js.map +1 -0
  63. package/dist/preflight/query-scope.d.ts +3 -0
  64. package/dist/preflight/query-scope.d.ts.map +1 -0
  65. package/dist/preflight/query-scope.js +40 -0
  66. package/dist/preflight/query-scope.js.map +1 -0
  67. package/dist/resources/uri.d.ts +5 -0
  68. package/dist/resources/uri.d.ts.map +1 -0
  69. package/dist/resources/uri.js +15 -0
  70. package/dist/resources/uri.js.map +1 -0
  71. package/dist/storage/lancedb.d.ts +1 -0
  72. package/dist/storage/lancedb.d.ts.map +1 -1
  73. package/dist/storage/lancedb.js +24 -3
  74. package/dist/storage/lancedb.js.map +1 -1
  75. package/dist/storage/types.d.ts +5 -0
  76. package/dist/storage/types.d.ts.map +1 -1
  77. package/dist/storage/types.js.map +1 -1
  78. package/dist/types/index.d.ts +20 -3
  79. package/dist/types/index.d.ts.map +1 -1
  80. package/dist/utils/chunking.js +2 -2
  81. package/dist/utils/chunking.js.map +1 -1
  82. package/dist/utils/git-dates.d.ts +1 -0
  83. package/dist/utils/git-dates.d.ts.map +1 -1
  84. package/dist/utils/git-dates.js +20 -0
  85. package/dist/utils/git-dates.js.map +1 -1
  86. package/dist/utils/usage-tracker.d.ts.map +1 -1
  87. package/dist/utils/usage-tracker.js +3 -8
  88. package/dist/utils/usage-tracker.js.map +1 -1
  89. package/package.json +17 -9
@@ -0,0 +1,120 @@
1
+ /**
2
+ * Stage-2 cross-encoder reranker for search results.
3
+ *
4
+ * Triggered by score ambiguity (clustered top scores), not by intent.
5
+ * Uses a lightweight cross-encoder to re-score (query, passage) pairs,
6
+ * converting high top-3 recall into better top-1 accuracy.
7
+ *
8
+ * Default model: Xenova/ms-marco-MiniLM-L-6-v2 (~22M params, ~80MB, CPU-safe).
9
+ */
10
+ const DEFAULT_RERANKER_MODEL = 'Xenova/ms-marco-MiniLM-L-6-v2';
11
+ /** How many top results to rerank (keeps latency bounded) */
12
+ const RERANK_TOP_K = 10;
13
+ /** Trigger reranking when the score gap between #1 and #3 is below this threshold */
14
+ const AMBIGUITY_THRESHOLD = 0.08;
15
+ let cachedTokenizer = null;
16
+ let cachedModel = null;
17
+ let initPromise = null;
18
+ async function ensureModelLoaded() {
19
+ if (cachedModel && cachedTokenizer)
20
+ return;
21
+ if (initPromise)
22
+ return initPromise;
23
+ initPromise = (async () => {
24
+ const { AutoTokenizer, AutoModelForSequenceClassification } = await import('@huggingface/transformers');
25
+ console.error(`[reranker] Loading cross-encoder: ${DEFAULT_RERANKER_MODEL}`);
26
+ console.error('[reranker] (First run will download the model — this may take a moment)');
27
+ cachedTokenizer = await AutoTokenizer.from_pretrained(DEFAULT_RERANKER_MODEL);
28
+ cachedModel = await AutoModelForSequenceClassification.from_pretrained(DEFAULT_RERANKER_MODEL, {
29
+ dtype: 'q8'
30
+ });
31
+ console.error('[reranker] Cross-encoder loaded successfully');
32
+ })();
33
+ return initPromise;
34
+ }
35
+ /**
36
+ * Build a compact passage from a search result for cross-encoder scoring.
37
+ * Keeps it short — cross-encoders are slow on long inputs.
38
+ */
39
+ function buildPassage(result) {
40
+ const parts = [];
41
+ // File path is critical signal
42
+ parts.push(`path: ${result.filePath.replace(/\\/g, '/')}`);
43
+ // Component type / layer if available
44
+ if (result.componentType && result.componentType !== 'unknown') {
45
+ parts.push(`type: ${result.componentType}`);
46
+ }
47
+ if (result.layer && result.layer !== 'unknown') {
48
+ parts.push(`layer: ${result.layer}`);
49
+ }
50
+ // Summary is the most information-dense field
51
+ if (result.summary) {
52
+ parts.push(result.summary);
53
+ }
54
+ // Snippet: first ~500 chars (cross-encoder has 512-token context)
55
+ if (result.snippet) {
56
+ const trimmed = result.snippet.slice(0, 500);
57
+ parts.push(trimmed);
58
+ }
59
+ return parts.join('\n');
60
+ }
61
+ /**
62
+ * Score a single (query, passage) pair using the cross-encoder.
63
+ * Returns a relevance score (higher = more relevant).
64
+ */
65
+ async function scorePair(query, passage) {
66
+ const inputs = cachedTokenizer(query, passage, {
67
+ padding: true,
68
+ truncation: true,
69
+ max_length: 512
70
+ });
71
+ const output = await cachedModel(inputs);
72
+ // Cross-encoder outputs a single logit for relevance
73
+ const score = output.logits.data[0];
74
+ return score;
75
+ }
76
+ /**
77
+ * Detect whether the result set has ambiguous ordering.
78
+ * Returns true when the top scores are clustered, meaning
79
+ * the embedding model isn't confident about the ranking.
80
+ */
81
+ export function isAmbiguous(results) {
82
+ if (results.length < 3)
83
+ return false;
84
+ const topScore = results[0].score;
85
+ const thirdScore = results[Math.min(2, results.length - 1)].score;
86
+ const gap = topScore - thirdScore;
87
+ return gap < AMBIGUITY_THRESHOLD;
88
+ }
89
+ /**
90
+ * Rerank the top-K results using a cross-encoder.
91
+ * Only reranks when scores are ambiguous (clustered).
92
+ * Returns the full result array with the top-K portion re-ordered.
93
+ */
94
+ export async function rerank(query, results) {
95
+ if (results.length <= 1)
96
+ return results;
97
+ if (!isAmbiguous(results))
98
+ return results;
99
+ await ensureModelLoaded();
100
+ const toRerank = results.slice(0, Math.min(RERANK_TOP_K, results.length));
101
+ const rest = results.slice(toRerank.length);
102
+ // Score each result against the query using the cross-encoder
103
+ const scored = [];
104
+ for (const result of toRerank) {
105
+ const passage = buildPassage(result);
106
+ const crossScore = await scorePair(query, passage);
107
+ scored.push({ result, crossScore });
108
+ }
109
+ // Sort by cross-encoder score (descending)
110
+ scored.sort((a, b) => b.crossScore - a.crossScore);
111
+ // Rebuild the result array: reranked top-K + unchanged rest
112
+ // Sigmoid normalizes raw logits to [0,1] so downstream quality gating works
113
+ const sigmoid = (x) => 1 / (1 + Math.exp(-x));
114
+ const reranked = scored.map(({ result, crossScore }) => ({
115
+ ...result,
116
+ score: sigmoid(crossScore)
117
+ }));
118
+ return [...reranked, ...rest];
119
+ }
120
+ //# sourceMappingURL=reranker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reranker.js","sourceRoot":"","sources":["../../src/core/reranker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { SearchResult } from '../types/index.js';
2
+ export interface SearchQualityAssessment {
3
+ status: 'ok' | 'low_confidence';
4
+ confidence: number;
5
+ signals: string[];
6
+ nextSteps?: string[];
7
+ }
8
+ export declare function isTestArtifactPath(filePath: string): boolean;
9
+ export declare function assessSearchQuality(query: string, results: SearchResult[]): SearchQualityAssessment;
10
+ //# sourceMappingURL=search-quality.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-quality.d.ts","sourceRoot":"","sources":["../../src/core/search-quality.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAGtD,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,IAAI,GAAG,gBAAgB,CAAC;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAQ5D;AAED,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,YAAY,EAAE,GACtB,uBAAuB,CA2DzB"}
@@ -0,0 +1,64 @@
1
+ import { isTestingRelatedQuery } from '../preflight/query-scope.js';
2
+ export function isTestArtifactPath(filePath) {
3
+ const normalized = filePath.toLowerCase().replace(/\\/g, '/');
4
+ return (normalized.includes('.spec.') ||
5
+ normalized.includes('.test.') ||
6
+ normalized.includes('/e2e/') ||
7
+ normalized.includes('/__tests__/'));
8
+ }
9
+ export function assessSearchQuality(query, results) {
10
+ if (results.length === 0) {
11
+ return {
12
+ status: 'low_confidence',
13
+ confidence: 0,
14
+ signals: ['no results returned'],
15
+ nextSteps: [
16
+ 'Try a narrower query with one concrete symbol, route, or file hint.',
17
+ 'Apply search filters (framework/language/componentType/layer).',
18
+ 'Use get_component_usage for dependency or wiring lookups.'
19
+ ]
20
+ };
21
+ }
22
+ const topSlice = results.slice(0, Math.min(3, results.length));
23
+ const topScore = results[0].score;
24
+ const secondScore = results[1]?.score ?? topScore;
25
+ const topAverage = topSlice.reduce((sum, result) => sum + result.score, 0) / topSlice.length;
26
+ const topSeparation = Math.max(0, topScore - secondScore);
27
+ const testRatio = topSlice.filter((result) => isTestArtifactPath(result.filePath)).length / topSlice.length;
28
+ const queryIsTesting = isTestingRelatedQuery(query);
29
+ const signals = [];
30
+ if (topScore < 0.3) {
31
+ signals.push(`low top score (${topScore.toFixed(2)})`);
32
+ }
33
+ if (topAverage < 0.32) {
34
+ signals.push(`weak top-${topSlice.length} average (${topAverage.toFixed(2)})`);
35
+ }
36
+ if (topSlice.length > 1 && topSeparation < 0.03) {
37
+ signals.push(`tight top spread (${topSeparation.toFixed(2)})`);
38
+ }
39
+ if (!queryIsTesting && testRatio >= 0.67) {
40
+ signals.push(`test artifacts dominate top-${topSlice.length} (${Math.round(testRatio * 100)}%)`);
41
+ }
42
+ let confidence = topScore;
43
+ if (topAverage < 0.32)
44
+ confidence -= 0.08;
45
+ if (topSlice.length > 1 && topSeparation < 0.03)
46
+ confidence -= 0.05;
47
+ if (!queryIsTesting && testRatio >= 0.67)
48
+ confidence -= 0.15;
49
+ confidence = Math.max(0, Math.min(1, Number(confidence.toFixed(2))));
50
+ const lowConfidence = signals.length >= 2 || confidence < 0.35;
51
+ return {
52
+ status: lowConfidence ? 'low_confidence' : 'ok',
53
+ confidence,
54
+ signals,
55
+ ...(lowConfidence && {
56
+ nextSteps: [
57
+ 'Add one or two concrete symbols, routes, or file hints to the query.',
58
+ 'Apply filters (framework/language/componentType/layer) to narrow candidates.',
59
+ 'Use get_component_usage when the question is about wiring or usages.'
60
+ ]
61
+ })
62
+ };
63
+ }
64
+ //# sourceMappingURL=search-quality.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-quality.js","sourceRoot":"","sources":["../../src/core/search-quality.ts"],"names":[],"mappings":"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"}
@@ -7,7 +7,14 @@ export interface SearchOptions {
7
7
  useKeywordSearch?: boolean;
8
8
  semanticWeight?: number;
9
9
  keywordWeight?: number;
10
+ profile?: SearchIntentProfile;
11
+ enableQueryExpansion?: boolean;
12
+ enableLowConfidenceRescue?: boolean;
13
+ candidateFloor?: number;
14
+ /** Enable stage-2 cross-encoder reranking when top scores are ambiguous. Default: true. */
15
+ enableReranker?: boolean;
10
16
  }
17
+ export type SearchIntentProfile = 'explore' | 'edit' | 'refactor' | 'migrate';
11
18
  export declare class CodebaseSearcher {
12
19
  private rootPath;
13
20
  private storagePath;
@@ -17,17 +24,34 @@ export declare class CodebaseSearcher {
17
24
  private storageProvider;
18
25
  private initialized;
19
26
  private patternIntelligence;
27
+ private importCentrality;
20
28
  constructor(rootPath: string);
21
29
  initialize(): Promise<void>;
22
30
  private loadKeywordIndex;
23
31
  /**
24
- * v1.2: Load pattern intelligence for trend detection and warnings
32
+ * Load pattern intelligence for trend detection and warnings
25
33
  */
26
34
  private loadPatternIntelligence;
27
35
  /**
28
- * v1.2: Detect pattern trend from chunk content
36
+ * Detect pattern trend from chunk content
29
37
  */
30
38
  private detectChunkTrend;
39
+ private isTestFile;
40
+ private normalizeQueryTerms;
41
+ /**
42
+ * Classify query intent based on heuristic patterns
43
+ */
44
+ private classifyQueryIntent;
45
+ private buildQueryVariants;
46
+ private isTemplateOrStyleFile;
47
+ private isCompositionRootFile;
48
+ private queryPathTokenOverlap;
49
+ private isLikelyWiringOrFlowQuery;
50
+ private isActionOrHowQuery;
51
+ private isDefinitionHeavyResult;
52
+ private scoreAndSortResults;
53
+ private pickBetterResultSet;
54
+ private collectHybridMatches;
31
55
  search(query: string, limit?: number, filters?: SearchFilters, options?: SearchOptions): Promise<SearchResult[]>;
32
56
  private generateSummary;
33
57
  private generateSnippet;
@@ -1 +1 @@
1
- {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/core/search.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,OAAO,EAAa,YAAY,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAY3E,MAAM,WAAW,aAAa;IAC5B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AASD,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,WAAW,CAAS;IAE5B,OAAO,CAAC,SAAS,CAAgC;IACjD,OAAO,CAAC,MAAM,CAAmB;IAEjC,OAAO,CAAC,iBAAiB,CAAkC;IAC3D,OAAO,CAAC,eAAe,CAAsC;IAE7D,OAAO,CAAC,WAAW,CAAS;IAG5B,OAAO,CAAC,mBAAmB,CAIX;gBAEJ,QAAQ,EAAE,MAAM;IAKtB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;YAsBnB,gBAAgB;IA4B9B;;OAEG;YACW,uBAAuB;IAsDrC;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA+BlB,MAAM,CACV,KAAK,EAAE,MAAM,EACb,KAAK,GAAE,MAAU,EACjB,OAAO,CAAC,EAAE,aAAa,EACvB,OAAO,GAAE,aAAsC,GAC9C,OAAO,CAAC,YAAY,EAAE,CAAC;IAiH1B,OAAO,CAAC,eAAe;IAiDvB,OAAO,CAAC,eAAe;YAWT,cAAc;YAmBd,aAAa;IA4E3B,OAAO,CAAC,uBAAuB;IAoBzB,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC;IAOtC,OAAO,IAAI,OAAO;CAGnB"}
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/core/search.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,OAAO,EAAa,YAAY,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAe3E,MAAM,WAAW,aAAa;IAC5B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,mBAAmB,CAAC;IAC9B,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,yBAAyB,CAAC,EAAE,OAAO,CAAC;IACpC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,2FAA2F;IAC3F,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,MAAM,mBAAmB,GAAG,SAAS,GAAG,MAAM,GAAG,UAAU,GAAG,SAAS,CAAC;AA0E9E,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,WAAW,CAAS;IAE5B,OAAO,CAAC,SAAS,CAAgC;IACjD,OAAO,CAAC,MAAM,CAAmB;IAEjC,OAAO,CAAC,iBAAiB,CAAkC;IAC3D,OAAO,CAAC,eAAe,CAAsC;IAE7D,OAAO,CAAC,WAAW,CAAS;IAG5B,OAAO,CAAC,mBAAmB,CAIX;IAEhB,OAAO,CAAC,gBAAgB,CAAoC;gBAEhD,QAAQ,EAAE,MAAM;IAKtB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;YAsBnB,gBAAgB;IA4B9B;;OAEG;YACW,uBAAuB;IA8ErC;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA+BxB,OAAO,CAAC,UAAU;IAUlB,OAAO,CAAC,mBAAmB;IAO3B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAqE3B,OAAO,CAAC,kBAAkB;IAkC1B,OAAO,CAAC,qBAAqB;IAK7B,OAAO,CAAC,qBAAqB;IAe7B,OAAO,CAAC,qBAAqB;IAQ7B,OAAO,CAAC,yBAAyB;IAMjC,OAAO,CAAC,kBAAkB;IAM1B,OAAO,CAAC,uBAAuB;IAc/B,OAAO,CAAC,mBAAmB;IAwP3B,OAAO,CAAC,mBAAmB;YAuBb,oBAAoB;IAkF5B,MAAM,CACV,KAAK,EAAE,MAAM,EACb,KAAK,GAAE,MAAU,EACjB,OAAO,CAAC,EAAE,aAAa,EACvB,OAAO,GAAE,aAAsC,GAC9C,OAAO,CAAC,YAAY,EAAE,CAAC;IAoG1B,OAAO,CAAC,eAAe;IAiDvB,OAAO,CAAC,eAAe;YAWT,cAAc;YAmBd,aAAa;IA4E3B,OAAO,CAAC,uBAAuB;IAoBzB,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC;IAOtC,OAAO,IAAI,OAAO;CAGnB"}