scai 0.1.178 → 1.0.0

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 +162 -267
  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
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Shared helpers for loop-level search actions.
3
+ *
4
+ * Why this file exists:
5
+ * - search execution should stay in `SearchOrchestrator`
6
+ * - loop modules still need one place for history, summaries, and related-file persistence
7
+ * - directory listing must not reuse file-candidate persistence by accident
8
+ */
9
+ import { getDbForRepo } from "../../db/client.js";
10
+ import { mapCanonicalPathToExecutionPath, mapExecutionPathToCanonicalPath, } from "../../utils/repoIdentity.js";
11
+ export async function fetchSummariesForPaths(paths) {
12
+ if (paths.length === 0)
13
+ return {};
14
+ const db = getDbForRepo();
15
+ const canonicalPaths = paths.map(filePath => mapExecutionPathToCanonicalPath(filePath));
16
+ const placeholders = canonicalPaths.map(() => "?").join(", ");
17
+ const rows = db.prepare(`SELECT path, summary FROM summaries
18
+ WHERE path IN (${placeholders}) AND summary IS NOT NULL;`).all(...canonicalPaths);
19
+ const map = {};
20
+ for (const row of rows) {
21
+ map[mapCanonicalPathToExecutionPath(row.path)] = row.summary;
22
+ }
23
+ return map;
24
+ }
25
+ export async function enrichMissingSummaries(results, context) {
26
+ const missingPaths = results.filter(result => !result.summary).map(result => result.path);
27
+ if (missingPaths.length === 0)
28
+ return results;
29
+ const summaryMap = await fetchSummariesForPaths(missingPaths);
30
+ return results.map(result => {
31
+ const executionPath = mapCanonicalPathToExecutionPath(result.path, context);
32
+ return result.summary || !summaryMap[executionPath]
33
+ ? result
34
+ : { ...result, summary: summaryMap[executionPath] };
35
+ });
36
+ }
37
+ export function persistDiscoveredFiles(context, results) {
38
+ context.initContext ?? (context.initContext = { userQuery: "" });
39
+ const existing = new Set(context.initContext.relatedFiles ?? []);
40
+ const discovered = results.map(result => mapCanonicalPathToExecutionPath(result.path, context));
41
+ context.initContext.relatedFiles = [
42
+ ...(context.initContext.relatedFiles ?? []),
43
+ ...discovered.filter(filePath => !existing.has(filePath)),
44
+ ];
45
+ }
46
+ export function recordSearchAttempt(args) {
47
+ var _a;
48
+ const { context, actionId, query, search, failureClass } = args;
49
+ context.analysis || (context.analysis = {});
50
+ (_a = context.analysis).searchAttempts || (_a.searchAttempts = []);
51
+ context.analysis.searchAttempts.push({
52
+ actionId,
53
+ searchType: actionId,
54
+ query,
55
+ regexSpec: search.regexSpec,
56
+ scope: search.regexSpec?.scope,
57
+ resultCount: search.fileCandidates.length + search.directoryEntries.length,
58
+ failureClass: failureClass ?? search.failure?.failureClass,
59
+ recordedAt: new Date().toISOString(),
60
+ });
61
+ }
62
+ export function buildInvalidRegexOutput(input, search) {
63
+ return {
64
+ query: input.query,
65
+ data: {
66
+ files: [],
67
+ failure: search.failure,
68
+ },
69
+ };
70
+ }
71
+ //# sourceMappingURL=searchModuleShared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"searchModuleShared.js","sourceRoot":"","sources":["../../../src/pipeline/modules/searchModuleShared.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Shared helpers for loop-level search actions.\n *\n * Why this file exists:\n * - search execution should stay in `SearchOrchestrator`\n * - loop modules still need one place for history, summaries, and related-file persistence\n * - directory listing must not reuse file-candidate persistence by accident\n */\nimport { getDbForRepo } from \"../../db/client.js\";\nimport {\n mapCanonicalPathToExecutionPath,\n mapExecutionPathToCanonicalPath,\n} from \"../../utils/repoIdentity.js\";\nimport type {\n ModuleIO,\n SearchAttemptRecord,\n SearchFailureClass,\n SearchOrchestratorResult,\n SearchResult,\n StructuredContext,\n} from \"../../types.js\";\n\nexport async function fetchSummariesForPaths(paths: string[]): Promise<Record<string, string>> {\n if (paths.length === 0) return {};\n\n const db = getDbForRepo();\n const canonicalPaths = paths.map(filePath => mapExecutionPathToCanonicalPath(filePath));\n const placeholders = canonicalPaths.map(() => \"?\").join(\", \");\n const rows = db.prepare(\n `SELECT path, summary FROM summaries\n WHERE path IN (${placeholders}) AND summary IS NOT NULL;`\n ).all(...canonicalPaths) as { path: string; summary: string }[];\n\n const map: Record<string, string> = {};\n for (const row of rows) {\n map[mapCanonicalPathToExecutionPath(row.path)] = row.summary;\n }\n return map;\n}\n\nexport async function enrichMissingSummaries(\n results: SearchResult[],\n context: StructuredContext\n): Promise<SearchResult[]> {\n const missingPaths = results.filter(result => !result.summary).map(result => result.path);\n if (missingPaths.length === 0) return results;\n\n const summaryMap = await fetchSummariesForPaths(missingPaths);\n return results.map(result => {\n const executionPath = mapCanonicalPathToExecutionPath(result.path, context);\n return result.summary || !summaryMap[executionPath]\n ? result\n : { ...result, summary: summaryMap[executionPath] };\n });\n}\n\nexport function persistDiscoveredFiles(context: StructuredContext, results: SearchResult[]): void {\n context.initContext ??= { userQuery: \"\" };\n const existing = new Set(context.initContext.relatedFiles ?? []);\n const discovered = results.map(result => mapCanonicalPathToExecutionPath(result.path, context));\n context.initContext.relatedFiles = [\n ...(context.initContext.relatedFiles ?? []),\n ...discovered.filter(filePath => !existing.has(filePath)),\n ];\n}\n\nexport function recordSearchAttempt(args: {\n context: StructuredContext;\n actionId: SearchAttemptRecord[\"actionId\"];\n query?: string;\n search: SearchOrchestratorResult;\n failureClass?: SearchFailureClass;\n}): void {\n const { context, actionId, query, search, failureClass } = args;\n context.analysis ||= {};\n context.analysis.searchAttempts ||= [];\n context.analysis.searchAttempts.push({\n actionId,\n searchType: actionId as SearchAttemptRecord[\"searchType\"],\n query,\n regexSpec: search.regexSpec,\n scope: search.regexSpec?.scope,\n resultCount: search.fileCandidates.length + search.directoryEntries.length,\n failureClass: failureClass ?? search.failure?.failureClass,\n recordedAt: new Date().toISOString(),\n });\n}\n\nexport function buildInvalidRegexOutput(input: ModuleIO, search: SearchOrchestratorResult): ModuleIO {\n return {\n query: input.query,\n data: {\n files: [],\n failure: search.failure,\n },\n };\n}\n"]}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Runs model-authored regex search through the shared search executor.
3
+ *
4
+ * Why this file exists:
5
+ * - regex search is a real loop action now, not a hidden fallback
6
+ * - the model provides a typed regex spec
7
+ * - runtime validation and execution still stay deterministic
8
+ */
9
+ import { logInputOutput } from "../../utils/promptLogHelper.js";
10
+ import { SearchOrchestrator } from "../../search/SearchOrchestrator.js";
11
+ import { deriveFocusFromSearchResult } from "../../agents/deriveFocusFromSearchStep.js";
12
+ import { buildInvalidRegexOutput, enrichMissingSummaries, persistDiscoveredFiles, recordSearchAttempt, } from "./searchModuleShared.js";
13
+ export const searchRegexModule = {
14
+ name: "search-regex",
15
+ description: "Runs a validated regex against file paths, file contents, or both.",
16
+ groups: ["analysis"],
17
+ run: async (input) => {
18
+ const ctx = input.context;
19
+ if (!ctx) {
20
+ throw new Error("[search-regex] StructuredContext is required.");
21
+ }
22
+ const spec = (input.data ?? {});
23
+ const orchestrator = new SearchOrchestrator();
24
+ const search = await orchestrator.runRegexSearch({
25
+ context: ctx,
26
+ spec,
27
+ limit: 5,
28
+ });
29
+ recordSearchAttempt({
30
+ context: ctx,
31
+ actionId: "search-regex",
32
+ query: input.query,
33
+ search,
34
+ });
35
+ if (search.failure?.failureClass === "invalid-regex" || search.failure?.failureClass === "scope-missing") {
36
+ const output = buildInvalidRegexOutput(input, search);
37
+ logInputOutput("search-regex", "output", output);
38
+ return output;
39
+ }
40
+ deriveFocusFromSearchResult(ctx, search, {
41
+ appendCandidates: true,
42
+ promoteOperatorMatchesToCandidates: true,
43
+ });
44
+ const files = await enrichMissingSummaries(search.fileCandidates, ctx);
45
+ persistDiscoveredFiles(ctx, files);
46
+ const output = {
47
+ query: input.query,
48
+ data: {
49
+ files,
50
+ regexSpec: search.regexSpec,
51
+ matches: search.patternMatches,
52
+ failure: search.failure,
53
+ },
54
+ };
55
+ logInputOutput("search-regex", "output", output);
56
+ return output;
57
+ },
58
+ };
59
+ //# sourceMappingURL=searchRegexModule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"searchRegexModule.js","sourceRoot":"","sources":["../../../src/pipeline/modules/searchRegexModule.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,EAAE,2BAA2B,EAAE,MAAM,2CAA2C,CAAC;AAExF,OAAO,EACL,uBAAuB,EACvB,sBAAsB,EACtB,sBAAsB,EACtB,mBAAmB,GACpB,MAAM,yBAAyB,CAAC;AAEjC,MAAM,CAAC,MAAM,iBAAiB,GAAW;IACvC,IAAI,EAAE,cAAc;IACpB,WAAW,EAAE,oEAAoE;IACjF,MAAM,EAAE,CAAC,UAAU,CAAC;IAEpB,GAAG,EAAE,KAAK,EAAE,KAAe,EAAqB,EAAE;QAChD,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC;QAC1B,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACnE,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAoB,CAAC;QACnD,MAAM,YAAY,GAAG,IAAI,kBAAkB,EAAE,CAAC;QAC9C,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,cAAc,CAAC;YAC/C,OAAO,EAAE,GAAG;YACZ,IAAI;YACJ,KAAK,EAAE,CAAC;SACT,CAAC,CAAC;QAEH,mBAAmB,CAAC;YAClB,OAAO,EAAE,GAAG;YACZ,QAAQ,EAAE,cAAc;YACxB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,MAAM;SACP,CAAC,CAAC;QAEH,IAAI,MAAM,CAAC,OAAO,EAAE,YAAY,KAAK,eAAe,IAAI,MAAM,CAAC,OAAO,EAAE,YAAY,KAAK,eAAe,EAAE,CAAC;YACzG,MAAM,MAAM,GAAG,uBAAuB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YACtD,cAAc,CAAC,cAAc,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;YACjD,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,2BAA2B,CAAC,GAAG,EAAE,MAAM,EAAE;YACvC,gBAAgB,EAAE,IAAI;YACtB,kCAAkC,EAAE,IAAI;SACzC,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG,MAAM,sBAAsB,CAAC,MAAM,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;QACvE,sBAAsB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAEnC,MAAM,MAAM,GAAa;YACvB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,IAAI,EAAE;gBACJ,KAAK;gBACL,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,OAAO,EAAE,MAAM,CAAC,cAAc;gBAC9B,OAAO,EAAE,MAAM,CAAC,OAAO;aACxB;SACF,CAAC;QACF,cAAc,CAAC,cAAc,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;QACjD,OAAO,MAAM,CAAC;IAChB,CAAC;CACF,CAAC","sourcesContent":["/**\n * Runs model-authored regex search through the shared search executor.\n *\n * Why this file exists:\n * - regex search is a real loop action now, not a hidden fallback\n * - the model provides a typed regex spec\n * - runtime validation and execution still stay deterministic\n */\nimport { logInputOutput } from \"../../utils/promptLogHelper.js\";\nimport { SearchOrchestrator } from \"../../search/SearchOrchestrator.js\";\nimport { deriveFocusFromSearchResult } from \"../../agents/deriveFocusFromSearchStep.js\";\nimport type { Module, ModuleIO, RegexSearchSpec } from \"../../types.js\";\nimport {\n buildInvalidRegexOutput,\n enrichMissingSummaries,\n persistDiscoveredFiles,\n recordSearchAttempt,\n} from \"./searchModuleShared.js\";\n\nexport const searchRegexModule: Module = {\n name: \"search-regex\",\n description: \"Runs a validated regex against file paths, file contents, or both.\",\n groups: [\"analysis\"],\n\n run: async (input: ModuleIO): Promise<ModuleIO> => {\n const ctx = input.context;\n if (!ctx) {\n throw new Error(\"[search-regex] StructuredContext is required.\");\n }\n\n const spec = (input.data ?? {}) as RegexSearchSpec;\n const orchestrator = new SearchOrchestrator();\n const search = await orchestrator.runRegexSearch({\n context: ctx,\n spec,\n limit: 5,\n });\n\n recordSearchAttempt({\n context: ctx,\n actionId: \"search-regex\",\n query: input.query,\n search,\n });\n\n if (search.failure?.failureClass === \"invalid-regex\" || search.failure?.failureClass === \"scope-missing\") {\n const output = buildInvalidRegexOutput(input, search);\n logInputOutput(\"search-regex\", \"output\", output);\n return output;\n }\n\n deriveFocusFromSearchResult(ctx, search, {\n appendCandidates: true,\n promoteOperatorMatchesToCandidates: true,\n });\n\n const files = await enrichMissingSummaries(search.fileCandidates, ctx);\n persistDiscoveredFiles(ctx, files);\n\n const output: ModuleIO = {\n query: input.query,\n data: {\n files,\n regexSpec: search.regexSpec,\n matches: search.patternMatches,\n failure: search.failure,\n },\n };\n logInputOutput(\"search-regex\", \"output\", output);\n return output;\n },\n};\n"]}
@@ -1,7 +1,11 @@
1
1
  import { logInputOutput } from "../../utils/promptLogHelper.js";
