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.
Files changed (191) hide show
  1. package/backend/.env +3 -1
  2. package/backend/coverage/clover.xml +2409 -2355
  3. package/backend/coverage/coverage-final.json +99 -96
  4. package/backend/coverage/lcov-report/index.html +356 -341
  5. package/backend/coverage/lcov-report/src/action-execution/action-execution.module.ts.html +12 -12
  6. package/backend/coverage/lcov-report/src/action-execution/action-execution.service.ts.html +140 -62
  7. package/backend/coverage/lcov-report/src/action-execution/index.html +28 -28
  8. package/backend/coverage/lcov-report/src/ai-actions/ai-action-batch.service.ts.html +188 -188
  9. package/backend/coverage/lcov-report/src/ai-actions/ai-action-creation.service.ts.html +284 -236
  10. package/backend/coverage/lcov-report/src/ai-actions/ai-actions.controller.ts.html +109 -109
  11. package/backend/coverage/lcov-report/src/ai-actions/ai-actions.module.ts.html +28 -28
  12. package/backend/coverage/lcov-report/src/ai-actions/ai-actions.service.ts.html +193 -193
  13. package/backend/coverage/lcov-report/src/ai-actions/index.html +61 -61
  14. package/backend/coverage/lcov-report/src/app.controller.ts.html +24 -24
  15. package/backend/coverage/lcov-report/src/app.module.ts.html +68 -65
  16. package/backend/coverage/lcov-report/src/app.service.ts.html +46 -13
  17. package/backend/coverage/lcov-report/src/application-state/application-state.controller.ts.html +87 -33
  18. package/backend/coverage/lcov-report/src/application-state/application-state.module.ts.html +18 -18
  19. package/backend/coverage/lcov-report/src/application-state/application-state.service.ts.html +113 -68
  20. package/backend/coverage/lcov-report/src/application-state/dto/index.html +42 -27
  21. package/backend/coverage/lcov-report/src/application-state/dto/set-auto-context-fetch-enabled.dto.ts.html +12 -12
  22. package/backend/coverage/lcov-report/src/application-state/dto/set-orchestration-timeout.dto.ts.html +103 -0
  23. package/backend/coverage/lcov-report/src/application-state/dto/set-theme.dto.ts.html +12 -12
  24. package/backend/coverage/lcov-report/src/application-state/dto/set-websocket-enabled.dto.ts.html +12 -12
  25. package/backend/coverage/lcov-report/src/application-state/index.html +37 -37
  26. package/backend/coverage/lcov-report/src/context-generation/context-generation.module.ts.html +16 -16
  27. package/backend/coverage/lcov-report/src/context-generation/context-generation.service.ts.html +222 -222
  28. package/backend/coverage/lcov-report/src/context-generation/index.html +28 -28
  29. package/backend/coverage/lcov-report/src/context-snippets/context-snippets.controller.ts.html +31 -31
  30. package/backend/coverage/lcov-report/src/context-snippets/context-snippets.module.ts.html +20 -20
  31. package/backend/coverage/lcov-report/src/context-snippets/context-snippets.service.ts.html +26 -26
  32. package/backend/coverage/lcov-report/src/context-snippets/dto/context-snippet.dto.ts.html +28 -28
  33. package/backend/coverage/lcov-report/src/context-snippets/dto/index.html +13 -13
  34. package/backend/coverage/lcov-report/src/context-snippets/index.html +31 -31
  35. package/backend/coverage/lcov-report/src/context-templates/context-templates.controller.ts.html +45 -45
  36. package/backend/coverage/lcov-report/src/context-templates/context-templates.module.ts.html +20 -20
  37. package/backend/coverage/lcov-report/src/context-templates/context-templates.service.ts.html +87 -84
  38. package/backend/coverage/lcov-report/src/context-templates/dto/context-template.dto.ts.html +48 -48
  39. package/backend/coverage/lcov-report/src/context-templates/dto/index.html +13 -13
  40. package/backend/coverage/lcov-report/src/context-templates/index.html +36 -36
  41. package/backend/coverage/lcov-report/src/core-entities/ai-action.entity.ts.html +48 -48
  42. package/backend/coverage/lcov-report/src/core-entities/application-state.entity.ts.html +14 -14
  43. package/backend/coverage/lcov-report/src/core-entities/base.entity.ts.html +22 -22
  44. package/backend/coverage/lcov-report/src/core-entities/context-snippet.entity.ts.html +18 -18
  45. package/backend/coverage/lcov-report/src/core-entities/context-template.entity.ts.html +52 -52
  46. package/backend/coverage/lcov-report/src/core-entities/custom-snippet.entity.ts.html +20 -20
  47. package/backend/coverage/lcov-report/src/core-entities/execution-log.entity.ts.html +26 -26
  48. package/backend/coverage/lcov-report/src/core-entities/index.html +112 -112
  49. package/backend/coverage/lcov-report/src/core-entities/index.ts.html +28 -28
  50. package/backend/coverage/lcov-report/src/core-entities/project.entity.ts.html +24 -24
  51. package/backend/coverage/lcov-report/src/core-entities/session-input.entity.ts.html +59 -50
  52. package/backend/coverage/lcov-report/src/core-entities/session.entity.ts.html +56 -56
  53. package/backend/coverage/lcov-report/src/core-entities/system-prompt.entity.ts.html +28 -28
  54. package/backend/coverage/lcov-report/src/custom-snippets/custom-snippets.controller.ts.html +30 -30
  55. package/backend/coverage/lcov-report/src/custom-snippets/custom-snippets.module.ts.html +18 -18
  56. package/backend/coverage/lcov-report/src/custom-snippets/custom-snippets.service.ts.html +20 -20
  57. package/backend/coverage/lcov-report/src/custom-snippets/dto/custom-snippet.dto.ts.html +28 -28
  58. package/backend/coverage/lcov-report/src/custom-snippets/dto/index.html +13 -13
  59. package/backend/coverage/lcov-report/src/custom-snippets/index.html +32 -32
  60. package/backend/coverage/lcov-report/src/events/events.gateway.ts.html +46 -46
  61. package/backend/coverage/lcov-report/src/events/events.module.ts.html +12 -12
  62. package/backend/coverage/lcov-report/src/events/index.html +28 -28
  63. package/backend/coverage/lcov-report/src/execution-logs/dto/execution-log.dto.ts.html +1 -1
  64. package/backend/coverage/lcov-report/src/execution-logs/dto/index.html +1 -1
  65. package/backend/coverage/lcov-report/src/execution-logs/execution-logs.controller.ts.html +18 -18
  66. package/backend/coverage/lcov-report/src/execution-logs/execution-logs.module.ts.html +18 -18
  67. package/backend/coverage/lcov-report/src/execution-logs/execution-logs.service.ts.html +32 -32
  68. package/backend/coverage/lcov-report/src/execution-logs/index.html +33 -33
  69. package/backend/coverage/lcov-report/src/http-exception.filter.ts.html +55 -55
  70. package/backend/coverage/lcov-report/src/index.html +44 -44
  71. package/backend/coverage/lcov-report/src/llm-response-parser/dto/ai-action.dto.ts.html +67 -67
  72. package/backend/coverage/lcov-report/src/llm-response-parser/dto/index.html +21 -21
  73. package/backend/coverage/lcov-report/src/llm-response-parser/errors/index.html +17 -17
  74. package/backend/coverage/lcov-report/src/llm-response-parser/errors/parsing.error.ts.html +19 -19
  75. package/backend/coverage/lcov-report/src/llm-response-parser/index.html +35 -35
  76. package/backend/coverage/lcov-report/src/llm-response-parser/llm-response-parser.module.ts.html +12 -12
  77. package/backend/coverage/lcov-report/src/llm-response-parser/llm-response-parser.service.ts.html +208 -208
  78. package/backend/coverage/lcov-report/src/llm-response-parser/parsing.constants.ts.html +38 -38
  79. package/backend/coverage/lcov-report/src/llm-responses/dto/index.html +21 -21
  80. package/backend/coverage/lcov-report/src/llm-responses/dto/submit-llm-response.dto.ts.html +28 -28
  81. package/backend/coverage/lcov-report/src/llm-responses/index.html +38 -38
  82. package/backend/coverage/lcov-report/src/llm-responses/llm-responses.controller.ts.html +24 -24
  83. package/backend/coverage/lcov-report/src/llm-responses/llm-responses.module.ts.html +38 -35
  84. package/backend/coverage/lcov-report/src/llm-responses/llm-responses.service.ts.html +107 -86
  85. package/backend/coverage/lcov-report/src/main.ts.html +1 -1
  86. package/backend/coverage/lcov-report/src/orchestration/dto/index.html +13 -13
  87. package/backend/coverage/lcov-report/src/orchestration/dto/orchestration.dto.ts.html +30 -45
  88. package/backend/coverage/lcov-report/src/orchestration/index.html +74 -74
  89. package/backend/coverage/lcov-report/src/orchestration/orchestration-fs.service.ts.html +245 -128
  90. package/backend/coverage/lcov-report/src/orchestration/orchestration-parser.service.ts.html +32 -200
  91. package/backend/coverage/lcov-report/src/orchestration/orchestration.controller.ts.html +72 -102
  92. package/backend/coverage/lcov-report/src/orchestration/orchestration.module.ts.html +35 -38
  93. package/backend/coverage/lcov-report/src/orchestration/orchestration.service.ts.html +317 -425
  94. package/backend/coverage/lcov-report/src/orchestration/orchestration.types.ts.html +41 -35
  95. package/backend/coverage/lcov-report/src/projects/dto/index.html +13 -13
  96. package/backend/coverage/lcov-report/src/projects/dto/project.dto.ts.html +20 -20
  97. package/backend/coverage/lcov-report/src/projects/index.html +32 -32
  98. package/backend/coverage/lcov-report/src/projects/projects.controller.ts.html +28 -28
  99. package/backend/coverage/lcov-report/src/projects/projects.module.ts.html +18 -18
  100. package/backend/coverage/lcov-report/src/projects/projects.service.ts.html +20 -20
  101. package/backend/coverage/lcov-report/src/seeding/context-template-seeding.service.ts.html +22 -22
  102. package/backend/coverage/lcov-report/src/seeding/custom-snippet-seeding.service.ts.html +21 -21
  103. package/backend/coverage/lcov-report/src/seeding/data/context-templates/default-followup_ad-hoc-focused-context.ts.html +1 -1
  104. package/backend/coverage/lcov-report/src/seeding/data/context-templates/default-initial_condensed-project-context.ts.html +1 -1
  105. package/backend/coverage/lcov-report/src/seeding/data/context-templates/default-initial_full-project-context.ts.html +1 -1
  106. package/backend/coverage/lcov-report/src/seeding/data/context-templates/index.html +1 -1
  107. package/backend/coverage/lcov-report/src/seeding/data/context-templates/pm-context.ts.html +1 -1
  108. package/backend/coverage/lcov-report/src/seeding/data/context-templates/pr-description.ts.html +1 -1
  109. package/backend/coverage/lcov-report/src/seeding/data/context-templates/sample_focused-tree.ts.html +1 -1
  110. package/backend/coverage/lcov-report/src/seeding/data/custom-snippets/default_rglob.ts.html +1 -1
  111. package/backend/coverage/lcov-report/src/seeding/data/custom-snippets/git-diff.ts.html +1 -1
  112. package/backend/coverage/lcov-report/src/seeding/data/custom-snippets/index.html +1 -1
  113. package/backend/coverage/lcov-report/src/seeding/data/custom-snippets/rg-exclude.ts.html +1 -1
  114. package/backend/coverage/lcov-report/src/seeding/data/custom-snippets/rg-search-glob.ts.html +1 -1
  115. package/backend/coverage/lcov-report/src/seeding/data/custom-snippets/rg-search.ts.html +1 -1
  116. package/backend/coverage/lcov-report/src/seeding/data/custom-snippets/run-command.ts.html +1 -1
  117. package/backend/coverage/lcov-report/src/seeding/data/custom-snippets/tree.ts.html +1 -1
  118. package/backend/coverage/lcov-report/src/seeding/data/custom-snippets/usr-adhoc-incl.ts.html +1 -1
  119. package/backend/coverage/lcov-report/src/seeding/data/custom-snippets/usr-input-incl.ts.html +1 -1
  120. package/backend/coverage/lcov-report/src/seeding/data/system-prompts/codebase-explorer.ts.html +1 -1
  121. package/backend/coverage/lcov-report/src/seeding/data/system-prompts/default_multi-file-action-generator-with-requester.ts.html +8 -2
  122. package/backend/coverage/lcov-report/src/seeding/data/system-prompts/index.html +3 -3
  123. package/backend/coverage/lcov-report/src/seeding/data/system-prompts/packup.ts.html +1 -1
  124. package/backend/coverage/lcov-report/src/seeding/data/system-prompts/refactor-split.ts.html +244 -0
  125. package/backend/coverage/lcov-report/src/seeding/index.html +47 -47
  126. package/backend/coverage/lcov-report/src/seeding/seeding.module.ts.html +24 -24
  127. package/backend/coverage/lcov-report/src/seeding/seeding.service.ts.html +27 -27
  128. package/backend/coverage/lcov-report/src/seeding/system-prompt-seeding.service.ts.html +21 -21
  129. package/backend/coverage/lcov-report/src/session-followup/index.html +28 -28
  130. package/backend/coverage/lcov-report/src/session-followup/session-followup.module.ts.html +22 -22
  131. package/backend/coverage/lcov-report/src/session-followup/session-followup.service.ts.html +44 -41
  132. package/backend/coverage/lcov-report/src/session-inputs/dto/index.html +13 -13
  133. package/backend/coverage/lcov-report/src/session-inputs/dto/session-input.dto.ts.html +40 -28
  134. package/backend/coverage/lcov-report/src/session-inputs/index.html +50 -50
  135. package/backend/coverage/lcov-report/src/session-inputs/session-input-context.service.ts.html +168 -156
  136. package/backend/coverage/lcov-report/src/session-inputs/session-inputs.controller.ts.html +36 -36
  137. package/backend/coverage/lcov-report/src/session-inputs/session-inputs.module.ts.html +40 -37
  138. package/backend/coverage/lcov-report/src/session-inputs/session-inputs.service.ts.html +242 -236
  139. package/backend/coverage/lcov-report/src/session-transfer/index.html +22 -22
  140. package/backend/coverage/lcov-report/src/session-transfer/session-transfer.module.ts.html +16 -16
  141. package/backend/coverage/lcov-report/src/session-transfer/session-transfer.service.ts.html +30 -30
  142. package/backend/coverage/lcov-report/src/sessions/dto/index.html +21 -21
  143. package/backend/coverage/lcov-report/src/sessions/dto/session.dto.ts.html +54 -54
  144. package/backend/coverage/lcov-report/src/sessions/index.html +39 -39
  145. package/backend/coverage/lcov-report/src/sessions/sessions.controller.ts.html +55 -55
  146. package/backend/coverage/lcov-report/src/sessions/sessions.module.ts.html +30 -30
  147. package/backend/coverage/lcov-report/src/sessions/sessions.service.ts.html +120 -120
  148. package/backend/coverage/lcov-report/src/system-prompts/dto/index.html +19 -19
  149. package/backend/coverage/lcov-report/src/system-prompts/dto/system-prompt.dto.ts.html +38 -29
  150. package/backend/coverage/lcov-report/src/system-prompts/index.html +37 -37
  151. package/backend/coverage/lcov-report/src/system-prompts/system-prompts.controller.ts.html +34 -34
  152. package/backend/coverage/lcov-report/src/system-prompts/system-prompts.module.ts.html +20 -20
  153. package/backend/coverage/lcov-report/src/system-prompts/system-prompts.service.ts.html +62 -62
  154. package/backend/coverage/lcov-report/src/timeout.interceptor.ts.html +1 -1
  155. package/backend/coverage/lcov-report/src/utils/fuzzy-search.ts.html +310 -0
  156. package/backend/coverage/lcov-report/src/utils/index.html +131 -0
  157. package/backend/coverage/lcov-report/src/utils/index.ts.html +88 -0
  158. package/backend/coverage/lcov-report/src/workspace/dto/index.html +13 -13
  159. package/backend/coverage/lcov-report/src/workspace/dto/search-workspace.dto.ts.html +24 -24
  160. package/backend/coverage/lcov-report/src/workspace/index.html +37 -37
  161. package/backend/coverage/lcov-report/src/workspace/workspace.controller.ts.html +26 -26
  162. package/backend/coverage/lcov-report/src/workspace/workspace.module.ts.html +16 -16
  163. package/backend/coverage/lcov-report/src/workspace/workspace.service.ts.html +259 -214
  164. package/backend/coverage/lcov.info +3284 -3186
  165. package/backend/dist/action-execution/action-execution.service.d.ts +2 -0
  166. package/backend/dist/action-execution/action-execution.service.js +31 -13
  167. package/backend/dist/action-execution/action-execution.service.js.map +1 -1
  168. package/backend/dist/context-generation/context-generation.service.d.ts +3 -3
  169. package/backend/dist/context-generation/context-generation.service.js.map +1 -1
  170. package/backend/dist/orchestration/orchestration.service.js +1 -0
  171. package/backend/dist/orchestration/orchestration.service.js.map +1 -1
  172. package/backend/dist/session-inputs/dto/session-input.dto.d.ts +1 -0
  173. package/backend/dist/session-inputs/dto/session-input.dto.js +5 -0
  174. package/backend/dist/session-inputs/dto/session-input.dto.js.map +1 -1
  175. package/backend/dist/session-inputs/session-input-context.service.js +12 -8
  176. package/backend/dist/session-inputs/session-input-context.service.js.map +1 -1
  177. package/backend/dist/session-inputs/session-inputs.service.js +2 -1
  178. package/backend/dist/session-inputs/session-inputs.service.js.map +1 -1
  179. package/backend/dist/tsconfig.build.tsbuildinfo +1 -1
  180. package/backend/dist/utils/fuzzy-search.d.ts +1 -0
  181. package/backend/dist/utils/fuzzy-search.js +54 -0
  182. package/backend/dist/utils/fuzzy-search.js.map +1 -0
  183. package/backend/dist/utils/index.d.ts +1 -0
  184. package/backend/dist/utils/index.js +18 -0
  185. package/backend/dist/utils/index.js.map +1 -0
  186. package/backend/dist/workspace/workspace.service.d.ts +2 -1
  187. package/backend/dist/workspace/workspace.service.js +53 -85
  188. package/backend/dist/workspace/workspace.service.js.map +1 -1
  189. package/backend/package.json +1 -1
  190. package/package.json +1 -1
  191. 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">0% </span>
