codevault 1.6.0 → 1.7.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.
- package/dist/chunking/file-grouper.d.ts +39 -0
- package/dist/chunking/file-grouper.d.ts.map +1 -0
- package/dist/chunking/file-grouper.js +164 -0
- package/dist/chunking/file-grouper.js.map +1 -0
- package/dist/chunking/semantic-chunker.d.ts +37 -0
- package/dist/chunking/semantic-chunker.d.ts.map +1 -0
- package/dist/chunking/semantic-chunker.js +157 -0
- package/dist/chunking/semantic-chunker.js.map +1 -0
- package/dist/chunking/token-counter.d.ts +28 -0
- package/dist/chunking/token-counter.d.ts.map +1 -0
- package/dist/chunking/token-counter.js +178 -0
- package/dist/chunking/token-counter.js.map +1 -0
- package/dist/cli/commands/ask-cmd.d.ts +3 -0
- package/dist/cli/commands/ask-cmd.d.ts.map +1 -0
- package/dist/cli/commands/ask-cmd.js +130 -0
- package/dist/cli/commands/ask-cmd.js.map +1 -0
- package/dist/cli/commands/chat-cmd.d.ts +3 -0
- package/dist/cli/commands/chat-cmd.d.ts.map +1 -0
- package/dist/cli/commands/chat-cmd.js +194 -0
- package/dist/cli/commands/chat-cmd.js.map +1 -0
- package/dist/cli/commands/config-cmd.d.ts +3 -0
- package/dist/cli/commands/config-cmd.d.ts.map +1 -0
- package/dist/cli/commands/config-cmd.js +245 -0
- package/dist/cli/commands/config-cmd.js.map +1 -0
- package/dist/cli/commands/context.d.ts +3 -0
- package/dist/cli/commands/context.d.ts.map +1 -0
- package/dist/cli/commands/context.js +98 -0
- package/dist/cli/commands/context.js.map +1 -0
- package/dist/cli/commands/interactive-config.d.ts +2 -0
- package/dist/cli/commands/interactive-config.d.ts.map +1 -0
- package/dist/cli/commands/interactive-config.js +274 -0
- package/dist/cli/commands/interactive-config.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +401 -0
- package/dist/cli.js.map +1 -0
- package/dist/codemap/io.d.ts +6 -0
- package/dist/codemap/io.d.ts.map +1 -0
- package/dist/codemap/io.js +46 -0
- package/dist/codemap/io.js.map +1 -0
- package/dist/config/apply-env.d.ts +23 -0
- package/dist/config/apply-env.d.ts.map +1 -0
- package/dist/config/apply-env.js +89 -0
- package/dist/config/apply-env.js.map +1 -0
- package/dist/config/constants.d.ts +326 -0
- package/dist/config/constants.d.ts.map +1 -0
- package/dist/config/constants.js +214 -0
- package/dist/config/constants.js.map +1 -0
- package/dist/config/loader.d.ts +57 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +287 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/resolver.d.ts +30 -0
- package/dist/config/resolver.d.ts.map +1 -0
- package/dist/config/resolver.js +29 -0
- package/dist/config/resolver.js.map +1 -0
- package/dist/config/types.d.ts +46 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +2 -0
- package/dist/config/types.js.map +1 -0
- package/dist/context/packs.d.ts +33 -0
- package/dist/context/packs.d.ts.map +1 -0
- package/dist/context/packs.js +180 -0
- package/dist/context/packs.js.map +1 -0
- package/dist/core/IndexerEngine.d.ts +24 -0
- package/dist/core/IndexerEngine.d.ts.map +1 -0
- package/dist/core/IndexerEngine.js +372 -0
- package/dist/core/IndexerEngine.js.map +1 -0
- package/dist/core/SearchService.d.ts +25 -0
- package/dist/core/SearchService.d.ts.map +1 -0
- package/dist/core/SearchService.js +455 -0
- package/dist/core/SearchService.js.map +1 -0
- package/dist/core/batch-indexer.d.ts +56 -0
- package/dist/core/batch-indexer.d.ts.map +1 -0
- package/dist/core/batch-indexer.js +192 -0
- package/dist/core/batch-indexer.js.map +1 -0
- package/dist/core/indexer.d.ts +3 -0
- package/dist/core/indexer.d.ts.map +1 -0
- package/dist/core/indexer.js +6 -0
- package/dist/core/indexer.js.map +1 -0
- package/dist/core/indexing/chunk-pipeline.d.ts +39 -0
- package/dist/core/indexing/chunk-pipeline.d.ts.map +1 -0
- package/dist/core/indexing/chunk-pipeline.js +210 -0
- package/dist/core/indexing/chunk-pipeline.js.map +1 -0
- package/dist/core/indexing/file-scanner.d.ts +11 -0
- package/dist/core/indexing/file-scanner.d.ts.map +1 -0
- package/dist/core/indexing/file-scanner.js +49 -0
- package/dist/core/indexing/file-scanner.js.map +1 -0
- package/dist/core/metadata.d.ts +19 -0
- package/dist/core/metadata.d.ts.map +1 -0
- package/dist/core/metadata.js +161 -0
- package/dist/core/metadata.js.map +1 -0
- package/dist/core/search.d.ts +7 -0
- package/dist/core/search.d.ts.map +1 -0
- package/dist/core/search.js +16 -0
- package/dist/core/search.js.map +1 -0
- package/dist/core/symbol-extractor.d.ts +3 -0
- package/dist/core/symbol-extractor.d.ts.map +1 -0
- package/dist/core/symbol-extractor.js +78 -0
- package/dist/core/symbol-extractor.js.map +1 -0
- package/dist/core/types.d.ts +104 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +2 -0
- package/dist/core/types.js.map +1 -0
- package/dist/database/db.d.ts +101 -0
- package/dist/database/db.d.ts.map +1 -0
- package/dist/database/db.js +326 -0
- package/dist/database/db.js.map +1 -0
- package/dist/indexer/merkle.d.ts +13 -0
- package/dist/indexer/merkle.d.ts.map +1 -0
- package/dist/indexer/merkle.js +86 -0
- package/dist/indexer/merkle.js.map +1 -0
- package/dist/indexer/update.d.ts +19 -0
- package/dist/indexer/update.d.ts.map +1 -0
- package/dist/indexer/update.js +40 -0
- package/dist/indexer/update.js.map +1 -0
- package/dist/indexer/watch.d.ts +21 -0
- package/dist/indexer/watch.d.ts.map +1 -0
- package/dist/indexer/watch.js +224 -0
- package/dist/indexer/watch.js.map +1 -0
- package/dist/languages/rules.d.ts +11 -0
- package/dist/languages/rules.d.ts.map +1 -0
- package/dist/languages/rules.js +371 -0
- package/dist/languages/rules.js.map +1 -0
- package/dist/languages/tree-sitter-loader.d.ts +27 -0
- package/dist/languages/tree-sitter-loader.d.ts.map +1 -0
- package/dist/languages/tree-sitter-loader.js +76 -0
- package/dist/languages/tree-sitter-loader.js.map +1 -0
- package/dist/mcp/handlers/context.d.ts +15 -0
- package/dist/mcp/handlers/context.d.ts.map +1 -0
- package/dist/mcp/handlers/context.js +31 -0
- package/dist/mcp/handlers/context.js.map +1 -0
- package/dist/mcp/handlers/index.d.ts +5 -0
- package/dist/mcp/handlers/index.d.ts.map +1 -0
- package/dist/mcp/handlers/index.js +5 -0
- package/dist/mcp/handlers/index.js.map +1 -0
- package/dist/mcp/handlers/project.d.ts +41 -0
- package/dist/mcp/handlers/project.d.ts.map +1 -0
- package/dist/mcp/handlers/project.js +76 -0
- package/dist/mcp/handlers/project.js.map +1 -0
- package/dist/mcp/handlers/search.d.ts +27 -0
- package/dist/mcp/handlers/search.d.ts.map +1 -0
- package/dist/mcp/handlers/search.js +108 -0
- package/dist/mcp/handlers/search.js.map +1 -0
- package/dist/mcp/handlers/synthesis.d.ts +15 -0
- package/dist/mcp/handlers/synthesis.d.ts.map +1 -0
- package/dist/mcp/handlers/synthesis.js +58 -0
- package/dist/mcp/handlers/synthesis.js.map +1 -0
- package/dist/mcp/schemas.d.ts +166 -0
- package/dist/mcp/schemas.d.ts.map +1 -0
- package/dist/mcp/schemas.js +159 -0
- package/dist/mcp/schemas.js.map +1 -0
- package/dist/mcp/tools/ask-codebase.d.ts +85 -0
- package/dist/mcp/tools/ask-codebase.d.ts.map +1 -0
- package/dist/mcp/tools/ask-codebase.js +125 -0
- package/dist/mcp/tools/ask-codebase.js.map +1 -0
- package/dist/mcp/tools/use-context-pack.d.ts +57 -0
- package/dist/mcp/tools/use-context-pack.d.ts.map +1 -0
- package/dist/mcp/tools/use-context-pack.js +91 -0
- package/dist/mcp/tools/use-context-pack.js.map +1 -0
- package/dist/mcp-server.d.ts +13 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/mcp-server.js +263 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/providers/base.d.ts +39 -0
- package/dist/providers/base.d.ts.map +1 -0
- package/dist/providers/base.js +198 -0
- package/dist/providers/base.js.map +1 -0
- package/dist/providers/chat-llm.d.ts +35 -0
- package/dist/providers/chat-llm.d.ts.map +1 -0
- package/dist/providers/chat-llm.js +98 -0
- package/dist/providers/chat-llm.js.map +1 -0
- package/dist/providers/index.d.ts +6 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +12 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/openai.d.ts +18 -0
- package/dist/providers/openai.d.ts.map +1 -0
- package/dist/providers/openai.js +132 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/providers/token-counter.d.ts +2 -0
- package/dist/providers/token-counter.d.ts.map +1 -0
- package/dist/providers/token-counter.js +18 -0
- package/dist/providers/token-counter.js.map +1 -0
- package/dist/ranking/api-reranker.d.ts +18 -0
- package/dist/ranking/api-reranker.d.ts.map +1 -0
- package/dist/ranking/api-reranker.js +137 -0
- package/dist/ranking/api-reranker.js.map +1 -0
- package/dist/ranking/symbol-boost.d.ts +15 -0
- package/dist/ranking/symbol-boost.d.ts.map +1 -0
- package/dist/ranking/symbol-boost.js +175 -0
- package/dist/ranking/symbol-boost.js.map +1 -0
- package/dist/search/bm25.d.ts +17 -0
- package/dist/search/bm25.d.ts.map +1 -0
- package/dist/search/bm25.js +56 -0
- package/dist/search/bm25.js.map +1 -0
- package/dist/search/hybrid.d.ts +21 -0
- package/dist/search/hybrid.d.ts.map +1 -0
- package/dist/search/hybrid.js +50 -0
- package/dist/search/hybrid.js.map +1 -0
- package/dist/search/scope.d.ts +5 -0
- package/dist/search/scope.d.ts.map +1 -0
- package/dist/search/scope.js +107 -0
- package/dist/search/scope.js.map +1 -0
- package/dist/storage/encrypted-chunks.d.ts +40 -0
- package/dist/storage/encrypted-chunks.d.ts.map +1 -0
- package/dist/storage/encrypted-chunks.js +238 -0
- package/dist/storage/encrypted-chunks.js.map +1 -0
- package/dist/symbols/extract.d.ts +15 -0
- package/dist/symbols/extract.d.ts.map +1 -0
- package/dist/symbols/extract.js +208 -0
- package/dist/symbols/extract.js.map +1 -0
- package/dist/symbols/graph.d.ts +3 -0
- package/dist/symbols/graph.d.ts.map +1 -0
- package/dist/symbols/graph.js +89 -0
- package/dist/symbols/graph.js.map +1 -0
- package/dist/synthesis/conversational-synthesizer.d.ts +61 -0
- package/dist/synthesis/conversational-synthesizer.d.ts.map +1 -0
- package/dist/synthesis/conversational-synthesizer.js +289 -0
- package/dist/synthesis/conversational-synthesizer.js.map +1 -0
- package/dist/synthesis/markdown-formatter.d.ts +13 -0
- package/dist/synthesis/markdown-formatter.d.ts.map +1 -0
- package/dist/synthesis/markdown-formatter.js +104 -0
- package/dist/synthesis/markdown-formatter.js.map +1 -0
- package/dist/synthesis/prompt-builder.d.ts +21 -0
- package/dist/synthesis/prompt-builder.d.ts.map +1 -0
- package/dist/synthesis/prompt-builder.js +129 -0
- package/dist/synthesis/prompt-builder.js.map +1 -0
- package/dist/synthesis/synthesizer.d.ts +30 -0
- package/dist/synthesis/synthesizer.d.ts.map +1 -0
- package/dist/synthesis/synthesizer.js +213 -0
- package/dist/synthesis/synthesizer.js.map +1 -0
- package/dist/tests/rate-limiter.test.d.ts +2 -0
- package/dist/tests/rate-limiter.test.d.ts.map +1 -0
- package/dist/tests/rate-limiter.test.js +11 -0
- package/dist/tests/rate-limiter.test.js.map +1 -0
- package/dist/tests/search-normalization.test.d.ts +2 -0
- package/dist/tests/search-normalization.test.d.ts.map +1 -0
- package/dist/tests/search-normalization.test.js +9 -0
- package/dist/tests/search-normalization.test.js.map +1 -0
- package/dist/tests/semantic-chunker.test.d.ts +2 -0
- package/dist/tests/semantic-chunker.test.d.ts.map +1 -0
- package/dist/tests/semantic-chunker.test.js +48 -0
- package/dist/tests/semantic-chunker.test.js.map +1 -0
- package/dist/tests/simple-lru.test.d.ts +2 -0
- package/dist/tests/simple-lru.test.d.ts.map +1 -0
- package/dist/tests/simple-lru.test.js +21 -0
- package/dist/tests/simple-lru.test.js.map +1 -0
- package/dist/tests/symbol-boost.test.d.ts +2 -0
- package/dist/tests/symbol-boost.test.d.ts.map +1 -0
- package/dist/tests/symbol-boost.test.js +21 -0
- package/dist/tests/symbol-boost.test.js.map +1 -0
- package/dist/types/ast.d.ts +3 -0
- package/dist/types/ast.d.ts.map +1 -0
- package/dist/types/ast.js +2 -0
- package/dist/types/ast.js.map +1 -0
- package/dist/types/codemap.d.ts +58 -0
- package/dist/types/codemap.d.ts.map +1 -0
- package/dist/types/codemap.js +224 -0
- package/dist/types/codemap.js.map +1 -0
- package/dist/types/context-pack.d.ts +47 -0
- package/dist/types/context-pack.d.ts.map +1 -0
- package/dist/types/context-pack.js +44 -0
- package/dist/types/context-pack.js.map +1 -0
- package/dist/types/search.d.ts +15 -0
- package/dist/types/search.d.ts.map +1 -0
- package/dist/types/search.js +11 -0
- package/dist/types/search.js.map +1 -0
- package/dist/utils/cli-ui.d.ts +44 -0
- package/dist/utils/cli-ui.d.ts.map +1 -0
- package/dist/utils/cli-ui.js +139 -0
- package/dist/utils/cli-ui.js.map +1 -0
- package/dist/utils/indexer-with-progress.d.ts +10 -0
- package/dist/utils/indexer-with-progress.d.ts.map +1 -0
- package/dist/utils/indexer-with-progress.js +43 -0
- package/dist/utils/indexer-with-progress.js.map +1 -0
- package/dist/utils/logger.d.ts +55 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +121 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/mutex.d.ts +63 -0
- package/dist/utils/mutex.d.ts.map +1 -0
- package/dist/utils/mutex.js +123 -0
- package/dist/utils/mutex.js.map +1 -0
- package/dist/utils/path-helpers.d.ts +27 -0
- package/dist/utils/path-helpers.d.ts.map +1 -0
- package/dist/utils/path-helpers.js +55 -0
- package/dist/utils/path-helpers.js.map +1 -0
- package/dist/utils/rate-limiter.d.ts +34 -0
- package/dist/utils/rate-limiter.d.ts.map +1 -0
- package/dist/utils/rate-limiter.js +178 -0
- package/dist/utils/rate-limiter.js.map +1 -0
- package/dist/utils/scan-patterns.d.ts +5 -0
- package/dist/utils/scan-patterns.d.ts.map +1 -0
- package/dist/utils/scan-patterns.js +29 -0
- package/dist/utils/scan-patterns.js.map +1 -0
- package/dist/utils/simple-lru.d.ts +10 -0
- package/dist/utils/simple-lru.d.ts.map +1 -0
- package/dist/utils/simple-lru.js +38 -0
- package/dist/utils/simple-lru.js.map +1 -0
- package/package.json +3 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversational-synthesizer.d.ts","sourceRoot":"","sources":["../../src/synthesis/conversational-synthesizer.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAGrD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,YAAY,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAChE;AAED,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,IAAI,CAAC;CACrD;AAED,MAAM,WAAW,6BAA6B;IAC5C,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,YAAY,EAAE,CAAC;CAC5B;AAED;;GAEG;AACH,wBAAsB,8BAA8B,CAClD,KAAK,EAAE,MAAM,EACb,mBAAmB,EAAE,mBAAmB,EACxC,OAAO,GAAE,8BAAmC,GAC3C,OAAO,CAAC,6BAA6B,CAAC,CAsGxC;AAED;;GAEG;AACH,wBAAuB,uCAAuC,CAC5D,KAAK,EAAE,MAAM,EACb,mBAAmB,EAAE,mBAAmB,EACxC,OAAO,GAAE,8BAAmC,GAC3C,cAAc,CAAC,MAAM,CAAC,CAoExB;AAiJD;;GAEG;AACH,wBAAgB,yBAAyB,IAAI,mBAAmB,CAK/D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,mBAAmB,EAC5B,IAAI,EAAE,gBAAgB,GACrB,IAAI,CAEN;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,mBAAmB,GAAG,IAAI,CAG3E;AAaD;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,mBAAmB,GAAG,MAAM,CAQ3E"}
|
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
import { searchCode, getChunk } from '../core/search.js';
|
|
2
|
+
import { PROMPT_TRUNCATE_LENGTH, CONVERSATION_MAX_CONTEXT_CHUNKS } from '../config/constants.js';
|
|
3
|
+
import { createChatLLMProvider } from '../providers/chat-llm.js';
|
|
4
|
+
import { resolveProviderContext } from '../config/resolver.js';
|
|
5
|
+
/**
|
|
6
|
+
* Synthesize an answer in the context of an ongoing conversation
|
|
7
|
+
*/
|
|
8
|
+
export async function synthesizeConversationalAnswer(query, conversationContext, options = {}) {
|
|
9
|
+
const { provider = 'auto', chatProvider = 'auto', workingPath = '.', scope = {}, maxChunks = 10, useReranking = true, temperature = 0.7, maxHistoryTurns = 5 } = options;
|
|
10
|
+
try {
|
|
11
|
+
const providerContext = resolveProviderContext(workingPath);
|
|
12
|
+
const chatLLM = createChatLLMProvider(chatProvider, providerContext.chat);
|
|
13
|
+
if (chatLLM.init) {
|
|
14
|
+
await chatLLM.init();
|
|
15
|
+
}
|
|
16
|
+
// Search for relevant code chunks for current query
|
|
17
|
+
const searchScope = {
|
|
18
|
+
...scope,
|
|
19
|
+
reranker: useReranking ? 'api' : 'off',
|
|
20
|
+
hybrid: true,
|
|
21
|
+
bm25: true,
|
|
22
|
+
symbol_boost: true
|
|
23
|
+
};
|
|
24
|
+
const searchResult = await searchCode(query, maxChunks, provider, workingPath, searchScope);
|
|
25
|
+
if (!searchResult.success || searchResult.results.length === 0) {
|
|
26
|
+
return {
|
|
27
|
+
success: false,
|
|
28
|
+
error: 'no_results',
|
|
29
|
+
query,
|
|
30
|
+
chunksAnalyzed: 0,
|
|
31
|
+
chatProvider: chatLLM.getName(),
|
|
32
|
+
embeddingProvider: provider
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
// Retrieve code for new chunks
|
|
36
|
+
const newChunks = searchResult.results.slice(0, maxChunks);
|
|
37
|
+
for (const result of newChunks) {
|
|
38
|
+
if (!conversationContext.allChunks.has(result.sha)) {
|
|
39
|
+
const chunkResult = await getChunk(result.sha, workingPath);
|
|
40
|
+
if (chunkResult.success && chunkResult.code) {
|
|
41
|
+
conversationContext.allChunks.set(result.sha, {
|
|
42
|
+
result,
|
|
43
|
+
code: chunkResult.code
|
|
44
|
+
});
|
|
45
|
+
// Enforce LRU cap on cached chunks
|
|
46
|
+
evictOldChunksIfNeeded(conversationContext);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// Build conversational prompt
|
|
51
|
+
const messages = buildConversationalMessages(query, conversationContext, newChunks, maxHistoryTurns);
|
|
52
|
+
// Expose selected chunks to caller for tracking
|
|
53
|
+
if (options.onChunksSelected) {
|
|
54
|
+
options.onChunksSelected(newChunks);
|
|
55
|
+
}
|
|
56
|
+
// Generate answer (non-streaming)
|
|
57
|
+
const answer = await chatLLM.generateCompletion(messages, {
|
|
58
|
+
temperature,
|
|
59
|
+
maxTokens: parseInt(process.env.CODEVAULT_CHAT_MAX_TOKENS || '4096', 10)
|
|
60
|
+
});
|
|
61
|
+
return {
|
|
62
|
+
success: true,
|
|
63
|
+
answer,
|
|
64
|
+
query,
|
|
65
|
+
chunksAnalyzed: newChunks.length,
|
|
66
|
+
chatProvider: chatLLM.getName(),
|
|
67
|
+
embeddingProvider: provider,
|
|
68
|
+
newChunks
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
return {
|
|
73
|
+
success: false,
|
|
74
|
+
error: error.message,
|
|
75
|
+
query,
|
|
76
|
+
chunksAnalyzed: 0,
|
|
77
|
+
chatProvider: chatProvider,
|
|
78
|
+
embeddingProvider: provider
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Streaming version for real-time responses
|
|
84
|
+
*/
|
|
85
|
+
export async function* synthesizeConversationalAnswerStreaming(query, conversationContext, options = {}) {
|
|
86
|
+
const { provider = 'auto', chatProvider = 'auto', workingPath = '.', scope = {}, maxChunks = 10, useReranking = true, temperature = 0.7, maxHistoryTurns = 5 } = options;
|
|
87
|
+
const providerContext = resolveProviderContext(workingPath);
|
|
88
|
+
const chatLLM = createChatLLMProvider(chatProvider, providerContext.chat);
|
|
89
|
+
if (chatLLM.init) {
|
|
90
|
+
await chatLLM.init();
|
|
91
|
+
}
|
|
92
|
+
// Search for relevant code chunks
|
|
93
|
+
const searchScope = {
|
|
94
|
+
...scope,
|
|
95
|
+
reranker: useReranking ? 'api' : 'off',
|
|
96
|
+
hybrid: true,
|
|
97
|
+
bm25: true,
|
|
98
|
+
symbol_boost: true
|
|
99
|
+
};
|
|
100
|
+
const searchResult = await searchCode(query, maxChunks, provider, workingPath, searchScope);
|
|
101
|
+
if (!searchResult.success || searchResult.results.length === 0) {
|
|
102
|
+
yield `**No relevant code found for:** "${query}"\n\n`;
|
|
103
|
+
yield `Please try rephrasing your question or ensure the project is indexed.`;
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
// Retrieve code for new chunks
|
|
107
|
+
const newChunks = searchResult.results.slice(0, maxChunks);
|
|
108
|
+
for (const result of newChunks) {
|
|
109
|
+
if (!conversationContext.allChunks.has(result.sha)) {
|
|
110
|
+
const chunkResult = await getChunk(result.sha, workingPath);
|
|
111
|
+
if (chunkResult.success && chunkResult.code) {
|
|
112
|
+
conversationContext.allChunks.set(result.sha, {
|
|
113
|
+
result,
|
|
114
|
+
code: chunkResult.code
|
|
115
|
+
});
|
|
116
|
+
// Enforce LRU cap on cached chunks
|
|
117
|
+
evictOldChunksIfNeeded(conversationContext);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
// Build messages with conversation history
|
|
122
|
+
const messages = buildConversationalMessages(query, conversationContext, newChunks, maxHistoryTurns);
|
|
123
|
+
// Expose selected chunks to caller for tracking
|
|
124
|
+
if (options.onChunksSelected) {
|
|
125
|
+
options.onChunksSelected(newChunks);
|
|
126
|
+
}
|
|
127
|
+
// Stream the response
|
|
128
|
+
for await (const chunk of chatLLM.generateStreamingCompletion(messages, { temperature })) {
|
|
129
|
+
yield chunk;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Build messages array with conversation history
|
|
134
|
+
*/
|
|
135
|
+
function buildConversationalMessages(currentQuery, context, newChunks, maxHistoryTurns) {
|
|
136
|
+
const messages = [];
|
|
137
|
+
// System prompt for conversational mode
|
|
138
|
+
messages.push({
|
|
139
|
+
role: 'system',
|
|
140
|
+
content: buildConversationalSystemPrompt()
|
|
141
|
+
});
|
|
142
|
+
// Add conversation history (last N turns)
|
|
143
|
+
const recentTurns = context.turns.slice(-maxHistoryTurns);
|
|
144
|
+
for (const turn of recentTurns) {
|
|
145
|
+
messages.push({
|
|
146
|
+
role: 'user',
|
|
147
|
+
content: turn.question
|
|
148
|
+
});
|
|
149
|
+
messages.push({
|
|
150
|
+
role: 'assistant',
|
|
151
|
+
content: turn.answer
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
// Add current query with code context
|
|
155
|
+
const userPrompt = buildConversationalUserPrompt(currentQuery, context, newChunks);
|
|
156
|
+
messages.push({
|
|
157
|
+
role: 'user',
|
|
158
|
+
content: userPrompt
|
|
159
|
+
});
|
|
160
|
+
return messages;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Build system prompt for conversational mode
|
|
164
|
+
*/
|
|
165
|
+
function buildConversationalSystemPrompt() {
|
|
166
|
+
return `You are an expert code analyst helping a developer understand their codebase through an interactive conversation.
|
|
167
|
+
|
|
168
|
+
Your role is to:
|
|
169
|
+
1. Answer questions clearly and concisely based on the provided code context
|
|
170
|
+
2. Maintain continuity with the conversation history
|
|
171
|
+
3. Reference previous discussions when relevant
|
|
172
|
+
4. Use proper markdown formatting with code citations
|
|
173
|
+
5. Cite specific files using the format: \`[filename.ext](filename.ext:line)\`
|
|
174
|
+
6. Be conversational but professional
|
|
175
|
+
7. If the question builds on previous context, acknowledge that connection
|
|
176
|
+
|
|
177
|
+
Format guidelines:
|
|
178
|
+
- Use clear headings and sections
|
|
179
|
+
- Include code blocks with language tags
|
|
180
|
+
- Use bullet points for clarity
|
|
181
|
+
- Bold/italic for emphasis
|
|
182
|
+
- Keep responses focused and relevant to the current question
|
|
183
|
+
|
|
184
|
+
Remember: You're having an ongoing conversation, not answering isolated questions.`;
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Build user prompt with conversation-aware context
|
|
188
|
+
*/
|
|
189
|
+
function buildConversationalUserPrompt(currentQuery, context, newChunks) {
|
|
190
|
+
let prompt = `# Current Question\n\n${currentQuery}\n\n`;
|
|
191
|
+
// Show relevant code chunks for current question
|
|
192
|
+
if (newChunks.length > 0) {
|
|
193
|
+
prompt += `# Relevant Code (for current question)\n\n`;
|
|
194
|
+
prompt += `I found ${newChunks.length} code chunks relevant to your current question:\n\n`;
|
|
195
|
+
newChunks.forEach((result, index) => {
|
|
196
|
+
const chunkData = context.allChunks.get(result.sha);
|
|
197
|
+
const relevanceScore = (result.meta.score * 100).toFixed(1);
|
|
198
|
+
prompt += `## Chunk ${index + 1}: ${result.meta.symbol} (${relevanceScore}% relevant)\n\n`;
|
|
199
|
+
prompt += `**File:** \`${result.path}\`\n`;
|
|
200
|
+
prompt += `**Language:** ${result.lang}\n`;
|
|
201
|
+
prompt += `**Symbol:** ${result.meta.symbol}\n`;
|
|
202
|
+
if (result.meta.description) {
|
|
203
|
+
prompt += `**Description:** ${result.meta.description}\n`;
|
|
204
|
+
}
|
|
205
|
+
if (chunkData && chunkData.code) {
|
|
206
|
+
const limit = PROMPT_TRUNCATE_LENGTH;
|
|
207
|
+
const truncatedCode = chunkData.code.length > limit
|
|
208
|
+
? chunkData.code.substring(0, limit) + '\n... [truncated]'
|
|
209
|
+
: chunkData.code;
|
|
210
|
+
prompt += `\n**Code:**\n\n\`\`\`${result.lang}\n${truncatedCode}\n\`\`\`\n\n`;
|
|
211
|
+
}
|
|
212
|
+
prompt += `---\n\n`;
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
// Add reference to previously discussed code if relevant
|
|
216
|
+
if (context.turns.length > 0) {
|
|
217
|
+
const previousChunks = new Set();
|
|
218
|
+
context.turns.forEach(turn => {
|
|
219
|
+
turn.chunks.forEach(chunk => previousChunks.add(chunk.sha));
|
|
220
|
+
});
|
|
221
|
+
const previouslySeenChunks = Array.from(previousChunks)
|
|
222
|
+
.filter(sha => !newChunks.some(c => c.sha === sha))
|
|
223
|
+
.slice(0, 5);
|
|
224
|
+
if (previouslySeenChunks.length > 0) {
|
|
225
|
+
prompt += `# Previously Discussed Code (available for reference)\n\n`;
|
|
226
|
+
previouslySeenChunks.forEach(sha => {
|
|
227
|
+
const chunkData = context.allChunks.get(sha);
|
|
228
|
+
if (chunkData) {
|
|
229
|
+
prompt += `- \`${chunkData.result.path}\` - ${chunkData.result.meta.symbol}\n`;
|
|
230
|
+
}
|
|
231
|
+
});
|
|
232
|
+
prompt += `\n`;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
// Instructions for response
|
|
236
|
+
prompt += `# Instructions\n\n`;
|
|
237
|
+
prompt += `Based on our conversation and the code provided, please answer: "${currentQuery}"\n\n`;
|
|
238
|
+
prompt += `Your response should:\n`;
|
|
239
|
+
prompt += `1. Build on our previous conversation if relevant\n`;
|
|
240
|
+
prompt += `2. Directly answer the current question\n`;
|
|
241
|
+
prompt += `3. Use inline citations like: \`[filename.ext](filename.ext)\`\n`;
|
|
242
|
+
prompt += `4. Include relevant code snippets\n`;
|
|
243
|
+
prompt += `5. Use proper markdown formatting\n`;
|
|
244
|
+
prompt += `6. Be concise but thorough\n`;
|
|
245
|
+
return prompt;
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Create a new conversation context
|
|
249
|
+
*/
|
|
250
|
+
export function createConversationContext() {
|
|
251
|
+
return {
|
|
252
|
+
turns: [],
|
|
253
|
+
allChunks: new Map()
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Add a turn to the conversation history
|
|
258
|
+
*/
|
|
259
|
+
export function addConversationTurn(context, turn) {
|
|
260
|
+
context.turns.push(turn);
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Clear conversation history
|
|
264
|
+
*/
|
|
265
|
+
export function clearConversationHistory(context) {
|
|
266
|
+
context.turns = [];
|
|
267
|
+
context.allChunks.clear();
|
|
268
|
+
}
|
|
269
|
+
function evictOldChunksIfNeeded(context) {
|
|
270
|
+
const max = CONVERSATION_MAX_CONTEXT_CHUNKS || 200;
|
|
271
|
+
if (context.allChunks.size <= max)
|
|
272
|
+
return;
|
|
273
|
+
const excess = context.allChunks.size - max;
|
|
274
|
+
// Remove first N inserted entries (Map preserves insertion order)
|
|
275
|
+
const keys = Array.from(context.allChunks.keys());
|
|
276
|
+
for (let i = 0; i < excess; i++) {
|
|
277
|
+
context.allChunks.delete(keys[i]);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Get conversation summary for display
|
|
282
|
+
*/
|
|
283
|
+
export function getConversationSummary(context) {
|
|
284
|
+
const turnCount = context.turns.length;
|
|
285
|
+
const uniqueChunks = context.allChunks.size;
|
|
286
|
+
const uniqueFiles = new Set(Array.from(context.allChunks.values()).map(chunk => chunk.result.path)).size;
|
|
287
|
+
return `Conversation: ${turnCount} turn${turnCount !== 1 ? 's' : ''} | ${uniqueChunks} code chunks | ${uniqueFiles} file${uniqueFiles !== 1 ? 's' : ''}`;
|
|
288
|
+
}
|
|
289
|
+
//# sourceMappingURL=conversational-synthesizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversational-synthesizer.js","sourceRoot":"","sources":["../../src/synthesis/conversational-synthesizer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { SynthesisResult } from './synthesizer.js';
|
|
2
|
+
export interface FormattingOptions {
|
|
3
|
+
includeMetadata?: boolean;
|
|
4
|
+
includeStats?: boolean;
|
|
5
|
+
colorize?: boolean;
|
|
6
|
+
}
|
|
7
|
+
export declare function formatSynthesisResult(result: SynthesisResult, options?: FormattingOptions): string;
|
|
8
|
+
export declare function formatStreamingChunk(chunk: string): string;
|
|
9
|
+
export declare function extractCitations(markdown: string): string[];
|
|
10
|
+
export declare function addCitationFooter(markdown: string): string;
|
|
11
|
+
export declare function formatErrorMessage(error: string, query: string): string;
|
|
12
|
+
export declare function formatNoResultsMessage(query: string, queriesUsed?: string[]): string;
|
|
13
|
+
//# sourceMappingURL=markdown-formatter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown-formatter.d.ts","sourceRoot":"","sources":["../../src/synthesis/markdown-formatter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAExD,MAAM,WAAW,iBAAiB;IAChC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,eAAe,EAAE,OAAO,GAAE,iBAAsB,GAAG,MAAM,CAqDtG;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAG1D;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAgB3D;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAqB1D;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAYvE;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAmBpF"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
export function formatSynthesisResult(result, options = {}) {
|
|
2
|
+
const { includeMetadata = true, includeStats = true, colorize = false } = options;
|
|
3
|
+
let output = '';
|
|
4
|
+
// Add metadata header if requested
|
|
5
|
+
if (includeMetadata && result.metadata) {
|
|
6
|
+
output += '---\n';
|
|
7
|
+
output += '**Search Metadata**\n\n';
|
|
8
|
+
if (result.queriesUsed && result.queriesUsed.length > 1) {
|
|
9
|
+
output += `- **Queries Used:** ${result.queriesUsed.length}\n`;
|
|
10
|
+
result.queriesUsed.forEach((q, i) => {
|
|
11
|
+
output += ` ${i + 1}. "${q}"\n`;
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
if (result.metadata.multiQuery) {
|
|
15
|
+
output += `- **Multi-Query:** Yes\n`;
|
|
16
|
+
}
|
|
17
|
+
if (result.metadata.searchType) {
|
|
18
|
+
output += `- **Search Type:** ${result.metadata.searchType}\n`;
|
|
19
|
+
}
|
|
20
|
+
output += `- **Chunks Analyzed:** ${result.chunksAnalyzed}\n`;
|
|
21
|
+
output += `- **Embedding Provider:** ${result.embeddingProvider}\n`;
|
|
22
|
+
output += `- **Chat Provider:** ${result.chatProvider}\n`;
|
|
23
|
+
output += '\n---\n\n';
|
|
24
|
+
}
|
|
25
|
+
// Add main answer
|
|
26
|
+
if (result.success && result.answer) {
|
|
27
|
+
output += result.answer;
|
|
28
|
+
if (!result.answer.endsWith('\n')) {
|
|
29
|
+
output += '\n';
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
else if (!result.success) {
|
|
33
|
+
output += `**Error:** ${result.error || 'Unknown error occurred'}\n`;
|
|
34
|
+
}
|
|
35
|
+
// Add stats footer if requested
|
|
36
|
+
if (includeStats && result.success) {
|
|
37
|
+
output += '\n\n---\n\n';
|
|
38
|
+
output += '_Generated using CodeVault semantic search + LLM synthesis_\n';
|
|
39
|
+
}
|
|
40
|
+
return output;
|
|
41
|
+
}
|
|
42
|
+
export function formatStreamingChunk(chunk) {
|
|
43
|
+
// Pass through streaming chunks as-is
|
|
44
|
+
return chunk;
|
|
45
|
+
}
|
|
46
|
+
export function extractCitations(markdown) {
|
|
47
|
+
const citations = [];
|
|
48
|
+
// Match markdown links: [text](path) or `[text](path)`
|
|
49
|
+
const linkPattern = /\[([^\]]+)\]\(([^)]+)\)/g;
|
|
50
|
+
let match;
|
|
51
|
+
while ((match = linkPattern.exec(markdown)) !== null) {
|
|
52
|
+
const path = match[2];
|
|
53
|
+
// Filter out external URLs, only keep file paths
|
|
54
|
+
if (!path.startsWith('http://') && !path.startsWith('https://')) {
|
|
55
|
+
citations.push(path);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return Array.from(new Set(citations));
|
|
59
|
+
}
|
|
60
|
+
export function addCitationFooter(markdown) {
|
|
61
|
+
const citations = extractCitations(markdown);
|
|
62
|
+
if (citations.length === 0) {
|
|
63
|
+
return markdown;
|
|
64
|
+
}
|
|
65
|
+
let output = markdown;
|
|
66
|
+
if (!output.endsWith('\n\n')) {
|
|
67
|
+
output += '\n\n';
|
|
68
|
+
}
|
|
69
|
+
output += '## 📚 References\n\n';
|
|
70
|
+
output += 'The following files were referenced in this answer:\n\n';
|
|
71
|
+
citations.forEach((citation, index) => {
|
|
72
|
+
output += `${index + 1}. \`${citation}\`\n`;
|
|
73
|
+
});
|
|
74
|
+
return output;
|
|
75
|
+
}
|
|
76
|
+
export function formatErrorMessage(error, query) {
|
|
77
|
+
let output = `# ❌ Unable to Answer\n\n`;
|
|
78
|
+
output += `**Question:** "${query}"\n\n`;
|
|
79
|
+
output += `**Error:** ${error}\n\n`;
|
|
80
|
+
output += `## Possible Solutions:\n\n`;
|
|
81
|
+
output += `1. Ensure the project is indexed: \`codevault index\`\n`;
|
|
82
|
+
output += `2. Check if the question is related to the codebase\n`;
|
|
83
|
+
output += `3. Try rephrasing your question with more specific terms\n`;
|
|
84
|
+
output += `4. Verify embedding and chat API configurations\n`;
|
|
85
|
+
return output;
|
|
86
|
+
}
|
|
87
|
+
export function formatNoResultsMessage(query, queriesUsed) {
|
|
88
|
+
let output = `# ℹ️ No Relevant Code Found\n\n`;
|
|
89
|
+
output += `**Question:** "${query}"\n\n`;
|
|
90
|
+
if (queriesUsed && queriesUsed.length > 1) {
|
|
91
|
+
output += `**Queries Attempted:**\n`;
|
|
92
|
+
queriesUsed.forEach((q, i) => {
|
|
93
|
+
output += `${i + 1}. "${q}"\n`;
|
|
94
|
+
});
|
|
95
|
+
output += '\n';
|
|
96
|
+
}
|
|
97
|
+
output += `## Suggestions:\n\n`;
|
|
98
|
+
output += `1. Try using more specific technical terms\n`;
|
|
99
|
+
output += `2. Check if the relevant code is in the indexed project\n`;
|
|
100
|
+
output += `3. Use simpler, more direct questions\n`;
|
|
101
|
+
output += `4. Try searching for function names or class names directly\n`;
|
|
102
|
+
return output;
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=markdown-formatter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown-formatter.js","sourceRoot":"","sources":["../../src/synthesis/markdown-formatter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { SearchResult } from '../core/types.js';
|
|
2
|
+
export interface CodeContext {
|
|
3
|
+
results: SearchResult[];
|
|
4
|
+
codeChunks: Map<string, string>;
|
|
5
|
+
query: string;
|
|
6
|
+
metadata?: {
|
|
7
|
+
searchType?: string;
|
|
8
|
+
provider?: string;
|
|
9
|
+
totalChunks?: number;
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
export interface PromptOptions {
|
|
13
|
+
maxContextChunks?: number;
|
|
14
|
+
includeFileStructure?: boolean;
|
|
15
|
+
citationStyle?: 'inline' | 'footnote';
|
|
16
|
+
}
|
|
17
|
+
export declare function buildSystemPrompt(): string;
|
|
18
|
+
export declare function buildUserPrompt(context: CodeContext, options?: PromptOptions): string;
|
|
19
|
+
export declare function buildMultiQueryPrompt(query: string): string;
|
|
20
|
+
export declare function parseMultiQueryResponse(response: string): string[];
|
|
21
|
+
//# sourceMappingURL=prompt-builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-builder.d.ts","sourceRoot":"","sources":["../../src/synthesis/prompt-builder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAErD,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE;QACT,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;CACH;AAED,MAAM,WAAW,aAAa;IAC5B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,aAAa,CAAC,EAAE,QAAQ,GAAG,UAAU,CAAC;CACvC;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAkB1C;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,GAAE,aAAkB,GAAG,MAAM,CAyFzF;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAc3D;AAED,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAsBlE"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
export function buildSystemPrompt() {
|
|
2
|
+
return `You are an expert code analyst helping developers understand their codebase. Your role is to:
|
|
3
|
+
|
|
4
|
+
1. Analyze the provided code chunks and their metadata
|
|
5
|
+
2. Answer the user's question clearly and concisely
|
|
6
|
+
3. Use proper markdown formatting
|
|
7
|
+
4. Include citations to specific files and code snippets
|
|
8
|
+
5. Provide practical, actionable insights
|
|
9
|
+
6. Highlight important patterns, dependencies, and relationships
|
|
10
|
+
|
|
11
|
+
Format your response in markdown with:
|
|
12
|
+
- Clear headings and sections
|
|
13
|
+
- Code blocks with language tags
|
|
14
|
+
- File path citations like: \`[filename.ext](filename.ext:line)\`
|
|
15
|
+
- Bullet points for clarity
|
|
16
|
+
- Bold/italic for emphasis
|
|
17
|
+
|
|
18
|
+
Keep responses focused and relevant to the question asked.`;
|
|
19
|
+
}
|
|
20
|
+
export function buildUserPrompt(context, options = {}) {
|
|
21
|
+
const { query, results, codeChunks, metadata } = context;
|
|
22
|
+
const maxChunks = options.maxContextChunks || 10;
|
|
23
|
+
const citationStyle = options.citationStyle || 'inline';
|
|
24
|
+
let prompt = `# Question\n\n${query}\n\n`;
|
|
25
|
+
// Add search metadata
|
|
26
|
+
if (metadata) {
|
|
27
|
+
prompt += `# Search Context\n\n`;
|
|
28
|
+
if (metadata.searchType) {
|
|
29
|
+
prompt += `- Search Type: ${metadata.searchType}\n`;
|
|
30
|
+
}
|
|
31
|
+
if (metadata.provider) {
|
|
32
|
+
prompt += `- Embedding Provider: ${metadata.provider}\n`;
|
|
33
|
+
}
|
|
34
|
+
if (metadata.totalChunks) {
|
|
35
|
+
prompt += `- Total Indexed Chunks: ${metadata.totalChunks}\n`;
|
|
36
|
+
}
|
|
37
|
+
prompt += `- Relevant Results: ${results.length}\n\n`;
|
|
38
|
+
}
|
|
39
|
+
// Add relevant code chunks
|
|
40
|
+
prompt += `# Relevant Code Chunks\n\n`;
|
|
41
|
+
prompt += `I found ${Math.min(results.length, maxChunks)} relevant code chunks. Here they are in order of relevance:\n\n`;
|
|
42
|
+
const chunksToInclude = results.slice(0, maxChunks);
|
|
43
|
+
chunksToInclude.forEach((result, index) => {
|
|
44
|
+
const chunkCode = codeChunks.get(result.sha);
|
|
45
|
+
const relevanceScore = (result.meta.score * 100).toFixed(1);
|
|
46
|
+
prompt += `## Chunk ${index + 1}: ${result.meta.symbol} (${relevanceScore}% relevant)\n\n`;
|
|
47
|
+
prompt += `**File:** \`${result.path}\`\n`;
|
|
48
|
+
prompt += `**Language:** ${result.lang}\n`;
|
|
49
|
+
prompt += `**Symbol:** ${result.meta.symbol}\n`;
|
|
50
|
+
if (result.meta.description) {
|
|
51
|
+
prompt += `**Description:** ${result.meta.description}\n`;
|
|
52
|
+
}
|
|
53
|
+
if (result.meta.intent) {
|
|
54
|
+
prompt += `**Intent:** ${result.meta.intent}\n`;
|
|
55
|
+
}
|
|
56
|
+
// Add search metadata if available
|
|
57
|
+
if (result.meta.searchType) {
|
|
58
|
+
prompt += `**Search Type:** ${result.meta.searchType}\n`;
|
|
59
|
+
}
|
|
60
|
+
if (result.meta.symbolBoost && result.meta.symbolBoost > 0) {
|
|
61
|
+
prompt += `**Symbol Match:** Yes (boosted by ${(result.meta.symbolBoost * 100).toFixed(0)}%)\n`;
|
|
62
|
+
}
|
|
63
|
+
if (result.meta.rerankerScore !== undefined) {
|
|
64
|
+
prompt += `**Reranker Score:** ${(result.meta.rerankerScore * 100).toFixed(1)}%\n`;
|
|
65
|
+
}
|
|
66
|
+
prompt += `\n**Code:**\n\n`;
|
|
67
|
+
if (chunkCode) {
|
|
68
|
+
const truncatedCode = chunkCode.length > 2000
|
|
69
|
+
? chunkCode.substring(0, 2000) + '\n... [truncated]'
|
|
70
|
+
: chunkCode;
|
|
71
|
+
prompt += `\`\`\`${result.lang}\n${truncatedCode}\n\`\`\`\n\n`;
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
prompt += `_[Code not available]_\n\n`;
|
|
75
|
+
}
|
|
76
|
+
prompt += `---\n\n`;
|
|
77
|
+
});
|
|
78
|
+
// Add instructions for response format
|
|
79
|
+
prompt += `# Instructions\n\n`;
|
|
80
|
+
prompt += `Based on the code chunks above, please answer the question: "${query}"\n\n`;
|
|
81
|
+
prompt += `Your response should:\n`;
|
|
82
|
+
prompt += `1. Directly answer the question in clear, natural language\n`;
|
|
83
|
+
prompt += `2. Reference specific code chunks using inline citations like: \`[filename.ext](filename.ext)\`\n`;
|
|
84
|
+
prompt += `3. Include relevant code snippets in your explanation\n`;
|
|
85
|
+
prompt += `4. Highlight key patterns, dependencies, or architectural decisions\n`;
|
|
86
|
+
prompt += `5. Use proper markdown formatting with headers, lists, and code blocks\n`;
|
|
87
|
+
prompt += `6. Be concise but thorough - focus on what's most relevant\n\n`;
|
|
88
|
+
if (citationStyle === 'footnote') {
|
|
89
|
+
prompt += `7. Add a "References" section at the end with all cited files\n\n`;
|
|
90
|
+
}
|
|
91
|
+
return prompt;
|
|
92
|
+
}
|
|
93
|
+
export function buildMultiQueryPrompt(query) {
|
|
94
|
+
return `You are a query analyzer for code search. Given a complex question about a codebase, break it down into 2-4 specific search queries that would help find relevant code.
|
|
95
|
+
|
|
96
|
+
Question: "${query}"
|
|
97
|
+
|
|
98
|
+
Return ONLY a JSON array of search query strings, nothing else. Each query should be:
|
|
99
|
+
- Specific and focused on one aspect
|
|
100
|
+
- Use technical terms that would appear in code
|
|
101
|
+
- Be suitable for semantic search
|
|
102
|
+
|
|
103
|
+
Example format:
|
|
104
|
+
["authentication middleware", "user login function", "session management"]
|
|
105
|
+
|
|
106
|
+
Your response (JSON array only):`;
|
|
107
|
+
}
|
|
108
|
+
export function parseMultiQueryResponse(response) {
|
|
109
|
+
try {
|
|
110
|
+
// Extract JSON array from response
|
|
111
|
+
const jsonMatch = response.match(/\[[\s\S]*\]/);
|
|
112
|
+
if (!jsonMatch) {
|
|
113
|
+
return [];
|
|
114
|
+
}
|
|
115
|
+
const queries = JSON.parse(jsonMatch[0]);
|
|
116
|
+
if (!Array.isArray(queries)) {
|
|
117
|
+
return [];
|
|
118
|
+
}
|
|
119
|
+
return queries
|
|
120
|
+
.filter(q => typeof q === 'string' && q.trim().length > 0)
|
|
121
|
+
.map(q => q.trim())
|
|
122
|
+
.slice(0, 4); // Max 4 queries
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
console.error('Failed to parse multi-query response:', error);
|
|
126
|
+
return [];
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=prompt-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-builder.js","sourceRoot":"","sources":["../../src/synthesis/prompt-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { ScopeFilters } from '../types/search.js';
|
|
2
|
+
export interface SynthesisOptions {
|
|
3
|
+
provider?: string;
|
|
4
|
+
chatProvider?: string;
|
|
5
|
+
workingPath?: string;
|
|
6
|
+
scope?: ScopeFilters;
|
|
7
|
+
maxChunks?: number;
|
|
8
|
+
useReranking?: boolean;
|
|
9
|
+
useMultiQuery?: boolean;
|
|
10
|
+
temperature?: number;
|
|
11
|
+
stream?: boolean;
|
|
12
|
+
}
|
|
13
|
+
export interface SynthesisResult {
|
|
14
|
+
success: boolean;
|
|
15
|
+
answer?: string;
|
|
16
|
+
query: string;
|
|
17
|
+
queriesUsed?: string[];
|
|
18
|
+
chunksAnalyzed: number;
|
|
19
|
+
chatProvider: string;
|
|
20
|
+
embeddingProvider: string;
|
|
21
|
+
error?: string;
|
|
22
|
+
metadata?: {
|
|
23
|
+
searchType?: string;
|
|
24
|
+
totalResults?: number;
|
|
25
|
+
multiQuery?: boolean;
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
export declare function synthesizeAnswer(query: string, options?: SynthesisOptions): Promise<SynthesisResult>;
|
|
29
|
+
export declare function synthesizeAnswerStreaming(query: string, options?: SynthesisOptions): AsyncGenerator<string>;
|
|
30
|
+
//# sourceMappingURL=synthesizer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"synthesizer.d.ts","sourceRoot":"","sources":["../../src/synthesis/synthesizer.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAIvD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE;QACT,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,UAAU,CAAC,EAAE,OAAO,CAAC;KACtB,CAAC;CACH;AAED,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,eAAe,CAAC,CAiL1B;AAED,wBAAuB,yBAAyB,CAC9C,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,gBAAqB,GAC7B,cAAc,CAAC,MAAM,CAAC,CAmExB"}
|