@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.
Files changed (264) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +95 -0
  3. package/dist/bin.d.ts +3 -0
  4. package/dist/bin.d.ts.map +1 -0
  5. package/dist/bin.js +17 -0
  6. package/dist/bin.js.map +1 -0
  7. package/dist/client/assets/geist-cyrillic-ext-wght-normal-DjL33-gN.woff2 +0 -0
  8. package/dist/client/assets/geist-cyrillic-wght-normal-BEAKL7Jp.woff2 +0 -0
  9. package/dist/client/assets/geist-latin-ext-wght-normal-DC-KSUi6.woff2 +0 -0
  10. package/dist/client/assets/geist-latin-wght-normal-BgDaEnEv.woff2 +0 -0
  11. package/dist/client/assets/geist-vietnamese-wght-normal-6IgcOCM7.woff2 +0 -0
  12. package/dist/client/assets/index-4oL_AGyI.css +1 -0
  13. package/dist/client/assets/index-CJtKCyBg.js +848 -0
  14. package/dist/client/favicon.png +0 -0
  15. package/dist/client/favicon.svg +1 -0
  16. package/dist/client/icons.svg +24 -0
  17. package/dist/client/index.html +17 -0
  18. package/dist/client/resources/images/logo.png +0 -0
  19. package/dist/client/resources/images/openai.png +0 -0
  20. package/dist/constants.d.ts +3 -0
  21. package/dist/constants.d.ts.map +1 -0
  22. package/dist/constants.js +3 -0
  23. package/dist/constants.js.map +1 -0
  24. package/dist/dev.d.ts +2 -0
  25. package/dist/dev.d.ts.map +1 -0
  26. package/dist/dev.js +10 -0
  27. package/dist/dev.js.map +1 -0
  28. package/dist/modules/ai-agent/agent-context-manager.d.ts +57 -0
  29. package/dist/modules/ai-agent/agent-context-manager.d.ts.map +1 -0
  30. package/dist/modules/ai-agent/agent-context-manager.js +159 -0
  31. package/dist/modules/ai-agent/agent-context-manager.js.map +1 -0
  32. package/dist/modules/ai-agent/ai-agent.module.d.ts +17 -0
  33. package/dist/modules/ai-agent/ai-agent.module.d.ts.map +1 -0
  34. package/dist/modules/ai-agent/ai-agent.module.js +24 -0
  35. package/dist/modules/ai-agent/ai-agent.module.js.map +1 -0
  36. package/dist/modules/ai-agent/ai-agent.utils.d.ts +10 -0
  37. package/dist/modules/ai-agent/ai-agent.utils.d.ts.map +1 -0
  38. package/dist/modules/ai-agent/ai-agent.utils.js +389 -0
  39. package/dist/modules/ai-agent/ai-agent.utils.js.map +1 -0
  40. package/dist/modules/ai-agent/base.agent.d.ts +26 -0
  41. package/dist/modules/ai-agent/base.agent.d.ts.map +1 -0
  42. package/dist/modules/ai-agent/base.agent.js +101 -0
  43. package/dist/modules/ai-agent/base.agent.js.map +1 -0
  44. package/dist/modules/ai-agent/chat.agent.d.ts +35 -0
  45. package/dist/modules/ai-agent/chat.agent.d.ts.map +1 -0
  46. package/dist/modules/ai-agent/chat.agent.js +590 -0
  47. package/dist/modules/ai-agent/chat.agent.js.map +1 -0
  48. package/dist/modules/ai-agent/code-base-indexer.agent.d.ts +13 -0
  49. package/dist/modules/ai-agent/code-base-indexer.agent.d.ts.map +1 -0
  50. package/dist/modules/ai-agent/code-base-indexer.agent.js +506 -0
  51. package/dist/modules/ai-agent/code-base-indexer.agent.js.map +1 -0
  52. package/dist/modules/ai-agent/codebase-scanner.d.ts +37 -0
  53. package/dist/modules/ai-agent/codebase-scanner.d.ts.map +1 -0
  54. package/dist/modules/ai-agent/codebase-scanner.js +260 -0
  55. package/dist/modules/ai-agent/codebase-scanner.js.map +1 -0
  56. package/dist/modules/ai-agent/model-loader.d.ts +7 -0
  57. package/dist/modules/ai-agent/model-loader.d.ts.map +1 -0
  58. package/dist/modules/ai-agent/model-loader.js +129 -0
  59. package/dist/modules/ai-agent/model-loader.js.map +1 -0
  60. package/dist/modules/ai-agent/orientation-loader.d.ts +2 -0
  61. package/dist/modules/ai-agent/orientation-loader.d.ts.map +1 -0
  62. package/dist/modules/ai-agent/orientation-loader.js +70 -0
  63. package/dist/modules/ai-agent/orientation-loader.js.map +1 -0
  64. package/dist/modules/ai-agent/pr-review-session.manager.d.ts +36 -0
  65. package/dist/modules/ai-agent/pr-review-session.manager.d.ts.map +1 -0
  66. package/dist/modules/ai-agent/pr-review-session.manager.js +106 -0
  67. package/dist/modules/ai-agent/pr-review-session.manager.js.map +1 -0
  68. package/dist/modules/ai-agent/pr-review.agent.d.ts +22 -0
  69. package/dist/modules/ai-agent/pr-review.agent.d.ts.map +1 -0
  70. package/dist/modules/ai-agent/pr-review.agent.js +269 -0
  71. package/dist/modules/ai-agent/pr-review.agent.js.map +1 -0
  72. package/dist/modules/ai-agent/research-loop.d.ts +3 -0
  73. package/dist/modules/ai-agent/research-loop.d.ts.map +1 -0
  74. package/dist/modules/ai-agent/research-loop.js +691 -0
  75. package/dist/modules/ai-agent/research-loop.js.map +1 -0
  76. package/dist/modules/ai-agent/review-pipeline/agent-loop.d.ts +36 -0
  77. package/dist/modules/ai-agent/review-pipeline/agent-loop.d.ts.map +1 -0
  78. package/dist/modules/ai-agent/review-pipeline/agent-loop.js +178 -0
  79. package/dist/modules/ai-agent/review-pipeline/agent-loop.js.map +1 -0
  80. package/dist/modules/ai-agent/review-pipeline/change-analyzer.d.ts +8 -0
  81. package/dist/modules/ai-agent/review-pipeline/change-analyzer.d.ts.map +1 -0
  82. package/dist/modules/ai-agent/review-pipeline/change-analyzer.js +93 -0
  83. package/dist/modules/ai-agent/review-pipeline/change-analyzer.js.map +1 -0
  84. package/dist/modules/ai-agent/review-pipeline/finding-ranker.d.ts +47 -0
  85. package/dist/modules/ai-agent/review-pipeline/finding-ranker.d.ts.map +1 -0
  86. package/dist/modules/ai-agent/review-pipeline/finding-ranker.js +91 -0
  87. package/dist/modules/ai-agent/review-pipeline/finding-ranker.js.map +1 -0
  88. package/dist/modules/ai-agent/review-pipeline/finding-verifier.d.ts +29 -0
  89. package/dist/modules/ai-agent/review-pipeline/finding-verifier.d.ts.map +1 -0
  90. package/dist/modules/ai-agent/review-pipeline/finding-verifier.js +130 -0
  91. package/dist/modules/ai-agent/review-pipeline/finding-verifier.js.map +1 -0
  92. package/dist/modules/ai-agent/review-pipeline/repository-explorer.d.ts +21 -0
  93. package/dist/modules/ai-agent/review-pipeline/repository-explorer.d.ts.map +1 -0
  94. package/dist/modules/ai-agent/review-pipeline/repository-explorer.js +247 -0
  95. package/dist/modules/ai-agent/review-pipeline/repository-explorer.js.map +1 -0
  96. package/dist/modules/ai-agent/review-pipeline/review-controller.d.ts +22 -0
  97. package/dist/modules/ai-agent/review-pipeline/review-controller.d.ts.map +1 -0
  98. package/dist/modules/ai-agent/review-pipeline/review-controller.js +102 -0
  99. package/dist/modules/ai-agent/review-pipeline/review-controller.js.map +1 -0
  100. package/dist/modules/ai-agent/review-pipeline/review-writer.d.ts +4 -0
  101. package/dist/modules/ai-agent/review-pipeline/review-writer.d.ts.map +1 -0
  102. package/dist/modules/ai-agent/review-pipeline/review-writer.js +52 -0
  103. package/dist/modules/ai-agent/review-pipeline/review-writer.js.map +1 -0
  104. package/dist/modules/ai-agent/review-pipeline/secret-scanner.d.ts +25 -0
  105. package/dist/modules/ai-agent/review-pipeline/secret-scanner.d.ts.map +1 -0
  106. package/dist/modules/ai-agent/review-pipeline/secret-scanner.js +159 -0
  107. package/dist/modules/ai-agent/review-pipeline/secret-scanner.js.map +1 -0
  108. package/dist/modules/ai-agent/review-pipeline/specialist-reviewer.d.ts +9 -0
  109. package/dist/modules/ai-agent/review-pipeline/specialist-reviewer.d.ts.map +1 -0
  110. package/dist/modules/ai-agent/review-pipeline/specialist-reviewer.js +114 -0
  111. package/dist/modules/ai-agent/review-pipeline/specialist-reviewer.js.map +1 -0
  112. package/dist/modules/ai-agent/review-pipeline/types.d.ts +53 -0
  113. package/dist/modules/ai-agent/review-pipeline/types.d.ts.map +1 -0
  114. package/dist/modules/ai-agent/review-pipeline/types.js +45 -0
  115. package/dist/modules/ai-agent/review-pipeline/types.js.map +1 -0
  116. package/dist/modules/ai-agent/tool-executor.d.ts +37 -0
  117. package/dist/modules/ai-agent/tool-executor.d.ts.map +1 -0
  118. package/dist/modules/ai-agent/tool-executor.js +199 -0
  119. package/dist/modules/ai-agent/tool-executor.js.map +1 -0
  120. package/dist/modules/ai-agent/tool-types.d.ts +72 -0
  121. package/dist/modules/ai-agent/tool-types.d.ts.map +1 -0
  122. package/dist/modules/ai-agent/tool-types.js +2 -0
  123. package/dist/modules/ai-agent/tool-types.js.map +1 -0
  124. package/dist/modules/ai-agent/tools/fs-tools.d.ts +54 -0
  125. package/dist/modules/ai-agent/tools/fs-tools.d.ts.map +1 -0
  126. package/dist/modules/ai-agent/tools/fs-tools.js +237 -0
  127. package/dist/modules/ai-agent/tools/fs-tools.js.map +1 -0
  128. package/dist/modules/ai-agent/tools/git-tools.d.ts +322 -0
  129. package/dist/modules/ai-agent/tools/git-tools.d.ts.map +1 -0
  130. package/dist/modules/ai-agent/tools/git-tools.js +557 -0
  131. package/dist/modules/ai-agent/tools/git-tools.js.map +1 -0
  132. package/dist/modules/ai-agent/tools/pr-chat-tools.d.ts +15 -0
  133. package/dist/modules/ai-agent/tools/pr-chat-tools.d.ts.map +1 -0
  134. package/dist/modules/ai-agent/tools/pr-chat-tools.js +232 -0
  135. package/dist/modules/ai-agent/tools/pr-chat-tools.js.map +1 -0
  136. package/dist/modules/database/database.module.d.ts +10 -0
  137. package/dist/modules/database/database.module.d.ts.map +1 -0
  138. package/dist/modules/database/database.module.js +36 -0
  139. package/dist/modules/database/database.module.js.map +1 -0
  140. package/dist/modules/database/vector-database.service.d.ts +27 -0
  141. package/dist/modules/database/vector-database.service.d.ts.map +1 -0
  142. package/dist/modules/database/vector-database.service.js +170 -0
  143. package/dist/modules/database/vector-database.service.js.map +1 -0
  144. package/dist/modules/github/github.module.d.ts +964 -0
  145. package/dist/modules/github/github.module.d.ts.map +1 -0
  146. package/dist/modules/github/github.module.js +316 -0
  147. package/dist/modules/github/github.module.js.map +1 -0
  148. package/dist/modules/main.module.d.ts +20 -0
  149. package/dist/modules/main.module.d.ts.map +1 -0
  150. package/dist/modules/main.module.js +59 -0
  151. package/dist/modules/main.module.js.map +1 -0
  152. package/dist/modules/qvac/qvac.module.d.ts +28 -0
  153. package/dist/modules/qvac/qvac.module.d.ts.map +1 -0
  154. package/dist/modules/qvac/qvac.module.js +146 -0
  155. package/dist/modules/qvac/qvac.module.js.map +1 -0
  156. package/dist/modules/server/dtos/create-project.dto.d.ts +9 -0
  157. package/dist/modules/server/dtos/create-project.dto.d.ts.map +1 -0
  158. package/dist/modules/server/dtos/create-project.dto.js +2 -0
  159. package/dist/modules/server/dtos/create-project.dto.js.map +1 -0
  160. package/dist/modules/server/entities/agent-task.entity.d.ts +16 -0
  161. package/dist/modules/server/entities/agent-task.entity.d.ts.map +1 -0
  162. package/dist/modules/server/entities/agent-task.entity.js +72 -0
  163. package/dist/modules/server/entities/agent-task.entity.js.map +1 -0
  164. package/dist/modules/server/entities/ai-provider.entity.d.ts +11 -0
  165. package/dist/modules/server/entities/ai-provider.entity.d.ts.map +1 -0
  166. package/dist/modules/server/entities/ai-provider.entity.js +47 -0
  167. package/dist/modules/server/entities/ai-provider.entity.js.map +1 -0
  168. package/dist/modules/server/entities/deployment-plan-approval.entity.d.ts +10 -0
  169. package/dist/modules/server/entities/deployment-plan-approval.entity.d.ts.map +1 -0
  170. package/dist/modules/server/entities/deployment-plan-approval.entity.js +42 -0
  171. package/dist/modules/server/entities/deployment-plan-approval.entity.js.map +1 -0
  172. package/dist/modules/server/entities/deployment-plan-artifact.entity.d.ts +10 -0
  173. package/dist/modules/server/entities/deployment-plan-artifact.entity.d.ts.map +1 -0
  174. package/dist/modules/server/entities/deployment-plan-artifact.entity.js +42 -0
  175. package/dist/modules/server/entities/deployment-plan-artifact.entity.js.map +1 -0
  176. package/dist/modules/server/entities/deployment-plan-feedback.entity.d.ts +9 -0
  177. package/dist/modules/server/entities/deployment-plan-feedback.entity.d.ts.map +1 -0
  178. package/dist/modules/server/entities/deployment-plan-feedback.entity.js +37 -0
  179. package/dist/modules/server/entities/deployment-plan-feedback.entity.js.map +1 -0
  180. package/dist/modules/server/entities/deployment-plan-revision.entity.d.ts +11 -0
  181. package/dist/modules/server/entities/deployment-plan-revision.entity.d.ts.map +1 -0
  182. package/dist/modules/server/entities/deployment-plan-revision.entity.js +47 -0
  183. package/dist/modules/server/entities/deployment-plan-revision.entity.js.map +1 -0
  184. package/dist/modules/server/entities/deployment-plan.entity.d.ts +13 -0
  185. package/dist/modules/server/entities/deployment-plan.entity.d.ts.map +1 -0
  186. package/dist/modules/server/entities/deployment-plan.entity.js +58 -0
  187. package/dist/modules/server/entities/deployment-plan.entity.js.map +1 -0
  188. package/dist/modules/server/entities/project.entity.d.ts +26 -0
  189. package/dist/modules/server/entities/project.entity.d.ts.map +1 -0
  190. package/dist/modules/server/entities/project.entity.js +122 -0
  191. package/dist/modules/server/entities/project.entity.js.map +1 -0
  192. package/dist/modules/server/entities/settings.entity.d.ts +12 -0
  193. package/dist/modules/server/entities/settings.entity.d.ts.map +1 -0
  194. package/dist/modules/server/entities/settings.entity.js +62 -0
  195. package/dist/modules/server/entities/settings.entity.js.map +1 -0
  196. package/dist/modules/server/entities/terminal-log.entity.d.ts +10 -0
  197. package/dist/modules/server/entities/terminal-log.entity.d.ts.map +1 -0
  198. package/dist/modules/server/entities/terminal-log.entity.js +42 -0
  199. package/dist/modules/server/entities/terminal-log.entity.js.map +1 -0
  200. package/dist/modules/server/middleware/auth.middleware.d.ts +8 -0
  201. package/dist/modules/server/middleware/auth.middleware.d.ts.map +1 -0
  202. package/dist/modules/server/middleware/auth.middleware.js +26 -0
  203. package/dist/modules/server/middleware/auth.middleware.js.map +1 -0
  204. package/dist/modules/server/routes/auth.routes.d.ts +13 -0
  205. package/dist/modules/server/routes/auth.routes.d.ts.map +1 -0
  206. package/dist/modules/server/routes/auth.routes.js +59 -0
  207. package/dist/modules/server/routes/auth.routes.js.map +1 -0
  208. package/dist/modules/server/routes/github.routes.d.ts +14 -0
  209. package/dist/modules/server/routes/github.routes.d.ts.map +1 -0
  210. package/dist/modules/server/routes/github.routes.js +124 -0
  211. package/dist/modules/server/routes/github.routes.js.map +1 -0
  212. package/dist/modules/server/routes/project.routes.d.ts +11 -0
  213. package/dist/modules/server/routes/project.routes.d.ts.map +1 -0
  214. package/dist/modules/server/routes/project.routes.js +78 -0
  215. package/dist/modules/server/routes/project.routes.js.map +1 -0
  216. package/dist/modules/server/routes/qvac.routes.d.ts +11 -0
  217. package/dist/modules/server/routes/qvac.routes.d.ts.map +1 -0
  218. package/dist/modules/server/routes/qvac.routes.js +24 -0
  219. package/dist/modules/server/routes/qvac.routes.js.map +1 -0
  220. package/dist/modules/server/routes/routes.d.ts +20 -0
  221. package/dist/modules/server/routes/routes.d.ts.map +1 -0
  222. package/dist/modules/server/routes/routes.js +35 -0
  223. package/dist/modules/server/routes/routes.js.map +1 -0
  224. package/dist/modules/server/routes/settings.controller.d.ts +14 -0
  225. package/dist/modules/server/routes/settings.controller.d.ts.map +1 -0
  226. package/dist/modules/server/routes/settings.controller.js +65 -0
  227. package/dist/modules/server/routes/settings.controller.js.map +1 -0
  228. package/dist/modules/server/server.module.d.ts +19 -0
  229. package/dist/modules/server/server.module.d.ts.map +1 -0
  230. package/dist/modules/server/server.module.js +63 -0
  231. package/dist/modules/server/server.module.js.map +1 -0
  232. package/dist/modules/server/services/auth.services.d.ts +19 -0
  233. package/dist/modules/server/services/auth.services.d.ts.map +1 -0
  234. package/dist/modules/server/services/auth.services.js +87 -0
  235. package/dist/modules/server/services/auth.services.js.map +1 -0
  236. package/dist/modules/server/services/deployment-plan.services.d.ts +6 -0
  237. package/dist/modules/server/services/deployment-plan.services.d.ts.map +1 -0
  238. package/dist/modules/server/services/deployment-plan.services.js +8 -0
  239. package/dist/modules/server/services/deployment-plan.services.js.map +1 -0
  240. package/dist/modules/server/services/github.services.d.ts +939 -0
  241. package/dist/modules/server/services/github.services.d.ts.map +1 -0
  242. package/dist/modules/server/services/github.services.js +46 -0
  243. package/dist/modules/server/services/github.services.js.map +1 -0
  244. package/dist/modules/server/services/project.services.d.ts +41 -0
  245. package/dist/modules/server/services/project.services.d.ts.map +1 -0
  246. package/dist/modules/server/services/project.services.js +360 -0
  247. package/dist/modules/server/services/project.services.js.map +1 -0
  248. package/dist/modules/server/services/qvac.services.d.ts +10 -0
  249. package/dist/modules/server/services/qvac.services.d.ts.map +1 -0
  250. package/dist/modules/server/services/qvac.services.js +58 -0
  251. package/dist/modules/server/services/qvac.services.js.map +1 -0
  252. package/dist/modules/server/services/settings.service.d.ts +60 -0
  253. package/dist/modules/server/services/settings.service.d.ts.map +1 -0
  254. package/dist/modules/server/services/settings.service.js +125 -0
  255. package/dist/modules/server/services/settings.service.js.map +1 -0
  256. package/dist/modules/socket-gateway/interfaces/project-creation-log.interface.d.ts +14 -0
  257. package/dist/modules/socket-gateway/interfaces/project-creation-log.interface.d.ts.map +1 -0
  258. package/dist/modules/socket-gateway/interfaces/project-creation-log.interface.js +2 -0
  259. package/dist/modules/socket-gateway/interfaces/project-creation-log.interface.js.map +1 -0
  260. package/dist/modules/socket-gateway/socket-gateway.module.d.ts +28 -0
  261. package/dist/modules/socket-gateway/socket-gateway.module.d.ts.map +1 -0
  262. package/dist/modules/socket-gateway/socket-gateway.module.js +92 -0
  263. package/dist/modules/socket-gateway/socket-gateway.module.js.map +1 -0
  264. 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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"}