26
+ <span class="strong">91.81% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>0/110</span>
28
+ <span class='fraction'>101/110</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">0% </span>
33
+ <span class="strong">79.16% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>0/48</span>
35
+ <span class='fraction'>38/48</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">0% </span>
40
+ <span class="strong">83.33% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>0/6</span>
42
+ <span class='fraction'>5/6</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">0% </span>
47
+ <span class="strong">93.26% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>0/104</span>
49
+ <span class='fraction'>97/104</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 low'></div>
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>
@@ -304,11 +304,11 @@
304
304
  <a name='L239'></a><a href='#L239'>239</a>
305
305
  <a name='L240'></a><a href='#L240'>240</a>
306
306
  <a name='L241'></a><a href='#L241'>241</a>
307
- <a name='L242'></a><a href='#L242'>242</a></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
308
- <span class="cline-any cline-no">&nbsp;</span>
309
- <span class="cline-any cline-no">&nbsp;</span>
310
- <span class="cline-any cline-no">&nbsp;</span>
311
- <span class="cline-any cline-no">&nbsp;</span>
307
+ <a name='L242'></a><a href='#L242'>242</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">10x</span>
308
+ <span class="cline-any cline-yes">10x</span>
309
+ <span class="cline-any cline-yes">10x</span>
310
+ <span class="cline-any cline-yes">10x</span>
311
+ <span class="cline-any cline-yes">10x</span>
312
312
  <span class="cline-any cline-neutral">&nbsp;</span>
