scai 0.1.178 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (770) hide show
  1. package/README.md +171 -260
  2. package/dist/__tests__/CommitSuggesterCmd.test.js +112 -0
  3. package/dist/__tests__/CommitSuggesterCmd.test.js.map +1 -0
  4. package/dist/__tests__/EvalReportCmd.test.js +645 -0
  5. package/dist/__tests__/EvalReportCmd.test.js.map +1 -0
  6. package/dist/__tests__/ModelCmd.test.js +64 -0
  7. package/dist/__tests__/ModelCmd.test.js.map +1 -0
  8. package/dist/__tests__/agents/agentActions.test.js +345 -0
  9. package/dist/__tests__/agents/agentActions.test.js.map +1 -0
  10. package/dist/__tests__/agents/agentFeedback.test.js +118 -0
  11. package/dist/__tests__/agents/agentFeedback.test.js.map +1 -0
  12. package/dist/__tests__/agents/agentGeneralScope.test.js +74 -0
  13. package/dist/__tests__/agents/agentGeneralScope.test.js.map +1 -0
  14. package/dist/__tests__/agents/agentLoop.test.js +1723 -0
  15. package/dist/__tests__/agents/agentLoop.test.js.map +1 -0
  16. package/dist/__tests__/agents/agentPolicyState.test.js +948 -0
  17. package/dist/__tests__/agents/agentPolicyState.test.js.map +1 -0
  18. package/dist/__tests__/agents/agentReadEvidence.test.js +170 -0
  19. package/dist/__tests__/agents/agentReadEvidence.test.js.map +1 -0
  20. package/dist/__tests__/agents/agentReadPersistence.test.js +129 -0
  21. package/dist/__tests__/agents/agentReadPersistence.test.js.map +1 -0
  22. package/dist/__tests__/agents/agentResumeCheckpoint.test.js +90 -0
  23. package/dist/__tests__/agents/agentResumeCheckpoint.test.js.map +1 -0
  24. package/dist/__tests__/agents/agentSearchBatchPlanner.test.js +289 -0
  25. package/dist/__tests__/agents/agentSearchBatchPlanner.test.js.map +1 -0
  26. package/dist/__tests__/agents/agentSearchOwnership.test.js +166 -0
  27. package/dist/__tests__/agents/agentSearchOwnership.test.js.map +1 -0
  28. package/dist/__tests__/agents/agentSearchRanking.test.js +139 -0
  29. package/dist/__tests__/agents/agentSearchRanking.test.js.map +1 -0
  30. package/dist/__tests__/agents/agentSearchRouting.test.js +584 -0
  31. package/dist/__tests__/agents/agentSearchRouting.test.js.map +1 -0
  32. package/dist/__tests__/agents/agentSearchScoring.test.js +23 -0
  33. package/dist/__tests__/agents/agentSearchScoring.test.js.map +1 -0
  34. package/dist/__tests__/agents/agentSearchShared.test.js +78 -0
  35. package/dist/__tests__/agents/agentSearchShared.test.js.map +1 -0
  36. package/dist/__tests__/agents/agentStateMachine.test.js +58 -0
  37. package/dist/__tests__/agents/agentStateMachine.test.js.map +1 -0
  38. package/dist/__tests__/agents/agentTaskPersistence.test.js +156 -0
  39. package/dist/__tests__/agents/agentTaskPersistence.test.js.map +1 -0
  40. package/dist/__tests__/agents/agentTools.test.js +69 -0
  41. package/dist/__tests__/agents/agentTools.test.js.map +1 -0
  42. package/dist/__tests__/agents/agentTransform.test.js +779 -0
  43. package/dist/__tests__/agents/agentTransform.test.js.map +1 -0
  44. package/dist/__tests__/agents/analysisPlanGenStep.test.js +157 -0
  45. package/dist/__tests__/agents/analysisPlanGenStep.test.js.map +1 -0
  46. package/dist/__tests__/agents/answerOnlyCompletion.test.js +75 -0
  47. package/dist/__tests__/agents/answerOnlyCompletion.test.js.map +1 -0
  48. package/dist/__tests__/agents/decideNextAction.test.js +1662 -0
  49. package/dist/__tests__/agents/decideNextAction.test.js.map +1 -0
  50. package/dist/__tests__/agents/deriveFocusFromSearchStep.test.js +258 -0
  51. package/dist/__tests__/agents/deriveFocusFromSearchStep.test.js.map +1 -0
  52. package/dist/__tests__/agents/evidenceVerifierStep.test.js +113 -0
  53. package/dist/__tests__/agents/evidenceVerifierStep.test.js.map +1 -0
  54. package/dist/__tests__/agents/executionPolicyResolver.test.js +208 -0
  55. package/dist/__tests__/agents/executionPolicyResolver.test.js.map +1 -0
  56. package/dist/__tests__/agents/fileCheckStep.test.js +299 -0
  57. package/dist/__tests__/agents/fileCheckStep.test.js.map +1 -0
  58. package/dist/__tests__/agents/giveUpEvaluatorStep.test.js +35 -0
  59. package/dist/__tests__/agents/giveUpEvaluatorStep.test.js.map +1 -0
  60. package/dist/__tests__/agents/guardState.test.js +297 -0
  61. package/dist/__tests__/agents/guardState.test.js.map +1 -0
  62. package/dist/__tests__/agents/mainAgentHeuristics.test.js +72 -0
  63. package/dist/__tests__/agents/mainAgentHeuristics.test.js.map +1 -0
  64. package/dist/__tests__/agents/objectiveEvaluatorStep.test.js +60 -0
  65. package/dist/__tests__/agents/objectiveEvaluatorStep.test.js.map +1 -0
  66. package/dist/__tests__/agents/outerLoopRecoveryEvaluator.test.js +207 -0
  67. package/dist/__tests__/agents/outerLoopRecoveryEvaluator.test.js.map +1 -0
  68. package/dist/__tests__/agents/prompting.test.js +363 -0
  69. package/dist/__tests__/agents/prompting.test.js.map +1 -0
  70. package/dist/__tests__/agents/readinessGateStep.test.js +180 -0
  71. package/dist/__tests__/agents/readinessGateStep.test.js.map +1 -0
  72. package/dist/__tests__/agents/reasonNextStep.test.js +56 -0
  73. package/dist/__tests__/agents/reasonNextStep.test.js.map +1 -0
  74. package/dist/__tests__/agents/reasonNextTaskStep.test.js +284 -0
  75. package/dist/__tests__/agents/reasonNextTaskStep.test.js.map +1 -0
  76. package/dist/__tests__/agents/resolveAgentTargetClassification.test.js +170 -0
  77. package/dist/__tests__/agents/resolveAgentTargetClassification.test.js.map +1 -0
  78. package/dist/__tests__/agents/resolveProgressState.test.js +526 -0
  79. package/dist/__tests__/agents/resolveProgressState.test.js.map +1 -0
  80. package/dist/__tests__/agents/resumeCheckpoint.test.js +50 -0
  81. package/dist/__tests__/agents/resumeCheckpoint.test.js.map +1 -0
  82. package/dist/__tests__/agents/routingDecisionStep.test.js +134 -0
  83. package/dist/__tests__/agents/routingDecisionStep.test.js.map +1 -0
  84. package/dist/__tests__/agents/scopeClassificationStep.test.js +118 -0
  85. package/dist/__tests__/agents/scopeClassificationStep.test.js.map +1 -0
  86. package/dist/__tests__/agents/searchContext.test.js +97 -0
  87. package/dist/__tests__/agents/searchContext.test.js.map +1 -0
  88. package/dist/__tests__/agents/selectRelevantSourcesStep.test.js +73 -0
  89. package/dist/__tests__/agents/selectRelevantSourcesStep.test.js.map +1 -0
  90. package/dist/__tests__/agents/structuredOutput.test.js +45 -0
  91. package/dist/__tests__/agents/structuredOutput.test.js.map +1 -0
  92. package/dist/__tests__/agents/transformPlanGenStep.fallback.test.js +59 -0
  93. package/dist/__tests__/agents/transformPlanGenStep.fallback.test.js.map +1 -0
  94. package/dist/__tests__/agents/transformPlanGenStep.test.js +92 -0
  95. package/dist/__tests__/agents/transformPlanGenStep.test.js.map +1 -0
  96. package/dist/__tests__/agents/understandIntentStep.test.js +237 -0
  97. package/dist/__tests__/agents/understandIntentStep.test.js.map +1 -0
  98. package/dist/__tests__/agents/understandResumeContext.test.js +65 -0
  99. package/dist/__tests__/agents/understandResumeContext.test.js.map +1 -0
  100. package/dist/__tests__/agents/understandScope.test.js +227 -0
  101. package/dist/__tests__/agents/understandScope.test.js.map +1 -0
  102. package/dist/__tests__/agents/validateChangesStep.test.js +52 -0
  103. package/dist/__tests__/agents/validateChangesStep.test.js.map +1 -0
  104. package/dist/__tests__/askCommandTaskBinding.test.js +176 -0
  105. package/dist/__tests__/askCommandTaskBinding.test.js.map +1 -0
  106. package/dist/__tests__/commandVisibility.test.js +25 -0
  107. package/dist/__tests__/commandVisibility.test.js.map +1 -0
  108. package/dist/__tests__/config.devOutput.test.js +82 -0
  109. package/dist/__tests__/config.devOutput.test.js.map +1 -0
  110. package/dist/__tests__/currentContext.test.js +43 -0
  111. package/dist/__tests__/currentContext.test.js.map +1 -0
  112. package/dist/__tests__/daemonWorker.test.js +51 -0
  113. package/dist/__tests__/daemonWorker.test.js.map +1 -0
  114. package/dist/__tests__/dialogState.test.js +113 -0
  115. package/dist/__tests__/dialogState.test.js.map +1 -0
  116. package/dist/__tests__/evalCommands.test.js +506 -0
  117. package/dist/__tests__/evalCommands.test.js.map +1 -0
  118. package/dist/__tests__/evalCommandsSummary.test.js +68 -0
  119. package/dist/__tests__/evalCommandsSummary.test.js.map +1 -0
  120. package/dist/__tests__/example.test.js +1 -0
  121. package/dist/__tests__/example.test.js.map +1 -0
  122. package/dist/__tests__/factory.commitCommand.test.js +45 -0
  123. package/dist/__tests__/factory.commitCommand.test.js.map +1 -0
  124. package/dist/__tests__/factory.devOutputCommand.test.js +122 -0
  125. package/dist/__tests__/factory.devOutputCommand.test.js.map +1 -0
  126. package/dist/__tests__/factory.evalCommands.test.js +38 -0
  127. package/dist/__tests__/factory.evalCommands.test.js.map +1 -0
  128. package/dist/__tests__/factory.planCommand.test.js +35 -0
  129. package/dist/__tests__/factory.planCommand.test.js.map +1 -0
  130. package/dist/__tests__/factory.setupCommand.test.js +34 -0
  131. package/dist/__tests__/factory.setupCommand.test.js.map +1 -0
  132. package/dist/__tests__/factory.statusCommand.test.js +54 -0
  133. package/dist/__tests__/factory.statusCommand.test.js.map +1 -0
  134. package/dist/__tests__/fileRules/queryTokenRules.test.js +35 -0
  135. package/dist/__tests__/fileRules/queryTokenRules.test.js.map +1 -0
  136. package/dist/__tests__/fileRules/searchPathClassification.test.js +57 -0
  137. package/dist/__tests__/fileRules/searchPathClassification.test.js.map +1 -0
  138. package/dist/__tests__/generate.ollamaRecovery.test.js +344 -0
  139. package/dist/__tests__/generate.ollamaRecovery.test.js.map +1 -0
  140. package/dist/__tests__/index.modelStartup.test.js +24 -0
  141. package/dist/__tests__/index.modelStartup.test.js.map +1 -0
  142. package/dist/__tests__/indexCmd.test.js +85 -0
  143. package/dist/__tests__/indexCmd.test.js.map +1 -0
  144. package/dist/__tests__/indexSlashCommand.test.js +50 -0
  145. package/dist/__tests__/indexSlashCommand.test.js.map +1 -0
  146. package/dist/__tests__/ollamaService.test.js +103 -0
  147. package/dist/__tests__/ollamaService.test.js.map +1 -0
  148. package/dist/__tests__/pipeline/modules/codeTransformModule.small-file.test.js +68 -0
  149. package/dist/__tests__/pipeline/modules/codeTransformModule.small-file.test.js.map +1 -0
  150. package/dist/__tests__/pipeline/modules/commitSuggesterModule.test.js +68 -0
  151. package/dist/__tests__/pipeline/modules/commitSuggesterModule.test.js.map +1 -0
  152. package/dist/__tests__/pipeline/modules/fileSearchModule.test.js +284 -0
  153. package/dist/__tests__/pipeline/modules/fileSearchModule.test.js.map +1 -0
  154. package/dist/__tests__/pipeline/modules/finalAnswerModule.test.js +1139 -0
  155. package/dist/__tests__/pipeline/modules/finalAnswerModule.test.js.map +1 -0
  156. package/dist/__tests__/pipeline/modules/readFileModule.test.js +146 -0
  157. package/dist/__tests__/pipeline/modules/readFileModule.test.js.map +1 -0
  158. package/dist/__tests__/pipeline/modules/semanticAnalysisModule.test.js +192 -0
  159. package/dist/__tests__/pipeline/modules/semanticAnalysisModule.test.js.map +1 -0
  160. package/dist/__tests__/repoIdentity.test.js +31 -0
  161. package/dist/__tests__/repoIdentity.test.js.map +1 -0
  162. package/dist/__tests__/resumeContext.test.js +87 -0
  163. package/dist/__tests__/resumeContext.test.js.map +1 -0
  164. package/dist/__tests__/resumeState.test.js +239 -0
  165. package/dist/__tests__/resumeState.test.js.map +1 -0
  166. package/dist/__tests__/search/SearchOrchestrator.test.js +836 -0
  167. package/dist/__tests__/search/SearchOrchestrator.test.js.map +1 -0
  168. package/dist/__tests__/shellDialogUi.test.js +52 -0
  169. package/dist/__tests__/shellDialogUi.test.js.map +1 -0
  170. package/dist/__tests__/shellSession.test.js +102 -0
  171. package/dist/__tests__/shellSession.test.js.map +1 -0
  172. package/dist/__tests__/statusOwner.test.js +215 -0
  173. package/dist/__tests__/statusOwner.test.js.map +1 -0
  174. package/dist/__tests__/testing/contextEval.test.js +244 -0
  175. package/dist/__tests__/testing/contextEval.test.js.map +1 -0
  176. package/dist/__tests__/testing/harnessArtifacts.test.js +124 -0
  177. package/dist/__tests__/testing/harnessArtifacts.test.js.map +1 -0
  178. package/dist/__tests__/testing/llmTraceSession.test.js +67 -0
  179. package/dist/__tests__/testing/llmTraceSession.test.js.map +1 -0
  180. package/dist/__tests__/testing/registerDevCliCommands.test.js +35 -0
  181. package/dist/__tests__/testing/registerDevCliCommands.test.js.map +1 -0
  182. package/dist/__tests__/testing/runDiagnosis.test.js +159 -0
  183. package/dist/__tests__/testing/runDiagnosis.test.js.map +1 -0
  184. package/dist/__tests__/testing/runtimeLogReader.test.js +66 -0
  185. package/dist/__tests__/testing/runtimeLogReader.test.js.map +1 -0
  186. package/dist/__tests__/testing/testCommands.test.js +53 -0
  187. package/dist/__tests__/testing/testCommands.test.js.map +1 -0
  188. package/dist/__tests__/utils/compileSearchQuery.test.js +38 -0
  189. package/dist/__tests__/utils/compileSearchQuery.test.js.map +1 -0
  190. package/dist/__tests__/utils/consolePresentation.test.js +105 -0
  191. package/dist/__tests__/utils/consolePresentation.test.js.map +1 -0
  192. package/dist/__tests__/utils/extractFileReferences.test.js +41 -0
  193. package/dist/__tests__/utils/extractFileReferences.test.js.map +1 -0
  194. package/dist/__tests__/utils/log.test.js +34 -0
  195. package/dist/__tests__/utils/log.test.js.map +1 -0
  196. package/dist/__tests__/utils/runtimeLogger.test.js +200 -0
  197. package/dist/__tests__/utils/runtimeLogger.test.js.map +1 -0
  198. package/dist/__tests__/utils/spinner.test.js +31 -0
  199. package/dist/__tests__/utils/spinner.test.js.map +1 -0
  200. package/dist/__tests__/utils/verifyFocusPreference.test.js +41 -0
  201. package/dist/__tests__/utils/verifyFocusPreference.test.js.map +1 -0
  202. package/dist/agent/actions/index.js +301 -0
  203. package/dist/agent/actions/index.js.map +1 -0
  204. package/dist/agent/actions/normalize.js +360 -0
  205. package/dist/agent/actions/normalize.js.map +1 -0
  206. package/dist/agent/actions/schemas.js +129 -0
  207. package/dist/agent/actions/schemas.js.map +1 -0
  208. package/dist/agent/evidence/index.js +320 -0
  209. package/dist/agent/evidence/index.js.map +1 -0
  210. package/dist/agent/feedback/index.js +187 -0
  211. package/dist/agent/feedback/index.js.map +1 -0
  212. package/dist/agent/finalization/index.js +35 -0
  213. package/dist/agent/finalization/index.js.map +1 -0
  214. package/dist/agent/index.js +126 -0
  215. package/dist/agent/index.js.map +1 -0
  216. package/dist/agent/logging/index.js +350 -0
  217. package/dist/agent/logging/index.js.map +1 -0
  218. package/dist/agent/persistence/boot.js +58 -0
  219. package/dist/agent/persistence/boot.js.map +1 -0
  220. package/dist/agent/persistence/currentTask.js +36 -0
  221. package/dist/agent/persistence/currentTask.js.map +1 -0
  222. package/dist/agent/persistence/hydrate.js +42 -0
  223. package/dist/agent/persistence/hydrate.js.map +1 -0
  224. package/dist/agent/persistence/index.js +15 -0
  225. package/dist/agent/persistence/index.js.map +1 -0
  226. package/dist/agent/persistence/snapshots.js +97 -0
  227. package/dist/agent/persistence/snapshots.js.map +1 -0
  228. package/dist/agent/persistence/steps.js +95 -0
  229. package/dist/agent/persistence/steps.js.map +1 -0
  230. package/dist/agent/persistence/tasks.js +195 -0
  231. package/dist/agent/persistence/tasks.js.map +1 -0
  232. package/dist/agent/persistence/turns.js +92 -0
  233. package/dist/agent/persistence/turns.js.map +1 -0
  234. package/dist/agent/policy/ambiguityResolution.js +226 -0
  235. package/dist/agent/policy/ambiguityResolution.js.map +1 -0
  236. package/dist/agent/policy/contracts.js +2 -0
  237. package/dist/agent/policy/contracts.js.map +1 -0
  238. package/dist/agent/policy/coveragePolicy.js +309 -0
  239. package/dist/agent/policy/coveragePolicy.js.map +1 -0
  240. package/dist/agent/policy/endDecisionPolicy.js +31 -0
  241. package/dist/agent/policy/endDecisionPolicy.js.map +1 -0
  242. package/dist/agent/policy/index.js +344 -0
  243. package/dist/agent/policy/index.js.map +1 -0
  244. package/dist/agent/policy/loopReview.js +778 -0
  245. package/dist/agent/policy/loopReview.js.map +1 -0
  246. package/dist/agent/policy/readinessPolicy.js +108 -0
  247. package/dist/agent/policy/readinessPolicy.js.map +1 -0
  248. package/dist/agent/policy/resolutionPipeline.js +356 -0
  249. package/dist/agent/policy/resolutionPipeline.js.map +1 -0
  250. package/dist/agent/policy/targetClassification.js +33 -0
  251. package/dist/agent/policy/targetClassification.js.map +1 -0
  252. package/dist/agent/prompting/actionChoice.js +90 -0
  253. package/dist/agent/prompting/actionChoice.js.map +1 -0
  254. package/dist/agent/prompting/finalAnswer.js +38 -0
  255. package/dist/agent/prompting/finalAnswer.js.map +1 -0
  256. package/dist/agent/prompting/index.js +14 -0
  257. package/dist/agent/prompting/index.js.map +1 -0
  258. package/dist/agent/prompting/plan.js +59 -0
  259. package/dist/agent/prompting/plan.js.map +1 -0
  260. package/dist/agent/prompting/transform.js +175 -0
  261. package/dist/agent/prompting/transform.js.map +1 -0
  262. package/dist/agent/prompting/understand.js +70 -0
  263. package/dist/agent/prompting/understand.js.map +1 -0
  264. package/dist/agent/read/freshness.js +29 -0
  265. package/dist/agent/read/freshness.js.map +1 -0
  266. package/dist/agent/read/fullReadPrompt.js +43 -0
  267. package/dist/agent/read/fullReadPrompt.js.map +1 -0
  268. package/dist/agent/read/index.js +140 -0
  269. package/dist/agent/read/index.js.map +1 -0
  270. package/dist/agent/read/persistence.js +88 -0
  271. package/dist/agent/read/persistence.js.map +1 -0
  272. package/dist/agent/read/summarizeReadEvidence.js +733 -0
  273. package/dist/agent/read/summarizeReadEvidence.js.map +1 -0
  274. package/dist/agent/read/targetResolution.js +126 -0
  275. package/dist/agent/read/targetResolution.js.map +1 -0
  276. package/dist/agent/resume/checkpoint.js +41 -0
  277. package/dist/agent/resume/checkpoint.js.map +1 -0
  278. package/dist/agent/runtime/lifecycle.js +67 -0
  279. package/dist/agent/runtime/lifecycle.js.map +1 -0
  280. package/dist/agent/runtime/progress.js +178 -0
  281. package/dist/agent/runtime/progress.js.map +1 -0
  282. package/dist/agent/runtime/runAgentLoop.js +402 -0
  283. package/dist/agent/runtime/runAgentLoop.js.map +1 -0
  284. package/dist/agent/runtime/runAgentPlanOnly.js +127 -0
  285. package/dist/agent/runtime/runAgentPlanOnly.js.map +1 -0
  286. package/dist/agent/runtime/understand.js +336 -0
  287. package/dist/agent/runtime/understand.js.map +1 -0
  288. package/dist/agent/search/batchPlanner.js +274 -0
  289. package/dist/agent/search/batchPlanner.js.map +1 -0
  290. package/dist/agent/search/candidateRetentionPolicy.js +184 -0
  291. package/dist/agent/search/candidateRetentionPolicy.js.map +1 -0
  292. package/dist/agent/search/directory.js +51 -0
  293. package/dist/agent/search/directory.js.map +1 -0
  294. package/dist/agent/search/exactTarget.js +151 -0
  295. package/dist/agent/search/exactTarget.js.map +1 -0
  296. package/dist/agent/search/fragment.js +110 -0
  297. package/dist/agent/search/fragment.js.map +1 -0
  298. package/dist/agent/search/index.js +166 -0
  299. package/dist/agent/search/index.js.map +1 -0
  300. package/dist/agent/search/laneClassifier.js +119 -0
  301. package/dist/agent/search/laneClassifier.js.map +1 -0
  302. package/dist/agent/search/limits.js +10 -0
  303. package/dist/agent/search/limits.js.map +1 -0
  304. package/dist/agent/search/ranking.js +22 -0
  305. package/dist/agent/search/ranking.js.map +1 -0
  306. package/dist/agent/search/regex.js +83 -0
  307. package/dist/agent/search/regex.js.map +1 -0
  308. package/dist/agent/search/routePolicy.js +11 -0
  309. package/dist/agent/search/routePolicy.js.map +1 -0
  310. package/dist/agent/search/searchContext.js +128 -0
  311. package/dist/agent/search/searchContext.js.map +1 -0
  312. package/dist/agent/search/semantic.js +113 -0
  313. package/dist/agent/search/semantic.js.map +1 -0
  314. package/dist/agent/search/semanticIndexSearch.js +202 -0
  315. package/dist/agent/search/semanticIndexSearch.js.map +1 -0
  316. package/dist/agent/search/shared.js +283 -0
  317. package/dist/agent/search/shared.js.map +1 -0
  318. package/dist/agent/search/shell.js +202 -0
  319. package/dist/agent/search/shell.js.map +1 -0
  320. package/dist/agent/search/snippetEvidence.js +57 -0
  321. package/dist/agent/search/snippetEvidence.js.map +1 -0
  322. package/dist/agent/search/types.js +2 -0
  323. package/dist/agent/search/types.js.map +1 -0
  324. package/dist/agent/state/index.js +99 -0
  325. package/dist/agent/state/index.js.map +1 -0
  326. package/dist/agent/state/memory.js +56 -0
  327. package/dist/agent/state/memory.js.map +1 -0
  328. package/dist/agent/structuredOutput/index.js +28 -0
  329. package/dist/agent/structuredOutput/index.js.map +1 -0
  330. package/dist/agent/tools/index.js +199 -0
  331. package/dist/agent/tools/index.js.map +1 -0
  332. package/dist/agent/transform/index.js +519 -0
  333. package/dist/agent/transform/index.js.map +1 -0
  334. package/dist/agent/transform/syntax.js +49 -0
  335. package/dist/agent/transform/syntax.js.map +1 -0
  336. package/dist/agent/types.js +20 -0
  337. package/dist/agent/types.js.map +1 -0
  338. package/dist/agents/actionRegistry.js +114 -0
  339. package/dist/agents/actionRegistry.js.map +1 -0
  340. package/dist/agents/agent.js +5 -0
  341. package/dist/agents/agent.js.map +1 -0
  342. package/dist/agents/agentActions.js +5 -0
  343. package/dist/agents/agentActions.js.map +1 -0
  344. package/dist/agents/agentEvidence.js +5 -0
  345. package/dist/agents/agentEvidence.js.map +1 -0
  346. package/dist/agents/agentFeedback.js +5 -0
  347. package/dist/agents/agentFeedback.js.map +1 -0
  348. package/dist/agents/agentLogging.js +5 -0
  349. package/dist/agents/agentLogging.js.map +1 -0
  350. package/dist/agents/agentLoop.js +5 -0
  351. package/dist/agents/agentLoop.js.map +1 -0
  352. package/dist/agents/agentMemory.js +5 -0
  353. package/dist/agents/agentMemory.js.map +1 -0
  354. package/dist/agents/agentPlanMode.js +5 -0
  355. package/dist/agents/agentPlanMode.js.map +1 -0
  356. package/dist/agents/agentPolicyState.js +5 -0
  357. package/dist/agents/agentPolicyState.js.map +1 -0
  358. package/dist/agents/agentProgress.js +93 -0
  359. package/dist/agents/agentProgress.js.map +1 -0
  360. package/dist/agents/agentSchemas.js +5 -0
  361. package/dist/agents/agentSchemas.js.map +1 -0
  362. package/dist/agents/agentSearchScoring.js +5 -0
  363. package/dist/agents/agentSearchScoring.js.map +1 -0
  364. package/dist/agents/agentStateMachine.js +5 -0
  365. package/dist/agents/agentStateMachine.js.map +1 -0
  366. package/dist/agents/agentTools.js +5 -0
  367. package/dist/agents/agentTools.js.map +1 -0
  368. package/dist/agents/agentTypes.js +5 -0
  369. package/dist/agents/agentTypes.js.map +1 -0
  370. package/dist/agents/agentUnderstand.js +5 -0
  371. package/dist/agents/agentUnderstand.js.map +1 -0
  372. package/dist/agents/analysisPlanGenStep.js +194 -17
  373. package/dist/agents/analysisPlanGenStep.js.map +1 -0
  374. package/dist/agents/answerOnlyCompletion.js +32 -0
  375. package/dist/agents/answerOnlyCompletion.js.map +1 -0
  376. package/dist/agents/collaboratorStep.js +1 -0
  377. package/dist/agents/collaboratorStep.js.map +1 -0
  378. package/dist/agents/decideNextAction.js +444 -0
  379. package/dist/agents/decideNextAction.js.map +1 -0
  380. package/dist/agents/deriveFocusFromSearchStep.js +83 -0
  381. package/dist/agents/deriveFocusFromSearchStep.js.map +1 -0
  382. package/dist/agents/evidenceVerifierStep.js +104 -13
  383. package/dist/agents/evidenceVerifierStep.js.map +1 -0
  384. package/dist/agents/fileCheckStep.js +381 -12
  385. package/dist/agents/fileCheckStep.js.map +1 -0
  386. package/dist/agents/giveUpEvaluatorStep.js +63 -0
  387. package/dist/agents/giveUpEvaluatorStep.js.map +1 -0
  388. package/dist/agents/guardPolicy.js +20 -0
  389. package/dist/agents/guardPolicy.js.map +1 -0
  390. package/dist/agents/guards/executionPolicyResolver.js +165 -0
  391. package/dist/agents/guards/executionPolicyResolver.js.map +1 -0
  392. package/dist/agents/guards/guardState.js +195 -0
  393. package/dist/agents/guards/guardState.js.map +1 -0
  394. package/dist/agents/guards/resolveProgressState.js +403 -0
  395. package/dist/agents/guards/resolveProgressState.js.map +1 -0
  396. package/dist/agents/infoPlanGenStep.js +66 -8
  397. package/dist/agents/infoPlanGenStep.js.map +1 -0
  398. package/dist/agents/integrateFeedbackStep.js +1 -0
  399. package/dist/agents/integrateFeedbackStep.js.map +1 -0
  400. package/dist/agents/iterationFileSelector.js +8 -7
  401. package/dist/agents/iterationFileSelector.js.map +1 -0
  402. package/dist/agents/mainAgentActivityLog.js +85 -0
  403. package/dist/agents/mainAgentActivityLog.js.map +1 -0
  404. package/dist/agents/mainAgentHeuristics.js +173 -0
  405. package/dist/agents/mainAgentHeuristics.js.map +1 -0
  406. package/dist/agents/mainAgentVerify.js +159 -0
  407. package/dist/agents/mainAgentVerify.js.map +1 -0
  408. package/dist/agents/objectiveEvaluatorStep.js +103 -0
  409. package/dist/agents/objectiveEvaluatorStep.js.map +1 -0
  410. package/dist/agents/outerLoopRecoveryEvaluator.js +108 -0
  411. package/dist/agents/outerLoopRecoveryEvaluator.js.map +1 -0
  412. package/dist/agents/readinessGateStep.js +95 -9
  413. package/dist/agents/readinessGateStep.js.map +1 -0
  414. package/dist/agents/reasonNextStep.js +9 -8
  415. package/dist/agents/reasonNextStep.js.map +1 -0
  416. package/dist/agents/reasonNextTaskStep.js +267 -144
  417. package/dist/agents/reasonNextTaskStep.js.map +1 -0
  418. package/dist/agents/researchPlanGenStep.js +61 -25
  419. package/dist/agents/researchPlanGenStep.js.map +1 -0
  420. package/dist/agents/resolveAgentTargetClassification.js +5 -0
  421. package/dist/agents/resolveAgentTargetClassification.js.map +1 -0
  422. package/dist/agents/resolveExecutionModeStep.js +1 -0
  423. package/dist/agents/resolveExecutionModeStep.js.map +1 -0
  424. package/dist/agents/resolveExplicitTargetsStep.js +74 -0
  425. package/dist/agents/resolveExplicitTargetsStep.js.map +1 -0
  426. package/dist/agents/routingDecisionStep.js +58 -11
  427. package/dist/agents/routingDecisionStep.js.map +1 -0
  428. package/dist/agents/scopeClassificationStep.js +66 -3
  429. package/dist/agents/scopeClassificationStep.js.map +1 -0
  430. package/dist/agents/selectRelevantSourcesStep.js +13 -5
  431. package/dist/agents/selectRelevantSourcesStep.js.map +1 -0
  432. package/dist/agents/structuralPreloadStep.js +3 -4
  433. package/dist/agents/structuralPreloadStep.js.map +1 -0
  434. package/dist/agents/transformPlanGenStep.js +105 -18
  435. package/dist/agents/transformPlanGenStep.js.map +1 -0
  436. package/dist/agents/understandIntentStep.js +237 -17
  437. package/dist/agents/understandIntentStep.js.map +1 -0
  438. package/dist/agents/validateChangesStep.js +16 -2
  439. package/dist/agents/validateChangesStep.js.map +1 -0
  440. package/dist/agents/writeFileStep.js +1 -0
  441. package/dist/agents/writeFileStep.js.map +1 -0
  442. package/dist/commands/AskCmd.js +139 -44
  443. package/dist/commands/AskCmd.js.map +1 -0
  444. package/dist/commands/BackupCmd.js +1 -0
  445. package/dist/commands/BackupCmd.js.map +1 -0
  446. package/dist/commands/ChangeLogUpdateCmd.js +1 -0
  447. package/dist/commands/ChangeLogUpdateCmd.js.map +1 -0
  448. package/dist/commands/CommitSuggesterCmd.js +55 -13
  449. package/dist/commands/CommitSuggesterCmd.js.map +1 -0
  450. package/dist/commands/DaemonCmd.js +52 -14
  451. package/dist/commands/DaemonCmd.js.map +1 -0
  452. package/dist/commands/DeleteIndex.js +1 -0
  453. package/dist/commands/DeleteIndex.js.map +1 -0
  454. package/dist/commands/EvalReportCmd.js +374 -0
  455. package/dist/commands/EvalReportCmd.js.map +1 -0
  456. package/dist/commands/FindCmd.js +1 -0
  457. package/dist/commands/FindCmd.js.map +1 -0
  458. package/dist/commands/GitCmd.js +1 -0
  459. package/dist/commands/GitCmd.js.map +1 -0
  460. package/dist/commands/IndexCmd.js +11 -79
  461. package/dist/commands/IndexCmd.js.map +1 -0
  462. package/dist/commands/InspectCmd.js +1 -0
  463. package/dist/commands/InspectCmd.js.map +1 -0
  464. package/dist/commands/ModelCmd.js +24 -0
  465. package/dist/commands/ModelCmd.js.map +1 -0
  466. package/dist/commands/ReadlineSingleton.js +1 -0
  467. package/dist/commands/ReadlineSingleton.js.map +1 -0
  468. package/dist/commands/ResetDbCmd.js +18 -1
  469. package/dist/commands/ResetDbCmd.js.map +1 -0
  470. package/dist/commands/ReviewCmd.js +1 -0
  471. package/dist/commands/ReviewCmd.js.map +1 -0
  472. package/dist/commands/StatusCmd.js +22 -0
  473. package/dist/commands/StatusCmd.js.map +1 -0
  474. package/dist/commands/StopDaemonCmd.js +1 -0
  475. package/dist/commands/StopDaemonCmd.js.map +1 -0
  476. package/dist/commands/SummaryCmd.js +1 -0
  477. package/dist/commands/SummaryCmd.js.map +1 -0
  478. package/dist/commands/SwitchCmd.js +9 -15
  479. package/dist/commands/SwitchCmd.js.map +1 -0
  480. package/dist/commands/TasksCmd.js +142 -57
  481. package/dist/commands/TasksCmd.js.map +1 -0
  482. package/dist/commands/TestCmd.js +66 -0
  483. package/dist/commands/TestCmd.js.map +1 -0
  484. package/dist/commands/WorkflowCmd.js +1 -0
  485. package/dist/commands/WorkflowCmd.js.map +1 -0
  486. package/dist/commands/commandVisibility.js +27 -0
  487. package/dist/commands/commandVisibility.js.map +1 -0
  488. package/dist/commands/evalCommands.js +1337 -0
  489. package/dist/commands/evalCommands.js.map +1 -0
  490. package/dist/commands/factory.js +206 -38
  491. package/dist/commands/factory.js.map +1 -0
  492. package/dist/config.js +62 -11
  493. package/dist/config.js.map +1 -0
  494. package/dist/constants.js +21 -3
  495. package/dist/constants.js.map +1 -0
  496. package/dist/context.js +33 -32
  497. package/dist/context.js.map +1 -0
  498. package/dist/daemon/daemonQueues.js +1 -20
  499. package/dist/daemon/daemonQueues.js.map +1 -0
  500. package/dist/daemon/daemonWorker.js +26 -37
  501. package/dist/daemon/daemonWorker.js.map +1 -0
  502. package/dist/daemon/generateSummaries.js +1 -0
  503. package/dist/daemon/generateSummaries.js.map +1 -0
  504. package/dist/daemon/runFolderCapsuleBatch.js +1 -0
  505. package/dist/daemon/runFolderCapsuleBatch.js.map +1 -0
  506. package/dist/daemon/runIndexingBatch.js +1 -0
  507. package/dist/daemon/runIndexingBatch.js.map +1 -0
  508. package/dist/daemon/runKgBatch.js +9 -1
  509. package/dist/daemon/runKgBatch.js.map +1 -0
  510. package/dist/db/backup.js +1 -0
  511. package/dist/db/backup.js.map +1 -0
  512. package/dist/db/client.js +18 -3
  513. package/dist/db/client.js.map +1 -0
  514. package/dist/db/fileIndex.js +110 -152
  515. package/dist/db/fileIndex.js.map +1 -0
  516. package/dist/db/functionExtractors/extractFromJava.js +1 -0
  517. package/dist/db/functionExtractors/extractFromJava.js.map +1 -0
  518. package/dist/db/functionExtractors/extractFromJs.js +1 -0
  519. package/dist/db/functionExtractors/extractFromJs.js.map +1 -0
  520. package/dist/db/functionExtractors/extractFromTs.js +1 -0
  521. package/dist/db/functionExtractors/extractFromTs.js.map +1 -0
  522. package/dist/db/functionExtractors/extractFromXML.js +1 -0
  523. package/dist/db/functionExtractors/extractFromXML.js.map +1 -0
  524. package/dist/db/functionExtractors/index.js +1 -0
  525. package/dist/db/functionExtractors/index.js.map +1 -0
  526. package/dist/db/functionIndex.js +9 -0
  527. package/dist/db/functionIndex.js.map +1 -0
  528. package/dist/db/schema.js +314 -99
  529. package/dist/db/schema.js.map +1 -0
  530. package/dist/db/sqlTemplates.js +1 -0
  531. package/dist/db/sqlTemplates.js.map +1 -0
  532. package/dist/fileRules/builtins.js +1 -0
  533. package/dist/fileRules/builtins.js.map +1 -0
  534. package/dist/fileRules/classifyFile.js +1 -0
  535. package/dist/fileRules/classifyFile.js.map +1 -0
  536. package/dist/fileRules/codeAllowedExtensions.js +1 -0
  537. package/dist/fileRules/codeAllowedExtensions.js.map +1 -0
  538. package/dist/fileRules/detectFileType.js +1 -0
  539. package/dist/fileRules/detectFileType.js.map +1 -0
  540. package/dist/fileRules/fileClassifier.js +1 -0
  541. package/dist/fileRules/fileClassifier.js.map +1 -0
  542. package/dist/fileRules/fileExceptions.js +1 -0
  543. package/dist/fileRules/fileExceptions.js.map +1 -0
  544. package/dist/fileRules/ignoredExtensions.js +1 -0
  545. package/dist/fileRules/ignoredExtensions.js.map +1 -0
  546. package/dist/fileRules/ignoredPaths.js +48 -5
  547. package/dist/fileRules/ignoredPaths.js.map +1 -0
  548. package/dist/fileRules/queryTokenRules.js +176 -0
  549. package/dist/fileRules/queryTokenRules.js.map +1 -0
  550. package/dist/fileRules/searchPathClassification.js +58 -0
  551. package/dist/fileRules/searchPathClassification.js.map +1 -0
  552. package/dist/fileRules/shouldIgnoreFiles.js +1 -0
  553. package/dist/fileRules/shouldIgnoreFiles.js.map +1 -0
  554. package/dist/fileRules/stopWords.js +9 -0
  555. package/dist/fileRules/stopWords.js.map +1 -0
  556. package/dist/fileRules/wellKnownRepoFiles.js +1 -0
  557. package/dist/fileRules/wellKnownRepoFiles.js.map +1 -0
  558. package/dist/git/commitSummary.js +227 -0
  559. package/dist/git/commitSummary.js.map +1 -0
  560. package/dist/github/api.js +1 -0
  561. package/dist/github/api.js.map +1 -0
  562. package/dist/github/auth.js +1 -0
  563. package/dist/github/auth.js.map +1 -0
  564. package/dist/github/github.js +1 -0
  565. package/dist/github/github.js.map +1 -0
  566. package/dist/github/githubAuthCheck.js +1 -0
  567. package/dist/github/githubAuthCheck.js.map +1 -0
  568. package/dist/github/postComments.js +1 -0
  569. package/dist/github/postComments.js.map +1 -0
  570. package/dist/github/repo.js +15 -24
  571. package/dist/github/repo.js.map +1 -0
  572. package/dist/github/token.js +1 -0
  573. package/dist/github/token.js.map +1 -0
  574. package/dist/github/types.js +1 -0
  575. package/dist/github/types.js.map +1 -0
  576. package/dist/index.js +318 -37
  577. package/dist/index.js.map +1 -0
  578. package/dist/lib/generate.js +264 -20
  579. package/dist/lib/generate.js.map +1 -0
  580. package/dist/lib/generateFolderCapsules.js +1 -0
  581. package/dist/lib/generateFolderCapsules.js.map +1 -0
  582. package/dist/lib/ollamaModelPolicy.js +59 -0
  583. package/dist/lib/ollamaModelPolicy.js.map +1 -0
  584. package/dist/lib/spinner.js +29 -9
  585. package/dist/lib/spinner.js.map +1 -0
  586. package/dist/modelSetup.js +25 -78
  587. package/dist/modelSetup.js.map +1 -0
  588. package/dist/pipeline/modules/changeLogModule.js +10 -1
  589. package/dist/pipeline/modules/changeLogModule.js.map +1 -0
  590. package/dist/pipeline/modules/cleanupModule.js +1 -0
  591. package/dist/pipeline/modules/cleanupModule.js.map +1 -0
  592. package/dist/pipeline/modules/codeTransformModule.js +10 -16
  593. package/dist/pipeline/modules/codeTransformModule.js.map +1 -0
  594. package/dist/pipeline/modules/commentModule.js +12 -0
  595. package/dist/pipeline/modules/commentModule.js.map +1 -0
  596. package/dist/pipeline/modules/commitSuggesterModule.js +82 -12
  597. package/dist/pipeline/modules/commitSuggesterModule.js.map +1 -0
  598. package/dist/pipeline/modules/contextReviewModule.js +12 -1
  599. package/dist/pipeline/modules/contextReviewModule.js.map +1 -0
  600. package/dist/pipeline/modules/dialogAnswerModule.js +58 -0
  601. package/dist/pipeline/modules/dialogAnswerModule.js.map +1 -0
  602. package/dist/pipeline/modules/fileSearchModule.js +5 -143
  603. package/dist/pipeline/modules/fileSearchModule.js.map +1 -0
  604. package/dist/pipeline/modules/finalAnswerModule.js +1176 -151
  605. package/dist/pipeline/modules/finalAnswerModule.js.map +1 -0
  606. package/dist/pipeline/modules/kgModule.js +18 -1
  607. package/dist/pipeline/modules/kgModule.js.map +1 -0
  608. package/dist/pipeline/modules/planAnswerModule.js +99 -0
  609. package/dist/pipeline/modules/planAnswerModule.js.map +1 -0
  610. package/dist/pipeline/modules/readFileModule.js +300 -0
  611. package/dist/pipeline/modules/readFileModule.js.map +1 -0
  612. package/dist/pipeline/modules/reviewModule.js +10 -1
  613. package/dist/pipeline/modules/reviewModule.js.map +1 -0
  614. package/dist/pipeline/modules/searchDbModule.js +159 -0
  615. package/dist/pipeline/modules/searchDbModule.js.map +1 -0
  616. package/dist/pipeline/modules/searchListDirectoryModule.js +62 -0
  617. package/dist/pipeline/modules/searchListDirectoryModule.js.map +1 -0
  618. package/dist/pipeline/modules/searchModuleShared.js +71 -0
  619. package/dist/pipeline/modules/searchModuleShared.js.map +1 -0
  620. package/dist/pipeline/modules/searchRegexModule.js +59 -0
  621. package/dist/pipeline/modules/searchRegexModule.js.map +1 -0
  622. package/dist/pipeline/modules/semanticAnalysisModule.js +185 -28
  623. package/dist/pipeline/modules/semanticAnalysisModule.js.map +1 -0
  624. package/dist/pipeline/modules/summaryModule.js +11 -1
  625. package/dist/pipeline/modules/summaryModule.js.map +1 -0
  626. package/dist/pipeline/registry/moduleRegistry.js +9 -0
  627. package/dist/pipeline/registry/moduleRegistry.js.map +1 -0
  628. package/dist/pipeline/runModulePipeline.js +1 -0
  629. package/dist/pipeline/runModulePipeline.js.map +1 -0
  630. package/dist/scripts/dbScriptSupport.js +172 -0
  631. package/dist/scripts/dbScriptSupport.js.map +1 -0
  632. package/dist/scripts/dbcheck.js +173 -267
  633. package/dist/scripts/dbcheck.js.map +1 -0
  634. package/dist/scripts/dboverview.js +161 -0
  635. package/dist/scripts/dboverview.js.map +1 -0
  636. package/dist/scripts/migrateDb.js +1 -0
  637. package/dist/scripts/migrateDb.js.map +1 -0
  638. package/dist/search/SearchOrchestrator.js +928 -0
  639. package/dist/search/SearchOrchestrator.js.map +1 -0
  640. package/dist/search/sharedRankingPolicy.js +283 -0
  641. package/dist/search/sharedRankingPolicy.js.map +1 -0
  642. package/dist/setup/reindexOwner.js +97 -0
  643. package/dist/setup/reindexOwner.js.map +1 -0
  644. package/dist/setup/setupOwner.js +100 -0
  645. package/dist/setup/setupOwner.js.map +1 -0
  646. package/dist/shell/dialogUi.js +81 -0
  647. package/dist/shell/dialogUi.js.map +1 -0
  648. package/dist/shellSession.js +126 -0
  649. package/dist/shellSession.js.map +1 -0
  650. package/dist/status/statusOwner.js +239 -0
  651. package/dist/status/statusOwner.js.map +1 -0
  652. package/dist/testing/contextEval.js +514 -0
  653. package/dist/testing/contextEval.js.map +1 -0
  654. package/dist/testing/fixtures/transform/small-file.input.js +5 -0
  655. package/dist/testing/fixtures/transform/small-file.input.js.map +1 -0
  656. package/dist/testing/harnessArtifacts.js +112 -0
  657. package/dist/testing/harnessArtifacts.js.map +1 -0
  658. package/dist/testing/llmTraceSession.js +67 -0
  659. package/dist/testing/llmTraceSession.js.map +1 -0
  660. package/dist/testing/registerDevCliCommands.js +43 -0
  661. package/dist/testing/registerDevCliCommands.js.map +1 -0
  662. package/dist/testing/runDiagnosis.js +248 -0
  663. package/dist/testing/runDiagnosis.js.map +1 -0
  664. package/dist/testing/runtimeLogReader.js +144 -0
  665. package/dist/testing/runtimeLogReader.js.map +1 -0
  666. package/dist/testing/testCommands.js +35 -303
  667. package/dist/testing/testCommands.js.map +1 -0
  668. package/dist/testing/testRegistry.js +233 -0
  669. package/dist/testing/testRegistry.js.map +1 -0
  670. package/dist/types.js +1 -0
  671. package/dist/types.js.map +1 -0
  672. package/dist/utils/buildContextualPrompt.js +26 -75
  673. package/dist/utils/buildContextualPrompt.js.map +1 -0
  674. package/dist/utils/changeLogPrompt.js +1 -0
  675. package/dist/utils/changeLogPrompt.js.map +1 -0
  676. package/dist/utils/checkModel.js +17 -92
  677. package/dist/utils/checkModel.js.map +1 -0
  678. package/dist/utils/commentMap.js +1 -0
  679. package/dist/utils/commentMap.js.map +1 -0
  680. package/dist/utils/compileSearchQuery.js +23 -9
  681. package/dist/utils/compileSearchQuery.js.map +1 -0
  682. package/dist/utils/consolePresentation.js +208 -0
  683. package/dist/utils/consolePresentation.js.map +1 -0
  684. package/dist/utils/contentUtils.js +17 -2
  685. package/dist/utils/contentUtils.js.map +1 -0
  686. package/dist/utils/debugContext.js +1 -0
  687. package/dist/utils/debugContext.js.map +1 -0
  688. package/dist/utils/dialogState.js +201 -0
  689. package/dist/utils/dialogState.js.map +1 -0
  690. package/dist/utils/editor.js +1 -0
  691. package/dist/utils/editor.js.map +1 -0
  692. package/dist/utils/executionEvidence.js +50 -0
  693. package/dist/utils/executionEvidence.js.map +1 -0
  694. package/dist/utils/extractFileReferences.js +140 -6
  695. package/dist/utils/extractFileReferences.js.map +1 -0
  696. package/dist/utils/fileEvidenceCache.js +50 -0
  697. package/dist/utils/fileEvidenceCache.js.map +1 -0
  698. package/dist/utils/fileTree.js +1 -0
  699. package/dist/utils/fileTree.js.map +1 -0
  700. package/dist/utils/loadRelevantFolderCapsules.js +35 -5
  701. package/dist/utils/loadRelevantFolderCapsules.js.map +1 -0
  702. package/dist/utils/log.js +10 -1
  703. package/dist/utils/log.js.map +1 -0
  704. package/dist/utils/normalizeData.js +1 -0
  705. package/dist/utils/normalizeData.js.map +1 -0
  706. package/dist/utils/ollamaModelStatus.js +28 -0
  707. package/dist/utils/ollamaModelStatus.js.map +1 -0
  708. package/dist/utils/ollamaService.js +294 -0
  709. package/dist/utils/ollamaService.js.map +1 -0
  710. package/dist/utils/outputFormatter.js +1 -0
  711. package/dist/utils/outputFormatter.js.map +1 -0
  712. package/dist/utils/parseTaggedContent.js +1 -0
  713. package/dist/utils/parseTaggedContent.js.map +1 -0
  714. package/dist/utils/planActions.js +27 -46
  715. package/dist/utils/planActions.js.map +1 -0
  716. package/dist/utils/promptBuilderHelper.js +1 -0
  717. package/dist/utils/promptBuilderHelper.js.map +1 -0
  718. package/dist/utils/promptLogHelper.js +29 -13
  719. package/dist/utils/promptLogHelper.js.map +1 -0
  720. package/dist/utils/queryAnchors.js +71 -0
  721. package/dist/utils/queryAnchors.js.map +1 -0
  722. package/dist/utils/repoIdentity.js +82 -0
  723. package/dist/utils/repoIdentity.js.map +1 -0
  724. package/dist/utils/repoKey.js +1 -0
  725. package/dist/utils/repoKey.js.map +1 -0
  726. package/dist/utils/resolveTargetsToFiles.js +1 -0
  727. package/dist/utils/resolveTargetsToFiles.js.map +1 -0
  728. package/dist/utils/resumeContext.js +219 -0
  729. package/dist/utils/resumeContext.js.map +1 -0
  730. package/dist/utils/resumeState.js +310 -0
  731. package/dist/utils/resumeState.js.map +1 -0
  732. package/dist/utils/rollingPlan.js +118 -0
  733. package/dist/utils/rollingPlan.js.map +1 -0
  734. package/dist/utils/runQueryWithDaemonControl.js +11 -3
  735. package/dist/utils/runQueryWithDaemonControl.js.map +1 -0
  736. package/dist/utils/runtimeLogger.js +252 -0
  737. package/dist/utils/runtimeLogger.js.map +1 -0
  738. package/dist/utils/sanitizeQuery.js +1 -0
  739. package/dist/utils/sanitizeQuery.js.map +1 -0
  740. package/dist/utils/sharedUtils.js +1 -0
  741. package/dist/utils/sharedUtils.js.map +1 -0
  742. package/dist/utils/sleep.js +1 -0
  743. package/dist/utils/sleep.js.map +1 -0
  744. package/dist/utils/splitCodeIntoChunk.js +1 -0
  745. package/dist/utils/splitCodeIntoChunk.js.map +1 -0
  746. package/dist/utils/time.js +66 -0
  747. package/dist/utils/time.js.map +1 -0
  748. package/dist/utils/verifyFocusPreference.js +107 -0
  749. package/dist/utils/verifyFocusPreference.js.map +1 -0
  750. package/dist/utils/vscode.js +1 -0
  751. package/dist/utils/vscode.js.map +1 -0
  752. package/dist/workflow/workflowResolver.js +1 -0
  753. package/dist/workflow/workflowResolver.js.map +1 -0
  754. package/dist/workflow/workflowRunner.js +1 -0
  755. package/dist/workflow/workflowRunner.js.map +1 -0
  756. package/package.json +3 -3
  757. package/dist/agents/MainAgent.js +0 -1886
  758. package/dist/agents/contextReviewStep.js +0 -101
  759. package/dist/agents/finalPlanGenStep.js +0 -107
  760. package/dist/agents/structuralAnalysisStep.js +0 -46
  761. package/dist/agents/validationAnalysisStep.js +0 -87
  762. package/dist/pipeline/modules/chunkManagerModule.js +0 -24
  763. package/dist/pipeline/modules/cleanGeneratedTestsModule.js +0 -33
  764. package/dist/pipeline/modules/fileReaderModule.js +0 -72
  765. package/dist/pipeline/modules/gatherInfoModule.js +0 -181
  766. package/dist/pipeline/modules/generateTestsModule.js +0 -68
  767. package/dist/pipeline/modules/preserveCodeModule.js +0 -195
  768. package/dist/pipeline/modules/refactorModule.js +0 -40
  769. package/dist/pipeline/modules/repairTestsModule.js +0 -48
  770. package/dist/pipeline/modules/runTestsModule.js +0 -37
