codevault 1.6.0 → 1.6.1

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 (237) hide show
  1. package/dist/chunking/file-grouper.d.ts +39 -0
  2. package/dist/chunking/file-grouper.d.ts.map +1 -0
  3. package/dist/chunking/file-grouper.js +164 -0
  4. package/dist/chunking/file-grouper.js.map +1 -0
  5. package/dist/chunking/semantic-chunker.d.ts +37 -0
  6. package/dist/chunking/semantic-chunker.d.ts.map +1 -0
  7. package/dist/chunking/semantic-chunker.js +157 -0
  8. package/dist/chunking/semantic-chunker.js.map +1 -0
  9. package/dist/chunking/token-counter.d.ts +28 -0
  10. package/dist/chunking/token-counter.d.ts.map +1 -0
  11. package/dist/chunking/token-counter.js +207 -0
  12. package/dist/chunking/token-counter.js.map +1 -0
  13. package/dist/cli/commands/ask-cmd.d.ts +3 -0
  14. package/dist/cli/commands/ask-cmd.d.ts.map +1 -0
  15. package/dist/cli/commands/ask-cmd.js +130 -0
  16. package/dist/cli/commands/ask-cmd.js.map +1 -0
  17. package/dist/cli/commands/chat-cmd.d.ts +3 -0
  18. package/dist/cli/commands/chat-cmd.d.ts.map +1 -0
  19. package/dist/cli/commands/chat-cmd.js +194 -0
  20. package/dist/cli/commands/chat-cmd.js.map +1 -0
  21. package/dist/cli/commands/config-cmd.d.ts +3 -0
  22. package/dist/cli/commands/config-cmd.d.ts.map +1 -0
  23. package/dist/cli/commands/config-cmd.js +245 -0
  24. package/dist/cli/commands/config-cmd.js.map +1 -0
  25. package/dist/cli/commands/context.d.ts +3 -0
  26. package/dist/cli/commands/context.d.ts.map +1 -0
  27. package/dist/cli/commands/context.js +98 -0
  28. package/dist/cli/commands/context.js.map +1 -0
  29. package/dist/cli/commands/interactive-config.d.ts +2 -0
  30. package/dist/cli/commands/interactive-config.d.ts.map +1 -0
  31. package/dist/cli/commands/interactive-config.js +274 -0
  32. package/dist/cli/commands/interactive-config.js.map +1 -0
  33. package/dist/cli.d.ts +3 -0
  34. package/dist/cli.d.ts.map +1 -0
  35. package/dist/cli.js +403 -0
  36. package/dist/cli.js.map +1 -0
  37. package/dist/codemap/io.d.ts +5 -0
  38. package/dist/codemap/io.d.ts.map +1 -0
  39. package/dist/codemap/io.js +30 -0
  40. package/dist/codemap/io.js.map +1 -0
  41. package/dist/config/apply-env.d.ts +15 -0
  42. package/dist/config/apply-env.d.ts.map +1 -0
  43. package/dist/config/apply-env.js +91 -0
  44. package/dist/config/apply-env.js.map +1 -0
  45. package/dist/config/constants.d.ts +326 -0
  46. package/dist/config/constants.d.ts.map +1 -0
  47. package/dist/config/constants.js +214 -0
  48. package/dist/config/constants.js.map +1 -0
  49. package/dist/config/loader.d.ts +57 -0
  50. package/dist/config/loader.d.ts.map +1 -0
  51. package/dist/config/loader.js +287 -0
  52. package/dist/config/loader.js.map +1 -0
  53. package/dist/config/types.d.ts +46 -0
  54. package/dist/config/types.d.ts.map +1 -0
  55. package/dist/config/types.js +2 -0
  56. package/dist/config/types.js.map +1 -0
  57. package/dist/context/packs.d.ts +33 -0
  58. package/dist/context/packs.d.ts.map +1 -0
  59. package/dist/context/packs.js +180 -0
  60. package/dist/context/packs.js.map +1 -0
  61. package/dist/core/batch-indexer.d.ts +56 -0
  62. package/dist/core/batch-indexer.d.ts.map +1 -0
  63. package/dist/core/batch-indexer.js +189 -0
  64. package/dist/core/batch-indexer.js.map +1 -0
  65. package/dist/core/indexer.d.ts +3 -0
  66. package/dist/core/indexer.d.ts.map +1 -0
  67. package/dist/core/indexer.js +600 -0
  68. package/dist/core/indexer.js.map +1 -0
  69. package/dist/core/metadata.d.ts +19 -0
  70. package/dist/core/metadata.d.ts.map +1 -0
  71. package/dist/core/metadata.js +161 -0
  72. package/dist/core/metadata.js.map +1 -0
  73. package/dist/core/search.d.ts +7 -0
  74. package/dist/core/search.d.ts.map +1 -0
  75. package/dist/core/search.js +545 -0
  76. package/dist/core/search.js.map +1 -0
  77. package/dist/core/symbol-extractor.d.ts +3 -0
  78. package/dist/core/symbol-extractor.d.ts.map +1 -0
  79. package/dist/core/symbol-extractor.js +78 -0
  80. package/dist/core/symbol-extractor.js.map +1 -0
  81. package/dist/core/types.d.ts +104 -0
  82. package/dist/core/types.d.ts.map +1 -0
  83. package/dist/core/types.js +2 -0
  84. package/dist/core/types.js.map +1 -0
  85. package/dist/database/db.d.ts +102 -0
  86. package/dist/database/db.d.ts.map +1 -0
  87. package/dist/database/db.js +366 -0
  88. package/dist/database/db.js.map +1 -0
  89. package/dist/indexer/merkle.d.ts +13 -0
  90. package/dist/indexer/merkle.d.ts.map +1 -0
  91. package/dist/indexer/merkle.js +86 -0
  92. package/dist/indexer/merkle.js.map +1 -0
  93. package/dist/indexer/update.d.ts +19 -0
  94. package/dist/indexer/update.d.ts.map +1 -0
  95. package/dist/indexer/update.js +40 -0
  96. package/dist/indexer/update.js.map +1 -0
  97. package/dist/indexer/watch.d.ts +21 -0
  98. package/dist/indexer/watch.d.ts.map +1 -0
  99. package/dist/indexer/watch.js +222 -0
  100. package/dist/indexer/watch.js.map +1 -0
  101. package/dist/languages/rules.d.ts +11 -0
  102. package/dist/languages/rules.d.ts.map +1 -0
  103. package/dist/languages/rules.js +371 -0
  104. package/dist/languages/rules.js.map +1 -0
  105. package/dist/languages/tree-sitter-loader.d.ts +27 -0
  106. package/dist/languages/tree-sitter-loader.d.ts.map +1 -0
  107. package/dist/languages/tree-sitter-loader.js +76 -0
  108. package/dist/languages/tree-sitter-loader.js.map +1 -0
  109. package/dist/mcp/schemas.d.ts +166 -0
  110. package/dist/mcp/schemas.d.ts.map +1 -0
  111. package/dist/mcp/schemas.js +159 -0
  112. package/dist/mcp/schemas.js.map +1 -0
  113. package/dist/mcp/tools/ask-codebase.d.ts +85 -0
  114. package/dist/mcp/tools/ask-codebase.d.ts.map +1 -0
  115. package/dist/mcp/tools/ask-codebase.js +125 -0
  116. package/dist/mcp/tools/ask-codebase.js.map +1 -0
  117. package/dist/mcp/tools/use-context-pack.d.ts +57 -0
  118. package/dist/mcp/tools/use-context-pack.d.ts.map +1 -0
  119. package/dist/mcp/tools/use-context-pack.js +91 -0
  120. package/dist/mcp/tools/use-context-pack.js.map +1 -0
  121. package/dist/mcp-server.d.ts +3 -0
  122. package/dist/mcp-server.d.ts.map +1 -0
  123. package/dist/mcp-server.js +511 -0
  124. package/dist/mcp-server.js.map +1 -0
  125. package/dist/providers/base.d.ts +39 -0
  126. package/dist/providers/base.d.ts.map +1 -0
  127. package/dist/providers/base.js +198 -0
  128. package/dist/providers/base.js.map +1 -0
  129. package/dist/providers/chat-llm.d.ts +30 -0
  130. package/dist/providers/chat-llm.d.ts.map +1 -0
  131. package/dist/providers/chat-llm.js +85 -0
  132. package/dist/providers/chat-llm.js.map +1 -0
  133. package/dist/providers/index.d.ts +5 -0
  134. package/dist/providers/index.d.ts.map +1 -0
  135. package/dist/providers/index.js +12 -0
  136. package/dist/providers/index.js.map +1 -0
  137. package/dist/providers/openai.d.ts +14 -0
  138. package/dist/providers/openai.d.ts.map +1 -0
  139. package/dist/providers/openai.js +122 -0
  140. package/dist/providers/openai.js.map +1 -0
  141. package/dist/providers/token-counter.d.ts +2 -0
  142. package/dist/providers/token-counter.d.ts.map +1 -0
  143. package/dist/providers/token-counter.js +18 -0
  144. package/dist/providers/token-counter.js.map +1 -0
  145. package/dist/ranking/api-reranker.d.ts +18 -0
  146. package/dist/ranking/api-reranker.d.ts.map +1 -0
  147. package/dist/ranking/api-reranker.js +134 -0
  148. package/dist/ranking/api-reranker.js.map +1 -0
  149. package/dist/ranking/symbol-boost.d.ts +15 -0
  150. package/dist/ranking/symbol-boost.d.ts.map +1 -0
  151. package/dist/ranking/symbol-boost.js +175 -0
  152. package/dist/ranking/symbol-boost.js.map +1 -0
  153. package/dist/search/bm25.d.ts +17 -0
  154. package/dist/search/bm25.d.ts.map +1 -0
  155. package/dist/search/bm25.js +56 -0
  156. package/dist/search/bm25.js.map +1 -0
  157. package/dist/search/hybrid.d.ts +21 -0
  158. package/dist/search/hybrid.d.ts.map +1 -0
  159. package/dist/search/hybrid.js +50 -0
  160. package/dist/search/hybrid.js.map +1 -0
  161. package/dist/search/scope.d.ts +5 -0
  162. package/dist/search/scope.d.ts.map +1 -0
  163. package/dist/search/scope.js +107 -0
  164. package/dist/search/scope.js.map +1 -0
  165. package/dist/storage/encrypted-chunks.d.ts +40 -0
  166. package/dist/storage/encrypted-chunks.d.ts.map +1 -0
  167. package/dist/storage/encrypted-chunks.js +238 -0
  168. package/dist/storage/encrypted-chunks.js.map +1 -0
  169. package/dist/symbols/extract.d.ts +15 -0
  170. package/dist/symbols/extract.d.ts.map +1 -0
  171. package/dist/symbols/extract.js +208 -0
  172. package/dist/symbols/extract.js.map +1 -0
  173. package/dist/symbols/graph.d.ts +3 -0
  174. package/dist/symbols/graph.d.ts.map +1 -0
  175. package/dist/symbols/graph.js +89 -0
  176. package/dist/symbols/graph.js.map +1 -0
  177. package/dist/synthesis/conversational-synthesizer.d.ts +61 -0
  178. package/dist/synthesis/conversational-synthesizer.d.ts.map +1 -0
  179. package/dist/synthesis/conversational-synthesizer.js +286 -0
  180. package/dist/synthesis/conversational-synthesizer.js.map +1 -0
  181. package/dist/synthesis/markdown-formatter.d.ts +13 -0
  182. package/dist/synthesis/markdown-formatter.d.ts.map +1 -0
  183. package/dist/synthesis/markdown-formatter.js +104 -0
  184. package/dist/synthesis/markdown-formatter.js.map +1 -0
  185. package/dist/synthesis/prompt-builder.d.ts +21 -0
  186. package/dist/synthesis/prompt-builder.d.ts.map +1 -0
  187. package/dist/synthesis/prompt-builder.js +129 -0
  188. package/dist/synthesis/prompt-builder.js.map +1 -0
  189. package/dist/synthesis/synthesizer.d.ts +30 -0
  190. package/dist/synthesis/synthesizer.d.ts.map +1 -0
  191. package/dist/synthesis/synthesizer.js +210 -0
  192. package/dist/synthesis/synthesizer.js.map +1 -0
  193. package/dist/types/ast.d.ts +3 -0
  194. package/dist/types/ast.d.ts.map +1 -0
  195. package/dist/types/ast.js +2 -0
  196. package/dist/types/ast.js.map +1 -0
  197. package/dist/types/codemap.d.ts +58 -0
  198. package/dist/types/codemap.d.ts.map +1 -0
  199. package/dist/types/codemap.js +224 -0
  200. package/dist/types/codemap.js.map +1 -0
  201. package/dist/types/context-pack.d.ts +47 -0
  202. package/dist/types/context-pack.d.ts.map +1 -0
  203. package/dist/types/context-pack.js +44 -0
  204. package/dist/types/context-pack.js.map +1 -0
  205. package/dist/types/search.d.ts +15 -0
  206. package/dist/types/search.d.ts.map +1 -0
  207. package/dist/types/search.js +11 -0
  208. package/dist/types/search.js.map +1 -0
  209. package/dist/utils/cli-ui.d.ts +44 -0
  210. package/dist/utils/cli-ui.d.ts.map +1 -0
  211. package/dist/utils/cli-ui.js +139 -0
  212. package/dist/utils/cli-ui.js.map +1 -0
  213. package/dist/utils/indexer-with-progress.d.ts +10 -0
  214. package/dist/utils/indexer-with-progress.d.ts.map +1 -0
  215. package/dist/utils/indexer-with-progress.js +43 -0
  216. package/dist/utils/indexer-with-progress.js.map +1 -0
  217. package/dist/utils/logger.d.ts +55 -0
  218. package/dist/utils/logger.d.ts.map +1 -0
  219. package/dist/utils/logger.js +121 -0
  220. package/dist/utils/logger.js.map +1 -0
  221. package/dist/utils/mutex.d.ts +63 -0
  222. package/dist/utils/mutex.d.ts.map +1 -0
  223. package/dist/utils/mutex.js +123 -0
  224. package/dist/utils/mutex.js.map +1 -0
  225. package/dist/utils/path-helpers.d.ts +27 -0
  226. package/dist/utils/path-helpers.d.ts.map +1 -0
  227. package/dist/utils/path-helpers.js +55 -0
  228. package/dist/utils/path-helpers.js.map +1 -0
  229. package/dist/utils/rate-limiter.d.ts +34 -0
  230. package/dist/utils/rate-limiter.d.ts.map +1 -0
  231. package/dist/utils/rate-limiter.js +178 -0
  232. package/dist/utils/rate-limiter.js.map +1 -0
  233. package/dist/utils/scan-patterns.d.ts +5 -0
  234. package/dist/utils/scan-patterns.d.ts.map +1 -0
  235. package/dist/utils/scan-patterns.js +29 -0
  236. package/dist/utils/scan-patterns.js.map +1 -0
  237. package/package.json +1 -1