313
313
  <span class="cline-any cline-neutral">&nbsp;</span>
314
314
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -325,31 +325,31 @@
325
325
  <span class="cline-any cline-neutral">&nbsp;</span>
326
326
  <span class="cline-any cline-neutral">&nbsp;</span>
327
327
  <span class="cline-any cline-neutral">&nbsp;</span>
328
- <span class="cline-any cline-no">&nbsp;</span>
329
- <span class="cline-any cline-no">&nbsp;</span>
328
+ <span class="cline-any cline-yes">10x</span>
329
+ <span class="cline-any cline-yes">33x</span>
330
330
  <span class="cline-any cline-neutral">&nbsp;</span>
331
331
  <span class="cline-any cline-neutral">&nbsp;</span>
332
- <span class="cline-any cline-no">&nbsp;</span>
333
- <span class="cline-any cline-no">&nbsp;</span>
334
- <span class="cline-any cline-no">&nbsp;</span>
332
+ <span class="cline-any cline-yes">36x</span>
333
+ <span class="cline-any cline-yes">34x</span>
334
+ <span class="cline-any cline-yes">34x</span>
335
335
  <span class="cline-any cline-neutral">&nbsp;</span>
336
336
  <span class="cline-any cline-neutral">&nbsp;</span>
337
- <span class="cline-any cline-no">&nbsp;</span>
337
+ <span class="cline-any cline-yes">19x</span>
338
338
  <span class="cline-any cline-neutral">&nbsp;</span>
339
339
  <span class="cline-any cline-neutral">&nbsp;</span>
340
- <span class="cline-any cline-no">&nbsp;</span>
340
+ <span class="cline-any cline-yes">5x</span>
341
341
  <span class="cline-any cline-neutral">&nbsp;</span>
342
342
  <span class="cline-any cline-neutral">&nbsp;</span>
343
- <span class="cline-any cline-no">&nbsp;</span>
343
+ <span class="cline-any cline-yes">4x</span>
344
344
  <span class="cline-any cline-neutral">&nbsp;</span>
345
- <span class="cline-any cline-no">&nbsp;</span>
345
+ <span class="cline-any cline-yes">4x</span>
346
346
  <span class="cline-any cline-neutral">&nbsp;</span>
347
- <span class="cline-any cline-no">&nbsp;</span>
347
+ <span class="cline-any cline-yes">1x</span>
348
348
  <span class="cline-any cline-neutral">&nbsp;</span>
349
349
  <span class="cline-any cline-no">&nbsp;</span>
350
350
  <span class="cline-any cline-neutral">&nbsp;</span>
351
- <span class="cline-any cline-no">&nbsp;</span>
352
- <span class="cline-any cline-no">&nbsp;</span>
351
+ <span class="cline-any cline-yes">1x</span>
352
+ <span class="cline-any cline-yes">1x</span>
353
353
  <span class="cline-any cline-neutral">&nbsp;</span>
354
354
  <span class="cline-any cline-neutral">&nbsp;</span>
355
355
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -363,146 +363,146 @@
363
363
  <span class="cline-any cline-neutral">&nbsp;</span>
364
364
  <span class="cline-any cline-neutral">&nbsp;</span>
365
365
  <span class="cline-any cline-neutral">&nbsp;</span>
