@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,590 @@
|
|
|
1
|
+
import { completion } from '@qvac/sdk';
|
|
2
|
+
import { BaseAgent } from './base.agent.js';
|
|
3
|
+
import ProjectEntity from '../server/entities/project.entity.js';
|
|
4
|
+
import { parseDiff, createProjectManifestSummary } from './ai-agent.utils.js';
|
|
5
|
+
import { createGitTools } from './tools/git-tools.js';
|
|
6
|
+
import { createFsTools } from './tools/fs-tools.js';
|
|
7
|
+
import { createPrChatTools } from './tools/pr-chat-tools.js';
|
|
8
|
+
import { ToolExecutor, serializeToolResult, resolveToolName } from './tool-executor.js';
|
|
9
|
+
import { AgentContextManager } from './agent-context-manager.js';
|
|
10
|
+
/**
|
|
11
|
+
* Scans raw model text and finds offsets of balanced top-level JSON objects
|
|
12
|
+
* using character-wise brace matching (honoring string literals). Regex-based
|
|
13
|
+
* extraction truncates at the first `}` it sees, which corrupts tool calls
|
|
14
|
+
* whose comment bodies contain nested braces (e.g. code snippets like
|
|
15
|
+
* `catch {}` or object literals inside a review comment).
|
|
16
|
+
*/
|
|
17
|
+
function getBalancedJsonObjectSpans(rawText, predicate = () => true) {
|
|
18
|
+
const spans = [];
|
|
19
|
+
const stack = [];
|
|
20
|
+
let inString = false;
|
|
21
|
+
let escaped = false;
|
|
22
|
+
for (let i = 0; i < rawText.length; i++) {
|
|
23
|
+
const ch = rawText[i];
|
|
24
|
+
if (escaped) {
|
|
25
|
+
escaped = false;
|
|
26
|
+
continue;
|
|
27
|
+
}
|
|
28
|
+
if (ch === '\\' && inString) {
|
|
29
|
+
escaped = true;
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
if (ch === '"') {
|
|
33
|
+
inString = !inString;
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
if (inString)
|
|
37
|
+
continue;
|
|
38
|
+
if (ch === '{') {
|
|
39
|
+
if (stack.length === 0 && !predicate(rawText.slice(i))) {
|
|
40
|
+
continue; // Ignore top-level objects that don't look like tool calls.
|
|
41
|
+
}
|
|
42
|
+
stack.push(i);
|
|
43
|
+
}
|
|
44
|
+
else if (ch === '}') {
|
|
45
|
+
if (stack.length > 0) {
|
|
46
|
+
const start = stack.pop();
|
|
47
|
+
if (stack.length === 0) {
|
|
48
|
+
spans.push([start, i + 1]);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return spans;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Parses JSON tool calls embedded in raw model text output. Local models
|
|
57
|
+
* frequently emit tool calls as JSON text in content deltas rather than as
|
|
58
|
+
* structured toolCall events.
|
|
59
|
+
*
|
|
60
|
+
* The extraction is brace-aware (string-literal safe) so nested braces inside
|
|
61
|
+
* comment bodies (e.g. code snippets like `catch {}` or object literals in a
|
|
62
|
+
* review comment) do NOT truncate the JSON object prematurely. The old regex
|
|
63
|
+
* approach only handled 3 levels of nesting and silently dropped any comment
|
|
64
|
+
* that contained a brace pair.
|
|
65
|
+
*/
|
|
66
|
+
function parseFallbackToolCalls(rawText) {
|
|
67
|
+
const calls = [];
|
|
68
|
+
try {
|
|
69
|
+
// Character-wise scan that tracks string literals and brace depth so we can
|
|
70
|
+
// extract complete top-level JSON objects regardless of nested braces.
|
|
71
|
+
// The predicate receives text starting at the '{' character, so the regex
|
|
72
|
+
// must account for the opening brace followed by the "name" key.
|
|
73
|
+
const matches = getBalancedJsonObjectSpans(rawText, (start) => /^[\s\n]*\{[\s\n]*"name"\s*:/.test(start));
|
|
74
|
+
for (const [start, end] of matches) {
|
|
75
|
+
try {
|
|
76
|
+
const parsed = JSON.parse(rawText.slice(start, end));
|
|
77
|
+
if (parsed && typeof parsed.name === 'string') {
|
|
78
|
+
const args = parsed.arguments !== undefined ? parsed.arguments : parsed.args;
|
|
79
|
+
if (args !== undefined) {
|
|
80
|
+
calls.push({ name: parsed.name, arguments: args });
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
// Ignore malformed JSON fragments.
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
// Lenient regex: handles `<|tool_call|>call:name{}`, `<|tool_call>call: name{}`,
|
|
89
|
+
// `<|tool_call|>name{}`, and whitespace variants. Local models are inconsistent
|
|
90
|
+
// about the exact dialect so we accept any of these forms.
|
|
91
|
+
const toolCallRegex = /<\|tool_call\|?>?\s*:?\s*(?:call\s*:\s*)?([a-zA-Z0-9_-]+)\{(.*?)\}/g;
|
|
92
|
+
// eslint-disable-next-line no-constant-condition
|
|
93
|
+
let toolMatch;
|
|
94
|
+
// eslint-disable-next-line no-constant-condition
|
|
95
|
+
while ((toolMatch = toolCallRegex.exec(rawText)) !== null) {
|
|
96
|
+
try {
|
|
97
|
+
const body = toolMatch[2]?.trim();
|
|
98
|
+
const args = body ? JSON.parse(`{${body}}`) : {};
|
|
99
|
+
calls.push({
|
|
100
|
+
name: toolMatch[1] || '',
|
|
101
|
+
arguments: args,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
try {
|
|
106
|
+
calls.push({
|
|
107
|
+
name: toolMatch[1] || '',
|
|
108
|
+
arguments: JSON.parse(toolMatch[2] || '{}'),
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
// Ignore malformed tool-call syntax.
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
// Fall back to no tool calls.
|
|
119
|
+
}
|
|
120
|
+
return calls;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Removes raw tool-call syntax from assistant text so markers never leak into
|
|
124
|
+
* the client UI or into context history. The model emits tool calls in content
|
|
125
|
+
* deltas (e.g. `<|tool_call|>call:get_directory_tree{}`) when it uses a dialect
|
|
126
|
+
* the SDK's structured parser doesn't recognize. Leaving that raw text in
|
|
127
|
+
* history causes the model to see (and repeat) its own tool-call markers on the
|
|
128
|
+
* next turn, resulting in duplicate executions.
|
|
129
|
+
*
|
|
130
|
+
* This is brace-aware so tool calls with nested braces in their arguments
|
|
131
|
+
* (e.g. comment bodies containing code snippets) are removed completely
|
|
132
|
+
* rather than truncated by a naive regex.
|
|
133
|
+
*/
|
|
134
|
+
export function stripToolCallMarkers(text) {
|
|
135
|
+
if (!text)
|
|
136
|
+
return '';
|
|
137
|
+
const spansToRemove = [];
|
|
138
|
+
// JSON tool calls emitted as raw text: {"name": "...", "arguments": {...}, ...}
|
|
139
|
+
// Predicate receives text starting at the '{' character.
|
|
140
|
+
const jsonSpans = getBalancedJsonObjectSpans(text, (start) => /^[\s\n]*\{[\s\n]*"name"\s*:/.test(start));
|
|
141
|
+
spansToRemove.push(...jsonSpans);
|
|
142
|
+
// Tool-call dialect: <|tool_call|>call:name{...} (or whitespace variants).
|
|
143
|
+
const dialectRegex = /<\|tool_call\|?>?\s*:?\s*(?:call\s*:\s*)?[a-zA-Z0-9_-]+\{/g;
|
|
144
|
+
let toolMatch;
|
|
145
|
+
while ((toolMatch = dialectRegex.exec(text)) !== null) {
|
|
146
|
+
const start = toolMatch.index;
|
|
147
|
+
// Scan for the matching closing brace, honoring string literals.
|
|
148
|
+
let depth = 0;
|
|
149
|
+
let inString = false;
|
|
150
|
+
let escaped = false;
|
|
151
|
+
for (let j = start; j < text.length; j++) {
|
|
152
|
+
const ch = text[j];
|
|
153
|
+
if (escaped) {
|
|
154
|
+
escaped = false;
|
|
155
|
+
continue;
|
|
156
|
+
}
|
|
157
|
+
if (ch === '\\' && inString) {
|
|
158
|
+
escaped = true;
|
|
159
|
+
continue;
|
|
160
|
+
}
|
|
161
|
+
if (ch === '"') {
|
|
162
|
+
inString = !inString;
|
|
163
|
+
continue;
|
|
164
|
+
}
|
|
165
|
+
if (inString)
|
|
166
|
+
continue;
|
|
167
|
+
if (ch === '{') {
|
|
168
|
+
depth++;
|
|
169
|
+
}
|
|
170
|
+
else if (ch === '}') {
|
|
171
|
+
depth--;
|
|
172
|
+
if (depth === 0) {
|
|
173
|
+
spansToRemove.push([start, j + 1]);
|
|
174
|
+
break;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
// Sort spans by start offset and merge overlapping ranges.
|
|
180
|
+
const sorted = spansToRemove.sort((a, b) => a[0] - b[0]);
|
|
181
|
+
const merged = [];
|
|
182
|
+
for (const [start, end] of sorted) {
|
|
183
|
+
const last = merged[merged.length - 1];
|
|
184
|
+
if (last && start <= last[1]) {
|
|
185
|
+
last[1] = Math.max(last[1], end);
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
merged.push([start, end]);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
// Rebuild the text without removed tool-call spans.
|
|
192
|
+
let clean = '';
|
|
193
|
+
let cursor = 0;
|
|
194
|
+
for (const [start, end] of merged) {
|
|
195
|
+
clean += text.slice(cursor, start);
|
|
196
|
+
cursor = end;
|
|
197
|
+
}
|
|
198
|
+
clean += text.slice(cursor);
|
|
199
|
+
return clean.trim();
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Selects the tool subset exposed to the model for this turn.
|
|
203
|
+
*
|
|
204
|
+
* All read-only codebase exploration, branch inspection, and PR investigation
|
|
205
|
+
* tools are ALWAYS available so the agent can confidently navigate the cloned
|
|
206
|
+
* repository, read files, list branches, and compare implementations without
|
|
207
|
+
* the user needing to use specific keywords.
|
|
208
|
+
*
|
|
209
|
+
* Mutation tools (leave_pr_comment, request_pr_changes) are also ALWAYS
|
|
210
|
+
* exposed. They do not execute on their own: the runtime gates every mutation
|
|
211
|
+
* behind a socket confirmation dialog bound to the initiating client, so the
|
|
212
|
+
* user explicitly approves each write. Keyword-based gating is harmful here
|
|
213
|
+
* because follow-up turns like "yes I approve" or "please post it" do not
|
|
214
|
+
* contain the original intent keyword and the model is then unable to emit the
|
|
215
|
+
* tool call it already drafted.
|
|
216
|
+
*/
|
|
217
|
+
function selectTools(_userMessage, allTools) {
|
|
218
|
+
// Always available: full codebase exploration + branch inspection + PR tools.
|
|
219
|
+
// The agent should be able to navigate the cloned repository, read files,
|
|
220
|
+
// list branches, and compare implementations without keyword gating.
|
|
221
|
+
const alwaysAvailable = new Set([
|
|
222
|
+
// PR investigation
|
|
223
|
+
'read_pr_file_diff',
|
|
224
|
+
'semantic_search',
|
|
225
|
+
// Codebase exploration (fs-tools)
|
|
226
|
+
'read_file',
|
|
227
|
+
'read_file_lines',
|
|
228
|
+
'read_directory',
|
|
229
|
+
'get_directory_tree',
|
|
230
|
+
'get_file_outline',
|
|
231
|
+
'read_symbol',
|
|
232
|
+
'search_in_files',
|
|
233
|
+
// Git / branch inspection (git-tools)
|
|
234
|
+
'get_current_branch',
|
|
235
|
+
'get_recent_commits',
|
|
236
|
+
'get_pr_files',
|
|
237
|
+
'get_file_diff',
|
|
238
|
+
'list_branches',
|
|
239
|
+
'read_file_from_branch',
|
|
240
|
+
'compare_file_between_branches',
|
|
241
|
+
'get_branch_diff',
|
|
242
|
+
'get_file_history',
|
|
243
|
+
'get_file_at_commit',
|
|
244
|
+
'get_branch_status',
|
|
245
|
+
// Mutation tools (always exposed; execution requires user confirmation)
|
|
246
|
+
'leave_pr_comment',
|
|
247
|
+
'request_pr_changes',
|
|
248
|
+
]);
|
|
249
|
+
return allTools.filter((tool) => alwaysAvailable.has(tool.name));
|
|
250
|
+
}
|
|
251
|
+
export class ChatAgent extends BaseAgent {
|
|
252
|
+
/**
|
|
253
|
+
* Stream a chat response grounded in project context and PR diff.
|
|
254
|
+
*
|
|
255
|
+
* The socketId is used to bind structured confirmations to the initiating
|
|
256
|
+
* client so no other connected client can respond.
|
|
257
|
+
*/
|
|
258
|
+
async *chatStream(projectId, history, userMessage, prDiff, githubMeta, socketId) {
|
|
259
|
+
const session = githubMeta?.pull_number !== undefined
|
|
260
|
+
? this.mainModule.aiAgent.sessionManager.getSession(projectId, githubMeta.pull_number)
|
|
261
|
+
: undefined;
|
|
262
|
+
let llmId;
|
|
263
|
+
let embeddingId;
|
|
264
|
+
let parsedDiffFiles;
|
|
265
|
+
let gitTools;
|
|
266
|
+
let fsTools;
|
|
267
|
+
let projectOverview;
|
|
268
|
+
if (session) {
|
|
269
|
+
llmId = session.llmId;
|
|
270
|
+
embeddingId = session.embeddingId;
|
|
271
|
+
parsedDiffFiles = session.parsedDiffFiles;
|
|
272
|
+
gitTools = session.gitTools;
|
|
273
|
+
fsTools = session.fsTools;
|
|
274
|
+
projectOverview = session.projectOverview;
|
|
275
|
+
}
|
|
276
|
+
else {
|
|
277
|
+
const models = await this.ensureModelsLoaded();
|
|
278
|
+
llmId = models.llmId;
|
|
279
|
+
embeddingId = models.embeddingId;
|
|
280
|
+
const project = await ProjectEntity.findOneBy({ id: projectId });
|
|
281
|
+
gitTools = project?.repository_path
|
|
282
|
+
? createGitTools(project.repository_path)
|
|
283
|
+
: [];
|
|
284
|
+
fsTools = project?.repository_path
|
|
285
|
+
? createFsTools(project.repository_path)
|
|
286
|
+
: [];
|
|
287
|
+
parsedDiffFiles = prDiff ? parseDiff(prDiff) : [];
|
|
288
|
+
projectOverview = project?.analysis
|
|
289
|
+
? createProjectManifestSummary(project.analysis)
|
|
290
|
+
: 'No project overview available.';
|
|
291
|
+
}
|
|
292
|
+
const context = await this.getRelevantContext(projectId, embeddingId, userMessage);
|
|
293
|
+
const changedFiles = parsedDiffFiles.map((file) => file.file);
|
|
294
|
+
const diffContext = changedFiles.length > 0
|
|
295
|
+
? `\n\n## Changed Files in PR:\n${changedFiles
|
|
296
|
+
.map((file) => `- ${file}`)
|
|
297
|
+
.join('\n')}\n\nUse the \`read_pr_file_diff\` tool to view the exact changes for any of these files.`
|
|
298
|
+
: '';
|
|
299
|
+
let metaContext = '';
|
|
300
|
+
if (githubMeta) {
|
|
301
|
+
metaContext = `\n\n## GitHub PR Metadata\nOwner: ${githubMeta.owner}\nRepo: ${githubMeta.repo}\nPull Number: ${githubMeta.pull_number}`;
|
|
302
|
+
if (githubMeta.creator)
|
|
303
|
+
metaContext += `\nCreator: ${githubMeta.creator}`;
|
|
304
|
+
let additions = githubMeta.additions;
|
|
305
|
+
let deletions = githubMeta.deletions;
|
|
306
|
+
let changedFilesCount = githubMeta.changed_files;
|
|
307
|
+
if (additions === undefined || deletions === undefined) {
|
|
308
|
+
additions = 0;
|
|
309
|
+
deletions = 0;
|
|
310
|
+
const lines = (prDiff || '').split('\n');
|
|
311
|
+
for (const line of lines) {
|
|
312
|
+
if (line.startsWith('+') && !line.startsWith('+++'))
|
|
313
|
+
additions++;
|
|
314
|
+
else if (line.startsWith('-') && !line.startsWith('---'))
|
|
315
|
+
deletions++;
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
if (changedFilesCount === undefined) {
|
|
319
|
+
changedFilesCount = parsedDiffFiles.length;
|
|
320
|
+
}
|
|
321
|
+
// Explicit line count context for the PR
|
|
322
|
+
const totalLines = additions + deletions;
|
|
323
|
+
metaContext += `\n\n## PR Size Summary\n- **Lines Added:** ${additions}`;
|
|
324
|
+
metaContext += `\n- **Lines Removed:** ${deletions}`;
|
|
325
|
+
metaContext += `\n- **Total Lines Changed:** ${totalLines}`;
|
|
326
|
+
if (changedFilesCount !== undefined) {
|
|
327
|
+
metaContext += `\n- **Files Modified:** ${changedFilesCount}`;
|
|
328
|
+
}
|
|
329
|
+
metaContext += `\n\nUse this context to gauge the scope of the PR. A small PR (under 100 lines) is likely a focused change, while a large PR (500+ lines) may need more careful review.`;
|
|
330
|
+
}
|
|
331
|
+
// PR-specific tools are now in their own module: tools/pr-chat-tools.ts
|
|
332
|
+
// This keeps chat.agent.ts focused on the orchestration logic.
|
|
333
|
+
const prTools = createPrChatTools(parsedDiffFiles, githubMeta, this.mainModule, async (pid, query) => await this.getRelevantContext(pid, embeddingId, query), projectId);
|
|
334
|
+
// Remove switch_branch from ordinary chat. It changes the physical working
|
|
335
|
+
// tree and the model almost never needs it when read-only branch inspection
|
|
336
|
+
// tools are available.
|
|
337
|
+
const safeGitTools = gitTools.filter((tool) => tool.name !== 'switch_branch');
|
|
338
|
+
// Remove duplicate read_file. Both git-tools and fs-tools define one.
|
|
339
|
+
const gitToolsWithoutReadFile = safeGitTools.filter((tool) => tool.name !== 'read_file');
|
|
340
|
+
// All tools available for this session.
|
|
341
|
+
const allTools = [...gitToolsWithoutReadFile, ...fsTools, ...prTools];
|
|
342
|
+
// Dynamically select a smaller tool subset based on user intent.
|
|
343
|
+
const runtimeTools = selectTools(userMessage, allTools);
|
|
344
|
+
const systemPrompt = `You are Lazy Review, a code-review assistant embedded in a PR review tool.
|
|
345
|
+
|
|
346
|
+
## CRITICAL: You MUST use tools to gather information. Never describe or plan to use a tool — actually call it.
|
|
347
|
+
|
|
348
|
+
You have access to the full cloned repository on disk. When the user asks about
|
|
349
|
+
code, files, branches, diffs, or history, you MUST call the appropriate tool to
|
|
350
|
+
get the actual data. Do NOT say "I would use X" or "Let me check X" — just call
|
|
351
|
+
the tool and use its result.
|
|
352
|
+
|
|
353
|
+
### Tool Usage Rules
|
|
354
|
+
1. If the user asks about a file → call read_file immediately.
|
|
355
|
+
2. If the user asks about branches → call list_branches immediately.
|
|
356
|
+
3. If the user asks about a diff → call get_branch_diff or read_pr_file_diff immediately.
|
|
357
|
+
4. If the user asks about file history → call get_file_history immediately.
|
|
358
|
+
5. If the user asks to compare branches → call compare_file_between_branches or get_branch_diff immediately.
|
|
359
|
+
6. If the user asks about the codebase structure → call get_directory_tree or read_directory immediately.
|
|
360
|
+
7. If the user asks about a symbol → call read_symbol or search_in_files immediately.
|
|
361
|
+
8. If the user asks about previous implementations → call get_file_history or read_file_from_branch immediately.
|
|
362
|
+
|
|
363
|
+
Never respond with "I would need to check" or "Let me look at" — just call the tool.
|
|
364
|
+
Never summarize what a tool would do — call it and report the actual result.
|
|
365
|
+
|
|
366
|
+
### Available Tools
|
|
367
|
+
- read_file / read_file_lines / read_directory / get_directory_tree: navigate the repository
|
|
368
|
+
- get_file_outline / read_symbol: understand file structure without reading everything
|
|
369
|
+
- search_in_files: find where symbols are used
|
|
370
|
+
- list_branches: see all local and remote branches
|
|
371
|
+
- read_file_from_branch / compare_file_between_branches: compare implementations
|
|
372
|
+
- get_branch_diff / get_file_history / get_file_at_commit: understand evolution
|
|
373
|
+
- get_current_branch / get_recent_commits / get_pr_files / get_file_diff: PR context
|
|
374
|
+
- leave_pr_comment: post a general comment to the current PR (requires user approval)
|
|
375
|
+
- request_pr_changes: submit a REQUEST_CHANGES review on the current PR (requires user approval)
|
|
376
|
+
|
|
377
|
+
GitHub and workspace mutations are executed by the runtime and always require
|
|
378
|
+
user approval through a confirmation dialog. NEVER claim a mutation succeeded
|
|
379
|
+
until its tool result reports success. If the tool result says the action was
|
|
380
|
+
rejected or failed, say so honestly.
|
|
381
|
+
|
|
382
|
+
Prefer read-only investigation before proposing changes.
|
|
383
|
+
|
|
384
|
+
When reviewing code:
|
|
385
|
+
- identify concrete correctness, security, maintainability, or performance issues;
|
|
386
|
+
- distinguish confirmed issues from uncertain concerns;
|
|
387
|
+
- cite relevant files and lines when available;
|
|
388
|
+
- avoid unnecessary repository exploration.
|
|
389
|
+
|
|
390
|
+
## Codebase Overview (Project Manifest)
|
|
391
|
+
${projectOverview}
|
|
392
|
+
|
|
393
|
+
## Relevant Semantic Context
|
|
394
|
+
${context || 'No relevant semantic context found.'}${diffContext}${metaContext}`;
|
|
395
|
+
const contextManager = new AgentContextManager(systemPrompt, llmId, 128000, 2500, projectId.toString());
|
|
396
|
+
for (const message of history) {
|
|
397
|
+
contextManager.addRecent({ role: message.role, content: message.content });
|
|
398
|
+
}
|
|
399
|
+
contextManager.addRecent({ role: 'user', content: userMessage });
|
|
400
|
+
const executor = new ToolExecutor(runtimeTools, this.mainModule);
|
|
401
|
+
const toolContext = {
|
|
402
|
+
projectId,
|
|
403
|
+
sessionId: projectId.toString(),
|
|
404
|
+
conversation: history,
|
|
405
|
+
};
|
|
406
|
+
if (githubMeta) {
|
|
407
|
+
toolContext.githubMeta = githubMeta;
|
|
408
|
+
}
|
|
409
|
+
if (socketId) {
|
|
410
|
+
toolContext.socketId = socketId;
|
|
411
|
+
}
|
|
412
|
+
const maxToolTurns = 5;
|
|
413
|
+
for (let turn = 0; turn < maxToolTurns; turn++) {
|
|
414
|
+
if (contextManager.needsCompaction()) {
|
|
415
|
+
console.log('🗜️ [ChatAgent] Compacting context before completion');
|
|
416
|
+
await contextManager.compactWithLLM();
|
|
417
|
+
}
|
|
418
|
+
const run = completion({
|
|
419
|
+
modelId: llmId,
|
|
420
|
+
history: contextManager.buildHistory(),
|
|
421
|
+
tools: runtimeTools,
|
|
422
|
+
toolDialect: 'json',
|
|
423
|
+
stream: true,
|
|
424
|
+
captureThinking: true,
|
|
425
|
+
kvCache: projectId.toString(),
|
|
426
|
+
});
|
|
427
|
+
let streamedContent = '';
|
|
428
|
+
let thinkingOpen = false;
|
|
429
|
+
// QVAC already separates normal content, thinking, and tool calls.
|
|
430
|
+
// Never try to infer a tool call from whether a text chat starts with "{".
|
|
431
|
+
// Yield content deltas incrementally so the frontend can stream tokens
|
|
432
|
+
// to the user in real time instead of waiting for the full response.
|
|
433
|
+
//
|
|
434
|
+
// Thinking and content are wrapped in explicit markers so the frontend
|
|
435
|
+
// can separate reasoning (collapsed "Reasoning" panel) from the actual
|
|
436
|
+
// answer. Without these markers, raw thinking text mixed in with normal
|
|
437
|
+
// content corrupts markdown parsing (e.g. unclosed code fences pack
|
|
438
|
+
// the explanation and snippets into a single code block).
|
|
439
|
+
for await (const event of run.events) {
|
|
440
|
+
switch (event.type) {
|
|
441
|
+
case 'thinkingDelta': {
|
|
442
|
+
if (event.text) {
|
|
443
|
+
// Emit an opening marker before the first thinking chunk.
|
|
444
|
+
if (!thinkingOpen) {
|
|
445
|
+
thinkingOpen = true;
|
|
446
|
+
yield '<thinking>';
|
|
447
|
+
}
|
|
448
|
+
streamedContent += event.text;
|
|
449
|
+
yield event.text;
|
|
450
|
+
}
|
|
451
|
+
break;
|
|
452
|
+
}
|
|
453
|
+
case 'contentDelta': {
|
|
454
|
+
// Close the thinking section when real content begins.
|
|
455
|
+
if (thinkingOpen) {
|
|
456
|
+
thinkingOpen = false;
|
|
457
|
+
yield '</thinking>';
|
|
458
|
+
}
|
|
459
|
+
if (event.text) {
|
|
460
|
+
streamedContent += event.text;
|
|
461
|
+
yield event.text;
|
|
462
|
+
}
|
|
463
|
+
break;
|
|
464
|
+
}
|
|
465
|
+
case 'toolCall': {
|
|
466
|
+
console.log(`🧰 [ChatAgent] Tool requested: ${event.call?.name}`, event.call?.arguments);
|
|
467
|
+
break;
|
|
468
|
+
}
|
|
469
|
+
case 'toolError': {
|
|
470
|
+
// The model emitted a tool call the SDK couldn't parse natively
|
|
471
|
+
// (e.g. the <|tool_call|>call:name{} dialect). The fallback parser
|
|
472
|
+
// below recovers these, so this is informational, not fatal.
|
|
473
|
+
console.warn('⚠️ [ChatAgent] SDK tool parse issue, fallback parser will attempt:', event.error ?? event);
|
|
474
|
+
break;
|
|
475
|
+
}
|
|
476
|
+
case 'completionDone': {
|
|
477
|
+
break;
|
|
478
|
+
}
|
|
479
|
+
default:
|
|
480
|
+
break;
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
// If the stream ends while a thinking block is still open, close it.
|
|
484
|
+
if (thinkingOpen) {
|
|
485
|
+
thinkingOpen = false;
|
|
486
|
+
yield '</thinking>';
|
|
487
|
+
}
|
|
488
|
+
const result = await run.final;
|
|
489
|
+
// IMPORTANT: toolCalls may be exposed asynchronously. Always await it.
|
|
490
|
+
const structuredToolCalls = (await result.toolCalls) ?? [];
|
|
491
|
+
const rawText = result.cacheableAssistantContent ?? result.contentText ?? result.raw?.fullText ?? '';
|
|
492
|
+
// Check if the streamed/raw content is actually a JSON tool call the SDK
|
|
493
|
+
// didn't parse into structured toolCall events. Local models frequently
|
|
494
|
+
// emit tool calls as JSON text.
|
|
495
|
+
let toolCalls = structuredToolCalls;
|
|
496
|
+
let isFallback = false;
|
|
497
|
+
if (toolCalls.length === 0) {
|
|
498
|
+
const parsedFallback = parseFallbackToolCalls(rawText || streamedContent);
|
|
499
|
+
if (parsedFallback.length > 0) {
|
|
500
|
+
isFallback = true;
|
|
501
|
+
console.log(`🧰 [ChatAgent] Parsed ${parsedFallback.length} tool call(s) from raw text fallback`);
|
|
502
|
+
toolCalls = parsedFallback.map((call) => ({
|
|
503
|
+
name: call.name,
|
|
504
|
+
arguments: call.arguments,
|
|
505
|
+
}));
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
// No tool requested: the streamed content is the final answer.
|
|
509
|
+
// Content was already yielded incrementally above, so just return.
|
|
510
|
+
if (toolCalls.length === 0) {
|
|
511
|
+
return;
|
|
512
|
+
}
|
|
513
|
+
// This turn contains tool calls. Discard the preliminary prose and
|
|
514
|
+
// preserve the assistant's structured tool-call turn in history so the
|
|
515
|
+
// follow-up completion can reason from the tool results correctly.
|
|
516
|
+
// Strip raw <|tool_call|> markers from history so the model does NOT
|
|
517
|
+
// see (and re-emit) its own tool-call dialect on the next turn.
|
|
518
|
+
contextManager.addRecent({
|
|
519
|
+
role: 'assistant',
|
|
520
|
+
content: stripToolCallMarkers(rawText || streamedContent),
|
|
521
|
+
...(isFallback ? {} : { toolCalls }),
|
|
522
|
+
});
|
|
523
|
+
// Tools that mutate state or require user confirmation must run serially.
|
|
524
|
+
// Read-only tools can run in parallel for much faster multi-tool turns.
|
|
525
|
+
//
|
|
526
|
+
// Use resolveToolName to map hallucinated aliases (e.g.
|
|
527
|
+
// "anonymous.submitPRReview") to the real registered tool name so
|
|
528
|
+
// mutation calls always go through the confirmation-gated serial path.
|
|
529
|
+
const mutationTools = new Set(runtimeTools.filter((tool) => (tool.effect ?? 'read') !== 'read').map((tool) => tool.name));
|
|
530
|
+
// Resolve alias names before classifying parallel vs serial calls.
|
|
531
|
+
const resolvedCalls = toolCalls.map((tc) => ({
|
|
532
|
+
...tc,
|
|
533
|
+
name: resolveToolName(tc.name),
|
|
534
|
+
}));
|
|
535
|
+
const parallelCalls = resolvedCalls.filter((tc) => !mutationTools.has(tc.name));
|
|
536
|
+
const serialCalls = resolvedCalls.filter((tc) => mutationTools.has(tc.name));
|
|
537
|
+
// Execute read-only tools in parallel
|
|
538
|
+
const parallelResults = await Promise.all(parallelCalls.map(async (toolCall) => ({
|
|
539
|
+
toolCall,
|
|
540
|
+
result: await executor.execute(toolCall, toolContext),
|
|
541
|
+
})));
|
|
542
|
+
// Add parallel results to context
|
|
543
|
+
for (const { toolCall, result } of parallelResults) {
|
|
544
|
+
const estimatedTokens = contextManager.estimateTokens(result);
|
|
545
|
+
if (contextManager.needsCompaction(estimatedTokens)) {
|
|
546
|
+
console.log('🗝️ [ChatAgent] Compacting context after tool result');
|
|
547
|
+
await contextManager.compactWithLLM();
|
|
548
|
+
}
|
|
549
|
+
contextManager.addRecent({
|
|
550
|
+
role: isFallback ? 'user' : 'tool',
|
|
551
|
+
...(isFallback ? {} : { toolCallId: toolCall.id }),
|
|
552
|
+
content: isFallback
|
|
553
|
+
? `[Tool Result for ${toolCall.name}]:\n\n${serializeToolResult(result)}`
|
|
554
|
+
: serializeToolResult(result),
|
|
555
|
+
});
|
|
556
|
+
}
|
|
557
|
+
// Execute mutation tools serially (they may require confirmation)
|
|
558
|
+
for (const toolCall of serialCalls) {
|
|
559
|
+
const result = await executor.execute(toolCall, toolContext);
|
|
560
|
+
const estimatedTokens = contextManager.estimateTokens(result);
|
|
561
|
+
if (contextManager.needsCompaction(estimatedTokens)) {
|
|
562
|
+
console.log('🗝️ [ChatAgent] Compacting context after tool result');
|
|
563
|
+
await contextManager.compactWithLLM();
|
|
564
|
+
}
|
|
565
|
+
contextManager.addRecent({
|
|
566
|
+
role: isFallback ? 'user' : 'tool',
|
|
567
|
+
...(isFallback ? {} : { toolCallId: toolCall.id }),
|
|
568
|
+
content: isFallback
|
|
569
|
+
? `[Tool Result for ${toolCall.name}]:\n\n${serializeToolResult(result)}`
|
|
570
|
+
: serializeToolResult(result),
|
|
571
|
+
});
|
|
572
|
+
}
|
|
573
|
+
// Loop again. The next completion sees the tool result and produces the
|
|
574
|
+
// final user-facing response.
|
|
575
|
+
}
|
|
576
|
+
yield '\n\nI reached the maximum number of tool turns before the request completed.';
|
|
577
|
+
}
|
|
578
|
+
/**
|
|
579
|
+
* Single-turn helper. The caller is responsible for preserving history.
|
|
580
|
+
*/
|
|
581
|
+
async chat(projectId, history, userMessage, prDiff, githubMeta, socketId) {
|
|
582
|
+
const stream = this.chatStream(projectId, history, userMessage, prDiff, githubMeta, socketId);
|
|
583
|
+
let full = '';
|
|
584
|
+
for await (const chunk of stream) {
|
|
585
|
+
full += chunk;
|
|
586
|
+
}
|
|
587
|
+
return full;
|
|
588
|
+
}
|
|
589
|
+
}
|
|
590
|
+
//# sourceMappingURL=chat.agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat.agent.js","sourceRoot":"","sources":["../../../src/modules/ai-agent/chat.agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { MainModule } from '../main.module.js';
|
|
2
|
+
export declare class CodeBaseIndexerAgent {
|
|
3
|
+
mainModule: MainModule;
|
|
4
|
+
/**
|
|
5
|
+
* Active indexing jobs keyed by project id.
|
|
6
|
+
*/
|
|
7
|
+
private indexingControllers;
|
|
8
|
+
constructor(mainModule: MainModule);
|
|
9
|
+
cancelIndexing(projectId: string): boolean;
|
|
10
|
+
analyzeAndIndexProject(projectId: string): Promise<void>;
|
|
11
|
+
private initializeProject;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=code-base-indexer.agent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-base-indexer.agent.d.ts","sourceRoot":"","sources":["../../../src/modules/ai-agent/code-base-indexer.agent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AA0EpD,qBAAa,oBAAoB;IAC/B,UAAU,EAAE,UAAU,CAAC;IAEvB;;OAEG;IACH,OAAO,CAAC,mBAAmB,CAAsC;gBAErD,UAAU,EAAE,UAAU;IAIlC,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAYpC,sBAAsB,CAAC,SAAS,EAAE,MAAM;YA4kBhC,iBAAiB;CAwChC"}
|