repoburg 1.0.55 → 1.0.58

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 (212) hide show
  1. package/backend/.env +1 -0
  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/ai-actions/ai-action-batch.service.d.ts +5 -1
  169. package/backend/dist/ai-actions/ai-action-batch.service.js +15 -2
  170. package/backend/dist/ai-actions/ai-action-batch.service.js.map +1 -1
  171. package/backend/dist/ai-actions/ai-action-creation.service.d.ts +5 -1
  172. package/backend/dist/ai-actions/ai-action-creation.service.js +32 -7
  173. package/backend/dist/ai-actions/ai-action-creation.service.js.map +1 -1
  174. package/backend/dist/ai-actions/ai-actions.module.js +4 -0
  175. package/backend/dist/ai-actions/ai-actions.module.js.map +1 -1
  176. package/backend/dist/application-state/application-state.controller.d.ts +5 -0
  177. package/backend/dist/application-state/application-state.controller.js +22 -0
  178. package/backend/dist/application-state/application-state.controller.js.map +1 -1
  179. package/backend/dist/application-state/application-state.service.d.ts +2 -0
  180. package/backend/dist/application-state/application-state.service.js +11 -0
  181. package/backend/dist/application-state/application-state.service.js.map +1 -1
  182. package/backend/dist/application-state/dto/set-auto-send-to-ai-studio-enabled.dto.d.ts +3 -0
  183. package/backend/dist/application-state/dto/set-auto-send-to-ai-studio-enabled.dto.js +21 -0
  184. package/backend/dist/application-state/dto/set-auto-send-to-ai-studio-enabled.dto.js.map +1 -0
  185. package/backend/dist/context-generation/context-generation.service.d.ts +2 -2
  186. package/backend/dist/context-generation/context-generation.service.js.map +1 -1
  187. package/backend/dist/orchestration/orchestration.service.js +1 -0
  188. package/backend/dist/orchestration/orchestration.service.js.map +1 -1
  189. package/backend/dist/seeding/data/context-templates/default-followup_ad-hoc-focused-context.d.ts +1 -1
  190. package/backend/dist/seeding/data/context-templates/default-followup_ad-hoc-focused-context.js +2 -0
  191. package/backend/dist/seeding/data/context-templates/default-followup_ad-hoc-focused-context.js.map +1 -1
  192. package/backend/dist/seeding/data/custom-snippets/usr-cmd-output-incl.d.ts +3 -0
  193. package/backend/dist/seeding/data/custom-snippets/usr-cmd-output-incl.js +7 -0
  194. package/backend/dist/seeding/data/custom-snippets/usr-cmd-output-incl.js.map +1 -0
  195. package/backend/dist/seeding/data/system-prompts/codebase-explorer.d.ts +1 -1
  196. package/backend/dist/seeding/data/system-prompts/codebase-explorer.js +31 -4
  197. package/backend/dist/seeding/data/system-prompts/codebase-explorer.js.map +1 -1
  198. package/backend/dist/session-inputs/dto/session-input.dto.d.ts +1 -0
  199. package/backend/dist/session-inputs/dto/session-input.dto.js +5 -0
  200. package/backend/dist/session-inputs/dto/session-input.dto.js.map +1 -1
  201. package/backend/dist/session-inputs/session-input-context.service.js +13 -5
  202. package/backend/dist/session-inputs/session-input-context.service.js.map +1 -1
  203. package/backend/dist/session-inputs/session-inputs.service.js +2 -1
  204. package/backend/dist/session-inputs/session-inputs.service.js.map +1 -1
  205. package/backend/dist/tsconfig.build.tsbuildinfo +1 -1
  206. package/backend/dist/utils/fuzzy-search.js +13 -4
  207. package/backend/dist/utils/fuzzy-search.js.map +1 -1
  208. package/backend/dist/workspace/workspace.service.d.ts +1 -0
  209. package/backend/dist/workspace/workspace.service.js +14 -3
  210. package/backend/dist/workspace/workspace.service.js.map +1 -1
  211. package/package.json +1 -1
  212. 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">69.67% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>0/153</span>
28
+ <span class='fraction'>108/155</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">45.16% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>0/59</span>
35
+ <span class='fraction'>28/62</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">100% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>0/8</span>
42
+ <span class='fraction'>8/8</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">69.28% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>0/151</span>
49
+ <span class='fraction'>106/153</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 medium'></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>
@@ -433,48 +433,64 @@
433
433
  <a name='L368'></a><a href='#L368'>368</a>
434
434
  <a name='L369'></a><a href='#L369'>369</a>
435
435
  <a name='L370'></a><a href='#L370'>370</a>
436
- <a name='L371'></a><a href='#L371'>371</a></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
437
- <span class="cline-any cline-no">&nbsp;</span>
438
- <span class="cline-any cline-no">&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>
442
- <span class="cline-any cline-no">&nbsp;</span>
443
- <span class="cline-any cline-no">&nbsp;</span>
436
+ <a name='L371'></a><a href='#L371'>371</a>
437
+ <a name='L372'></a><a href='#L372'>372</a>
438
+ <a name='L373'></a><a href='#L373'>373</a>
439
+ <a name='L374'></a><a href='#L374'>374</a>
440
+ <a name='L375'></a><a href='#L375'>375</a>
441
+ <a name='L376'></a><a href='#L376'>376</a>
442
+ <a name='L377'></a><a href='#L377'>377</a>
443
+ <a name='L378'></a><a href='#L378'>378</a>
444
+ <a name='L379'></a><a href='#L379'>379</a>
445
+ <a name='L380'></a><a href='#L380'>380</a>
446
+ <a name='L381'></a><a href='#L381'>381</a>
447
+ <a name='L382'></a><a href='#L382'>382</a>
448
+ <a name='L383'></a><a href='#L383'>383</a>
449
+ <a name='L384'></a><a href='#L384'>384</a>
450
+ <a name='L385'></a><a href='#L385'>385</a>
451
+ <a name='L386'></a><a href='#L386'>386</a>
452
+ <a name='L387'></a><a href='#L387'>387</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">9x</span>
453
+ <span class="cline-any cline-yes">9x</span>
454
+ <span class="cline-any cline-yes">9x</span>
455
+ <span class="cline-any cline-yes">9x</span>
456
+ <span class="cline-any cline-yes">9x</span>
457
+ <span class="cline-any cline-yes">9x</span>
458
+ <span class="cline-any cline-yes">9x</span>
459
+ <span class="cline-any cline-yes">9x</span>
444
460
  <span class="cline-any cline-neutral">&nbsp;</span>
445
461
  <span class="cline-any cline-neutral">&nbsp;</span>
446
462
  <span class="cline-any cline-neutral">&nbsp;</span>
447
- <span class="cline-any cline-no">&nbsp;</span>
448
- <span class="cline-any cline-no">&nbsp;</span>
463
+ <span class="cline-any cline-yes">9x</span>
464
+ <span class="cline-any cline-yes">9x</span>
449
465
  <span class="cline-any cline-neutral">&nbsp;</span>
450
466
  <span class="cline-any cline-neutral">&nbsp;</span>
451
- <span class="cline-any cline-no">&nbsp;</span>
452
- <span class="cline-any cline-no">&nbsp;</span>
467
+ <span class="cline-any cline-yes">9x</span>
468
+ <span class="cline-any cline-yes">13x</span>
453
469
  <span class="cline-any cline-neutral">&nbsp;</span>
454
470
  <span class="cline-any cline-neutral">&nbsp;</span>
455
471
  <span class="cline-any cline-neutral">&nbsp;</span>
456
- <span class="cline-any cline-no">&nbsp;</span>
472
+ <span class="cline-any cline-yes">13x</span>
457
473
  <span class="cline-any cline-neutral">&nbsp;</span>
458
- <span class="cline-any cline-no">&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>
474
+ <span class="cline-any cline-yes">13x</span>
475
+ <span class="cline-any cline-yes">13x</span>
476
+ <span class="cline-any cline-yes">13x</span>
477
+ <span class="cline-any cline-yes">13x</span>
462
478
  <span class="cline-any cline-neutral">&nbsp;</span>