366
- <span class="cline-any cline-no">&nbsp;</span>
367
- <span class="cline-any cline-no">&nbsp;</span>
366
+ <span class="cline-any cline-yes">36x</span>
367
+ <span class="cline-any cline-yes">2x</span>
368
368
  <span class="cline-any cline-neutral">&nbsp;</span>
369
369
  <span class="cline-any cline-neutral">&nbsp;</span>
370
- <span class="cline-any cline-no">&nbsp;</span>
371
- <span class="cline-any cline-no">&nbsp;</span>
372
- <span class="cline-any cline-no">&nbsp;</span>
370
+ <span class="cline-any cline-yes">34x</span>
371
+ <span class="cline-any cline-yes">34x</span>
372
+ <span class="cline-any cline-yes">34x</span>
373
373
  <span class="cline-any cline-neutral">&nbsp;</span>
374
- <span class="cline-any cline-no">&nbsp;</span>
375
- <span class="cline-any cline-no">&nbsp;</span>
376
- <span class="cline-any cline-no">&nbsp;</span>
377
- <span class="cline-any cline-no">&nbsp;</span>
374
+ <span class="cline-any cline-yes">34x</span>
375
+ <span class="cline-any cline-yes">21x</span>
376
+ <span class="cline-any cline-yes">21x</span>
377
+ <span class="cline-any cline-yes">13x</span>
378
378
  <span class="cline-any cline-neutral">&nbsp;</span>
379
- <span class="cline-any cline-no">&nbsp;</span>
379
+ <span class="cline-any cline-yes">2x</span>
380
380
  <span class="cline-any cline-neutral">&nbsp;</span>
381
381
  <span class="cline-any cline-neutral">&nbsp;</span>
382
382
  <span class="cline-any cline-neutral">&nbsp;</span>
383
- <span class="cline-any cline-no">&nbsp;</span>
383
+ <span class="cline-any cline-yes">2x</span>
384
384
  <span class="cline-any cline-neutral">&nbsp;</span>
385
385
  <span class="cline-any cline-neutral">&nbsp;</span>
386
386
  <span class="cline-any cline-neutral">&nbsp;</span>
387
387
  <span class="cline-any cline-neutral">&nbsp;</span>
388
- <span class="cline-any cline-no">&nbsp;</span>
388
+ <span class="cline-any cline-yes">32x</span>
389
389
  <span class="cline-any cline-neutral">&nbsp;</span>
390
- <span class="cline-any cline-no">&nbsp;</span>
390
+ <span class="cline-any cline-yes">70x</span>
391
391
  <span class="cline-any cline-neutral">&nbsp;</span>
392
- <span class="cline-any cline-no">&nbsp;</span>
392
+ <span class="cline-any cline-yes">32x</span>
393
393
  <span class="cline-any cline-no">&nbsp;</span>
394
394
  <span class="cline-any cline-no">&nbsp;</span>
395
395
  <span class="cline-any cline-neutral">&nbsp;</span>
396
396
  <span class="cline-any cline-neutral">&nbsp;</span>
397
- <span class="cline-any cline-no">&nbsp;</span>
398
- <span class="cline-any cline-no">&nbsp;</span>
399
- <span class="cline-any cline-no">&nbsp;</span>
397
+ <span class="cline-any cline-yes">32x</span>
398
+ <span class="cline-any cline-yes">32x</span>
399
+ <span class="cline-any cline-yes">38x</span>
400
400
  <span class="cline-any cline-neutral">&nbsp;</span>
401
401
  <span class="cline-any cline-neutral">&nbsp;</span>
402
402
  <span class="cline-any cline-neutral">&nbsp;</span>
403
403
  <span class="cline-any cline-neutral">&nbsp;</span>
404
- <span class="cline-any cline-no">&nbsp;</span>
405
- <span class="cline-any cline-no">&nbsp;</span>
404
+ <span class="cline-any cline-yes">38x</span>
405
+ <span class="cline-any cline-yes">38x</span>
406
406
  <span class="cline-any cline-neutral">&nbsp;</span>
407
- <span class="cline-any cline-no">&nbsp;</span>
407
+ <span class="cline-any cline-yes">38x</span>
408
408
  <span class="cline-any cline-neutral">&nbsp;</span>
409
- <span class="cline-any cline-no">&nbsp;</span>
410
- <span class="cline-any cline-no">&nbsp;</span>
409
+ <span class="cline-any cline-yes">36x</span>
410
+ <span class="cline-any cline-yes">2x</span>
411
411
  <span class="cline-any cline-neutral">&nbsp;</span>
412
412
  <span class="cline-any cline-neutral">&nbsp;</span>
413
- <span class="cline-any cline-no">&nbsp;</span>
413
+ <span class="cline-any cline-yes">1x</span>
414
414
  <span class="cline-any cline-neutral">&nbsp;</span>
415
415
  <span class="cline-any cline-neutral">&nbsp;</span>
416
- <span class="cline-any cline-no">&nbsp;</span>
416
+ <span class="cline-any cline-yes">1x</span>
417
417
  <span class="cline-any cline-neutral">&nbsp;</span>
418
418
  <span class="cline-any cline-neutral">&nbsp;</span>
419
- <span class="cline-any cline-no">&nbsp;</span>
419
+ <span class="cline-any cline-yes">1x</span>
420
420
  <span class="cline-any cline-neutral">&nbsp;</span>
421
421
  <span class="cline-any cline-neutral">&nbsp;</span>
422
422
  <span class="cline-any cline-neutral">&nbsp;</span>
423
423
  <span class="cline-any cline-neutral">&nbsp;</span>
424
424
  <span class="cline-any cline-neutral">&nbsp;</span>
425
- <span class="cline-any cline-no">&nbsp;</span>
426
- <span class="cline-any cline-no">&nbsp;</span>
427
- <span class="cline-any cline-no">&nbsp;</span>
428
- <span class="cline-any cline-no">&nbsp;</span>
429
- <span class="cline-any cline-no">&nbsp;</span>
425
+ <span class="cline-any cline-yes">37x</span>
426
+ <span class="cline-any cline-yes">1x</span>
427
+ <span class="cline-any cline-yes">1x</span>
428
+ <span class="cline-any cline-yes">1x</span>
429
+ <span class="cline-any cline-yes">1x</span>
430
430
  <span class="cline-any cline-neutral">&nbsp;</span>
431
431
  <span class="cline-any cline-neutral">&nbsp;</span>
432
- <span class="cline-any cline-no">&nbsp;</span>
432
+ <span class="cline-any cline-yes">1x</span>
433
433
  <span class="cline-any cline-neutral">&nbsp;</span>
434
434
  <span class="cline-any cline-neutral">&nbsp;</span>
435
- <span class="cline-any cline-no">&nbsp;</span>
435
+ <span class="cline-any cline-yes">1x</span>
436
436
  <span class="cline-any cline-neutral">&nbsp;</span>
437
437
  <span class="cline-any cline-neutral">&nbsp;</span>
438
438
  <span class="cline-any cline-neutral">&nbsp;</span>
439
- <span class="cline-any cline-no">&nbsp;</span>
440
- <span class="cline-any cline-no">&nbsp;</span>
441
- <span class="cline-any cline-no">&nbsp;</span>
439
+ <span class="cline-any cline-yes">36x</span>
440
+ <span class="cline-any cline-yes">36x</span>
441
+ <span class="cline-any cline-yes">36x</span>
442
442
  <span class="cline-any cline-neutral">&nbsp;</span>
443
443
  <span class="cline-any cline-neutral">&nbsp;</span>
444
- <span class="cline-any cline-no">&nbsp;</span>
445
- <span class="cline-any cline-no">&nbsp;</span>
446
- <span class="cline-any cline-no">&nbsp;</span>
444
+ <span class="cline-any cline-yes">36x</span>
445
+ <span class="cline-any cline-yes">25x</span>
446
+ <span class="cline-any cline-yes">25x</span>
447
447
  <span class="cline-any cline-neutral">&nbsp;</span>