@@ -1,15 +1,94 @@
1
1
  import { logInputOutput } from "../utils/promptLogHelper.js";
2
+ import { resolveProgressState } from "./guards/resolveProgressState.js";
3
+ function actionAllowed(allowedActions, action) {
4
+ return allowedActions.length === 0 || allowedActions.includes(action);
5
+ }
2
6
  /**
3
- * REASON NEXT TASK STEP
7
+ * Keeps next-step logs focused on the decision this step made.
8
+ * Example: selected "continue" on foo.ts -> log action, reason, target, and current step only.
9
+ */
10
+ function buildReasonNextTaskStepLog(context, extras) {
11
+ const iteration = context.analysis?.iterationReasoning;
12
+ const payload = {
13
+ nextAction: iteration?.nextAction,
14
+ rationale: iteration?.rationale,
15
+ confidence: iteration?.confidence,
16
+ currentStep: context.task.currentStep,
17
+ nextTargets: iteration?.nextTargets,
18
+ };
19
+ if (!extras) {
20
+ return payload;
21
+ }
22
+ if ((extras.redoFiles?.length ?? 0) > 0) {
23
+ payload.redoFiles = extras.redoFiles;
24
+ }
25
+ if ((extras.remainingFiles?.length ?? 0) > 0) {
26
+ payload.remainingFiles = extras.remainingFiles;
27
+ }
28
+ if (extras?.pendingResearch) {
29
+ payload.pendingResearch = extras.pendingResearch;
30
+ }
31
+ if ((extras.expansionFiles?.length ?? 0) > 0) {
32
+ payload.expansionFiles = extras.expansionFiles;
33
+ }
34
+ if ((extras.expansionQueries?.length ?? 0) > 0) {
35
+ payload.expansionQueries = extras.expansionQueries;
36
+ }
37
+ if (extras?.noScopedFilesDiagnostic) {
38
+ payload.noScopedFilesDiagnostic = extras.noScopedFilesDiagnostic;
39
+ }
40
+ return payload;
41
+ }
42
+ function pickQuestionScopedFile(context, candidates) {
43
+ if (candidates.length === 0)
44
+ return undefined;
45
+ const latest = context.analysis?.recentActionWindow?.latest;
46
+ if (!latest)
47
+ return candidates[0];
48
+ if (latest.questionId) {
49
+ const scopedStep = (context.task.steps ?? []).find((step) => step.questionId === latest.questionId && candidates.includes(step.filePath));
50
+ if (scopedStep?.filePath) {
51
+ return scopedStep.filePath;
52
+ }
53
+ }
54
+ const touched = latest.touchedFiles ?? [];
55
+ const touchedCandidate = touched.find((filePath) => candidates.includes(filePath));
56
+ if (touchedCandidate) {
57
+ return touchedCandidate;
58
+ }
59
+ return candidates[0];
60
+ }
61
+ function pickQuestionIdForNextFile(context, nextFile) {
62
+ if (!nextFile)
63
+ return undefined;
64
+ const existing = (context.task.steps ?? []).find((step) => step.filePath === nextFile);
65
+ if (existing?.questionId) {
66
+ return existing.questionId;
67
+ }
68
+ const latestQuestionId = context.analysis?.recentActionWindow?.latest?.questionId;
69
+ if (latestQuestionId) {
70
+ return latestQuestionId;
71
+ }
72
+ const questions = context.analysis?.intent?.questions ?? [];
73
+ if (questions.length === 1) {
74
+ return questions[0].id;
75
+ }
76
+ const matchingQuestion = questions.find((question) => (question.targetFiles ?? []).some((target) => target === nextFile || nextFile.endsWith(String(target))));
77
+ return matchingQuestion?.id;
78
+ }
79
+ /**
80
+ * REASON NEXT STEP SELECTION
81
+ *
82
+ * Determines the next non-bridge loop action from the current bounded menu.
4
83
  *
5
- * Determines whether the agent should:
6
- * - continue transforming remaining files
7
- * - redo a previous step
8
- * - complete execution
84
+ * Why this exists:
85
+ * - bridge actions like run-search/run-verify/seed-* are computed upstream
86
+ * - this step reasons only within the currently allowed task-level action menu
87
+ * - decideNextAction still validates the chosen action against that menu
9
88
  *
10
- * Creates a TaskStep if none exists and sets context.task.currentStep.
89
+ * Creates a durable Step if none exists and sets context.task.currentStep.
11
90
  */