2
2
  import { cleanupModule } from "./cleanupModule.js";
3
3
  import { generate } from "../../lib/generate.js";
4
+ import { isMethodSelectionRetrievalQuery } from "../../agents/mainAgentHeuristics.js";
5
+ import { computeContentFingerprint, computeQueryFingerprint, hasFreshSemanticAnalysis, } from "../../utils/fileEvidenceCache.js";
4
6
  const MAX_CODE_CHARS = 6000; // conservative prompt-safe limit
7
+ const MIN_EXACT_VERIFY_CONFIDENCE = 0.85;
8
+ const MAX_CONTEXT_LINE_CHARS = 220;
5
9
  export const semanticAnalysisModule = {
6
10
  name: "semanticAnalysis",
7
11
  description: "Performs semantic analysis for a single target file defined by the current execution step.",
@@ -36,6 +40,22 @@ export const semanticAnalysisModule = {
36
40
  (_a = context.analysis).fileAnalysis || (_a.fileAnalysis = {});
37
41
  const filePath = file.path;
38
42
  const prevAnalysis = context.analysis.fileAnalysis[filePath];
43
+ if (hasFreshSemanticAnalysis({
44
+ analysis: prevAnalysis,
45
+ file,
46
+ query: input.query,
47
+ })) {
48
+ logInputOutput("semanticAnalysisStep - per-file", "output", {
49
+ file: filePath,
50
+ reusedFromCache: true,
51
+ analysis: prevAnalysis,
52
+ });
53
+ return {
54
+ query: input.query,
55
+ data: { notes: "Semantic analysis reused cached result" },
56
+ context,
57
+ };
58
+ }
39
59
  // -----------------------------
40
60
  // Semantic analysis (LLM)
41
61
  // -----------------------------
@@ -47,6 +67,8 @@ export const semanticAnalysisModule = {
47
67
  ...prevAnalysis,
48
68
  ...semanticResult,
49
69
  semanticAnalyzed: true,
70
+ contentFingerprint: computeContentFingerprint(file.code),
71
+ queryFingerprint: computeQueryFingerprint(input.query),
50
72
  };
51
73
  logInputOutput("semanticAnalysisStep - per-file", "output", {
52
74
  file: filePath,
@@ -59,33 +81,69 @@ export const semanticAnalysisModule = {
59
81
  };
60
82
  },
61
83
  };
84
+ /**
85
+ * Builds a short, high-signal context block for semantic prompts.
86
+ *
87
+ * Examples:
88
+ * - long rationale -> trimmed to one line
89
+ * - many assumptions -> keep the first few concrete items
90
+ * - no useful context -> "[none]"
91
+ */
92
+ function buildSemanticContextSnippet(rationale, understanding) {
93
+ const lines = [
94
+ formatSemanticContextLine("Rationale", rationale),
95
+ formatSemanticList("Assumptions", understanding?.assumptions),
96
+ formatSemanticList("Constraints", understanding?.constraints),
97
+ formatSemanticList("Known risks", understanding?.risks),
98
+ ].filter(Boolean);
99
+ return lines.length > 0 ? lines.join("\n") : "[none]";
100
+ }
101
+ /**
102
+ * Formats one short context line and trims noisy whitespace.
103
+ * Example: "a long\nreason" -> "a long reason".
104
+ */
105
+ function formatSemanticContextLine(label, value) {
106
+ const compact = String(value ?? "").replace(/\s+/g, " ").trim();
107
+ if (!compact)
108
+ return "";
109
+ const trimmed = compact.length > MAX_CONTEXT_LINE_CHARS
110
+ ? `${compact.slice(0, MAX_CONTEXT_LINE_CHARS - 1).trimEnd()}...`
111
+ : compact;
112
+ return `${label}: ${trimmed}`;
113
+ }
114
+ /**
115
+ * Formats a small list section for semantic prompts.
116
+ * Example: ["a", "b", "c", "d"] -> "Assumptions: a; b; c".
117
+ */
118
+ function formatSemanticList(label, values) {
119
+ const compactValues = (values ?? [])
120
+ .map((value) => String(value ?? "").replace(/\s+/g, " ").trim())
121
+ .filter(Boolean)
122
+ .slice(0, 3);
123
+ if (compactValues.length === 0)
124
+ return "";
125
+ return `${label}: ${compactValues.join("; ")}`;
126
+ }
62
127
  /* -------------------------
63
128
  Analyze single file
64
129
  ---------------------------- */
65
- async function analyzeFile(file, query, context) {
130
+ async function analyzeFile(file, taskQuery, context) {
131
+ const deterministicFallback = buildDeterministicSemanticFallback(file, taskQuery, context);
132
+ if (shouldUseDeterministicSemanticFallback(taskQuery, context, file.path, deterministicFallback)) {
133
+ return deterministicFallback;
134
+ }
66
135
  const slicedCode = sliceCodeForAnalysis(file.code);
67
136
  const focus = context?.analysis?.focus;
68
137
  const understanding = context?.analysis?.understanding;
69
- const contextSnippet = [
70
- focus?.rationale ? `Rationale: ${focus.rationale}` : "",
71
- understanding?.assumptions
72
- ? `Assumptions: ${understanding.assumptions.join("; ")}`
73
- : "",
74
- understanding?.constraints
75
- ? `Constraints: ${understanding.constraints.join("; ")}`
76
- : "",
77
- understanding?.risks ? `Known risks: ${understanding.risks.join("; ")}` : "",
78
- ]
79
- .filter(Boolean)
80
- .join("\n");
138
+ const contextSnippet = buildSemanticContextSnippet(focus?.rationale, understanding);
81
139
  const prompt = `
82
140
  You are performing semantic analysis on a file that has already been determined
83
- to be relevant to the user query.
141
+ to be relevant to the current task.
84
142
 
85
- User query:
86
- "${query}"
143
+ Task query:
144
+ "${taskQuery}"
87
145
 
88
- Context from previous steps:
146
+ Relevant prior context:
89
147
  ${contextSnippet}
90
148
 
91
149
  File path: ${file.path}
@@ -125,8 +183,17 @@ Return STRICT JSON:
125
183
  }
126
184
  `.trim();
127
185
  try {
128
- const ai = await generate({ query: file.path, content: prompt });
129
- const cleaned = await cleanupModule.run({ query, content: ai.data });
186
+ const ai = await generate({ query: "", content: prompt }, {
187
+ caller: "semanticAnalysisModule",
188
+ inputContext: {
189
+ query: taskQuery,
190
+ filePath: file.path,
191
+ slicedCode,
192
+ focus,
193
+ understanding,
194
+ },
195
+ });
196
+ const cleaned = await cleanupModule.run({ query: taskQuery, content: ai.data });
130
197
  let data;
131
198
  if (typeof cleaned.data === "object" && cleaned.data) {
132
199
  data = cleaned.data;
@@ -146,7 +213,7 @@ Return STRICT JSON:
146
213
  role: ["primary", "supporting", "contextual"].includes(data.role)
147
214
  ? data.role
148
215
  : undefined,
149
- proposedChanges: data.proposedChanges
216
+ proposedChanges: data.proposedChanges && typeof data.proposedChanges === "object"
150
217
  ? {
151
218
  summary: String(data.proposedChanges.summary ?? ""),
152
219
  scope: data.proposedChanges.scope ?? "none",
@@ -157,10 +224,7 @@ Return STRICT JSON:
157
224
  ? data.proposedChanges.rationale
158
225
  : undefined,
159
226
  }
160
- : {
161
- summary: "No changes required for this file.",
162
- scope: "none",
163
- },
227
+ : undefined,
164
228
  excerpts: Array.isArray(data.excerpts)
165
229
  ? data.excerpts
166
230
  .filter((e) => typeof e?.code === "string" && e.code.trim())
@@ -190,14 +254,16 @@ Return STRICT JSON:
190
254
  codeLength: e.code.length,
191
255
  })) ?? [],
192
256
  });
257
+ logInputOutput("semanticAnalysisStep - model", "output", {
258
+ callId: ai.trace?.callId,
259
+ filePath: file.path,
260
+ parsedRole: result.role,
261
+ });
193
262
  return result;
194
263
  }