448
448
  <span class="cline-any cline-neutral">&nbsp;</span>
449
- <span class="cline-any cline-no">&nbsp;</span>
449
+ <span class="cline-any cline-yes">25x</span>
450
450
  <span class="cline-any cline-neutral">&nbsp;</span>
451
451
  <span class="cline-any cline-neutral">&nbsp;</span>
452
- <span class="cline-any cline-no">&nbsp;</span>
453
- <span class="cline-any cline-no">&nbsp;</span>
452
+ <span class="cline-any cline-yes">25x</span>
453
+ <span class="cline-any cline-yes">25x</span>
454
454
  <span class="cline-any cline-neutral">&nbsp;</span>
455
- <span class="cline-any cline-no">&nbsp;</span>
455
+ <span class="cline-any cline-yes">11x</span>
456
456
  <span class="cline-any cline-neutral">&nbsp;</span>
457
457
  <span class="cline-any cline-neutral">&nbsp;</span>
458
458
  <span class="cline-any cline-neutral">&nbsp;</span>
459
- <span class="cline-any cline-no">&nbsp;</span>
460
- <span class="cline-any cline-no">&nbsp;</span>
461
- <span class="cline-any cline-no">&nbsp;</span>
462
- <span class="cline-any cline-no">&nbsp;</span>
463
- <span class="cline-any cline-no">&nbsp;</span>
464
- <span class="cline-any cline-no">&nbsp;</span>
465
- <span class="cline-any cline-no">&nbsp;</span>
459
+ <span class="cline-any cline-yes">36x</span>
460
+ <span class="cline-any cline-yes">36x</span>
461
+ <span class="cline-any cline-yes">176x</span>
462
+ <span class="cline-any cline-yes">105x</span>
463
+ <span class="cline-any cline-yes">105x</span>
464
+ <span class="cline-any cline-yes">105x</span>
465
+ <span class="cline-any cline-yes">105x</span>
466
466
  <span class="cline-any cline-neutral">&nbsp;</span>
467
467
  <span class="cline-any cline-neutral">&nbsp;</span>
468
468
  <span class="cline-any cline-neutral">&nbsp;</span>
469
- <span class="cline-any cline-no">&nbsp;</span>
469
+ <span class="cline-any cline-yes">36x</span>
470
470
  <span class="cline-any cline-neutral">&nbsp;</span>
471
- <span class="cline-any cline-no">&nbsp;</span>
472
- <span class="cline-any cline-no">&nbsp;</span>
473
- <span class="cline-any cline-no">&nbsp;</span>
474
- <span class="cline-any cline-no">&nbsp;</span>
471
+ <span class="cline-any cline-yes">36x</span>
472
+ <span class="cline-any cline-yes">36x</span>
473
+ <span class="cline-any cline-yes">36x</span>
474
+ <span class="cline-any cline-yes">3x</span>
475
475
  <span class="cline-any cline-neutral">&nbsp;</span>
476
476
  <span class="cline-any cline-neutral">&nbsp;</span>
477
477
  <span class="cline-any cline-neutral">&nbsp;</span>
478
478
  <span class="cline-any cline-neutral">&nbsp;</span>
479
- <span class="cline-any cline-no">&nbsp;</span>
480
- <span class="cline-any cline-no">&nbsp;</span>
479
+ <span class="cline-any cline-yes">33x</span>
480
+ <span class="cline-any cline-yes">32x</span>
481
481
  <span class="cline-any cline-neutral">&nbsp;</span>
482
482
  <span class="cline-any cline-neutral">&nbsp;</span>
483
483
  <span class="cline-any cline-neutral">&nbsp;</span>
484
- <span class="cline-any cline-no">&nbsp;</span>
485
- <span class="cline-any cline-no">&nbsp;</span>
484
+ <span class="cline-any cline-yes">32x</span>
485
+ <span class="cline-any cline-yes">1x</span>
486
486
  <span class="cline-any cline-neutral">&nbsp;</span>
487
487
  <span class="cline-any cline-neutral">&nbsp;</span>
488
488
  <span class="cline-any cline-neutral">&nbsp;</span>
489
489
  <span class="cline-any cline-neutral">&nbsp;</span>
490
490
  <span class="cline-any cline-neutral">&nbsp;</span>
491
- <span class="cline-any cline-no">&nbsp;</span>
492
- <span class="cline-any cline-no">&nbsp;</span>
493
- <span class="cline-any cline-no">&nbsp;</span>
494
- <span class="cline-any cline-no">&nbsp;</span>
495
- <span class="cline-any cline-no">&nbsp;</span>
496
- <span class="cline-any cline-no">&nbsp;</span>
491
+ <span class="cline-any cline-yes">32x</span>
492
+ <span class="cline-any cline-yes">32x</span>
493
+ <span class="cline-any cline-yes">32x</span>
494
+ <span class="cline-any cline-yes">32x</span>
495
+ <span class="cline-any cline-yes">32x</span>
496
+ <span class="cline-any cline-yes">32x</span>
497
497
  <span class="cline-any cline-neutral">&nbsp;</span>
498
498
  <span class="cline-any cline-neutral">&nbsp;</span>
499
- <span class="cline-any cline-no">&nbsp;</span>
500
- <span class="cline-any cline-no">&nbsp;</span>
501
- <span class="cline-any cline-no">&nbsp;</span>
502
- <span class="cline-any cline-no">&nbsp;</span>
503
- <span class="cline-any cline-no">&nbsp;</span>
499
+ <span class="cline-any cline-yes">32x</span>
500
+ <span class="cline-any cline-yes">32x</span>
501
+ <span class="cline-any cline-yes">29x</span>
502
+ <span class="cline-any cline-yes">27x</span>
503
+ <span class="cline-any cline-yes">26x</span>
504
504
  <span class="cline-any cline-neutral">&nbsp;</span>
505
- <span class="cline-any cline-no">&nbsp;</span>
505
+ <span class="cline-any cline-yes">6x</span>
506
506
  <span class="cline-any cline-neutral">&nbsp;</span>
507
507
  <span class="cline-any cline-neutral">&nbsp;</span>
508
508
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -510,8 +510,8 @@
510
510
  <span class="cline-any cline-neutral">&nbsp;</span>
511
511
  <span class="cline-any cline-neutral">&nbsp;</span>
512
512
  <span class="cline-any cline-neutral">&nbsp;</span>
513
- <span class="cline-any cline-no">&nbsp;</span>
514
- <span class="cline-any cline-no">&nbsp;</span>
513
+ <span class="cline-any cline-yes">26x</span>
514
+ <span class="cline-any cline-yes">26x</span>
515
515
  <span class="cline-any cline-no">&nbsp;</span>
516
516
  <span class="cline-any cline-no">&nbsp;</span>
517
517
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -520,9 +520,9 @@
520
520
  <span class="cline-any cline-neutral">&nbsp;</span>
521
521
  <span class="cline-any cline-neutral">&nbsp;</span>
522
522
  <span class="cline-any cline-neutral">&nbsp;</span>
523
- <span class="cline-any cline-no">&nbsp;</span>
523
+ <span class="cline-any cline-yes">26x</span>
524
524
  <span class="cline-any cline-neutral">&nbsp;</span>
525
- <span class="cline-any cline-no">&nbsp;</span>
525
+ <span class="cline-any cline-yes">11x</span>
526
526
  <span class="cline-any cline-neutral">&nbsp;</span>
527
527
  <span class="cline-any cline-neutral">&nbsp;</span>
528
528
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -531,25 +531,25 @@
531
531
  <span class="cline-any cline-neutral">&nbsp;</span>
532
532
  <span class="cline-any cline-neutral">&nbsp;</span>
533
533
  <span class="cline-any cline-neutral">&nbsp;</span>
