@djibrilm/lazy-review 0.0.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.
- package/LICENSE +21 -0
- package/README.md +95 -0
- package/dist/bin.d.ts +3 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +17 -0
- package/dist/bin.js.map +1 -0
- package/dist/client/assets/geist-cyrillic-ext-wght-normal-DjL33-gN.woff2 +0 -0
- package/dist/client/assets/geist-cyrillic-wght-normal-BEAKL7Jp.woff2 +0 -0
- package/dist/client/assets/geist-latin-ext-wght-normal-DC-KSUi6.woff2 +0 -0
- package/dist/client/assets/geist-latin-wght-normal-BgDaEnEv.woff2 +0 -0
- package/dist/client/assets/geist-vietnamese-wght-normal-6IgcOCM7.woff2 +0 -0
- package/dist/client/assets/index-4oL_AGyI.css +1 -0
- package/dist/client/assets/index-CJtKCyBg.js +848 -0
- package/dist/client/favicon.png +0 -0
- package/dist/client/favicon.svg +1 -0
- package/dist/client/icons.svg +24 -0
- package/dist/client/index.html +17 -0
- package/dist/client/resources/images/logo.png +0 -0
- package/dist/client/resources/images/openai.png +0 -0
- package/dist/constants.d.ts +3 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +3 -0
- package/dist/constants.js.map +1 -0
- package/dist/dev.d.ts +2 -0
- package/dist/dev.d.ts.map +1 -0
- package/dist/dev.js +10 -0
- package/dist/dev.js.map +1 -0
- package/dist/modules/ai-agent/agent-context-manager.d.ts +57 -0
- package/dist/modules/ai-agent/agent-context-manager.d.ts.map +1 -0
- package/dist/modules/ai-agent/agent-context-manager.js +159 -0
- package/dist/modules/ai-agent/agent-context-manager.js.map +1 -0
- package/dist/modules/ai-agent/ai-agent.module.d.ts +17 -0
- package/dist/modules/ai-agent/ai-agent.module.d.ts.map +1 -0
- package/dist/modules/ai-agent/ai-agent.module.js +24 -0
- package/dist/modules/ai-agent/ai-agent.module.js.map +1 -0
- package/dist/modules/ai-agent/ai-agent.utils.d.ts +10 -0
- package/dist/modules/ai-agent/ai-agent.utils.d.ts.map +1 -0
- package/dist/modules/ai-agent/ai-agent.utils.js +389 -0
- package/dist/modules/ai-agent/ai-agent.utils.js.map +1 -0
- package/dist/modules/ai-agent/base.agent.d.ts +26 -0
- package/dist/modules/ai-agent/base.agent.d.ts.map +1 -0
- package/dist/modules/ai-agent/base.agent.js +101 -0
- package/dist/modules/ai-agent/base.agent.js.map +1 -0
- package/dist/modules/ai-agent/chat.agent.d.ts +35 -0
- package/dist/modules/ai-agent/chat.agent.d.ts.map +1 -0
- package/dist/modules/ai-agent/chat.agent.js +590 -0
- package/dist/modules/ai-agent/chat.agent.js.map +1 -0
- package/dist/modules/ai-agent/code-base-indexer.agent.d.ts +13 -0
- package/dist/modules/ai-agent/code-base-indexer.agent.d.ts.map +1 -0
- package/dist/modules/ai-agent/code-base-indexer.agent.js +506 -0
- package/dist/modules/ai-agent/code-base-indexer.agent.js.map +1 -0
- package/dist/modules/ai-agent/codebase-scanner.d.ts +37 -0
- package/dist/modules/ai-agent/codebase-scanner.d.ts.map +1 -0
- package/dist/modules/ai-agent/codebase-scanner.js +260 -0
- package/dist/modules/ai-agent/codebase-scanner.js.map +1 -0
- package/dist/modules/ai-agent/model-loader.d.ts +7 -0
- package/dist/modules/ai-agent/model-loader.d.ts.map +1 -0
- package/dist/modules/ai-agent/model-loader.js +129 -0
- package/dist/modules/ai-agent/model-loader.js.map +1 -0
- package/dist/modules/ai-agent/orientation-loader.d.ts +2 -0
- package/dist/modules/ai-agent/orientation-loader.d.ts.map +1 -0
- package/dist/modules/ai-agent/orientation-loader.js +70 -0
- package/dist/modules/ai-agent/orientation-loader.js.map +1 -0
- package/dist/modules/ai-agent/pr-review-session.manager.d.ts +36 -0
- package/dist/modules/ai-agent/pr-review-session.manager.d.ts.map +1 -0
- package/dist/modules/ai-agent/pr-review-session.manager.js +106 -0
- package/dist/modules/ai-agent/pr-review-session.manager.js.map +1 -0
- package/dist/modules/ai-agent/pr-review.agent.d.ts +22 -0
- package/dist/modules/ai-agent/pr-review.agent.d.ts.map +1 -0
- package/dist/modules/ai-agent/pr-review.agent.js +269 -0
- package/dist/modules/ai-agent/pr-review.agent.js.map +1 -0
- package/dist/modules/ai-agent/research-loop.d.ts +3 -0
- package/dist/modules/ai-agent/research-loop.d.ts.map +1 -0
- package/dist/modules/ai-agent/research-loop.js +691 -0
- package/dist/modules/ai-agent/research-loop.js.map +1 -0
- package/dist/modules/ai-agent/review-pipeline/agent-loop.d.ts +36 -0
- package/dist/modules/ai-agent/review-pipeline/agent-loop.d.ts.map +1 -0
- package/dist/modules/ai-agent/review-pipeline/agent-loop.js +178 -0
- package/dist/modules/ai-agent/review-pipeline/agent-loop.js.map +1 -0
- package/dist/modules/ai-agent/review-pipeline/change-analyzer.d.ts +8 -0
- package/dist/modules/ai-agent/review-pipeline/change-analyzer.d.ts.map +1 -0
- package/dist/modules/ai-agent/review-pipeline/change-analyzer.js +93 -0
- package/dist/modules/ai-agent/review-pipeline/change-analyzer.js.map +1 -0
- package/dist/modules/ai-agent/review-pipeline/finding-ranker.d.ts +47 -0
- package/dist/modules/ai-agent/review-pipeline/finding-ranker.d.ts.map +1 -0
- package/dist/modules/ai-agent/review-pipeline/finding-ranker.js +91 -0
- package/dist/modules/ai-agent/review-pipeline/finding-ranker.js.map +1 -0
- package/dist/modules/ai-agent/review-pipeline/finding-verifier.d.ts +29 -0
- package/dist/modules/ai-agent/review-pipeline/finding-verifier.d.ts.map +1 -0
- package/dist/modules/ai-agent/review-pipeline/finding-verifier.js +130 -0
- package/dist/modules/ai-agent/review-pipeline/finding-verifier.js.map +1 -0
- package/dist/modules/ai-agent/review-pipeline/repository-explorer.d.ts +21 -0
- package/dist/modules/ai-agent/review-pipeline/repository-explorer.d.ts.map +1 -0
- package/dist/modules/ai-agent/review-pipeline/repository-explorer.js +247 -0
- package/dist/modules/ai-agent/review-pipeline/repository-explorer.js.map +1 -0
- package/dist/modules/ai-agent/review-pipeline/review-controller.d.ts +22 -0
- package/dist/modules/ai-agent/review-pipeline/review-controller.d.ts.map +1 -0
- package/dist/modules/ai-agent/review-pipeline/review-controller.js +102 -0
- package/dist/modules/ai-agent/review-pipeline/review-controller.js.map +1 -0
- package/dist/modules/ai-agent/review-pipeline/review-writer.d.ts +4 -0
- package/dist/modules/ai-agent/review-pipeline/review-writer.d.ts.map +1 -0
- package/dist/modules/ai-agent/review-pipeline/review-writer.js +52 -0
- package/dist/modules/ai-agent/review-pipeline/review-writer.js.map +1 -0
- package/dist/modules/ai-agent/review-pipeline/secret-scanner.d.ts +25 -0
- package/dist/modules/ai-agent/review-pipeline/secret-scanner.d.ts.map +1 -0
- package/dist/modules/ai-agent/review-pipeline/secret-scanner.js +159 -0
- package/dist/modules/ai-agent/review-pipeline/secret-scanner.js.map +1 -0
- package/dist/modules/ai-agent/review-pipeline/specialist-reviewer.d.ts +9 -0
- package/dist/modules/ai-agent/review-pipeline/specialist-reviewer.d.ts.map +1 -0
- package/dist/modules/ai-agent/review-pipeline/specialist-reviewer.js +114 -0
- package/dist/modules/ai-agent/review-pipeline/specialist-reviewer.js.map +1 -0
- package/dist/modules/ai-agent/review-pipeline/types.d.ts +53 -0
- package/dist/modules/ai-agent/review-pipeline/types.d.ts.map +1 -0
- package/dist/modules/ai-agent/review-pipeline/types.js +45 -0
- package/dist/modules/ai-agent/review-pipeline/types.js.map +1 -0
- package/dist/modules/ai-agent/tool-executor.d.ts +37 -0
- package/dist/modules/ai-agent/tool-executor.d.ts.map +1 -0
- package/dist/modules/ai-agent/tool-executor.js +199 -0
- package/dist/modules/ai-agent/tool-executor.js.map +1 -0
- package/dist/modules/ai-agent/tool-types.d.ts +72 -0
- package/dist/modules/ai-agent/tool-types.d.ts.map +1 -0
- package/dist/modules/ai-agent/tool-types.js +2 -0
- package/dist/modules/ai-agent/tool-types.js.map +1 -0
- package/dist/modules/ai-agent/tools/fs-tools.d.ts +54 -0
- package/dist/modules/ai-agent/tools/fs-tools.d.ts.map +1 -0
- package/dist/modules/ai-agent/tools/fs-tools.js +237 -0
- package/dist/modules/ai-agent/tools/fs-tools.js.map +1 -0
- package/dist/modules/ai-agent/tools/git-tools.d.ts +322 -0
- package/dist/modules/ai-agent/tools/git-tools.d.ts.map +1 -0
- package/dist/modules/ai-agent/tools/git-tools.js +557 -0
- package/dist/modules/ai-agent/tools/git-tools.js.map +1 -0
- package/dist/modules/ai-agent/tools/pr-chat-tools.d.ts +15 -0
- package/dist/modules/ai-agent/tools/pr-chat-tools.d.ts.map +1 -0
- package/dist/modules/ai-agent/tools/pr-chat-tools.js +232 -0
- package/dist/modules/ai-agent/tools/pr-chat-tools.js.map +1 -0
- package/dist/modules/database/database.module.d.ts +10 -0
- package/dist/modules/database/database.module.d.ts.map +1 -0
- package/dist/modules/database/database.module.js +36 -0
- package/dist/modules/database/database.module.js.map +1 -0
- package/dist/modules/database/vector-database.service.d.ts +27 -0
- package/dist/modules/database/vector-database.service.d.ts.map +1 -0
- package/dist/modules/database/vector-database.service.js +170 -0
- package/dist/modules/database/vector-database.service.js.map +1 -0
- package/dist/modules/github/github.module.d.ts +964 -0
- package/dist/modules/github/github.module.d.ts.map +1 -0
- package/dist/modules/github/github.module.js +316 -0
- package/dist/modules/github/github.module.js.map +1 -0
- package/dist/modules/main.module.d.ts +20 -0
- package/dist/modules/main.module.d.ts.map +1 -0
- package/dist/modules/main.module.js +59 -0
- package/dist/modules/main.module.js.map +1 -0
- package/dist/modules/qvac/qvac.module.d.ts +28 -0
- package/dist/modules/qvac/qvac.module.d.ts.map +1 -0
- package/dist/modules/qvac/qvac.module.js +146 -0
- package/dist/modules/qvac/qvac.module.js.map +1 -0
- package/dist/modules/server/dtos/create-project.dto.d.ts +9 -0
- package/dist/modules/server/dtos/create-project.dto.d.ts.map +1 -0
- package/dist/modules/server/dtos/create-project.dto.js +2 -0
- package/dist/modules/server/dtos/create-project.dto.js.map +1 -0
- package/dist/modules/server/entities/agent-task.entity.d.ts +16 -0
- package/dist/modules/server/entities/agent-task.entity.d.ts.map +1 -0
- package/dist/modules/server/entities/agent-task.entity.js +72 -0
- package/dist/modules/server/entities/agent-task.entity.js.map +1 -0
- package/dist/modules/server/entities/ai-provider.entity.d.ts +11 -0
- package/dist/modules/server/entities/ai-provider.entity.d.ts.map +1 -0
- package/dist/modules/server/entities/ai-provider.entity.js +47 -0
- package/dist/modules/server/entities/ai-provider.entity.js.map +1 -0
- package/dist/modules/server/entities/deployment-plan-approval.entity.d.ts +10 -0
- package/dist/modules/server/entities/deployment-plan-approval.entity.d.ts.map +1 -0
- package/dist/modules/server/entities/deployment-plan-approval.entity.js +42 -0
- package/dist/modules/server/entities/deployment-plan-approval.entity.js.map +1 -0
- package/dist/modules/server/entities/deployment-plan-artifact.entity.d.ts +10 -0
- package/dist/modules/server/entities/deployment-plan-artifact.entity.d.ts.map +1 -0
- package/dist/modules/server/entities/deployment-plan-artifact.entity.js +42 -0
- package/dist/modules/server/entities/deployment-plan-artifact.entity.js.map +1 -0
- package/dist/modules/server/entities/deployment-plan-feedback.entity.d.ts +9 -0
- package/dist/modules/server/entities/deployment-plan-feedback.entity.d.ts.map +1 -0
- package/dist/modules/server/entities/deployment-plan-feedback.entity.js +37 -0
- package/dist/modules/server/entities/deployment-plan-feedback.entity.js.map +1 -0
- package/dist/modules/server/entities/deployment-plan-revision.entity.d.ts +11 -0
- package/dist/modules/server/entities/deployment-plan-revision.entity.d.ts.map +1 -0
- package/dist/modules/server/entities/deployment-plan-revision.entity.js +47 -0
- package/dist/modules/server/entities/deployment-plan-revision.entity.js.map +1 -0
- package/dist/modules/server/entities/deployment-plan.entity.d.ts +13 -0
- package/dist/modules/server/entities/deployment-plan.entity.d.ts.map +1 -0
- package/dist/modules/server/entities/deployment-plan.entity.js +58 -0
- package/dist/modules/server/entities/deployment-plan.entity.js.map +1 -0
- package/dist/modules/server/entities/project.entity.d.ts +26 -0
- package/dist/modules/server/entities/project.entity.d.ts.map +1 -0
- package/dist/modules/server/entities/project.entity.js +122 -0
- package/dist/modules/server/entities/project.entity.js.map +1 -0
- package/dist/modules/server/entities/settings.entity.d.ts +12 -0
- package/dist/modules/server/entities/settings.entity.d.ts.map +1 -0
- package/dist/modules/server/entities/settings.entity.js +62 -0
- package/dist/modules/server/entities/settings.entity.js.map +1 -0
- package/dist/modules/server/entities/terminal-log.entity.d.ts +10 -0
- package/dist/modules/server/entities/terminal-log.entity.d.ts.map +1 -0
- package/dist/modules/server/entities/terminal-log.entity.js +42 -0
- package/dist/modules/server/entities/terminal-log.entity.js.map +1 -0
- package/dist/modules/server/middleware/auth.middleware.d.ts +8 -0
- package/dist/modules/server/middleware/auth.middleware.d.ts.map +1 -0
- package/dist/modules/server/middleware/auth.middleware.js +26 -0
- package/dist/modules/server/middleware/auth.middleware.js.map +1 -0
- package/dist/modules/server/routes/auth.routes.d.ts +13 -0
- package/dist/modules/server/routes/auth.routes.d.ts.map +1 -0
- package/dist/modules/server/routes/auth.routes.js +59 -0
- package/dist/modules/server/routes/auth.routes.js.map +1 -0
- package/dist/modules/server/routes/github.routes.d.ts +14 -0
- package/dist/modules/server/routes/github.routes.d.ts.map +1 -0
- package/dist/modules/server/routes/github.routes.js +124 -0
- package/dist/modules/server/routes/github.routes.js.map +1 -0
- package/dist/modules/server/routes/project.routes.d.ts +11 -0
- package/dist/modules/server/routes/project.routes.d.ts.map +1 -0
- package/dist/modules/server/routes/project.routes.js +78 -0
- package/dist/modules/server/routes/project.routes.js.map +1 -0
- package/dist/modules/server/routes/qvac.routes.d.ts +11 -0
- package/dist/modules/server/routes/qvac.routes.d.ts.map +1 -0
- package/dist/modules/server/routes/qvac.routes.js +24 -0
- package/dist/modules/server/routes/qvac.routes.js.map +1 -0
- package/dist/modules/server/routes/routes.d.ts +20 -0
- package/dist/modules/server/routes/routes.d.ts.map +1 -0
- package/dist/modules/server/routes/routes.js +35 -0
- package/dist/modules/server/routes/routes.js.map +1 -0
- package/dist/modules/server/routes/settings.controller.d.ts +14 -0
- package/dist/modules/server/routes/settings.controller.d.ts.map +1 -0
- package/dist/modules/server/routes/settings.controller.js +65 -0
- package/dist/modules/server/routes/settings.controller.js.map +1 -0
- package/dist/modules/server/server.module.d.ts +19 -0
- package/dist/modules/server/server.module.d.ts.map +1 -0
- package/dist/modules/server/server.module.js +63 -0
- package/dist/modules/server/server.module.js.map +1 -0
- package/dist/modules/server/services/auth.services.d.ts +19 -0
- package/dist/modules/server/services/auth.services.d.ts.map +1 -0
- package/dist/modules/server/services/auth.services.js +87 -0
- package/dist/modules/server/services/auth.services.js.map +1 -0
- package/dist/modules/server/services/deployment-plan.services.d.ts +6 -0
- package/dist/modules/server/services/deployment-plan.services.d.ts.map +1 -0
- package/dist/modules/server/services/deployment-plan.services.js +8 -0
- package/dist/modules/server/services/deployment-plan.services.js.map +1 -0
- package/dist/modules/server/services/github.services.d.ts +939 -0
- package/dist/modules/server/services/github.services.d.ts.map +1 -0
- package/dist/modules/server/services/github.services.js +46 -0
- package/dist/modules/server/services/github.services.js.map +1 -0
- package/dist/modules/server/services/project.services.d.ts +41 -0
- package/dist/modules/server/services/project.services.d.ts.map +1 -0
- package/dist/modules/server/services/project.services.js +360 -0
- package/dist/modules/server/services/project.services.js.map +1 -0
- package/dist/modules/server/services/qvac.services.d.ts +10 -0
- package/dist/modules/server/services/qvac.services.d.ts.map +1 -0
- package/dist/modules/server/services/qvac.services.js +58 -0
- package/dist/modules/server/services/qvac.services.js.map +1 -0
- package/dist/modules/server/services/settings.service.d.ts +60 -0
- package/dist/modules/server/services/settings.service.d.ts.map +1 -0
- package/dist/modules/server/services/settings.service.js +125 -0
- package/dist/modules/server/services/settings.service.js.map +1 -0
- package/dist/modules/socket-gateway/interfaces/project-creation-log.interface.d.ts +14 -0
- package/dist/modules/socket-gateway/interfaces/project-creation-log.interface.d.ts.map +1 -0
- package/dist/modules/socket-gateway/interfaces/project-creation-log.interface.js +2 -0
- package/dist/modules/socket-gateway/interfaces/project-creation-log.interface.js.map +1 -0
- package/dist/modules/socket-gateway/socket-gateway.module.d.ts +28 -0
- package/dist/modules/socket-gateway/socket-gateway.module.d.ts.map +1 -0
- package/dist/modules/socket-gateway/socket-gateway.module.js +92 -0
- package/dist/modules/socket-gateway/socket-gateway.module.js.map +1 -0
- package/package.json +95 -0
|
@@ -0,0 +1,389 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import os from 'node:os';
|
|
4
|
+
export function chunkText(text, maxChunkSize = 1000) {
|
|
5
|
+
const lines = text.split('\n');
|
|
6
|
+
const chunks = [];
|
|
7
|
+
let currentChunk = '';
|
|
8
|
+
for (const line of lines) {
|
|
9
|
+
if (line.trim().length === 0)
|
|
10
|
+
continue;
|
|
11
|
+
// If a single line exceeds maxChunkSize, split it by character chunks
|
|
12
|
+
if (line.length > maxChunkSize) {
|
|
13
|
+
if (currentChunk.trim()) {
|
|
14
|
+
chunks.push(currentChunk.trim());
|
|
15
|
+
currentChunk = '';
|
|
16
|
+
}
|
|
17
|
+
let remaining = line;
|
|
18
|
+
while (remaining.length > maxChunkSize) {
|
|
19
|
+
chunks.push(remaining.substring(0, maxChunkSize));
|
|
20
|
+
remaining = remaining.substring(maxChunkSize);
|
|
21
|
+
}
|
|
22
|
+
currentChunk = remaining;
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
if (currentChunk.length + line.length + 1 > maxChunkSize) {
|
|
26
|
+
if (currentChunk.trim()) {
|
|
27
|
+
chunks.push(currentChunk.trim());
|
|
28
|
+
}
|
|
29
|
+
currentChunk = line;
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
currentChunk = currentChunk ? `${currentChunk}\n${line}` : line;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
if (currentChunk.trim()) {
|
|
37
|
+
chunks.push(currentChunk.trim());
|
|
38
|
+
}
|
|
39
|
+
return chunks;
|
|
40
|
+
}
|
|
41
|
+
export async function extractSymbolsWithAST(filePath, text) {
|
|
42
|
+
try {
|
|
43
|
+
const Parser = (await import('tree-sitter')).default;
|
|
44
|
+
const parser = new Parser();
|
|
45
|
+
let language;
|
|
46
|
+
if (filePath.endsWith('.ts')) {
|
|
47
|
+
language = (await import('tree-sitter-typescript')).default.typescript;
|
|
48
|
+
}
|
|
49
|
+
else if (filePath.endsWith('.tsx')) {
|
|
50
|
+
language = (await import('tree-sitter-typescript')).default.tsx;
|
|
51
|
+
}
|
|
52
|
+
else if (filePath.endsWith('.js') || filePath.endsWith('.jsx')) {
|
|
53
|
+
language = (await import('tree-sitter-javascript')).default;
|
|
54
|
+
}
|
|
55
|
+
else if (filePath.endsWith('.py')) {
|
|
56
|
+
language = (await import('tree-sitter-python')).default;
|
|
57
|
+
}
|
|
58
|
+
else if (filePath.endsWith('.rs')) {
|
|
59
|
+
language = (await import('tree-sitter-rust')).default;
|
|
60
|
+
}
|
|
61
|
+
else if (filePath.endsWith('.go')) {
|
|
62
|
+
language = (await import('tree-sitter-go')).default;
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
return []; // Unsupported language fallback
|
|
66
|
+
}
|
|
67
|
+
parser.setLanguage(language);
|
|
68
|
+
const tree = parser.parse(text);
|
|
69
|
+
const symbols = [];
|
|
70
|
+
const extractDependencies = (node) => {
|
|
71
|
+
const deps = new Set();
|
|
72
|
+
const walk = (n) => {
|
|
73
|
+
if (n.type === 'call_expression') {
|
|
74
|
+
const fnNode = n.children[0];
|
|
75
|
+
if (fnNode)
|
|
76
|
+
deps.add(fnNode.text);
|
|
77
|
+
}
|
|
78
|
+
for (let i = 0; i < n.childCount; i++) {
|
|
79
|
+
walk(n.child(i));
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
walk(node);
|
|
83
|
+
return Array.from(deps);
|
|
84
|
+
};
|
|
85
|
+
const traverse = (node, parentName) => {
|
|
86
|
+
const type = node.type;
|
|
87
|
+
let currentName = parentName;
|
|
88
|
+
if (type === 'class_declaration' ||
|
|
89
|
+
type === 'function_declaration' ||
|
|
90
|
+
type === 'method_definition' ||
|
|
91
|
+
type === 'function_item' ||
|
|
92
|
+
type === 'impl_item') {
|
|
93
|
+
const nameNode = node.children.find((c) => c.type === 'identifier' || c.type === 'property_identifier');
|
|
94
|
+
const name = nameNode ? nameNode.text : 'anonymous';
|
|
95
|
+
if (type === 'class_declaration' || type === 'impl_item') {
|
|
96
|
+
currentName = name;
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
const symbol = {
|
|
100
|
+
type: 'symbol',
|
|
101
|
+
language: filePath.split('.').pop() || 'unknown',
|
|
102
|
+
filePath,
|
|
103
|
+
symbol: {
|
|
104
|
+
name: parentName ? `${parentName}.${name}` : name,
|
|
105
|
+
kind: type === 'method_definition' ? 'method' : 'function',
|
|
106
|
+
parent: parentName,
|
|
107
|
+
startLine: node.startPosition.row + 1,
|
|
108
|
+
endLine: node.endPosition.row + 1,
|
|
109
|
+
},
|
|
110
|
+
dependencies: extractDependencies(node),
|
|
111
|
+
content: node.text,
|
|
112
|
+
};
|
|
113
|
+
symbols.push(symbol);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
for (let i = 0; i < node.childCount; i++) {
|
|
117
|
+
traverse(node.child(i), currentName);
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
traverse(tree.rootNode);
|
|
121
|
+
return symbols;
|
|
122
|
+
}
|
|
123
|
+
catch (e) {
|
|
124
|
+
console.error(`AST parsing failed for ${filePath}`, e);
|
|
125
|
+
return [];
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
export function extractJson(text) {
|
|
129
|
+
// 1. Try to extract from a markdown code block first
|
|
130
|
+
const codeBlockMatch = text.match(/```(?:json)?\s*([\s\S]*?)\s*```/);
|
|
131
|
+
let jsonString = codeBlockMatch ? codeBlockMatch[1] || text : text;
|
|
132
|
+
// 2. Find the first '{' and the last '}'
|
|
133
|
+
const start = jsonString.indexOf('{');
|
|
134
|
+
const end = jsonString.lastIndexOf('}');
|
|
135
|
+
if (start === -1 || end === -1 || start > end) {
|
|
136
|
+
throw new Error('No JSON object found in response.');
|
|
137
|
+
}
|
|
138
|
+
jsonString = jsonString.substring(start, end + 1);
|
|
139
|
+
// 3. Simple cleanup for common LLM JSON errors (trailing commas)
|
|
140
|
+
jsonString = jsonString.replace(/,\s*([}\]])/g, '$1');
|
|
141
|
+
return JSON.parse(jsonString);
|
|
142
|
+
}
|
|
143
|
+
export const createProjectManifestSummary = (facts) => {
|
|
144
|
+
// Extract scan results from facts
|
|
145
|
+
const scanResult = facts.scanResult || {};
|
|
146
|
+
const extractedFacts = facts.extractedFacts || [];
|
|
147
|
+
// Build language distribution from all indexed files
|
|
148
|
+
const languageDistribution = {};
|
|
149
|
+
const fileTypes = {};
|
|
150
|
+
const allImports = {};
|
|
151
|
+
// Process scan results
|
|
152
|
+
if (scanResult.files) {
|
|
153
|
+
for (const file of scanResult.files) {
|
|
154
|
+
const lang = file.language || 'unknown';
|
|
155
|
+
languageDistribution[lang] = (languageDistribution[lang] || 0) + 1;
|
|
156
|
+
const ext = path.extname(file.filePath).replace('.', '') || 'no-ext';
|
|
157
|
+
fileTypes[ext] = (fileTypes[ext] || 0) + 1;
|
|
158
|
+
// Collect imports
|
|
159
|
+
if (file.imports) {
|
|
160
|
+
for (const imp of file.imports) {
|
|
161
|
+
const impName = imp.split('/').pop() || imp;
|
|
162
|
+
allImports[impName] = (allImports[impName] || 0) + 1;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
// Process extracted facts for additional metadata
|
|
168
|
+
const topImports = Object.entries(allImports)
|
|
169
|
+
.sort((a, b) => b[1] - a[1])
|
|
170
|
+
.slice(0, 20)
|
|
171
|
+
.map(([name, count]) => ({ name, count }));
|
|
172
|
+
// Extract PR info from extracted facts if available
|
|
173
|
+
const prInfo = extractedFacts.find((f) => f.source === 'dependency_graph');
|
|
174
|
+
const langEntries = Object.entries(languageDistribution)
|
|
175
|
+
.map(([lang, count]) => `${lang}: ${count}`)
|
|
176
|
+
.join(', ') || 'Unknown';
|
|
177
|
+
const importLines = topImports.map((imp) => `- ${imp.name}: used in ${imp.count} files`).join('\n') ||
|
|
178
|
+
'No imports tracked';
|
|
179
|
+
const fileTypeLines = Object.entries(fileTypes)
|
|
180
|
+
.sort((a, b) => b[1] - a[1])
|
|
181
|
+
.map(([ext, count]) => `- .${ext}: ${count} files`)
|
|
182
|
+
.join('\n') || 'Unknown';
|
|
183
|
+
const symbolLines = extractedFacts
|
|
184
|
+
.filter((f) => f.source === 'symbol')
|
|
185
|
+
.slice(0, 10)
|
|
186
|
+
.map((f) => `- **${f.kind}**: ${f.symbolName} in ${f.filePath} (lines ${f.startLine}-${f.endLine})`)
|
|
187
|
+
.join('\n') || 'No symbols indexed';
|
|
188
|
+
const prSection = prInfo
|
|
189
|
+
? `\n**PR Size:** ${prInfo.additions ?? 0} additions, ${prInfo.deletions ?? 0} deletions\n**Files Modified:** ${prInfo.changedFiles ?? 0}`
|
|
190
|
+
: '';
|
|
191
|
+
const totalSizeKB = (scanResult.totalBytes || 0) / 1024;
|
|
192
|
+
const sizeDisplay = totalSizeKB.toFixed(1);
|
|
193
|
+
// Build folder structure explanation
|
|
194
|
+
const folderStructure = buildFolderStructure(scanResult);
|
|
195
|
+
// Build run instructions
|
|
196
|
+
const runInstructions = buildRunInstructions(facts);
|
|
197
|
+
// Build codebase familiarization guide
|
|
198
|
+
const familiarization = buildCodebaseFamiliarization(scanResult, extractedFacts);
|
|
199
|
+
return `# Project: ${facts.project_name || 'Unknown Project'}
|
|
200
|
+
|
|
201
|
+
## Overview
|
|
202
|
+
This is a ${facts.application_type || 'software application'} built using the ${facts.architecture_pattern || 'Unknown'} architecture pattern.
|
|
203
|
+
|
|
204
|
+
${facts.explanation || 'No detailed explanation provided.'}
|
|
205
|
+
|
|
206
|
+
## Codebase Statistics
|
|
207
|
+
- **Total Files:** ${scanResult.totalFiles || 0}
|
|
208
|
+
- **Total Symbols:** ${scanResult.totalSymbols || 0}
|
|
209
|
+
- **Total Size:** ${sizeDisplay} KB
|
|
210
|
+
- **Languages Used:** ${langEntries}
|
|
211
|
+
|
|
212
|
+
## Entry Points & Key Files
|
|
213
|
+
- **Entry Points:** ${(scanResult.entryPoints || []).join(', ') || 'None identified'}
|
|
214
|
+
- **Entities/Models:** ${(scanResult.entityFiles || []).length} files
|
|
215
|
+
- **API Routes/Controllers:** ${(scanResult.routeFiles || []).length} files
|
|
216
|
+
- **Configuration Files:** ${(scanResult.configFiles || []).length} files
|
|
217
|
+
|
|
218
|
+
## Top Dependencies
|
|
219
|
+
${importLines}
|
|
220
|
+
|
|
221
|
+
## File Type Distribution
|
|
222
|
+
${fileTypeLines}
|
|
223
|
+
|
|
224
|
+
## Key Symbols (from indexed content)
|
|
225
|
+
${symbolLines}
|
|
226
|
+
|
|
227
|
+
## PR Context (if available)
|
|
228
|
+
${prSection}
|
|
229
|
+
|
|
230
|
+
## Folder Structure
|
|
231
|
+
${folderStructure}
|
|
232
|
+
|
|
233
|
+
## How to Run
|
|
234
|
+
${runInstructions}
|
|
235
|
+
|
|
236
|
+
## Codebase Familiarization
|
|
237
|
+
${familiarization}
|
|
238
|
+
|
|
239
|
+
## Directory Structure
|
|
240
|
+
${scanResult.directorySummary || 'No directory summary available'}
|
|
241
|
+
`;
|
|
242
|
+
};
|
|
243
|
+
function buildFolderStructure(scanResult) {
|
|
244
|
+
const files = scanResult.files || [];
|
|
245
|
+
if (!files.length)
|
|
246
|
+
return 'No files indexed.';
|
|
247
|
+
// Group files by directory
|
|
248
|
+
const dirs = new Map();
|
|
249
|
+
for (const file of files) {
|
|
250
|
+
const parts = file.filePath.split('/');
|
|
251
|
+
const dir = parts.slice(0, -1).join('/') || '.';
|
|
252
|
+
if (!dirs.has(dir))
|
|
253
|
+
dirs.set(dir, []);
|
|
254
|
+
dirs.get(dir).push(file.filePath);
|
|
255
|
+
}
|
|
256
|
+
const sortedDirs = Array.from(dirs.entries()).sort((a, b) => a[0].localeCompare(b[0]));
|
|
257
|
+
let structure = '';
|
|
258
|
+
for (const [dir, files] of sortedDirs) {
|
|
259
|
+
const relDir = dir || '.';
|
|
260
|
+
structure += `- **${relDir}/**\n`;
|
|
261
|
+
for (const f of files.slice(0, 5)) {
|
|
262
|
+
// Show first 5 files per dir
|
|
263
|
+
structure += ` - \`${f}\`\n`;
|
|
264
|
+
}
|
|
265
|
+
if (files.length > 5) {
|
|
266
|
+
structure += ` ... and ${files.length - 5} more files\n`;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
return structure || 'No folder structure available.';
|
|
270
|
+
}
|
|
271
|
+
function buildRunInstructions(facts) {
|
|
272
|
+
const instructions = [];
|
|
273
|
+
// Check for common run methods
|
|
274
|
+
if (facts.application_type === 'web application' || facts.application_type === 'website') {
|
|
275
|
+
instructions.push('- **npm install**: Install dependencies');
|
|
276
|
+
instructions.push('- **npm run dev** or **npm start**: Start development server');
|
|
277
|
+
instructions.push('- **Open browser** to http://localhost:3000 or http://localhost:16500');
|
|
278
|
+
}
|
|
279
|
+
if (facts.application_type === 'api server' || facts.application_type === 'backend') {
|
|
280
|
+
instructions.push('- **npm install**: Install dependencies');
|
|
281
|
+
instructions.push('- **npm run dev**: Start the API server');
|
|
282
|
+
instructions.push('- **Server will listen** on the configured port (e.g., http://localhost:16500)');
|
|
283
|
+
}
|
|
284
|
+
if (facts.required_secrets) {
|
|
285
|
+
instructions.push('- **Set required environment variables** as listed in the Required Secrets section');
|
|
286
|
+
}
|
|
287
|
+
instructions.push('');
|
|
288
|
+
instructions.push("For detailed setup instructions, refer to the project's README and configuration files.");
|
|
289
|
+
return instructions.join('\n') || 'No run instructions available.';
|
|
290
|
+
}
|
|
291
|
+
function buildCodebaseFamiliarization(scanResult, extractedFacts) {
|
|
292
|
+
const files = scanResult.files || [];
|
|
293
|
+
if (!files.length)
|
|
294
|
+
return 'No codebase information available.';
|
|
295
|
+
const sections = [];
|
|
296
|
+
// Key areas of the codebase
|
|
297
|
+
const entryPoints = (scanResult.entryPoints || []).map((p) => `- \`${p}\``).join(', ') || 'None identified';
|
|
298
|
+
sections.push(`**Entry Points:** ${entryPoints}`);
|
|
299
|
+
// Main modules/files
|
|
300
|
+
const mainFiles = files
|
|
301
|
+
.filter((f) => f.isEntryPoint)
|
|
302
|
+
.slice(0, 10)
|
|
303
|
+
.map((f) => `- \`${f.filePath}\` (${f.language || 'unknown'})`)
|
|
304
|
+
.join('\n') || 'No entry points identified';
|
|
305
|
+
sections.push(`**Main Files:**\n${mainFiles}`);
|
|
306
|
+
// Entity/models overview
|
|
307
|
+
const entities = files
|
|
308
|
+
.filter((f) => f.isEntity)
|
|
309
|
+
.slice(0, 5)
|
|
310
|
+
.map((f) => `- \`${f.filePath}\` - Data entity/model`)
|
|
311
|
+
.join('\n') || 'No entities identified';
|
|
312
|
+
sections.push(`**Data Entities/Models:**\n${entities}`);
|
|
313
|
+
// API routes overview
|
|
314
|
+
const routes = files
|
|
315
|
+
.filter((f) => f.isRoute)
|
|
316
|
+
.slice(0, 5)
|
|
317
|
+
.map((f) => `- \`${f.filePath}\` - API route/controller`)
|
|
318
|
+
.join('\n') || 'No routes identified';
|
|
319
|
+
sections.push(`**API Routes/Controllers:**\n${routes}`);
|
|
320
|
+
// Key symbols overview
|
|
321
|
+
const symbols = extractedFacts
|
|
322
|
+
.filter((f) => f.source === 'symbol')
|
|
323
|
+
.slice(0, 10)
|
|
324
|
+
.map((f) => `- **${f.kind}**: ${f.symbolName} in ${f.filePath} (lines ${f.startLine}-${f.endLine})`)
|
|
325
|
+
.join('\n') || 'No symbols indexed';
|
|
326
|
+
sections.push(`**Key Symbols:**\n${symbols}`);
|
|
327
|
+
// Top imports
|
|
328
|
+
const allImports = {};
|
|
329
|
+
for (const file of files) {
|
|
330
|
+
if (file.imports) {
|
|
331
|
+
for (const imp of file.imports) {
|
|
332
|
+
const impName = imp.split('/').pop() || imp;
|
|
333
|
+
allImports[impName] = (allImports[impName] || 0) + 1;
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
const topImports = Object.entries(allImports)
|
|
338
|
+
.sort((a, b) => b[1] - a[1])
|
|
339
|
+
.slice(0, 10)
|
|
340
|
+
.map(([name, count]) => `- \`${name}\` (in ${count} files)`)
|
|
341
|
+
.join('\n') || 'No imports tracked';
|
|
342
|
+
sections.push(`**Top Imports:**\n${topImports}`);
|
|
343
|
+
return sections.join('\n\n') || 'No codebase familiarization information available.';
|
|
344
|
+
}
|
|
345
|
+
export function parseDiff(diffString) {
|
|
346
|
+
const files = [];
|
|
347
|
+
const lines = diffString.split('\n');
|
|
348
|
+
let currentFile = '';
|
|
349
|
+
let currentDiff = '';
|
|
350
|
+
for (const line of lines) {
|
|
351
|
+
if (line.startsWith('diff --git ')) {
|
|
352
|
+
if (currentFile && currentDiff) {
|
|
353
|
+
files.push({ file: currentFile, diff: currentDiff });
|
|
354
|
+
}
|
|
355
|
+
const match = line.match(/diff --git a\/(.+?) b\/(.+?)$/);
|
|
356
|
+
if (match) {
|
|
357
|
+
currentFile = match[2] || 'unknown';
|
|
358
|
+
}
|
|
359
|
+
else {
|
|
360
|
+
currentFile = 'unknown';
|
|
361
|
+
}
|
|
362
|
+
currentDiff = line + '\n';
|
|
363
|
+
}
|
|
364
|
+
else {
|
|
365
|
+
if (currentFile) {
|
|
366
|
+
currentDiff += line + '\n';
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
if (currentFile && currentDiff) {
|
|
371
|
+
files.push({ file: currentFile, diff: currentDiff });
|
|
372
|
+
}
|
|
373
|
+
return files;
|
|
374
|
+
}
|
|
375
|
+
export function purgeQvacKvCache() {
|
|
376
|
+
try {
|
|
377
|
+
const cacheDir = path.join(os.homedir(), '.qvac', 'kv-cache');
|
|
378
|
+
if (fs.existsSync(cacheDir)) {
|
|
379
|
+
fs.rmSync(cacheDir, { recursive: true, force: true });
|
|
380
|
+
console.log('Cleared QVAC KV cache directory:', cacheDir);
|
|
381
|
+
return true;
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
catch (err) {
|
|
385
|
+
console.error('Failed to purge QVAC KV cache:', err);
|
|
386
|
+
}
|
|
387
|
+
return false;
|
|
388
|
+
}
|
|
389
|
+
//# sourceMappingURL=ai-agent.utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-agent.utils.js","sourceRoot":"","sources":["../../../src/modules/ai-agent/ai-agent.utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { MainModule } from '../main.module.js';
|
|
2
|
+
export declare abstract class BaseAgent {
|
|
3
|
+
protected mainModule: MainModule;
|
|
4
|
+
/** Cache loaded model IDs to avoid re-loading on every request */
|
|
5
|
+
private static cachedModelIds;
|
|
6
|
+
protected static currentDevice: string | null;
|
|
7
|
+
constructor(mainModule: MainModule);
|
|
8
|
+
protected ensureModelsLoaded(): Promise<{
|
|
9
|
+
llmId: string;
|
|
10
|
+
embeddingId: string;
|
|
11
|
+
}>;
|
|
12
|
+
protected awaitCompletion(run: {
|
|
13
|
+
requestId: string;
|
|
14
|
+
final: Promise<any>;
|
|
15
|
+
}): Promise<any>;
|
|
16
|
+
protected emitProgress(projectId: string, message: string): void;
|
|
17
|
+
/** Retrieve relevant project facts from the vector DB using semantic search. */
|
|
18
|
+
protected getRelevantContext(projectId: string, gteId: string, query: string): Promise<string>;
|
|
19
|
+
loadModels(): Promise<void>;
|
|
20
|
+
loadModelsWithIds(): Promise<{
|
|
21
|
+
llmId: string;
|
|
22
|
+
embeddingId: string;
|
|
23
|
+
}>;
|
|
24
|
+
unloadModels(): Promise<void>;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=base.agent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.agent.d.ts","sourceRoot":"","sources":["../../../src/modules/ai-agent/base.agent.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAMpD,8BAAsB,SAAS;IAKjB,SAAS,CAAC,UAAU,EAAE,UAAU;IAJ5C,kEAAkE;IAClE,OAAO,CAAC,MAAM,CAAC,cAAc,CAAuD;IACpF,SAAS,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAQ;gBAE/B,UAAU,EAAE,UAAU;cAE5B,kBAAkB,IAAI,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAuBrF,SAAS,CAAC,eAAe,CAAC,GAAG,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,CAAA;KAAE,GAAG,OAAO,CAAC,GAAG,CAAC;IAaxF,SAAS,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;IAMzD,gFAAgF;cAChE,kBAAkB,CAChC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,MAAM,CAAC;IAwCZ,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3B,iBAAiB,IAAI,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAIpE,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;CAoBpC"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { embed, unloadModel } from '@qvac/sdk';
|
|
2
|
+
import * as qvacModels from '@qvac/sdk';
|
|
3
|
+
import { LLM_MODEL_ID, EMBEDDING_MODEL_ID } from '../../constants.js';
|
|
4
|
+
import { loadAIModels } from './model-loader.js';
|
|
5
|
+
const REVIEW_TIMEOUT_MS = 600_000; // 10 min for CPU inference
|
|
6
|
+
export class BaseAgent {
|
|
7
|
+
mainModule;
|
|
8
|
+
/** Cache loaded model IDs to avoid re-loading on every request */
|
|
9
|
+
static cachedModelIds = null;
|
|
10
|
+
static currentDevice = null;
|
|
11
|
+
constructor(mainModule) {
|
|
12
|
+
this.mainModule = mainModule;
|
|
13
|
+
}
|
|
14
|
+
async ensureModelsLoaded() {
|
|
15
|
+
// Return cached IDs if available - loading models is expensive
|
|
16
|
+
if (BaseAgent.cachedModelIds) {
|
|
17
|
+
return BaseAgent.cachedModelIds;
|
|
18
|
+
}
|
|
19
|
+
// Delegate to the shared loader used by the indexer and the boot-time
|
|
20
|
+
// preload. That loader caches the resolved registry IDs process-wide and
|
|
21
|
+
// reads the device setting once, so review/chat reuse the SAME already
|
|
22
|
+
// loaded instances instead of issuing a redundant loadModel round-trip.
|
|
23
|
+
const { llmModelId, embeddingModelId } = await loadAIModels(this.mainModule, new Set());
|
|
24
|
+
BaseAgent.cachedModelIds = {
|
|
25
|
+
llmId: llmModelId,
|
|
26
|
+
embeddingId: embeddingModelId,
|
|
27
|
+
};
|
|
28
|
+
return BaseAgent.cachedModelIds;
|
|
29
|
+
}
|
|
30
|
+
awaitCompletion(run) {
|
|
31
|
+
console.log(`[LLM] Executing completion call on device: ${BaseAgent.currentDevice || 'unknown'}`);
|
|
32
|
+
const timeout = new Promise((_, reject) => setTimeout(() => reject(new Error(`LLM timed out after ${REVIEW_TIMEOUT_MS / 1000}s`)), REVIEW_TIMEOUT_MS));
|
|
33
|
+
return Promise.race([run.final, timeout]);
|
|
34
|
+
}
|
|
35
|
+
emitProgress(projectId, message) {
|
|
36
|
+
if (this.mainModule.socket) {
|
|
37
|
+
this.mainModule.socket.emitReviewProgress({ projectId, status: 'running', message });
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/** Retrieve relevant project facts from the vector DB using semantic search. */
|
|
41
|
+
async getRelevantContext(projectId, gteId, query) {
|
|
42
|
+
try {
|
|
43
|
+
const queryText = query.substring(0, 800);
|
|
44
|
+
let embedResult;
|
|
45
|
+
// GTE-Large rejects inputs that tokenize beyond its 512-token context
|
|
46
|
+
// window. Shrink the query defensively if the runtime reports overflow.
|
|
47
|
+
for (let attempt = queryText, i = 0; i < 5; i++) {
|
|
48
|
+
try {
|
|
49
|
+
embedResult = await embed({ modelId: gteId, text: attempt });
|
|
50
|
+
break;
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
const message = String(error?.message || error || '');
|
|
54
|
+
if (!/context\s?overflow|tokenizeInput|effective context size/i.test(message)) {
|
|
55
|
+
throw error;
|
|
56
|
+
}
|
|
57
|
+
const shrunkLength = Math.max(64, Math.floor(attempt.length * 0.6));
|
|
58
|
+
if (shrunkLength >= attempt.length)
|
|
59
|
+
throw error;
|
|
60
|
+
console.warn(`[Embedding] Semantic-search query overflow detected (${message}), ` +
|
|
61
|
+
`shrinking input ${attempt.length} → ${shrunkLength} chars and retrying (attempt ${i + 1})`);
|
|
62
|
+
attempt = attempt.substring(0, shrunkLength);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
if (!embedResult)
|
|
66
|
+
return '';
|
|
67
|
+
const facts = await this.mainModule.database.vectorDatabase.searchFacts(projectId, embedResult.embedding, 5);
|
|
68
|
+
if (!facts.length)
|
|
69
|
+
return '';
|
|
70
|
+
return facts.map((f) => f.content).join('\n\n---\n\n');
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
return '';
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
async loadModels() {
|
|
77
|
+
await this.ensureModelsLoaded();
|
|
78
|
+
}
|
|
79
|
+
async loadModelsWithIds() {
|
|
80
|
+
return this.ensureModelsLoaded();
|
|
81
|
+
}
|
|
82
|
+
async unloadModels() {
|
|
83
|
+
const llmId = qvacModels[LLM_MODEL_ID]?.modelId ?? LLM_MODEL_ID;
|
|
84
|
+
const embeddingId = qvacModels[EMBEDDING_MODEL_ID]?.modelId ?? EMBEDDING_MODEL_ID;
|
|
85
|
+
try {
|
|
86
|
+
await unloadModel({ modelId: llmId });
|
|
87
|
+
}
|
|
88
|
+
catch (e) {
|
|
89
|
+
console.warn(`Failed to unload LLM model:`, e);
|
|
90
|
+
}
|
|
91
|
+
try {
|
|
92
|
+
await unloadModel({ modelId: embeddingId });
|
|
93
|
+
}
|
|
94
|
+
catch (e) {
|
|
95
|
+
console.warn(`Failed to unload embedding model:`, e);
|
|
96
|
+
}
|
|
97
|
+
// Clear the cache so models get re-loaded next time
|
|
98
|
+
BaseAgent.cachedModelIds = null;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=base.agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.agent.js","sourceRoot":"","sources":["../../../src/modules/ai-agent/base.agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { BaseAgent } from './base.agent.js';
|
|
2
|
+
import type { GitHubMeta } from './tool-types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Removes raw tool-call syntax from assistant text so markers never leak into
|
|
5
|
+
* the client UI or into context history. The model emits tool calls in content
|
|
6
|
+
* deltas (e.g. `<|tool_call|>call:get_directory_tree{}`) when it uses a dialect
|
|
7
|
+
* the SDK's structured parser doesn't recognize. Leaving that raw text in
|
|
8
|
+
* history causes the model to see (and repeat) its own tool-call markers on the
|
|
9
|
+
* next turn, resulting in duplicate executions.
|
|
10
|
+
*
|
|
11
|
+
* This is brace-aware so tool calls with nested braces in their arguments
|
|
12
|
+
* (e.g. comment bodies containing code snippets) are removed completely
|
|
13
|
+
* rather than truncated by a naive regex.
|
|
14
|
+
*/
|
|
15
|
+
export declare function stripToolCallMarkers(text: string): string;
|
|
16
|
+
export declare class ChatAgent extends BaseAgent {
|
|
17
|
+
/**
|
|
18
|
+
* Stream a chat response grounded in project context and PR diff.
|
|
19
|
+
*
|
|
20
|
+
* The socketId is used to bind structured confirmations to the initiating
|
|
21
|
+
* client so no other connected client can respond.
|
|
22
|
+
*/
|
|
23
|
+
chatStream(projectId: string, history: {
|
|
24
|
+
role: string;
|
|
25
|
+
content: string;
|
|
26
|
+
}[], userMessage: string, prDiff?: string, githubMeta?: GitHubMeta, socketId?: string): AsyncGenerator<string, void, unknown>;
|
|
27
|
+
/**
|
|
28
|
+
* Single-turn helper. The caller is responsible for preserving history.
|
|
29
|
+
*/
|
|
30
|
+
chat(projectId: string, history: {
|
|
31
|
+
role: string;
|
|
32
|
+
content: string;
|
|
33
|
+
}[], userMessage: string, prDiff?: string, githubMeta?: GitHubMeta, socketId?: string): Promise<string>;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=chat.agent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat.agent.d.ts","sourceRoot":"","sources":["../../../src/modules/ai-agent/chat.agent.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAM5C,OAAO,KAAK,EAAE,UAAU,EAA4B,MAAM,iBAAiB,CAAC;AA0I5E;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAmFzD;AAsDD,qBAAa,SAAU,SAAQ,SAAS;IACtC;;;;;OAKG;IACI,UAAU,CACf,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,EAC5C,WAAW,EAAE,MAAM,EACnB,MAAM,CAAC,EAAE,MAAM,EACf,UAAU,CAAC,EAAE,UAAU,EACvB,QAAQ,CAAC,EAAE,MAAM,GAChB,cAAc,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC;IA+YxC;;OAEG;IACG,IAAI,CACR,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,EAC5C,WAAW,EAAE,MAAM,EACnB,MAAM,CAAC,EAAE,MAAM,EACf,UAAU,CAAC,EAAE,UAAU,EACvB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,CAAC;CAUnB"}
|