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,25 +1,22 @@
1
- // File: src/agents/researchPlanGenStep.ts
1
+ /**
2
+ * Generates ordered research steps for repo-wide or multi-question work.
3
+ *
4
+ * Why this file exists:
5
+ * - research planning should stay small and typed even when the task is broad
6
+ * - ordered question parts now give the planner one stable view of user-facing sub-questions
7
+ * - runtime execution still owns when those research steps actually run
8
+ */
2
9
  import { generate } from "../lib/generate.js";
3
10
  import { cleanupModule } from "../pipeline/modules/cleanupModule.js";
4
11
  import { logInputOutput } from "../utils/promptLogHelper.js";
5
- const RESEARCH_ACTIONS = [
6
- {
7
- action: "research-impact-map",
8
- description: "Map expected cross-file impact and affected areas before edits.",
9
- },
10
- {
11
- action: "research-symbol-trace",
12
- description: "Trace key symbols and call paths across candidate files.",
13
- },
14
- {
15
- action: "research-risk-check",
16
- description: "Identify risks, assumptions, and safety constraints.",
17
- },
18
- {
19
- action: "research-architecture-synthesis",
20
- description: "Synthesize architecture, hotspots, and coupling points from findings.",
21
- },
22
- ];
12
+ import { getActionsByPhase } from "./actionRegistry.js";
13
+ import { buildResumePacket, renderResumePacket } from "../utils/resumeState.js";
14
+ // Runtime registry is now authoritative for allowed research actions.
15
+ const RESEARCH_ACTIONS = getActionsByPhase("research")
16
+ .map(spec => ({
17
+ action: spec.id,
18
+ description: `${spec.id} (${spec.executorKind}, ${spec.safety})`,
19
+ }));
23
20
  /**
24
21
  * RESEARCH PLAN GENERATOR
25
22
  * Produces ordered research steps tailored to the current query and scope.
@@ -37,9 +34,19 @@ export const researchPlanGenStep = {
37
34
  context.initContext?.userQuery ??
38
35
  "";
39
36
  const intentCategory = context.analysis.intent?.intentCategory ?? "request";
37
+ const orderedQuestions = context.analysis.intent?.questions ?? [];
40
38
  const scopeType = context.analysis.scopeType ?? "repo-wide";
41
- const selectedFiles = context.analysis.focus?.selectedFiles ?? [];
42
- const candidateFiles = context.analysis.focus?.candidateFiles ?? [];
39
+ const selectedFiles = context.analysis.executionPolicy?.executionRequired ??
40
+ context.analysis.focus?.executionRequired ??
41
+ context.analysis.focus?.selectedFiles ??
42
+ [];
43
+ const candidateFiles = context.analysis.executionPolicy?.explorationCandidates ??
44
+ context.analysis.focus?.explorationCandidates ??
45
+ context.analysis.focus?.candidateFiles ??
46
+ [];
47
+ const resumedContextCapsule = renderResumePacket(buildResumePacket(context.analysis?.resumeState)) ||
48
+ context.initContext?.resumedContextCapsule ||
49
+ "";
43
50
  const prompt = `
44
51
  You are generating a research-only execution plan for a coding agent.
45
52
 
@@ -58,28 +65,47 @@ ${JSON.stringify(selectedFiles.slice(0, 20), null, 2)}
58
65
  Candidate files (current):
59
66
  ${JSON.stringify(candidateFiles.slice(0, 30), null, 2)}
60
67
 
68
+ ${resumedContextCapsule ? `Resumed context capsule:\n${resumedContextCapsule}\n` : ""}
69
+
70
+ Ordered question parts:
71
+ ${JSON.stringify(orderedQuestions, null, 2)}
72
+
61
73
  Allowed research actions (use only these):
62
74
  ${JSON.stringify(RESEARCH_ACTIONS, null, 2)}
63
75
 
64
76
  Rules:
65
77
  - Return 2-4 ordered steps.
66
78
  - Every step action must be one of the allowed research actions.
79
+ - Include "questionId" when one question clearly owns the step.
67
80
  - Include architecture synthesis as final step when scope is multi-file or repo-wide.
68
81
  - Prefer deterministic filePath values:
69
82
  - research-impact-map => "__research__/impact-map"
70
83
  - research-symbol-trace => "__research__/symbol-trace"
71
84
  - research-risk-check => "__research__/risk-check"
72
85
  - research-architecture-synthesis => "__research__/architecture-synthesis"
86
+ - research-trail-expand => "__research__/trail-expand"
73
87
  - Return strict JSON only:
74
88
  {
75
89
  "steps": [
76
- { "id": "research:1", "action": "research-impact-map", "targetFile": "__research__/impact-map", "description": "..." }
90
+ { "id": "research:1", "action": "research-impact-map", "actionId": "research-impact-map", "actionArgs": {}, "targetFile": "__research__/impact-map", "description": "..." }
77
91
  ]
78
92
  }
79
93
  `.trim();
80
94
  try {
81
95
  const input = { query: intentText, content: prompt };
82
- const generated = await generate(input);
96
+ const generated = await generate(input, {
97
+ caller: "researchPlanGenStep",
98
+ inputContext: {
99
+ intentText,
100
+ intentCategory,
101
+ orderedQuestions,
102
+ scopeType,
103
+ selectedFiles,
104
+ candidateFiles,
105
+ resumedContextCapsule,
106
+ allowedActions: RESEARCH_ACTIONS,
107
+ },
108
+ });
83
109
  const raw = typeof generated.data === "string"
84
110
  ? generated.data
85
111
  : JSON.stringify(generated.data ?? "{}");
@@ -100,10 +126,16 @@ Rules:
100
126
  ? "__research__/symbol-trace"
101
127
  : action === "research-risk-check"
102
128
  ? "__research__/risk-check"
103
- : "__research__/architecture-synthesis";
129
+ : action === "research-trail-expand"
130
+ ? "__research__/trail-expand"
131
+ : "__research__/architecture-synthesis";
104
132
  return {
105
133
  id: step.id ?? `research:${index + 1}`,
106
134
  action,
135
+ // Example: action="research-risk-check" stays identical actionId.
136
+ actionId: step.actionId ?? action,
137
+ actionArgs: step.actionArgs ?? {},
138
+ questionId: typeof step.questionId === "string" ? step.questionId : undefined,
107
139
  targetFile: step.targetFile ?? defaultFile,
108
140
  description: step.description ?? `Run ${action}`,
109
141
  metadata: step.metadata ?? {},
@@ -112,7 +144,10 @@ Rules:
112
144
  })
113
145
  .slice(0, 4);
114
146
  context.analysis.planSuggestion = { plan: { steps: normalized } };
115
- logInputOutput("researchPlanGen", "output", { steps: normalized });
147
+ logInputOutput("researchPlanGen", "output", {
148
+ callId: generated.trace?.callId,
149
+ steps: normalized,
150
+ });
116
151
  }
117
152
  catch (err) {
118
153
  console.warn("[researchPlanGenStep] Failed to generate research plan:", err);
@@ -121,3 +156,4 @@ Rules:
121
156
  }
122
157
  },
123
158
  };
159
+ //# sourceMappingURL=researchPlanGenStep.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"researchPlanGenStep.js","sourceRoot":"","sources":["../../src/agents/researchPlanGenStep.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Generates ordered research steps for repo-wide or multi-question work.\n *\n * Why this file exists:\n * - research planning should stay small and typed even when the task is broad\n * - ordered question parts now give the planner one stable view of user-facing sub-questions\n * - runtime execution still owns when those research steps actually run\n */\nimport { generate } from \"../lib/generate.js\";\nimport { cleanupModule } from \"../pipeline/modules/cleanupModule.js\";\nimport { logInputOutput } from \"../utils/promptLogHelper.js\";\nimport type { StructuredContext, ModuleIO, AgentPlanStep } from \"../types.js\";\nimport { getActionsByPhase } from \"./actionRegistry.js\";\nimport { buildResumePacket, renderResumePacket } from \"../utils/resumeState.js\";\n\n/**\n * Refactor note:\n * - Research allowlist now comes from runtime ActionRegistry.\n * - Why it exists: planners and runtime must share one action contract.\n */\ntype ResearchAction =\n | \"research-impact-map\"\n | \"research-symbol-trace\"\n | \"research-risk-check\"\n | \"research-architecture-synthesis\"\n | \"research-trail-expand\";\n\n// Runtime registry is now authoritative for allowed research actions.\nconst RESEARCH_ACTIONS: Array<{ action: ResearchAction; description: string }> = getActionsByPhase(\"research\")\n .map(spec => ({\n action: spec.id as ResearchAction,\n description: `${spec.id} (${spec.executorKind}, ${spec.safety})`,\n }));\n\n/**\n * RESEARCH PLAN GENERATOR\n * Produces ordered research steps tailored to the current query and scope.\n * Example: for repo-wide architecture questions, prioritize symbol-trace + synthesis.\n */\nexport const researchPlanGenStep = {\n name: \"researchPlanGen\",\n description: \"Generates ordered research steps for repo-wide complex lanes.\",\n requires: [\"analysis.intent\", \"analysis.scopeType\", \"analysis.routingDecision\"],\n produces: [\"analysis.planSuggestion\"],\n\n async run(context: StructuredContext): Promise<void> {\n context.analysis ||= {};\n delete context.analysis.planSuggestion;\n\n const intentText =\n context.analysis.intent?.normalizedQuery ??\n context.initContext?.userQuery ??\n \"\";\n const intentCategory = context.analysis.intent?.intentCategory ?? \"request\";\n const orderedQuestions = context.analysis.intent?.questions ?? [];\n const scopeType = context.analysis.scopeType ?? \"repo-wide\";\n const selectedFiles =\n context.analysis.executionPolicy?.executionRequired ??\n context.analysis.focus?.executionRequired ??\n context.analysis.focus?.selectedFiles ??\n [];\n const candidateFiles =\n context.analysis.executionPolicy?.explorationCandidates ??\n context.analysis.focus?.explorationCandidates ??\n context.analysis.focus?.candidateFiles ??\n [];\n const resumedContextCapsule =\n renderResumePacket(buildResumePacket(context.analysis?.resumeState)) ||\n context.initContext?.resumedContextCapsule ||\n \"\";\n\n const prompt = `\nYou are generating a research-only execution plan for a coding agent.\n\nUser intent:\n${intentText}\n\nIntent category:\n${intentCategory}\n\nScope:\n${scopeType}\n\nSelected files (current):\n${JSON.stringify(selectedFiles.slice(0, 20), null, 2)}\n\nCandidate files (current):\n${JSON.stringify(candidateFiles.slice(0, 30), null, 2)}\n\n${resumedContextCapsule ? `Resumed context capsule:\\n${resumedContextCapsule}\\n` : \"\"}\n\nOrdered question parts:\n${JSON.stringify(orderedQuestions, null, 2)}\n\nAllowed research actions (use only these):\n${JSON.stringify(RESEARCH_ACTIONS, null, 2)}\n\nRules:\n- Return 2-4 ordered steps.\n- Every step action must be one of the allowed research actions.\n- Include \"questionId\" when one question clearly owns the step.\n- Include architecture synthesis as final step when scope is multi-file or repo-wide.\n- Prefer deterministic filePath values:\n - research-impact-map => \"__research__/impact-map\"\n - research-symbol-trace => \"__research__/symbol-trace\"\n - research-risk-check => \"__research__/risk-check\"\n - research-architecture-synthesis => \"__research__/architecture-synthesis\"\n - research-trail-expand => \"__research__/trail-expand\"\n- Return strict JSON only:\n{\n \"steps\": [\n { \"id\": \"research:1\", \"action\": \"research-impact-map\", \"actionId\": \"research-impact-map\", \"actionArgs\": {}, \"targetFile\": \"__research__/impact-map\", \"description\": \"...\" }\n ]\n}\n `.trim();\n\n try {\n const input: ModuleIO = { query: intentText, content: prompt };\n const generated = await generate(input, {\n caller: \"researchPlanGenStep\",\n inputContext: {\n intentText,\n intentCategory,\n orderedQuestions,\n scopeType,\n selectedFiles,\n candidateFiles,\n resumedContextCapsule,\n allowedActions: RESEARCH_ACTIONS,\n },\n });\n const raw =\n typeof generated.data === \"string\"\n ? generated.data\n : JSON.stringify(generated.data ?? \"{}\");\n const cleaned = await cleanupModule.run({ query: intentText, content: raw });\n const jsonString =\n typeof cleaned.content === \"string\"\n ? cleaned.content\n : JSON.stringify(cleaned.content ?? \"{}\");\n\n const parsed = JSON.parse(jsonString) as { steps?: AgentPlanStep[] };\n const candidateSteps = Array.isArray(parsed.steps) ? parsed.steps : [];\n const allowedSet = new Set(RESEARCH_ACTIONS.map(a => a.action));\n\n const normalized: AgentPlanStep[] = candidateSteps\n .filter(step => typeof step?.action === \"string\" && allowedSet.has(step.action as ResearchAction))\n .map((step, index) => {\n const action = step.action as ResearchAction;\n const defaultFile =\n action === \"research-impact-map\"\n ? \"__research__/impact-map\"\n : action === \"research-symbol-trace\"\n ? \"__research__/symbol-trace\"\n : action === \"research-risk-check\"\n ? \"__research__/risk-check\"\n : action === \"research-trail-expand\"\n ? \"__research__/trail-expand\"\n : \"__research__/architecture-synthesis\";\n\n return {\n id: step.id ?? `research:${index + 1}`,\n action,\n // Example: action=\"research-risk-check\" stays identical actionId.\n actionId: step.actionId ?? action,\n actionArgs: step.actionArgs ?? {},\n questionId: typeof step.questionId === \"string\" ? step.questionId : undefined,\n targetFile: step.targetFile ?? defaultFile,\n description: step.description ?? `Run ${action}`,\n metadata: step.metadata ?? {},\n groups: [\"analysis\", \"planning\"],\n };\n })\n .slice(0, 4);\n\n context.analysis.planSuggestion = { plan: { steps: normalized } };\n logInputOutput(\"researchPlanGen\", \"output\", {\n callId: generated.trace?.callId,\n steps: normalized,\n });\n } catch (err) {\n console.warn(\"[researchPlanGenStep] Failed to generate research plan:\", err);\n context.analysis.planSuggestion = { plan: { steps: [] } };\n logInputOutput(\"researchPlanGen\", \"output\", { steps: [] });\n }\n },\n};\n"]}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Re-exports modular target classification helpers from the legacy simple-agent path.
3
+ */
4
+ export * from "../agent/policy/targetClassification.js";
5
+ //# sourceMappingURL=resolveAgentTargetClassification.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveAgentTargetClassification.js","sourceRoot":"","sources":["../../src/agents/resolveAgentTargetClassification.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,cAAc,yCAAyC,CAAC","sourcesContent":["/**\n * Re-exports modular target classification helpers from the legacy simple-agent path.\n */\nexport * from \"../agent/policy/targetClassification.js\";\n"]}
@@ -103,3 +103,4 @@ function hasExplicitWriteIntent(query) {
103
103
  const q = query.toLowerCase();
104
104
  return /\b(add|update|edit|modify|refactor|rewrite|implement|fix|create|remove|delete|replace|rename|write|patch|change|increment|bump|set)\b/.test(q);
105
105
  }