463
479
  <span class="cline-any cline-neutral">&nbsp;</span>
464
480
  <span class="cline-any cline-neutral">&nbsp;</span>
465
481
  <span class="cline-any cline-neutral">&nbsp;</span>
466
482
  <span class="cline-any cline-neutral">&nbsp;</span>
467
483
  <span class="cline-any cline-neutral">&nbsp;</span>
468
- <span class="cline-any cline-no">&nbsp;</span>
469
- <span class="cline-any cline-no">&nbsp;</span>
484
+ <span class="cline-any cline-yes">16x</span>
485
+ <span class="cline-any cline-yes">18x</span>
470
486
  <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>
487
+ <span class="cline-any cline-yes">16x</span>
488
+ <span class="cline-any cline-yes">1x</span>
489
+ <span class="cline-any cline-yes">1x</span>
474
490
  <span class="cline-any cline-neutral">&nbsp;</span>
475
491
  <span class="cline-any cline-neutral">&nbsp;</span>
476
492
  <span class="cline-any cline-neutral">&nbsp;</span>
477
- <span class="cline-any cline-no">&nbsp;</span>
493
+ <span class="cline-any cline-yes">1x</span>
478
494
  <span class="cline-any cline-neutral">&nbsp;</span>
479
495
  <span class="cline-any cline-neutral">&nbsp;</span>
480
496
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -484,13 +500,13 @@
484
500
  <span class="cline-any cline-neutral">&nbsp;</span>
485
501
  <span class="cline-any cline-neutral">&nbsp;</span>
486
502
  <span class="cline-any cline-neutral">&nbsp;</span>
487
- <span class="cline-any cline-no">&nbsp;</span>
488
- <span class="cline-any cline-no">&nbsp;</span>
503
+ <span class="cline-any cline-yes">1x</span>
504
+ <span class="cline-any cline-yes">1x</span>
489
505
  <span class="cline-any cline-neutral">&nbsp;</span>
490
506
  <span class="cline-any cline-neutral">&nbsp;</span>
491
- <span class="cline-any cline-no">&nbsp;</span>
507
+ <span class="cline-any cline-yes">1x</span>
492
508
  <span class="cline-any cline-neutral">&nbsp;</span>
493
- <span class="cline-any cline-no">&nbsp;</span>
509
+ <span class="cline-any cline-yes">15x</span>
494
510
  <span class="cline-any cline-neutral">&nbsp;</span>
495
511
  <span class="cline-any cline-neutral">&nbsp;</span>
496
512
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -504,7 +520,7 @@
504
520
  <span class="cline-any cline-neutral">&nbsp;</span>
505
521
  <span class="cline-any cline-neutral">&nbsp;</span>
506
522
  <span class="cline-any cline-neutral">&nbsp;</span>
507
- <span class="cline-any cline-no">&nbsp;</span>
523
+ <span class="cline-any cline-yes">6x</span>
508
524
  <span class="cline-any cline-no">&nbsp;</span>
509
525
  <span class="cline-any cline-neutral">&nbsp;</span>
510
526
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -512,24 +528,24 @@
512
528
  <span class="cline-any cline-neutral">&nbsp;</span>
513
529
  <span class="cline-any cline-neutral">&nbsp;</span>
514
530
  <span class="cline-any cline-neutral">&nbsp;</span>
515
- <span class="cline-any cline-no">&nbsp;</span>
531
+ <span class="cline-any cline-yes">6x</span>
516
532
  <span class="cline-any cline-neutral">&nbsp;</span>
517
- <span class="cline-any cline-no">&nbsp;</span>
533
+ <span class="cline-any cline-yes">6x</span>
518
534
  <span class="cline-any cline-no">&nbsp;</span>
519
535
  <span class="cline-any cline-no">&nbsp;</span>
520
536
  <span class="cline-any cline-neutral">&nbsp;</span>
521
537
  <span class="cline-any cline-neutral">&nbsp;</span>
522
- <span class="cline-any cline-no">&nbsp;</span>
538
+ <span class="cline-any cline-yes">6x</span>
523
539
  <span class="cline-any cline-neutral">&nbsp;</span>
524
540
  <span class="cline-any cline-neutral">&nbsp;</span>
525
541
  <span class="cline-any cline-neutral">&nbsp;</span>
526
- <span class="cline-any cline-no">&nbsp;</span>
527
- <span class="cline-any cline-no">&nbsp;</span>
542
+ <span class="cline-any cline-yes">6x</span>
543
+ <span class="cline-any cline-yes">1x</span>
528
544
  <span class="cline-any cline-neutral">&nbsp;</span>
529
545
  <span class="cline-any cline-neutral">&nbsp;</span>
530
- <span class="cline-any cline-no">&nbsp;</span>
531
- <span class="cline-any cline-no">&nbsp;</span>
532
- <span class="cline-any cline-no">&nbsp;</span>
546
+ <span class="cline-any cline-yes">5x</span>
547
+ <span class="cline-any cline-yes">5x</span>
548
+ <span class="cline-any cline-yes">5x</span>
533
549
  <span class="cline-any cline-neutral">&nbsp;</span>
534
550
  <span class="cline-any cline-neutral">&nbsp;</span>
535
551
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -543,13 +559,13 @@
543
559
  <span class="cline-any cline-neutral">&nbsp;</span>
544
560
  <span class="cline-any cline-neutral">&nbsp;</span>
545
561
  <span class="cline-any cline-neutral">&nbsp;</span>
546
- <span class="cline-any cline-no">&nbsp;</span>
547
- <span class="cline-any cline-no">&nbsp;</span>
562
+ <span class="cline-any cline-yes">5x</span>
563
+ <span class="cline-any cline-yes">5x</span>
548
564
  <span class="cline-any cline-neutral">&nbsp;</span>
549
- <span class="cline-any cline-no">&nbsp;</span>
565
+ <span class="cline-any cline-yes">5x</span>
550
566
  <span class="cline-any cline-neutral">&nbsp;</span>
551
567
  <span class="cline-any cline-neutral">&nbsp;</span>
552
- <span class="cline-any cline-no">&nbsp;</span>
568
+ <span class="cline-any cline-yes">5x</span>
553
569
  <span class="cline-any cline-neutral">&nbsp;</span>
554
570
  <span class="cline-any cline-neutral">&nbsp;</span>
555
571
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -558,11 +574,11 @@
558
574
  <span class="cline-any cline-neutral">&nbsp;</span>
559
575
  <span class="cline-any cline-neutral">&nbsp;</span>
560
576
  <span class="cline-any cline-neutral">&nbsp;</span>
561
- <span class="cline-any cline-no">&nbsp;</span>
577
+ <span class="cline-any cline-yes">2x</span>
562
578
  <span class="cline-any cline-no">&nbsp;</span>
563
579
  <span class="cline-any cline-neutral">&nbsp;</span>
564
- <span class="cline-any cline-no">&nbsp;</span>
565
- <span class="cline-any cline-no">&nbsp;</span>
580
+ <span class="cline-any cline-yes">2x</span>
581
+ <span class="cline-any cline-yes">2x</span>
566
582
  <span class="cline-any cline-neutral">&nbsp;</span>
567
583
  <span class="cline-any cline-no">&nbsp;</span>
568
584
  <span class="cline-any cline-no">&nbsp;</span>
@@ -582,7 +598,7 @@
582
598
  <span class="cline-any cline-neutral">&nbsp;</span>
583
599
  <span class="cline-any cline-neutral">&nbsp;</span>
584
600
  <span class="cline-any cline-neutral">&nbsp;</span>
585
- <span class="cline-any cline-no">&nbsp;</span>
601
+ <span class="cline-any cline-yes">5x</span>
586
602
  <span class="cline-any cline-no">&nbsp;</span>
587
603
  <span class="cline-any cline-neutral">&nbsp;</span>
588
604
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -590,25 +606,25 @@
590
606
  <span class="cline-any cline-neutral">&nbsp;</span>
591
607
  <span class="cline-any cline-neutral">&nbsp;</span>
592
608
  <span class="cline-any cline-neutral">&nbsp;</span>