195
264
  catch (err) {
196
265
  console.warn(`[semanticAnalysisStep] Failed to analyze file ${file.path}:`, err);
197
- return {
198
- relevanceExplanation: "This file could not be analyzed due to an error.",
199
- risks: [],
200
- };
266
+ return deterministicFallback;
201
267
  }
202
268
  }
203
269
  /* -------------------------
@@ -212,3 +278,94 @@ function sliceCodeForAnalysis(code) {
212
278
  const tail = code.slice(-Math.floor(MAX_CODE_CHARS * 0.4));
213
279
  return [head, "\n/* … file truncated for semantic analysis … */\n", tail].join("");
214
280
  }
281
+ function shouldUseDeterministicSemanticFallback(query, context, filePath, fallback) {
282
+ const isAnalyzeOnly = context?.executionControl?.constraints?.allowFileWrites === false;
283
+ const exactSymbol = getStrongExactVerifySymbol(context, filePath);
284
+ return isAnalyzeOnly && isMethodSelectionRetrievalQuery(query) && !!exactSymbol && !!fallback.proposedChanges?.targets?.length;
285
+ }
286
+ function buildDeterministicSemanticFallback(file, query, context) {
287
+ const exactSymbol = getStrongExactVerifySymbol(context, file.path);
288
+ const verifyRationale = context?.analysis?.verify?.byFile?.[file.path]?.rationale ??
289
+ "Verify evidence identified this file as the strongest answer source.";
290
+ const excerpt = exactSymbol
291
+ ? extractDeclarationExcerpt(file.code, exactSymbol.evidence)
292
+ : sliceCodeForAnalysis(file.code);
293
+ const declarationTarget = exactSymbol
294
+ ? extractDeclarationTarget(file.code, exactSymbol.evidence)
295
+ : undefined;
296
+ if (exactSymbol) {
297
+ return {
298
+ intent: "relevant",
299
+ role: "primary",
300
+ relevanceExplanation: `Exact verify evidence already identifies ${exactSymbol.name} in this file as the deciding method for the query. ${verifyRationale}`,
301
+ proposedChanges: {
302
+ summary: `${exactSymbol.name} is the exact verified method that answers this query.`,
303
+ scope: "minor",
304
+ targets: declarationTarget ? [declarationTarget] : [exactSymbol.name],
305
+ rationale: "Deterministic semantic fallback from exact verify evidence.",
306
+ },
307
+ excerpts: excerpt
308
+ ? [
309
+ {
310
+ description: `Exact verify-backed declaration for ${exactSymbol.name}.`,
311
+ startLine: exactSymbol.evidence.span?.startLine,
312
+ endLine: exactSymbol.evidence.span?.endLine,
313
+ symbols: [exactSymbol.name],
314
+ code: excerpt,
315
+ },
316
+ ]
317
+ : undefined,
318
+ risks: [],
319
+ };
320
+ }
321
+ return {
322
+ intent: "relevant",
323
+ role: "primary",
324
+ relevanceExplanation: `Semantic generation was unavailable, so this file is being carried forward with bounded deterministic analysis. ${verifyRationale}`,
325
+ proposedChanges: {
326
+ summary: "Deterministic semantic fallback preserved this file as a grounded analysis source.",
327
+ scope: "minor",
328
+ targets: [`FILE: ${file.path}`],
329
+ rationale: "Fallback used because semantic generation failed or was intentionally skipped.",
330
+ },
331
+ excerpts: excerpt
332
+ ? [
333
+ {
334
+ description: "Bounded fallback code excerpt.",
335
+ code: excerpt,
336
+ },
337
+ ]
338
+ : undefined,
339
+ risks: [],
340
+ };
341
+ }
342
+ function getStrongExactVerifySymbol(context, filePath) {
343
+ const evidence = context?.analysis?.verify?.byFile?.[filePath]?.evidence ?? [];
344
+ const ranked = evidence
345
+ .filter(item => (item.type === "symbol" || item.type === "structural") &&
346
+ typeof item.excerpt === "string" &&
347
+ item.excerpt.trim().length > 0 &&
348
+ (item.confidence ?? 0) >= MIN_EXACT_VERIFY_CONFIDENCE)
349
+ .sort((a, b) => (b.confidence ?? 0) - (a.confidence ?? 0));
350
+ const winner = ranked[0];
351
+ if (!winner?.excerpt)
352
+ return undefined;
353
+ return { name: winner.excerpt.trim(), evidence: winner };
354
+ }
355
+ function extractDeclarationExcerpt(code, evidence) {
356
+ if (!code)
357
+ return undefined;
358
+ const lines = code.split("\n");
359
+ const start = Math.max(0, (evidence.span?.startLine ?? 1) - 1);
360
+ const end = Math.min(lines.length, evidence.span?.endLine ?? start + 1);
361
+ const snippet = lines.slice(start, Math.max(start + 1, end)).join("\n").trim();
362
+ return snippet || sliceCodeForAnalysis(code);
363
+ }
364
+ function extractDeclarationTarget(code, evidence) {
365
+ if (!code)
366
+ return evidence.excerpt?.trim();
367
+ const lines = code.split("\n");
368
+ const line = lines[(evidence.span?.startLine ?? 1) - 1]?.trim();
369
+ return line || evidence.excerpt?.trim();
370
+ }
371
+ //# sourceMappingURL=semanticAnalysisModule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semanticAnalysisModule.js","sourceRoot":"","sources":["../../../src/pipeline/modules/semanticAnalysisModule.ts"],"names":[],"mappings":"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","sourcesContent":["// File: src/modules/semanticAnalysisStep.ts\n/**\n * Performs per-file semantic analysis, but falls back to deterministic analysis\n * when exact verify evidence already answers a narrow method-selection question.\n *\n * Why this file exists:\n * - keep normal semantic summaries for broad analysis flows\n * - avoid blocking analysis-only answers on a long LLM pass when verify already\n * surfaced the exact deciding symbol\n */\nimport {\n AnalysisState,\n ModuleIO,\n StructuredContext,\n StructuredFileCapsule,\n FileAnalysis,\n Module,\n FileEvidence,\n} from \"../../types.js\";\nimport { logInputOutput } from \"../../utils/promptLogHelper.js\";\nimport { cleanupModule } from \"./cleanupModule.js\";\nimport { generate } from \"../../lib/generate.js\";\nimport { isMethodSelectionRetrievalQuery } from \"../../agents/mainAgentHeuristics.js\";\nimport {\n computeContentFingerprint,\n computeQueryFingerprint,\n hasFreshSemanticAnalysis,\n} from \"../../utils/fileEvidenceCache.js\";\n\nconst MAX_CODE_CHARS = 6000; // conservative prompt-safe limit\nconst MIN_EXACT_VERIFY_CONFIDENCE = 0.85;\nconst MAX_CONTEXT_LINE_CHARS = 220;\n\nexport const semanticAnalysisModule: Module = {\n name: \"semanticAnalysis\",\n description: \"Performs semantic analysis for a single target file defined by the current execution step.\",\n groups: [\"analysis\"],\n\n run: async (input: ModuleIO): Promise<ModuleIO> => {\n const context = input.context as StructuredContext;\n if (!context) throw new Error(\"[semanticAnalysisStep] No context provided\");\n\n const step = context.currentStep;\n if (!step || step.action !== \"semanticAnalysis\") {\n const notes = \"[semanticAnalysisStep] Invoked without semanticAnalysis step\";\n logInputOutput(\"semanticAnalysisStep\", \"output\", { notes });\n return { query: input.query, data: { notes }, context };\n }\n\n if (!step.targetFile) {\n const notes = \"[semanticAnalysisStep] semanticAnalysis step missing targetFile\";\n logInputOutput(\"semanticAnalysisStep\", \"output\", { notes });\n return { query: input.query, data: { notes }, context };\n }\n\n const workingFiles: StructuredFileCapsule[] = context.workingFiles ?? [];\n const file = workingFiles.find(f => f.path === step.targetFile);\n\n if (!file) {\n const notes = `[semanticAnalysisStep] targetFile not found: ${step.targetFile}`;\n logInputOutput(\"semanticAnalysisStep\", \"output\", { notes });\n return { query: input.query, data: { notes }, context };\n }\n\n // -----------------------------\n // Ensure analysis containers\n // -----------------------------\n context.analysis ||= {};\n context.analysis.fileAnalysis ||= {};\n\n const filePath = file.path;\n const prevAnalysis = context.analysis.fileAnalysis[filePath];\n if (hasFreshSemanticAnalysis({\n analysis: prevAnalysis,\n file,\n query: input.query,\n })) {\n logInputOutput(\"semanticAnalysisStep - per-file\", \"output\", {\n file: filePath,\n reusedFromCache: true,\n analysis: prevAnalysis,\n });\n return {\n query: input.query,\n data: { notes: \"Semantic analysis reused cached result\" },\n context,\n };\n }\n\n // -----------------------------\n // Semantic analysis (LLM)\n // -----------------------------\n const semanticResult = await analyzeFile(file, input.query, context);\n\n // -----------------------------\n // Write-once merge to context\n // -----------------------------\n context.analysis.fileAnalysis[filePath] = {\n ...prevAnalysis,\n ...semanticResult,\n semanticAnalyzed: true,\n contentFingerprint: computeContentFingerprint(file.code),\n queryFingerprint: computeQueryFingerprint(input.query),\n };\n\n logInputOutput(\"semanticAnalysisStep - per-file\", \"output\", {\n file: filePath,\n analysis: context.analysis.fileAnalysis[filePath],\n });\n\n return {\n query: input.query,\n data: { notes: \"Semantic analysis completed\" },\n context,\n };\n },\n};\n\n/**\n * Builds a short, high-signal context block for semantic prompts.\n *\n * Examples:\n * - long rationale -> trimmed to one line\n * - many assumptions -> keep the first few concrete items\n * - no useful context -> \"[none]\"\n */\nfunction buildSemanticContextSnippet(\n rationale: string | undefined,\n understanding: AnalysisState[\"understanding\"] | undefined\n): string {\n const lines = [\n formatSemanticContextLine(\"Rationale\", rationale),\n formatSemanticList(\"Assumptions\", understanding?.assumptions),\n formatSemanticList(\"Constraints\", understanding?.constraints),\n formatSemanticList(\"Known risks\", understanding?.risks),\n ].filter(Boolean);\n\n return lines.length > 0 ? lines.join(\"\\n\") : \"[none]\";\n}\n\n/**\n * Formats one short context line and trims noisy whitespace.\n * Example: \"a long\\nreason\" -> \"a long reason\".\n */\nfunction formatSemanticContextLine(label: string, value: string | undefined): string {\n const compact = String(value ?? \"\").replace(/\\s+/g, \" \").trim();\n if (!compact) return \"\";\n const trimmed =\n compact.length > MAX_CONTEXT_LINE_CHARS\n ? `${compact.slice(0, MAX_CONTEXT_LINE_CHARS - 1).trimEnd()}...`\n : compact;\n return `${label}: ${trimmed}`;\n}\n\n/**\n * Formats a small list section for semantic prompts.\n * Example: [\"a\", \"b\", \"c\", \"d\"] -> \"Assumptions: a; b; c\".\n */\nfunction formatSemanticList(label: string, values: string[] | undefined): string {\n const compactValues = (values ?? [])\n .map((value) => String(value ?? \"\").replace(/\\s+/g, \" \").trim())\n .filter(Boolean)\n .slice(0, 3);\n if (compactValues.length === 0) return \"\";\n return `${label}: ${compactValues.join(\"; \")}`;\n}\n\n/* -------------------------\n Analyze single file\n---------------------------- */\nasync function analyzeFile(\n file: StructuredFileCapsule,\n taskQuery: string,\n context?: StructuredContext\n): Promise<FileAnalysis> {\n const deterministicFallback = buildDeterministicSemanticFallback(file, taskQuery, context);\n if (shouldUseDeterministicSemanticFallback(taskQuery, context, file.path, deterministicFallback)) {\n return deterministicFallback;\n }\n\n const slicedCode = sliceCodeForAnalysis(file.code);\n\n const focus = context?.analysis?.focus;\n const understanding = context?.analysis?.understanding;\n const contextSnippet = buildSemanticContextSnippet(focus?.rationale, understanding);\n\n const prompt = `\nYou are performing semantic analysis on a file that has already been determined\nto be relevant to the current task.\n\nTask query:\n\"${taskQuery}\"\n\nRelevant prior context:\n${contextSnippet}\n\nFile path: ${file.path}\n\nTask:\n- Explain *why* this file is relevant to the query in concrete, technical terms.\n- Assign a semantic role if applicable.\n- Identify risks, constraints, or noteworthy design considerations.\n\nAdditionally:\n- Extract the most relevant code excerpts that justify your analysis.\n- Prefer complete functions, configuration blocks, or object literals.\n- Do NOT summarize the code — include the actual code text.\n- Only include excerpts that directly support your analysis.\n\nCode excerpt:\n${slicedCode ?? \"[no code]\"}\n\nReturn STRICT JSON:\n{\n \"role\"?: \"primary\" | \"supporting\" | \"contextual\",\n \"relevanceExplanation\": string,\n \"proposedChanges\"?: {\n \"summary\": string,\n \"scope\": \"none\" | \"minor\" | \"moderate\" | \"major\",\n \"targets\"?: string[],\n \"rationale\"?: string\n },\n \"excerpts\"?: Array<{\n \"description\": string,\n \"startLine\"?: number,\n \"endLine\"?: number,\n \"symbols\"?: string[],\n \"code\": string\n }>,\n \"risks\"?: string[]\n}\n`.trim();\n\n try {\n const ai = await generate({ query: \"\", content: prompt }, {\n caller: \"semanticAnalysisModule\",\n inputContext: {\n query: taskQuery,\n filePath: file.path,\n slicedCode,\n focus,\n understanding,\n },\n });\n const cleaned = await cleanupModule.run({ query: taskQuery, content: ai.data });\n\n let data: any;\n if (typeof cleaned.data === \"object\" && cleaned.data) {\n data = cleaned.data;\n } else {\n try {\n data = JSON.parse(String(cleaned.content ?? \"{}\"));\n } catch {\n data = {};\n }\n }\n\n const result: FileAnalysis = {\n relevanceExplanation:\n typeof data.relevanceExplanation === \"string\" && data.relevanceExplanation.trim()\n ? data.relevanceExplanation\n : \"This file contributes to the query but did not provide a detailed explanation.\",\n role:\n [\"primary\", \"supporting\", \"contextual\"].includes(data.role)\n ? data.role\n : undefined,\n proposedChanges:\n data.proposedChanges && typeof data.proposedChanges === \"object\"\n ? {\n summary: String(data.proposedChanges.summary ?? \"\"),\n scope: data.proposedChanges.scope ?? \"none\",\n targets: Array.isArray(data.proposedChanges.targets)\n ? data.proposedChanges.targets\n : undefined,\n rationale:\n typeof data.proposedChanges.rationale === \"string\"\n ? data.proposedChanges.rationale\n : undefined,\n }\n : undefined,\n excerpts: Array.isArray(data.excerpts)\n ? data.excerpts\n .filter((e: { code: string }) => typeof e?.code === \"string\" && e.code.trim())\n .map((e: any) => ({\n description: String(e.description ?? \"Relevant code excerpt\"),\n startLine: typeof e.startLine === \"number\" ? e.startLine : undefined,\n endLine: typeof e.endLine === \"number\" ? e.endLine : undefined,\n symbols: Array.isArray(e.symbols) ? e.symbols : undefined,\n code: String(e.code),\n }))\n : undefined,\n risks: Array.isArray(data.risks) ? data.risks : [],\n };\n\n // 🔹 Log proposed changes (decision-level signal)\n logInputOutput(\"semanticAnalysisStep - proposedChanges\", \"output\", {\n file: file.path,\n proposedChanges: result.proposedChanges ?? null,\n });\n\n // 🔹 Log excerpts (grounding signal, compact)\n logInputOutput(\"semanticAnalysisStep - excerpts\", \"output\", {\n file: file.path,\n excerpts:\n result.excerpts?.map(e => ({\n description: e.description,\n startLine: e.startLine,\n endLine: e.endLine,\n symbols: e.symbols,\n codeLength: e.code.length,\n })) ?? [],\n });\n\n logInputOutput(\"semanticAnalysisStep - model\", \"output\", {\n callId: ai.trace?.callId,\n filePath: file.path,\n parsedRole: result.role,\n });\n\n return result;\n } catch (err) {\n console.warn(\n `[semanticAnalysisStep] Failed to analyze file ${file.path}:`,\n err\n );\n return deterministicFallback;\n }\n}\n\n/* -------------------------\n Slice large code for prompts\n---------------------------- */\nfunction sliceCodeForAnalysis(code?: string): string | undefined {\n if (!code) return undefined;\n if (code.length <= MAX_CODE_CHARS) return code;\n\n const head = code.slice(0, Math.floor(MAX_CODE_CHARS * 0.6));\n const tail = code.slice(-Math.floor(MAX_CODE_CHARS * 0.4));\n return [head, \"\\n/* … file truncated for semantic analysis … */\\n\", tail].join(\"\");\n}\n\nfunction shouldUseDeterministicSemanticFallback(\n query: string,\n context: StructuredContext | undefined,\n filePath: string,\n fallback: FileAnalysis\n): boolean {\n const isAnalyzeOnly = context?.executionControl?.constraints?.allowFileWrites === false;\n const exactSymbol = getStrongExactVerifySymbol(context, filePath);\n return isAnalyzeOnly && isMethodSelectionRetrievalQuery(query) && !!exactSymbol && !!fallback.proposedChanges?.targets?.length;\n}\n\nfunction buildDeterministicSemanticFallback(\n file: StructuredFileCapsule,\n query: string,\n context?: StructuredContext\n): FileAnalysis {\n const exactSymbol = getStrongExactVerifySymbol(context, file.path);\n const verifyRationale =\n context?.analysis?.verify?.byFile?.[file.path]?.rationale ??\n \"Verify evidence identified this file as the strongest answer source.\";\n const excerpt = exactSymbol\n ? extractDeclarationExcerpt(file.code, exactSymbol.evidence)\n : sliceCodeForAnalysis(file.code);\n const declarationTarget = exactSymbol\n ? extractDeclarationTarget(file.code, exactSymbol.evidence)\n : undefined;\n\n if (exactSymbol) {\n return {\n intent: \"relevant\",\n role: \"primary\",\n relevanceExplanation: `Exact verify evidence already identifies ${exactSymbol.name} in this file as the deciding method for the query. ${verifyRationale}`,\n proposedChanges: {\n summary: `${exactSymbol.name} is the exact verified method that answers this query.`,\n scope: \"minor\",\n targets: declarationTarget ? [declarationTarget] : [exactSymbol.name],\n rationale: \"Deterministic semantic fallback from exact verify evidence.\",\n },\n excerpts: excerpt\n ? [\n {\n description: `Exact verify-backed declaration for ${exactSymbol.name}.`,\n startLine: exactSymbol.evidence.span?.startLine,\n endLine: exactSymbol.evidence.span?.endLine,\n symbols: [exactSymbol.name],\n code: excerpt,\n },\n ]\n : undefined,\n risks: [],\n };\n }\n\n return {\n intent: \"relevant\",\n role: \"primary\",\n relevanceExplanation: `Semantic generation was unavailable, so this file is being carried forward with bounded deterministic analysis. ${verifyRationale}`,\n proposedChanges: {\n summary: \"Deterministic semantic fallback preserved this file as a grounded analysis source.\",\n scope: \"minor\",\n targets: [`FILE: ${file.path}`],\n rationale: \"Fallback used because semantic generation failed or was intentionally skipped.\",\n },\n excerpts: excerpt\n ? [\n {\n description: \"Bounded fallback code excerpt.\",\n code: excerpt,\n },\n ]\n : undefined,\n risks: [],\n };\n}\n\nfunction getStrongExactVerifySymbol(\n context: StructuredContext | undefined,\n filePath: string\n): { name: string; evidence: FileEvidence } | undefined {\n const evidence = context?.analysis?.verify?.byFile?.[filePath]?.evidence ?? [];\n const ranked = evidence\n .filter(item =>\n (item.type === \"symbol\" || item.type === \"structural\") &&\n typeof item.excerpt === \"string\" &&\n item.excerpt.trim().length > 0 &&\n (item.confidence ?? 0) >= MIN_EXACT_VERIFY_CONFIDENCE\n )\n .sort((a, b) => (b.confidence ?? 0) - (a.confidence ?? 0));\n\n const winner = ranked[0];\n if (!winner?.excerpt) return undefined;\n return { name: winner.excerpt.trim(), evidence: winner };\n}\n\nfunction extractDeclarationExcerpt(\n code: string | undefined,\n evidence: FileEvidence\n): string | undefined {\n if (!code) return undefined;\n const lines = code.split(\"\\n\");\n const start = Math.max(0, (evidence.span?.startLine ?? 1) - 1);\n const end = Math.min(lines.length, evidence.span?.endLine ?? start + 1);\n const snippet = lines.slice(start, Math.max(start + 1, end)).join(\"\\n\").trim();\n return snippet || sliceCodeForAnalysis(code);\n}\n\nfunction extractDeclarationTarget(\n code: string | undefined,\n evidence: FileEvidence\n): string | undefined {\n if (!code) return evidence.excerpt?.trim();\n const lines = code.split(\"\\n\");\n const line = lines[(evidence.span?.startLine ?? 1) - 1]?.trim();\n return line || evidence.excerpt?.trim();\n}\n"]}
@@ -20,6 +20,12 @@ ${contentStr}
20
20
  const response = await generate({
21
21
  content: prompt,
22
22
  query: ""
23
+ }, {
24
+ caller: "summaryModule",
25
+ inputContext: {
26
+ query: input.query,
27
+ content: contentStr,
28
+ },
23
29
  });
