@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,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,2 @@
1
+ import { z } from 'zod';
2
+ //# sourceMappingURL=tool-types.js.map
@@ -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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"}