593
- <span class="cline-any cline-no">&nbsp;</span>
609
+ <span class="cline-any cline-yes">5x</span>
594
610
  <span class="cline-any cline-neutral">&nbsp;</span>
595
- <span class="cline-any cline-no">&nbsp;</span>
611
+ <span class="cline-any cline-yes">5x</span>
596
612
  <span class="cline-any cline-no">&nbsp;</span>
597
613
  <span class="cline-any cline-no">&nbsp;</span>
598
614
  <span class="cline-any cline-neutral">&nbsp;</span>
599
615
  <span class="cline-any cline-neutral">&nbsp;</span>
600
- <span class="cline-any cline-no">&nbsp;</span>
616
+ <span class="cline-any cline-yes">5x</span>
601
617
  <span class="cline-any cline-neutral">&nbsp;</span>
602
618
  <span class="cline-any cline-neutral">&nbsp;</span>
603
619
  <span class="cline-any cline-neutral">&nbsp;</span>
604
- <span class="cline-any cline-no">&nbsp;</span>
620
+ <span class="cline-any cline-yes">5x</span>
605
621
  <span class="cline-any cline-no">&nbsp;</span>
606
622
  <span class="cline-any cline-neutral">&nbsp;</span>
607
623
  <span class="cline-any cline-neutral">&nbsp;</span>
608
- <span class="cline-any cline-no">&nbsp;</span>
624
+ <span class="cline-any cline-yes">5x</span>
609
625
  <span class="cline-any cline-neutral">&nbsp;</span>
610
- <span class="cline-any cline-no">&nbsp;</span>
611
- <span class="cline-any cline-no">&nbsp;</span>
626
+ <span class="cline-any cline-yes">5x</span>
627
+ <span class="cline-any cline-yes">6x</span>
612
628
  <span class="cline-any cline-neutral">&nbsp;</span>
613
629
  <span class="cline-any cline-neutral">&nbsp;</span>
614
630
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -623,42 +639,42 @@
623
639
  <span class="cline-any cline-neutral">&nbsp;</span>
624
640
  <span class="cline-any cline-neutral">&nbsp;</span>
625
641
  <span class="cline-any cline-neutral">&nbsp;</span>
626
- <span class="cline-any cline-no">&nbsp;</span>
642
+ <span class="cline-any cline-yes">6x</span>
627
643
  <span class="cline-any cline-neutral">&nbsp;</span>
628
644
  <span class="cline-any cline-neutral">&nbsp;</span>
629
645
  <span class="cline-any cline-neutral">&nbsp;</span>
630
- <span class="cline-any cline-no">&nbsp;</span>
646
+ <span class="cline-any cline-yes">2x</span>
631
647
  <span class="cline-any cline-neutral">&nbsp;</span>
632
648
  <span class="cline-any cline-neutral">&nbsp;</span>
633
649
  <span class="cline-any cline-neutral">&nbsp;</span>
634
650
  <span class="cline-any cline-neutral">&nbsp;</span>
635
- <span class="cline-any cline-no">&nbsp;</span>
636
- <span class="cline-any cline-no">&nbsp;</span>
637
- <span class="cline-any cline-no">&nbsp;</span>
651
+ <span class="cline-any cline-yes">6x</span>
652
+ <span class="cline-any cline-yes">6x</span>
653
+ <span class="cline-any cline-yes">6x</span>
638
654
  <span class="cline-any cline-neutral">&nbsp;</span>
639
- <span class="cline-any cline-no">&nbsp;</span>
640
- <span class="cline-any cline-no">&nbsp;</span>
655
+ <span class="cline-any cline-yes">6x</span>
656
+ <span class="cline-any cline-yes">6x</span>
641
657
  <span class="cline-any cline-neutral">&nbsp;</span>
642
658
  <span class="cline-any cline-neutral">&nbsp;</span>
643
- <span class="cline-any cline-no">&nbsp;</span>
659
+ <span class="cline-any cline-yes">6x</span>
644
660
  <span class="cline-any cline-neutral">&nbsp;</span>
661
+ <span class="cline-any cline-yes">4x</span>
645
662
  <span class="cline-any cline-no">&nbsp;</span>
646
- <span class="cline-any cline-no">&nbsp;</span>
647
- <span class="cline-any cline-no">&nbsp;</span>
663
+ <span class="cline-any cline-yes">4x</span>
648
664
  <span class="cline-any cline-neutral">&nbsp;</span>
649
665
  <span class="cline-any cline-neutral">&nbsp;</span>
650
666
  <span class="cline-any cline-neutral">&nbsp;</span>
651
- <span class="cline-any cline-no">&nbsp;</span>
652
- <span class="cline-any cline-no">&nbsp;</span>
667
+ <span class="cline-any cline-yes">3x</span>
668
+ <span class="cline-any cline-yes">3x</span>
653
669
  <span class="cline-any cline-neutral">&nbsp;</span>
670
+ <span class="cline-any cline-yes">2x</span>
654
671
  <span class="cline-any cline-no">&nbsp;</span>
655
- <span class="cline-any cline-no">&nbsp;</span>
656
- <span class="cline-any cline-no">&nbsp;</span>
672
+ <span class="cline-any cline-yes">2x</span>
657
673
  <span class="cline-any cline-neutral">&nbsp;</span>
658
674
  <span class="cline-any cline-neutral">&nbsp;</span>
659
675
  <span class="cline-any cline-neutral">&nbsp;</span>
660
- <span class="cline-any cline-no">&nbsp;</span>
661
- <span class="cline-any cline-no">&nbsp;</span>
676
+ <span class="cline-any cline-yes">2x</span>
677
+ <span class="cline-any cline-yes">2x</span>
662
678
  <span class="cline-any cline-neutral">&nbsp;</span>
663
679
  <span class="cline-any cline-no">&nbsp;</span>
664
680
  <span class="cline-any cline-no">&nbsp;</span>
@@ -687,41 +703,41 @@
687
703
  <span class="cline-any cline-neutral">&nbsp;</span>
688
704
  <span class="cline-any cline-no">&nbsp;</span>
689
705
  <span class="cline-any cline-neutral">&nbsp;</span>
690
- <span class="cline-any cline-no">&nbsp;</span>
691
- <span class="cline-any cline-no">&nbsp;</span>
692
- <span class="cline-any cline-no">&nbsp;</span>
706
+ <span class="cline-any cline-yes">5x</span>
707
+ <span class="cline-any cline-yes">5x</span>
708
+ <span class="cline-any cline-yes">5x</span>
693
709
  <span class="cline-any cline-neutral">&nbsp;</span>
694
710
  <span class="cline-any cline-neutral">&nbsp;</span>
695
711
  <span class="cline-any cline-neutral">&nbsp;</span>
696
- <span class="cline-any cline-no">&nbsp;</span>
697
- <span class="cline-any cline-no">&nbsp;</span>
698
- <span class="cline-any cline-no">&nbsp;</span>
699
- <span class="cline-any cline-no">&nbsp;</span>
712
+ <span class="cline-any cline-yes">1x</span>
713
+ <span class="cline-any cline-yes">1x</span>
714
+ <span class="cline-any cline-yes">1x</span>
715
+ <span class="cline-any cline-yes">1x</span>
700
716
  <span class="cline-any cline-neutral">&nbsp;</span>
701
717
  <span class="cline-any cline-neutral">&nbsp;</span>
702
718
  <span class="cline-any cline-neutral">&nbsp;</span>
703
719
  <span class="cline-any cline-neutral">&nbsp;</span>
704
720
  <span class="cline-any cline-neutral">&nbsp;</span>
705
- <span class="cline-any cline-no">&nbsp;</span>
721
+ <span class="cline-any cline-yes">6x</span>
706
722
  <span class="cline-any cline-neutral">&nbsp;</span>
707
- <span class="cline-any cline-no">&nbsp;</span>
723
+ <span class="cline-any cline-yes">6x</span>
708
724
  <span class="cline-any cline-neutral">&nbsp;</span>
709
725
  <span class="cline-any cline-neutral">&nbsp;</span>
710
726
  <span class="cline-any cline-neutral">&nbsp;</span>