12
- export const reasonNextTaskStep = {
91
+ export const reasonNextStepSelection = {
13
92
  name: "reasonNextTaskStep",
14
93
  description: "Reasons over working files and execution artifacts to decide the next task step.",
15
94
  async run(context) {
@@ -19,32 +98,78 @@ export const reasonNextTaskStep = {
19
98
  }
20
99
  context.analysis || (context.analysis = {});
21
100
  context.execution || (context.execution = {});
22
- (_a = context.task).taskSteps || (_a.taskSteps = []);
101
+ (_a = context.task).steps || (_a.steps = []);
23
102
  (_b = context.analysis).iterationReasoning || (_b.iterationReasoning = {
24
103
  summary: "",
25
104
  nextAction: "continue",
26
105
  rationale: "",
27
106
  confidence: 0.5,
28
107
  });
108
+ const allowedActions = context.analysis.nextActionMenu?.allowedActions ?? [];
29
109
  const iteration = context.analysis.iterationReasoning;
110
+ const giveUp = context.analysis.giveUp;
111
+ const executionPolicy = context.analysis.executionPolicy;
112
+ const progressState = resolveProgressState(context);
113
+ if (progressState.completion.eligible &&
114
+ actionAllowed(allowedActions, "complete")) {
115
+ context.task.status = "completed";
116
+ context.task.currentStep = undefined;
117
+ context.analysis.iterationReasoning = {
118
+ ...iteration,
119
+ nextAction: "complete",
120
+ rationale: progressState.completion.reason,
121
+ confidence: 0.99,
122
+ summary: "Task step decision: complete (objective satisfied)",
123
+ };
124
+ logInputOutput("reasonNextTaskStep", "output", buildReasonNextTaskStepLog(context));
125
+ return;
126
+ }
127
+ if (giveUp?.status === "triggered") {
128
+ context.task.status = "gave-up";
129
+ context.task.reason = giveUp.rationale;
130
+ context.task.currentStep = undefined;
131
+ context.analysis.iterationReasoning = {
132
+ ...iteration,
133
+ nextAction: "give-up",
134
+ rationale: giveUp.rationale ?? "Give-up policy triggered.",
135
+ confidence: 0.98,
136
+ summary: "Task step decision: give-up",
137
+ };
138
+ logInputOutput("reasonNextTaskStep", "output", buildReasonNextTaskStepLog(context));
139
+ return;
140
+ }
30
141
  // ---------------------------
31
142
  // 1️⃣ Determine intended files (deduplicated)
32
143
  // ---------------------------
33
- const plannedExecutionFiles = context.task.taskSteps
144
+ const plannedExecutionFiles = context.task.steps
34
145
  .filter(step => !!step.filePath &&
35
146
  !step.filePath.startsWith("__research__/"))
36
147
  .map(step => step.filePath)
37
148
  .filter((filePath, index, all) => all.indexOf(filePath) === index);
38
- const fallbackIntendedFiles = Array.from(new Set([
39
- ...(context.analysis.focus?.selectedFiles ?? []),
149
+ const requiredLaneFiles = Array.from(new Set([
150
+ ...(executionPolicy?.executionRequired ??
151
+ context.analysis.focus?.executionRequired ??
152
+ context.analysis.focus?.selectedFiles ??
153
+ []),
40
154
  ...(context.workingFiles?.map(f => f.path).filter(Boolean) ?? []),
41
155
  ]));
42
- // Use union (not fallback switch) so docs-only or planning-skipped lanes
43
- // still process all selected files instead of only ad-hoc seeded taskSteps.
44
- const intendedFiles = Array.from(new Set([
45
- ...plannedExecutionFiles,
46
- ...fallbackIntendedFiles,
156
+ const explorationLaneFiles = Array.from(new Set([
157
+ ...(executionPolicy?.explorationCandidates ??
158
+ context.analysis.focus?.explorationCandidates ??
159
+ context.analysis.focus?.candidateFiles ??
160
+ []),
47
161
  ]));
162
+ const intendedFiles = Array.from(new Set([...plannedExecutionFiles, ...requiredLaneFiles]));
163
+ const noScopedFilesDiagnostic = intendedFiles.length === 0
164
+ ? {
165
+ selectedFiles: context.analysis.focus?.selectedFiles ?? [],
166
+ executionRequired: executionPolicy?.executionRequired ?? [],
167
+ resolvedTargetFiles: context.analysis.focus?.resolvedTargetFiles ??
168
+ context.analysis.intent?.resolvedTargetFiles ??
169
+ [],
170
+ relatedFiles: context.initContext?.relatedFiles ?? [],
171
+ }
172
+ : undefined;
48
173
  // ---------------------------
49
174
  // 2️⃣ Transformed and analyzed files
50
175
  // ---------------------------
@@ -53,54 +178,24 @@ export const reasonNextTaskStep = {
53
178
  .filter(([_, fa]) => fa.semanticAnalyzed)
54
179
  .map(([path]) => path);
55
180
  const fileAnalysis = context.analysis.fileAnalysis ?? {};
56
- const taskSteps = context.task.taskSteps;
57
- // ---------------------------
58
- // 2.5️⃣ Prioritize pending research steps
59
- // ---------------------------
60
- const pendingResearchStep = taskSteps.find(step => typeof step.action === "string" &&
181
+ const steps = context.task.steps;
182
+ const pendingResearchStep = steps.find(step => typeof step.action === "string" &&
61
183
  step.action.startsWith("research-") &&
62
184
  step.status !== "completed");
63
- if (pendingResearchStep) {
185
+ if (progressState.research.status === "required" && pendingResearchStep) {
64
186
  context.task.currentStep = pendingResearchStep;
65
187
  context.analysis.iterationReasoning = {
66
188
  ...iteration,
67
189
  nextAction: "continue",
68
- rationale: `Research step pending: ${pendingResearchStep.action}`,
190
+ rationale: progressState.research.reason,
69
191
  confidence: 0.95,
70
192
  nextTargets: { files: [pendingResearchStep.filePath] },
71
193
  summary: "Task step decision: continue (research priority)",
72
194
  };
73
195
  logInputOutput("reasonNextTaskStep", "output", {
74
- pendingResearch: pendingResearchStep,
75
- iterationReasoning: context.analysis.iterationReasoning,
76
- });
77
- return;
78
- }
79
- // ---------------------------
80
- // 2.6️⃣ Architecture-summary completion gate
81
- // ---------------------------
82
- const intentCategory = (context.analysis.intent?.intentCategory ?? "").toLowerCase();
83
- const isSummaryLikeIntent = intentCategory === "question" || intentCategory === "explanation";
84
- const synthesisCompleted = taskSteps.some(step => step.action === "research-architecture-synthesis" &&
85
- step.status === "completed");
86
- const tierCoverage = computeTierCoverage(context, intendedFiles, analyzedFiles, transformedFiles, taskSteps);
87
- if (isSummaryLikeIntent && synthesisCompleted && tierCoverage.satisfied) {
88
- context.task.status = "completed";
89
- context.task.currentStep = undefined;
90
- context.analysis.iterationReasoning = {
91
- ...iteration,
92
- nextAction: "complete",
93
- rationale: `Architecture summary ready after synthesis and tiered coverage (tier1 ${tierCoverage.tier1.covered}/${tierCoverage.tier1.target}, tier2 ${tierCoverage.tier2.covered}/${tierCoverage.tier2.target}, overall ${tierCoverage.overall.covered}/${tierCoverage.overall.target}).`,
94
- confidence: 0.98,
95
- redoFiles: [],
96
- nextTargets: { files: [] },
97
- summary: "Task step decision: complete (synthesis + tiered coverage)",
98
- };
99
- logInputOutput("reasonNextTaskStep", "output", {
100
- intentCategory,
101
- synthesisCompleted,
102
- tiers: tierCoverage,
103
- iterationReasoning: context.analysis.iterationReasoning,
196
+ ...buildReasonNextTaskStepLog(context, {
197
+ pendingResearch: pendingResearchStep,
198
+ }),
104
199
  });
105
200
  return;
106
201
  }
@@ -109,7 +204,7 @@ export const reasonNextTaskStep = {
109
204
  // ---------------------------
110
205
  for (const path of analyzedFiles) {
111
206
  const fa = fileAnalysis[path];
112
- const step = taskSteps.find(s => s.filePath === path);
207
+ const step = steps.find(s => s.filePath === path);
113
208
  if (!step)
114
209
  continue;
115
210
  if (fa?.semanticAnalyzed && context.executionControl?.constraints?.allowFileWrites === false) {
@@ -122,50 +217,110 @@ export const reasonNextTaskStep = {
122
217
  // ---------------------------
123
218
  // 4️⃣ Validation-based redo
124
219
  // ---------------------------
125
- const validations = context.analysis.executionOutcome?.validations ?? [];
126
- const redoFiles = validations.filter(v => v.requiresRedo && v.filePath).map(v => v.filePath);
220
+ const redoFiles = progressState.redoTargets;
127
221
  iteration.redoFiles = redoFiles;
128
222
  // ---------------------------
223
+ // 4.5️⃣ Trail expansion signal
224
+ // ---------------------------
225
+ const trail = context.analysis.trail;
226
+ const expansionRequest = context.analysis.expansionRequest;
227
+ const trailFrontier = (trail?.frontier ?? [])
228
+ .filter(candidate => (candidate.confidence ?? 0) >= 0.58)
229
+ .map(candidate => candidate.filePath)
230
+ .filter(Boolean);
231
+ const expansionFiles = Array.from(new Set([
232
+ ...(expansionRequest?.files ?? []),
233
+ ...trailFrontier,
234
+ ]));
235
+ const expansionQueries = Array.from(new Set([
236
+ ...(expansionRequest?.queries ?? []),
237
+ ...(trailFrontier.length > 0 ? (trail?.pendingQueries ?? []) : []),
238
+ ])).slice(0, 6);
239
+ const hasExpansionSignal = expansionFiles.length > 0 || expansionQueries.length > 0;
240
+ // ---------------------------
129
241
  // 5️⃣ Task-level reasoning (cross-file)
130
242
  // ---------------------------
131
- // Instead of deriving remainingFiles from artifacts, use TaskStep.status
132
- const pendingFiles = intendedFiles.filter(path => {
133
- const step = taskSteps.find(s => s.filePath === path);
134
- return !step || step.status !== "completed";
135
- });
243
+ // Instead of deriving remainingFiles from artifacts, use durable step status.
244
+ const pendingFiles = progressState.requiredTargets.filter((path) => !progressState.completedTargets.includes(path) && !progressState.redoTargets.includes(path) && !progressState.blockedTargets.includes(path));
136
245
  // ---------------------------
137
246
  // 🛑 Deterministic Completion Gate
138
247
  // ---------------------------
139
- const isDeterministicallyComplete = redoFiles.length === 0 &&
140
- pendingFiles.length === 0;
248
+ const isDeterministicallyComplete = progressState.completion.eligible;
141
249
  if (isDeterministicallyComplete) {
250
+ const shouldRunOptionalExploration = !!executionPolicy?.explorationReady &&
251
+ !executionPolicy?.executionLock?.enabled &&
252
+ progressState.optionalTargets.length > 0;
253
+ if (hasExpansionSignal || shouldRunOptionalExploration) {
254
+ context.task.currentStep = undefined;
255
+ context.analysis.iterationReasoning = {
256
+ ...iteration,
257
+ nextAction: "expand-scope",
258
+ rationale: hasExpansionSignal
259
+ ? `Trail expansion requested (${expansionFiles.length} file(s), ${expansionQueries.length} query term(s)).`
260
+ : `Execution lane complete; optional exploration lane has ${explorationLaneFiles.length} candidate file(s).`,
261
+ confidence: 0.86,
262
+ redoFiles: [],
263
+ nextTargets: {
264
+ files: hasExpansionSignal ? expansionFiles : progressState.optionalTargets,
265
+ searchQueries: expansionQueries,
266
+ },
267
+ summary: "Task step decision: expand-scope",
268
+ };
269
+ logInputOutput("reasonNextTaskStep", "output", {
270
+ ...buildReasonNextTaskStepLog(context, {
271
+ redoFiles,
272
+ expansionFiles,
273
+ expansionQueries,
274
+ noScopedFilesDiagnostic,
275
+ }),
276
+ });
277
+ return;
278
+ }
279
+ if (!actionAllowed(allowedActions, "complete")) {
280
+ context.task.currentStep = undefined;
281
+ context.analysis.iterationReasoning = {
282
+ ...iteration,
283
+ nextAction: "continue",
284
+ rationale: "Deterministic completion is blocked until the current loop bridge runs.",
285
+ confidence: 0.92,
286
+ redoFiles: [],
287
+ nextTargets: { files: [] },
288
+ summary: "Task step decision: continue (bridge pending)",
289
+ };
290
+ logInputOutput("reasonNextTaskStep", "output", {
291
+ ...buildReasonNextTaskStepLog(context, {
292
+ redoFiles,
293
+ noScopedFilesDiagnostic,
294
+ }),
295
+ });
296
+ return;
297
+ }
142
298
  // ✅ mark task as completed
143
299
  context.task.status = "completed";
144
300
  context.task.currentStep = undefined;
145
301
  context.analysis.iterationReasoning = {
146
302
  ...iteration,
147
303
  nextAction: "complete",
148
- rationale: "All selected files have completed TaskSteps and passed validation.",
304
+ rationale: progressState.completion.reason,
149
305
  confidence: 1.0,
150
306
  redoFiles: [],
151
307
  nextTargets: { files: [] },
152
308
  summary: "Task step decision: complete",
153
309
  };
154
310
  logInputOutput("reasonNextTaskStep", "output", {
155
- intendedFiles,
156
- pendingFiles,
157
- redoFiles,
158
- currentStep: context.task.currentStep,
159
- iterationReasoning: context.analysis.iterationReasoning,
311
+ ...buildReasonNextTaskStepLog(context, {
312
+ redoFiles,
313
+ noScopedFilesDiagnostic,
314
+ }),
160
315
  });
161
316
  return; // 🔴 HARD EXIT — skip Step 6 and risk reasoning entirely
162
317
  }
163
318
  // ---------------------------
164
319
  // Task-level reasoning (cross-file)
165
320
  // ---------------------------
166
- // Remaining work should respect TaskStep completion state first.
321
+ // Remaining work should respect durable step completion state first.
167
322
  // This avoids re-selecting files that were completed via analyze-only fallback.
168
- const remainingFiles = pendingFiles.filter(path => !redoFiles.includes(path));
323
+ const remainingFiles = pendingFiles.filter((path) => !redoFiles.includes(path));
169
324
  // ---------------------------
170
325
  // Decide next step
171
326
  // ---------------------------
@@ -175,20 +330,30 @@ export const reasonNextTaskStep = {
175
330
  let nextFile;
176
331
  if (redoFiles.length > 0) {
177
332
  nextAction = "redo-step";
178
- rationale = `Some transformed files failed validation and require redo: ${redoFiles.join(", ")}`;
333
+ rationale = progressState.completion.reason;
179
334
  nextFile = redoFiles[0];
180
335
  confidence = 0.7;
181
336
  }
337
+ else if (hasExpansionSignal) {
338
+ nextAction = "expand-scope";
339
+ rationale = `Trail expansion requested from prior research (${expansionFiles.length} file(s), ${expansionQueries.length} query term(s)).`;
340
+ confidence = 0.86;
341
+ }
182
342
  else if (remainingFiles.length > 0) {
183
343
  nextAction = "continue";
184
- rationale = `Not all selected files have been analyzed or transformed yet. Remaining files: ${remainingFiles.join(", ")}`;
185
- nextFile = remainingFiles[0];
344
+ rationale = `Required targets remain unresolved: ${remainingFiles.join(", ")}`;
345
+ nextFile = pickQuestionScopedFile(context, remainingFiles);
186
346
  confidence = 0.95;
187
347
  }
348
+ else if (!progressState.evidenceSatisfied && progressState.optionalTargets.length > 0) {
349
+ nextAction = "expand-scope";
350
+ rationale = `Need grounded evidence before completion; ${progressState.optionalTargets.length} candidate file(s) remain to explore.`;
351
+ confidence = 0.9;
352
+ }
188
353
  else {
189
- nextAction = "complete";
190
- rationale = "All selected files have been analyzed, transformed, and validated successfully.";
191
- confidence = 0.98;
354
+ nextAction = progressState.completion.eligible ? "complete" : "continue";
355
+ rationale = progressState.completion.reason;
356
+ confidence = progressState.completion.eligible ? 0.98 : 0.86;
192
357
  }
193
358
  /* // ---------------------------
194
359
  // 6.5️⃣ Optional: Reason over known risks
@@ -239,17 +404,24 @@ Task:
239
404
  }
240
405
  } */
241
406
  // ---------------------------
242
- // 7️⃣ Ensure a TaskStep exists for nextFile
407
+ // 7️⃣ Ensure a durable Step exists for nextFile
243
408
  // ---------------------------
244
409
  if (nextFile) {
245
- let nextStep = taskSteps.find(s => s.filePath === nextFile);
410
+ let nextStep = steps.find(s => s.filePath === nextFile);
411
+ const nextQuestionId = pickQuestionIdForNextFile(context, nextFile);
246
412
  if (!nextStep) {
247
413
  nextStep = {
248
414
  taskId: context.task.id,
249
415
  filePath: nextFile,
250
416
  status: "pending",
417
+ questionId: nextQuestionId,
418
+ stepQuestions: nextQuestionId ? [nextQuestionId] : undefined,
251
419
  };
252
- context.task.taskSteps.push(nextStep);
420
+ context.task.steps.push(nextStep);
421
+ }
422
+ if (!nextStep.questionId && nextQuestionId) {
423
+ nextStep.questionId = nextQuestionId;
424
+ nextStep.stepQuestions = [nextQuestionId];
253
425
  }
254
426
  if (nextAction === "redo-step") {
255
427
  nextStep.status = "pending";
@@ -269,73 +441,24 @@ Task:
269
441
  nextAction,
270
442
  rationale,
271
443
  confidence,
272
- nextTargets: { files: Array.from(new Set(redoFiles.length > 0 ? redoFiles : remainingFiles)) },
444
+ nextTargets: nextAction === "expand-scope"
445
+ ? {
446
+ files: expansionFiles.length > 0 ? expansionFiles : progressState.optionalTargets,
447
+ searchQueries: expansionQueries,
448
+ }
449
+ : { files: Array.from(new Set(redoFiles.length > 0 ? redoFiles : remainingFiles)) },
273
450
  summary: `Task step decision: ${nextAction}`,
274
451
  };
275
452
  logInputOutput("reasonNextTaskStep", "output", {
276
- intendedFiles,
277
- analyzedFiles,
278
- transformedFiles,
279
- remainingFiles,
280
- redoFiles,
281
- currentStep: context.task.currentStep,
282
- iterationReasoning: context.analysis.iterationReasoning,
453
+ ...buildReasonNextTaskStepLog(context, {
454
+ redoFiles,
455
+ remainingFiles,
456
+ expansionFiles: nextAction === "expand-scope" ? expansionFiles : undefined,
457
+ expansionQueries: nextAction === "expand-scope" ? expansionQueries : undefined,
458
+ noScopedFilesDiagnostic,
459
+ }),
283
460
  });
284
461
  },
285
462
  };
286
- /**
287
- * Computes tiered coverage using selected/research/verify signals.
288
- * Tier1 is highest-priority, tier2 is remaining selected, tier3 is the rest.
289
- */
290
- function computeTierCoverage(context, intendedFiles, analyzedFiles, transformedFiles, taskSteps) {
291
- const selectedSet = new Set(context.analysis?.focus?.selectedFiles ?? []);
292
- const researchTouchedSet = new Set(context.analysis?.researchArtifacts?.touchedFiles ?? []);
293
- const verifyByFile = context.analysis?.verify?.byFile ?? {};
294
- const plannedRankByFile = buildPlannedRankMap(taskSteps);
295
- const coveredSet = new Set([...analyzedFiles, ...transformedFiles]);
296
- const tier1Files = intendedFiles.filter(filePath => {
297
- const verifyConfidence = verifyByFile[filePath]?.fileConfidence ?? 0;
298
- const plannedRank = plannedRankByFile.get(filePath);
299
- const selected = selectedSet.has(filePath);
300
- const touchedByResearch = researchTouchedSet.has(filePath);
301
- const highVerifyConfidence = verifyConfidence >= 0.65;
302
- const highPlanPriority = typeof plannedRank === "number" && plannedRank <= 1;
303
- return selected && (touchedByResearch || highVerifyConfidence || highPlanPriority);
304
- });
305
- const tier2Files = intendedFiles.filter(filePath => !tier1Files.includes(filePath) && selectedSet.has(filePath));
306
- const tier3Files = intendedFiles.filter(filePath => !tier1Files.includes(filePath) && !tier2Files.includes(filePath));
307
- const tier1Covered = tier1Files.filter(filePath => coveredSet.has(filePath)).length;
308
- const tier2Covered = tier2Files.filter(filePath => coveredSet.has(filePath)).length;
309
- const tier3Covered = tier3Files.filter(filePath => coveredSet.has(filePath)).length;
310
- const overallCovered = intendedFiles.filter(filePath => coveredSet.has(filePath)).length;
311
- const tier1Target = computeCoverageTarget(tier1Files.length, 0.7);
312
- const tier2Target = computeCoverageTarget(tier2Files.length, 0.4);
313
- const overallTarget = Math.min(Math.min(6, Math.max(4, intendedFiles.length)), intendedFiles.length);
314
- const satisfied = tier1Covered >= tier1Target &&
315
- tier2Covered >= tier2Target &&
316
- overallCovered >= overallTarget;
317
- return {
318
- tier1: { files: tier1Files, covered: tier1Covered, target: tier1Target },
319
- tier2: { files: tier2Files, covered: tier2Covered, target: tier2Target },
320
- tier3: { files: tier3Files, covered: tier3Covered, target: tier3Files.length },
321
- overall: { covered: overallCovered, target: overallTarget },
322
- satisfied,
323
- };
324
- }
325
- /**
326
- * Reads planning rank from task step metadata.
327
- * Lower rank means higher priority.
328
- */
329
- function buildPlannedRankMap(taskSteps) {
330
- return new Map(taskSteps
331
- .filter(step => !!step.filePath && !step.filePath.startsWith("__research__/"))
332
- .map(step => [
333
- step.filePath,
334
- typeof step.result?.priorityRank === "number" ? step.result.priorityRank : undefined,
335
- ]));
336
- }
337
- function computeCoverageTarget(total, ratio) {
338
- if (total === 0)
339
- return 0;
340
- return Math.min(total, Math.max(1, Math.ceil(total * ratio)));
341
- }
463
+ export const reasonNextTaskStep = reasonNextStepSelection;
464
+ //# sourceMappingURL=reasonNextTaskStep.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reasonNextTaskStep.js","sourceRoot":"","sources":["../../src/agents/reasonNextTaskStep.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Chooses the next task-level step from the current deterministic loop state.\n *\n * Why this file exists:\n * - the loop still needs one selector for continue, redo, expand, complete, or give-up\n * - `ProgressState` now owns \"what remains?\" so this file should not rebuild progress itself\n * - this step stays focused on picking the next durable step and logging the reason\n */\nimport type { StructuredContext, Step, FileAnalysis } from \"../types.js\";\nimport { logInputOutput } from \"../utils/promptLogHelper.js\";\nimport { resolveProgressState } from \"./guards/resolveProgressState.js\";\n\nfunction actionAllowed(\n allowedActions: string[],\n action: \"continue\" | \"expand-scope\" | \"request-feedback\" | \"complete\" | \"give-up\"\n): boolean {\n return allowedActions.length === 0 || allowedActions.includes(action);\n}\n\n/**\n * Keeps next-step logs focused on the decision this step made.\n * Example: selected \"continue\" on foo.ts -> log action, reason, target, and current step only.\n */\nfunction buildReasonNextTaskStepLog(\n context: StructuredContext,\n extras?: {\n redoFiles?: string[];\n remainingFiles?: string[];\n pendingResearch?: Step;\n expansionFiles?: string[];\n expansionQueries?: string[];\n noScopedFilesDiagnostic?: Record<string, unknown>;\n }\n): Record<string, unknown> {\n const iteration = context.analysis?.iterationReasoning;\n const payload: Record<string, unknown> = {\n nextAction: iteration?.nextAction,\n rationale: iteration?.rationale,\n confidence: iteration?.confidence,\n currentStep: context.task.currentStep,\n nextTargets: iteration?.nextTargets,\n };\n\n if (!extras) {\n return payload;\n }\n\n if ((extras.redoFiles?.length ?? 0) > 0) {\n payload.redoFiles = extras.redoFiles;\n }\n if ((extras.remainingFiles?.length ?? 0) > 0) {\n payload.remainingFiles = extras.remainingFiles;\n }\n if (extras?.pendingResearch) {\n payload.pendingResearch = extras.pendingResearch;\n }\n if ((extras.expansionFiles?.length ?? 0) > 0) {\n payload.expansionFiles = extras.expansionFiles;\n }\n if ((extras.expansionQueries?.length ?? 0) > 0) {\n payload.expansionQueries = extras.expansionQueries;\n }\n if (extras?.noScopedFilesDiagnostic) {\n payload.noScopedFilesDiagnostic = extras.noScopedFilesDiagnostic;\n }\n\n return payload;\n}\n\nfunction pickQuestionScopedFile(context: StructuredContext, candidates: string[]): string | undefined {\n if (candidates.length === 0) return undefined;\n const latest = context.analysis?.recentActionWindow?.latest;\n if (!latest) return candidates[0];\n\n if (latest.questionId) {\n const scopedStep = (context.task.steps ?? []).find(\n (step) => step.questionId === latest.questionId && candidates.includes(step.filePath)\n );\n if (scopedStep?.filePath) {\n return scopedStep.filePath;\n }\n }\n\n const touched = latest.touchedFiles ?? [];\n const touchedCandidate = touched.find((filePath) => candidates.includes(filePath));\n if (touchedCandidate) {\n return touchedCandidate;\n }\n\n return candidates[0];\n}\n\nfunction pickQuestionIdForNextFile(context: StructuredContext, nextFile: string | undefined): string | undefined {\n if (!nextFile) return undefined;\n const existing = (context.task.steps ?? []).find((step) => step.filePath === nextFile);\n if (existing?.questionId) {\n return existing.questionId;\n }\n\n const latestQuestionId = context.analysis?.recentActionWindow?.latest?.questionId;\n if (latestQuestionId) {\n return latestQuestionId;\n }\n\n const questions = context.analysis?.intent?.questions ?? [];\n if (questions.length === 1) {\n return questions[0].id;\n }\n\n const matchingQuestion = questions.find((question) =>\n (question.targetFiles ?? []).some((target) => target === nextFile || nextFile.endsWith(String(target)))\n );\n return matchingQuestion?.id;\n}\n\n/**\n * REASON NEXT STEP SELECTION\n *\n * Determines the next non-bridge loop action from the current bounded menu.\n *\n * Why this exists:\n * - bridge actions like run-search/run-verify/seed-* are computed upstream\n * - this step reasons only within the currently allowed task-level action menu\n * - decideNextAction still validates the chosen action against that menu\n *\n * Creates a durable Step if none exists and sets context.task.currentStep.\n */\nexport const reasonNextStepSelection = {\n name: \"reasonNextTaskStep\",\n description:\n \"Reasons over working files and execution artifacts to decide the next task step.\",\n\n async run(context: StructuredContext): Promise<void> {\n if (!context.task) {\n throw new Error(\"reasonNextTaskStep: missing context.task\");\n }\n\n context.analysis ||= {};\n context.execution ||= {};\n context.task.steps ||= [];\n\n context.analysis.iterationReasoning ||= {\n summary: \"\",\n nextAction: \"continue\",\n rationale: \"\",\n confidence: 0.5,\n };\n const allowedActions = context.analysis.nextActionMenu?.allowedActions ?? [];\n const iteration = context.analysis.iterationReasoning;\n const giveUp = context.analysis.giveUp;\n const executionPolicy = context.analysis.executionPolicy;\n const progressState = resolveProgressState(context);\n\n if (\n progressState.completion.eligible &&\n actionAllowed(allowedActions, \"complete\")\n ) {\n context.task.status = \"completed\";\n context.task.currentStep = undefined;\n context.analysis.iterationReasoning = {\n ...iteration,\n nextAction: \"complete\",\n rationale: progressState.completion.reason,\n confidence: 0.99,\n summary: \"Task step decision: complete (objective satisfied)\",\n };\n logInputOutput(\"reasonNextTaskStep\", \"output\", buildReasonNextTaskStepLog(context));\n return;\n }\n\n if (giveUp?.status === \"triggered\") {\n context.task.status = \"gave-up\";\n context.task.reason = giveUp.rationale;\n context.task.currentStep = undefined;\n context.analysis.iterationReasoning = {\n ...iteration,\n nextAction: \"give-up\",\n rationale: giveUp.rationale ?? \"Give-up policy triggered.\",\n confidence: 0.98,\n summary: \"Task step decision: give-up\",\n };\n logInputOutput(\"reasonNextTaskStep\", \"output\", buildReasonNextTaskStepLog(context));\n return;\n }\n\n // ---------------------------\n // 1️⃣ Determine intended files (deduplicated)\n // ---------------------------\n const plannedExecutionFiles = context.task.steps\n .filter(step =>\n !!step.filePath &&\n !step.filePath.startsWith(\"__research__/\")\n )\n .map(step => step.filePath)\n .filter((filePath, index, all) => all.indexOf(filePath) === index);\n\n const requiredLaneFiles = Array.from(\n new Set([\n ...(executionPolicy?.executionRequired ??\n context.analysis.focus?.executionRequired ??\n context.analysis.focus?.selectedFiles ??\n []),\n ...(context.workingFiles?.map(f => f.path).filter(Boolean) ?? []),\n ])\n );\n const explorationLaneFiles = Array.from(\n new Set([\n ...(executionPolicy?.explorationCandidates ??\n context.analysis.focus?.explorationCandidates ??\n context.analysis.focus?.candidateFiles ??\n []),\n ])\n );\n const intendedFiles = Array.from(new Set([...plannedExecutionFiles, ...requiredLaneFiles]));\n const noScopedFilesDiagnostic = intendedFiles.length === 0\n ? {\n selectedFiles: context.analysis.focus?.selectedFiles ?? [],\n executionRequired: executionPolicy?.executionRequired ?? [],\n resolvedTargetFiles:\n context.analysis.focus?.resolvedTargetFiles ??\n context.analysis.intent?.resolvedTargetFiles ??\n [],\n relatedFiles: context.initContext?.relatedFiles ?? [],\n }\n : undefined;\n\n // ---------------------------\n // 2️⃣ Transformed and analyzed files\n // ---------------------------\n const transformedFiles: string[] =\n context.execution.codeTransformArtifacts?.files.map(f => f.filePath) ?? [];\n\n const analyzedFiles: string[] = Object.entries(context.analysis.fileAnalysis ?? {})\n .filter(([_, fa]) => fa.semanticAnalyzed)\n .map(([path]) => path);\n\n const fileAnalysis: Record<string, FileAnalysis> = context.analysis.fileAnalysis ?? {};\n const steps: Step[] = context.task.steps;\n\n const pendingResearchStep = steps.find(\n step =>\n typeof step.action === \"string\" &&\n step.action.startsWith(\"research-\") &&\n step.status !== \"completed\"\n );\n\n if (progressState.research.status === \"required\" && pendingResearchStep) {\n context.task.currentStep = pendingResearchStep;\n context.analysis.iterationReasoning = {\n ...iteration,\n nextAction: \"continue\",\n rationale: progressState.research.reason,\n confidence: 0.95,\n nextTargets: { files: [pendingResearchStep.filePath] },\n summary: \"Task step decision: continue (research priority)\",\n };\n\n logInputOutput(\"reasonNextTaskStep\", \"output\", {\n ...buildReasonNextTaskStepLog(context, {\n pendingResearch: pendingResearchStep,\n }),\n });\n return;\n }\n\n // ---------------------------\n // 3️⃣ Mark analysis-only and transformed files as completed\n // ---------------------------\n for (const path of analyzedFiles) {\n const fa = fileAnalysis[path];\n const step = steps.find(s => s.filePath === path);\n if (!step) continue;\n\n if (fa?.semanticAnalyzed && context.executionControl?.constraints?.allowFileWrites === false) {\n step.status = \"completed\";\n }\n if (transformedFiles.includes(path)) {\n step.status = \"completed\";\n }\n }\n\n // ---------------------------\n // 4️⃣ Validation-based redo\n // ---------------------------\n const redoFiles = progressState.redoTargets;\n iteration.redoFiles = redoFiles;\n\n // ---------------------------\n // 4.5️⃣ Trail expansion signal\n // ---------------------------\n const trail = context.analysis.trail;\n const expansionRequest = context.analysis.expansionRequest;\n const trailFrontier = (trail?.frontier ?? [])\n .filter(candidate => (candidate.confidence ?? 0) >= 0.58)\n .map(candidate => candidate.filePath)\n .filter(Boolean);\n const expansionFiles = Array.from(new Set([\n ...(expansionRequest?.files ?? []),\n ...trailFrontier,\n ]));\n const expansionQueries = Array.from(new Set([\n ...(expansionRequest?.queries ?? []),\n ...(trailFrontier.length > 0 ? (trail?.pendingQueries ?? []) : []),\n ])).slice(0, 6);\n const hasExpansionSignal = expansionFiles.length > 0 || expansionQueries.length > 0;\n\n // ---------------------------\n // 5️⃣ Task-level reasoning (cross-file)\n // ---------------------------\n\n // Instead of deriving remainingFiles from artifacts, use durable step status.\n const pendingFiles = progressState.requiredTargets.filter(\n (path) => !progressState.completedTargets.includes(path) && !progressState.redoTargets.includes(path) && !progressState.blockedTargets.includes(path)\n );\n\n // ---------------------------\n // 🛑 Deterministic Completion Gate\n // ---------------------------\n const isDeterministicallyComplete = progressState.completion.eligible;\n\n if (isDeterministicallyComplete) {\n const shouldRunOptionalExploration =\n !!executionPolicy?.explorationReady &&\n !executionPolicy?.executionLock?.enabled &&\n progressState.optionalTargets.length > 0;\n if (hasExpansionSignal || shouldRunOptionalExploration) {\n context.task.currentStep = undefined;\n context.analysis.iterationReasoning = {\n ...iteration,\n nextAction: \"expand-scope\",\n rationale: hasExpansionSignal\n ? `Trail expansion requested (${expansionFiles.length} file(s), ${expansionQueries.length} query term(s)).`\n : `Execution lane complete; optional exploration lane has ${explorationLaneFiles.length} candidate file(s).`,\n confidence: 0.86,\n redoFiles: [],\n nextTargets: {\n files: hasExpansionSignal ? expansionFiles : progressState.optionalTargets,\n searchQueries: expansionQueries,\n },\n summary: \"Task step decision: expand-scope\",\n };\n\n logInputOutput(\"reasonNextTaskStep\", \"output\", {\n ...buildReasonNextTaskStepLog(context, {\n redoFiles,\n expansionFiles,\n expansionQueries,\n noScopedFilesDiagnostic,\n }),\n });\n\n return;\n }\n\n if (!actionAllowed(allowedActions, \"complete\")) {\n context.task.currentStep = undefined;\n context.analysis.iterationReasoning = {\n ...iteration,\n nextAction: \"continue\",\n rationale: \"Deterministic completion is blocked until the current loop bridge runs.\",\n confidence: 0.92,\n redoFiles: [],\n nextTargets: { files: [] },\n summary: \"Task step decision: continue (bridge pending)\",\n };\n\n logInputOutput(\"reasonNextTaskStep\", \"output\", {\n ...buildReasonNextTaskStepLog(context, {\n redoFiles,\n noScopedFilesDiagnostic,\n }),\n });\n\n return;\n }\n\n // ✅ mark task as completed\n context.task.status = \"completed\";\n context.task.currentStep = undefined;\n\n context.analysis.iterationReasoning = {\n ...iteration,\n nextAction: \"complete\",\n rationale: progressState.completion.reason,\n confidence: 1.0,\n redoFiles: [],\n nextTargets: { files: [] },\n summary: \"Task step decision: complete\",\n };\n\n logInputOutput(\"reasonNextTaskStep\", \"output\", {\n ...buildReasonNextTaskStepLog(context, {\n redoFiles,\n noScopedFilesDiagnostic,\n }),\n });\n\n return; // 🔴 HARD EXIT — skip Step 6 and risk reasoning entirely\n }\n\n // ---------------------------\n // Task-level reasoning (cross-file)\n // ---------------------------\n // Remaining work should respect durable step completion state first.\n // This avoids re-selecting files that were completed via analyze-only fallback.\n const remainingFiles = pendingFiles.filter((path) => !redoFiles.includes(path));\n\n\n // ---------------------------\n // Decide next step\n // ---------------------------\n let nextAction: typeof iteration.nextAction = \"continue\";\n let rationale = \"\";\n let confidence = 0.9;\n let nextFile: string | undefined;\n\n if (redoFiles.length > 0) {\n nextAction = \"redo-step\";\n rationale = progressState.completion.reason;\n nextFile = redoFiles[0];\n confidence = 0.7;\n } else if (hasExpansionSignal) {\n nextAction = \"expand-scope\";\n rationale = `Trail expansion requested from prior research (${expansionFiles.length} file(s), ${expansionQueries.length} query term(s)).`;\n confidence = 0.86;\n } else if (remainingFiles.length > 0) {\n nextAction = \"continue\";\n rationale = `Required targets remain unresolved: ${remainingFiles.join(\", \")}`;\n nextFile = pickQuestionScopedFile(context, remainingFiles);\n confidence = 0.95;\n } else if (!progressState.evidenceSatisfied && progressState.optionalTargets.length > 0) {\n nextAction = \"expand-scope\";\n rationale = `Need grounded evidence before completion; ${progressState.optionalTargets.length} candidate file(s) remain to explore.`;\n confidence = 0.9;\n } else {\n nextAction = progressState.completion.eligible ? \"complete\" : \"continue\";\n rationale = progressState.completion.reason;\n confidence = progressState.completion.eligible ? 0.98 : 0.86;\n }\n\n /* // ---------------------------\n // 6.5️⃣ Optional: Reason over known risks\n // ---------------------------\n const knownRisks = context.analysis.understanding?.risks ?? [];\n\n if (knownRisks.length > 0) {\n // Optionally call the LLM with constrained instructions\n const riskPrompt = `\nYou are given the following KNOWN RISKS (authoritative, do not invent new ones):\n${knownRisks.map(r => \"- \" + r).join(\"\\n\")}\n\nTask:\n- Decide whether it is reasonable to ask the user for clarification before proceeding.\n- Return STRICT JSON: { askUser: true|false, rationale: string }\n`;\n\n try {\n const aiResponse = await generate({\n query: context.initContext?.userQuery ?? \"\",\n content: riskPrompt\n });\n\n const cleaned = await cleanupModule.run({\n query: context.initContext?.userQuery ?? \"\",\n content: aiResponse.data ?? \"\"\n });\n\n const parsed = cleaned.data;\n\n // type guard\n if (\n parsed &&\n typeof parsed === \"object\" &&\n \"askUser\" in parsed &&\n \"rationale\" in parsed &&\n typeof (parsed as { rationale?: unknown }).rationale === \"string\"\n ) {\n if ((parsed as { askUser: boolean }).askUser) {\n nextAction = \"request-feedback\";\n rationale += `\\nUser clarification recommended due to known risks: ${(parsed as { rationale: string }).rationale}`;\n confidence = Math.min(confidence, 0.8); // slightly lower because human needed\n }\n }\n } catch (err) {\n console.warn(\"[reasonNextTaskStep] Risk reasoning failed\", err);\n // fallback: ignore, keep deterministic nextAction\n }\n } */\n\n\n // ---------------------------\n // 7️⃣ Ensure a durable Step exists for nextFile\n // ---------------------------\n if (nextFile) {\n let nextStep = steps.find(s => s.filePath === nextFile);\n const nextQuestionId = pickQuestionIdForNextFile(context, nextFile);\n if (!nextStep) {\n nextStep = {\n taskId: context.task.id,\n filePath: nextFile,\n status: \"pending\",\n questionId: nextQuestionId,\n stepQuestions: nextQuestionId ? [nextQuestionId] : undefined,\n };\n context.task.steps.push(nextStep);\n }\n if (!nextStep.questionId && nextQuestionId) {\n nextStep.questionId = nextQuestionId;\n nextStep.stepQuestions = [nextQuestionId];\n }\n\n if (nextAction === \"redo-step\") {\n nextStep.status = \"pending\";\n nextStep.startTime = undefined;\n nextStep.endTime = undefined;\n if (nextStep.result && typeof nextStep.result === \"object\") {\n delete (nextStep.result as Record<string, unknown>).stepReasoning;\n }\n }\n\n context.task.currentStep = nextStep;\n }\n\n // ---------------------------\n // 8️⃣ Persist reasoning\n // ---------------------------\n context.analysis.iterationReasoning = {\n ...iteration,\n nextAction,\n rationale,\n confidence,\n nextTargets: nextAction === \"expand-scope\"\n ? {\n files: expansionFiles.length > 0 ? expansionFiles : progressState.optionalTargets,\n searchQueries: expansionQueries,\n }\n : { files: Array.from(new Set(redoFiles.length > 0 ? redoFiles : remainingFiles)) },\n summary: `Task step decision: ${nextAction}`,\n };\n\n logInputOutput(\"reasonNextTaskStep\", \"output\", {\n ...buildReasonNextTaskStepLog(context, {\n redoFiles,\n remainingFiles,\n expansionFiles: nextAction === \"expand-scope\" ? expansionFiles : undefined,\n expansionQueries: nextAction === \"expand-scope\" ? expansionQueries : undefined,\n noScopedFilesDiagnostic,\n }),\n });\n },\n};\n\nexport const reasonNextTaskStep = reasonNextStepSelection;\n"]}