repoburg 1.0.54 → 1.0.57
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/backend/.env +3 -1
- package/backend/coverage/clover.xml +2409 -2355
- package/backend/coverage/coverage-final.json +99 -96
- package/backend/coverage/lcov-report/index.html +356 -341
- package/backend/coverage/lcov-report/src/action-execution/action-execution.module.ts.html +12 -12
- package/backend/coverage/lcov-report/src/action-execution/action-execution.service.ts.html +140 -62
- package/backend/coverage/lcov-report/src/action-execution/index.html +28 -28
- package/backend/coverage/lcov-report/src/ai-actions/ai-action-batch.service.ts.html +188 -188
- package/backend/coverage/lcov-report/src/ai-actions/ai-action-creation.service.ts.html +284 -236
- package/backend/coverage/lcov-report/src/ai-actions/ai-actions.controller.ts.html +109 -109
- package/backend/coverage/lcov-report/src/ai-actions/ai-actions.module.ts.html +28 -28
- package/backend/coverage/lcov-report/src/ai-actions/ai-actions.service.ts.html +193 -193
- package/backend/coverage/lcov-report/src/ai-actions/index.html +61 -61
- package/backend/coverage/lcov-report/src/app.controller.ts.html +24 -24
- package/backend/coverage/lcov-report/src/app.module.ts.html +68 -65
- package/backend/coverage/lcov-report/src/app.service.ts.html +46 -13
- package/backend/coverage/lcov-report/src/application-state/application-state.controller.ts.html +87 -33
- package/backend/coverage/lcov-report/src/application-state/application-state.module.ts.html +18 -18
- package/backend/coverage/lcov-report/src/application-state/application-state.service.ts.html +113 -68
- package/backend/coverage/lcov-report/src/application-state/dto/index.html +42 -27
- package/backend/coverage/lcov-report/src/application-state/dto/set-auto-context-fetch-enabled.dto.ts.html +12 -12
- package/backend/coverage/lcov-report/src/application-state/dto/set-orchestration-timeout.dto.ts.html +103 -0
- package/backend/coverage/lcov-report/src/application-state/dto/set-theme.dto.ts.html +12 -12
- package/backend/coverage/lcov-report/src/application-state/dto/set-websocket-enabled.dto.ts.html +12 -12
- package/backend/coverage/lcov-report/src/application-state/index.html +37 -37
- package/backend/coverage/lcov-report/src/context-generation/context-generation.module.ts.html +16 -16
- package/backend/coverage/lcov-report/src/context-generation/context-generation.service.ts.html +222 -222
- package/backend/coverage/lcov-report/src/context-generation/index.html +28 -28
- package/backend/coverage/lcov-report/src/context-snippets/context-snippets.controller.ts.html +31 -31
- package/backend/coverage/lcov-report/src/context-snippets/context-snippets.module.ts.html +20 -20
- package/backend/coverage/lcov-report/src/context-snippets/context-snippets.service.ts.html +26 -26
- package/backend/coverage/lcov-report/src/context-snippets/dto/context-snippet.dto.ts.html +28 -28
- package/backend/coverage/lcov-report/src/context-snippets/dto/index.html +13 -13
- package/backend/coverage/lcov-report/src/context-snippets/index.html +31 -31
- package/backend/coverage/lcov-report/src/context-templates/context-templates.controller.ts.html +45 -45
- package/backend/coverage/lcov-report/src/context-templates/context-templates.module.ts.html +20 -20
- package/backend/coverage/lcov-report/src/context-templates/context-templates.service.ts.html +87 -84
- package/backend/coverage/lcov-report/src/context-templates/dto/context-template.dto.ts.html +48 -48
- package/backend/coverage/lcov-report/src/context-templates/dto/index.html +13 -13
- package/backend/coverage/lcov-report/src/context-templates/index.html +36 -36
- package/backend/coverage/lcov-report/src/core-entities/ai-action.entity.ts.html +48 -48
- package/backend/coverage/lcov-report/src/core-entities/application-state.entity.ts.html +14 -14
- package/backend/coverage/lcov-report/src/core-entities/base.entity.ts.html +22 -22
- package/backend/coverage/lcov-report/src/core-entities/context-snippet.entity.ts.html +18 -18
- package/backend/coverage/lcov-report/src/core-entities/context-template.entity.ts.html +52 -52
- package/backend/coverage/lcov-report/src/core-entities/custom-snippet.entity.ts.html +20 -20
- package/backend/coverage/lcov-report/src/core-entities/execution-log.entity.ts.html +26 -26
- package/backend/coverage/lcov-report/src/core-entities/index.html +112 -112
- package/backend/coverage/lcov-report/src/core-entities/index.ts.html +28 -28
- package/backend/coverage/lcov-report/src/core-entities/project.entity.ts.html +24 -24
- package/backend/coverage/lcov-report/src/core-entities/session-input.entity.ts.html +59 -50
- package/backend/coverage/lcov-report/src/core-entities/session.entity.ts.html +56 -56
- package/backend/coverage/lcov-report/src/core-entities/system-prompt.entity.ts.html +28 -28
- package/backend/coverage/lcov-report/src/custom-snippets/custom-snippets.controller.ts.html +30 -30
- package/backend/coverage/lcov-report/src/custom-snippets/custom-snippets.module.ts.html +18 -18
- package/backend/coverage/lcov-report/src/custom-snippets/custom-snippets.service.ts.html +20 -20
- package/backend/coverage/lcov-report/src/custom-snippets/dto/custom-snippet.dto.ts.html +28 -28
- package/backend/coverage/lcov-report/src/custom-snippets/dto/index.html +13 -13
- package/backend/coverage/lcov-report/src/custom-snippets/index.html +32 -32
- package/backend/coverage/lcov-report/src/events/events.gateway.ts.html +46 -46
- package/backend/coverage/lcov-report/src/events/events.module.ts.html +12 -12
- package/backend/coverage/lcov-report/src/events/index.html +28 -28
- package/backend/coverage/lcov-report/src/execution-logs/dto/execution-log.dto.ts.html +1 -1
- package/backend/coverage/lcov-report/src/execution-logs/dto/index.html +1 -1
- package/backend/coverage/lcov-report/src/execution-logs/execution-logs.controller.ts.html +18 -18
- package/backend/coverage/lcov-report/src/execution-logs/execution-logs.module.ts.html +18 -18
- package/backend/coverage/lcov-report/src/execution-logs/execution-logs.service.ts.html +32 -32
- package/backend/coverage/lcov-report/src/execution-logs/index.html +33 -33
- package/backend/coverage/lcov-report/src/http-exception.filter.ts.html +55 -55
- package/backend/coverage/lcov-report/src/index.html +44 -44
- package/backend/coverage/lcov-report/src/llm-response-parser/dto/ai-action.dto.ts.html +67 -67
- package/backend/coverage/lcov-report/src/llm-response-parser/dto/index.html +21 -21
- package/backend/coverage/lcov-report/src/llm-response-parser/errors/index.html +17 -17
- package/backend/coverage/lcov-report/src/llm-response-parser/errors/parsing.error.ts.html +19 -19
- package/backend/coverage/lcov-report/src/llm-response-parser/index.html +35 -35
- package/backend/coverage/lcov-report/src/llm-response-parser/llm-response-parser.module.ts.html +12 -12
- package/backend/coverage/lcov-report/src/llm-response-parser/llm-response-parser.service.ts.html +208 -208
- package/backend/coverage/lcov-report/src/llm-response-parser/parsing.constants.ts.html +38 -38
- package/backend/coverage/lcov-report/src/llm-responses/dto/index.html +21 -21
- package/backend/coverage/lcov-report/src/llm-responses/dto/submit-llm-response.dto.ts.html +28 -28
- package/backend/coverage/lcov-report/src/llm-responses/index.html +38 -38
- package/backend/coverage/lcov-report/src/llm-responses/llm-responses.controller.ts.html +24 -24
- package/backend/coverage/lcov-report/src/llm-responses/llm-responses.module.ts.html +38 -35
- package/backend/coverage/lcov-report/src/llm-responses/llm-responses.service.ts.html +107 -86
- package/backend/coverage/lcov-report/src/main.ts.html +1 -1
- package/backend/coverage/lcov-report/src/orchestration/dto/index.html +13 -13
- package/backend/coverage/lcov-report/src/orchestration/dto/orchestration.dto.ts.html +30 -45
- package/backend/coverage/lcov-report/src/orchestration/index.html +74 -74
- package/backend/coverage/lcov-report/src/orchestration/orchestration-fs.service.ts.html +245 -128
- package/backend/coverage/lcov-report/src/orchestration/orchestration-parser.service.ts.html +32 -200
- package/backend/coverage/lcov-report/src/orchestration/orchestration.controller.ts.html +72 -102
- package/backend/coverage/lcov-report/src/orchestration/orchestration.module.ts.html +35 -38
- package/backend/coverage/lcov-report/src/orchestration/orchestration.service.ts.html +317 -425
- package/backend/coverage/lcov-report/src/orchestration/orchestration.types.ts.html +41 -35
- package/backend/coverage/lcov-report/src/projects/dto/index.html +13 -13
- package/backend/coverage/lcov-report/src/projects/dto/project.dto.ts.html +20 -20
- package/backend/coverage/lcov-report/src/projects/index.html +32 -32
- package/backend/coverage/lcov-report/src/projects/projects.controller.ts.html +28 -28
- package/backend/coverage/lcov-report/src/projects/projects.module.ts.html +18 -18
- package/backend/coverage/lcov-report/src/projects/projects.service.ts.html +20 -20
- package/backend/coverage/lcov-report/src/seeding/context-template-seeding.service.ts.html +22 -22
- package/backend/coverage/lcov-report/src/seeding/custom-snippet-seeding.service.ts.html +21 -21
- package/backend/coverage/lcov-report/src/seeding/data/context-templates/default-followup_ad-hoc-focused-context.ts.html +1 -1
- package/backend/coverage/lcov-report/src/seeding/data/context-templates/default-initial_condensed-project-context.ts.html +1 -1
- package/backend/coverage/lcov-report/src/seeding/data/context-templates/default-initial_full-project-context.ts.html +1 -1
- package/backend/coverage/lcov-report/src/seeding/data/context-templates/index.html +1 -1
- package/backend/coverage/lcov-report/src/seeding/data/context-templates/pm-context.ts.html +1 -1
- package/backend/coverage/lcov-report/src/seeding/data/context-templates/pr-description.ts.html +1 -1
- package/backend/coverage/lcov-report/src/seeding/data/context-templates/sample_focused-tree.ts.html +1 -1
- package/backend/coverage/lcov-report/src/seeding/data/custom-snippets/default_rglob.ts.html +1 -1
- package/backend/coverage/lcov-report/src/seeding/data/custom-snippets/git-diff.ts.html +1 -1
- package/backend/coverage/lcov-report/src/seeding/data/custom-snippets/index.html +1 -1
- package/backend/coverage/lcov-report/src/seeding/data/custom-snippets/rg-exclude.ts.html +1 -1
- package/backend/coverage/lcov-report/src/seeding/data/custom-snippets/rg-search-glob.ts.html +1 -1
- package/backend/coverage/lcov-report/src/seeding/data/custom-snippets/rg-search.ts.html +1 -1
- package/backend/coverage/lcov-report/src/seeding/data/custom-snippets/run-command.ts.html +1 -1
- package/backend/coverage/lcov-report/src/seeding/data/custom-snippets/tree.ts.html +1 -1
- package/backend/coverage/lcov-report/src/seeding/data/custom-snippets/usr-adhoc-incl.ts.html +1 -1
- package/backend/coverage/lcov-report/src/seeding/data/custom-snippets/usr-input-incl.ts.html +1 -1
- package/backend/coverage/lcov-report/src/seeding/data/system-prompts/codebase-explorer.ts.html +1 -1
- package/backend/coverage/lcov-report/src/seeding/data/system-prompts/default_multi-file-action-generator-with-requester.ts.html +8 -2
- package/backend/coverage/lcov-report/src/seeding/data/system-prompts/index.html +3 -3
- package/backend/coverage/lcov-report/src/seeding/data/system-prompts/packup.ts.html +1 -1
- package/backend/coverage/lcov-report/src/seeding/data/system-prompts/refactor-split.ts.html +244 -0
- package/backend/coverage/lcov-report/src/seeding/index.html +47 -47
- package/backend/coverage/lcov-report/src/seeding/seeding.module.ts.html +24 -24
- package/backend/coverage/lcov-report/src/seeding/seeding.service.ts.html +27 -27
- package/backend/coverage/lcov-report/src/seeding/system-prompt-seeding.service.ts.html +21 -21
- package/backend/coverage/lcov-report/src/session-followup/index.html +28 -28
- package/backend/coverage/lcov-report/src/session-followup/session-followup.module.ts.html +22 -22
- package/backend/coverage/lcov-report/src/session-followup/session-followup.service.ts.html +44 -41
- package/backend/coverage/lcov-report/src/session-inputs/dto/index.html +13 -13
- package/backend/coverage/lcov-report/src/session-inputs/dto/session-input.dto.ts.html +40 -28
- package/backend/coverage/lcov-report/src/session-inputs/index.html +50 -50
- package/backend/coverage/lcov-report/src/session-inputs/session-input-context.service.ts.html +168 -156
- package/backend/coverage/lcov-report/src/session-inputs/session-inputs.controller.ts.html +36 -36
- package/backend/coverage/lcov-report/src/session-inputs/session-inputs.module.ts.html +40 -37
- package/backend/coverage/lcov-report/src/session-inputs/session-inputs.service.ts.html +242 -236
- package/backend/coverage/lcov-report/src/session-transfer/index.html +22 -22
- package/backend/coverage/lcov-report/src/session-transfer/session-transfer.module.ts.html +16 -16
- package/backend/coverage/lcov-report/src/session-transfer/session-transfer.service.ts.html +30 -30
- package/backend/coverage/lcov-report/src/sessions/dto/index.html +21 -21
- package/backend/coverage/lcov-report/src/sessions/dto/session.dto.ts.html +54 -54
- package/backend/coverage/lcov-report/src/sessions/index.html +39 -39
- package/backend/coverage/lcov-report/src/sessions/sessions.controller.ts.html +55 -55
- package/backend/coverage/lcov-report/src/sessions/sessions.module.ts.html +30 -30
- package/backend/coverage/lcov-report/src/sessions/sessions.service.ts.html +120 -120
- package/backend/coverage/lcov-report/src/system-prompts/dto/index.html +19 -19
- package/backend/coverage/lcov-report/src/system-prompts/dto/system-prompt.dto.ts.html +38 -29
- package/backend/coverage/lcov-report/src/system-prompts/index.html +37 -37
- package/backend/coverage/lcov-report/src/system-prompts/system-prompts.controller.ts.html +34 -34
- package/backend/coverage/lcov-report/src/system-prompts/system-prompts.module.ts.html +20 -20
- package/backend/coverage/lcov-report/src/system-prompts/system-prompts.service.ts.html +62 -62
- package/backend/coverage/lcov-report/src/timeout.interceptor.ts.html +1 -1
- package/backend/coverage/lcov-report/src/utils/fuzzy-search.ts.html +310 -0
- package/backend/coverage/lcov-report/src/utils/index.html +131 -0
- package/backend/coverage/lcov-report/src/utils/index.ts.html +88 -0
- package/backend/coverage/lcov-report/src/workspace/dto/index.html +13 -13
- package/backend/coverage/lcov-report/src/workspace/dto/search-workspace.dto.ts.html +24 -24
- package/backend/coverage/lcov-report/src/workspace/index.html +37 -37
- package/backend/coverage/lcov-report/src/workspace/workspace.controller.ts.html +26 -26
- package/backend/coverage/lcov-report/src/workspace/workspace.module.ts.html +16 -16
- package/backend/coverage/lcov-report/src/workspace/workspace.service.ts.html +259 -214
- package/backend/coverage/lcov.info +3284 -3186
- package/backend/dist/action-execution/action-execution.service.d.ts +2 -0
- package/backend/dist/action-execution/action-execution.service.js +31 -13
- package/backend/dist/action-execution/action-execution.service.js.map +1 -1
- package/backend/dist/context-generation/context-generation.service.d.ts +3 -3
- package/backend/dist/context-generation/context-generation.service.js.map +1 -1
- package/backend/dist/orchestration/orchestration.service.js +1 -0
- package/backend/dist/orchestration/orchestration.service.js.map +1 -1
- package/backend/dist/session-inputs/dto/session-input.dto.d.ts +1 -0
- package/backend/dist/session-inputs/dto/session-input.dto.js +5 -0
- package/backend/dist/session-inputs/dto/session-input.dto.js.map +1 -1
- package/backend/dist/session-inputs/session-input-context.service.js +12 -8
- package/backend/dist/session-inputs/session-input-context.service.js.map +1 -1
- package/backend/dist/session-inputs/session-inputs.service.js +2 -1
- package/backend/dist/session-inputs/session-inputs.service.js.map +1 -1
- package/backend/dist/tsconfig.build.tsbuildinfo +1 -1
- package/backend/dist/utils/fuzzy-search.d.ts +1 -0
- package/backend/dist/utils/fuzzy-search.js +54 -0
- package/backend/dist/utils/fuzzy-search.js.map +1 -0
- package/backend/dist/utils/index.d.ts +1 -0
- package/backend/dist/utils/index.js +18 -0
- package/backend/dist/utils/index.js.map +1 -0
- package/backend/dist/workspace/workspace.service.d.ts +2 -1
- package/backend/dist/workspace/workspace.service.js +53 -85
- package/backend/dist/workspace/workspace.service.js.map +1 -1
- package/backend/package.json +1 -1
- package/package.json +1 -1
- package/orchestration-test.txt +0 -3
|
@@ -23,30 +23,30 @@
|
|
|
23
23
|
<div class='clearfix'>
|
|
24
24
|
|
|
25
25
|
<div class='fl pad1y space-right2'>
|
|
26
|
-
<span class="strong">
|
|
26
|
+
<span class="strong">100% </span>
|
|
27
27
|
<span class="quiet">Statements</span>
|
|
28
|
-
<span class='fraction'>
|
|
28
|
+
<span class='fraction'>101/101</span>
|
|
29
29
|
</div>
|
|
30
30
|
|
|
31
31
|
|
|
32
32
|
<div class='fl pad1y space-right2'>
|
|
33
|
-
<span class="strong">
|
|
33
|
+
<span class="strong">95.45% </span>
|
|
34
34
|
<span class="quiet">Branches</span>
|
|
35
|
-
<span class='fraction'>
|
|
35
|
+
<span class='fraction'>21/22</span>
|
|
36
36
|
</div>
|
|
37
37
|
|
|
38
38
|
|
|
39
39
|
<div class='fl pad1y space-right2'>
|
|
40
|
-
<span class="strong">
|
|
40
|
+
<span class="strong">100% </span>
|
|
41
41
|
<span class="quiet">Functions</span>
|
|
42
|
-
<span class='fraction'>
|
|
42
|
+
<span class='fraction'>19/19</span>
|
|
43
43
|
</div>
|
|
44
44
|
|
|
45
45
|
|
|
46
46
|
<div class='fl pad1y space-right2'>
|
|
47
|
-
<span class="strong">
|
|
47
|
+
<span class="strong">100% </span>
|
|
48
48
|
<span class="quiet">Lines</span>
|
|
49
|
-
<span class='fraction'>
|
|
49
|
+
<span class='fraction'>95/95</span>
|
|
50
50
|
</div>
|
|
51
51
|
|
|
52
52
|
|
|
@@ -61,7 +61,7 @@
|
|
|
61
61
|
</div>
|
|
62
62
|
</template>
|
|
63
63
|
</div>
|
|
64
|
-
<div class='status-line
|
|
64
|
+
<div class='status-line high'></div>
|
|
65
65
|
<pre><table class="coverage">
|
|
66
66
|
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
|
|
67
67
|
<a name='L2'></a><a href='#L2'>2</a>
|
|
@@ -268,15 +268,31 @@
|
|
|
268
268
|
<a name='L203'></a><a href='#L203'>203</a>
|
|
269
269
|
<a name='L204'></a><a href='#L204'>204</a>
|
|
270
270
|
<a name='L205'></a><a href='#L205'>205</a>
|
|
271
|
-
<a name='L206'></a><a href='#L206'>206</a
|
|
272
|
-
<
|
|
273
|
-
<
|
|
271
|
+
<a name='L206'></a><a href='#L206'>206</a>
|
|
272
|
+
<a name='L207'></a><a href='#L207'>207</a>
|
|
273
|
+
<a name='L208'></a><a href='#L208'>208</a>
|
|
274
|
+
<a name='L209'></a><a href='#L209'>209</a>
|
|
275
|
+
<a name='L210'></a><a href='#L210'>210</a>
|
|
276
|
+
<a name='L211'></a><a href='#L211'>211</a>
|
|
277
|
+
<a name='L212'></a><a href='#L212'>212</a>
|
|
278
|
+
<a name='L213'></a><a href='#L213'>213</a>
|
|
279
|
+
<a name='L214'></a><a href='#L214'>214</a>
|
|
280
|
+
<a name='L215'></a><a href='#L215'>215</a>
|
|
281
|
+
<a name='L216'></a><a href='#L216'>216</a>
|
|
282
|
+
<a name='L217'></a><a href='#L217'>217</a>
|
|
283
|
+
<a name='L218'></a><a href='#L218'>218</a>
|
|
284
|
+
<a name='L219'></a><a href='#L219'>219</a>
|
|
285
|
+
<a name='L220'></a><a href='#L220'>220</a>
|
|
286
|
+
<a name='L221'></a><a href='#L221'>221</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">7x</span>
|
|
287
|
+
<span class="cline-any cline-yes">7x</span>
|
|
274
288
|
<span class="cline-any cline-neutral"> </span>
|
|
275
289
|
<span class="cline-any cline-neutral"> </span>
|
|
276
290
|
<span class="cline-any cline-neutral"> </span>
|
|
277
291
|
<span class="cline-any cline-neutral"> </span>
|
|
278
|
-
<span class="cline-any cline-
|
|
279
|
-
<span class="cline-any cline-
|
|
292
|
+
<span class="cline-any cline-yes">7x</span>
|
|
293
|
+
<span class="cline-any cline-yes">7x</span>
|
|
294
|
+
<span class="cline-any cline-yes">7x</span>
|
|
295
|
+
<span class="cline-any cline-yes">7x</span>
|
|
280
296
|
<span class="cline-any cline-neutral"> </span>
|
|
281
297
|
<span class="cline-any cline-neutral"> </span>
|
|
282
298
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -284,204 +300,219 @@
|
|
|
284
300
|
<span class="cline-any cline-neutral"> </span>
|
|
285
301
|
<span class="cline-any cline-neutral"> </span>
|
|
286
302
|
<span class="cline-any cline-neutral"> </span>
|
|
287
|
-
<span class="cline-any cline-
|
|
288
|
-
<span class="cline-any cline-
|
|
289
|
-
<span class="cline-any cline-
|
|
303
|
+
<span class="cline-any cline-yes">7x</span>
|
|
304
|
+
<span class="cline-any cline-yes">22x</span>
|
|
305
|
+
<span class="cline-any cline-yes">22x</span>
|
|
290
306
|
<span class="cline-any cline-neutral"> </span>
|
|
291
307
|
<span class="cline-any cline-neutral"> </span>
|
|
292
308
|
<span class="cline-any cline-neutral"> </span>
|
|
293
|
-
<span class="cline-any cline-
|
|
294
|
-
<span class="cline-any cline-
|
|
295
|
-
<span class="cline-any cline-
|
|
309
|
+
<span class="cline-any cline-yes">22x</span>
|
|
310
|
+
<span class="cline-any cline-yes">22x</span>
|
|
311
|
+
<span class="cline-any cline-yes">22x</span>
|
|
296
312
|
<span class="cline-any cline-neutral"> </span>
|
|
297
313
|
<span class="cline-any cline-neutral"> </span>
|
|
298
|
-
<span class="cline-any cline-
|
|
314
|
+
<span class="cline-any cline-yes">22x</span>
|
|
299
315
|
<span class="cline-any cline-neutral"> </span>
|
|
300
316
|
<span class="cline-any cline-neutral"> </span>
|
|
301
317
|
<span class="cline-any cline-neutral"> </span>
|
|
302
|
-
<span class="cline-any cline-no"> </span>
|
|
303
|
-
<span class="cline-any cline-no"> </span>
|
|
304
|
-
<span class="cline-any cline-no"> </span>
|
|
305
318
|
<span class="cline-any cline-neutral"> </span>
|
|
306
319
|
<span class="cline-any cline-neutral"> </span>
|
|
307
320
|
<span class="cline-any cline-neutral"> </span>
|
|
308
|
-
<span class="cline-any cline-
|
|
321
|
+
<span class="cline-any cline-yes">13x</span>
|
|
322
|
+
<span class="cline-any cline-yes">13x</span>
|
|
323
|
+
<span class="cline-any cline-yes">13x</span>
|
|
324
|
+
<span class="cline-any cline-yes">2x</span>
|
|
325
|
+
<span class="cline-any cline-yes">2x</span>
|
|
326
|
+
<span class="cline-any cline-yes">2x</span>
|
|
327
|
+
<span class="cline-any cline-yes">2x</span>
|
|
309
328
|
<span class="cline-any cline-neutral"> </span>
|
|
310
|
-
<span class="cline-any cline-
|
|
311
|
-
<span class="cline-any cline-no"> </span>
|
|
312
|
-
<span class="cline-any cline-no"> </span>
|
|
329
|
+
<span class="cline-any cline-yes">11x</span>
|
|
313
330
|
<span class="cline-any cline-neutral"> </span>
|
|
314
331
|
<span class="cline-any cline-neutral"> </span>
|
|
315
332
|
<span class="cline-any cline-neutral"> </span>
|
|
316
|
-
<span class="cline-any cline-no"> </span>
|
|
317
333
|
<span class="cline-any cline-neutral"> </span>
|
|
318
334
|
<span class="cline-any cline-neutral"> </span>
|
|
335
|
+
<span class="cline-any cline-yes">13x</span>
|
|
319
336
|
<span class="cline-any cline-neutral"> </span>
|
|
320
337
|
<span class="cline-any cline-neutral"> </span>
|
|
338
|
+
<span class="cline-any cline-yes">13x</span>
|
|
321
339
|
<span class="cline-any cline-neutral"> </span>
|
|
340
|
+
<span class="cline-any cline-yes">13x</span>
|
|
341
|
+
<span class="cline-any cline-yes">13x</span>
|
|
342
|
+
<span class="cline-any cline-yes">13x</span>
|
|
322
343
|
<span class="cline-any cline-neutral"> </span>
|
|
323
|
-
<span class="cline-any cline-no"> </span>
|
|
324
|
-
<span class="cline-any cline-no"> </span>
|
|
325
344
|
<span class="cline-any cline-neutral"> </span>
|
|
326
|
-
<span class="cline-any cline-no"> </span>
|
|
327
|
-
<span class="cline-any cline-no"> </span>
|
|
328
|
-
<span class="cline-any cline-no"> </span>
|
|
329
|
-
<span class="cline-any cline-no"> </span>
|
|
330
345
|
<span class="cline-any cline-neutral"> </span>
|
|
331
|
-
<span class="cline-any cline-no"> </span>
|
|
332
346
|
<span class="cline-any cline-neutral"> </span>
|
|
347
|
+
<span class="cline-any cline-yes">11x</span>
|
|
333
348
|
<span class="cline-any cline-neutral"> </span>
|
|
334
349
|
<span class="cline-any cline-neutral"> </span>
|
|
335
|
-
<span class="cline-any cline-
|
|
350
|
+
<span class="cline-any cline-yes">2x</span>
|
|
351
|
+
<span class="cline-any cline-yes">1x</span>
|
|
352
|
+
<span class="cline-any cline-yes">1x</span>
|
|
336
353
|
<span class="cline-any cline-neutral"> </span>
|
|
354
|
+
<span class="cline-any cline-yes">1x</span>
|
|
337
355
|
<span class="cline-any cline-neutral"> </span>
|
|
338
356
|
<span class="cline-any cline-neutral"> </span>
|
|
339
357
|
<span class="cline-any cline-neutral"> </span>
|
|
358
|
+
<span class="cline-any cline-yes">1x</span>
|
|
340
359
|
<span class="cline-any cline-neutral"> </span>
|
|
341
360
|
<span class="cline-any cline-neutral"> </span>
|
|
342
|
-
<span class="cline-any cline-no"> </span>
|
|
343
|
-
<span class="cline-any cline-no"> </span>
|
|
344
361
|
<span class="cline-any cline-neutral"> </span>
|
|
345
362
|
<span class="cline-any cline-neutral"> </span>
|
|
346
363
|
<span class="cline-any cline-neutral"> </span>
|
|
347
364
|
<span class="cline-any cline-neutral"> </span>
|
|
348
|
-
<span class="cline-any cline-
|
|
349
|
-
<span class="cline-any cline-
|
|
365
|
+
<span class="cline-any cline-yes">4x</span>
|
|
366
|
+
<span class="cline-any cline-yes">4x</span>
|
|
367
|
+
<span class="cline-any cline-yes">1x</span>
|
|
350
368
|
<span class="cline-any cline-neutral"> </span>
|
|
351
369
|
<span class="cline-any cline-neutral"> </span>
|
|
352
|
-
<span class="cline-any cline-no"> </span>
|
|
353
|
-
<span class="cline-any cline-no"> </span>
|
|
354
|
-
<span class="cline-any cline-no"> </span>
|
|
355
370
|
<span class="cline-any cline-neutral"> </span>
|
|
371
|
+
<span class="cline-any cline-yes">3x</span>
|
|
356
372
|
<span class="cline-any cline-neutral"> </span>
|
|
373
|
+
<span class="cline-any cline-yes">3x</span>
|
|
374
|
+
<span class="cline-any cline-yes">1x</span>
|
|
375
|
+
<span class="cline-any cline-yes">1x</span>
|
|
357
376
|
<span class="cline-any cline-neutral"> </span>
|
|
358
377
|
<span class="cline-any cline-neutral"> </span>
|
|
359
378
|
<span class="cline-any cline-neutral"> </span>
|
|
379
|
+
<span class="cline-any cline-yes">2x</span>
|
|
360
380
|
<span class="cline-any cline-neutral"> </span>
|
|
361
381
|
<span class="cline-any cline-neutral"> </span>
|
|
362
382
|
<span class="cline-any cline-neutral"> </span>
|
|
363
|
-
<span class="cline-any cline-no"> </span>
|
|
364
383
|
<span class="cline-any cline-neutral"> </span>
|
|
365
384
|
<span class="cline-any cline-neutral"> </span>
|
|
366
385
|
<span class="cline-any cline-neutral"> </span>
|
|
386
|
+
<span class="cline-any cline-yes">4x</span>
|
|
387
|
+
<span class="cline-any cline-yes">4x</span>
|
|
367
388
|
<span class="cline-any cline-neutral"> </span>
|
|
389
|
+
<span class="cline-any cline-yes">4x</span>
|
|
390
|
+
<span class="cline-any cline-yes">4x</span>
|
|
391
|
+
<span class="cline-any cline-yes">4x</span>
|
|
392
|
+
<span class="cline-any cline-yes">2x</span>
|
|
368
393
|
<span class="cline-any cline-neutral"> </span>
|
|
394
|
+
<span class="cline-any cline-yes">3x</span>
|
|
369
395
|
<span class="cline-any cline-neutral"> </span>
|
|
370
|
-
<span class="cline-any cline-no"> </span>
|
|
371
396
|
<span class="cline-any cline-neutral"> </span>
|
|
372
397
|
<span class="cline-any cline-neutral"> </span>
|
|
398
|
+
<span class="cline-any cline-yes">4x</span>
|
|
373
399
|
<span class="cline-any cline-neutral"> </span>
|
|
374
400
|
<span class="cline-any cline-neutral"> </span>
|
|
375
401
|
<span class="cline-any cline-neutral"> </span>
|
|
376
|
-
<span class="cline-any cline-no"> </span>
|
|
377
402
|
<span class="cline-any cline-neutral"> </span>
|
|
378
|
-
<span class="cline-any cline-no"> </span>
|
|
379
403
|
<span class="cline-any cline-neutral"> </span>
|
|
380
404
|
<span class="cline-any cline-neutral"> </span>
|
|
405
|
+
<span class="cline-any cline-yes">20x</span>
|
|
406
|
+
<span class="cline-any cline-yes">20x</span>
|
|
381
407
|
<span class="cline-any cline-neutral"> </span>
|
|
382
|
-
<span class="cline-any cline-no"> </span>
|
|
383
|
-
<span class="cline-any cline-no"> </span>
|
|
384
408
|
<span class="cline-any cline-neutral"> </span>
|
|
385
|
-
<span class="cline-any cline-no"> </span>
|
|
386
409
|
<span class="cline-any cline-neutral"> </span>
|
|
387
|
-
<span class="cline-any cline-no"> </span>
|
|
388
|
-
<span class="cline-any cline-no"> </span>
|
|
389
410
|
<span class="cline-any cline-neutral"> </span>
|
|
411
|
+
<span class="cline-any cline-yes">7x</span>
|
|
412
|
+
<span class="cline-any cline-yes">7x</span>
|
|
390
413
|
<span class="cline-any cline-neutral"> </span>
|
|
391
414
|
<span class="cline-any cline-neutral"> </span>
|
|
415
|
+
<span class="cline-any cline-yes">13x</span>
|
|
392
416
|
<span class="cline-any cline-neutral"> </span>
|
|
393
|
-
<span class="cline-any cline-no"> </span>
|
|
394
|
-
<span class="cline-any cline-no"> </span>
|
|
395
|
-
<span class="cline-any cline-no"> </span>
|
|
396
417
|
<span class="cline-any cline-neutral"> </span>
|
|
418
|
+
<span class="cline-any cline-yes">13x</span>
|
|
419
|
+
<span class="cline-any cline-yes">13x</span>
|
|
397
420
|
<span class="cline-any cline-neutral"> </span>
|
|
421
|
+
<span class="cline-any cline-yes">12x</span>
|
|
422
|
+
<span class="cline-any cline-yes">12x</span>
|
|
423
|
+
<span class="cline-any cline-yes">23x</span>
|
|
424
|
+
<span class="cline-any cline-yes">23x</span>
|
|
425
|
+
<span class="cline-any cline-yes">12x</span>
|
|
398
426
|
<span class="cline-any cline-neutral"> </span>
|
|
399
427
|
<span class="cline-any cline-neutral"> </span>
|
|
428
|
+
<span class="cline-any cline-yes">12x</span>
|
|
400
429
|
<span class="cline-any cline-neutral"> </span>
|
|
430
|
+
<span class="cline-any cline-yes">12x</span>
|
|
401
431
|
<span class="cline-any cline-neutral"> </span>
|
|
402
432
|
<span class="cline-any cline-neutral"> </span>
|
|
403
433
|
<span class="cline-any cline-neutral"> </span>
|
|
404
|
-
<span class="cline-any cline-
|
|
434
|
+
<span class="cline-any cline-yes">12x</span>
|
|
435
|
+
<span class="cline-any cline-yes">12x</span>
|
|
405
436
|
<span class="cline-any cline-neutral"> </span>
|
|
406
|
-
<span class="cline-any cline-
|
|
437
|
+
<span class="cline-any cline-yes">12x</span>
|
|
407
438
|
<span class="cline-any cline-neutral"> </span>
|
|
439
|
+
<span class="cline-any cline-yes">1x</span>
|
|
440
|
+
<span class="cline-any cline-yes">1x</span>
|
|
408
441
|
<span class="cline-any cline-neutral"> </span>
|
|
409
442
|
<span class="cline-any cline-neutral"> </span>
|
|
410
443
|
<span class="cline-any cline-neutral"> </span>
|
|
411
444
|
<span class="cline-any cline-neutral"> </span>
|
|
445
|
+
<span class="cline-any cline-yes">17x</span>
|
|
446
|
+
<span class="cline-any cline-yes">17x</span>
|
|
447
|
+
<span class="cline-any cline-yes">17x</span>
|
|
412
448
|
<span class="cline-any cline-neutral"> </span>
|
|
413
449
|
<span class="cline-any cline-neutral"> </span>
|
|
414
450
|
<span class="cline-any cline-neutral"> </span>
|
|
415
|
-
<span class="cline-any cline-no"> </span>
|
|
416
451
|
<span class="cline-any cline-neutral"> </span>
|
|
417
452
|
<span class="cline-any cline-neutral"> </span>
|
|
418
453
|
<span class="cline-any cline-neutral"> </span>
|
|
419
454
|
<span class="cline-any cline-neutral"> </span>
|
|
420
455
|
<span class="cline-any cline-neutral"> </span>
|
|
421
|
-
<span class="cline-any cline-
|
|
456
|
+
<span class="cline-any cline-yes">6x</span>
|
|
422
457
|
<span class="cline-any cline-neutral"> </span>
|
|
423
|
-
<span class="cline-any cline-
|
|
458
|
+
<span class="cline-any cline-yes">6x</span>
|
|
424
459
|
<span class="cline-any cline-neutral"> </span>
|
|
460
|
+
<span class="cline-any cline-yes">6x</span>
|
|
461
|
+
<span class="cline-any cline-yes">6x</span>
|
|
462
|
+
<span class="cline-any cline-yes">4x</span>
|
|
463
|
+
<span class="cline-any cline-yes">12x</span>
|
|
464
|
+
<span class="cline-any cline-yes">4x</span>
|
|
425
465
|
<span class="cline-any cline-neutral"> </span>
|
|
466
|
+
<span class="cline-any cline-yes">2x</span>
|
|
467
|
+
<span class="cline-any cline-yes">3x</span>
|
|
468
|
+
<span class="cline-any cline-yes">1x</span>
|
|
469
|
+
<span class="cline-any cline-yes">1x</span>
|
|
426
470
|
<span class="cline-any cline-neutral"> </span>
|
|
427
471
|
<span class="cline-any cline-neutral"> </span>
|
|
472
|
+
<span class="cline-any cline-yes">20x</span>
|
|
473
|
+
<span class="cline-any cline-yes">6x</span>
|
|
474
|
+
<span class="cline-any cline-yes">6x</span>
|
|
428
475
|
<span class="cline-any cline-neutral"> </span>
|
|
429
|
-
<span class="cline-any cline-no"> </span>
|
|
430
476
|
<span class="cline-any cline-neutral"> </span>
|
|
431
|
-
<span class="cline-any cline-
|
|
432
|
-
<span class="cline-any cline-
|
|
477
|
+
<span class="cline-any cline-yes">6x</span>
|
|
478
|
+
<span class="cline-any cline-yes">20x</span>
|
|
433
479
|
<span class="cline-any cline-neutral"> </span>
|
|
480
|
+
<span class="cline-any cline-yes">7x</span>
|
|
434
481
|
<span class="cline-any cline-neutral"> </span>
|
|
435
482
|
<span class="cline-any cline-neutral"> </span>
|
|
436
|
-
<span class="cline-any cline-
|
|
437
|
-
<span class="cline-any cline-
|
|
438
|
-
<span class="cline-any cline-
|
|
439
|
-
<span class="cline-any cline-
|
|
440
|
-
<span class="cline-any cline-no"> </span>
|
|
441
|
-
<span class="cline-any cline-no"> </span>
|
|
442
|
-
<span class="cline-any cline-no"> </span>
|
|
443
|
-
<span class="cline-any cline-no"> </span>
|
|
483
|
+
<span class="cline-any cline-yes">6x</span>
|
|
484
|
+
<span class="cline-any cline-yes">6x</span>
|
|
485
|
+
<span class="cline-any cline-yes">6x</span>
|
|
486
|
+
<span class="cline-any cline-yes">6x</span>
|
|
444
487
|
<span class="cline-any cline-neutral"> </span>
|
|
488
|
+
<span class="cline-any cline-yes">6x</span>
|
|
445
489
|
<span class="cline-any cline-neutral"> </span>
|
|
446
490
|
<span class="cline-any cline-neutral"> </span>
|
|
447
|
-
<span class="cline-any cline-no"> </span>
|
|
448
|
-
<span class="cline-any cline-no"> </span>
|
|
449
|
-
<span class="cline-any cline-no"> </span>
|
|
450
|
-
<span class="cline-any cline-no"> </span>
|
|
451
491
|
<span class="cline-any cline-neutral"> </span>
|
|
492
|
+
<span class="cline-any cline-yes">6x</span>
|
|
452
493
|
<span class="cline-any cline-neutral"> </span>
|
|
453
|
-
<span class="cline-any cline-no"> </span>
|
|
454
|
-
<span class="cline-any cline-no"> </span>
|
|
455
|
-
<span class="cline-any cline-no"> </span>
|
|
456
|
-
<span class="cline-any cline-no"> </span>
|
|
457
494
|
<span class="cline-any cline-neutral"> </span>
|
|
458
|
-
<span class="cline-any cline-no"> </span>
|
|
459
495
|
<span class="cline-any cline-neutral"> </span>
|
|
460
496
|
<span class="cline-any cline-neutral"> </span>
|
|
461
497
|
<span class="cline-any cline-neutral"> </span>
|
|
462
|
-
<span class="cline-any cline-no"> </span>
|
|
463
498
|
<span class="cline-any cline-neutral"> </span>
|
|
464
499
|
<span class="cline-any cline-neutral"> </span>
|
|
465
500
|
<span class="cline-any cline-neutral"> </span>
|
|
501
|
+
<span class="cline-any cline-yes">1x</span>
|
|
466
502
|
<span class="cline-any cline-neutral"> </span>
|
|
503
|
+
<span class="cline-any cline-yes">1x</span>
|
|
467
504
|
<span class="cline-any cline-neutral"> </span>
|
|
468
505
|
<span class="cline-any cline-neutral"> </span>
|
|
469
|
-
<span class="cline-any cline-neutral"> </span>
|
|
470
|
-
|
|
471
|
-
<span class="cline-any cline-no"> </span>
|
|
472
|
-
<span class="cline-any cline-neutral"> </span>
|
|
473
|
-
<span class="cline-any cline-no"> </span>
|
|
474
|
-
<span class="cline-any cline-neutral"> </span>
|
|
475
|
-
<span class="cline-any cline-neutral"> </span>
|
|
476
|
-
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js"><span class="cstat-no" title="statement not covered" >import { Injectable, Logger, BadRequestException } from '@nestjs/common';</span>
|
|
477
|
-
<span class="cstat-no" title="statement not covered" >import { glob } from 'glob';</span>
|
|
478
|
-
<span class="cstat-no" title="statement not covered" >import { ContextGenerationService } from '../context-generation/context-generation.service';</span>
|
|
506
|
+
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import { Injectable, Logger, BadRequestException } from '@nestjs/common';
|
|
507
|
+
import { ContextGenerationService } from '../context-generation/context-generation.service';
|
|
479
508
|
import {
|
|
480
509
|
SearchWorkspaceResponseDto,
|
|
481
510
|
SearchResultItemDto,
|
|
482
511
|
} from './dto/search-workspace.dto';
|
|
483
|
-
|
|
484
|
-
|
|
512
|
+
import * as fs from 'fs/promises';
|
|
513
|
+
import * as path from 'path';
|
|
514
|
+
import { fuzzySearch } from '../utils';
|
|
515
|
+
import { exec, ExecOptions } from 'child_process';
|
|
485
516
|
|
|
486
517
|
interface FileTree {
|
|
487
518
|
files: string[];
|
|
@@ -489,182 +520,196 @@ interface FileTree {
|
|
|
489
520
|
}
|
|
490
521
|
|
|
491
522
|
@Injectable()
|
|
492
|
-
export class
|
|
493
|
-
private readonly
|
|
494
|
-
private
|
|
523
|
+
export class WorkspaceService {
|
|
524
|
+
private readonly logger = new Logger(WorkspaceService.name);
|
|
525
|
+
private projectRoot: string =
|
|
495
526
|
process.env.REPOBURG_PROJECT_PATH || process.cwd();
|
|
496
527
|
|
|
497
528
|
// Cache for file tree
|
|
498
|
-
private
|
|
499
|
-
private
|
|
500
|
-
private readonly
|
|
529
|
+
private fileTreeCache: FileTree | null = null;
|
|
530
|
+
private fileTreeCacheTimestamp: number | null = null;
|
|
531
|
+
private readonly CACHE_TTL_MS = 5 * 60 * 1000; // 5 minutes
|
|
501
532
|
|
|
502
|
-
|
|
503
|
-
private readonly
|
|
533
|
+
constructor(
|
|
534
|
+
private readonly contextGenerationService: ContextGenerationService,
|
|
504
535
|
) {}
|
|
505
536
|
|
|
506
|
-
private
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
537
|
+
private execAsync(
|
|
538
|
+
command: string,
|
|
539
|
+
options: ExecOptions,
|
|
540
|
+
): Promise<{ stdout: string; stderr: string }> {
|
|
541
|
+
return new Promise((resolve, reject) => {
|
|
542
|
+
exec(command, options, (error, stdout, stderr) => {
|
|
543
|
+
if (error) {
|
|
544
|
+
error['stdout'] = stdout;
|
|
545
|
+
error['stderr'] = stderr;
|
|
546
|
+
reject(error);
|
|
547
|
+
return;
|
|
548
|
+
}
|
|
549
|
+
resolve({ stdout, stderr });
|
|
550
|
+
});
|
|
551
|
+
});
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
private async getFilesFromRg(): Promise<string[]> {
|
|
555
|
+
const rgCommand = await this.contextGenerationService.getCommandPath('rg');
|
|
556
|
+
// --files: uses gitignore, .ignore, etc. by default.
|
|
557
|
+
// --hidden: ensures hidden files (dotfiles) are included, unless ignored.
|
|
558
|
+
const command = `${rgCommand} --files --hidden --glob '!.git'`;
|
|
559
|
+
|
|
560
|
+
try {
|
|
561
|
+
this.logger.log(`Executing for file list: ${command}`);
|
|
562
|
+
const { stdout } = await this.execAsync(command, {
|
|
563
|
+
cwd: this.projectRoot,
|
|
564
|
+
maxBuffer: 256 * 1024 * 1024, // 256MB
|
|
565
|
+
timeout: 10000, // 10s
|
|
566
|
+
});
|
|
567
|
+
return stdout.trim().split('\n').filter(Boolean);
|
|
568
|
+
} catch (error) {
|
|
569
|
+
// rg exits with code 1 if no files are found with --files, which is not an error for us.
|
|
570
|
+
if (error.code === 1 && error.stdout === '' && error.stderr === '') {
|
|
571
|
+
this.logger.log('rg --files returned no files.');
|
|
572
|
+
return [];
|
|
573
|
+
}
|
|
574
|
+
this.logger.error(
|
|
575
|
+
`Failed to get file list from rg: ${error.message}`,
|
|
576
|
+
error.stack,
|
|
577
|
+
);
|
|
578
|
+
throw new Error(
|
|
579
|
+
`Could not retrieve file list from RipGrep. Is 'rg' installed and in your PATH?`,
|
|
580
|
+
);
|
|
581
|
+
}
|
|
582
|
+
}
|
|
583
|
+
|
|
584
|
+
private resolveAndValidatePath(unsafePath: string): string {
|
|
585
|
+
const normalizedPath = path.normalize(unsafePath);
|
|
586
|
+
if (path.isAbsolute(normalizedPath)) {
|
|
587
|
+
throw new BadRequestException(
|
|
510
588
|
`Absolute paths are not allowed: ${unsafePath}`,
|
|
511
589
|
);
|
|
512
590
|
}
|
|
513
|
-
const resolvedPath =
|
|
591
|
+
const resolvedPath = path.resolve(this.projectRoot, normalizedPath);
|
|
514
592
|
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
593
|
+
if (!resolvedPath.startsWith(this.projectRoot)) {
|
|
594
|
+
this.logger.warn(`Path traversal attempt detected: ${unsafePath}`);
|
|
595
|
+
throw new BadRequestException(
|
|
518
596
|
`Path traversal is not allowed. Access denied for path: ${unsafePath}`,
|
|
519
597
|
);
|
|
520
598
|
}
|
|
521
|
-
|
|
599
|
+
return resolvedPath;
|
|
522
600
|
}
|
|
523
601
|
|
|
524
|
-
|
|
602
|
+
async validatePaths(paths: {
|
|
525
603
|
files?: string[];
|
|
526
604
|
folders?: string[];
|
|
527
605
|
}): Promise<{ valid: boolean; invalidPaths: string[] }> {
|
|
528
|
-
const invalidPaths: string[] =
|
|
529
|
-
const allPaths = <span class="
|
|
606
|
+
const invalidPaths: string[] = [];
|
|
607
|
+
const allPaths = [...(paths.files || <span class="branch-1 cbranch-no" title="branch not covered" >[])</span>, ...(paths.folders || [])];
|
|
530
608
|
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
const safePath =
|
|
534
|
-
|
|
609
|
+
for (const p of allPaths) {
|
|
610
|
+
try {
|
|
611
|
+
const safePath = this.resolveAndValidatePath(p);
|
|
612
|
+
await fs.access(safePath);
|
|
535
613
|
} catch (e) {
|
|
536
|
-
|
|
614
|
+
invalidPaths.push(p);
|
|
537
615
|
}
|
|
538
616
|
}
|
|
539
617
|
|
|
540
|
-
|
|
618
|
+
return {
|
|
541
619
|
valid: invalidPaths.length === 0,
|
|
542
620
|
invalidPaths,
|
|
543
621
|
};
|
|
544
622
|
}
|
|
545
623
|
|
|
546
|
-
|
|
547
|
-
const now =
|
|
548
|
-
|
|
624
|
+
async getFileTree(): Promise<FileTree> {
|
|
625
|
+
const now = Date.now();
|
|
626
|
+
if (
|
|
549
627
|
this.fileTreeCache &&
|
|
550
628
|
this.fileTreeCacheTimestamp &&
|
|
551
629
|
now - this.fileTreeCacheTimestamp < this.CACHE_TTL_MS
|
|
552
630
|
) {
|
|
553
|
-
|
|
554
|
-
|
|
631
|
+
this.logger.log('Returning file tree from cache.');
|
|
632
|
+
return this.fileTreeCache;
|
|
555
633
|
}
|
|
556
634
|
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
'**/dist/**',
|
|
563
|
-
'**/coverage/**',
|
|
564
|
-
'**/.next/**',
|
|
565
|
-
'**/data.json',
|
|
566
|
-
];
|
|
567
|
-
|
|
568
|
-
const files = <span class="cstat-no" title="statement not covered" >await glob('**/*', {</span>
|
|
569
|
-
cwd: this.projectRoot,
|
|
570
|
-
nodir: true,
|
|
571
|
-
ignore: ignorePatterns,
|
|
572
|
-
dot: true,
|
|
573
|
-
});
|
|
635
|
+
this.logger.log(
|
|
636
|
+
`Scanning project root for file tree with rg: ${this.projectRoot}`,
|
|
637
|
+
);
|
|
638
|
+
try {
|
|
639
|
+
const files = await this.getFilesFromRg();
|
|
574
640
|
|
|
575
|
-
const
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
641
|
+
const folderSet = new Set<string>();
|
|
642
|
+
files.forEach((file) => {
|
|
643
|
+
const parts = file.split(path.sep);
|
|
644
|
+
for (let i = 1; i < parts.length; i++) {
|
|
645
|
+
folderSet.add(parts.slice(0, i).join(path.sep));
|
|
646
|
+
}
|
|
579
647
|
});
|
|
648
|
+
const folders = Array.from(folderSet);
|
|
580
649
|
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
<span class="cstat-no" title="statement not covered" > this.logger.log(</span>
|
|
650
|
+
this.logger.log(
|
|
584
651
|
`Found ${files.length} files and ${folders.length} folders.`,
|
|
585
652
|
);
|
|
586
653
|
|
|
587
|
-
|
|
588
|
-
|
|
654
|
+
this.fileTreeCache = { files, folders };
|
|
655
|
+
this.fileTreeCacheTimestamp = now;
|
|
589
656
|
|
|
590
|
-
|
|
657
|
+
return this.fileTreeCache;
|
|
591
658
|
} catch (error) {
|
|
592
|
-
|
|
593
|
-
|
|
659
|
+
this.logger.error('Failed to get file tree:', error);
|
|
660
|
+
throw error;
|
|
594
661
|
}
|
|
595
662
|
}
|
|
596
663
|
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
664
|
+
async invalidateFileTreeCache(): Promise<void> {
|
|
665
|
+
this.logger.log('Invalidating file tree cache.');
|
|
666
|
+
this.fileTreeCache = null;
|
|
667
|
+
this.fileTreeCacheTimestamp = null;
|
|
601
668
|
}
|
|
602
669
|
|
|
603
|
-
|
|
670
|
+
async search(
|
|
604
671
|
query: string,
|
|
605
672
|
type: 'files' | 'folders' | 'all',
|
|
606
673
|
page: number,
|
|
607
674
|
limit: number,
|
|
608
675
|
): Promise<SearchWorkspaceResponseDto> {
|
|
609
|
-
|
|
676
|
+
this.logger.log(`Searching for "${query}" (type: ${type})`);
|
|
610
677
|
|
|
611
|
-
const
|
|
612
|
-
'**/node_modules/**',
|
|
613
|
-
'**/.git/**',
|
|
614
|
-
'**/dist/**',
|
|
615
|
-
'**/coverage/**',
|
|
616
|
-
'**/.next/**',
|
|
617
|
-
'**/data.json',
|
|
618
|
-
];
|
|
678
|
+
const { files, folders } = await this.getFileTree();
|
|
619
679
|
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
mark: true,
|
|
631
|
-
nocase: true,
|
|
632
|
-
}); // `mark: true` adds a trailing `/` to directories
|
|
633
|
-
|
|
634
|
-
let results: SearchResultItemDto[] = <span class="cstat-no" title="statement not covered" >[];</span>
|
|
635
|
-
|
|
636
|
-
<span class="cstat-no" title="statement not covered" > if (type === 'all') {</span>
|
|
637
|
-
<span class="cstat-no" title="statement not covered" > results = allMatches.map(<span class="fstat-no" title="function not covered" >(p</span>) => (<span class="cstat-no" title="statement not covered" >{</span></span>
|
|
638
|
-
type: p.endsWith('/') ? 'folder' : 'file',
|
|
639
|
-
path: p.endsWith('/') ? p.slice(0, -1) : p,
|
|
640
|
-
}));
|
|
641
|
-
} else <span class="cstat-no" title="statement not covered" >if (type === 'files') {</span>
|
|
642
|
-
<span class="cstat-no" title="statement not covered" > results = allMatches</span>
|
|
643
|
-
.filter(<span class="fstat-no" title="function not covered" >(p</span>) => <span class="cstat-no" title="statement not covered" >!p.endsWith('/'))</span>
|
|
644
|
-
.map(<span class="fstat-no" title="function not covered" >(p</span>) => (<span class="cstat-no" title="statement not covered" >{ type: 'file', path: p })</span>);
|
|
645
|
-
} else <span class="cstat-no" title="statement not covered" ><span class="missing-if-branch" title="if path not taken" >I</span>if (type === 'folders') {</span>
|
|
646
|
-
<span class="cstat-no" title="statement not covered" > results = allMatches</span>
|
|
647
|
-
.filter(<span class="fstat-no" title="function not covered" >(p</span>) => <span class="cstat-no" title="statement not covered" >p.endsWith('/'))</span>
|
|
648
|
-
.map(<span class="fstat-no" title="function not covered" >(p</span>) => (<span class="cstat-no" title="statement not covered" >{ type: 'folder', path: p.slice(0, -1) })</span>);
|
|
680
|
+
let searchPool: { path: string; type: 'file' | 'folder' }[] = [];
|
|
681
|
+
if (type === 'all') {
|
|
682
|
+
searchPool = [
|
|
683
|
+
...files.map((p) => ({ path: p, type: 'file' as const })),
|
|
684
|
+
...folders.map((p) => ({ path: p, type: 'folder' as const })),
|
|
685
|
+
];
|
|
686
|
+
} else if (type === 'files') {
|
|
687
|
+
searchPool = files.map((p) => ({ path: p, type: 'file' as const }));
|
|
688
|
+
} else if (type === 'folders') {
|
|
689
|
+
searchPool = folders.map((p) => ({ path: p, type: 'folder' as const }));
|
|
649
690
|
}
|
|
650
691
|
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
692
|
+
const searchPoolStrings = searchPool.map((item) => item.path);
|
|
693
|
+
const matchedPaths = fuzzySearch(query, searchPoolStrings);
|
|
694
|
+
const matchedPathSet = new Set(matchedPaths);
|
|
695
|
+
|
|
696
|
+
// Filter the original pool to keep type information, and sort by fuzzy search result order
|
|
697
|
+
const results: SearchResultItemDto[] = searchPool
|
|
698
|
+
.filter((item) => matchedPathSet.has(item.path))
|
|
699
|
+
.sort(
|
|
700
|
+
(a, b) => matchedPaths.indexOf(a.path) - matchedPaths.indexOf(b.path),
|
|
701
|
+
);
|
|
657
702
|
|
|
658
|
-
const total =
|
|
659
|
-
const startIndex =
|
|
660
|
-
const endIndex =
|
|
661
|
-
const paginatedResults =
|
|
703
|
+
const total = results.length;
|
|
704
|
+
const startIndex = (page - 1) * limit;
|
|
705
|
+
const endIndex = page * limit;
|
|
706
|
+
const paginatedResults = results.slice(startIndex, endIndex);
|
|
662
707
|
|
|
663
|
-
|
|
664
|
-
`Search for "${query}" (type: ${type})
|
|
708
|
+
this.logger.log(
|
|
709
|
+
`Search for "${query}" (type: ${type}) found ${total} total results. Returning page ${page} with ${paginatedResults.length} items.`,
|
|
665
710
|
);
|
|
666
711
|
|
|
667
|
-
|
|
712
|
+
return {
|
|
668
713
|
results: paginatedResults,
|
|
669
714
|
total,
|
|
670
715
|
page,
|
|
@@ -672,10 +717,10 @@ export class <span class="cstat-no" title="statement not covered" ><span class="
|
|
|
672
717
|
};
|
|
673
718
|
}
|
|
674
719
|
|
|
675
|
-
|
|
676
|
-
|
|
720
|
+
async getFileContent(filePath: string): Promise<string> {
|
|
721
|
+
this.logger.log(`Reading content for file: ${filePath}`);
|
|
677
722
|
// Use the fetchFileContent method from ContextGenerationService to ensure path safety and get raw content.
|
|
678
|
-
|
|
723
|
+
return this.contextGenerationService.fetchFileContent(filePath);
|
|
679
724
|
}
|
|
680
725
|
}
|
|
681
726
|
</pre></td></tr></table></pre>
|
|
@@ -685,7 +730,7 @@ export class <span class="cstat-no" title="statement not covered" ><span class="
|
|
|
685
730
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
686
731
|
Code coverage generated by
|
|
687
732
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
688
|
-
at 2025-
|
|
733
|
+
at 2025-09-12T19:21:55.945Z
|
|
689
734
|
</div>
|
|
690
735
|
<script src="../../prettify.js"></script>
|
|
691
736
|
<script>
|