24
30
  const summary = response.data ?? "⚠️ No summary generated.";
25
31
  const output = {
@@ -27,7 +33,11 @@ ${contentStr}
27
33
  content: '',
28
34
  data: { summary }, // ❌ no filepath
29
35
  };
30
- logInputOutput("summary", "output", output.data);
36
+ logInputOutput("summary", "output", {
37
+ callId: response.trace?.callId,
38
+ summary,
39
+ });
31
40
  return output;
32
41
  },
33
42
  };
43
+ //# sourceMappingURL=summaryModule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summaryModule.js","sourceRoot":"","sources":["../../../src/pipeline/modules/summaryModule.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAQhE,MAAM,CAAC,MAAM,aAAa,GAAW;IACnC,IAAI,EAAE,SAAS;IACf,WAAW,EAAE,kDAAkD;IAC/D,MAAM,EAAE,CAAC,UAAU,CAAC;IACpB,GAAG,EAAE,KAAK,EAAE,KAAe,EAAqB,EAAE;QAChD,gCAAgC;QAChC,MAAM,UAAU,GACd,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ;YAC/B,CAAC,CAAC,KAAK,CAAC,OAAO;YACf,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAEnD,6CAA6C;QAE7C,MAAM,MAAM,GAAG;;;;;EAKjB,UAAU;CACX,CAAC,IAAI,EAAE,CAAC;QAEL,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC;YAC9B,OAAO,EAAE,MAAM;YACf,KAAK,EAAE,EAAE;SACV,EAAE;YACD,MAAM,EAAE,eAAe;YACvB,YAAY,EAAE;gBACZ,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,OAAO,EAAE,UAAU;aACpB;SACF,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,IAAI,0BAA0B,CAAC;QAE5D,MAAM,MAAM,GAAa;YACvB,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,yBAAyB;YAC7C,OAAO,EAAE,EAAE;YACX,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE,gBAAgB;SACpC,CAAC;QAEF,cAAc,CAAC,SAAS,EAAE,QAAQ,EAAE;YAClC,MAAM,EAAE,QAAQ,CAAC,KAAK,EAAE,MAAM;YAC9B,OAAO;SACR,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAChB,CAAC;CACF,CAAC","sourcesContent":["/**\n * Summarizes arbitrary file content into one short text result for later pipeline steps.\n */\nimport { Module, ModuleIO } from \"../../types.js\";\nimport { generate } from \"../../lib/generate.js\";\r\nimport { logInputOutput } from \"../../utils/promptLogHelper.js\";\r\n\r\nexport interface SummaryData {\r\n summary: string;\r\n // ❌ Removed filepath here because module no longer needs it\r\n // filepath?: string;\r\n}\r\n\r\nexport const summaryModule: Module = {\r\n name: \"summary\",\r\n description: \"Generates a general summary of any file content.\",\r\n groups: [\"analysis\"],\r\n run: async (input: ModuleIO): Promise<ModuleIO> => {\r\n // ✅ Only care about content now\r\n const contentStr =\r\n typeof input.content === \"string\"\r\n ? input.content\r\n : JSON.stringify(input.content ?? \"\", null, 2);\r\n\r\n // ❌ Removed filepath/ext/filename extraction\r\n\r\n const prompt = `\r\nYou are an assistant specialized in summarizing files.\r\n\r\nYour task is to summarize the following content as clearly and concisely as possible:\r\n\r\n${contentStr}\r\n`.trim();\r\n\r\n const response = await generate({\n content: prompt,\n query: \"\"\n }, {\n caller: \"summaryModule\",\n inputContext: {\n query: input.query,\n content: contentStr,\n },\n });\n const summary = response.data ?? \"⚠️ No summary generated.\";\r\n\r\n const output: ModuleIO = {\r\n query: input.query, // keep query for context\r\n content: '',\r\n data: { summary }, // ❌ no filepath\r\n };\r\n\r\n logInputOutput(\"summary\", \"output\", {\n callId: response.trace?.callId,\n summary,\n });\n return output;\n },\n};\n"]}
@@ -1,6 +1,10 @@
1
1
  import { contextReviewModule } from "../modules/contextReviewModule.js";
