@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,232 @@
|
|
|
1
|
+
import crypto from 'crypto';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
/**
|
|
4
|
+
* Builds a structured AgentConfirmationRequest from a preview and sends it to
|
|
5
|
+
* the initiating socket, waiting for the user's reply. Returns true if the user
|
|
6
|
+
* approved, false if they rejected or the request timed out.
|
|
7
|
+
*/
|
|
8
|
+
async function requestToolConfirmation(mainModule, context, preview, toolName, args) {
|
|
9
|
+
if (!context.socketId) {
|
|
10
|
+
console.warn(`[pr-chat-tools] No socketId available for confirmation of ${toolName}; denying by default.`);
|
|
11
|
+
return false;
|
|
12
|
+
}
|
|
13
|
+
const action = {
|
|
14
|
+
type: toolName,
|
|
15
|
+
title: preview?.title ?? `Execute ${toolName}`,
|
|
16
|
+
};
|
|
17
|
+
if (preview?.description) {
|
|
18
|
+
action.description = preview.description;
|
|
19
|
+
}
|
|
20
|
+
const confirmation = {
|
|
21
|
+
sessionId: context.sessionId,
|
|
22
|
+
toolCallId: crypto.randomUUID(),
|
|
23
|
+
action,
|
|
24
|
+
tool: {
|
|
25
|
+
name: toolName,
|
|
26
|
+
arguments: args,
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
if (context.githubMeta) {
|
|
30
|
+
confirmation.target = {
|
|
31
|
+
provider: 'github',
|
|
32
|
+
owner: context.githubMeta.owner,
|
|
33
|
+
repo: context.githubMeta.repo,
|
|
34
|
+
pullNumber: context.githubMeta.pull_number,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
if (preview?.request) {
|
|
38
|
+
confirmation.request = preview.request;
|
|
39
|
+
}
|
|
40
|
+
if (context.conversation) {
|
|
41
|
+
confirmation.conversation = { messages: context.conversation };
|
|
42
|
+
}
|
|
43
|
+
return mainModule.socket.requestToolConfirmation(context.socketId, confirmation);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Creates PR-specific chat tools. These require GitHub metadata and access
|
|
47
|
+
* to the GitHub API services.
|
|
48
|
+
*
|
|
49
|
+
* Confirmation is handled inside the tool handlers. Each mutation tool sends
|
|
50
|
+
* a structured confirmation request bound to the initiating socket, waits for
|
|
51
|
+
* the user's reply, then executes the GitHub request only if approved.
|
|
52
|
+
*/
|
|
53
|
+
export function createPrChatTools(parsedDiffFiles, githubMeta, mainModule, getRelevantContext, projectId) {
|
|
54
|
+
const readPrFileDiffTool = {
|
|
55
|
+
name: 'read_pr_file_diff',
|
|
56
|
+
description: 'Get the exact diff for a specific file modified in this PR.',
|
|
57
|
+
effect: 'read',
|
|
58
|
+
parameters: z.object({
|
|
59
|
+
file_path: z.string().optional().describe('The path of the changed file (e.g. src/main.ts).'),
|
|
60
|
+
filePath: z
|
|
61
|
+
.string()
|
|
62
|
+
.optional()
|
|
63
|
+
.describe('The path of the changed file (e.g. src/main.ts). Alias for file_path.'),
|
|
64
|
+
}),
|
|
65
|
+
handler: async (args) => {
|
|
66
|
+
const filePath = args.file_path ?? args.filePath;
|
|
67
|
+
if (!filePath)
|
|
68
|
+
return { error: 'Missing file_path or filePath argument.' };
|
|
69
|
+
const fileDiff = parsedDiffFiles.find((file) => file.file === filePath);
|
|
70
|
+
if (!fileDiff)
|
|
71
|
+
return { error: `File ${filePath} not found in this PR's diff.` };
|
|
72
|
+
return { diff: fileDiff.diff };
|
|
73
|
+
},
|
|
74
|
+
};
|
|
75
|
+
const semanticSearchTool = {
|
|
76
|
+
name: 'semantic_search',
|
|
77
|
+
description: 'Search the indexed codebase using semantic similarity. Useful for finding architecture patterns, existing conventions, or context about unfamiliar code.',
|
|
78
|
+
effect: 'read',
|
|
79
|
+
parameters: z.object({
|
|
80
|
+
query: z.string().describe('The search query for semantic matching.'),
|
|
81
|
+
}),
|
|
82
|
+
handler: async (args) => {
|
|
83
|
+
const factsContext = await getRelevantContext(projectId, args.query);
|
|
84
|
+
if (!factsContext)
|
|
85
|
+
return { result: 'No relevant semantic information found.' };
|
|
86
|
+
return { result: factsContext };
|
|
87
|
+
},
|
|
88
|
+
};
|
|
89
|
+
const leavePrCommentTool = {
|
|
90
|
+
name: 'leave_pr_comment',
|
|
91
|
+
description: 'Post a general comment to the current GitHub pull request. Use this whenever the user asks you to leave, post, send, or submit a general PR comment.',
|
|
92
|
+
effect: 'write',
|
|
93
|
+
parameters: z
|
|
94
|
+
.object({
|
|
95
|
+
body: z.string().optional().describe('The exact comment body to post to GitHub.'),
|
|
96
|
+
comment: z
|
|
97
|
+
.string()
|
|
98
|
+
.optional()
|
|
99
|
+
.describe('Alias for body. The exact comment body to post to GitHub.'),
|
|
100
|
+
})
|
|
101
|
+
.superRefine((args, ctx) => {
|
|
102
|
+
if (args.body === undefined && args.comment === undefined) {
|
|
103
|
+
ctx.addIssue({ code: 'custom', message: 'Either "body" or "comment" is required.' });
|
|
104
|
+
}
|
|
105
|
+
}),
|
|
106
|
+
handler: async (args, context) => {
|
|
107
|
+
if (!context.githubMeta) {
|
|
108
|
+
return { error: 'GitHub metadata is not available for this chat session.' };
|
|
109
|
+
}
|
|
110
|
+
// Normalize: accept both "body" and "comment" argument names because the
|
|
111
|
+
// local model frequently emits {"comment": "..."} while the schema was
|
|
112
|
+
// previously body-only. Zod validation used to reject the call before any
|
|
113
|
+
// confirmation dialog could appear.
|
|
114
|
+
const body = args.body ?? args.comment ?? '';
|
|
115
|
+
if (!body) {
|
|
116
|
+
return { error: 'Missing comment body. Provide body or comment argument.' };
|
|
117
|
+
}
|
|
118
|
+
const prNumber = context.githubMeta.pull_number;
|
|
119
|
+
const preview = {
|
|
120
|
+
title: prNumber ? `Post comment on PR #${prNumber}` : 'Post comment on PR',
|
|
121
|
+
description: body,
|
|
122
|
+
request: {
|
|
123
|
+
method: 'POST',
|
|
124
|
+
endpoint: `/repos/${context.githubMeta.owner}/${context.githubMeta.repo}/pulls/${context.githubMeta.pull_number}/reviews`,
|
|
125
|
+
payload: {
|
|
126
|
+
body,
|
|
127
|
+
event: 'COMMENT',
|
|
128
|
+
},
|
|
129
|
+
},
|
|
130
|
+
};
|
|
131
|
+
// Ask the user for approval via socket. The tool waits for the reply.
|
|
132
|
+
const approved = await requestToolConfirmation(mainModule, context, preview, 'leave_pr_comment', args);
|
|
133
|
+
if (!approved) {
|
|
134
|
+
return {
|
|
135
|
+
error: 'The user declined the leave_pr_comment action. The comment was NOT posted to GitHub. Do not claim it succeeded.',
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
try {
|
|
139
|
+
const { data } = await mainModule.github.submitPRReview({
|
|
140
|
+
owner: context.githubMeta.owner,
|
|
141
|
+
repo: context.githubMeta.repo,
|
|
142
|
+
pull_number: context.githubMeta.pull_number,
|
|
143
|
+
body,
|
|
144
|
+
event: 'COMMENT',
|
|
145
|
+
});
|
|
146
|
+
return {
|
|
147
|
+
result: 'Comment successfully posted to GitHub.',
|
|
148
|
+
reviewId: data?.id,
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
catch (error) {
|
|
152
|
+
return { error: error.message };
|
|
153
|
+
}
|
|
154
|
+
},
|
|
155
|
+
};
|
|
156
|
+
const requestPrChangesTool = {
|
|
157
|
+
name: 'request_pr_changes',
|
|
158
|
+
description: 'Submit a GitHub REQUEST_CHANGES review for the current pull request with a specific inline file comment.',
|
|
159
|
+
effect: 'write',
|
|
160
|
+
parameters: z.object({
|
|
161
|
+
body: z.string().describe('The overall summary for the requested changes review.'),
|
|
162
|
+
file_path: z.string().describe('The changed file containing the issue.'),
|
|
163
|
+
line_number: z
|
|
164
|
+
.number()
|
|
165
|
+
.int()
|
|
166
|
+
.positive()
|
|
167
|
+
.describe('The target line number in the changed file.'),
|
|
168
|
+
comment_details: z.string().describe('The exact inline review comment for that line.'),
|
|
169
|
+
}),
|
|
170
|
+
handler: async (args, context) => {
|
|
171
|
+
if (!context.githubMeta) {
|
|
172
|
+
return { error: 'GitHub metadata is not available for this chat session.' };
|
|
173
|
+
}
|
|
174
|
+
const body = args.body;
|
|
175
|
+
const filePath = args.file_path;
|
|
176
|
+
const lineNumber = args.line_number;
|
|
177
|
+
const commentDetails = args.comment_details;
|
|
178
|
+
const prNumber = context.githubMeta.pull_number;
|
|
179
|
+
const preview = {
|
|
180
|
+
title: prNumber ? `Request changes on PR #${prNumber}` : 'Request changes on PR',
|
|
181
|
+
description: [
|
|
182
|
+
filePath ? `**File:** \`${filePath}:${lineNumber}\`` : '',
|
|
183
|
+
commentDetails ? `**Inline comment:**\n${commentDetails}` : '',
|
|
184
|
+
body ? `**Review summary:**\n${body}` : '',
|
|
185
|
+
]
|
|
186
|
+
.filter(Boolean)
|
|
187
|
+
.join('\n\n'),
|
|
188
|
+
request: {
|
|
189
|
+
method: 'POST',
|
|
190
|
+
endpoint: `/repos/${context.githubMeta.owner}/${context.githubMeta.repo}/pulls/${context.githubMeta.pull_number}/reviews`,
|
|
191
|
+
payload: {
|
|
192
|
+
body,
|
|
193
|
+
event: 'REQUEST_CHANGES',
|
|
194
|
+
comments: [
|
|
195
|
+
{
|
|
196
|
+
path: filePath,
|
|
197
|
+
line: lineNumber,
|
|
198
|
+
body: commentDetails,
|
|
199
|
+
},
|
|
200
|
+
],
|
|
201
|
+
},
|
|
202
|
+
},
|
|
203
|
+
};
|
|
204
|
+
// Ask the user for approval via socket. The tool waits for the reply.
|
|
205
|
+
const approved = await requestToolConfirmation(mainModule, context, preview, 'request_pr_changes', args);
|
|
206
|
+
if (!approved) {
|
|
207
|
+
return {
|
|
208
|
+
error: 'The user declined the request_pr_changes action. The changes were NOT requested on GitHub. Do not claim it succeeded.',
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
try {
|
|
212
|
+
const { data } = await mainModule.github.submitPRReview({
|
|
213
|
+
owner: context.githubMeta.owner,
|
|
214
|
+
repo: context.githubMeta.repo,
|
|
215
|
+
pull_number: context.githubMeta.pull_number,
|
|
216
|
+
body,
|
|
217
|
+
event: 'REQUEST_CHANGES',
|
|
218
|
+
comments: [{ path: filePath, line: lineNumber, body: commentDetails }],
|
|
219
|
+
});
|
|
220
|
+
return {
|
|
221
|
+
result: 'Changes successfully requested on GitHub.',
|
|
222
|
+
reviewId: data?.id,
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
catch (error) {
|
|
226
|
+
return { error: error.message };
|
|
227
|
+
}
|
|
228
|
+
},
|
|
229
|
+
};
|
|
230
|
+
return [readPrFileDiffTool, semanticSearchTool, leavePrCommentTool, requestPrChangesTool];
|
|
231
|
+
}
|
|
232
|
+
//# sourceMappingURL=pr-chat-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pr-chat-tools.js","sourceRoot":"","sources":["../../../../src/modules/ai-agent/tools/pr-chat-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { DataSource } from 'typeorm';
|
|
2
|
+
import { VectorDatabaseService } from './vector-database.service.js';
|
|
3
|
+
declare class DatabaseModule {
|
|
4
|
+
appDataSource: DataSource;
|
|
5
|
+
vectorDatabase: VectorDatabaseService;
|
|
6
|
+
constructor();
|
|
7
|
+
connect(): Promise<void>;
|
|
8
|
+
}
|
|
9
|
+
export default DatabaseModule;
|
|
10
|
+
//# sourceMappingURL=database.module.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database.module.d.ts","sourceRoot":"","sources":["../../../src/modules/database/database.module.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAGrC,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAErE,cAAM,cAAc;IAClB,aAAa,EAAE,UAAU,CAAC;IAC1B,cAAc,EAAE,qBAAqB,CAAC;;IAehC,OAAO;CAed;AAED,eAAe,cAAc,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import ora from 'ora';
|
|
3
|
+
import { DataSource } from 'typeorm';
|
|
4
|
+
import ProjectEntity from '../server/entities/project.entity.js';
|
|
5
|
+
import SettingsEntity from '../server/entities/settings.entity.js';
|
|
6
|
+
import { VectorDatabaseService } from './vector-database.service.js';
|
|
7
|
+
class DatabaseModule {
|
|
8
|
+
appDataSource;
|
|
9
|
+
vectorDatabase;
|
|
10
|
+
constructor() {
|
|
11
|
+
this.vectorDatabase = new VectorDatabaseService();
|
|
12
|
+
this.appDataSource = new DataSource({
|
|
13
|
+
type: 'better-sqlite3',
|
|
14
|
+
database: 'database.sqlite',
|
|
15
|
+
synchronize: true,
|
|
16
|
+
logging: false,
|
|
17
|
+
entities: [ProjectEntity, SettingsEntity],
|
|
18
|
+
migrations: [],
|
|
19
|
+
subscribers: [],
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
async connect() {
|
|
23
|
+
const spinner = ora({
|
|
24
|
+
text: 'connecting to database.....',
|
|
25
|
+
color: 'gray',
|
|
26
|
+
interval: 200,
|
|
27
|
+
}).start();
|
|
28
|
+
await this.appDataSource.initialize().catch((err) => {
|
|
29
|
+
spinner.fail(chalk.red('Database connection failed: ') + err);
|
|
30
|
+
throw new Error('Database connection failed');
|
|
31
|
+
});
|
|
32
|
+
spinner.succeed(chalk.green('Database connected successfully'));
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
export default DatabaseModule;
|
|
36
|
+
//# sourceMappingURL=database.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database.module.js","sourceRoot":"","sources":["../../../src/modules/database/database.module.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AAEtB,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,aAAa,MAAM,sCAAsC,CAAC;AACjE,OAAO,cAAc,MAAM,uCAAuC,CAAC;AACnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAErE,MAAM,cAAc;IAClB,aAAa,CAAa;IAC1B,cAAc,CAAwB;IAEtC;QACE,IAAI,CAAC,cAAc,GAAG,IAAI,qBAAqB,EAAE,CAAC;QAClD,IAAI,CAAC,aAAa,GAAG,IAAI,UAAU,CAAC;YAClC,IAAI,EAAE,gBAAgB;YACtB,QAAQ,EAAE,iBAAiB;YAC3B,WAAW,EAAE,IAAI;YACjB,OAAO,EAAE,KAAK;YACd,QAAQ,EAAE,CAAC,aAAa,EAAE,cAAc,CAAC;YACzC,UAAU,EAAE,EAAE;YACd,WAAW,EAAE,EAAE;SAChB,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,OAAO;QACX,MAAM,OAAO,GAAG,GAAG,CAAC;YAClB,IAAI,EAAE,6BAA6B;YACnC,KAAK,EAAE,MAAM;YACb,QAAQ,EAAE,GAAG;SACd,CAAC,CAAC,KAAK,EAAE,CAAC;QAEX,MAAM,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YAClD,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,8BAA8B,CAAC,GAAG,GAAG,CAAC,CAAC;YAE9D,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC,CAAC;IAClE,CAAC;CACF;AAED,eAAe,cAAc,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export declare class VectorDatabaseService {
|
|
2
|
+
private db;
|
|
3
|
+
constructor(databasePath?: string);
|
|
4
|
+
private initTables;
|
|
5
|
+
saveProjectFact(projectId: string, content: string, embeddingArray: number[], filePath?: string, metadata?: any): Promise<number>;
|
|
6
|
+
searchFacts(projectId: string, queryEmbedding: number[], limit?: number): Promise<any[]>;
|
|
7
|
+
deleteProjectFacts(projectId: string): void;
|
|
8
|
+
deleteFactsForFile(projectId: string, filePath: string): void;
|
|
9
|
+
replaceFactsForFile(projectId: string, filePath: string, facts: {
|
|
10
|
+
content: string;
|
|
11
|
+
embedding: number[];
|
|
12
|
+
metadata?: any;
|
|
13
|
+
}[]): Promise<void>;
|
|
14
|
+
/**
|
|
15
|
+
* Batch save facts across multiple files in a single transaction.
|
|
16
|
+
* Much faster than calling replaceFactsForFile repeatedly.
|
|
17
|
+
*/
|
|
18
|
+
batchReplaceFacts(projectId: string, fileFacts: {
|
|
19
|
+
filePath: string;
|
|
20
|
+
facts: {
|
|
21
|
+
content: string;
|
|
22
|
+
embedding: number[];
|
|
23
|
+
metadata?: any;
|
|
24
|
+
}[];
|
|
25
|
+
}[]): Promise<void>;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=vector-database.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vector-database.service.d.ts","sourceRoot":"","sources":["../../../src/modules/database/vector-database.service.ts"],"names":[],"mappings":"AAEA,qBAAa,qBAAqB;IAChC,OAAO,CAAC,EAAE,CAAoB;gBAElB,YAAY,GAAE,MAA0B;IAMpD,OAAO,CAAC,UAAU;IAqBL,eAAe,CAC1B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,MAAM,EAAE,EACxB,QAAQ,CAAC,EAAE,MAAM,EACjB,QAAQ,CAAC,EAAE,GAAG;IAiCH,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,EAAE,KAAK,GAAE,MAAU;IA4BhF,kBAAkB,CAAC,SAAS,EAAE,MAAM;IAmBpC,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;IAmBhD,mBAAmB,CAC9B,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,EAAE,CAAC;QAAC,QAAQ,CAAC,EAAE,GAAG,CAAA;KAAE,EAAE;IAwCnE;;;OAGG;IACU,iBAAiB,CAC5B,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE;QACT,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE;YAAE,OAAO,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,MAAM,EAAE,CAAC;YAAC,QAAQ,CAAC,EAAE,GAAG,CAAA;SAAE,EAAE,CAAC;KACnE,EAAE;CAiDN"}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import Database from 'better-sqlite3';
|
|
2
|
+
import * as sqliteVec from 'sqlite-vec';
|
|
3
|
+
export class VectorDatabaseService {
|
|
4
|
+
db;
|
|
5
|
+
constructor(databasePath = 'database.sqlite') {
|
|
6
|
+
this.db = new Database(databasePath);
|
|
7
|
+
sqliteVec.load(this.db);
|
|
8
|
+
this.initTables();
|
|
9
|
+
}
|
|
10
|
+
initTables() {
|
|
11
|
+
this.db.exec(`
|
|
12
|
+
CREATE TABLE IF NOT EXISTS project_facts (
|
|
13
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
14
|
+
project_id TEXT NOT NULL,
|
|
15
|
+
content TEXT NOT NULL,
|
|
16
|
+
file_path TEXT,
|
|
17
|
+
metadata TEXT,
|
|
18
|
+
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
19
|
+
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
20
|
+
);
|
|
21
|
+
`);
|
|
22
|
+
this.db.exec(`
|
|
23
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS vec_project_facts USING vec0(
|
|
24
|
+
fact_id INTEGER PRIMARY KEY,
|
|
25
|
+
embedding float[1024]
|
|
26
|
+
);
|
|
27
|
+
`);
|
|
28
|
+
}
|
|
29
|
+
async saveProjectFact(projectId, content, embeddingArray, filePath, metadata) {
|
|
30
|
+
const embeddingFloat32 = new Float32Array(embeddingArray);
|
|
31
|
+
const serializedEmbedding = Buffer.from(embeddingFloat32.buffer);
|
|
32
|
+
const transaction = this.db.transaction(() => {
|
|
33
|
+
const insertFact = this.db.prepare(`
|
|
34
|
+
INSERT INTO project_facts (project_id, content, file_path, metadata, created_at, updated_at)
|
|
35
|
+
VALUES (?, ?, ?, ?, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)
|
|
36
|
+
`);
|
|
37
|
+
const result = insertFact.run(projectId, content, filePath || null, metadata ? JSON.stringify(metadata) : null);
|
|
38
|
+
const factId = result.lastInsertRowid;
|
|
39
|
+
const insertVec = this.db.prepare(`
|
|
40
|
+
INSERT INTO vec_project_facts (fact_id, embedding)
|
|
41
|
+
VALUES (?, ?)
|
|
42
|
+
`);
|
|
43
|
+
insertVec.run(BigInt(factId), serializedEmbedding);
|
|
44
|
+
return Number(factId);
|
|
45
|
+
});
|
|
46
|
+
return transaction();
|
|
47
|
+
}
|
|
48
|
+
async searchFacts(projectId, queryEmbedding, limit = 5) {
|
|
49
|
+
const queryFloat32 = new Float32Array(queryEmbedding);
|
|
50
|
+
const serializedQuery = Buffer.from(queryFloat32.buffer);
|
|
51
|
+
const searchStmt = this.db.prepare(`
|
|
52
|
+
SELECT
|
|
53
|
+
pf.id,
|
|
54
|
+
pf.project_id,
|
|
55
|
+
pf.content,
|
|
56
|
+
pf.file_path,
|
|
57
|
+
pf.metadata,
|
|
58
|
+
pf.created_at,
|
|
59
|
+
pf.updated_at,
|
|
60
|
+
vec_distance_cosine(vpf.embedding, ?) AS distance
|
|
61
|
+
FROM vec_project_facts vpf
|
|
62
|
+
JOIN project_facts pf ON pf.id = vpf.fact_id
|
|
63
|
+
WHERE pf.project_id = ?
|
|
64
|
+
ORDER BY distance ASC
|
|
65
|
+
LIMIT ?
|
|
66
|
+
`);
|
|
67
|
+
const results = searchStmt.all(serializedQuery, projectId, limit);
|
|
68
|
+
return results.map((row) => ({
|
|
69
|
+
...row,
|
|
70
|
+
metadata: row.metadata ? JSON.parse(row.metadata) : null,
|
|
71
|
+
}));
|
|
72
|
+
}
|
|
73
|
+
deleteProjectFacts(projectId) {
|
|
74
|
+
const transaction = this.db.transaction(() => {
|
|
75
|
+
const deleteVec = this.db.prepare(`
|
|
76
|
+
DELETE FROM vec_project_facts
|
|
77
|
+
WHERE fact_id IN (
|
|
78
|
+
SELECT id FROM project_facts WHERE project_id = ?
|
|
79
|
+
)
|
|
80
|
+
`);
|
|
81
|
+
deleteVec.run(projectId);
|
|
82
|
+
const deleteFacts = this.db.prepare(`
|
|
83
|
+
DELETE FROM project_facts WHERE project_id = ?
|
|
84
|
+
`);
|
|
85
|
+
deleteFacts.run(projectId);
|
|
86
|
+
});
|
|
87
|
+
transaction();
|
|
88
|
+
}
|
|
89
|
+
deleteFactsForFile(projectId, filePath) {
|
|
90
|
+
const transaction = this.db.transaction(() => {
|
|
91
|
+
const deleteVec = this.db.prepare(`
|
|
92
|
+
DELETE FROM vec_project_facts
|
|
93
|
+
WHERE fact_id IN (
|
|
94
|
+
SELECT id FROM project_facts WHERE project_id = ? AND file_path = ?
|
|
95
|
+
)
|
|
96
|
+
`);
|
|
97
|
+
deleteVec.run(projectId, filePath);
|
|
98
|
+
const deleteFacts = this.db.prepare(`
|
|
99
|
+
DELETE FROM project_facts WHERE project_id = ? AND file_path = ?
|
|
100
|
+
`);
|
|
101
|
+
deleteFacts.run(projectId, filePath);
|
|
102
|
+
});
|
|
103
|
+
transaction();
|
|
104
|
+
}
|
|
105
|
+
async replaceFactsForFile(projectId, filePath, facts) {
|
|
106
|
+
// Delete existing
|
|
107
|
+
this.deleteFactsForFile(projectId, filePath);
|
|
108
|
+
// Insert new in a single transaction for speed
|
|
109
|
+
if (facts.length === 0)
|
|
110
|
+
return;
|
|
111
|
+
const transaction = this.db.transaction((items) => {
|
|
112
|
+
const insertFact = this.db.prepare(`
|
|
113
|
+
INSERT INTO project_facts (project_id, content, file_path, metadata, created_at, updated_at)
|
|
114
|
+
VALUES (?, ?, ?, ?, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)
|
|
115
|
+
`);
|
|
116
|
+
const insertVec = this.db.prepare(`
|
|
117
|
+
INSERT INTO vec_project_facts (fact_id, embedding)
|
|
118
|
+
VALUES (?, ?)
|
|
119
|
+
`);
|
|
120
|
+
for (const fact of items) {
|
|
121
|
+
const embeddingFloat32 = new Float32Array(fact.embedding);
|
|
122
|
+
const serializedEmbedding = Buffer.from(embeddingFloat32.buffer);
|
|
123
|
+
const result = insertFact.run(projectId, fact.content, filePath, fact.metadata ? JSON.stringify(fact.metadata) : null);
|
|
124
|
+
const factId = result.lastInsertRowid;
|
|
125
|
+
insertVec.run(BigInt(factId), serializedEmbedding);
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
transaction(facts);
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Batch save facts across multiple files in a single transaction.
|
|
132
|
+
* Much faster than calling replaceFactsForFile repeatedly.
|
|
133
|
+
*/
|
|
134
|
+
async batchReplaceFacts(projectId, fileFacts) {
|
|
135
|
+
const transaction = this.db.transaction((items) => {
|
|
136
|
+
const deleteVec = this.db.prepare(`
|
|
137
|
+
DELETE FROM vec_project_facts
|
|
138
|
+
WHERE fact_id IN (
|
|
139
|
+
SELECT id FROM project_facts WHERE project_id = ? AND file_path = ?
|
|
140
|
+
)
|
|
141
|
+
`);
|
|
142
|
+
const deleteFacts = this.db.prepare(`
|
|
143
|
+
DELETE FROM project_facts WHERE project_id = ? AND file_path = ?
|
|
144
|
+
`);
|
|
145
|
+
const insertFact = this.db.prepare(`
|
|
146
|
+
INSERT INTO project_facts (project_id, content, file_path, metadata, created_at, updated_at)
|
|
147
|
+
VALUES (?, ?, ?, ?, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)
|
|
148
|
+
`);
|
|
149
|
+
const insertVec = this.db.prepare(`
|
|
150
|
+
INSERT INTO vec_project_facts (fact_id, embedding)
|
|
151
|
+
VALUES (?, ?)
|
|
152
|
+
`);
|
|
153
|
+
for (const { filePath, facts } of items) {
|
|
154
|
+
// Delete existing facts for this file
|
|
155
|
+
deleteVec.run(projectId, filePath);
|
|
156
|
+
deleteFacts.run(projectId, filePath);
|
|
157
|
+
// Insert new facts
|
|
158
|
+
for (const fact of facts) {
|
|
159
|
+
const embeddingFloat32 = new Float32Array(fact.embedding);
|
|
160
|
+
const serializedEmbedding = Buffer.from(embeddingFloat32.buffer);
|
|
161
|
+
const result = insertFact.run(projectId, fact.content, filePath, fact.metadata ? JSON.stringify(fact.metadata) : null);
|
|
162
|
+
const factId = result.lastInsertRowid;
|
|
163
|
+
insertVec.run(BigInt(factId), serializedEmbedding);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
});
|
|
167
|
+
transaction(fileFacts);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=vector-database.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vector-database.service.js","sourceRoot":"","sources":["../../../src/modules/database/vector-database.service.ts"],"names":[],"mappings":"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"}
|