@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,199 @@
|
|
|
1
|
+
import crypto from 'crypto';
|
|
2
|
+
export function normalizeToolArguments(value) {
|
|
3
|
+
if (!value)
|
|
4
|
+
return {};
|
|
5
|
+
if (typeof value === 'object')
|
|
6
|
+
return value;
|
|
7
|
+
if (typeof value === 'string') {
|
|
8
|
+
try {
|
|
9
|
+
const parsed = JSON.parse(value);
|
|
10
|
+
return typeof parsed === 'object' && parsed !== null
|
|
11
|
+
? parsed
|
|
12
|
+
: {};
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
return {};
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return {};
|
|
19
|
+
}
|
|
20
|
+
export function serializeToolResult(result) {
|
|
21
|
+
if (typeof result === 'string')
|
|
22
|
+
return result;
|
|
23
|
+
try {
|
|
24
|
+
return JSON.stringify(result);
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return String(result);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Validates that no duplicate tool names reach inference. Duplicate names
|
|
32
|
+
* cause silent, non-deterministic execution because the first match wins.
|
|
33
|
+
*/
|
|
34
|
+
export function validateTools(tools) {
|
|
35
|
+
const seen = new Set();
|
|
36
|
+
for (const tool of tools) {
|
|
37
|
+
if (seen.has(tool.name)) {
|
|
38
|
+
throw new Error(`Duplicate tool registration: ${tool.name}`);
|
|
39
|
+
}
|
|
40
|
+
seen.add(tool.name);
|
|
41
|
+
}
|
|
42
|
+
return tools;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Maps model-hallucinated or aliased tool names to the actual registered
|
|
46
|
+
* runtime tool. Local models frequently emit names like
|
|
47
|
+
* `anonymous.submitPRReview` from a remembered tool dictionary instead of
|
|
48
|
+
* the exact registered name `leave_pr_comment`. Without this mapping the
|
|
49
|
+
* call is rejected BEFORE confirmation is requested, so the user never
|
|
50
|
+
* sees a confirmation dialog and the model may still claim success.
|
|
51
|
+
*/
|
|
52
|
+
const TOOL_ALIASES = {
|
|
53
|
+
'anonymous.submitPRReview': 'leave_pr_comment',
|
|
54
|
+
submitPRReview: 'leave_pr_comment',
|
|
55
|
+
submit_review: 'leave_pr_comment',
|
|
56
|
+
submite_review: 'leave_pr_comment',
|
|
57
|
+
postComment: 'leave_pr_comment',
|
|
58
|
+
post_comment: 'leave_pr_comment',
|
|
59
|
+
leaveComment: 'leave_pr_comment',
|
|
60
|
+
leave_comment: 'leave_pr_comment',
|
|
61
|
+
postPRComment: 'leave_pr_comment',
|
|
62
|
+
post_pr_comment: 'leave_pr_comment',
|
|
63
|
+
submitComment: 'leave_pr_comment',
|
|
64
|
+
submit_comment: 'leave_pr_comment',
|
|
65
|
+
requestChanges: 'request_pr_changes',
|
|
66
|
+
request_changes: 'request_pr_changes',
|
|
67
|
+
requestPRChanges: 'request_pr_changes',
|
|
68
|
+
request_pr_changes_review: 'request_pr_changes',
|
|
69
|
+
};
|
|
70
|
+
/**
|
|
71
|
+
* Resolves a model-emitted tool name (which may be an alias or hallucination)
|
|
72
|
+
* to the actual registered runtime tool name.
|
|
73
|
+
*/
|
|
74
|
+
export function resolveToolName(name) {
|
|
75
|
+
return TOOL_ALIASES[name] ?? name;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Centralizes tool execution. The LLM proposes an action; the runtime decides
|
|
79
|
+
* whether it is allowed to execute it.
|
|
80
|
+
*
|
|
81
|
+
* validate args → determine effect → build preview → ask confirmation if
|
|
82
|
+
* required → execute → record audit event
|
|
83
|
+
*/
|
|
84
|
+
export class ToolExecutor {
|
|
85
|
+
mainModule;
|
|
86
|
+
tools = new Map();
|
|
87
|
+
constructor(tools, mainModule) {
|
|
88
|
+
this.mainModule = mainModule;
|
|
89
|
+
validateTools(tools);
|
|
90
|
+
for (const tool of tools) {
|
|
91
|
+
this.tools.set(tool.name, tool);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
getTool(name) {
|
|
95
|
+
// Resolve aliases / hallucinated names to the real registered tool.
|
|
96
|
+
const resolvedName = resolveToolName(name);
|
|
97
|
+
return this.tools.get(resolvedName);
|
|
98
|
+
}
|
|
99
|
+
hasTool(name) {
|
|
100
|
+
return this.getTool(name) !== undefined;
|
|
101
|
+
}
|
|
102
|
+
get names() {
|
|
103
|
+
return Array.from(this.tools.keys());
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Execute a single tool call. Mutation tools (effect !== 'read') that
|
|
107
|
+
* declare confirmation.required will be gated behind a structured
|
|
108
|
+
* confirmation request bound to the initiating socket.
|
|
109
|
+
*/
|
|
110
|
+
async execute(toolCall, context) {
|
|
111
|
+
const originalName = toolCall.name;
|
|
112
|
+
const resolvedName = resolveToolName(originalName);
|
|
113
|
+
const tool = this.tools.get(resolvedName);
|
|
114
|
+
if (!tool) {
|
|
115
|
+
return {
|
|
116
|
+
error: `Unknown tool: ${originalName}. Available tools: ${this.names.join(', ')}. Try again with the exact tool name.`,
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
// Use the resolved name for downstream logic (effect, confirmation, etc.).
|
|
120
|
+
if (resolvedName !== originalName) {
|
|
121
|
+
console.log(`🧭 [ToolExecutor] Resolved tool alias "${originalName}" → "${resolvedName}"`);
|
|
122
|
+
toolCall.name = resolvedName;
|
|
123
|
+
}
|
|
124
|
+
console.log(`🤖 [ToolExecutor] Executing tool: ${toolCall.name}`, toolCall.arguments);
|
|
125
|
+
// Validate arguments against the tool schema.
|
|
126
|
+
const rawArgs = normalizeToolArguments(toolCall.arguments ?? toolCall.args);
|
|
127
|
+
const parsedArgs = tool.parameters.safeParse(rawArgs);
|
|
128
|
+
if (!parsedArgs.success) {
|
|
129
|
+
return {
|
|
130
|
+
error: `Invalid arguments for ${toolCall.name}`,
|
|
131
|
+
details: parsedArgs.error.flatten(),
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
// Mutation tools require user authorization before execution.
|
|
135
|
+
// Tools without an explicit effect default to read-only.
|
|
136
|
+
const effect = tool.effect ?? 'read';
|
|
137
|
+
if (effect !== 'read' && tool.confirmation?.required) {
|
|
138
|
+
const approved = await this.requestConfirmation(tool, parsedArgs.data, context);
|
|
139
|
+
if (!approved) {
|
|
140
|
+
return {
|
|
141
|
+
error: `The user declined the ${toolCall.name} action. The action was NOT executed. Do not claim it succeeded.`,
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
try {
|
|
146
|
+
// Preferred QVAC path. A structured tool call whose definition had a
|
|
147
|
+
// handler exposes invoke(), which forwards the parsed arguments.
|
|
148
|
+
if (typeof toolCall.invoke === 'function') {
|
|
149
|
+
return await toolCall.invoke();
|
|
150
|
+
}
|
|
151
|
+
if (!tool.handler) {
|
|
152
|
+
return { error: `Tool ${toolCall.name} does not have a handler.` };
|
|
153
|
+
}
|
|
154
|
+
return await tool.handler(parsedArgs.data, context);
|
|
155
|
+
}
|
|
156
|
+
catch (error) {
|
|
157
|
+
return { error: error?.message ?? String(error) };
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
async requestConfirmation(tool, args, context) {
|
|
161
|
+
if (!context.socketId) {
|
|
162
|
+
console.warn(`[ToolExecutor] No socketId available for confirmation of ${tool.name}; denying by default.`);
|
|
163
|
+
return false;
|
|
164
|
+
}
|
|
165
|
+
const preview = tool.confirmation?.buildPreview?.(args, context);
|
|
166
|
+
const action = {
|
|
167
|
+
type: tool.name,
|
|
168
|
+
title: preview?.title ?? `Execute ${tool.name}`,
|
|
169
|
+
};
|
|
170
|
+
if (preview?.description) {
|
|
171
|
+
action.description = preview.description;
|
|
172
|
+
}
|
|
173
|
+
const confirmation = {
|
|
174
|
+
sessionId: context.sessionId,
|
|
175
|
+
toolCallId: crypto.randomUUID(),
|
|
176
|
+
action,
|
|
177
|
+
tool: {
|
|
178
|
+
name: tool.name,
|
|
179
|
+
arguments: args,
|
|
180
|
+
},
|
|
181
|
+
};
|
|
182
|
+
if (context.githubMeta) {
|
|
183
|
+
confirmation.target = {
|
|
184
|
+
provider: 'github',
|
|
185
|
+
owner: context.githubMeta.owner,
|
|
186
|
+
repo: context.githubMeta.repo,
|
|
187
|
+
pullNumber: context.githubMeta.pull_number,
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
if (preview?.request) {
|
|
191
|
+
confirmation.request = preview.request;
|
|
192
|
+
}
|
|
193
|
+
if (context.conversation) {
|
|
194
|
+
confirmation.conversation = { messages: context.conversation };
|
|
195
|
+
}
|
|
196
|
+
return this.mainModule.socket.requestConfirmation(context.socketId, confirmation);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
//# sourceMappingURL=tool-executor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-executor.js","sourceRoot":"","sources":["../../../src/modules/ai-agent/tool-executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export type ToolEffect = 'read' | 'write' | 'destructive';
|
|
3
|
+
export interface ConfirmationPreview {
|
|
4
|
+
title: string;
|
|
5
|
+
description?: string;
|
|
6
|
+
request?: {
|
|
7
|
+
method: string;
|
|
8
|
+
endpoint?: string;
|
|
9
|
+
payload: unknown;
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
export interface AgentConfirmationRequest {
|
|
13
|
+
sessionId: string;
|
|
14
|
+
toolCallId: string;
|
|
15
|
+
action: {
|
|
16
|
+
type: string;
|
|
17
|
+
title: string;
|
|
18
|
+
description?: string;
|
|
19
|
+
};
|
|
20
|
+
tool: {
|
|
21
|
+
name: string;
|
|
22
|
+
arguments: Record<string, unknown>;
|
|
23
|
+
};
|
|
24
|
+
target?: {
|
|
25
|
+
provider: 'github';
|
|
26
|
+
owner: string;
|
|
27
|
+
repo: string;
|
|
28
|
+
pullNumber?: number;
|
|
29
|
+
};
|
|
30
|
+
request?: {
|
|
31
|
+
method: string;
|
|
32
|
+
endpoint?: string;
|
|
33
|
+
payload: unknown;
|
|
34
|
+
};
|
|
35
|
+
conversation?: {
|
|
36
|
+
messages: Array<{
|
|
37
|
+
role: string;
|
|
38
|
+
content: string;
|
|
39
|
+
}>;
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
export type GitHubMeta = {
|
|
43
|
+
owner: string;
|
|
44
|
+
repo: string;
|
|
45
|
+
pull_number: number;
|
|
46
|
+
creator?: string;
|
|
47
|
+
additions?: number;
|
|
48
|
+
deletions?: number;
|
|
49
|
+
changed_files?: number;
|
|
50
|
+
};
|
|
51
|
+
export interface ToolContext {
|
|
52
|
+
githubMeta?: GitHubMeta;
|
|
53
|
+
projectId: string;
|
|
54
|
+
socketId?: string;
|
|
55
|
+
sessionId: string;
|
|
56
|
+
conversation?: Array<{
|
|
57
|
+
role: string;
|
|
58
|
+
content: string;
|
|
59
|
+
}>;
|
|
60
|
+
}
|
|
61
|
+
export interface RuntimeTool {
|
|
62
|
+
name: string;
|
|
63
|
+
description: string;
|
|
64
|
+
parameters: z.ZodTypeAny;
|
|
65
|
+
effect?: ToolEffect;
|
|
66
|
+
confirmation?: {
|
|
67
|
+
required: boolean;
|
|
68
|
+
buildPreview?: (args: Record<string, unknown>, context: ToolContext) => ConfirmationPreview;
|
|
69
|
+
};
|
|
70
|
+
handler?: (args: any, context: ToolContext) => Promise<any> | any;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=tool-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-types.d.ts","sourceRoot":"","sources":["../../../src/modules/ai-agent/tool-types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,OAAO,GAAG,aAAa,CAAC;AAE1D,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE;QACR,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,OAAO,CAAC;KAClB,CAAC;CACH;AAED,MAAM,WAAW,wBAAwB;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,IAAI,EAAE;QACJ,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACpC,CAAC;IACF,MAAM,CAAC,EAAE;QACP,QAAQ,EAAE,QAAQ,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,OAAO,CAAC,EAAE;QACR,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,OAAO,CAAC;KAClB,CAAC;IACF,YAAY,CAAC,EAAE;QACb,QAAQ,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KACpD,CAAC;CACH;AAED,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,WAAW,WAAW;IAC1B,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACzD;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,CAAC,CAAC,UAAU,CAAC;IACzB,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,YAAY,CAAC,EAAE;QACb,QAAQ,EAAE,OAAO,CAAC;QAClB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,WAAW,KAAK,mBAAmB,CAAC;KAC7F,CAAC;IACF,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,WAAW,KAAK,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;CACnE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-types.js","sourceRoot":"","sources":["../../../src/modules/ai-agent/tool-types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare function createFsTools(projectRootPath: string): ({
|
|
3
|
+
name: string;
|
|
4
|
+
description: string;
|
|
5
|
+
parameters: z.ZodObject<{
|
|
6
|
+
filePath: z.ZodString;
|
|
7
|
+
}, z.core.$strip>;
|
|
8
|
+
handler: ({ filePath }: {
|
|
9
|
+
filePath: string;
|
|
10
|
+
}) => Promise<string>;
|
|
11
|
+
} | {
|
|
12
|
+
name: string;
|
|
13
|
+
description: string;
|
|
14
|
+
parameters: z.ZodObject<{
|
|
15
|
+
filePath: z.ZodString;
|
|
16
|
+
startLine: z.ZodNumber;
|
|
17
|
+
endLine: z.ZodOptional<z.ZodNumber>;
|
|
18
|
+
}, z.core.$strip>;
|
|
19
|
+
handler: ({ filePath, startLine, endLine, }: {
|
|
20
|
+
filePath: string;
|
|
21
|
+
startLine: number;
|
|
22
|
+
endLine?: number;
|
|
23
|
+
}) => Promise<string>;
|
|
24
|
+
} | {
|
|
25
|
+
name: string;
|
|
26
|
+
description: string;
|
|
27
|
+
parameters: z.ZodObject<{
|
|
28
|
+
dirPath: z.ZodString;
|
|
29
|
+
}, z.core.$strip>;
|
|
30
|
+
handler: ({ dirPath }: {
|
|
31
|
+
dirPath: string;
|
|
32
|
+
}) => Promise<string>;
|
|
33
|
+
} | {
|
|
34
|
+
name: string;
|
|
35
|
+
description: string;
|
|
36
|
+
parameters: z.ZodObject<{
|
|
37
|
+
maxDepth: z.ZodOptional<z.ZodNumber>;
|
|
38
|
+
}, z.core.$strip>;
|
|
39
|
+
handler: ({ maxDepth }: {
|
|
40
|
+
maxDepth?: number;
|
|
41
|
+
}) => Promise<string>;
|
|
42
|
+
} | {
|
|
43
|
+
name: string;
|
|
44
|
+
description: string;
|
|
45
|
+
parameters: z.ZodObject<{
|
|
46
|
+
filePath: z.ZodString;
|
|
47
|
+
symbolName: z.ZodString;
|
|
48
|
+
}, z.core.$strip>;
|
|
49
|
+
handler: ({ filePath, symbolName }: {
|
|
50
|
+
filePath: string;
|
|
51
|
+
symbolName: string;
|
|
52
|
+
}) => Promise<any>;
|
|
53
|
+
})[];
|
|
54
|
+
//# sourceMappingURL=fs-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fs-tools.d.ts","sourceRoot":"","sources":["../../../../src/modules/ai-agent/tools/fs-tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,wBAAgB,aAAa,CAAC,eAAe,EAAE,MAAM;;;;;;4BAoBnB;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE;;;;;;;;;iDAsD/C;QACD,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB;;;;;;;2BAwC4B;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE;;;;;;;4BA8Bd;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE;;;;;;;;wCAsFb;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE;KAyBrF"}
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import * as fs from 'fs/promises';
|
|
3
|
+
import * as path from 'path';
|
|
4
|
+
import { extractSymbolsWithAST } from '../ai-agent.utils.js';
|
|
5
|
+
export function createFsTools(projectRootPath) {
|
|
6
|
+
const absoluteRoot = path.resolve(projectRootPath);
|
|
7
|
+
const safeResolve = (relativePath) => {
|
|
8
|
+
const resolvedPath = path.resolve(absoluteRoot, relativePath);
|
|
9
|
+
if (!resolvedPath.startsWith(absoluteRoot)) {
|
|
10
|
+
throw new Error(`Access denied: Path "${relativePath}" is outside the repository directory.`);
|
|
11
|
+
}
|
|
12
|
+
return resolvedPath;
|
|
13
|
+
};
|
|
14
|
+
const readFileTool = {
|
|
15
|
+
name: 'read_file',
|
|
16
|
+
description: 'Read the contents of a specific file in the repository. Input should be a relative path from the project root. Files up to 80KB are read in full; larger files are truncated to the first 80KB.',
|
|
17
|
+
parameters: z.object({
|
|
18
|
+
filePath: z
|
|
19
|
+
.string()
|
|
20
|
+
.describe('The relative path of the file to read (e.g., "package.json" or "src/index.ts")'),
|
|
21
|
+
}),
|
|
22
|
+
handler: async ({ filePath }) => {
|
|
23
|
+
console.log(`[Tool Execution] read_file`, { filePath });
|
|
24
|
+
try {
|
|
25
|
+
const resolved = safeResolve(filePath);
|
|
26
|
+
const stat = await fs.stat(resolved);
|
|
27
|
+
if (!stat.isFile()) {
|
|
28
|
+
return `Error: "${filePath}" is not a file.`;
|
|
29
|
+
}
|
|
30
|
+
const sizeLimit = 80 * 1024; // 80KB
|
|
31
|
+
if (stat.size > sizeLimit) {
|
|
32
|
+
const fd = await fs.open(resolved, 'r');
|
|
33
|
+
try {
|
|
34
|
+
const buffer = Buffer.alloc(sizeLimit);
|
|
35
|
+
const { bytesRead } = await fd.read(buffer, 0, buffer.length, 0);
|
|
36
|
+
return `${buffer.subarray(0, bytesRead).toString('utf-8')}\n\n[File truncated: ${(stat.size / 1024).toFixed(1)} KB total. Use read_file_lines to read specific line ranges.]`;
|
|
37
|
+
}
|
|
38
|
+
finally {
|
|
39
|
+
await fd.close();
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
const content = await fs.readFile(resolved, 'utf-8');
|
|
43
|
+
return content;
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
console.error(error);
|
|
47
|
+
return `Error reading file: ${error.message}`;
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
const readFileLinesTool = {
|
|
52
|
+
name: 'read_file_lines',
|
|
53
|
+
description: 'Read a specific range of lines from a file in the repository. Useful for reading large files in chunks or focusing on a specific section without loading the entire file.',
|
|
54
|
+
parameters: z.object({
|
|
55
|
+
filePath: z.string().describe('The relative path of the file to read (e.g., "src/index.ts")'),
|
|
56
|
+
startLine: z
|
|
57
|
+
.number()
|
|
58
|
+
.int()
|
|
59
|
+
.positive()
|
|
60
|
+
.describe('The 1-based line number to start reading from (inclusive).'),
|
|
61
|
+
endLine: z
|
|
62
|
+
.number()
|
|
63
|
+
.int()
|
|
64
|
+
.positive()
|
|
65
|
+
.optional()
|
|
66
|
+
.describe('The 1-based line number to stop reading at (inclusive). Defaults to startLine + 100.'),
|
|
67
|
+
}),
|
|
68
|
+
handler: async ({ filePath, startLine, endLine, }) => {
|
|
69
|
+
console.log(`[Tool Execution] read_file_lines`, { filePath, startLine, endLine });
|
|
70
|
+
try {
|
|
71
|
+
const resolved = safeResolve(filePath);
|
|
72
|
+
const stat = await fs.stat(resolved);
|
|
73
|
+
if (!stat.isFile()) {
|
|
74
|
+
return `Error: "${filePath}" is not a file.`;
|
|
75
|
+
}
|
|
76
|
+
const content = await fs.readFile(resolved, 'utf-8');
|
|
77
|
+
const lines = content.split('\n');
|
|
78
|
+
const end = endLine ?? Math.min(startLine + 99, lines.length);
|
|
79
|
+
const start = Math.max(1, startLine);
|
|
80
|
+
if (start > lines.length) {
|
|
81
|
+
return `Error: File "${filePath}" has only ${lines.length} lines.`;
|
|
82
|
+
}
|
|
83
|
+
const slice = lines.slice(start - 1, end);
|
|
84
|
+
const numbered = slice.map((line, i) => `${start + i}\t${line}`).join('\n');
|
|
85
|
+
const totalLines = lines.length;
|
|
86
|
+
return `Lines ${start}-${Math.min(end, totalLines)} of ${totalLines} in ${filePath}:\n\n${numbered}`;
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
return `Error reading file lines: ${error.message}`;
|
|
90
|
+
}
|
|
91
|
+
},
|
|
92
|
+
};
|
|
93
|
+
const readDirectoryTool = {
|
|
94
|
+
name: 'read_directory',
|
|
95
|
+
description: 'List the immediate contents of a directory in the repository. Input should be a relative path from the project root.',
|
|
96
|
+
parameters: z.object({
|
|
97
|
+
dirPath: z
|
|
98
|
+
.string()
|
|
99
|
+
.describe('The relative path of the directory to list (e.g., "." for project root, or "src")'),
|
|
100
|
+
}),
|
|
101
|
+
handler: async ({ dirPath }) => {
|
|
102
|
+
console.log(`[Tool Execution] read_directory`, { dirPath });
|
|
103
|
+
try {
|
|
104
|
+
const resolved = safeResolve(dirPath);
|
|
105
|
+
const stat = await fs.stat(resolved);
|
|
106
|
+
if (!stat.isDirectory()) {
|
|
107
|
+
return `Error: "${dirPath}" is not a directory.`;
|
|
108
|
+
}
|
|
109
|
+
const entries = await fs.readdir(resolved, { withFileTypes: true });
|
|
110
|
+
const items = entries.map((entry) => {
|
|
111
|
+
const type = entry.isDirectory() ? 'directory' : 'file';
|
|
112
|
+
return `${entry.name} (${type})`;
|
|
113
|
+
});
|
|
114
|
+
return items.length > 0 ? items.join('\n') : 'Empty directory';
|
|
115
|
+
}
|
|
116
|
+
catch (error) {
|
|
117
|
+
return `Error reading directory: ${error.message}`;
|
|
118
|
+
}
|
|
119
|
+
},
|
|
120
|
+
};
|
|
121
|
+
const getDirectoryTreeTool = {
|
|
122
|
+
name: 'get_directory_tree',
|
|
123
|
+
description: 'Get a visual recursive tree representation of the project folder structure up to a specified depth (default 3), ignoring node_modules, .git, dist, etc.',
|
|
124
|
+
parameters: z.object({
|
|
125
|
+
maxDepth: z
|
|
126
|
+
.number()
|
|
127
|
+
.optional()
|
|
128
|
+
.describe('Maximum depth of recursion (default is 3, maximum allowed is 5)'),
|
|
129
|
+
}),
|
|
130
|
+
handler: async ({ maxDepth = 3 }) => {
|
|
131
|
+
console.log(`[Tool Execution] get_directory_tree`, { maxDepth });
|
|
132
|
+
try {
|
|
133
|
+
const buildTree = async (currentPath, currentDepth) => {
|
|
134
|
+
if (currentDepth > maxDepth)
|
|
135
|
+
return '';
|
|
136
|
+
const resolved = safeResolve(path.join(absoluteRoot, currentPath));
|
|
137
|
+
const entries = await fs.readdir(resolved, { withFileTypes: true });
|
|
138
|
+
let result = '';
|
|
139
|
+
const indent = ' '.repeat(currentDepth);
|
|
140
|
+
const ignoredDirs = [
|
|
141
|
+
'node_modules',
|
|
142
|
+
'.git',
|
|
143
|
+
'dist',
|
|
144
|
+
'.pnpm',
|
|
145
|
+
'build',
|
|
146
|
+
'.next',
|
|
147
|
+
'.cache',
|
|
148
|
+
'pnpm-lock.yaml',
|
|
149
|
+
'package-lock.json',
|
|
150
|
+
'.DS_Store',
|
|
151
|
+
];
|
|
152
|
+
for (const entry of entries) {
|
|
153
|
+
if (ignoredDirs.includes(entry.name))
|
|
154
|
+
continue;
|
|
155
|
+
const relativeEntryPath = currentPath === '.' ? entry.name : path.join(currentPath, entry.name);
|
|
156
|
+
if (entry.isDirectory()) {
|
|
157
|
+
result += `${indent}📁 ${entry.name}/\n`;
|
|
158
|
+
const subTree = await buildTree(relativeEntryPath, currentDepth + 1);
|
|
159
|
+
result += subTree;
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
result += `${indent}📄 ${entry.name}\n`;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
return result;
|
|
166
|
+
};
|
|
167
|
+
const tree = await buildTree('.', 0);
|
|
168
|
+
return tree || 'Empty directory';
|
|
169
|
+
}
|
|
170
|
+
catch (error) {
|
|
171
|
+
return `Error building directory tree: ${error.message}`;
|
|
172
|
+
}
|
|
173
|
+
},
|
|
174
|
+
};
|
|
175
|
+
const getFileOutlineTool = {
|
|
176
|
+
name: 'get_file_outline',
|
|
177
|
+
description: 'Get an outline of the classes, functions, and symbols in a file to save context window.',
|
|
178
|
+
parameters: z.object({
|
|
179
|
+
filePath: z.string().describe('The relative path of the file to outline'),
|
|
180
|
+
}),
|
|
181
|
+
handler: async ({ filePath }) => {
|
|
182
|
+
console.log(`[Tool Execution] get_file_outline`, { filePath });
|
|
183
|
+
try {
|
|
184
|
+
const resolved = safeResolve(filePath);
|
|
185
|
+
const stat = await fs.stat(resolved);
|
|
186
|
+
if (!stat.isFile())
|
|
187
|
+
return `Error: "${filePath}" is not a file.`;
|
|
188
|
+
const text = await fs.readFile(resolved, 'utf-8');
|
|
189
|
+
const symbols = await extractSymbolsWithAST(resolved, text);
|
|
190
|
+
if (symbols.length === 0)
|
|
191
|
+
return `No AST symbols extracted (perhaps unsupported language). Use read_file.`;
|
|
192
|
+
const outline = symbols
|
|
193
|
+
.map((s) => `- ${s.symbol.kind} ${s.symbol.name} (lines ${s.symbol.startLine}-${s.symbol.endLine})`)
|
|
194
|
+
.join('\n');
|
|
195
|
+
return outline || 'File has no identifiable symbols.';
|
|
196
|
+
}
|
|
197
|
+
catch (err) {
|
|
198
|
+
return `Error: ${err.message}`;
|
|
199
|
+
}
|
|
200
|
+
},
|
|
201
|
+
};
|
|
202
|
+
const readSymbolTool = {
|
|
203
|
+
name: 'read_symbol',
|
|
204
|
+
description: 'Read the exact source code for a specific symbol (e.g. function or class name) in a file.',
|
|
205
|
+
parameters: z.object({
|
|
206
|
+
filePath: z.string().describe('The relative path of the file'),
|
|
207
|
+
symbolName: z.string().describe('The exact name of the symbol to extract'),
|
|
208
|
+
}),
|
|
209
|
+
handler: async ({ filePath, symbolName }) => {
|
|
210
|
+
console.log(`[Tool Execution] read_symbol`, { filePath, symbolName });
|
|
211
|
+
try {
|
|
212
|
+
const resolved = safeResolve(filePath);
|
|
213
|
+
const stat = await fs.stat(resolved);
|
|
214
|
+
if (!stat.isFile())
|
|
215
|
+
return `Error: "${filePath}" is not a file.`;
|
|
216
|
+
const text = await fs.readFile(resolved, 'utf-8');
|
|
217
|
+
const symbols = await extractSymbolsWithAST(resolved, text);
|
|
218
|
+
const symbol = symbols.find((s) => s.symbol.name === symbolName);
|
|
219
|
+
if (!symbol)
|
|
220
|
+
return `Symbol "${symbolName}" not found in ${filePath}.`;
|
|
221
|
+
return symbol.content;
|
|
222
|
+
}
|
|
223
|
+
catch (err) {
|
|
224
|
+
return `Error: ${err.message}`;
|
|
225
|
+
}
|
|
226
|
+
},
|
|
227
|
+
};
|
|
228
|
+
return [
|
|
229
|
+
readFileTool,
|
|
230
|
+
readFileLinesTool,
|
|
231
|
+
readDirectoryTool,
|
|
232
|
+
getDirectoryTreeTool,
|
|
233
|
+
getFileOutlineTool,
|
|
234
|
+
readSymbolTool,
|
|
235
|
+
];
|
|
236
|
+
}
|
|
237
|
+
//# sourceMappingURL=fs-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fs-tools.js","sourceRoot":"","sources":["../../../../src/modules/ai-agent/tools/fs-tools.ts"],"names":[],"mappings":"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"}
|