2
2
  import { finalAnswerModule } from "../modules/finalAnswerModule.js";
3
3
  import { fileSearchModule } from "../modules/fileSearchModule.js";
4
+ import { readFileModule } from "../modules/readFileModule.js";
5
+ import { searchDbModule } from "../modules/searchDbModule.js";
6
+ import { searchRegexModule } from "../modules/searchRegexModule.js";
7
+ import { searchListDirectoryModule } from "../modules/searchListDirectoryModule.js";
4
8
  import { cleanupModule } from "../modules/cleanupModule.js";
5
9
  import { summaryModule } from "../modules/summaryModule.js";
6
10
  import { addCommentsModule } from "../modules/commentModule.js";
@@ -13,11 +17,15 @@ export const builtInModules = {
13
17
  // =====================================================
14
18
  // INFORMATION
15
19
  // =====================================================
20
+ "search-db": searchDbModule,
21
+ "search-regex": searchRegexModule,
22
+ "search-list-directory": searchListDirectoryModule,
16
23
  fileSearch: fileSearchModule,
17
24
  summary: summaryModule,
18
25
  // =====================================================
19
26
  // ANALYSIS
20
27
  // =====================================================
28
+ "read-file": readFileModule,
21
29
  semanticAnalysis: semanticAnalysisModule,
22
30
  contextReview: contextReviewModule,
23
31
  // =====================================================
@@ -64,3 +72,4 @@ export function resolveModulesByNames(names) {
64
72
  }
65
73
  return resolved;
66
74
  }