711
727
  <span class="cline-any cline-neutral">&nbsp;</span>
712
- <span class="cline-any cline-no">&nbsp;</span>
713
- <span class="cline-any cline-no">&nbsp;</span>
728
+ <span class="cline-any cline-yes">6x</span>
729
+ <span class="cline-any cline-yes">6x</span>
714
730
  <span class="cline-any cline-neutral">&nbsp;</span>
715
- <span class="cline-any cline-no">&nbsp;</span>
731
+ <span class="cline-any cline-yes">5x</span>
716
732
  <span class="cline-any cline-neutral">&nbsp;</span>
717
733
  <span class="cline-any cline-neutral">&nbsp;</span>
718
- <span class="cline-any cline-no">&nbsp;</span>
734
+ <span class="cline-any cline-yes">5x</span>
719
735
  <span class="cline-any cline-neutral">&nbsp;</span>
720
736
  <span class="cline-any cline-neutral">&nbsp;</span>
721
737
  <span class="cline-any cline-neutral">&nbsp;</span>
722
738
  <span class="cline-any cline-neutral">&nbsp;</span>
723
739
  <span class="cline-any cline-neutral">&nbsp;</span>
724
- <span class="cline-any cline-no">&nbsp;</span>
740
+ <span class="cline-any cline-yes">5x</span>
725
741
  <span class="cline-any cline-no">&nbsp;</span>
726
742
  <span class="cline-any cline-neutral">&nbsp;</span>
727
743
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -729,65 +745,78 @@
729
745
  <span class="cline-any cline-neutral">&nbsp;</span>
730
746
  <span class="cline-any cline-neutral">&nbsp;</span>
731
747
  <span class="cline-any cline-neutral">&nbsp;</span>
732
- <span class="cline-any cline-no">&nbsp;</span>
748
+ <span class="cline-any cline-yes">5x</span>
733
749
  <span class="cline-any cline-neutral">&nbsp;</span>
734
- <span class="cline-any cline-no">&nbsp;</span>
750
+ <span class="cline-any cline-yes">5x</span>
735
751
  <span class="cline-any cline-no">&nbsp;</span>
736
752
  <span class="cline-any cline-no">&nbsp;</span>
737
753
  <span class="cline-any cline-neutral">&nbsp;</span>
738
754
  <span class="cline-any cline-neutral">&nbsp;</span>
739
- <span class="cline-any cline-no">&nbsp;</span>
755
+ <span class="cline-any cline-yes">5x</span>
740
756
  <span class="cline-any cline-neutral">&nbsp;</span>
741
757
  <span class="cline-any cline-neutral">&nbsp;</span>
742
758
  <span class="cline-any cline-neutral">&nbsp;</span>
743
- <span class="cline-any cline-no">&nbsp;</span>
759
+ <span class="cline-any cline-yes">5x</span>
744
760
  <span class="cline-any cline-no">&nbsp;</span>
745
761
  <span class="cline-any cline-neutral">&nbsp;</span>
746
762
  <span class="cline-any cline-neutral">&nbsp;</span>
747
- <span class="cline-any cline-no">&nbsp;</span>
748
- <span class="cline-any cline-no">&nbsp;</span>
749
- <span class="cline-any cline-no">&nbsp;</span>
763
+ <span class="cline-any cline-yes">5x</span>
764
+ <span class="cline-any cline-yes">5x</span>
765
+ <span class="cline-any cline-yes">5x</span>
750
766
  <span class="cline-any cline-neutral">&nbsp;</span>
751
767
  <span class="cline-any cline-neutral">&nbsp;</span>
752
768
  <span class="cline-any cline-neutral">&nbsp;</span>
753
769
  <span class="cline-any cline-neutral">&nbsp;</span>
754
770
  <span class="cline-any cline-neutral">&nbsp;</span>
755
771
  <span class="cline-any cline-neutral">&nbsp;</span>
756
- <span class="cline-any cline-no">&nbsp;</span>
757
- <span class="cline-any cline-no">&nbsp;</span>
758
772
  <span class="cline-any cline-neutral">&nbsp;</span>
759
- <span class="cline-any cline-no">&nbsp;</span>
760
- <span class="cline-any cline-no">&nbsp;</span>
761
- <span class="cline-any cline-no">&nbsp;</span>
762
- <span class="cline-any cline-no">&nbsp;</span>
773
+ <span class="cline-any cline-yes">5x</span>
763
774
  <span class="cline-any cline-neutral">&nbsp;</span>
764
775
  <span class="cline-any cline-neutral">&nbsp;</span>
765
776
  <span class="cline-any cline-neutral">&nbsp;</span>
766
777
  <span class="cline-any cline-no">&nbsp;</span>
767
778
  <span class="cline-any cline-neutral">&nbsp;</span>
768
- <span class="cline-any cline-no">&nbsp;</span>
769
- <span class="cline-any cline-no">&nbsp;</span>
770
- <span class="cline-any cline-no">&nbsp;</span>
771
779
  <span class="cline-any cline-neutral">&nbsp;</span>
772
780
  <span class="cline-any cline-neutral">&nbsp;</span>
773
781
  <span class="cline-any cline-neutral">&nbsp;</span>
774
- <span class="cline-any cline-no">&nbsp;</span>
775
- <span class="cline-any cline-no">&nbsp;</span>
782
+ <span class="cline-any cline-yes">5x</span>
783
+ <span class="cline-any cline-yes">5x</span>
776
784
  <span class="cline-any cline-neutral">&nbsp;</span>
785
+ <span class="cline-any cline-yes">5x</span>
786
+ <span class="cline-any cline-yes">3x</span>
787
+ <span class="cline-any cline-yes">3x</span>
788
+ <span class="cline-any cline-yes">3x</span>
777
789
  <span class="cline-any cline-neutral">&nbsp;</span>
778
790
  <span class="cline-any cline-neutral">&nbsp;</span>
779
791
  <span class="cline-any cline-neutral">&nbsp;</span>
780
- <span class="cline-any cline-no">&nbsp;</span>
792
+ <span class="cline-any cline-yes">3x</span>
781
793
  <span class="cline-any cline-neutral">&nbsp;</span>
794
+ <span class="cline-any cline-yes">2x</span>
795
+ <span class="cline-any cline-yes">2x</span>
796
+ <span class="cline-any cline-yes">2x</span>
782
797
  <span class="cline-any cline-neutral">&nbsp;</span>
783
- <span class="cline-any cline-no">&nbsp;</span>
784
798
  <span class="cline-any cline-neutral">&nbsp;</span>
785
799
  <span class="cline-any cline-neutral">&nbsp;</span>
800
+ <span class="cline-any cline-yes">2x</span>
801
+ <span class="cline-any cline-yes">2x</span>
786
802
  <span class="cline-any cline-neutral">&nbsp;</span>
787
- <span class="cline-any cline-no">&nbsp;</span>
788
803
  <span class="cline-any cline-neutral">&nbsp;</span>
789
- <span class="cline-any cline-no">&nbsp;</span>
790
- <span class="cline-any cline-no">&nbsp;</span>
804
+ <span class="cline-any cline-neutral">&nbsp;</span>
805
+ <span class="cline-any cline-neutral">&nbsp;</span>
806
+ <span class="cline-any cline-yes">2x</span>
807
+ <span class="cline-any cline-neutral">&nbsp;</span>
808
+ <span class="cline-any cline-neutral">&nbsp;</span>
809
+ <span class="cline-any cline-yes">3x</span>
810
+ <span class="cline-any cline-neutral">&nbsp;</span>
811
+ <span class="cline-any cline-neutral">&nbsp;</span>
812
+ <span class="cline-any cline-neutral">&nbsp;</span>
813
+ <span class="cline-any cline-yes">5x</span>
814
+ <span class="cline-any cline-neutral">&nbsp;</span>
815
+ <span class="cline-any cline-yes">5x</span>
816
+ <span class="cline-any cline-neutral">&nbsp;</span>
817
+ <span class="cline-any cline-neutral">&nbsp;</span>
818
+ <span class="cline-any cline-neutral">&nbsp;</span>
819
+ <span class="cline-any cline-yes">3x</span>
791
820
  <span class="cline-any cline-neutral">&nbsp;</span>