534
- <span class="cline-any cline-no">&nbsp;</span>
535
- <span class="cline-any cline-no">&nbsp;</span>
534
+ <span class="cline-any cline-yes">31x</span>
535
+ <span class="cline-any cline-yes">5x</span>
536
536
  <span class="cline-any cline-neutral">&nbsp;</span>
537
537
  <span class="cline-any cline-neutral">&nbsp;</span>
538
538
  <span class="cline-any cline-neutral">&nbsp;</span>
539
539
  <span class="cline-any cline-no">&nbsp;</span>
540
- <span class="cline-any cline-no">&nbsp;</span>
541
- <span class="cline-any cline-no">&nbsp;</span>
542
- <span class="cline-any cline-no">&nbsp;</span>
540
+ <span class="cline-any cline-yes">5x</span>
541
+ <span class="cline-any cline-yes">5x</span>
542
+ <span class="cline-any cline-yes">5x</span>
543
543
  <span class="cline-any cline-neutral">&nbsp;</span>
544
544
  <span class="cline-any cline-neutral">&nbsp;</span>
545
- <span class="cline-any cline-no">&nbsp;</span>
545
+ <span class="cline-any cline-yes">31x</span>
546
546
  <span class="cline-any cline-neutral">&nbsp;</span>
547
547
  <span class="cline-any cline-neutral">&nbsp;</span>