@@ -0,0 +1,134 @@
1
+ function getAPIUrl() {
2
+ return process.env.CODEVAULT_RERANK_API_URL || '';
3
+ }
4
+ function getAPIKey() {
5
+ return process.env.CODEVAULT_RERANK_API_KEY || '';
6
+ }
7
+ function getModel() {
8
+ return process.env.CODEVAULT_RERANK_MODEL || 'rerank-v3.5';
9
+ }
10
+ function getMaxFromEnv() {
11
+ const envMax = Number.parseInt(process.env.CODEVAULT_RERANKER_MAX || '50', 10);
12
+ return Number.isFinite(envMax) && envMax > 0 ? envMax : 50;
13
+ }
14
+ function getMaxTokensFromEnv() {
15
+ const envMax = Number.parseInt(process.env.CODEVAULT_RERANKER_MAX_TOKENS || '8192', 10);
16
+ return Number.isFinite(envMax) && envMax > 0 ? envMax : 8192;
17
+ }
18
+ function truncateText(text, maxTokens) {
19
+ if (!text || typeof text !== 'string') {
20
+ return '';
21
+ }
22
+ const maxChars = maxTokens * 4;
23
+ if (text.length <= maxChars) {
24
+ return text;
25
+ }
26
+ return text.slice(0, maxChars);
27
+ }
28
+ export function isAPIRerankingConfigured() {
29
+ const url = getAPIUrl();
30
+ const key = getAPIKey();
31
+ return Boolean(url && key);
32
+ }
33
+ async function callRerankAPI(query, documents, config = {}) {
34
+ const apiUrl = config.apiUrl || getAPIUrl();
35
+ const apiKey = config.apiKey || getAPIKey();
36
+ const model = config.model || getModel();
37
+ if (!apiUrl) {
38
+ throw new Error('CODEVAULT_RERANK_API_URL is not configured');
39
+ }
40
+ if (!apiKey) {
41
+ throw new Error('CODEVAULT_RERANK_API_KEY is not configured');
42
+ }
43
+ // Standard reranking API format (Novita, Cohere, Jina AI, Voyage AI)
44
+ const requestBody = {
45
+ model: model,
46
+ query: query,
47
+ documents: documents,
48
+ top_n: documents.length
49
+ };
50
+ const response = await fetch(apiUrl, {
51
+ method: 'POST',
52
+ headers: {
53
+ 'Content-Type': 'application/json',
54
+ 'Authorization': `Bearer ${apiKey}`
55
+ },
56
+ body: JSON.stringify(requestBody)
57
+ });
58
+ if (!response.ok) {
59
+ const errorText = await response.text().catch(() => 'Unknown error');
60
+ throw new Error(`Rerank API error (${response.status}): ${errorText}`);
61
+ }
62
+ const data = await response.json();
63
+ // Handle standard reranking response format
64
+ // Most providers (Novita, Cohere, Jina AI, Voyage AI) use this format
65
+ if (data.results && Array.isArray(data.results)) {
66
+ return data.results;
67
+ }
68
+ // Alternative response format (some providers use data array)
69
+ if (data.data && Array.isArray(data.data)) {
70
+ return data.data;
71
+ }
72
+ // Fallback for direct array response
73
+ if (Array.isArray(data)) {
74
+ return data;
75
+ }
76
+ throw new Error(`Unexpected rerank API response format. Expected {results: [...]} but got: ${JSON.stringify(data).slice(0, 200)}`);
77
+ }
78
+ export async function rerankWithAPI(query, candidates, options = {}) {
79
+ if (!Array.isArray(candidates) || candidates.length <= 1) {
80
+ return candidates;
81
+ }
82
+ const maxCandidates = Math.min(typeof options.max === 'number' && Number.isFinite(options.max) && options.max > 0
83
+ ? Math.floor(options.max)
84
+ : getMaxFromEnv(), candidates.length);
85
+ if (maxCandidates <= 1) {
86
+ return candidates;
87
+ }
88
+ const topCandidates = candidates.slice(0, maxCandidates);
89
+ const maxTokens = options.maxTokens || getMaxTokensFromEnv();
90
+ try {
91
+ const texts = await Promise.all(topCandidates.map(async (candidate) => {
92
+ let text;
93
+ if (options.getTextAsync && typeof options.getTextAsync === 'function') {
94
+ text = await options.getTextAsync(candidate);
95
+ }
96
+ else if (options.getText && typeof options.getText === 'function') {
97
+ text = options.getText(candidate);
98
+ }
99
+ else {
100
+ text = '';
101
+ }
102
+ const textStr = typeof text === 'string' ? text : '';
103
+ return truncateText(textStr, maxTokens);
104
+ }));
105
+ const apiConfig = {
106
+ apiUrl: options.apiUrl,
107
+ apiKey: options.apiKey,
108
+ model: options.model
109
+ };
110
+ const results = await callRerankAPI(query, texts, apiConfig);
111
+ const scoreMap = new Map();
112
+ for (const result of results) {
113
+ const index = result.index;
114
+ const score = result.relevance_score || result.score || 0;
115
+ scoreMap.set(index, score);
116
+ }
117
+ const scored = topCandidates.map((candidate, index) => ({
118
+ candidate,
119
+ score: scoreMap.get(index) || 0
120
+ })).sort((a, b) => b.score - a.score);
121
+ scored.forEach((entry, index) => {
122
+ entry.candidate.rerankerScore = entry.score;
123
+ entry.candidate.rerankerRank = index + 1;
124
+ });
125
+ const rerankedTop = scored.map(entry => entry.candidate);
126
+ const remainder = candidates.slice(maxCandidates);
127
+ return [...rerankedTop, ...remainder];
128
+ }
129
+ catch (error) {
130
+ console.error('API reranking failed:', error.message);
131
+ return candidates;
132
+ }
133
+ }
134
+ //# sourceMappingURL=api-reranker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-reranker.js","sourceRoot":"","sources":["../../src/ranking/api-reranker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { Codemap } from '../types/codemap.js';
2
+ interface SearchResult {
3
+ id: string;
4
+ score?: number;
5
+ symbolBoost?: number;
6
+ symbolBoostSources?: string[];
7
+ symbolMatchStrength?: number;
8
+ symbolNeighborStrength?: number;
9
+ }
10
+ export declare function applySymbolBoost(results: SearchResult[], { query, codemap }: {
11
+ query: string;
12
+ codemap: Codemap;
13
+ }): void;
14
+ export {};
15
+ //# sourceMappingURL=symbol-boost.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"symbol-boost.d.ts","sourceRoot":"","sources":["../../src/ranking/symbol-boost.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAQnD,UAAU,YAAY;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACjC;AAmJD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CA4DvH"}
@@ -0,0 +1,175 @@
1
+ import { SYMBOL_BOOST_CONSTANTS } from '../config/constants.js';
2
+ const SIGNATURE_MATCH_BOOST = SYMBOL_BOOST_CONSTANTS.SIGNATURE_MATCH_BOOST;
3
+ const NEIGHBOR_MATCH_BOOST = SYMBOL_BOOST_CONSTANTS.NEIGHBOR_MATCH_BOOST;
4
+ const MIN_TOKEN_LENGTH = SYMBOL_BOOST_CONSTANTS.MIN_TOKEN_LENGTH;
5
+ const MAX_SYMBOL_BOOST = SYMBOL_BOOST_CONSTANTS.MAX_SYMBOL_BOOST;
6
+ // Regex cache for performance
7
+ const regexCache = new Map();
8
+ const MAX_CACHE_SIZE = 1000;
9
+ function escapeRegex(value) {
10
+ return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
11
+ }
12
+ function buildQueryTokenRegex(token) {
13
+ if (!token || token.length < MIN_TOKEN_LENGTH) {
14
+ return null;
15
+ }
16
+ // Check cache first
17
+ const cached = regexCache.get(token);
18
+ if (cached) {
19
+ return cached;
20
+ }
21
+ const escaped = escapeRegex(token.toLowerCase());
22
+ const regex = new RegExp(`\\b${escaped}[a-z0-9_]*\\b`, 'i');
23
+ // Add to cache with size limit
24
+ if (regexCache.size >= MAX_CACHE_SIZE) {
25
+ // Clear oldest entries (simple FIFO)
26
+ const firstKey = regexCache.keys().next().value;
27
+ if (firstKey !== undefined) {
28
+ regexCache.delete(firstKey);
29
+ }
30
+ }
31
+ regexCache.set(token, regex);
32
+ return regex;
33
+ }
34
+ function splitSymbolWords(symbol) {
35
+ if (!symbol) {
36
+ return [];
37
+ }
38
+ const cleaned = symbol.replace(/[^A-Za-z0-9_]/g, ' ');
39
+ return cleaned
40
+ .replace(/([a-z])([A-Z])/g, '$1 $2')
41
+ .split(/[\s_]+/)
42
+ .map(word => word.trim().toLowerCase())
43
+ .filter(word => word.length > 0);
44
+ }
45
+ function computeSignatureMatchStrength(query, entry) {
46
+ if (!entry) {
47
+ return 0;
48
+ }
49
+ const queryLower = query.toLowerCase();
50
+ const rawSymbol = typeof entry.symbol === 'string' ? entry.symbol : '';
51
+ const symbol = rawSymbol.toLowerCase();
52
+ const signature = typeof entry.symbol_signature === 'string' ? entry.symbol_signature.toLowerCase() : '';
53
+ let weight = 0;
54
+ const matchedTokens = new Set();
55
+ if (symbol && queryLower.includes(symbol)) {
56
+ weight += 4;
57
+ }
58
+ if (signature) {
59
+ const normalizedSignature = signature.replace(/\s+/g, ' ');
60
+ if (queryLower.includes(normalizedSignature)) {
61
+ weight = Math.max(weight, 3.5);
62
+ }
63
+ }
64
+ const symbolTokens = splitSymbolWords(rawSymbol).map(token => token.toLowerCase());
65
+ let symbolTokenMatches = 0;
66
+ for (const token of symbolTokens) {
67
+ if (token.length < MIN_TOKEN_LENGTH || matchedTokens.has(token)) {
68
+ continue;
69
+ }
70
+ const regex = buildQueryTokenRegex(token);
71
+ if (regex && regex.test(query)) {
72
+ matchedTokens.add(token);
73
+ symbolTokenMatches += 1;
74
+ }
75
+ }
76
+ if (symbolTokenMatches > 0) {
77
+ weight += 1 + 0.5 * (symbolTokenMatches - 1);
78
+ }
79
+ let parameterMatches = 0;
80
+ if (Array.isArray(entry.symbol_parameters)) {
81
+ for (const param of entry.symbol_parameters) {
82
+ if (typeof param !== 'string') {
83
+ continue;
84
+ }
85
+ const parts = param
86
+ .toLowerCase()
87
+ .split(/[^a-z0-9]+/)
88
+ .map(part => part.trim())
89
+ .filter(part => part.length >= MIN_TOKEN_LENGTH);
90
+ for (const part of parts) {
91
+ if (matchedTokens.has(part)) {
92
+ continue;
93
+ }
94
+ const regex = buildQueryTokenRegex(part);
95
+ if (regex && regex.test(query)) {
96
+ matchedTokens.add(part);
97
+ parameterMatches += 1;
98
+ break;
99
+ }
100
+ }
101
+ }
102
+ }
103
+ if (parameterMatches > 0) {
104
+ weight += 0.35 * parameterMatches;
105
+ }
106
+ if (weight <= 0) {
107
+ return 0;
108
+ }
109
+ return Math.max(0, Math.min(weight / 4, 1));
110
+ }
111
+ function buildShaIndex(codemap) {
112
+ const index = new Map();
113
+ if (!codemap || typeof codemap !== 'object') {
114
+ return index;
115
+ }
116
+ for (const [chunkId, entry] of Object.entries(codemap)) {
117
+ if (!entry || typeof entry.sha !== 'string') {
118
+ continue;
119
+ }
120
+ index.set(entry.sha, { chunkId, entry });
121
+ }
122
+ return index;
123
+ }
124
+ export function applySymbolBoost(results, { query, codemap }) {
125
+ if (!Array.isArray(results) || results.length === 0) {
126
+ return;
127
+ }
128
+ if (!codemap || typeof codemap !== 'object') {
129
+ return;
130
+ }
131
+ const shaIndex = buildShaIndex(codemap);
132
+ for (const result of results) {
133
+ const metadata = codemap[result.id];
134
+ if (!metadata) {
135
+ continue;
136
+ }
137
+ let boost = 0;
138
+ const sources = [];
139
+ const matchStrength = computeSignatureMatchStrength(query, metadata);
140
+ if (matchStrength > 0) {
141
+ boost += SIGNATURE_MATCH_BOOST * matchStrength;
142
+ sources.push('signature');
143
+ result.symbolMatchStrength = matchStrength;
144
+ }
145
+ const neighborShas = Array.isArray(metadata.symbol_neighbors)
146
+ ? metadata.symbol_neighbors
147
+ : [];
148
+ let bestNeighborStrength = 0;
149
+ if (neighborShas.length > 0) {
150
+ for (const neighborSha of neighborShas) {
151
+ const neighbor = shaIndex.get(neighborSha);
152
+ if (!neighbor) {
153
+ continue;
154
+ }
155
+ const neighborStrength = computeSignatureMatchStrength(query, neighbor.entry);
156
+ if (neighborStrength > bestNeighborStrength) {
157
+ bestNeighborStrength = neighborStrength;
158
+ }
159
+ }
160
+ }
161
+ if (bestNeighborStrength > 0) {
162
+ boost += NEIGHBOR_MATCH_BOOST * bestNeighborStrength;
163
+ sources.push('neighbor');
164
+ result.symbolNeighborStrength = bestNeighborStrength;
165
+ }
166
+ if (boost > 0) {
167
+ const cappedBoost = Math.min(boost, MAX_SYMBOL_BOOST);
168
+ const baseScore = typeof result.score === 'number' ? result.score : 0;
169
+ result.score = baseScore + cappedBoost;
170
+ result.symbolBoost = cappedBoost;
171
+ result.symbolBoostSources = sources;
172
+ }
173
+ }
174
+ }
175
+ //# sourceMappingURL=symbol-boost.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"symbol-boost.js","sourceRoot":"","sources":["../../src/ranking/symbol-boost.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ export declare class BM25Index {
2
+ private engine;
3
+ private documents;
4
+ private consolidated;
5
+ constructor();
6
+ addDocument(id: string, text: string): void;
7
+ addDocuments(entries?: Array<{
8
+ id: string;
9
+ text: string;
10
+ }>): void;
11
+ consolidate(): void;
12
+ search(query: string, limit?: number): Array<{
13
+ id: string;
14
+ score: number;
15
+ }>;
16
+ }
17
+ //# sourceMappingURL=bm25.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bm25.d.ts","sourceRoot":"","sources":["../../src/search/bm25.ts"],"names":[],"mappings":"AAgBA,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAM;IACpB,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;IAOnB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CASxE"}
@@ -0,0 +1,56 @@
1
+ import bm25Factory from 'wink-bm25-text-search';
2
+ const DEFAULT_FIELD = 'body';
3
+ function defaultPrep(text) {
4
+ if (!text) {
5
+ return [];
6
+ }
7
+ return String(text)
8
+ .toLowerCase()
9
+ .replace(/[^\p{L}\p{N}]+/gu, ' ')
10
+ .split(/\s+/u)
11
+ .filter(Boolean);
12
+ }
13
+ export class BM25Index {
14
+ engine;
15
+ documents = new Set();
16
+ consolidated = false;
17
+ constructor() {
18
+ this.engine = bm25Factory();
19
+ this.engine.defineConfig({ fldWeights: { [DEFAULT_FIELD]: 1 } });
20
+ this.engine.definePrepTasks([defaultPrep]);
21
+ }
22
+ addDocument(id, text) {
23
+ if (!id || typeof text !== 'string' || text.trim().length === 0) {
24
+ return;
25
+ }
26
+ if (this.documents.has(id)) {
27
+ return;
28
+ }
29
+ this.engine.addDoc({ [DEFAULT_FIELD]: text }, id);
30
+ this.documents.add(id);
31
+ this.consolidated = false;
32
+ }
33
+ addDocuments(entries = []) {
34
+ for (const entry of entries) {
35
+ if (!entry)
36
+ continue;
37
+ const { id, text } = entry;
38
+ this.addDocument(id, text);
39
+ }
40
+ }
41
+ consolidate() {
42
+ if (!this.consolidated) {
43
+ this.engine.consolidate();
44
+ this.consolidated = true;
45
+ }
46
+ }
47
+ search(query, limit = 60) {
48
+ if (!query || !query.trim()) {
49
+ return [];
50
+ }
51
+ this.consolidate();
52
+ const results = this.engine.search(query, limit);
53
+ return results.map(([id, score]) => ({ id, score }));
54
+ }
55
+ }
56
+ //# sourceMappingURL=bm25.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bm25.js","sourceRoot":"","sources":["../../src/search/bm25.ts"],"names":[],"mappings":"AAAA,OAAO,WAAW,MAAM,uBAAuB,CAAC;AAEhD,MAAM,aAAa,GAAG,MAAM,CAAC;AAE7B,SAAS,WAAW,CAAC,IAAY;IAC/B,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC;SAChB,WAAW,EAAE;SACb,OAAO,CAAC,kBAAkB,EAAE,GAAG,CAAC;SAChC,KAAK,CAAC,MAAM,CAAC;SACb,MAAM,CAAC,OAAO,CAAC,CAAC;AACrB,CAAC;AAED,MAAM,OAAO,SAAS;IACZ,MAAM,CAAM;IACZ,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9B,YAAY,GAAG,KAAK,CAAC;IAE7B;QACE,IAAI,CAAC,MAAM,GAAG,WAAW,EAAE,CAAC;QAC5B,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,UAAU,EAAE,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QACjE,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;IAC7C,CAAC;IAED,WAAW,CAAC,EAAU,EAAE,IAAY;QAClC,IAAI,CAAC,EAAE,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChE,OAAO;QACT,CAAC;QAED,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YAC3B,OAAO;QACT,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QAClD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACvB,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;IAC5B,CAAC;IAED,YAAY,CAAC,UAA+C,EAAE;QAC5D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,CAAC,KAAK;gBAAE,SAAS;YACrB,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC;YAC3B,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,WAAW;QACT,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;YAC1B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,MAAM,CAAC,KAAa,EAAE,KAAK,GAAG,EAAE;QAC9B,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;YAC5B,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACjD,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,CAAmB,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IACzE,CAAC;CACF"}
@@ -0,0 +1,21 @@
1
+ interface SearchItem {
2
+ id: string;
3
+ score: number;
4
+ }
5
+ interface FusedItem {
6
+ id: string;
7
+ score: number;
8
+ vectorRank: number | null;
9
+ bm25Rank: number | null;
10
+ vectorScore: number | null;
11
+ bm25Score: number | null;
12
+ }
13
+ interface ReciprocalRankFusionOptions {
14
+ vectorResults?: SearchItem[];
15
+ bm25Results?: SearchItem[];
16
+ limit?: number;
17
+ k?: number;
18
+ }
19
+ export declare function reciprocalRankFusion({ vectorResults, bm25Results, limit, k }: ReciprocalRankFusionOptions): FusedItem[];
20
+ export {};
21
+ //# sourceMappingURL=hybrid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hybrid.d.ts","sourceRoot":"","sources":["../../src/search/hybrid.ts"],"names":[],"mappings":"AAAA,UAAU,UAAU;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;CACf;AAED,UAAU,SAAS;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,UAAU,2BAA2B;IACnC,aAAa,CAAC,EAAE,UAAU,EAAE,CAAC;IAC7B,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,CAAC,CAAC,EAAE,MAAM,CAAC;CACZ;AAED,wBAAgB,oBAAoB,CAAC,EACnC,aAAkB,EAClB,WAAgB,EAChB,KAAU,EACV,CAAM,EACP,EAAE,2BAA2B,GAAG,SAAS,EAAE,CAwD3C"}
@@ -0,0 +1,50 @@
1
+ export function reciprocalRankFusion({ vectorResults = [], bm25Results = [], limit = 10, k = 60 }) {
2
+ const scores = new Map();
3
+ const addScores = (items, source) => {
4
+ items.forEach((item, index) => {
5
+ if (!item || typeof item.id === 'undefined') {
6
+ return;
7
+ }
8
+ const rankContribution = 1 / (k + index + 1);
9
+ const existing = scores.get(item.id) || {
10
+ id: item.id,
11
+ score: 0,
12
+ vectorRank: null,
13
+ bm25Rank: null,
14
+ vectorScore: null,
15
+ bm25Score: null
16
+ };
17
+ existing.score += rankContribution;
18
+ if (source === 'vector') {
19
+ existing.vectorRank = index;
20
+ existing.vectorScore = item.score;
21
+ }
22
+ else if (source === 'bm25') {
23
+ existing.bm25Rank = index;
24
+ existing.bm25Score = item.score;
25
+ }
26
+ scores.set(item.id, existing);
27
+ });
28
+ };
29
+ addScores(vectorResults, 'vector');
30
+ addScores(bm25Results, 'bm25');
31
+ return Array.from(scores.values())
32
+ .sort((a, b) => {
33
+ if (b.score !== a.score) {
34
+ return b.score - a.score;
35
+ }
36
+ const aVectorRank = typeof a.vectorRank === 'number' ? a.vectorRank : Number.MAX_SAFE_INTEGER;
37
+ const bVectorRank = typeof b.vectorRank === 'number' ? b.vectorRank : Number.MAX_SAFE_INTEGER;
38
+ if (aVectorRank !== bVectorRank) {
39
+ return aVectorRank - bVectorRank;
40
+ }
41
+ const aBmRank = typeof a.bm25Rank === 'number' ? a.bm25Rank : Number.MAX_SAFE_INTEGER;
42
+ const bBmRank = typeof b.bm25Rank === 'number' ? b.bm25Rank : Number.MAX_SAFE_INTEGER;
43
+ if (aBmRank !== bBmRank) {
44
+ return aBmRank - bBmRank;
45
+ }
46
+ return 0;
47
+ })
48
+ .slice(0, limit);
49
+ }
50
+ //# sourceMappingURL=hybrid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hybrid.js","sourceRoot":"","sources":["../../src/search/hybrid.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { type ScopeFilters } from '../types/search.js';
2
+ export declare function normalizeScopeFilters(scope?: any): ScopeFilters;
3
+ import type { DatabaseChunk } from '../database/db.js';
4
+ export declare function applyScope(chunks: DatabaseChunk[], scope?: ScopeFilters): DatabaseChunk[];
5
+ //# sourceMappingURL=scope.d.ts.map
@@ -0,0 +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;AAkC5G,wBAAgB,qBAAqB,CAAC,KAAK,GAAE,GAAQ,GAAG,YAAY,CAmCnE;AAED,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD,wBAAgB,UAAU,CAAC,MAAM,EAAE,aAAa,EAAE,EAAE,KAAK,GAAE,YAAiB,GAAG,aAAa,EAAE,CAwD7F"}
@@ -0,0 +1,107 @@
1
+ import micromatch from 'micromatch';
2
+ import { DEFAULT_RERANKER, RERANKER_OPTIONS } from '../types/search.js';
3
+ function toArray(value) {
4
+ if (!value) {
5
+ return [];
6
+ }
7
+ return Array.isArray(value) ? value : [value];
8
+ }
9
+ function normalizeList(values) {
10
+ return toArray(values)
11
+ .map(value => (typeof value === 'string' ? value.trim() : ''))
12
+ .filter(Boolean);
13
+ }
14
+ function normalizeToggle(value, defaultValue) {
15
+ if (typeof value === 'boolean') {
16
+ return value;
17
+ }
18
+ if (typeof value === 'string') {
19
+ const normalized = value.trim().toLowerCase();
20
+ if (['on', 'true', '1', 'yes', 'enable', 'enabled'].includes(normalized)) {
21
+ return true;
22
+ }
23
+ if (['off', 'false', '0', 'no', 'disable', 'disabled'].includes(normalized)) {
24
+ return false;
25
+ }
26
+ }
27
+ return defaultValue;
28
+ }
29
+ export function normalizeScopeFilters(scope = {}) {
30
+ const normalized = {};
31
+ const normalizedPath = normalizeList(scope.path_glob || scope.pathGlob || scope.path);
32
+ if (normalizedPath.length > 0) {
33
+ normalized.path_glob = normalizedPath;
34
+ }
35
+ const normalizedTags = normalizeList(scope.tags || scope.tag);
36
+ if (normalizedTags.length > 0) {
37
+ normalized.tags = normalizedTags.map(tag => tag.toLowerCase());
38
+ }
39
+ const normalizedLang = normalizeList(scope.lang || scope.language || scope.languages);
40
+ if (normalizedLang.length > 0) {
41
+ normalized.lang = normalizedLang.map(lang => lang.toLowerCase());
42
+ }
43
+ const candidateProvider = typeof scope.provider === 'string' ? scope.provider.trim() : '';
44
+ if (candidateProvider) {
45
+ normalized.provider = candidateProvider;
46
+ }
47
+ const candidateReranker = typeof scope.reranker === 'string' ? scope.reranker.trim() : '';
48
+ if (candidateReranker && RERANKER_OPTIONS.includes(candidateReranker)) {
49
+ normalized.reranker = candidateReranker;
50
+ }
51
+ else {
52
+ normalized.reranker = DEFAULT_RERANKER;
53
+ }
54
+ normalized.hybrid = normalizeToggle(scope.hybrid, true);
55
+ normalized.bm25 = normalizeToggle(scope.bm25, true);
56
+ normalized.symbol_boost = normalizeToggle(scope.symbol_boost, true);
57
+ return normalized;
58
+ }
59
+ export function applyScope(chunks, scope = {}) {
60
+ if (!Array.isArray(chunks) || chunks.length === 0) {
61
+ return chunks;
62
+ }
63
+ const normalized = {
64
+ path_glob: Array.isArray(scope.path_glob) ? scope.path_glob : normalizeList(scope.path_glob),
65
+ tags: Array.isArray(scope.tags) ? scope.tags : normalizeList(scope.tags).map(tag => tag.toLowerCase()),
66
+ lang: Array.isArray(scope.lang) ? scope.lang : normalizeList(scope.lang).map(lang => lang.toLowerCase())
67
+ };
68
+ let filtered = chunks;
69
+ if (normalized.path_glob && normalized.path_glob.length > 0) {
70
+ filtered = filtered.filter(chunk => {
71
+ const filePath = chunk.file_path || '';
72
+ if (!filePath) {
73
+ return false;
74
+ }
75
+ return micromatch.isMatch(filePath, normalized.path_glob, { dot: true });
76
+ });
77
+ }
78
+ if (normalized.tags && normalized.tags.length > 0) {
79
+ const tagSet = new Set(normalized.tags);
80
+ filtered = filtered.filter(chunk => {
81
+ if (!chunk.codevault_tags) {
82
+ return false;
83
+ }
84
+ try {
85
+ const tags = JSON.parse(chunk.codevault_tags || '[]');
86
+ if (!Array.isArray(tags)) {
87
+ return false;
88
+ }
89
+ return tags.some(tag => typeof tag === 'string' && tagSet.has(tag.toLowerCase()));
90
+ }
91
+ catch (error) {
92
+ return false;
93
+ }
94
+ });
95
+ }
96
+ if (normalized.lang && normalized.lang.length > 0) {
97
+ const langSet = new Set(normalized.lang);
98
+ filtered = filtered.filter(chunk => {
99
+ if (!chunk.lang) {
100
+ return false;
101
+ }
102
+ return langSet.has(String(chunk.lang).toLowerCase());
103
+ });
104
+ }
105
+ return filtered;
106
+ }
107
+ //# sourceMappingURL=scope.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scope.js","sourceRoot":"","sources":["../../src/search/scope.ts"],"names":[],"mappings":"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"}