792
821
  <span class="cline-any cline-no">&nbsp;</span>
793
822
  <span class="cline-any cline-no">&nbsp;</span>
@@ -803,48 +832,51 @@
803
832
  <span class="cline-any cline-no">&nbsp;</span>
804
833
  <span class="cline-any cline-neutral">&nbsp;</span>
805
834
  <span class="cline-any cline-neutral">&nbsp;</span>
806
- <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, NotFoundException } from '@nestjs/common';</span>
807
- <span class="cstat-no" title="statement not covered" >import { InjectRepository } from '@nestjs/typeorm';</span>
808
- <span class="cstat-no" title="statement not covered" >import { Repository } from 'typeorm';</span>
809
- <span class="cstat-no" title="statement not covered" >import * as fs from 'fs/promises';</span>
810
- <span class="cstat-no" title="statement not covered" >import { AIAction, SessionInput } from '../core-entities';</span>
811
- <span class="cstat-no" title="statement not covered" >import { LlmResponseParserService } from '../llm-response-parser/llm-response-parser.service';</span>
812
- <span class="cstat-no" title="statement not covered" >import { ExecutionLogsService } from '../execution-logs/execution-logs.service';</span>
813
- <span class="cstat-no" title="statement not covered" >import {</span>
835
+ <span class="cline-any cline-neutral">&nbsp;</span>
836
+ <span class="cline-any cline-neutral">&nbsp;</span>
837
+ <span class="cline-any cline-neutral">&nbsp;</span>
838
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { Injectable, Logger, NotFoundException } from '@nestjs/common';
839
+ import { InjectRepository } from '@nestjs/typeorm';
840
+ import { Repository } from 'typeorm';
841
+ import * as fs from 'fs/promises';
842
+ import { AIAction, SessionInput } from '../core-entities';
843
+ import { LlmResponseParserService } from '../llm-response-parser/llm-response-parser.service';
844
+ import { ExecutionLogsService } from '../execution-logs/execution-logs.service';
845
+ import {
814
846
  AIActionDto,
815
847
  AIActionType,
816
848
  } from '../llm-response-parser/dto/ai-action.dto';
817
- <span class="cstat-no" title="statement not covered" >import { AIActionStatus } from './ai-actions.service';</span>
818
- <span class="cstat-no" title="statement not covered" >import { ActionExecutionService } from '../action-execution/action-execution.service';</span>
849
+ import { AIActionStatus } from './ai-actions.service';
850
+ import { ActionExecutionService } from '../action-execution/action-execution.service';
819
851
  &nbsp;
820
852
  @Injectable()
821
- export class <span class="cstat-no" title="statement not covered" ><span class="cstat-no" title="statement not covered" >AIActionCreationService<span class="cstat-no" title="statement not covered" > </span>{</span></span>
822
- private readonly <span class="cstat-no" title="statement not covered" >logger = new Logger(AIActionCreationService.name);</span>
853
+ export class AIActionCreationService {
854
+ private readonly logger = new Logger(AIActionCreationService.name);
823
855
  &nbsp;
824
- <span class="fstat-no" title="function not covered" > constructor(</span>
856
+ constructor(
825
857
  @InjectRepository(AIAction)
826
- private <span class="cstat-no" title="statement not covered" >aiActionsRepository: R</span>epository&lt;AIAction&gt;,
858
+ private aiActionsRepository: Repository&lt;AIAction&gt;,
827
859
  @InjectRepository(SessionInput)
828
- private <span class="cstat-no" title="statement not covered" >sessionInputsRepository: R</span>epository&lt;SessionInput&gt;,
829
- private <span class="cstat-no" title="statement not covered" >llmResponseParserService: L</span>lmResponseParserService,
830
- private <span class="cstat-no" title="statement not covered" >executionLogsService: E</span>xecutionLogsService,
831
- private readonly <span class="cstat-no" title="statement not covered" >actionExecutionService: A</span>ctionExecutionService,
860
+ private sessionInputsRepository: Repository&lt;SessionInput&gt;,
861
+ private llmResponseParserService: LlmResponseParserService,
862
+ private executionLogsService: ExecutionLogsService,
863
+ private readonly actionExecutionService: ActionExecutionService,
832
864
  ) {}
833
865
  &nbsp;
834
- private <span class="fstat-no" title="function not covered" >async </span>handleRequestContext(
866
+ private async handleRequestContext(
835
867
  sessionInput: SessionInput,
836
868
  actionDtos: AIActionDto[],
837
869
  ): Promise&lt;AIAction[] | null&gt; {
838
- const requestContextDto = <span class="cstat-no" title="statement not covered" >actionDtos.find(</span>
839
- <span class="fstat-no" title="function not covered" > (d</span>) =&gt; <span class="cstat-no" title="statement not covered" >d.action_type === AIActionType.REQUEST_CONTEXT,</span>
870
+ const requestContextDto = actionDtos.find(
871
+ (d) =&gt; d.action_type === AIActionType.REQUEST_CONTEXT,
840
872
  );
841
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (requestContextDto) {</span>
842
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (actionDtos.length &gt; 1) {</span>
843
- <span class="cstat-no" title="statement not covered" > this.logger.warn(</span>
873
+ if (requestContextDto) {
874
+ if (actionDtos.length &gt; 1) {
875
+ this.logger.warn(
844
876
  `Request context action found with other actions for input ${sessionInput.id}. Only the context request will be processed.`,
845
877
  );
846
878
  }
847
- const newAction = <span class="cstat-no" title="statement not covered" >this.aiActionsRepository.create({</span>
879
+ const newAction = this.aiActionsRepository.create({
848
880
  sessionInput: { id: sessionInput.id },
849
881
  input_id: sessionInput.id,
850
882
  action_type: requestContextDto.action_type,
@@ -854,13 +886,13 @@ export class <span class="cstat-no" title="statement not covered" ><span class="
854
886
  order_of_execution: requestContextDto.order_of_execution ?? 0,
855
887
  status: AIActionStatus.AWAITING_CONTEXT,
856
888
  });
857
- const savedAction = <span class="cstat-no" title="statement not covered" >await this.aiActionsRepository.save(newAction);</span>
858
- <span class="cstat-no" title="statement not covered" > this.logger.log(</span>
889
+ const savedAction = await this.aiActionsRepository.save(newAction);
890
+ this.logger.log(
859
891
  `Created context request action for SessionInput ID ${sessionInput.id}.`,
860
892
  );
861
- <span class="cstat-no" title="statement not covered" > return [savedAction];</span>
893
+ return [savedAction];
862
894
  }
863
- <span class="cstat-no" title="statement not covered" > return null;</span>
895
+ return null;
864
896
  }
865
897
  &nbsp;
866
898
  /**
@@ -870,11 +902,11 @@ export class <span class="cstat-no" title="statement not covered" ><span class="
870
902
  * @param initialStatus The initial status to set for the created AIActions (e.g., 'proposed').
871
903
  * @returns A Promise resolving to an array of created AIAction entities.
872
904
  */
873
- <span class="fstat-no" title="function not covered" > async </span>createActionsFromLlmResponse(
905
+ async createActionsFromLlmResponse(
874
906
  sessionInput: SessionInput,
875
907
  initialStatus: AIActionStatus, // Use enum
876
908
  ): Promise&lt;AIAction[]&gt; {
877
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!sessionInput.raw_llm_response) {</span>
909
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!sessionInput.raw_llm_response) {
878
910
  <span class="cstat-no" title="statement not covered" > this.logger.warn(</span>
879
911
  `No raw_llm_response in SessionInput ID ${sessionInput.id}. Cannot create actions.`,
880
912
  );
@@ -882,24 +914,24 @@ export class <span class="cstat-no" title="statement not covered" ><span class="
882
914
  }
883
915
  &nbsp;
884
916
  const { dtos: actionDtos, explanation } =
885
- <span class="cstat-no" title="statement not covered" > await this.llmResponseParserService.parse(sessionInput.raw_llm_response);</span>
917
+ await this.llmResponseParserService.parse(sessionInput.raw_llm_response);
886
918
  &nbsp;
887
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (explanation &amp;&amp; explanation !== sessionInput.llm_response_explanation) {</span>
919
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (explanation &amp;&amp; <span class="branch-1 cbranch-no" title="branch not covered" >explanation !== sessionInput.llm_response_explanation)</span> {
888
920
  <span class="cstat-no" title="statement not covered" > sessionInput.llm_response_explanation = explanation;</span>
889
921
  <span class="cstat-no" title="statement not covered" > await this.sessionInputsRepository.save(sessionInput);</span>
890
922
  }
891
923
  &nbsp;
892
- const contextRequestResult = <span class="cstat-no" title="statement not covered" >await this.handleRequestContext(</span>
924
+ const contextRequestResult = await this.handleRequestContext(
893
925
  sessionInput,
894
926
  actionDtos,
895
927
  );
896
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (contextRequestResult) {</span>
897
- <span class="cstat-no" title="statement not covered" > return contextRequestResult;</span>
928
+ if (contextRequestResult) {
929
+ return contextRequestResult;
898
930
  }
899
931
  &nbsp;
900
- const createdActions: AIAction[] = <span class="cstat-no" title="statement not covered" >[];</span>
901
- <span class="cstat-no" title="statement not covered" > for (const dto of actionDtos) {</span>
902
- const newAction = <span class="cstat-no" title="statement not covered" >this.aiActionsRepository.create({</span>
932
+ const createdActions: AIAction[] = [];
933
+ for (const dto of actionDtos) {
934
+ const newAction = this.aiActionsRepository.create({
903
935
  sessionInput: { id: sessionInput.id },
904
936
  input_id: sessionInput.id,
905
937
  action_type: dto.action_type,
@@ -913,26 +945,26 @@ export class <span class="cstat-no" title="statement not covered" ><span class="
913
945
  status: initialStatus,
914
946
  original_content_for_revert: null,
915
947
  });
916
- const savedAction = <span class="cstat-no" title="statement not covered" >await this.aiActionsRepository.save(newAction);</span>
917
- <span class="cstat-no" title="statement not covered" > createdActions.push(savedAction);</span>
948
+ const savedAction = await this.aiActionsRepository.save(newAction);
949
+ createdActions.push(savedAction);
918
950
  }
919
- <span class="cstat-no" title="statement not covered" > this.logger.log(</span>
951
+ this.logger.log(
920
952
  `Created ${createdActions.length} actions for SessionInput ID ${sessionInput.id} with status ${initialStatus}.`,
921
953
  );
922
- <span class="cstat-no" title="statement not covered" > return createdActions;</span>
954
+ return createdActions;
923
955
  }
924
956
  &nbsp;
925
957
  /**
926
958
  * Reads file content. Returns null if file not found or other read error.
927
959
  */
928
- private <span class="fstat-no" title="function not covered" >async </span>readFileContent(
960
+ private async readFileContent(
929
961
  filePath: string | undefined | null,
930
962
  ): Promise&lt;string | null&gt; {
931
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!filePath) {</span>
963
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!filePath) {
932
964
  <span class="cstat-no" title="statement not covered" > return null;</span>
933
965
  }
934
- <span class="cstat-no" title="statement not covered" > try {</span>
935
- <span class="cstat-no" title="statement not covered" > return await fs.readFile(filePath, 'utf8');</span>
966
+ try {
967
+ return await fs.readFile(filePath, 'utf8');
936
968
  } catch (error) {
937
969
  <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (error.code === 'ENOENT') {</span>
938
970
  <span class="cstat-no" title="statement not covered" > this.logger.log(`File not found when reading for revert: ${filePath}`);</span>
@@ -949,10 +981,10 @@ export class <span class="cstat-no" title="statement not covered" ><span class="
949
981
  * Creates AIAction entities from LLM response and tentatively applies them.
950
982
  * For "apply_revert" strategy.
951
983
  */
952
- <span class="fstat-no" title="function not covered" > async </span>createAndTentativelyApplyActions(
984
+ async createAndTentativelyApplyActions(
953
985
  sessionInput: SessionInput,
954
986
  ): Promise&lt;AIAction[]&gt; {
955
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!sessionInput.raw_llm_response) {</span>
987
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!sessionInput.raw_llm_response) {
956
988
  <span class="cstat-no" title="statement not covered" > this.logger.warn(</span>
957
989
  `No raw_llm_response in SessionInput ID ${sessionInput.id}. Cannot create/apply actions.`,
958
990
  );
@@ -960,25 +992,25 @@ export class <span class="cstat-no" title="statement not covered" ><span class="
960
992
  }
961
993
  &nbsp;
962
994
  const { dtos: actionDtos, explanation } =
963
- <span class="cstat-no" title="statement not covered" > await this.llmResponseParserService.parse(sessionInput.raw_llm_response);</span>
995
+ await this.llmResponseParserService.parse(sessionInput.raw_llm_response);
964
996
  &nbsp;
965
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (explanation &amp;&amp; explanation !== sessionInput.llm_response_explanation) {</span>
997
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (explanation &amp;&amp; <span class="branch-1 cbranch-no" title="branch not covered" >explanation !== sessionInput.llm_response_explanation)</span> {
966
998
  <span class="cstat-no" title="statement not covered" > sessionInput.llm_response_explanation = explanation;</span>
967
999
  <span class="cstat-no" title="statement not covered" > await this.sessionInputsRepository.save(sessionInput);</span>
968
1000
  }
969
1001
  &nbsp;
970
- const contextRequestResult = <span class="cstat-no" title="statement not covered" >await this.handleRequestContext(</span>
1002
+ const contextRequestResult = await this.handleRequestContext(
971
1003
  sessionInput,
972
1004
  actionDtos,
973
1005
  );
974
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (contextRequestResult) {</span>
1006
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (contextRequestResult) {
975
1007
  <span class="cstat-no" title="statement not covered" > return contextRequestResult;</span>
976
1008
  }
977
1009
  &nbsp;
978
- const processedAIActions: AIAction[] = <span class="cstat-no" title="statement not covered" >[];</span>
1010
+ const processedAIActions: AIAction[] = [];
979
1011
  &nbsp;
980
- <span class="cstat-no" title="statement not covered" > for (const dto of actionDtos) {</span>
981
- const action = <span class="cstat-no" title="statement not covered" >this.aiActionsRepository.create({</span>
1012
+ for (const dto of actionDtos) {
1013
+ const action = this.aiActionsRepository.create({
982
1014
  sessionInput: { id: sessionInput.id },
983
1015
  input_id: sessionInput.id,
984
1016
  action_type: dto.action_type,
@@ -993,43 +1025,43 @@ export class <span class="cstat-no" title="statement not covered" ><span class="
993
1025
  });
994
1026
  &nbsp;
995
1027
  // Capture original_content_for_revert
996
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (</span>
1028
+ if (
997
1029
  dto.action_type === 'edit_file' ||
998
1030
  dto.action_type === 'delete_file'
999
1031
  ) {
1000
- <span class="cstat-no" title="statement not covered" > action.original_content_for_revert = await this.readFileContent(</span>
1032
+ action.original_content_for_revert = await this.readFileContent(
1001
1033
  dto.file_path,
1002
1034
  );
1003
1035
  }
1004
1036
  &nbsp;
1005
- let actionSucceeded = <span class="cstat-no" title="statement not covered" >false;</span>
1006
- let outcomeMessage = <span class="cstat-no" title="statement not covered" >`Action type: ${action.action_type}`;</span>
1007
- let errorMessage: string | undefined = <span class="cstat-no" title="statement not covered" >undefined;</span>
1037
+ let actionSucceeded = false;
1038
+ let outcomeMessage = `Action type: ${action.action_type}`;
1039
+ let errorMessage: string | undefined = undefined;
1008
1040
  &nbsp;
1009
- <span class="cstat-no" title="statement not covered" > try {</span>
1010
- <span class="cstat-no" title="statement not covered" > this.logger.log(</span>
1011
- `Tentatively applying action for SessionInput ${sessionInput.id}, type ${action.action_type}, target ${action.file_path || action.command_string}`,
1041
+ try {
1042
+ this.logger.log(
1043
+ `Tentatively applying action for SessionInput ${sessionInput.id}, type ${action.action_type}, target ${action.file_path || <span class="branch-1 cbranch-no" title="branch not covered" >action.command_string}</span>`,
1012
1044
  );
1013
- <span class="cstat-no" title="statement not covered" > switch (action.action_type) {</span>
1045
+ switch (action.action_type) {
1014
1046
  case 'create_file':
1015
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!action.file_path || action.content === null)</span>
1047
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!action.file_path || action.content === null)
1016
1048
  <span class="cstat-no" title="statement not covered" > throw new Error('Missing file_path or content for create_file.');</span>
1017
- <span class="cstat-no" title="statement not covered" > await this.actionExecutionService.createFile(</span>
1049
+ await this.actionExecutionService.createFile(
1018
1050
  action.file_path,
1019
1051
  action.content,
1020
1052
  );
1021
- <span class="cstat-no" title="statement not covered" > outcomeMessage = `File "${action.file_path}" created.`;</span>
1022
- <span class="cstat-no" title="statement not covered" > break;</span>
1053
+ outcomeMessage = `File "${action.file_path}" created.`;
1054
+ break;
1023
1055
  case 'edit_file':
1024
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!action.file_path || action.content === null)</span>
1056
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!action.file_path || action.content === null)
1025
1057
  <span class="cstat-no" title="statement not covered" > throw new Error('Missing file_path or content for edit_file.');</span>
1026
- <span class="cstat-no" title="statement not covered" > await this.actionExecutionService.editFile(</span>
1058
+ await this.actionExecutionService.editFile(
1027
1059
  action.file_path,
1028
1060
  action.content,
1029
1061
  );
1030
- <span class="cstat-no" title="statement not covered" > outcomeMessage = `File "${action.file_path}" edited.`;</span>
1031
- <span class="cstat-no" title="statement not covered" > break;</span>
1032
- case 'delete_file':
1062
+ outcomeMessage = `File "${action.file_path}" edited.`;
1063
+ break;
1064
+ <span class="branch-2 cbranch-no" title="branch not covered" > case 'delete_file':</span>
1033
1065
  <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!action.file_path)</span>
1034
1066
  <span class="cstat-no" title="statement not covered" > throw new Error('Missing file_path for delete_file.');</span>
1035
1067
  <span class="cstat-no" title="statement not covered" > try {</span>
@@ -1044,7 +1076,7 @@ export class <span class="cstat-no" title="statement not covered" ><span class="
1044
1076
  }
1045
1077
  }
1046
1078
  <span class="cstat-no" title="statement not covered" > break;</span>
1047
- case 'run_command':
1079
+ <span class="branch-3 cbranch-no" title="branch not covered" > case 'run_command':</span>
1048
1080
  <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!action.command_string)</span>
1049
1081
  <span class="cstat-no" title="statement not covered" > throw new Error('Missing command_string for run_command.');</span>
1050
1082
  const cmdResult = <span class="cstat-no" title="statement not covered" >await this.actionExecutionService.runCommand(</span>
@@ -1054,44 +1086,44 @@ export class <span class="cstat-no" title="statement not covered" ><span class="
1054
1086
  <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (cmdResult.stderr)</span>
1055
1087
  <span class="cstat-no" title="statement not covered" > outcomeMessage += `\nStderr: ${cmdResult.stderr}`;</span>
1056
1088
  <span class="cstat-no" title="statement not covered" > break;</span>
1057
- default:
1089
+ <span class="branch-4 cbranch-no" title="branch not covered" > default:</span>
1058
1090
  <span class="cstat-no" title="statement not covered" > throw new Error(`Unsupported action_type: "${action.action_type}"`);</span>
1059
1091
  }
1060
- <span class="cstat-no" title="statement not covered" > action.status = AIActionStatus.APPLIED_PENDING_REVIEW;</span>
1061
- <span class="cstat-no" title="statement not covered" > actionSucceeded = true;</span>
1062
- <span class="cstat-no" title="statement not covered" > this.logger.log(</span>
1092
+ action.status = AIActionStatus.APPLIED_PENDING_REVIEW;
1093
+ actionSucceeded = true;
1094
+ this.logger.log(
1063
1095
  `Action (input ${sessionInput.id}, type ${action.action_type}) tentatively applied successfully. Status: ${action.status}`,
1064
1096
  );
1065
1097
  } catch (error) {
1066
- <span class="cstat-no" title="statement not covered" > action.status = AIActionStatus.EXECUTION_FAILED;</span>
1067
- <span class="cstat-no" title="statement not covered" > errorMessage = error.message;</span>
1068
- <span class="cstat-no" title="statement not covered" > outcomeMessage = `Failed tentative application: ${error.message}`;</span>
1069
- <span class="cstat-no" title="statement not covered" > this.logger.error(</span>
1098
+ action.status = AIActionStatus.EXECUTION_FAILED;
1099
+ errorMessage = error.message;
1100
+ outcomeMessage = `Failed tentative application: ${error.message}`;
1101
+ this.logger.error(
1070
1102
  `Failed tentatively applying action (input ${sessionInput.id}, type ${action.action_type}): ${errorMessage}`,
1071
1103
  error.stack,
1072
1104
  );
1073
1105
  }
1074
1106
  &nbsp;
1075
- const savedAction = <span class="cstat-no" title="statement not covered" >await this.aiActionsRepository.save(action);</span>
1107
+ const savedAction = await this.aiActionsRepository.save(action);
1076
1108
  &nbsp;
1077
- const log = <span class="cstat-no" title="statement not covered" >await this.executionLogsService.createLog({</span>
1109
+ const log = await this.executionLogsService.createLog({
1078
1110
  action_id: savedAction.id,
1079
1111
  output: actionSucceeded ? outcomeMessage : undefined,
1080
1112
  error_message: errorMessage,
1081
1113
  });
1082
- <span class="cstat-no" title="statement not covered" > savedAction.executionLogs = [log]; </span>// Attach for immediate return if needed
1083
- <span class="cstat-no" title="statement not covered" > processedAIActions.push(savedAction);</span>
1114
+ savedAction.executionLogs = [log]; // Attach for immediate return if needed
1115
+ processedAIActions.push(savedAction);
1084
1116
  }
1085
- <span class="cstat-no" title="statement not covered" > this.logger.log(</span>
1117
+ this.logger.log(
1086
1118
  `Created and tentatively processed ${processedAIActions.length} actions for SessionInput ID ${sessionInput.id}.`,
1087
1119
  );
1088
- <span class="cstat-no" title="statement not covered" > return processedAIActions;</span>
1120
+ return processedAIActions;
1089
1121
  }
1090
1122
  &nbsp;
1091
- <span class="fstat-no" title="function not covered" > async </span>createAndAutoApplyActions(
1123
+ async createAndAutoApplyActions(
1092
1124
  sessionInput: SessionInput,
1093
1125
  ): Promise&lt;AIAction[]&gt; {
1094
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!sessionInput.raw_llm_response) {</span>
1126
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!sessionInput.raw_llm_response) {
1095
1127
  <span class="cstat-no" title="statement not covered" > this.logger.warn(</span>
1096
1128
  `No raw_llm_response in SessionInput ID ${sessionInput.id}. Cannot auto-apply actions.`,
1097
1129
  );
@@ -1099,88 +1131,104 @@ export class <span class="cstat-no" title="statement not covered" ><span class="
1099
1131
  }
1100
1132
  &nbsp;
1101
1133
  const { dtos: actionDtos, explanation } =
1102
- <span class="cstat-no" title="statement not covered" > await this.llmResponseParserService.parse(sessionInput.raw_llm_response);</span>
1134
+ await this.llmResponseParserService.parse(sessionInput.raw_llm_response);
1103
1135
  &nbsp;
1104
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (explanation) {</span>
1136
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (explanation) {
1105
1137
  <span class="cstat-no" title="statement not covered" > sessionInput.llm_response_explanation = explanation;</span>
1106
1138
  <span class="cstat-no" title="statement not covered" > await this.sessionInputsRepository.save(sessionInput);</span>
1107
1139
  }
1108
1140
  &nbsp;
1109
- const contextRequestResult = <span class="cstat-no" title="statement not covered" >await this.handleRequestContext(</span>
1141
+ const contextRequestResult = await this.handleRequestContext(
1110
1142
  sessionInput,
1111
1143
  actionDtos,
1112
1144
  );
1113
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (contextRequestResult) {</span>
1145
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (contextRequestResult) {
1114
1146
  <span class="cstat-no" title="statement not covered" > return contextRequestResult;</span>
1115
1147
  }
1116
1148
  &nbsp;
1117
- const processedActions: AIAction[] = <span class="cstat-no" title="statement not covered" >[];</span>
1118
- <span class="cstat-no" title="statement not covered" > for (const dto of actionDtos) {</span>
1119
- const action = <span class="cstat-no" title="statement not covered" >this.aiActionsRepository.create({</span>
1149
+ const processedActions: AIAction[] = [];
1150
+ for (const dto of actionDtos) {
1151
+ const action = this.aiActionsRepository.create({
1120
1152
  ...dto,
1121
1153
  input_id: sessionInput.id,
1122
1154
  sessionInput: { id: sessionInput.id },
1123
1155
  order_of_execution: dto.order_of_execution ?? 0,
1124
1156
  });
1125
1157
  &nbsp;
1126
- <span class="cstat-no" title="statement not covered" > try {</span>
1127
- <span class="cstat-no" title="statement not covered" > this.logger.log(`Auto-applying action for input ${sessionInput.id}`);</span>
1158
+ // Capture original_content_for_revert BEFORE applying changes
1159
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (
1160
+ dto.action_type === 'edit_file' ||
1161
+ dto.action_type === 'delete_file'
1162
+ ) {
1163
+ <span class="cstat-no" title="statement not covered" > action.original_content_for_revert = await this.readFileContent(</span>
1164
+ dto.file_path,
1165
+ );
1166
+ }
1167
+ &nbsp;
1168
+ try {
1169
+ this.logger.log(`Auto-applying action for input ${sessionInput.id}`);
1128
1170
  // This will throw on failure
1129
- const outcomeMessage = <span class="cstat-no" title="statement not covered" >await this.executeActionDto(dto);</span>
1130
- <span class="cstat-no" title="statement not covered" > action.status = AIActionStatus.CONFIRMED_KEPT;</span>
1131
- const savedAction = <span class="cstat-no" title="statement not covered" >await this.aiActionsRepository.save(action);</span>
1132
- <span class="cstat-no" title="statement not covered" > await this.executionLogsService.createLog({</span>
1171
+ const outcomeMessage = await this.executeActionDto(dto);
1172
+ action.status = AIActionStatus.CONFIRMED_KEPT;
1173
+ const savedAction = await this.aiActionsRepository.save(action);
1174
+ await this.executionLogsService.createLog({
1133
1175
  action_id: savedAction.id,
1134
1176
  output: outcomeMessage,
1135
1177
  });
1136
- <span class="cstat-no" title="statement not covered" > processedActions.push(savedAction);</span>
1178
+ processedActions.push(savedAction);
1137
1179
  } catch (error) {
1138
- <span class="cstat-no" title="statement not covered" > action.status = AIActionStatus.EXECUTION_FAILED;</span>
1139
- const savedAction = <span class="cstat-no" title="statement not covered" >await this.aiActionsRepository.save(action);</span>
1140
- <span class="cstat-no" title="statement not covered" > await this.executionLogsService.createLog({</span>
1180
+ action.status = AIActionStatus.EXECUTION_FAILED;
1181
+ const savedAction = await this.aiActionsRepository.save(action);
1182
+ await this.executionLogsService.createLog({
1141
1183
  action_id: savedAction.id,
1142
1184
  error_message: error.message,
1143
1185
  });
1144
- <span class="cstat-no" title="statement not covered" > processedActions.push(savedAction);</span>
1145
- <span class="cstat-no" title="statement not covered" > this.logger.error(</span>
1186
+ processedActions.push(savedAction);
1187
+ this.logger.error(
1146
1188
  `Failed to auto-apply action for input ${sessionInput.id}: ${error.message}`,
1147
1189
  error.stack,
1148
1190
  );
1149
1191
  // Re-throw to halt the orchestration
1150
- <span class="cstat-no" title="statement not covered" > throw error;</span>
1192
+ throw error;
1151
1193
  }
1152
1194
  }
1153
- <span class="cstat-no" title="statement not covered" > return processedActions;</span>
1195
+ return processedActions;
1154
1196
  }
1155
1197
  &nbsp;
1156
- private <span class="fstat-no" title="function not covered" >async </span>executeActionDto(dto: AIActionDto): Promise&lt;string&gt; {
1157
- <span class="cstat-no" title="statement not covered" > switch (dto.action_type) {</span>
1198
+ private async executeActionDto(dto: AIActionDto): Promise&lt;string&gt; {
1199
+ switch (dto.action_type) {
1158
1200
  case AIActionType.CREATE_FILE:
1159
- <span class="cstat-no" title="statement not covered" > await this.actionExecutionService.createFile(dto.file_path, dto.content);</span>
1160
- <span class="cstat-no" title="statement not covered" > return `File "${dto.file_path}" created.`;</span>
1161
- case AIActionType.EDIT_FILE:
1201
+ await this.actionExecutionService.createFile(
1202
+ dto.file_path,
1203
+ dto.content,
1204
+ );
1205
+ return `File "${dto.file_path}" created.`;
1206
+ <span class="branch-1 cbranch-no" title="branch not covered" > case AIActionType.EDIT_FILE:</span>
1162
1207
  <span class="cstat-no" title="statement not covered" > await this.actionExecutionService.editFile(dto.file_path, dto.content);</span>
1163
1208
  <span class="cstat-no" title="statement not covered" > return `File "${dto.file_path}" edited.`;</span>
1164
- case AIActionType.DELETE_FILE:
1209
+ <span class="branch-2 cbranch-no" title="branch not covered" > case AIActionType.DELETE_FILE:</span>
1165
1210
  <span class="cstat-no" title="statement not covered" > await this.actionExecutionService.deleteFile(dto.file_path);</span>
1166
1211
  <span class="cstat-no" title="statement not covered" > return `File "${dto.file_path}" deleted.`;</span>
1167
- case AIActionType.RUN_COMMAND:
1212
+ <span class="branch-3 cbranch-no" title="branch not covered" > case AIActionType.RUN_COMMAND:</span>
1168
1213
  const result = <span class="cstat-no" title="statement not covered" >await this.actionExecutionService.runCommand(</span>
1169
1214
  dto.command_string,
1170
1215
  );
1171
1216
  <span class="cstat-no" title="statement not covered" > return `Command executed. STDOUT: ${result.stdout || 'N/A'}, STDERR: ${result.stderr || 'N/A'}`;</span>
1172
- default:
1173
- <span class="cstat-no" title="statement not covered" > throw new Error(`Unsupported action type for auto-apply: ${dto.action_type}`);</span>
1217
+ <span class="branch-4 cbranch-no" title="branch not covered" > default:</span>
1218
+ <span class="cstat-no" title="statement not covered" > throw new Error(</span>
1219
+ `Unsupported action type for auto-apply: ${dto.action_type}`,
1220
+ );
1174
1221
  }
1175
1222
  }
1176
- }</pre></td></tr></table></pre>
1223
+ }
1224
+ &nbsp;</pre></td></tr></table></pre>
1177
1225
 
1178
1226
  <div class='push'></div><!-- for sticky footer -->
1179
1227
  </div><!-- /wrapper -->
1180
1228
  <div class='footer quiet pad2 space-top1 center small'>
1181
1229
  Code coverage generated by
1182
1230
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1183
- at 2025-07-30T23:37:05.373Z
1231
+ at 2025-09-12T19:21:55.945Z
1184
1232
  </div>
1185
1233
  <script src="../../prettify.js"></script>
1186
1234
  <script>