548
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js"><span class="cstat-no" title="statement not covered" >import { Injectable, Logger } from '@nestjs/common';</span>
549
- <span class="cstat-no" title="statement not covered" >import { validate } from 'class-validator';</span>
550
- <span class="cstat-no" title="statement not covered" >import { AIActionDto, AIActionType } from './dto/ai-action.dto';</span>
551
- <span class="cstat-no" title="statement not covered" >import { ParsingError } from './errors/parsing.error';</span>
552
- <span class="cstat-no" title="statement not covered" >import {</span>
548
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { Injectable, Logger } from '@nestjs/common';
549
+ import { validate } from 'class-validator';
550
+ import { AIActionDto, AIActionType } from './dto/ai-action.dto';
551
+ import { ParsingError } from './errors/parsing.error';
552
+ import {
553
553
  ACTION_ITEM_START_TAG,
554
554
  ACTION_ITEM_END_TAG,
555
555
  FIELD_CODE,
@@ -566,31 +566,31 @@
566
566
  } from './parsing.constants';
567
567
  &nbsp;
568
568
  @Injectable()
569
- export <span class="fstat-no" title="function not covered" >class <span class="cstat-no" title="statement not covered" ><span class="cstat-no" title="statement not covered" >L</span>lmResponseParserService<span class="cstat-no" title="statement not covered" > </span>{</span></span>
570
- private readonly <span class="cstat-no" title="statement not covered" >logger = new Logger(LlmResponseParserService.name);</span>
569
+ export class LlmResponseParserService {
570
+ private readonly logger = new Logger(LlmResponseParserService.name);
571
571
  &nbsp;
572
- private <span class="fstat-no" title="function not covered" >mapActionType(</span>type: string): AIActionType | undefined {
573
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!type) <span class="cstat-no" title="statement not covered" >return undefined;</span></span>
574
- const lowerType = <span class="cstat-no" title="statement not covered" >type.toLowerCase().trim();</span>
575
- <span class="cstat-no" title="statement not covered" > switch (lowerType) {</span>
572
+ private mapActionType(type: string): AIActionType | undefined {
573
+ if (!type) return undefined;
574
+ const lowerType = type.toLowerCase().trim();
575
+ switch (lowerType) {
576
576
  case 'create':
577
577
  case 'create_file':
578
- <span class="cstat-no" title="statement not covered" > return AIActionType.CREATE_FILE;</span>
578
+ return AIActionType.CREATE_FILE;
579
579
  case 'edit':
580
580
  case 'edit_file':
581
- <span class="cstat-no" title="statement not covered" > return AIActionType.EDIT_FILE;</span>
581
+ return AIActionType.EDIT_FILE;
582
582
  case 'delete':
583
583
  case 'delete_file':
584
- <span class="cstat-no" title="statement not covered" > return AIActionType.DELETE_FILE;</span>
584
+ return AIActionType.DELETE_FILE;
585
585
  case 'run_command':
586
- <span class="cstat-no" title="statement not covered" > return AIActionType.RUN_COMMAND;</span>
586
+ return AIActionType.RUN_COMMAND;
587
587
  case 'request_context':
588
- <span class="cstat-no" title="statement not covered" > return AIActionType.REQUEST_CONTEXT;</span>
589
- case 'final':
588
+ return AIActionType.REQUEST_CONTEXT;
589
+ <span class="branch-8 cbranch-no" title="branch not covered" > case 'final':</span>
590
590
  <span class="cstat-no" title="statement not covered" > return AIActionType.FINAL;</span>
591
591
  default:
592
- <span class="cstat-no" title="statement not covered" > this.logger.warn(`Unsupported action type found: "${type}"`);</span>
593
- <span class="cstat-no" title="statement not covered" > return undefined;</span>
592
+ this.logger.warn(`Unsupported action type found: "${type}"`);
593
+ return undefined;
594
594
  }
595
595
  }
596
596
  &nbsp;
@@ -601,149 +601,149 @@ export <span class="fstat-no" title="function not covered" >class <span class="c
601
601
  * @param rawResponse The raw string response from the LLM.
602
602
  * @returns A Promise resolving to an object with an array of AIActionDto objects and an explanation string.
603
603
  */
604
- <span class="fstat-no" title="function not covered" > async </span>parse(
604
+ async parse(
605
605
  rawResponse: string,
606
606
  ): Promise&lt;{ dtos: AIActionDto[]; explanation: string | null }&gt; {
607
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!rawResponse || rawResponse.trim() === '') {</span>
608
- <span class="cstat-no" title="statement not covered" > return { dtos: [], explanation: null };</span>
607
+ if (!rawResponse || rawResponse.trim() === '') {
608
+ return { dtos: [], explanation: null };
609
609
  }
610
610
  &nbsp;
611
- const firstActionStart = <span class="cstat-no" title="statement not covered" >rawResponse.indexOf(ACTION_ITEM_START_TAG);</span>
612
- let explanation: string | null = <span class="cstat-no" title="statement not covered" >null;</span>
613
- let actionsPart = <span class="cstat-no" title="statement not covered" >rawResponse;</span>
611
+ const firstActionStart = rawResponse.indexOf(ACTION_ITEM_START_TAG);
612
+ let explanation: string | null = null;
613
+ let actionsPart = rawResponse;
614
614
  &nbsp;
615
- <span class="cstat-no" title="statement not covered" > if (firstActionStart &gt; 0) {</span>
616
- <span class="cstat-no" title="statement not covered" > explanation = rawResponse.substring(0, firstActionStart).trim();</span>
617
- <span class="cstat-no" title="statement not covered" > actionsPart = rawResponse.substring(firstActionStart);</span>
618
- } else <span class="cstat-no" title="statement not covered" ><span class="missing-if-branch" title="if path not taken" >I</span>if (firstActionStart === -1) {</span>
615
+ if (firstActionStart &gt; 0) {
616
+ explanation = rawResponse.substring(0, firstActionStart).trim();
617
+ actionsPart = rawResponse.substring(firstActionStart);
618
+ } else if (firstActionStart === -1) {
619
619
  // No action item start tags. If no end tags either, consider it all explanation.
620
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (</span>
620
+ if (
621
621
  !rawResponse.includes(ACTION_ITEM_END_TAG) &amp;&amp;
622
622
  !rawResponse.includes(PARTIAL_ACTION_ITEM_END_TAG)
623
623
  ) {
624
- <span class="cstat-no" title="statement not covered" > return { dtos: [], explanation: rawResponse.trim() };</span>
624
+ return { dtos: [], explanation: rawResponse.trim() };
625
625
  }
626
626
  // Otherwise, it might be a malformed response, so let the block parser handle it.
627
627
  }
628
628
  &nbsp;
629
- const actionBlocks = <span class="cstat-no" title="statement not covered" >actionsPart</span>
629
+ const actionBlocks = actionsPart
630
630
  .split(ACTION_ITEM_START_TAG)
631
- .filter(<span class="fstat-no" title="function not covered" >(b</span>lock) =&gt; <span class="cstat-no" title="statement not covered" >block.trim() !== '')</span>;
631
+ .filter((block) =&gt; block.trim() !== '');
632
632
  &nbsp;
633
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (actionBlocks.length === 0) {</span>
633
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (actionBlocks.length === 0) {
634
634
  <span class="cstat-no" title="statement not covered" > this.logger.log('No action item blocks found in the response.');</span>
635
635
  <span class="cstat-no" title="statement not covered" > return { dtos: [], explanation };</span>
636
636
  }
637
637
  &nbsp;
638
- const dtos: AIActionDto[] = <span class="cstat-no" title="statement not covered" >[];</span>
639
- <span class="cstat-no" title="statement not covered" > for (const block of actionBlocks) {</span>
640
- <span class="cstat-no" title="statement not covered" > try {</span>
638
+ const dtos: AIActionDto[] = [];
639
+ for (const block of actionBlocks) {
640
+ try {
641
641
  let cleanBlock: string;
642
642
  &nbsp;
643
643
  // Use a regex to split by either the full end tag or the partial one.
644
644
  // This makes the parser more robust to truncated LLM outputs.
645
- const endTagRegex = <span class="cstat-no" title="statement not covered" >new RegExp(`${PARTIAL_ACTION_ITEM_END_TAG}§?`);</span>
646
- const parts = <span class="cstat-no" title="statement not covered" >block.split(endTagRegex);</span>
645
+ const endTagRegex = new RegExp(`${PARTIAL_ACTION_ITEM_END_TAG}§?`);
646
+ const parts = block.split(endTagRegex);
647
647
  &nbsp;
648
- <span class="cstat-no" title="statement not covered" > if (parts.length &gt;= 2) {</span>
648
+ if (parts.length &gt;= 2) {
649
649
  // Normal case: End tag was found.
650
- <span class="cstat-no" title="statement not covered" > cleanBlock = parts[0];</span>
651
- } else <span class="cstat-no" title="statement not covered" >if (actionBlocks.length === 1 &amp;&amp; parts.length === 1) {</span>
650
+ cleanBlock = parts[0];
651
+ } else if (actionBlocks.length === 1 &amp;&amp; parts.length === 1) {
652
652
  // Special case: Only one action block and it's missing an end tag.
653
653
  // We assume the rest of the response is the content of this single block.
654
- <span class="cstat-no" title="statement not covered" > this.logger.log(</span>
654
+ this.logger.log(
655
655
  'Only one action block found and it is missing an end tag. Assuming end of response is end of block.',
656
656
  );
657
- <span class="cstat-no" title="statement not covered" > cleanBlock = parts[0];</span>
657
+ cleanBlock = parts[0];
658
658
  } else {
659
659
  // Malformed block that is not the special case above.
660
- <span class="cstat-no" title="statement not covered" > throw new ParsingError(</span>
660
+ throw new ParsingError(
661
661
  `Malformed action block, missing an end marker like '${ACTION_ITEM_END_TAG}'.`,
662
662
  );
663
663
  }
664
664
  &nbsp;
665
665
  // Special handling for 'final' action with a 'plain' multiline field
666
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (/¦FileAction¦\s*final/.test(cleanBlock)) {</span>
667
- const plainSeparator = <span class="cstat-no" title="statement not covered" >`¦${FIELD_PLAIN}¦`;</span>
668
- const plainIndex = <span class="cstat-no" title="statement not covered" >cleanBlock.indexOf(plainSeparator);</span>
669
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (plainIndex !== -1) {</span>
670
- const plainContent = <span class="cstat-no" title="statement not covered" >cleanBlock</span>
666
+ if (/¦FileAction¦\s*final/.test(cleanBlock)) {
667
+ const plainSeparator = `¦${FIELD_PLAIN}¦`;
668
+ const plainIndex = cleanBlock.indexOf(plainSeparator);
669
+ if (plainIndex !== -1) {
670
+ const plainContent = cleanBlock
671
671
  .substring(plainIndex + plainSeparator.length)
672
672
  .trim();
673
- <span class="cstat-no" title="statement not covered" > this.logger.log(</span>
673
+ this.logger.log(
674
674
  `Parsed 'final' action with plain content. Returning as explanation.`,
675
675
  );
676
- <span class="cstat-no" title="statement not covered" > return { dtos: [], explanation: plainContent };</span>
676
+ return { dtos: [], explanation: plainContent };
677
677
  }
678
678
  }
679
679
  &nbsp;
680
- const actionData: { [key: string]: string } = <span class="cstat-no" title="statement not covered" >{};</span>
681
- const codeSeparator = <span class="cstat-no" title="statement not covered" >`¦${FIELD_CODE}¦`;</span>
682
- const codeIndex = <span class="cstat-no" title="statement not covered" >cleanBlock.indexOf(codeSeparator);</span>
680
+ const actionData: { [key: string]: string } = {};
681
+ const codeSeparator = `¦${FIELD_CODE}¦`;
682
+ const codeIndex = cleanBlock.indexOf(codeSeparator);
683
683
  &nbsp;
684
684
  let metadataPart: string;
685
- <span class="cstat-no" title="statement not covered" > if (codeIndex !== -1) {</span>
686
- <span class="cstat-no" title="statement not covered" > metadataPart = cleanBlock.substring(0, codeIndex);</span>
687
- let codePart = <span class="cstat-no" title="statement not covered" >cleanBlock.substring(codeIndex + codeSeparator.length);</span>
685
+ if (codeIndex !== -1) {
686
+ metadataPart = cleanBlock.substring(0, codeIndex);
687
+ let codePart = cleanBlock.substring(codeIndex + codeSeparator.length);
688
688
  &nbsp;
689
689
  // trim and extract from code block
690
- <span class="cstat-no" title="statement not covered" > codePart = codePart.trim();</span>
690
+ codePart = codePart.trim();
691
691
  // Use an anchored regex to only match if the fences are at the very start and end.
692
692
  // This is more robust against code that contains ``` in string literals.
693
- const codeMatch = <span class="cstat-no" title="statement not covered" >codePart.match(/^```(?:\w*\n)?([\s\S]*)```$/);</span>
694
- <span class="cstat-no" title="statement not covered" > actionData[FIELD_CODE] = codeMatch ? codeMatch[1].trim() : codePart;</span>
693
+ const codeMatch = codePart.match(/^```(?:\w*\n)?([\s\S]*)```$/);
694
+ actionData[FIELD_CODE] = codeMatch ? codeMatch[1].trim() : <span class="branch-1 cbranch-no" title="branch not covered" >codePart;</span>
695
695
  } else {
696
- <span class="cstat-no" title="statement not covered" > metadataPart = cleanBlock;</span>
696
+ metadataPart = cleanBlock;
697
697
  // No code part
698
698
  }
699
699
  &nbsp;
700
- const lines = <span class="cstat-no" title="statement not covered" >metadataPart.split('\n');</span>
701
- <span class="cstat-no" title="statement not covered" > for (const line of lines) {</span>
702
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!line.trim()) <span class="cstat-no" title="statement not covered" >continue;</span></span>
703
- const match = <span class="cstat-no" title="statement not covered" >line.match(/¦(.*?)¦\s*(.*)/);</span>
704
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (match) {</span>
705
- const [, key, value] = <span class="cstat-no" title="statement not covered" >match;</span>
706
- <span class="cstat-no" title="statement not covered" > actionData[key.trim()] = value.trim();</span>
700
+ const lines = metadataPart.split('\n');
701
+ for (const line of lines) {
702
+ if (!line.trim()) continue;
703
+ const match = line.match(/¦(.*?)¦\s*(.*)/);
704
+ if (match) {
705
+ const [, key, value] = match;
706
+ actionData[key.trim()] = value.trim();
707
707
  }
708
708
  }
709
709
  &nbsp;
710
- const dto = <span class="cstat-no" title="statement not covered" >new AIActionDto();</span>
710
+ const dto = new AIActionDto();
711
711
  const actionTypeRaw =
712
- <span class="cstat-no" title="statement not covered" > actionData[FIELD_FILE_ACTION] || actionData[FIELD_ACTION_TYPE];</span>
713
- <span class="cstat-no" title="statement not covered" > dto.action_type = this.mapActionType(actionTypeRaw);</span>
714
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!dto.action_type) {</span>
715
- <span class="cstat-no" title="statement not covered" > throw new ParsingError(</span>
712
+ actionData[FIELD_FILE_ACTION] || actionData[FIELD_ACTION_TYPE];
713
+ dto.action_type = this.mapActionType(actionTypeRaw);
714
+ if (!dto.action_type) {
715
+ throw new ParsingError(
716
716
  `Unsupported or missing action type: "${actionTypeRaw}"`,
717
717
  );
718
718
  }
719
719
  &nbsp;
720
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (actionData[FIELD_ACTION_NUMBER]) {</span>
721
- <span class="cstat-no" title="statement not covered" > dto.order_of_execution = parseInt(</span>
720
+ if (actionData[FIELD_ACTION_NUMBER]) {
721
+ dto.order_of_execution = parseInt(
722
722
  actionData[FIELD_ACTION_NUMBER],
723
723
  10,
724
724
  );
725
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (isNaN(dto.order_of_execution)) {</span>
726
- <span class="cstat-no" title="statement not covered" > throw new ParsingError(</span>
725
+ if (isNaN(dto.order_of_execution)) {
726
+ throw new ParsingError(
727
727
  `Invalid ActionNumber: ${actionData[FIELD_ACTION_NUMBER]}`,
728
728
  );
729
729
  }
730
730
  }
731
731
  &nbsp;
732
- <span class="cstat-no" title="statement not covered" > dto.file_path = actionData[FIELD_FILE_PATH];</span>
733
- <span class="cstat-no" title="statement not covered" > dto.command_string = actionData[FIELD_COMMAND_STRING];</span>
734
- <span class="cstat-no" title="statement not covered" > dto.content = actionData[FIELD_CODE];</span>
735
- <span class="cstat-no" title="statement not covered" > dto.files = actionData[FIELD_FILES_STRING];</span>
736
- <span class="cstat-no" title="statement not covered" > dto.folders = actionData[FIELD_FOLDERS_STRING];</span>
737
- <span class="cstat-no" title="statement not covered" > dto.reason = actionData[FIELD_REASON_STRING];</span>
732
+ dto.file_path = actionData[FIELD_FILE_PATH];
733
+ dto.command_string = actionData[FIELD_COMMAND_STRING];
734
+ dto.content = actionData[FIELD_CODE];
735
+ dto.files = actionData[FIELD_FILES_STRING];
736
+ dto.folders = actionData[FIELD_FOLDERS_STRING];
737
+ dto.reason = actionData[FIELD_REASON_STRING];
738
738
  &nbsp;
739
739
  // Manual validation for context-dependent fields
740
- <span class="cstat-no" title="statement not covered" > try {</span>
741
- <span class="cstat-no" title="statement not covered" > AIActionDto.validateFilePath(dto);</span>
742
- <span class="cstat-no" title="statement not covered" > AIActionDto.validateContentForFileOps(dto);</span>
743
- <span class="cstat-no" title="statement not covered" > AIActionDto.validateCommandString(dto);</span>
744
- <span class="cstat-no" title="statement not covered" > AIActionDto.validateRequestContext(dto);</span>
740
+ try {
741
+ AIActionDto.validateFilePath(dto);
742
+ AIActionDto.validateContentForFileOps(dto);
743
+ AIActionDto.validateCommandString(dto);
744
+ AIActionDto.validateRequestContext(dto);
745
745
  } catch (manualValidationError) {
746
- <span class="cstat-no" title="statement not covered" > throw new ParsingError(</span>
746
+ throw new ParsingError(
747
747
  `Validation failed for action: ${
748
748
  (manualValidationError as Error).message
749
749
  }`,
@@ -751,8 +751,8 @@ export <span class="fstat-no" title="function not covered" >class <span class="c
751
751
  );
752
752
  }
753
753
  &nbsp;
754
- const errors = <span class="cstat-no" title="statement not covered" >await validate(dto);</span>
755
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (errors.length &gt; 0) {</span>
754
+ const errors = await validate(dto);
755
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (errors.length &gt; 0) {
756
756
  const errorMessages = <span class="cstat-no" title="statement not covered" >errors</span>
757
757
  .map(<span class="fstat-no" title="function not covered" >(e</span>rr) =&gt; <span class="cstat-no" title="statement not covered" >Object.values(err.constraints || {}).join(', '))</span>
758
758
  .join('; ');
@@ -761,9 +761,9 @@ export <span class="fstat-no" title="function not covered" >class <span class="c
761
761
  errors,
762
762
  );
763
763
  }
764
- <span class="cstat-no" title="statement not covered" > dtos.push(dto);</span>
764
+ dtos.push(dto);
765
765
  } catch (error) {
766
- <span class="cstat-no" title="statement not covered" > this.logger.warn(</span>
766
+ this.logger.warn(
767
767
  `Skipping malformed action block due to error: ${error.message}`,
768
768
  `Block content: ${block.substring(0, 200)}...`,
769
769
  );
@@ -772,18 +772,18 @@ export <span class="fstat-no" title="function not covered" >class <span class="c
772
772
  }
773
773
  &nbsp;
774
774
  // Sort by order_of_execution if present
775
- <span class="cstat-no" title="statement not covered" > dtos.sort(<span class="fstat-no" title="function not covered" >(a</span>, b) =&gt; {</span>
776
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (</span>
775
+ dtos.sort((a, b) =&gt; {
776
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (
777
777
  a.order_of_execution === undefined &amp;&amp;
778
- b.order_of_execution === undefined
778
+ <span class="branch-1 cbranch-no" title="branch not covered" > b.order_of_execution === undefined</span>
779
779
  )
780
780
  <span class="cstat-no" title="statement not covered" > return 0;</span>
781
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (a.order_of_execution === undefined) <span class="cstat-no" title="statement not covered" >return 1;</span></span>
782
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (b.order_of_execution === undefined) <span class="cstat-no" title="statement not covered" >return -1;</span></span>
783
- <span class="cstat-no" title="statement not covered" > return a.order_of_execution - b.order_of_execution;</span>
781
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (a.order_of_execution === undefined) <span class="cstat-no" title="statement not covered" >return 1;</span>
782
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (b.order_of_execution === undefined) <span class="cstat-no" title="statement not covered" >return -1;</span>
783
+ return a.order_of_execution - b.order_of_execution;
784
784
  });
785
785
  &nbsp;
786
- <span class="cstat-no" title="statement not covered" > return { dtos, explanation };</span>
786
+ return { dtos, explanation };
787
787
  }
788
788
  }
789
789
  &nbsp;</pre></td></tr></table></pre>
@@ -793,7 +793,7 @@ export <span class="fstat-no" title="function not covered" >class <span class="c
793
793
  <div class='footer quiet pad2 space-top1 center small'>
794
794
  Code coverage generated by
795
795
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
796
- at 2025-07-30T23:37:05.373Z
796
+ at 2025-09-12T19:21:55.945Z
797
797
  </div>
798
798
  <script src="../../prettify.js"></script>
799
799
  <script>