106
+ //# sourceMappingURL=resolveExecutionModeStep.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveExecutionModeStep.js","sourceRoot":"","sources":["../../src/agents/resolveExecutionModeStep.ts"],"names":[],"mappings":"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","sourcesContent":["import { StructuredContext } from \"../types\";\n\nexport const resolveExecutionModeStep = {\n name: \"resolveExecutionMode\",\n\n description:\n \"Derive a hard execution mode from the interpreted user intent. \" +\n \"This decision is authoritative and must not be changed later.\",\n\n run: async (context: StructuredContext): Promise<void> => {\n const intent = context.analysis?.intent;\n if (!intent) {\n throw new Error(\"resolveExecutionMode: missing analysis.intent\");\n }\n const normalizedQuery =\n intent.normalizedQuery?.trim() ??\n context.initContext?.userQuery?.trim() ??\n \"\";\n\n // ───── Defaults: safe, read-only ─────\n let mode: \"analyze\" | \"transform\" = \"analyze\";\n let rationale = \"Defaulted to analysis mode.\";\n let constraints = {\n allowAnalysis: true,\n allowPlanning: true,\n allowFileWrites: false,\n docsOnly: false\n };\n\n switch (intent.intentCategory) {\n // ───── Code-changing intents ─────\n case \"codingTask\":\n case \"refactorTask\":\n mode = \"transform\";\n rationale = \"User intent implies code modification.\";\n constraints = {\n allowAnalysis: true,\n allowPlanning: true,\n allowFileWrites: true,\n docsOnly: false\n };\n break;\n\n // ───── Docs / comments only ─────\n case \"docsAndComments\":\n case \"docsandcomments\":\n case \"docsAndComment\":\n case \"docs\":\n case \"comments\":\n case \"comment\":\n mode = \"transform\";\n rationale = \"User intent requests documentation/comments only.\";\n constraints = {\n allowAnalysis: false,\n allowPlanning: false,\n allowFileWrites: true,\n docsOnly: true\n };\n break;\n\n // ───── Generic requests: promote to transform when edit intent is explicit ─────\n case \"request\":\n if (hasExplicitWriteIntent(normalizedQuery)) {\n mode = \"transform\";\n rationale = \"Request contains explicit edit intent.\";\n constraints = {\n allowAnalysis: true,\n allowPlanning: true,\n allowFileWrites: true,\n docsOnly: false\n };\n }\n break;\n\n // ───── Everything else is analysis ─────\n case \"debugging\":\n case \"planning\":\n case \"question\":\n case \"explanation\":\n case \"writing\":\n // keep defaults\n rationale = \"User intent implies investigation or explanation.\";\n break;\n }\n\n // Safety override: question-form prompts should remain read-only unless\n // they explicitly ask for edits (e.g. \"How do I update README?\").\n if (isQuestionLikeQuery(normalizedQuery) && !hasExplicitWriteIntent(normalizedQuery)) {\n mode = \"analyze\";\n rationale = \"Question-form intent without explicit edit verb — forced analysis mode.\";\n constraints = {\n allowAnalysis: true,\n allowPlanning: true,\n allowFileWrites: false,\n docsOnly: false\n };\n }\n\n context.executionControl = {\n mode,\n rationale,\n confidence: intent.confidence,\n constraints\n };\n }\n};\n\nfunction isQuestionLikeQuery(query: string): boolean {\n const q = query.trim().toLowerCase();\n if (!q) return false;\n if (q.endsWith(\"?\")) return true;\n return /^(what|why|how|which|where|when|who)\\b/.test(q);\n}\n\nfunction hasExplicitWriteIntent(query: string): boolean {\n const q = query.toLowerCase();\n return /\\b(add|update|edit|modify|refactor|rewrite|implement|fix|create|remove|delete|replace|rename|write|patch|change|increment|bump|set)\\b/.test(q);\n}\n"]}
@@ -0,0 +1,74 @@
1
+ import { logInputOutput } from "../utils/promptLogHelper.js";
2
+ import { SearchOrchestrator } from "../search/SearchOrchestrator.js";
3
+ import { deriveFocusFromSearchStep } from "./deriveFocusFromSearchStep.js";
4
+ import path from "path";
5
+ export const resolveExplicitTargetsStep = {
6
+ name: "resolveExplicitTargets",
7
+ async run(context) {
8
+ context.analysis ?? (context.analysis = {});
9
+ const query = context.initContext?.userQuery ?? "";
10
+ const orchestrator = new SearchOrchestrator();
11
+ const search = await orchestrator.run({
12
+ context,
13
+ query,
14
+ mode: "exact-target",
15
+ });
16
+ resetStaleFocusForNewExplicitTargets(context, search);
17
+ deriveFocusFromSearchStep.run(context, search);
18
+ logInputOutput("resolveExplicitTargetsStep", "output", {
19
+ mode: search.mode,
20
+ resolvedTargetFiles: search.resolvedFiles.map(item => item.path),
21
+ resolvedTargetFolders: search.resolvedFolders,
22
+ resolvedTargetSymbols: search.resolvedSymbols,
23
+ unresolvedTargetRefs: search.unresolvedRefs,
24
+ ambiguousTargetRefs: search.ambiguousRefs,
25
+ enteredBroadFallback: search.unresolvedRefs.length > 0 && search.resolvedFiles.length === 0,
26
+ });
27
+ },
28
+ };
29
+ /**
30
+ * Clears stale per-turn focus when a new explicit target is stronger than resumed task context.
31
+ *
32
+ * Examples:
33
+ * - previous wrong answer left `guardPolicy.ts` selected, new query says `check guards`
34
+ * - resumed currentStep points at one old file, new exact-target resolves a different folder
35
+ */
36
+ function resetStaleFocusForNewExplicitTargets(context, search) {
37
+ var _a;
38
+ const hasExplicitResolution = search.resolvedFiles.length > 0 ||
39
+ search.resolvedFolders.length > 0 ||
40
+ search.resolvedSymbols.length > 0;
41
+ if (!hasExplicitResolution)
42
+ return;
43
+ context.analysis ?? (context.analysis = {});
44
+ (_a = context.analysis).focus || (_a.focus = { selectedFiles: [], candidateFiles: [] });
45
+ const nextScopeFiles = new Set(search.resolvedFiles.map(item => item.path));
46
+ const nextScopeCandidates = new Set(search.fileCandidates.map(item => item.path));
47
+ const nextScopeFolders = search.resolvedFolders.map(folder => path.normalize(folder));
48
+ const existingSelected = context.analysis.focus.selectedFiles ?? [];
49
+ const existingCandidates = context.analysis.focus.candidateFiles ?? [];
50
+ const currentStepPath = context.task?.currentStep?.filePath;
51
+ const fitsNextScope = (filePath) => {
52
+ const normalized = path.normalize(String(filePath ?? ""));
53
+ if (!normalized)
54
+ return false;
55
+ if (nextScopeFiles.has(normalized) || nextScopeCandidates.has(normalized))
56
+ return true;
57
+ return nextScopeFolders.some(folder => normalized === folder || normalized.startsWith(`${folder}${path.sep}`));
58
+ };
59
+ const staleSelected = existingSelected.some(filePath => !fitsNextScope(filePath));
60
+ const staleCandidates = existingCandidates.some(filePath => !fitsNextScope(filePath));
61
+ const staleCurrentStep = currentStepPath ? !fitsNextScope(currentStepPath) : false;
62
+ if (!staleSelected && !staleCandidates && !staleCurrentStep) {
63
+ return;
64
+ }
65
+ context.analysis.focus.selectedFiles = [];
66
+ context.analysis.focus.candidateFiles = [];
67
+ context.analysis.focus.executionRequired = [];
68
+ context.analysis.focus.explorationCandidates = [];
69
+ context.analysis.focus.executionLock = { enabled: false, files: [], reason: "reset-for-new-explicit-target" };
70
+ if (context.task) {
71
+ context.task.currentStep = undefined;
72
+ }
73
+ }
74
+ //# sourceMappingURL=resolveExplicitTargetsStep.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveExplicitTargetsStep.js","sourceRoot":"","sources":["../../src/agents/resolveExplicitTargetsStep.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Resolves explicit file, folder, and symbol references through the shared search orchestrator.\n *\n * Why this exists:\n * - intent extraction only collects possible refs from the query text\n * - search should own discovery before routing decides how narrow to stay\n * - this step keeps the old compatibility fields, but the source of truth is the search packet\n */\nimport type { StructuredContext } from \"../types.js\";\nimport { logInputOutput } from \"../utils/promptLogHelper.js\";\nimport { SearchOrchestrator } from \"../search/SearchOrchestrator.js\";\nimport { deriveFocusFromSearchStep } from \"./deriveFocusFromSearchStep.js\";\nimport path from \"path\";\n\nexport const resolveExplicitTargetsStep = {\n name: \"resolveExplicitTargets\",\n\n async run(context: StructuredContext): Promise<void> {\n context.analysis ??= {};\n const query = context.initContext?.userQuery ?? \"\";\n const orchestrator = new SearchOrchestrator();\n const search = await orchestrator.run({\n context,\n query,\n mode: \"exact-target\",\n });\n resetStaleFocusForNewExplicitTargets(context, search);\n deriveFocusFromSearchStep.run(context, search);\n\n logInputOutput(\"resolveExplicitTargetsStep\", \"output\", {\n mode: search.mode,\n resolvedTargetFiles: search.resolvedFiles.map(item => item.path),\n resolvedTargetFolders: search.resolvedFolders,\n resolvedTargetSymbols: search.resolvedSymbols,\n unresolvedTargetRefs: search.unresolvedRefs,\n ambiguousTargetRefs: search.ambiguousRefs,\n enteredBroadFallback: search.unresolvedRefs.length > 0 && search.resolvedFiles.length === 0,\n });\n },\n};\n\n/**\n * Clears stale per-turn focus when a new explicit target is stronger than resumed task context.\n *\n * Examples:\n * - previous wrong answer left `guardPolicy.ts` selected, new query says `check guards`\n * - resumed currentStep points at one old file, new exact-target resolves a different folder\n */\nfunction resetStaleFocusForNewExplicitTargets(context: StructuredContext, search: Awaited<ReturnType<SearchOrchestrator[\"run\"]>>): void {\n const hasExplicitResolution =\n search.resolvedFiles.length > 0 ||\n search.resolvedFolders.length > 0 ||\n search.resolvedSymbols.length > 0;\n if (!hasExplicitResolution) return;\n\n context.analysis ??= {};\n context.analysis.focus ||= { selectedFiles: [], candidateFiles: [] };\n\n const nextScopeFiles = new Set(search.resolvedFiles.map(item => item.path));\n const nextScopeCandidates = new Set(search.fileCandidates.map(item => item.path));\n const nextScopeFolders = search.resolvedFolders.map(folder => path.normalize(folder));\n\n const existingSelected = context.analysis.focus.selectedFiles ?? [];\n const existingCandidates = context.analysis.focus.candidateFiles ?? [];\n const currentStepPath = context.task?.currentStep?.filePath;\n\n const fitsNextScope = (filePath: string | undefined): boolean => {\n const normalized = path.normalize(String(filePath ?? \"\"));\n if (!normalized) return false;\n if (nextScopeFiles.has(normalized) || nextScopeCandidates.has(normalized)) return true;\n return nextScopeFolders.some(folder => normalized === folder || normalized.startsWith(`${folder}${path.sep}`));\n };\n\n const staleSelected = existingSelected.some(filePath => !fitsNextScope(filePath));\n const staleCandidates = existingCandidates.some(filePath => !fitsNextScope(filePath));\n const staleCurrentStep = currentStepPath ? !fitsNextScope(currentStepPath) : false;\n\n if (!staleSelected && !staleCandidates && !staleCurrentStep) {\n return;\n }\n\n context.analysis.focus.selectedFiles = [];\n context.analysis.focus.candidateFiles = [];\n context.analysis.focus.executionRequired = [];\n context.analysis.focus.explorationCandidates = [];\n context.analysis.focus.executionLock = { enabled: false, files: [], reason: \"reset-for-new-explicit-target\" };\n if (context.task) {\n context.task.currentStep = undefined;\n }\n}\n"]}
@@ -12,6 +12,14 @@ export const routingDecisionStep = {
12
12
  const scope = (context.analysis.scopeType ?? "repo-wide");
13
13
  const intentCategory = context.analysis.intent?.intentCategory ?? "request";
14
14
  const intentConfidence = context.analysis.intent?.confidence ?? 0.5;
15
+ const resolvedExplicitTargets = context.analysis.focus?.resolvedTargetFiles ??
16
+ context.analysis.intent?.resolvedTargetFiles ??
17
+ [];
18
+ const resolvedExplicitFolders = context.analysis.focus?.resolvedTargetFolders ?? [];
19
+ const unresolvedExplicitRefs = context.analysis.search?.unresolvedRefs ?? [];
20
+ const ambiguousExplicitRefs = context.analysis.search?.ambiguousRefs ?? [];
21
+ const resumeIntent = context.analysis.resumeIntent;
22
+ const continuityDecision = context.analysis.continuityDecision;
15
23
  const query = context.initContext?.userQuery?.trim() ?? "";
16
24
  const canWrite = context.executionControl?.constraints?.allowFileWrites ?? false;
17
25
  const complexitySignals = [
@@ -29,7 +37,29 @@ export const routingDecisionStep = {
29
37
  let decision = "has-info";
30
38
  let allowSearch = true;
31
39
  let scopeLocked = false;
32
- if (scope === "none") {
40
+ if (resolvedExplicitTargets.length > 0) {
41
+ allowSearch = false;
42
+ scopeLocked = true;
43
+ decision = "has-info";
44
+ }
45
+ else if (resolvedExplicitFolders.length > 0) {
46
+ // Folder targets are explicit scope, but they still need search to expand into concrete files.
47
+ allowSearch = true;
48
+ scopeLocked = true;
49
+ decision = "needs-info";
50
+ }
51
+ else if (continuityDecision?.answerNow) {
52
+ allowSearch = false;
53
+ scopeLocked = true;
54
+ decision = "has-info";
55
+ }
56
+ else if (resumeIntent?.kind === "continuity-next-step" && !continuityDecision?.answerNow) {
57
+ const hasResumeFiles = resumeIntent.relevantResumeFiles.length > 0;
58
+ allowSearch = !hasResumeFiles;
59
+ scopeLocked = hasResumeFiles;
60
+ decision = hasResumeFiles ? "has-info" : "needs-info";
61
+ }
62
+ else if (scope === "none") {
33
63
  allowSearch = false;
34
64
  scopeLocked = true;
35
65
  }
@@ -45,22 +75,32 @@ export const routingDecisionStep = {
45
75
  if (!allowSearch) {
46
76
  decision = "has-info";
47
77
  }
48
- const routeLabel = !allowSearch
49
- ? "direct-answer"
50
- : isResearchScope
51
- ? "repo-research"
52
- : scope === "single-file"
53
- ? "single-file-focused"
54
- : "bounded-analysis";
55
- const allowResearch = scope !== "none" &&
78
+ const routeLabel = resolvedExplicitTargets.length > 0 || resolvedExplicitFolders.length > 0
79
+ ? "explicit-target"
80
+ : continuityDecision?.answerNow
81
+ ? "resume-continuity"
82
+ : !allowSearch
83
+ ? "direct-answer"
84
+ : isResearchScope
85
+ ? "repo-research"
86
+ : scope === "single-file"
87
+ ? "single-file-focused"
88
+ : "bounded-analysis";
89
+ const allowResearch = resolvedExplicitTargets.length === 0 &&
90
+ resolvedExplicitFolders.length === 0 &&
91
+ !continuityDecision?.answerNow &&
92
+ scope !== "none" &&
56
93
  ((isAnalysisLike && isResearchScope && (decision === "needs-info" || complexitySignals >= 2)) ||
57
94
  (isRefactorLike && complexitySignals >= 1));
58
95
  const confidence = Math.max(0, Math.min(1, 0.55 + intentConfidence * 0.35 - (ambiguousIntent ? 0.2 : 0)));
96
+ const allowTransform = continuityDecision?.answerNow || resumeIntent?.fastTrackEligible
97
+ ? false
98
+ : canWrite && scope !== "none";
59
99
  const routingDecision = {
60
100
  decision,
61
101
  allowSearch,
62
102
  allowResearch,
63
- allowTransform: canWrite && scope !== "none",
103
+ allowTransform,
64
104
  scopeLocked,
65
105
  confidence: Number(confidence.toFixed(2)),
66
106
  rationale: [
@@ -69,10 +109,17 @@ export const routingDecisionStep = {
69
109
  `intent=${intentCategory}`,
70
110
  `complexitySignals=${complexitySignals}`,
71
111
  `hasTargets=${hasExplicitTargets}`,
72
- ].join("; "),
112
+ `resolvedTargets=${resolvedExplicitTargets.length}`,
113
+ `resolvedFolders=${resolvedExplicitFolders.length}`,
114
+ `unresolvedTargets=${unresolvedExplicitRefs.length}`,
115
+ `ambiguousTargets=${ambiguousExplicitRefs.length}`,
116
+ resumeIntent ? `resumeIntent=${resumeIntent.kind}` : "",
117
+ continuityDecision ? `continuityDecision=${continuityDecision.kind}` : "",
118
+ ].filter(Boolean).join("; "),
73
119
  };
74
120
  context.analysis.routingDecision = routingDecision;
75
121
  logInputOutput("routingDecisionStep", "output", routingDecision);
76
122
  return routingDecision;
77
123
  },
78
124
  };
125
+ //# sourceMappingURL=routingDecisionStep.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routingDecisionStep.js","sourceRoot":"","sources":["../../src/agents/routingDecisionStep.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Shapes the initial route from already-known analysis signals.\n *\n * Priority order:\n * 1. resolved explicit targets\n * 2. continuity decisions for resumed tasks\n * 3. generic scope/intent heuristics\n *\n * Example:\n * - resolved `index.ts` target -> stay narrow, no broad search\n * - resolved folder `cli/src/agents` -> keep the explicit-target lane, but still allow search to expand inside that folder\n * - continuity summary with enough resumed state -> direct-answer lane\n * - repo-wide explanation -> needs-info, allow evidence and research\n */\nimport type { StructuredContext, RoutingDecision, ScopeType } from \"../types.js\";\nimport { logInputOutput } from \"../utils/promptLogHelper.js\";\n\n/**\n * Computes an initial routing decision from existing analysis signals.\n * This step is intentionally deterministic and non-invasive:\n * it only writes analysis.routingDecision for observability.\n */\nexport const routingDecisionStep = {\n name: \"routingDecision\",\n description: \"Derive a lightweight routing decision for logging and downstream planning context.\",\n\n run: async (context: StructuredContext): Promise<RoutingDecision> => {\n context.analysis ||= {};\n\n const scope = (context.analysis.scopeType ?? \"repo-wide\") as ScopeType;\n const intentCategory = context.analysis.intent?.intentCategory ?? \"request\";\n const intentConfidence = context.analysis.intent?.confidence ?? 0.5;\n const resolvedExplicitTargets =\n context.analysis.focus?.resolvedTargetFiles ??\n context.analysis.intent?.resolvedTargetFiles ??\n [];\n const resolvedExplicitFolders = context.analysis.focus?.resolvedTargetFolders ?? [];\n const unresolvedExplicitRefs = context.analysis.search?.unresolvedRefs ?? [];\n const ambiguousExplicitRefs = context.analysis.search?.ambiguousRefs ?? [];\n const resumeIntent = context.analysis.resumeIntent;\n const continuityDecision = context.analysis.continuityDecision;\n const query = context.initContext?.userQuery?.trim() ?? \"\";\n const canWrite = context.executionControl?.constraints?.allowFileWrites ?? false;\n\n const complexitySignals = [\n /\\b(and|also|plus|as well as|in addition)\\b/gi,\n /\\b(compare|trade[\\s-]?off|pros and cons|strategy|architecture)\\b/gi,\n /\\?/g,\n ].reduce((sum, rx) => sum + ((query.match(rx) ?? []).length > 0 ? 1 : 0), 0);\n\n const isResearchScope = scope === \"repo-wide\";\n const hasExplicitTargets = (context.analysis.intent?.targetFiles?.length ?? 0) > 0;\n const ambiguousIntent = intentConfidence < 0.45;\n const isRefactorLike = intentCategory === \"refactorTask\" || intentCategory === \"codingTask\";\n const isAnalysisLike =\n intentCategory === \"question\" ||\n intentCategory === \"analysis\" ||\n intentCategory === \"explanation\";\n\n let decision: RoutingDecision[\"decision\"] = \"has-info\";\n let allowSearch = true;\n let scopeLocked = false;\n\n if (resolvedExplicitTargets.length > 0) {\n allowSearch = false;\n scopeLocked = true;\n decision = \"has-info\";\n } else if (resolvedExplicitFolders.length > 0) {\n // Folder targets are explicit scope, but they still need search to expand into concrete files.\n allowSearch = true;\n scopeLocked = true;\n decision = \"needs-info\";\n } else if (continuityDecision?.answerNow) {\n allowSearch = false;\n scopeLocked = true;\n decision = \"has-info\";\n } else if (resumeIntent?.kind === \"continuity-next-step\" && !continuityDecision?.answerNow) {\n const hasResumeFiles = resumeIntent.relevantResumeFiles.length > 0;\n allowSearch = !hasResumeFiles;\n scopeLocked = hasResumeFiles;\n decision = hasResumeFiles ? \"has-info\" : \"needs-info\";\n } else if (scope === \"none\") {\n allowSearch = false;\n scopeLocked = true;\n } else if (scope === \"single-file\" && hasExplicitTargets) {\n scopeLocked = true;\n } else if (scope === \"repo-wide\") {\n scopeLocked = false;\n }\n\n if (isResearchScope || ambiguousIntent || complexitySignals >= 2) {\n decision = \"needs-info\";\n }\n\n if (!allowSearch) {\n decision = \"has-info\";\n }\n\n const routeLabel = resolvedExplicitTargets.length > 0 || resolvedExplicitFolders.length > 0\n ? \"explicit-target\"\n : continuityDecision?.answerNow\n ? \"resume-continuity\"\n : !allowSearch\n ? \"direct-answer\"\n : isResearchScope\n ? \"repo-research\"\n : scope === \"single-file\"\n ? \"single-file-focused\"\n : \"bounded-analysis\";\n\n const allowResearch =\n resolvedExplicitTargets.length === 0 &&\n resolvedExplicitFolders.length === 0 &&\n !continuityDecision?.answerNow &&\n scope !== \"none\" &&\n (\n (isAnalysisLike && isResearchScope && (decision === \"needs-info\" || complexitySignals >= 2)) ||\n (isRefactorLike && complexitySignals >= 1)\n );\n\n const confidence = Math.max(0, Math.min(1, 0.55 + intentConfidence * 0.35 - (ambiguousIntent ? 0.2 : 0)));\n\n const allowTransform =\n continuityDecision?.answerNow || resumeIntent?.fastTrackEligible\n ? false\n : canWrite && scope !== \"none\";\n\n const routingDecision: RoutingDecision = {\n decision,\n allowSearch,\n allowResearch,\n allowTransform,\n scopeLocked,\n confidence: Number(confidence.toFixed(2)),\n rationale: [\n `route=${routeLabel}`,\n `scope=${scope}`,\n `intent=${intentCategory}`,\n `complexitySignals=${complexitySignals}`,\n `hasTargets=${hasExplicitTargets}`,\n `resolvedTargets=${resolvedExplicitTargets.length}`,\n `resolvedFolders=${resolvedExplicitFolders.length}`,\n `unresolvedTargets=${unresolvedExplicitRefs.length}`,\n `ambiguousTargets=${ambiguousExplicitRefs.length}`,\n resumeIntent ? `resumeIntent=${resumeIntent.kind}` : \"\",\n continuityDecision ? `continuityDecision=${continuityDecision.kind}` : \"\",\n ].filter(Boolean).join(\"; \"),\n };\n\n context.analysis.routingDecision = routingDecision;\n\n logInputOutput(\"routingDecisionStep\", \"output\", routingDecision);\n return routingDecision;\n },\n};\n"]}
@@ -1,9 +1,32 @@
1
1
  import { generate } from "../lib/generate.js";
2
2
  import { cleanupModule } from "../pipeline/modules/cleanupModule.js";
3
3
  import { logInputOutput } from "../utils/promptLogHelper.js";
4
+ import { buildResumePacket, renderResumePacket } from "../utils/resumeState.js";
5
+ function reduceScopeClassificationCapsule(value) {
6
+ if (!value.trim())
7
+ return "";
8
+ const lines = value
9
+ .split("\n")
10
+ .map(line => line.trim())
11
+ .filter(Boolean);
12
+ const keepPrefixes = [
13
+ "Original task:",
14
+ "Current task status:",
15
+ "- Normalized intent:",
16
+ "- Selected files:",
17
+ "New user query:",
18
+ ];
19
+ const reduced = lines.filter(line => keepPrefixes.some(prefix => line.startsWith(prefix)));
20
+ return (reduced.length > 0 ? reduced : lines.slice(0, 5)).join("\n");
21
+ }
4
22
  export const scopeClassificationStep = {
5
23
  run: async (context) => {
6
24
  const query = context.initContext?.userQuery?.trim() ?? "";
25
+ const resumedContextCapsule = reduceScopeClassificationCapsule((renderResumePacket(buildResumePacket(context.analysis?.resumeState)) ||
26
+ context.initContext?.resumedContextCapsule?.trim() ||
27
+ ""));
28
+ const explicitTargetFiles = context.analysis?.intent?.targetFiles ?? [];
29
+ const orderedQuestions = context.analysis?.intent?.questions ?? [];
7
30
  context.analysis ?? (context.analysis = {});
8
31
  // ------------------------------------------------------------
9
32
  // 1️⃣ Prepare deterministic hints for the LLM
@@ -23,9 +46,15 @@ export const scopeClassificationStep = {
23
46
  /\b(class|function|method|module)\s+\w+/i.test(lower)) {
24
47
  hints.push("The query references a specific file, class, function, or module; possibly single-file scope.");
25
48
  }
49
+ if (orderedQuestions.length > 1) {
50
+ hints.push(`The query contains ${orderedQuestions.length} ordered question parts; do not collapse it to a narrow single-file scope unless all parts point to one file.`);
51
+ }
26
52
  // ------------------------------------------------------------
27
53
  // 2️⃣ LLM classification
28
54
  // ------------------------------------------------------------
55
+ const explicitTargetHints = explicitTargetFiles.length > 0
56
+ ? `Explicit targets:\n- ${explicitTargetFiles.join("\n- ")}\n`
57
+ : "";
29
58
  const prompt = `
30
59
  You classify the scope of a user's request in a software repository.
31
60
 
@@ -39,18 +68,35 @@ Definitions:
39
68
  - "multi-file": involves several related files/modules.
40
69
  - "repo-wide": broad/systemic across the repository.
41
70
 
42
- User query:
43
- "${query}"
71
+ Current query:
72
+ ${query}
73
+
74
+ ${explicitTargetHints}
75
+
76
+ ${orderedQuestions.length > 1 ? `Ordered question parts:\n${orderedQuestions.map((question, index) => `${index + 1}. ${question.text}`).join("\n")}\n` : ""}
77
+
78
+ ${resumedContextCapsule ? `Resumed context capsule:\n${resumedContextCapsule}\n` : ""}
44
79
 
45
80
  Hints for classification:
46
81
  ${hints.length ? "- " + hints.join("\n- ") : "None"}
47
82
  `.trim();
48
83
  let llmScope = null;
84
+ let callId;
49
85
  let fallbackApplied = false;
50
86
  let normalizationApplied = false;
51
87
  try {
52
88
  const genInput = { query, content: prompt };
53
- const genOutput = await generate(genInput);
89
+ const genOutput = await generate(genInput, {
90
+ caller: "scopeClassificationStep",
91
+ inputContext: {
92
+ query,
93
+ resumedContextCapsule,
94
+ explicitTargetFiles,
95
+ orderedQuestions,
96
+ hints,
97
+ },
98
+ });
99
+ callId = genOutput.trace?.callId;
54
100
  const raw = typeof genOutput.data === "string"
55
101
  ? genOutput.data
56
102
  : JSON.stringify(genOutput.data ?? "{}");
@@ -74,8 +120,24 @@ ${hints.length ? "- " + hints.join("\n- ") : "None"}
74
120
  llmScope = "repo-wide";
75
121
  fallbackApplied = true;
76
122
  }
123
+ const explicitFilenameMatches = query.match(/\b[\w-]+\.(ts|js|tsx|jsx|py|java|go|rs|cpp|c|cs)\b/gi) ?? [];
124
+ const explicitFileCount = new Set([
125
+ ...explicitTargetFiles.map(file => file.toLowerCase()),
126
+ ...explicitFilenameMatches.map(file => file.toLowerCase()),
127
+ ]).size;
128
+ if (explicitFileCount >= 2 && llmScope === "single-file") {
129
+ llmScope = "multi-file";
130
+ normalizationApplied = true;
131
+ }
132
+ if (orderedQuestions.length > 1 && llmScope === "single-file") {
133
+ llmScope = orderedQuestions.some((question) => /\b(codebase|repo|repository|whole repo|entire repo|system)\b/i.test(question.text))
134
+ ? "repo-wide"
135
+ : "multi-file";
136
+ normalizationApplied = true;
137
+ }
77
138
  context.analysis.scopeType = llmScope;
78
139
  logInputOutput("scopeClassificationStep", "output", {
140
+ callId,
79
141
  llmScope,
80
142
  fallbackScope: "repo-wide",
81
143
  finalScope: llmScope,
@@ -90,3 +152,4 @@ ${hints.length ? "- " + hints.join("\n- ") : "None"}
90
152
  return { scopeType: llmScope };
91
153
  },
92
154
  };
155
+ //# sourceMappingURL=scopeClassificationStep.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scopeClassificationStep.js","sourceRoot":"","sources":["../../src/agents/scopeClassificationStep.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Classifies query scope with a small prompt so early routing is cheap and stable.\n *\n * Why this file exists:\n * - scope is one of the first routing signals, so noise here spreads through the run\n * - continuity follow-ups need only a tiny reminder, not the whole resumed state\n * - explicit target hints should help classification without repeating the user query\n */\nimport type { StructuredContext, ScopeType } from \"../types.js\";\nimport { generate } from \"../lib/generate.js\";\nimport { cleanupModule } from \"../pipeline/modules/cleanupModule.js\";\nimport { logInputOutput } from \"../utils/promptLogHelper.js\";\nimport { buildResumePacket, renderResumePacket } from \"../utils/resumeState.js\";\n\nfunction reduceScopeClassificationCapsule(value: string): string {\n if (!value.trim()) return \"\";\n const lines = value\n .split(\"\\n\")\n .map(line => line.trim())\n .filter(Boolean);\n const keepPrefixes = [\n \"Original task:\",\n \"Current task status:\",\n \"- Normalized intent:\",\n \"- Selected files:\",\n \"New user query:\",\n ];\n const reduced = lines.filter(line => keepPrefixes.some(prefix => line.startsWith(prefix)));\n return (reduced.length > 0 ? reduced : lines.slice(0, 5)).join(\"\\n\");\n}\n\nexport const scopeClassificationStep = {\n run: async (context: StructuredContext) => {\n const query = context.initContext?.userQuery?.trim() ?? \"\";\n const resumedContextCapsule = reduceScopeClassificationCapsule(\n (renderResumePacket(buildResumePacket(context.analysis?.resumeState)) ||\n context.initContext?.resumedContextCapsule?.trim() ||\n \"\")\n );\n const explicitTargetFiles = context.analysis?.intent?.targetFiles ?? [];\n const orderedQuestions = context.analysis?.intent?.questions ?? [];\n\n context.analysis ??= {};\n\n // ------------------------------------------------------------\n // 1️⃣ Prepare deterministic hints for the LLM\n // ------------------------------------------------------------\n const lower = query.toLowerCase();\n\n const hints: string[] = [];\n\n // Systemic/repo-wide hints\n if (/\\b(codebase|entire repo|whole repo|entire project|whole project|application|system)\\b/i.test(lower)) {\n hints.push(\"The query mentions the entire codebase or system; likely repo-wide scope.\");\n }\n\n // Debugging or error hints\n if (/\\b(debug|issue|bug|memory leak|performance|error|crash|failure)\\b/i.test(lower)) {\n hints.push(\"The query mentions debugging, errors, or memory/performance issues; consider broad impact.\");\n }\n\n // Explicit artifact references\n if (/\\b[\\w-]+\\.(ts|js|tsx|jsx|py|java|go|rs|cpp|c|cs)\\b/i.test(lower) ||\n /\\b(class|function|method|module)\\s+\\w+/i.test(lower)) {\n hints.push(\"The query references a specific file, class, function, or module; possibly single-file scope.\");\n }\n\n if (orderedQuestions.length > 1) {\n hints.push(`The query contains ${orderedQuestions.length} ordered question parts; do not collapse it to a narrow single-file scope unless all parts point to one file.`);\n }\n\n // ------------------------------------------------------------\n // 2️⃣ LLM classification\n // ------------------------------------------------------------\n const explicitTargetHints = explicitTargetFiles.length > 0\n ? `Explicit targets:\\n- ${explicitTargetFiles.join(\"\\n- \")}\\n`\n : \"\";\n const prompt = `\nYou classify the scope of a user's request in a software repository.\n\nReturn STRICT JSON:\n{\n \"scopeType\": \"single-file\" | \"multi-file\" | \"repo-wide\"\n}\n\nDefinitions:\n- \"single-file\": clearly limited to one specific file or artifact.\n- \"multi-file\": involves several related files/modules.\n- \"repo-wide\": broad/systemic across the repository.\n\nCurrent query:\n${query}\n\n${explicitTargetHints}\n\n${orderedQuestions.length > 1 ? `Ordered question parts:\\n${orderedQuestions.map((question, index) => `${index + 1}. ${question.text}`).join(\"\\n\")}\\n` : \"\"}\n\n${resumedContextCapsule ? `Resumed context capsule:\\n${resumedContextCapsule}\\n` : \"\"}\n\nHints for classification:\n${hints.length ? \"- \" + hints.join(\"\\n- \") : \"None\"}\n `.trim();\n\n let llmScope: ScopeType | null = null;\n let callId: string | undefined;\n let fallbackApplied = false;\n let normalizationApplied = false;\n\n try {\n const genInput = { query, content: prompt };\n const genOutput = await generate(genInput, {\n caller: \"scopeClassificationStep\",\n inputContext: {\n query,\n resumedContextCapsule,\n explicitTargetFiles,\n orderedQuestions,\n hints,\n },\n });\n callId = genOutput.trace?.callId;\n\n const raw =\n typeof genOutput.data === \"string\"\n ? genOutput.data\n : JSON.stringify(genOutput.data ?? \"{}\");\n\n const cleaned = await cleanupModule.run({ query, content: raw });\n\n const jsonString =\n typeof cleaned.content === \"string\"\n ? cleaned.content\n : JSON.stringify(cleaned.content ?? \"{}\");\n\n const parsed = JSON.parse(jsonString);\n\n if (\n parsed &&\n [\"none\", \"single-file\", \"multi-file\", \"repo-wide\"].includes(parsed.scopeType)\n ) {\n llmScope = parsed.scopeType as ScopeType;\n }\n } catch (err) {\n console.warn(\"⚠️ LLM scope classification failed, falling back:\", err);\n }\n\n // ------------------------------------------------------------\n // 3️⃣ Safe fallback if LLM fails\n // ------------------------------------------------------------\n if (!llmScope) {\n llmScope = \"repo-wide\";\n fallbackApplied = true;\n }\n\n const explicitFilenameMatches = query.match(/\\b[\\w-]+\\.(ts|js|tsx|jsx|py|java|go|rs|cpp|c|cs)\\b/gi) ?? [];\n const explicitFileCount = new Set([\n ...explicitTargetFiles.map(file => file.toLowerCase()),\n ...explicitFilenameMatches.map(file => file.toLowerCase()),\n ]).size;\n\n if (explicitFileCount >= 2 && llmScope === \"single-file\") {\n llmScope = \"multi-file\";\n normalizationApplied = true;\n }\n\n if (orderedQuestions.length > 1 && llmScope === \"single-file\") {\n llmScope = orderedQuestions.some((question) => /\\b(codebase|repo|repository|whole repo|entire repo|system)\\b/i.test(question.text))\n ? \"repo-wide\"\n : \"multi-file\";\n normalizationApplied = true;\n }\n\n context.analysis.scopeType = llmScope;\n\n logInputOutput(\"scopeClassificationStep\", \"output\", {\n callId,\n llmScope,\n fallbackScope: \"repo-wide\",\n finalScope: llmScope,\n fallbackApplied,\n normalizationApplied,\n reasoning: fallbackApplied\n ? \"fallback-default\"\n : normalizationApplied\n ? \"normalized-none-to-repo-wide\"\n : \"llm\",\n });\n\n return { scopeType: llmScope };\n },\n};\n"]}