75
+ //# sourceMappingURL=moduleRegistry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"moduleRegistry.js","sourceRoot":"","sources":["../../../src/pipeline/registry/moduleRegistry.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAE,yBAAyB,EAAE,MAAM,yCAAyC,CAAC;AACpF,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AACxE,OAAO,EAAE,sBAAsB,EAAE,MAAM,sCAAsC,CAAC;AAE9E;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAA2B;IACpD,wDAAwD;IACxD,cAAc;IACd,wDAAwD;IACxD,WAAW,EAAE,cAAc;IAC3B,cAAc,EAAE,iBAAiB;IACjC,uBAAuB,EAAE,yBAAyB;IAClD,UAAU,EAAE,gBAAgB;IAC5B,OAAO,EAAE,aAAa;IAEtB,wDAAwD;IACxD,WAAW;IACX,wDAAwD;IACxD,WAAW,EAAE,cAAc;IAC3B,gBAAgB,EAAE,sBAAsB;IACxC,aAAa,EAAE,mBAAmB;IAElC,wDAAwD;IACxD,4BAA4B;IAC5B,wDAAwD;IACxD,aAAa,EAAE,mBAAmB;IAClC,OAAO,EAAE,aAAa;IACtB,QAAQ,EAAE,iBAAiB;IAE3B,wDAAwD;IACxD,WAAW;IACX,wDAAwD;IACxD,WAAW,EAAE,iBAAiB;CAC/B,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC;AAC9B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB;IAClC,OAAO,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;QAC1D,IAAI;QACJ,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,0BAA0B;KAC3D,CAAC,CAAC,CAAC;AACN,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,KAAe;IACnD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,SAAS;QAC7B,MAAM,GAAG,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,GAAG,EAAE,CAAC;YACR,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACnB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC","sourcesContent":["/**\n * Registers the built-in runtime modules the action router may execute.\n *\n * Why this file exists:\n * - keep runtime module wiring in one place\n * - make typed action ids resolve to one concrete module implementation\n */\nimport { Module } from \"../../types.js\";\nimport { contextReviewModule } from \"../modules/contextReviewModule.js\";\nimport { finalAnswerModule } from \"../modules/finalAnswerModule.js\";\nimport { fileSearchModule } from \"../modules/fileSearchModule.js\";\nimport { readFileModule } from \"../modules/readFileModule.js\";\nimport { searchDbModule } from \"../modules/searchDbModule.js\";\nimport { searchRegexModule } from \"../modules/searchRegexModule.js\";\nimport { searchListDirectoryModule } from \"../modules/searchListDirectoryModule.js\";\nimport { cleanupModule } from \"../modules/cleanupModule.js\";\nimport { summaryModule } from \"../modules/summaryModule.js\";\nimport { addCommentsModule } from \"../modules/commentModule.js\";\nimport { codeTransformModule } from \"../modules/codeTransformModule.js\";\nimport { semanticAnalysisModule } from \"../modules/semanticAnalysisModule.js\";\n\r\n/**\r\n * Active built-in modules — all use ModuleIO for input/output.\r\n */\r\nexport const builtInModules: Record<string, Module> = {\r\n // =====================================================\r\n // INFORMATION\n // =====================================================\n \"search-db\": searchDbModule,\n \"search-regex\": searchRegexModule,\n \"search-list-directory\": searchListDirectoryModule,\n fileSearch: fileSearchModule,\n summary: summaryModule,\n\r\n // =====================================================\r\n // ANALYSIS\n // =====================================================\n \"read-file\": readFileModule,\n semanticAnalysis: semanticAnalysisModule,\n contextReview: contextReviewModule,\n\r\n // =====================================================\r\n // TRANSFORM / WRITE SUPPORT\r\n // =====================================================\r\n codeTransform: codeTransformModule,\r\n cleanup: cleanupModule,\r\n comments: addCommentsModule,\r\n\r\n // =====================================================\r\n // FINALIZE\r\n // =====================================================\r\n finalAnswer: finalAnswerModule,\r\n};\r\n\r\n/**\r\n * Get module by name.\r\n */\r\nexport function getModuleByName(name: string): Module | undefined {\r\n return builtInModules[name];\r\n}\r\n\r\n/**\r\n * List available modules for CLI or UI display.\r\n */\r\nexport function listAvailableModules(): { name: string; description: string }[] {\r\n return Object.entries(builtInModules).map(([name, mod]) => ({\r\n name,\r\n description: mod.description ?? \"No description available\",\r\n }));\r\n}\r\n\r\n/**\r\n * Resolve modules from a list of names.\r\n * Returns a unique ordered array of modules.\r\n */\r\nexport function resolveModulesByNames(names: string[]): Module[] {\r\n const seen = new Set<string>();\r\n const resolved: Module[] = [];\r\n\r\n for (const name of names) {\r\n if (seen.has(name)) continue;\r\n const mod = getModuleByName(name);\r\n if (mod) {\r\n resolved.push(mod);\r\n seen.add(name);\r\n }\r\n }\r\n\r\n return resolved;\r\n}\r\n"]}
@@ -28,3 +28,4 @@ export async function runModulePipeline(modules, initialInput) {
28
28
  }
29
29
  return currentIO;
30
30
  }
31
+ //# sourceMappingURL=runModulePipeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runModulePipeline.js","sourceRoot":"","sources":["../../src/pipeline/runModulePipeline.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,OAAiB,EACjB,YAAsB;IAEtB,MAAM,SAAS,GAAG,qBAAqB,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,GAAG,SAAS,8BAA8B,OAAO,CAAC,MAAM,YAAY,CAAC,CAAC;IAElF,qBAAqB;IACrB,IAAI,SAAS,GAAa,EAAE,GAAG,YAAY,EAAE,CAAC;IAE9C,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,IAAI,CAAC;YACH,MAAM,MAAM,GAAa,MAAM,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAElD,iBAAiB;YACjB,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,IAAI,KAAK,CAAC,WAAW,GAAG,CAAC,IAAI,yBAAyB,CAAC,CAAC;YAChE,CAAC;YAED,kCAAkC;YAClC,wBAAwB;YACxB,eAAe;YACf,qCAAqC;YACrC,wDAAwD;YACxD,SAAS,GAAG;gBACV,KAAK,EAAE,SAAS,CAAC,KAAK;gBACtB,OAAO,EAAE,MAAM,CAAC,IAAI,EAAE,0BAA0B;gBAChD,IAAI,EAAE,EAAE;aACT,CAAC;YAEF,OAAO,CAAC,GAAG,CAAC,GAAG,SAAS,QAAQ,GAAG,CAAC,IAAI,gCAAgC,CAAC,CAAC;QAC5E,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CACX,GAAG,SAAS,cAAc,GAAG,CAAC,IAAI,WAAW,EAC7C,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CACzC,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC","sourcesContent":["// File: src/pipeline/runModulePipeline.ts\r\nimport { Module, ModuleIO } from \"../types\";\r\n\r\nexport async function runModulePipeline(\r\n modules: Module[],\r\n initialInput: ModuleIO\r\n): Promise<ModuleIO> {\r\n const logPrefix = `[runModulePipeline]`;\r\n console.log(`${logPrefix} 🚀 Starting pipeline with ${modules.length} module(s)`);\r\n\r\n // Copy initial input\r\n let currentIO: ModuleIO = { ...initialInput };\r\n\r\n for (const mod of modules) {\r\n try {\r\n const output: ModuleIO = await mod.run(currentIO);\r\n\r\n // Validate shape\r\n if (!output) {\r\n throw new Error(`Module '${mod.name}' returned empty output`);\r\n }\r\n\r\n // --- FIX: Pipeline semantics ---\r\n // Next module receives:\r\n // - same query\r\n // - content = previous module's data\r\n // - (data is the last produced data only, never merged)\r\n currentIO = {\r\n query: currentIO.query,\r\n content: output.data, // data -> content handoff\r\n data: '',\r\n };\r\n\r\n console.log(`${logPrefix} 🔁 '${mod.name}' → content replaced with data`);\r\n } catch (err) {\r\n console.error(\r\n `${logPrefix} ❌ Module '${mod.name}' failed:`,\r\n err instanceof Error ? err.message : err\r\n );\r\n }\r\n }\r\n\r\n return currentIO;\r\n}\r\n"]}