scai 0.1.178 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (770) hide show
  1. package/README.md +171 -260
  2. package/dist/__tests__/CommitSuggesterCmd.test.js +112 -0
  3. package/dist/__tests__/CommitSuggesterCmd.test.js.map +1 -0
  4. package/dist/__tests__/EvalReportCmd.test.js +645 -0
  5. package/dist/__tests__/EvalReportCmd.test.js.map +1 -0
  6. package/dist/__tests__/ModelCmd.test.js +64 -0
  7. package/dist/__tests__/ModelCmd.test.js.map +1 -0
  8. package/dist/__tests__/agents/agentActions.test.js +345 -0
  9. package/dist/__tests__/agents/agentActions.test.js.map +1 -0
  10. package/dist/__tests__/agents/agentFeedback.test.js +118 -0
  11. package/dist/__tests__/agents/agentFeedback.test.js.map +1 -0
  12. package/dist/__tests__/agents/agentGeneralScope.test.js +74 -0
  13. package/dist/__tests__/agents/agentGeneralScope.test.js.map +1 -0
  14. package/dist/__tests__/agents/agentLoop.test.js +1723 -0
  15. package/dist/__tests__/agents/agentLoop.test.js.map +1 -0
  16. package/dist/__tests__/agents/agentPolicyState.test.js +948 -0
  17. package/dist/__tests__/agents/agentPolicyState.test.js.map +1 -0
  18. package/dist/__tests__/agents/agentReadEvidence.test.js +170 -0
  19. package/dist/__tests__/agents/agentReadEvidence.test.js.map +1 -0
  20. package/dist/__tests__/agents/agentReadPersistence.test.js +129 -0
  21. package/dist/__tests__/agents/agentReadPersistence.test.js.map +1 -0
  22. package/dist/__tests__/agents/agentResumeCheckpoint.test.js +90 -0
  23. package/dist/__tests__/agents/agentResumeCheckpoint.test.js.map +1 -0
  24. package/dist/__tests__/agents/agentSearchBatchPlanner.test.js +289 -0
  25. package/dist/__tests__/agents/agentSearchBatchPlanner.test.js.map +1 -0
  26. package/dist/__tests__/agents/agentSearchOwnership.test.js +166 -0
  27. package/dist/__tests__/agents/agentSearchOwnership.test.js.map +1 -0
  28. package/dist/__tests__/agents/agentSearchRanking.test.js +139 -0
  29. package/dist/__tests__/agents/agentSearchRanking.test.js.map +1 -0
  30. package/dist/__tests__/agents/agentSearchRouting.test.js +584 -0
  31. package/dist/__tests__/agents/agentSearchRouting.test.js.map +1 -0
  32. package/dist/__tests__/agents/agentSearchScoring.test.js +23 -0
  33. package/dist/__tests__/agents/agentSearchScoring.test.js.map +1 -0
  34. package/dist/__tests__/agents/agentSearchShared.test.js +78 -0
  35. package/dist/__tests__/agents/agentSearchShared.test.js.map +1 -0
  36. package/dist/__tests__/agents/agentStateMachine.test.js +58 -0
  37. package/dist/__tests__/agents/agentStateMachine.test.js.map +1 -0
  38. package/dist/__tests__/agents/agentTaskPersistence.test.js +156 -0
  39. package/dist/__tests__/agents/agentTaskPersistence.test.js.map +1 -0
  40. package/dist/__tests__/agents/agentTools.test.js +69 -0
  41. package/dist/__tests__/agents/agentTools.test.js.map +1 -0
  42. package/dist/__tests__/agents/agentTransform.test.js +779 -0
  43. package/dist/__tests__/agents/agentTransform.test.js.map +1 -0
  44. package/dist/__tests__/agents/analysisPlanGenStep.test.js +157 -0
  45. package/dist/__tests__/agents/analysisPlanGenStep.test.js.map +1 -0
  46. package/dist/__tests__/agents/answerOnlyCompletion.test.js +75 -0
  47. package/dist/__tests__/agents/answerOnlyCompletion.test.js.map +1 -0
  48. package/dist/__tests__/agents/decideNextAction.test.js +1662 -0
  49. package/dist/__tests__/agents/decideNextAction.test.js.map +1 -0
  50. package/dist/__tests__/agents/deriveFocusFromSearchStep.test.js +258 -0
  51. package/dist/__tests__/agents/deriveFocusFromSearchStep.test.js.map +1 -0
  52. package/dist/__tests__/agents/evidenceVerifierStep.test.js +113 -0
  53. package/dist/__tests__/agents/evidenceVerifierStep.test.js.map +1 -0
  54. package/dist/__tests__/agents/executionPolicyResolver.test.js +208 -0
  55. package/dist/__tests__/agents/executionPolicyResolver.test.js.map +1 -0
  56. package/dist/__tests__/agents/fileCheckStep.test.js +299 -0
  57. package/dist/__tests__/agents/fileCheckStep.test.js.map +1 -0
  58. package/dist/__tests__/agents/giveUpEvaluatorStep.test.js +35 -0
  59. package/dist/__tests__/agents/giveUpEvaluatorStep.test.js.map +1 -0
  60. package/dist/__tests__/agents/guardState.test.js +297 -0
  61. package/dist/__tests__/agents/guardState.test.js.map +1 -0
  62. package/dist/__tests__/agents/mainAgentHeuristics.test.js +72 -0
  63. package/dist/__tests__/agents/mainAgentHeuristics.test.js.map +1 -0
  64. package/dist/__tests__/agents/objectiveEvaluatorStep.test.js +60 -0
  65. package/dist/__tests__/agents/objectiveEvaluatorStep.test.js.map +1 -0
  66. package/dist/__tests__/agents/outerLoopRecoveryEvaluator.test.js +207 -0
  67. package/dist/__tests__/agents/outerLoopRecoveryEvaluator.test.js.map +1 -0
  68. package/dist/__tests__/agents/prompting.test.js +363 -0
  69. package/dist/__tests__/agents/prompting.test.js.map +1 -0
  70. package/dist/__tests__/agents/readinessGateStep.test.js +180 -0
  71. package/dist/__tests__/agents/readinessGateStep.test.js.map +1 -0
  72. package/dist/__tests__/agents/reasonNextStep.test.js +56 -0
  73. package/dist/__tests__/agents/reasonNextStep.test.js.map +1 -0
  74. package/dist/__tests__/agents/reasonNextTaskStep.test.js +284 -0
  75. package/dist/__tests__/agents/reasonNextTaskStep.test.js.map +1 -0
  76. package/dist/__tests__/agents/resolveAgentTargetClassification.test.js +170 -0
  77. package/dist/__tests__/agents/resolveAgentTargetClassification.test.js.map +1 -0
  78. package/dist/__tests__/agents/resolveProgressState.test.js +526 -0
  79. package/dist/__tests__/agents/resolveProgressState.test.js.map +1 -0
  80. package/dist/__tests__/agents/resumeCheckpoint.test.js +50 -0
  81. package/dist/__tests__/agents/resumeCheckpoint.test.js.map +1 -0
  82. package/dist/__tests__/agents/routingDecisionStep.test.js +134 -0
  83. package/dist/__tests__/agents/routingDecisionStep.test.js.map +1 -0
  84. package/dist/__tests__/agents/scopeClassificationStep.test.js +118 -0
  85. package/dist/__tests__/agents/scopeClassificationStep.test.js.map +1 -0
  86. package/dist/__tests__/agents/searchContext.test.js +97 -0
  87. package/dist/__tests__/agents/searchContext.test.js.map +1 -0
  88. package/dist/__tests__/agents/selectRelevantSourcesStep.test.js +73 -0
  89. package/dist/__tests__/agents/selectRelevantSourcesStep.test.js.map +1 -0
  90. package/dist/__tests__/agents/structuredOutput.test.js +45 -0
  91. package/dist/__tests__/agents/structuredOutput.test.js.map +1 -0
  92. package/dist/__tests__/agents/transformPlanGenStep.fallback.test.js +59 -0
  93. package/dist/__tests__/agents/transformPlanGenStep.fallback.test.js.map +1 -0
  94. package/dist/__tests__/agents/transformPlanGenStep.test.js +92 -0
  95. package/dist/__tests__/agents/transformPlanGenStep.test.js.map +1 -0
  96. package/dist/__tests__/agents/understandIntentStep.test.js +237 -0
  97. package/dist/__tests__/agents/understandIntentStep.test.js.map +1 -0
  98. package/dist/__tests__/agents/understandResumeContext.test.js +65 -0
  99. package/dist/__tests__/agents/understandResumeContext.test.js.map +1 -0
  100. package/dist/__tests__/agents/understandScope.test.js +227 -0
  101. package/dist/__tests__/agents/understandScope.test.js.map +1 -0
  102. package/dist/__tests__/agents/validateChangesStep.test.js +52 -0
  103. package/dist/__tests__/agents/validateChangesStep.test.js.map +1 -0
  104. package/dist/__tests__/askCommandTaskBinding.test.js +176 -0
  105. package/dist/__tests__/askCommandTaskBinding.test.js.map +1 -0
  106. package/dist/__tests__/commandVisibility.test.js +25 -0
  107. package/dist/__tests__/commandVisibility.test.js.map +1 -0
  108. package/dist/__tests__/config.devOutput.test.js +82 -0
  109. package/dist/__tests__/config.devOutput.test.js.map +1 -0
  110. package/dist/__tests__/currentContext.test.js +43 -0
  111. package/dist/__tests__/currentContext.test.js.map +1 -0
  112. package/dist/__tests__/daemonWorker.test.js +51 -0
  113. package/dist/__tests__/daemonWorker.test.js.map +1 -0
  114. package/dist/__tests__/dialogState.test.js +113 -0
  115. package/dist/__tests__/dialogState.test.js.map +1 -0
  116. package/dist/__tests__/evalCommands.test.js +506 -0
  117. package/dist/__tests__/evalCommands.test.js.map +1 -0
  118. package/dist/__tests__/evalCommandsSummary.test.js +68 -0
  119. package/dist/__tests__/evalCommandsSummary.test.js.map +1 -0
  120. package/dist/__tests__/example.test.js +1 -0
  121. package/dist/__tests__/example.test.js.map +1 -0
  122. package/dist/__tests__/factory.commitCommand.test.js +45 -0
  123. package/dist/__tests__/factory.commitCommand.test.js.map +1 -0
  124. package/dist/__tests__/factory.devOutputCommand.test.js +122 -0
  125. package/dist/__tests__/factory.devOutputCommand.test.js.map +1 -0
  126. package/dist/__tests__/factory.evalCommands.test.js +38 -0
  127. package/dist/__tests__/factory.evalCommands.test.js.map +1 -0
  128. package/dist/__tests__/factory.planCommand.test.js +35 -0
  129. package/dist/__tests__/factory.planCommand.test.js.map +1 -0
  130. package/dist/__tests__/factory.setupCommand.test.js +34 -0
  131. package/dist/__tests__/factory.setupCommand.test.js.map +1 -0
  132. package/dist/__tests__/factory.statusCommand.test.js +54 -0
  133. package/dist/__tests__/factory.statusCommand.test.js.map +1 -0
  134. package/dist/__tests__/fileRules/queryTokenRules.test.js +35 -0
  135. package/dist/__tests__/fileRules/queryTokenRules.test.js.map +1 -0
  136. package/dist/__tests__/fileRules/searchPathClassification.test.js +57 -0
  137. package/dist/__tests__/fileRules/searchPathClassification.test.js.map +1 -0
  138. package/dist/__tests__/generate.ollamaRecovery.test.js +344 -0
  139. package/dist/__tests__/generate.ollamaRecovery.test.js.map +1 -0
  140. package/dist/__tests__/index.modelStartup.test.js +24 -0
  141. package/dist/__tests__/index.modelStartup.test.js.map +1 -0
  142. package/dist/__tests__/indexCmd.test.js +85 -0
  143. package/dist/__tests__/indexCmd.test.js.map +1 -0
  144. package/dist/__tests__/indexSlashCommand.test.js +50 -0
  145. package/dist/__tests__/indexSlashCommand.test.js.map +1 -0
  146. package/dist/__tests__/ollamaService.test.js +103 -0
  147. package/dist/__tests__/ollamaService.test.js.map +1 -0
  148. package/dist/__tests__/pipeline/modules/codeTransformModule.small-file.test.js +68 -0
  149. package/dist/__tests__/pipeline/modules/codeTransformModule.small-file.test.js.map +1 -0
  150. package/dist/__tests__/pipeline/modules/commitSuggesterModule.test.js +68 -0
  151. package/dist/__tests__/pipeline/modules/commitSuggesterModule.test.js.map +1 -0
  152. package/dist/__tests__/pipeline/modules/fileSearchModule.test.js +284 -0
  153. package/dist/__tests__/pipeline/modules/fileSearchModule.test.js.map +1 -0
  154. package/dist/__tests__/pipeline/modules/finalAnswerModule.test.js +1139 -0
  155. package/dist/__tests__/pipeline/modules/finalAnswerModule.test.js.map +1 -0
  156. package/dist/__tests__/pipeline/modules/readFileModule.test.js +146 -0
  157. package/dist/__tests__/pipeline/modules/readFileModule.test.js.map +1 -0
  158. package/dist/__tests__/pipeline/modules/semanticAnalysisModule.test.js +192 -0
  159. package/dist/__tests__/pipeline/modules/semanticAnalysisModule.test.js.map +1 -0
  160. package/dist/__tests__/repoIdentity.test.js +31 -0
  161. package/dist/__tests__/repoIdentity.test.js.map +1 -0
  162. package/dist/__tests__/resumeContext.test.js +87 -0
  163. package/dist/__tests__/resumeContext.test.js.map +1 -0
  164. package/dist/__tests__/resumeState.test.js +239 -0
  165. package/dist/__tests__/resumeState.test.js.map +1 -0
  166. package/dist/__tests__/search/SearchOrchestrator.test.js +836 -0
  167. package/dist/__tests__/search/SearchOrchestrator.test.js.map +1 -0
  168. package/dist/__tests__/shellDialogUi.test.js +52 -0
  169. package/dist/__tests__/shellDialogUi.test.js.map +1 -0
  170. package/dist/__tests__/shellSession.test.js +102 -0
  171. package/dist/__tests__/shellSession.test.js.map +1 -0
  172. package/dist/__tests__/statusOwner.test.js +215 -0
  173. package/dist/__tests__/statusOwner.test.js.map +1 -0
  174. package/dist/__tests__/testing/contextEval.test.js +244 -0
  175. package/dist/__tests__/testing/contextEval.test.js.map +1 -0
  176. package/dist/__tests__/testing/harnessArtifacts.test.js +124 -0
  177. package/dist/__tests__/testing/harnessArtifacts.test.js.map +1 -0
  178. package/dist/__tests__/testing/llmTraceSession.test.js +67 -0
  179. package/dist/__tests__/testing/llmTraceSession.test.js.map +1 -0
  180. package/dist/__tests__/testing/registerDevCliCommands.test.js +35 -0
  181. package/dist/__tests__/testing/registerDevCliCommands.test.js.map +1 -0
  182. package/dist/__tests__/testing/runDiagnosis.test.js +159 -0
  183. package/dist/__tests__/testing/runDiagnosis.test.js.map +1 -0
  184. package/dist/__tests__/testing/runtimeLogReader.test.js +66 -0
  185. package/dist/__tests__/testing/runtimeLogReader.test.js.map +1 -0
  186. package/dist/__tests__/testing/testCommands.test.js +53 -0
  187. package/dist/__tests__/testing/testCommands.test.js.map +1 -0
  188. package/dist/__tests__/utils/compileSearchQuery.test.js +38 -0
  189. package/dist/__tests__/utils/compileSearchQuery.test.js.map +1 -0
  190. package/dist/__tests__/utils/consolePresentation.test.js +105 -0
  191. package/dist/__tests__/utils/consolePresentation.test.js.map +1 -0
  192. package/dist/__tests__/utils/extractFileReferences.test.js +41 -0
  193. package/dist/__tests__/utils/extractFileReferences.test.js.map +1 -0
  194. package/dist/__tests__/utils/log.test.js +34 -0
  195. package/dist/__tests__/utils/log.test.js.map +1 -0
  196. package/dist/__tests__/utils/runtimeLogger.test.js +200 -0
  197. package/dist/__tests__/utils/runtimeLogger.test.js.map +1 -0
  198. package/dist/__tests__/utils/spinner.test.js +31 -0
  199. package/dist/__tests__/utils/spinner.test.js.map +1 -0
  200. package/dist/__tests__/utils/verifyFocusPreference.test.js +41 -0
  201. package/dist/__tests__/utils/verifyFocusPreference.test.js.map +1 -0
  202. package/dist/agent/actions/index.js +301 -0
  203. package/dist/agent/actions/index.js.map +1 -0
  204. package/dist/agent/actions/normalize.js +360 -0
  205. package/dist/agent/actions/normalize.js.map +1 -0
  206. package/dist/agent/actions/schemas.js +129 -0
  207. package/dist/agent/actions/schemas.js.map +1 -0
  208. package/dist/agent/evidence/index.js +320 -0
  209. package/dist/agent/evidence/index.js.map +1 -0
  210. package/dist/agent/feedback/index.js +187 -0
  211. package/dist/agent/feedback/index.js.map +1 -0
  212. package/dist/agent/finalization/index.js +35 -0
  213. package/dist/agent/finalization/index.js.map +1 -0
  214. package/dist/agent/index.js +126 -0
  215. package/dist/agent/index.js.map +1 -0
  216. package/dist/agent/logging/index.js +350 -0
  217. package/dist/agent/logging/index.js.map +1 -0
  218. package/dist/agent/persistence/boot.js +58 -0
  219. package/dist/agent/persistence/boot.js.map +1 -0
  220. package/dist/agent/persistence/currentTask.js +36 -0
  221. package/dist/agent/persistence/currentTask.js.map +1 -0
  222. package/dist/agent/persistence/hydrate.js +42 -0
  223. package/dist/agent/persistence/hydrate.js.map +1 -0
  224. package/dist/agent/persistence/index.js +15 -0
  225. package/dist/agent/persistence/index.js.map +1 -0
  226. package/dist/agent/persistence/snapshots.js +97 -0
  227. package/dist/agent/persistence/snapshots.js.map +1 -0
  228. package/dist/agent/persistence/steps.js +95 -0
  229. package/dist/agent/persistence/steps.js.map +1 -0
  230. package/dist/agent/persistence/tasks.js +195 -0
  231. package/dist/agent/persistence/tasks.js.map +1 -0
  232. package/dist/agent/persistence/turns.js +92 -0
  233. package/dist/agent/persistence/turns.js.map +1 -0
  234. package/dist/agent/policy/ambiguityResolution.js +226 -0
  235. package/dist/agent/policy/ambiguityResolution.js.map +1 -0
  236. package/dist/agent/policy/contracts.js +2 -0
  237. package/dist/agent/policy/contracts.js.map +1 -0
  238. package/dist/agent/policy/coveragePolicy.js +309 -0
  239. package/dist/agent/policy/coveragePolicy.js.map +1 -0
  240. package/dist/agent/policy/endDecisionPolicy.js +31 -0
  241. package/dist/agent/policy/endDecisionPolicy.js.map +1 -0
  242. package/dist/agent/policy/index.js +344 -0
  243. package/dist/agent/policy/index.js.map +1 -0
  244. package/dist/agent/policy/loopReview.js +778 -0
  245. package/dist/agent/policy/loopReview.js.map +1 -0
  246. package/dist/agent/policy/readinessPolicy.js +108 -0
  247. package/dist/agent/policy/readinessPolicy.js.map +1 -0
  248. package/dist/agent/policy/resolutionPipeline.js +356 -0
  249. package/dist/agent/policy/resolutionPipeline.js.map +1 -0
  250. package/dist/agent/policy/targetClassification.js +33 -0
  251. package/dist/agent/policy/targetClassification.js.map +1 -0
  252. package/dist/agent/prompting/actionChoice.js +90 -0
  253. package/dist/agent/prompting/actionChoice.js.map +1 -0
  254. package/dist/agent/prompting/finalAnswer.js +38 -0
  255. package/dist/agent/prompting/finalAnswer.js.map +1 -0
  256. package/dist/agent/prompting/index.js +14 -0
  257. package/dist/agent/prompting/index.js.map +1 -0
  258. package/dist/agent/prompting/plan.js +59 -0
  259. package/dist/agent/prompting/plan.js.map +1 -0
  260. package/dist/agent/prompting/transform.js +175 -0
  261. package/dist/agent/prompting/transform.js.map +1 -0
  262. package/dist/agent/prompting/understand.js +70 -0
  263. package/dist/agent/prompting/understand.js.map +1 -0
  264. package/dist/agent/read/freshness.js +29 -0
  265. package/dist/agent/read/freshness.js.map +1 -0
  266. package/dist/agent/read/fullReadPrompt.js +43 -0
  267. package/dist/agent/read/fullReadPrompt.js.map +1 -0
  268. package/dist/agent/read/index.js +140 -0
  269. package/dist/agent/read/index.js.map +1 -0
  270. package/dist/agent/read/persistence.js +88 -0
  271. package/dist/agent/read/persistence.js.map +1 -0
  272. package/dist/agent/read/summarizeReadEvidence.js +733 -0
  273. package/dist/agent/read/summarizeReadEvidence.js.map +1 -0
  274. package/dist/agent/read/targetResolution.js +126 -0
  275. package/dist/agent/read/targetResolution.js.map +1 -0
  276. package/dist/agent/resume/checkpoint.js +41 -0
  277. package/dist/agent/resume/checkpoint.js.map +1 -0
  278. package/dist/agent/runtime/lifecycle.js +67 -0
  279. package/dist/agent/runtime/lifecycle.js.map +1 -0
  280. package/dist/agent/runtime/progress.js +178 -0
  281. package/dist/agent/runtime/progress.js.map +1 -0
  282. package/dist/agent/runtime/runAgentLoop.js +402 -0
  283. package/dist/agent/runtime/runAgentLoop.js.map +1 -0
  284. package/dist/agent/runtime/runAgentPlanOnly.js +127 -0
  285. package/dist/agent/runtime/runAgentPlanOnly.js.map +1 -0
  286. package/dist/agent/runtime/understand.js +336 -0
  287. package/dist/agent/runtime/understand.js.map +1 -0
  288. package/dist/agent/search/batchPlanner.js +274 -0
  289. package/dist/agent/search/batchPlanner.js.map +1 -0
  290. package/dist/agent/search/candidateRetentionPolicy.js +184 -0
  291. package/dist/agent/search/candidateRetentionPolicy.js.map +1 -0
  292. package/dist/agent/search/directory.js +51 -0
  293. package/dist/agent/search/directory.js.map +1 -0
  294. package/dist/agent/search/exactTarget.js +151 -0
  295. package/dist/agent/search/exactTarget.js.map +1 -0
  296. package/dist/agent/search/fragment.js +110 -0
  297. package/dist/agent/search/fragment.js.map +1 -0
  298. package/dist/agent/search/index.js +166 -0
  299. package/dist/agent/search/index.js.map +1 -0
  300. package/dist/agent/search/laneClassifier.js +119 -0
  301. package/dist/agent/search/laneClassifier.js.map +1 -0
  302. package/dist/agent/search/limits.js +10 -0
  303. package/dist/agent/search/limits.js.map +1 -0
  304. package/dist/agent/search/ranking.js +22 -0
  305. package/dist/agent/search/ranking.js.map +1 -0
  306. package/dist/agent/search/regex.js +83 -0
  307. package/dist/agent/search/regex.js.map +1 -0
  308. package/dist/agent/search/routePolicy.js +11 -0
  309. package/dist/agent/search/routePolicy.js.map +1 -0
  310. package/dist/agent/search/searchContext.js +128 -0
  311. package/dist/agent/search/searchContext.js.map +1 -0
  312. package/dist/agent/search/semantic.js +113 -0
  313. package/dist/agent/search/semantic.js.map +1 -0
  314. package/dist/agent/search/semanticIndexSearch.js +202 -0
  315. package/dist/agent/search/semanticIndexSearch.js.map +1 -0
  316. package/dist/agent/search/shared.js +283 -0
  317. package/dist/agent/search/shared.js.map +1 -0
  318. package/dist/agent/search/shell.js +202 -0
  319. package/dist/agent/search/shell.js.map +1 -0
  320. package/dist/agent/search/snippetEvidence.js +57 -0
  321. package/dist/agent/search/snippetEvidence.js.map +1 -0
  322. package/dist/agent/search/types.js +2 -0
  323. package/dist/agent/search/types.js.map +1 -0
  324. package/dist/agent/state/index.js +99 -0
  325. package/dist/agent/state/index.js.map +1 -0
  326. package/dist/agent/state/memory.js +56 -0
  327. package/dist/agent/state/memory.js.map +1 -0
  328. package/dist/agent/structuredOutput/index.js +28 -0
  329. package/dist/agent/structuredOutput/index.js.map +1 -0
  330. package/dist/agent/tools/index.js +199 -0
  331. package/dist/agent/tools/index.js.map +1 -0
  332. package/dist/agent/transform/index.js +519 -0
  333. package/dist/agent/transform/index.js.map +1 -0
  334. package/dist/agent/transform/syntax.js +49 -0
  335. package/dist/agent/transform/syntax.js.map +1 -0
  336. package/dist/agent/types.js +20 -0
  337. package/dist/agent/types.js.map +1 -0
  338. package/dist/agents/actionRegistry.js +114 -0
  339. package/dist/agents/actionRegistry.js.map +1 -0
  340. package/dist/agents/agent.js +5 -0
  341. package/dist/agents/agent.js.map +1 -0
  342. package/dist/agents/agentActions.js +5 -0
  343. package/dist/agents/agentActions.js.map +1 -0
  344. package/dist/agents/agentEvidence.js +5 -0
  345. package/dist/agents/agentEvidence.js.map +1 -0
  346. package/dist/agents/agentFeedback.js +5 -0
  347. package/dist/agents/agentFeedback.js.map +1 -0
  348. package/dist/agents/agentLogging.js +5 -0
  349. package/dist/agents/agentLogging.js.map +1 -0
  350. package/dist/agents/agentLoop.js +5 -0
  351. package/dist/agents/agentLoop.js.map +1 -0
  352. package/dist/agents/agentMemory.js +5 -0
  353. package/dist/agents/agentMemory.js.map +1 -0
  354. package/dist/agents/agentPlanMode.js +5 -0
  355. package/dist/agents/agentPlanMode.js.map +1 -0
  356. package/dist/agents/agentPolicyState.js +5 -0
  357. package/dist/agents/agentPolicyState.js.map +1 -0
  358. package/dist/agents/agentProgress.js +93 -0
  359. package/dist/agents/agentProgress.js.map +1 -0
  360. package/dist/agents/agentSchemas.js +5 -0
  361. package/dist/agents/agentSchemas.js.map +1 -0
  362. package/dist/agents/agentSearchScoring.js +5 -0
  363. package/dist/agents/agentSearchScoring.js.map +1 -0
  364. package/dist/agents/agentStateMachine.js +5 -0
  365. package/dist/agents/agentStateMachine.js.map +1 -0
  366. package/dist/agents/agentTools.js +5 -0
  367. package/dist/agents/agentTools.js.map +1 -0
  368. package/dist/agents/agentTypes.js +5 -0
  369. package/dist/agents/agentTypes.js.map +1 -0
  370. package/dist/agents/agentUnderstand.js +5 -0
  371. package/dist/agents/agentUnderstand.js.map +1 -0
  372. package/dist/agents/analysisPlanGenStep.js +194 -17
  373. package/dist/agents/analysisPlanGenStep.js.map +1 -0
  374. package/dist/agents/answerOnlyCompletion.js +32 -0
  375. package/dist/agents/answerOnlyCompletion.js.map +1 -0
  376. package/dist/agents/collaboratorStep.js +1 -0
  377. package/dist/agents/collaboratorStep.js.map +1 -0
  378. package/dist/agents/decideNextAction.js +444 -0
  379. package/dist/agents/decideNextAction.js.map +1 -0
  380. package/dist/agents/deriveFocusFromSearchStep.js +83 -0
  381. package/dist/agents/deriveFocusFromSearchStep.js.map +1 -0
  382. package/dist/agents/evidenceVerifierStep.js +104 -13
  383. package/dist/agents/evidenceVerifierStep.js.map +1 -0
  384. package/dist/agents/fileCheckStep.js +381 -12
  385. package/dist/agents/fileCheckStep.js.map +1 -0
  386. package/dist/agents/giveUpEvaluatorStep.js +63 -0
  387. package/dist/agents/giveUpEvaluatorStep.js.map +1 -0
  388. package/dist/agents/guardPolicy.js +20 -0
  389. package/dist/agents/guardPolicy.js.map +1 -0
  390. package/dist/agents/guards/executionPolicyResolver.js +165 -0
  391. package/dist/agents/guards/executionPolicyResolver.js.map +1 -0
  392. package/dist/agents/guards/guardState.js +195 -0
  393. package/dist/agents/guards/guardState.js.map +1 -0
  394. package/dist/agents/guards/resolveProgressState.js +403 -0
  395. package/dist/agents/guards/resolveProgressState.js.map +1 -0
  396. package/dist/agents/infoPlanGenStep.js +66 -8
  397. package/dist/agents/infoPlanGenStep.js.map +1 -0
  398. package/dist/agents/integrateFeedbackStep.js +1 -0
  399. package/dist/agents/integrateFeedbackStep.js.map +1 -0
  400. package/dist/agents/iterationFileSelector.js +8 -7
  401. package/dist/agents/iterationFileSelector.js.map +1 -0
  402. package/dist/agents/mainAgentActivityLog.js +85 -0
  403. package/dist/agents/mainAgentActivityLog.js.map +1 -0
  404. package/dist/agents/mainAgentHeuristics.js +173 -0
  405. package/dist/agents/mainAgentHeuristics.js.map +1 -0
  406. package/dist/agents/mainAgentVerify.js +159 -0
  407. package/dist/agents/mainAgentVerify.js.map +1 -0
  408. package/dist/agents/objectiveEvaluatorStep.js +103 -0
  409. package/dist/agents/objectiveEvaluatorStep.js.map +1 -0
  410. package/dist/agents/outerLoopRecoveryEvaluator.js +108 -0
  411. package/dist/agents/outerLoopRecoveryEvaluator.js.map +1 -0
  412. package/dist/agents/readinessGateStep.js +95 -9
  413. package/dist/agents/readinessGateStep.js.map +1 -0
  414. package/dist/agents/reasonNextStep.js +9 -8
  415. package/dist/agents/reasonNextStep.js.map +1 -0
  416. package/dist/agents/reasonNextTaskStep.js +267 -144
  417. package/dist/agents/reasonNextTaskStep.js.map +1 -0
  418. package/dist/agents/researchPlanGenStep.js +61 -25
  419. package/dist/agents/researchPlanGenStep.js.map +1 -0
  420. package/dist/agents/resolveAgentTargetClassification.js +5 -0
  421. package/dist/agents/resolveAgentTargetClassification.js.map +1 -0
  422. package/dist/agents/resolveExecutionModeStep.js +1 -0
  423. package/dist/agents/resolveExecutionModeStep.js.map +1 -0
  424. package/dist/agents/resolveExplicitTargetsStep.js +74 -0
  425. package/dist/agents/resolveExplicitTargetsStep.js.map +1 -0
  426. package/dist/agents/routingDecisionStep.js +58 -11
  427. package/dist/agents/routingDecisionStep.js.map +1 -0
  428. package/dist/agents/scopeClassificationStep.js +66 -3
  429. package/dist/agents/scopeClassificationStep.js.map +1 -0
  430. package/dist/agents/selectRelevantSourcesStep.js +13 -5
  431. package/dist/agents/selectRelevantSourcesStep.js.map +1 -0
  432. package/dist/agents/structuralPreloadStep.js +3 -4
  433. package/dist/agents/structuralPreloadStep.js.map +1 -0
  434. package/dist/agents/transformPlanGenStep.js +105 -18
  435. package/dist/agents/transformPlanGenStep.js.map +1 -0
  436. package/dist/agents/understandIntentStep.js +237 -17
  437. package/dist/agents/understandIntentStep.js.map +1 -0
  438. package/dist/agents/validateChangesStep.js +16 -2
  439. package/dist/agents/validateChangesStep.js.map +1 -0
  440. package/dist/agents/writeFileStep.js +1 -0
  441. package/dist/agents/writeFileStep.js.map +1 -0
  442. package/dist/commands/AskCmd.js +139 -44
  443. package/dist/commands/AskCmd.js.map +1 -0
  444. package/dist/commands/BackupCmd.js +1 -0
  445. package/dist/commands/BackupCmd.js.map +1 -0
  446. package/dist/commands/ChangeLogUpdateCmd.js +1 -0
  447. package/dist/commands/ChangeLogUpdateCmd.js.map +1 -0
  448. package/dist/commands/CommitSuggesterCmd.js +55 -13
  449. package/dist/commands/CommitSuggesterCmd.js.map +1 -0
  450. package/dist/commands/DaemonCmd.js +52 -14
  451. package/dist/commands/DaemonCmd.js.map +1 -0
  452. package/dist/commands/DeleteIndex.js +1 -0
  453. package/dist/commands/DeleteIndex.js.map +1 -0
  454. package/dist/commands/EvalReportCmd.js +374 -0
  455. package/dist/commands/EvalReportCmd.js.map +1 -0
  456. package/dist/commands/FindCmd.js +1 -0
  457. package/dist/commands/FindCmd.js.map +1 -0
  458. package/dist/commands/GitCmd.js +1 -0
  459. package/dist/commands/GitCmd.js.map +1 -0
  460. package/dist/commands/IndexCmd.js +11 -79
  461. package/dist/commands/IndexCmd.js.map +1 -0
  462. package/dist/commands/InspectCmd.js +1 -0
  463. package/dist/commands/InspectCmd.js.map +1 -0
  464. package/dist/commands/ModelCmd.js +24 -0
  465. package/dist/commands/ModelCmd.js.map +1 -0
  466. package/dist/commands/ReadlineSingleton.js +1 -0
  467. package/dist/commands/ReadlineSingleton.js.map +1 -0
  468. package/dist/commands/ResetDbCmd.js +18 -1
  469. package/dist/commands/ResetDbCmd.js.map +1 -0
  470. package/dist/commands/ReviewCmd.js +1 -0
  471. package/dist/commands/ReviewCmd.js.map +1 -0
  472. package/dist/commands/StatusCmd.js +22 -0
  473. package/dist/commands/StatusCmd.js.map +1 -0
  474. package/dist/commands/StopDaemonCmd.js +1 -0
  475. package/dist/commands/StopDaemonCmd.js.map +1 -0
  476. package/dist/commands/SummaryCmd.js +1 -0
  477. package/dist/commands/SummaryCmd.js.map +1 -0
  478. package/dist/commands/SwitchCmd.js +9 -15
  479. package/dist/commands/SwitchCmd.js.map +1 -0
  480. package/dist/commands/TasksCmd.js +142 -57
  481. package/dist/commands/TasksCmd.js.map +1 -0
  482. package/dist/commands/TestCmd.js +66 -0
  483. package/dist/commands/TestCmd.js.map +1 -0
  484. package/dist/commands/WorkflowCmd.js +1 -0
  485. package/dist/commands/WorkflowCmd.js.map +1 -0
  486. package/dist/commands/commandVisibility.js +27 -0
  487. package/dist/commands/commandVisibility.js.map +1 -0
  488. package/dist/commands/evalCommands.js +1337 -0
  489. package/dist/commands/evalCommands.js.map +1 -0
  490. package/dist/commands/factory.js +206 -38
  491. package/dist/commands/factory.js.map +1 -0
  492. package/dist/config.js +62 -11
  493. package/dist/config.js.map +1 -0
  494. package/dist/constants.js +21 -3
  495. package/dist/constants.js.map +1 -0
  496. package/dist/context.js +33 -32
  497. package/dist/context.js.map +1 -0
  498. package/dist/daemon/daemonQueues.js +1 -20
  499. package/dist/daemon/daemonQueues.js.map +1 -0
  500. package/dist/daemon/daemonWorker.js +26 -37
  501. package/dist/daemon/daemonWorker.js.map +1 -0
  502. package/dist/daemon/generateSummaries.js +1 -0
  503. package/dist/daemon/generateSummaries.js.map +1 -0
  504. package/dist/daemon/runFolderCapsuleBatch.js +1 -0
  505. package/dist/daemon/runFolderCapsuleBatch.js.map +1 -0
  506. package/dist/daemon/runIndexingBatch.js +1 -0
  507. package/dist/daemon/runIndexingBatch.js.map +1 -0
  508. package/dist/daemon/runKgBatch.js +9 -1
  509. package/dist/daemon/runKgBatch.js.map +1 -0
  510. package/dist/db/backup.js +1 -0
  511. package/dist/db/backup.js.map +1 -0
  512. package/dist/db/client.js +18 -3
  513. package/dist/db/client.js.map +1 -0
  514. package/dist/db/fileIndex.js +110 -152
  515. package/dist/db/fileIndex.js.map +1 -0
  516. package/dist/db/functionExtractors/extractFromJava.js +1 -0
  517. package/dist/db/functionExtractors/extractFromJava.js.map +1 -0
  518. package/dist/db/functionExtractors/extractFromJs.js +1 -0
  519. package/dist/db/functionExtractors/extractFromJs.js.map +1 -0
  520. package/dist/db/functionExtractors/extractFromTs.js +1 -0
  521. package/dist/db/functionExtractors/extractFromTs.js.map +1 -0
  522. package/dist/db/functionExtractors/extractFromXML.js +1 -0
  523. package/dist/db/functionExtractors/extractFromXML.js.map +1 -0
  524. package/dist/db/functionExtractors/index.js +1 -0
  525. package/dist/db/functionExtractors/index.js.map +1 -0
  526. package/dist/db/functionIndex.js +9 -0
  527. package/dist/db/functionIndex.js.map +1 -0
  528. package/dist/db/schema.js +314 -99
  529. package/dist/db/schema.js.map +1 -0
  530. package/dist/db/sqlTemplates.js +1 -0
  531. package/dist/db/sqlTemplates.js.map +1 -0
  532. package/dist/fileRules/builtins.js +1 -0
  533. package/dist/fileRules/builtins.js.map +1 -0
  534. package/dist/fileRules/classifyFile.js +1 -0
  535. package/dist/fileRules/classifyFile.js.map +1 -0
  536. package/dist/fileRules/codeAllowedExtensions.js +1 -0
  537. package/dist/fileRules/codeAllowedExtensions.js.map +1 -0
  538. package/dist/fileRules/detectFileType.js +1 -0
  539. package/dist/fileRules/detectFileType.js.map +1 -0
  540. package/dist/fileRules/fileClassifier.js +1 -0
  541. package/dist/fileRules/fileClassifier.js.map +1 -0
  542. package/dist/fileRules/fileExceptions.js +1 -0
  543. package/dist/fileRules/fileExceptions.js.map +1 -0
  544. package/dist/fileRules/ignoredExtensions.js +1 -0
  545. package/dist/fileRules/ignoredExtensions.js.map +1 -0
  546. package/dist/fileRules/ignoredPaths.js +48 -5
  547. package/dist/fileRules/ignoredPaths.js.map +1 -0
  548. package/dist/fileRules/queryTokenRules.js +176 -0
  549. package/dist/fileRules/queryTokenRules.js.map +1 -0
  550. package/dist/fileRules/searchPathClassification.js +58 -0
  551. package/dist/fileRules/searchPathClassification.js.map +1 -0
  552. package/dist/fileRules/shouldIgnoreFiles.js +1 -0
  553. package/dist/fileRules/shouldIgnoreFiles.js.map +1 -0
  554. package/dist/fileRules/stopWords.js +9 -0
  555. package/dist/fileRules/stopWords.js.map +1 -0
  556. package/dist/fileRules/wellKnownRepoFiles.js +1 -0
  557. package/dist/fileRules/wellKnownRepoFiles.js.map +1 -0
  558. package/dist/git/commitSummary.js +227 -0
  559. package/dist/git/commitSummary.js.map +1 -0
  560. package/dist/github/api.js +1 -0
  561. package/dist/github/api.js.map +1 -0
  562. package/dist/github/auth.js +1 -0
  563. package/dist/github/auth.js.map +1 -0
  564. package/dist/github/github.js +1 -0
  565. package/dist/github/github.js.map +1 -0
  566. package/dist/github/githubAuthCheck.js +1 -0
  567. package/dist/github/githubAuthCheck.js.map +1 -0
  568. package/dist/github/postComments.js +1 -0
  569. package/dist/github/postComments.js.map +1 -0
  570. package/dist/github/repo.js +15 -24
  571. package/dist/github/repo.js.map +1 -0
  572. package/dist/github/token.js +1 -0
  573. package/dist/github/token.js.map +1 -0
  574. package/dist/github/types.js +1 -0
  575. package/dist/github/types.js.map +1 -0
  576. package/dist/index.js +318 -37
  577. package/dist/index.js.map +1 -0
  578. package/dist/lib/generate.js +264 -20
  579. package/dist/lib/generate.js.map +1 -0
  580. package/dist/lib/generateFolderCapsules.js +1 -0
  581. package/dist/lib/generateFolderCapsules.js.map +1 -0
  582. package/dist/lib/ollamaModelPolicy.js +59 -0
  583. package/dist/lib/ollamaModelPolicy.js.map +1 -0
  584. package/dist/lib/spinner.js +29 -9
  585. package/dist/lib/spinner.js.map +1 -0
  586. package/dist/modelSetup.js +25 -78
  587. package/dist/modelSetup.js.map +1 -0
  588. package/dist/pipeline/modules/changeLogModule.js +10 -1
  589. package/dist/pipeline/modules/changeLogModule.js.map +1 -0
  590. package/dist/pipeline/modules/cleanupModule.js +1 -0
  591. package/dist/pipeline/modules/cleanupModule.js.map +1 -0
  592. package/dist/pipeline/modules/codeTransformModule.js +10 -16
  593. package/dist/pipeline/modules/codeTransformModule.js.map +1 -0
  594. package/dist/pipeline/modules/commentModule.js +12 -0
  595. package/dist/pipeline/modules/commentModule.js.map +1 -0
  596. package/dist/pipeline/modules/commitSuggesterModule.js +82 -12
  597. package/dist/pipeline/modules/commitSuggesterModule.js.map +1 -0
  598. package/dist/pipeline/modules/contextReviewModule.js +12 -1
  599. package/dist/pipeline/modules/contextReviewModule.js.map +1 -0
  600. package/dist/pipeline/modules/dialogAnswerModule.js +58 -0
  601. package/dist/pipeline/modules/dialogAnswerModule.js.map +1 -0
  602. package/dist/pipeline/modules/fileSearchModule.js +5 -143
  603. package/dist/pipeline/modules/fileSearchModule.js.map +1 -0
  604. package/dist/pipeline/modules/finalAnswerModule.js +1176 -151
  605. package/dist/pipeline/modules/finalAnswerModule.js.map +1 -0
  606. package/dist/pipeline/modules/kgModule.js +18 -1
  607. package/dist/pipeline/modules/kgModule.js.map +1 -0
  608. package/dist/pipeline/modules/planAnswerModule.js +99 -0
  609. package/dist/pipeline/modules/planAnswerModule.js.map +1 -0
  610. package/dist/pipeline/modules/readFileModule.js +300 -0
  611. package/dist/pipeline/modules/readFileModule.js.map +1 -0
  612. package/dist/pipeline/modules/reviewModule.js +10 -1
  613. package/dist/pipeline/modules/reviewModule.js.map +1 -0
  614. package/dist/pipeline/modules/searchDbModule.js +159 -0
  615. package/dist/pipeline/modules/searchDbModule.js.map +1 -0
  616. package/dist/pipeline/modules/searchListDirectoryModule.js +62 -0
  617. package/dist/pipeline/modules/searchListDirectoryModule.js.map +1 -0
  618. package/dist/pipeline/modules/searchModuleShared.js +71 -0
  619. package/dist/pipeline/modules/searchModuleShared.js.map +1 -0
  620. package/dist/pipeline/modules/searchRegexModule.js +59 -0
  621. package/dist/pipeline/modules/searchRegexModule.js.map +1 -0
  622. package/dist/pipeline/modules/semanticAnalysisModule.js +185 -28
  623. package/dist/pipeline/modules/semanticAnalysisModule.js.map +1 -0
  624. package/dist/pipeline/modules/summaryModule.js +11 -1
  625. package/dist/pipeline/modules/summaryModule.js.map +1 -0
  626. package/dist/pipeline/registry/moduleRegistry.js +9 -0
  627. package/dist/pipeline/registry/moduleRegistry.js.map +1 -0
  628. package/dist/pipeline/runModulePipeline.js +1 -0
  629. package/dist/pipeline/runModulePipeline.js.map +1 -0
  630. package/dist/scripts/dbScriptSupport.js +172 -0
  631. package/dist/scripts/dbScriptSupport.js.map +1 -0
  632. package/dist/scripts/dbcheck.js +173 -267
  633. package/dist/scripts/dbcheck.js.map +1 -0
  634. package/dist/scripts/dboverview.js +161 -0
  635. package/dist/scripts/dboverview.js.map +1 -0
  636. package/dist/scripts/migrateDb.js +1 -0
  637. package/dist/scripts/migrateDb.js.map +1 -0
  638. package/dist/search/SearchOrchestrator.js +928 -0
  639. package/dist/search/SearchOrchestrator.js.map +1 -0
  640. package/dist/search/sharedRankingPolicy.js +283 -0
  641. package/dist/search/sharedRankingPolicy.js.map +1 -0
  642. package/dist/setup/reindexOwner.js +97 -0
  643. package/dist/setup/reindexOwner.js.map +1 -0
  644. package/dist/setup/setupOwner.js +100 -0
  645. package/dist/setup/setupOwner.js.map +1 -0
  646. package/dist/shell/dialogUi.js +81 -0
  647. package/dist/shell/dialogUi.js.map +1 -0
  648. package/dist/shellSession.js +126 -0
  649. package/dist/shellSession.js.map +1 -0
  650. package/dist/status/statusOwner.js +239 -0
  651. package/dist/status/statusOwner.js.map +1 -0
  652. package/dist/testing/contextEval.js +514 -0
  653. package/dist/testing/contextEval.js.map +1 -0
  654. package/dist/testing/fixtures/transform/small-file.input.js +5 -0
  655. package/dist/testing/fixtures/transform/small-file.input.js.map +1 -0
  656. package/dist/testing/harnessArtifacts.js +112 -0
  657. package/dist/testing/harnessArtifacts.js.map +1 -0
  658. package/dist/testing/llmTraceSession.js +67 -0
  659. package/dist/testing/llmTraceSession.js.map +1 -0
  660. package/dist/testing/registerDevCliCommands.js +43 -0
  661. package/dist/testing/registerDevCliCommands.js.map +1 -0
  662. package/dist/testing/runDiagnosis.js +248 -0
  663. package/dist/testing/runDiagnosis.js.map +1 -0
  664. package/dist/testing/runtimeLogReader.js +144 -0
  665. package/dist/testing/runtimeLogReader.js.map +1 -0
  666. package/dist/testing/testCommands.js +35 -303
  667. package/dist/testing/testCommands.js.map +1 -0
  668. package/dist/testing/testRegistry.js +233 -0
  669. package/dist/testing/testRegistry.js.map +1 -0
  670. package/dist/types.js +1 -0
  671. package/dist/types.js.map +1 -0
  672. package/dist/utils/buildContextualPrompt.js +26 -75
  673. package/dist/utils/buildContextualPrompt.js.map +1 -0
  674. package/dist/utils/changeLogPrompt.js +1 -0
  675. package/dist/utils/changeLogPrompt.js.map +1 -0
  676. package/dist/utils/checkModel.js +17 -92
  677. package/dist/utils/checkModel.js.map +1 -0
  678. package/dist/utils/commentMap.js +1 -0
  679. package/dist/utils/commentMap.js.map +1 -0
  680. package/dist/utils/compileSearchQuery.js +23 -9
  681. package/dist/utils/compileSearchQuery.js.map +1 -0
  682. package/dist/utils/consolePresentation.js +208 -0
  683. package/dist/utils/consolePresentation.js.map +1 -0
  684. package/dist/utils/contentUtils.js +17 -2
  685. package/dist/utils/contentUtils.js.map +1 -0
  686. package/dist/utils/debugContext.js +1 -0
  687. package/dist/utils/debugContext.js.map +1 -0
  688. package/dist/utils/dialogState.js +201 -0
  689. package/dist/utils/dialogState.js.map +1 -0
  690. package/dist/utils/editor.js +1 -0
  691. package/dist/utils/editor.js.map +1 -0
  692. package/dist/utils/executionEvidence.js +50 -0
  693. package/dist/utils/executionEvidence.js.map +1 -0
  694. package/dist/utils/extractFileReferences.js +140 -6
  695. package/dist/utils/extractFileReferences.js.map +1 -0
  696. package/dist/utils/fileEvidenceCache.js +50 -0
  697. package/dist/utils/fileEvidenceCache.js.map +1 -0
  698. package/dist/utils/fileTree.js +1 -0
  699. package/dist/utils/fileTree.js.map +1 -0
  700. package/dist/utils/loadRelevantFolderCapsules.js +35 -5
  701. package/dist/utils/loadRelevantFolderCapsules.js.map +1 -0
  702. package/dist/utils/log.js +10 -1
  703. package/dist/utils/log.js.map +1 -0
  704. package/dist/utils/normalizeData.js +1 -0
  705. package/dist/utils/normalizeData.js.map +1 -0
  706. package/dist/utils/ollamaModelStatus.js +28 -0
  707. package/dist/utils/ollamaModelStatus.js.map +1 -0
  708. package/dist/utils/ollamaService.js +294 -0
  709. package/dist/utils/ollamaService.js.map +1 -0
  710. package/dist/utils/outputFormatter.js +1 -0
  711. package/dist/utils/outputFormatter.js.map +1 -0
  712. package/dist/utils/parseTaggedContent.js +1 -0
  713. package/dist/utils/parseTaggedContent.js.map +1 -0
  714. package/dist/utils/planActions.js +27 -46
  715. package/dist/utils/planActions.js.map +1 -0
  716. package/dist/utils/promptBuilderHelper.js +1 -0
  717. package/dist/utils/promptBuilderHelper.js.map +1 -0
  718. package/dist/utils/promptLogHelper.js +29 -13
  719. package/dist/utils/promptLogHelper.js.map +1 -0
  720. package/dist/utils/queryAnchors.js +71 -0
  721. package/dist/utils/queryAnchors.js.map +1 -0
  722. package/dist/utils/repoIdentity.js +82 -0
  723. package/dist/utils/repoIdentity.js.map +1 -0
  724. package/dist/utils/repoKey.js +1 -0
  725. package/dist/utils/repoKey.js.map +1 -0
  726. package/dist/utils/resolveTargetsToFiles.js +1 -0
  727. package/dist/utils/resolveTargetsToFiles.js.map +1 -0
  728. package/dist/utils/resumeContext.js +219 -0
  729. package/dist/utils/resumeContext.js.map +1 -0
  730. package/dist/utils/resumeState.js +310 -0
  731. package/dist/utils/resumeState.js.map +1 -0
  732. package/dist/utils/rollingPlan.js +118 -0
  733. package/dist/utils/rollingPlan.js.map +1 -0
  734. package/dist/utils/runQueryWithDaemonControl.js +11 -3
  735. package/dist/utils/runQueryWithDaemonControl.js.map +1 -0
  736. package/dist/utils/runtimeLogger.js +252 -0
  737. package/dist/utils/runtimeLogger.js.map +1 -0
  738. package/dist/utils/sanitizeQuery.js +1 -0
  739. package/dist/utils/sanitizeQuery.js.map +1 -0
  740. package/dist/utils/sharedUtils.js +1 -0
  741. package/dist/utils/sharedUtils.js.map +1 -0
  742. package/dist/utils/sleep.js +1 -0
  743. package/dist/utils/sleep.js.map +1 -0
  744. package/dist/utils/splitCodeIntoChunk.js +1 -0
  745. package/dist/utils/splitCodeIntoChunk.js.map +1 -0
  746. package/dist/utils/time.js +66 -0
  747. package/dist/utils/time.js.map +1 -0
  748. package/dist/utils/verifyFocusPreference.js +107 -0
  749. package/dist/utils/verifyFocusPreference.js.map +1 -0
  750. package/dist/utils/vscode.js +1 -0
  751. package/dist/utils/vscode.js.map +1 -0
  752. package/dist/workflow/workflowResolver.js +1 -0
  753. package/dist/workflow/workflowResolver.js.map +1 -0
  754. package/dist/workflow/workflowRunner.js +1 -0
  755. package/dist/workflow/workflowRunner.js.map +1 -0
  756. package/package.json +3 -3
  757. package/dist/agents/MainAgent.js +0 -1886
  758. package/dist/agents/contextReviewStep.js +0 -101
  759. package/dist/agents/finalPlanGenStep.js +0 -107
  760. package/dist/agents/structuralAnalysisStep.js +0 -46
  761. package/dist/agents/validationAnalysisStep.js +0 -87
  762. package/dist/pipeline/modules/chunkManagerModule.js +0 -24
  763. package/dist/pipeline/modules/cleanGeneratedTestsModule.js +0 -33
  764. package/dist/pipeline/modules/fileReaderModule.js +0 -72
  765. package/dist/pipeline/modules/gatherInfoModule.js +0 -181
  766. package/dist/pipeline/modules/generateTestsModule.js +0 -68
  767. package/dist/pipeline/modules/preserveCodeModule.js +0 -195
  768. package/dist/pipeline/modules/refactorModule.js +0 -40
  769. package/dist/pipeline/modules/repairTestsModule.js +0 -48
  770. package/dist/pipeline/modules/runTestsModule.js +0 -37
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agentPolicyState.test.js","sourceRoot":"","sources":["../../../src/__tests__/agents/agentPolicyState.test.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Covers the pure policy snapshot used by the new simple agent loop.\n *\n * Why this file exists:\n * - policy should stay easy to verify without running the whole loop\n * - explicit-target coverage and candidate progression should not hide inside loop branches\n * - answer legality should stay centralized in policy instead of action shortcuts\n */\nimport fs from \"fs\";\nimport os from \"os\";\nimport path from \"path\";\nimport { describe, expect, it } from \"vitest\";\nimport { summarizeFileRead } from \"../../agents/agentEvidence.js\";\nimport { createAgentMemory } from \"../../agents/agentMemory.js\";\nimport { resolveNextReadTarget, resolveNextTriageTarget, resolvePolicyState } from \"../../agents/agentPolicyState.js\";\n\ndescribe(\"resolvePolicyState\", () => {\n it(\"boots one search-db before asking on weak-signal questions\", () => {\n const memory = createAgentMemory(\n \"where do I set the max count for how many loops the agent can run?\",\n \"/repo\",\n \"/repo\"\n );\n memory.task.normalizedQuery = \"where do I set the max count for how many loops the agent can run\";\n memory.task.primaryIntent = \"Find where the simple agent loop count limit is defined.\";\n memory.task.queryScope = \"broad-repo\";\n\n const policy = resolvePolicyState(memory, { forcedEnd: true });\n\n expect(policy.shouldAskUser).toBe(false);\n expect(policy.allowedActions).toContain(\"search-db\");\n expect(policy.allowedActions).not.toContain(\"request-user-input\");\n expect(policy.decision.stop).toBeUndefined();\n expect(policy.decision.nextAction).toBe(\"search-db\");\n expect(policy.decision.args).toEqual({\n query: \"where do I set the max count for how many loops the agent can run\",\n });\n });\n\n it(\"boots one search-db before asking when there is no useful evidence and no concrete target\", () => {\n const memory = createAgentMemory(\"Explain the retry setup\", \"/repo\", \"/repo\");\n memory.task.normalizedQuery = \"Explain the retry setup\";\n memory.task.primaryIntent = \"Explain the retry setup.\";\n memory.task.queryScope = \"broad-repo\";\n\n const policy = resolvePolicyState(memory, { forcedEnd: true });\n\n expect(policy.hasUsefulEvidence).toBe(false);\n expect(policy.shouldAskUser).toBe(false);\n expect(policy.shouldReplan).toBe(true);\n expect(policy.allowedActions).not.toContain(\"final-answer\");\n expect(policy.allowedActions).toContain(\"search-db\");\n expect(policy.allowedActions).not.toContain(\"request-user-input\");\n expect(policy.decision.nextAction).toBe(\"search-db\");\n });\n\n it(\"searches broad repo test-entrypoint asks before asking the user\", () => {\n const memory = createAgentMemory(\n \"How does this repo run tests and where are the test entry points configured?\",\n \"/repo\",\n \"/repo\"\n );\n memory.task.normalizedQuery = \"How does this repo run tests and where are the test entry points configured\";\n memory.task.primaryIntent = \"Understand test execution mechanism and configuration locations in a repository\";\n memory.task.queryScope = \"broad-repo\";\n\n const policy = resolvePolicyState(memory, { forcedEnd: true });\n\n expect(policy.shouldAskUser).toBe(false);\n expect(policy.allowedActions).toContain(\"search-db\");\n expect(policy.allowedActions).not.toContain(\"request-user-input\");\n expect(policy.decision.stop).toBeUndefined();\n expect(policy.decision.nextAction).toBe(\"search-db\");\n expect(policy.endDecision?.action).toBe(\"cannot-answer\");\n });\n\n it(\"requires a follow-up read when a grounded registration layer still has an unread owner-like candidate\", () => {\n const memory = createAgentMemory(\n \"How does this repo run tests and where are the test entry points configured?\",\n \"/repo\",\n \"/repo\"\n );\n memory.task.normalizedQuery = \"How does this repo run tests and where are the test entry points configured\";\n memory.task.primaryIntent = \"Find how tests are executed and where test entry points are defined in the repo\";\n memory.task.queryScope = \"broad-repo\";\n memory.evidence.candidateFiles = [\n \"/repo/cli/src/testing/testCommands.ts\",\n \"/repo/cli/src/shell/registerDevCliCommands.ts\",\n ];\n memory.evidence.candidateMetadata = {\n \"/repo/cli/src/testing/testCommands.ts\": {\n searchScore: 0.92,\n readPriority: 0.92,\n searchReasons: [\"path-anchor\", \"symbol:registerTestingCommands\"],\n },\n \"/repo/cli/src/shell/registerDevCliCommands.ts\": {\n searchScore: 0.81,\n readPriority: 0.81,\n searchReasons: [\"path-anchor\", \"symbol:registerDevCliCommands\"],\n },\n };\n memory.evidence.fileReads[\"/repo/cli/src/testing/testCommands.ts\"] = {\n filePath: \"/repo/cli/src/testing/testCommands.ts\",\n readMode: \"full\",\n summary: \"Registers test commands for the dev shell.\",\n snippets: [\"registerTestingCommands\"],\n keySymbols: [\"registerTestingCommands\"],\n matchedTerms: [\"tests\", \"entry\"],\n relevanceExplanation: \"This file registers shell test commands.\",\n relevantContext: [{ kind: \"purpose\", text: \"Registers shell test helpers and local-model integration harness commands.\" }],\n recordedAt: new Date(0).toISOString(),\n role: \"primary\",\n };\n\n const policy = resolvePolicyState(memory);\n\n expect(policy.loopReview.referenceFollowupNeeded).toBe(true);\n expect(policy.loopReview.topUnreadCandidates[0]?.filePath).toBe(\"/repo/cli/src/shell/registerDevCliCommands.ts\");\n expect(policy.loopReview.stopAssessment.canStop).toBe(false);\n expect(policy.allowedActions).not.toContain(\"final-answer\");\n expect(policy.decision.nextAction).toBe(\"read-file\");\n expect(policy.decision.args).toEqual({\n target: \"/repo/cli/src/shell/registerDevCliCommands.ts\",\n });\n });\n\n it(\"treats pure re-export bridge files as wrappers and follows their implementation path\", () => {\n const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), \"scai-policy-wrapper-followup-\"));\n try {\n const wrapperFile = path.join(tempDir, \"cli\", \"src\", \"agents\", \"agentLoop.ts\");\n const implementationFile = path.join(tempDir, \"cli\", \"src\", \"agent\", \"runtime\", \"runAgentLoop.ts\");\n fs.mkdirSync(path.dirname(wrapperFile), { recursive: true });\n fs.mkdirSync(path.dirname(implementationFile), { recursive: true });\n fs.writeFileSync(wrapperFile, \"export * from \\\"../agent/runtime/runAgentLoop.js\\\";\\n\", \"utf8\");\n fs.writeFileSync(implementationFile, \"export function runAgentLoop() { return true; }\\n\", \"utf8\");\n\n const memory = createAgentMemory(\n \"Explain how agentMemory, agentLoop, agentActions, and agentStateMachine divide responsibilities\",\n tempDir,\n tempDir\n );\n memory.task.normalizedQuery = \"Explain how agentMemory agentLoop agentActions and agentStateMachine divide responsibilities\";\n memory.task.primaryIntent = \"Understand the division of responsibilities among agent runtime components.\";\n memory.task.queryScope = \"multi-file\";\n memory.evidence.candidateFiles = [wrapperFile];\n memory.evidence.fileReads[wrapperFile] = summarizeFileRead(\n wrapperFile,\n \"export * from \\\"../agent/runtime/runAgentLoop.js\\\";\\n\",\n memory.task.normalizedQuery,\n { readMode: \"full\" }\n );\n\n const policy = resolvePolicyState(memory);\n\n expect(policy.loopReview.groundedFiles[0]?.groundingDepth).toBe(\"wrapper\");\n expect(policy.loopReview.referenceFollowupNeeded).toBe(true);\n expect(policy.loopReview.expansionAssessment.shouldExpand).toBe(true);\n expect(policy.loopReview.driftAssessment.status).toBe(\"on-track\");\n expect(policy.loopReview.topUnreadCandidates[0]?.filePath).toBe(implementationFile);\n expect(policy.allowedActions).toContain(\"read-file\");\n expect(policy.decision.nextAction).toBe(\"read-file\");\n expect(policy.decision.args).toEqual({\n target: implementationFile,\n });\n } finally {\n fs.rmSync(tempDir, { recursive: true, force: true });\n }\n });\n\n it(\"allows one config handoff follow-up after the explicit target file is grounded\", () => {\n const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), \"scai-policy-config-handoff-\"));\n try {\n const registerFile = path.join(tempDir, \"cli\", \"src\", \"commands\", \"factory.ts\");\n const runtimeFile = path.join(tempDir, \"cli\", \"src\", \"utils\", \"runQueryWithDaemonControl.ts\");\n fs.mkdirSync(path.dirname(registerFile), { recursive: true });\n fs.mkdirSync(path.dirname(runtimeFile), { recursive: true });\n const registerContent = [\n \"import { runQueryWithDaemonControl } from '../utils/runQueryWithDaemonControl.js';\",\n \"cmd.command('ask').action(runQueryWithDaemonControl);\",\n \"\",\n ].join(\"\\n\");\n fs.writeFileSync(registerFile, registerContent, \"utf8\");\n fs.writeFileSync(runtimeFile, \"export async function runQueryWithDaemonControl() { return true; }\\n\", \"utf8\");\n\n const memory = createAgentMemory(\n \"Explain how factory.ts configures query execution.\",\n tempDir,\n tempDir\n );\n memory.task.normalizedQuery = \"Explain how factory.ts configures query execution\";\n memory.task.primaryIntent = \"Understand the CLI command wiring and configuration handoff into query execution.\";\n memory.task.explicitTargets = [registerFile];\n memory.evidence.candidateFiles = [runtimeFile];\n memory.evidence.fileReads[registerFile] = summarizeFileRead(\n registerFile,\n registerContent,\n memory.task.normalizedQuery,\n { readMode: \"full\" }\n );\n memory.evidence.fileReads[registerFile].role = \"primary\";\n\n const policy = resolvePolicyState(memory);\n\n expect(policy.loopReview.targetCoverage.allExplicitTargetsGrounded).toBe(true);\n expect(policy.loopReview.expansionAssessment.shouldExpand).toBe(true);\n expect(policy.loopReview.expansionAssessment.bestCandidatePath).toBe(runtimeFile);\n expect(policy.loopReview.driftAssessment.status).toBe(\"on-track\");\n expect(policy.decision.nextAction).toBe(\"read-file\");\n expect(policy.decision.args).toEqual({\n target: runtimeFile,\n });\n } finally {\n fs.rmSync(tempDir, { recursive: true, force: true });\n }\n });\n\n it(\"marks generic owner chasing as drift once requested targets are already covered\", () => {\n const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), \"scai-policy-drift-\"));\n try {\n const indexFile = path.join(tempDir, \"cli\", \"src\", \"index.ts\");\n const factoryFile = path.join(tempDir, \"cli\", \"src\", \"commands\", \"factory.ts\");\n const genericOwnerOne = path.join(tempDir, \"cli\", \"src\", \"agent\", \"state\", \"index.ts\");\n const genericOwnerTwo = path.join(tempDir, \"cli\", \"src\", \"agent\", \"runtime\", \"index.ts\");\n const unreadOwner = path.join(tempDir, \"cli\", \"src\", \"agent\", \"feedback\", \"index.ts\");\n fs.mkdirSync(path.dirname(factoryFile), { recursive: true });\n fs.mkdirSync(path.dirname(genericOwnerOne), { recursive: true });\n fs.mkdirSync(path.dirname(genericOwnerTwo), { recursive: true });\n fs.mkdirSync(path.dirname(unreadOwner), { recursive: true });\n fs.writeFileSync(indexFile, \"export function main() {}\\n\", \"utf8\");\n fs.writeFileSync(factoryFile, \"export function createProgram() {}\\n\", \"utf8\");\n fs.writeFileSync(genericOwnerOne, \"export function createState() {}\\n\", \"utf8\");\n fs.writeFileSync(genericOwnerTwo, \"export function runLoop() {}\\n\", \"utf8\");\n fs.writeFileSync(unreadOwner, \"export function continueTask() {}\\n\", \"utf8\");\n\n const memory = createAgentMemory(\n \"Summarize CLI architecture from index.ts and factory.ts.\",\n tempDir,\n tempDir\n );\n memory.task.normalizedQuery = \"Summarize CLI architecture from index.ts and factory.ts\";\n memory.task.primaryIntent = \"Summarize CLI architecture from the requested files.\";\n memory.task.explicitTargets = [indexFile, factoryFile];\n memory.evidence.candidateFiles = [unreadOwner];\n memory.evidence.fileReads[indexFile] = summarizeFileRead(\n indexFile,\n \"export function main() {}\\n\",\n memory.task.normalizedQuery,\n { readMode: \"full\" }\n );\n memory.evidence.fileReads[factoryFile] = summarizeFileRead(\n factoryFile,\n \"export function createProgram() {}\\n\",\n memory.task.normalizedQuery,\n { readMode: \"full\" }\n );\n memory.evidence.fileReads[genericOwnerOne] = {\n ...summarizeFileRead(genericOwnerOne, \"export function createState() {}\\n\", memory.task.normalizedQuery, { readMode: \"full\" }),\n recordedAt: \"2026-05-25T07:00:00.000+02:00\",\n };\n memory.evidence.fileReads[genericOwnerTwo] = {\n ...summarizeFileRead(genericOwnerTwo, \"export function runLoop() {}\\n\", memory.task.normalizedQuery, { readMode: \"full\" }),\n recordedAt: \"2026-05-25T07:01:00.000+02:00\",\n };\n memory.evidence.fileReads[indexFile].recordedAt = \"2026-05-25T06:58:00.000+02:00\";\n memory.evidence.fileReads[factoryFile].recordedAt = \"2026-05-25T06:59:00.000+02:00\";\n\n const policy = resolvePolicyState(memory);\n\n expect(policy.loopReview.targetCoverage.allExplicitTargetsGrounded).toBe(true);\n expect(policy.loopReview.recentProgress.stalled).toBe(true);\n expect(policy.loopReview.expansionAssessment.shouldExpand).toBe(false);\n expect(policy.loopReview.driftAssessment.status).toBe(\"hard-drift\");\n expect(policy.decision.stop === \"final-answer\" || policy.decision.nextAction === \"plan\").toBe(true);\n } finally {\n fs.rmSync(tempDir, { recursive: true, force: true });\n }\n });\n\n it(\"classifies real implementation files as direct grounding\", () => {\n const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), \"scai-policy-direct-grounding-\"));\n try {\n const targetFile = path.join(tempDir, \"cli\", \"src\", \"agent\", \"runtime\", \"runAgentLoop.ts\");\n fs.mkdirSync(path.dirname(targetFile), { recursive: true });\n fs.writeFileSync(targetFile, \"export function runAgentLoop() { return true; }\\n\", \"utf8\");\n\n const memory = createAgentMemory(\"Explain runAgentLoop\", tempDir, tempDir);\n memory.task.normalizedQuery = \"Explain runAgentLoop\";\n memory.task.primaryIntent = \"Explain the agent loop implementation.\";\n memory.evidence.fileReads[targetFile] = summarizeFileRead(\n targetFile,\n \"export function runAgentLoop() { return true; }\\n\",\n memory.task.normalizedQuery,\n { readMode: \"full\" }\n );\n\n const policy = resolvePolicyState(memory);\n\n expect(policy.loopReview.groundedFiles[0]?.groundingDepth).toBe(\"direct\");\n } finally {\n fs.rmSync(tempDir, { recursive: true, force: true });\n }\n });\n\n it(\"classifies bridge files with real logic as mixed grounding\", () => {\n const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), \"scai-policy-mixed-grounding-\"));\n try {\n const targetFile = path.join(tempDir, \"cli\", \"src\", \"agents\", \"agentActions.ts\");\n fs.mkdirSync(path.dirname(targetFile), { recursive: true });\n fs.writeFileSync(\n targetFile,\n \"export * from \\\"../agent/actions/index.js\\\";\\nexport function explainActions() { return true; }\\n\",\n \"utf8\"\n );\n\n const memory = createAgentMemory(\"Explain agentActions\", tempDir, tempDir);\n memory.task.normalizedQuery = \"Explain agentActions\";\n memory.task.primaryIntent = \"Explain the agent actions module.\";\n memory.evidence.fileReads[targetFile] = {\n filePath: targetFile,\n readMode: \"full\",\n summary: \"Bridge file with one direct helper.\",\n snippets: [\n \"1: export * from \\\"../agent/actions/index.js\\\";\",\n \"2: export function explainActions() { return true; }\",\n ],\n keySymbols: [\"explainActions\"],\n matchedTerms: [\"agentactions\"],\n relevanceExplanation: \"This bridge file re-exports action helpers and still defines one local helper.\",\n relevantContext: [{ kind: \"purpose\", text: \"Bridge file with one direct helper.\" }],\n recordedAt: new Date(0).toISOString(),\n };\n\n const policy = resolvePolicyState(memory);\n\n expect(policy.loopReview.groundedFiles[0]?.groundingDepth).toBe(\"mixed\");\n } finally {\n fs.rmSync(tempDir, { recursive: true, force: true });\n }\n });\n\n it(\"allows broad repo answers to stop once representative grounded coverage exists\", () => {\n const memory = createAgentMemory(\"summarize this repo architecture and identify weak coupling points\", \"/repo\", \"/repo\");\n memory.task.normalizedQuery = \"summarize this repo architecture and identify weak coupling points\";\n memory.task.primaryIntent = \"Summarize repo architecture and weak coupling points.\";\n memory.task.queryScope = \"broad-repo\";\n memory.evidence.candidateFiles = [\n \"/repo/cli/src/index.ts\",\n \"/repo/cli/src/MainAgent.ts\",\n ];\n memory.evidence.candidateMetadata = {\n \"/repo/cli/src/index.ts\": {\n searchScore: 0.9,\n readPriority: 0.9,\n searchReasons: [\"path-anchor\", \"symbol:main\"],\n },\n \"/repo/cli/src/MainAgent.ts\": {\n searchScore: 0.88,\n readPriority: 0.88,\n searchReasons: [\"path-anchor\", \"symbol:MainAgent\"],\n },\n };\n memory.evidence.fileReads[\"/repo/cli/src/index.ts\"] = {\n filePath: \"/repo/cli/src/index.ts\",\n readMode: \"full\",\n summary: \"Main CLI entrypoint.\",\n snippets: [\"main\"],\n keySymbols: [\"main\"],\n matchedTerms: [\"repo\", \"architecture\"],\n relevanceExplanation: \"This file owns the CLI entrypoint.\",\n relevantContext: [{ kind: \"purpose\", text: \"Main CLI entrypoint and runtime bootstrap.\" }],\n recordedAt: new Date(0).toISOString(),\n role: \"primary\",\n };\n memory.evidence.fileReads[\"/repo/cli/src/MainAgent.ts\"] = {\n filePath: \"/repo/cli/src/MainAgent.ts\",\n readMode: \"full\",\n summary: \"Main agent orchestrator.\",\n snippets: [\"MainAgent\"],\n keySymbols: [\"MainAgent\"],\n matchedTerms: [\"architecture\", \"coupling\"],\n relevanceExplanation: \"This file owns the main orchestration layer.\",\n relevantContext: [{ kind: \"purpose\", text: \"Owns agent orchestration and persistence flow.\" }],\n recordedAt: new Date(0).toISOString(),\n role: \"primary\",\n };\n\n const policy = resolvePolicyState(memory);\n\n expect(policy.loopReview.queryShape).toBe(\"broad-repo\");\n expect(policy.loopReview.stopAssessment.canStop).toBe(true);\n expect(policy.allowedActions).toContain(\"final-answer\");\n expect(policy.decision.stop).toBe(\"final-answer\");\n });\n\n it(\"treats quoted snippet asks as search-guided instead of asking the user\", () => {\n const memory = createAgentMemory(\n \"\\\"const currentQuestionId = currentStep.questionId ?? (orderedQuestions.length === 1 ? orderedQuestions[0].id : undefined);\\\"\",\n \"/repo\",\n \"/repo\"\n );\n memory.task.normalizedQuery = \"Extract current question ID from current step or ordered questions array\";\n memory.task.primaryIntent = \"Understand variable assignment logic for current question ID\";\n memory.task.queryScope = \"targeted\";\n\n const policy = resolvePolicyState(memory, { forcedEnd: true });\n\n expect(policy.shouldAskUser).toBe(false);\n expect(policy.allowedActions).toContain(\"search-db\");\n expect(policy.allowedActions).not.toContain(\"search-regex\");\n expect(policy.allowedActions).not.toContain(\"request-user-input\");\n expect(policy.decision.args).toEqual({\n query: \"\\\"const currentQuestionId = currentStep.questionId ?? (orderedQuestions.length === 1 ? orderedQuestions[0].id : undefined);\\\"\",\n });\n });\n\n it(\"keeps explicit file targets on the direct read path instead of bootstrap search\", () => {\n const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), \"scai-policy-explicit-file-\"));\n try {\n const targetFile = path.join(tempDir, \"MainAgent.ts\");\n fs.writeFileSync(targetFile, \"export class MainAgent {}\\n\", \"utf8\");\n\n const memory = createAgentMemory(\"Explain MainAgent.ts\", tempDir, tempDir);\n memory.task.normalizedQuery = \"Explain MainAgent.ts\";\n memory.task.primaryIntent = \"Explain the MainAgent file.\";\n memory.task.queryScope = \"targeted\";\n memory.task.explicitTargets = [\"MainAgent.ts\"];\n\n const policy = resolvePolicyState(memory);\n\n expect(policy.shouldAskUser).toBe(false);\n expect(policy.allowedActions).toContain(\"read-file\");\n expect(policy.allowedActions).not.toContain(\"request-user-input\");\n expect(policy.decision.nextAction).toBe(\"read-file\");\n expect(policy.decision.args).toEqual({\n target: targetFile,\n });\n } finally {\n fs.rmSync(tempDir, { recursive: true, force: true });\n }\n });\n\n it(\"keeps regex-like queries on the regex-guided path instead of bootstrap search\", () => {\n const memory = createAgentMemory(\"search for pattern runSearch|semanticSearchFiles|plannerSearchFiles\", \"/repo\", \"/repo\");\n memory.task.normalizedQuery = \"search for pattern runSearch|semanticSearchFiles|plannerSearchFiles\";\n memory.task.primaryIntent = \"Find search helpers that match an operator pattern.\";\n memory.task.queryScope = \"targeted\";\n\n const policy = resolvePolicyState(memory, { forcedEnd: true });\n\n expect(policy.shouldAskUser).toBe(false);\n expect(policy.allowedActions).toContain(\"search-db\");\n expect(policy.allowedActions).toContain(\"search-regex\");\n expect(policy.allowedActions).not.toContain(\"request-user-input\");\n expect(policy.decision.nextAction).toBe(\"search-regex\");\n });\n\n it(\"prefers triage-file over request-user-input when search returned useful matches\", () => {\n const candidateFiles = [\n \"/repo/cli/src/agent/state/memory.ts\",\n \"/repo/cli/src/agent/runtime/runAgentLoop.ts\",\n \"/repo/cli/src/agent/policy/index.ts\",\n \"/repo/cli/src/agent/search/semantic.ts\",\n ];\n const memory = createAgentMemory(\"where do I set the max count for how many loops the agent can run?\", \"/repo\", \"/repo\");\n memory.task.normalizedQuery = \"where do I set the max count for how many loops the agent can run\";\n memory.task.primaryIntent = \"Find the owner for the simple agent turn limit.\";\n memory.task.queryScope = \"broad-repo\";\n memory.evidence.candidateFiles = [...candidateFiles];\n memory.evidence.candidateMetadata = Object.fromEntries(candidateFiles.map((filePath, index) => [filePath, {\n searchScore: 20 - index,\n searchReasons: [\"query-match\"],\n }]));\n memory.evidence.searches.push({\n action: \"search-db\",\n query: \"agent loop limit configuration max count\",\n filePaths: [...candidateFiles],\n topHits: candidateFiles.map((filePath, index) => ({\n filePath,\n score: 20 - index,\n reasons: [\"query-match\"],\n })),\n matches: [{\n filePath: candidateFiles[0],\n line: 40,\n column: 7,\n snippet: \"maxTurns: 12,\",\n matchKind: \"semantic-content\",\n reasons: [\"term:max\"],\n }],\n recordedAt: new Date(0).toISOString(),\n });\n\n const policy = resolvePolicyState(memory, { forcedEnd: true });\n\n expect(policy.shouldAskUser).toBe(false);\n expect(policy.allowedActions).toContain(\"triage-file\");\n expect(policy.allowedActions).not.toContain(\"request-user-input\");\n expect(policy.decision.nextAction).toBe(\"triage-file\");\n });\n\n it(\"prefers search-list-directory first for an absolute resolved folder target\", () => {\n const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), \"scai-policy-folder-absolute-\"));\n try {\n const guardsDir = path.join(tempDir, \"cli\", \"src\", \"agents\", \"guards\");\n const resolverFile = path.join(guardsDir, \"executionPolicyResolver.ts\");\n fs.mkdirSync(guardsDir, { recursive: true });\n fs.writeFileSync(resolverFile, \"export const resolver = true;\\n\", \"utf8\");\n\n const memory = createAgentMemory(guardsDir, tempDir, tempDir);\n memory.task.normalizedQuery = guardsDir;\n memory.task.primaryIntent = \"Examine the guards directory.\";\n memory.task.queryScope = \"targeted\";\n memory.task.explicitTargets = [guardsDir];\n\n const policy = resolvePolicyState(memory);\n\n expect(policy.allowedActions).toContain(\"search-list-directory\");\n expect(policy.decision.nextAction).toBe(\"search-list-directory\");\n expect(policy.decision.args).toEqual({\n folderPath: guardsDir,\n });\n expect(policy.allowedActions).not.toContain(\"final-answer\");\n } finally {\n fs.rmSync(tempDir, { recursive: true, force: true });\n }\n });\n\n it(\"moves from folder listing to file reads after one successful listing\", () => {\n const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), \"scai-policy-folder-progress-\"));\n try {\n const guardsDir = path.join(tempDir, \"cli\", \"src\", \"agents\", \"guards\");\n const firstFile = path.join(guardsDir, \"executionPolicyResolver.ts\");\n const secondFile = path.join(guardsDir, \"runnerGate.ts\");\n fs.mkdirSync(guardsDir, { recursive: true });\n fs.writeFileSync(firstFile, \"export const resolver = true;\\n\", \"utf8\");\n fs.writeFileSync(secondFile, \"export const gate = true;\\n\", \"utf8\");\n\n const memory = createAgentMemory(guardsDir, tempDir, tempDir);\n memory.task.normalizedQuery = guardsDir;\n memory.task.primaryIntent = \"Examine the guards directory.\";\n memory.task.queryScope = \"targeted\";\n memory.task.explicitTargets = [guardsDir];\n memory.evidence.searches.push({\n action: \"search-list-directory\",\n query: guardsDir,\n filePaths: [],\n directoryPath: guardsDir,\n directoryEntries: [\n { name: \"executionPolicyResolver.ts\", kind: \"file\" },\n { name: \"runnerGate.ts\", kind: \"file\" },\n ],\n summary: `Contents of ${guardsDir}`,\n recordedAt: new Date(0).toISOString(),\n });\n\n const policy = resolvePolicyState(memory);\n\n expect(policy.decision.nextAction).toBe(\"read-file\");\n expect(policy.allowedActions).toContain(\"read-file\");\n expect(policy.decision.args).toEqual({\n target: firstFile,\n });\n } finally {\n fs.rmSync(tempDir, { recursive: true, force: true });\n }\n });\n\n it(\"does not treat a failed folder listing as useful listing progress\", () => {\n const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), \"scai-policy-folder-failure-\"));\n try {\n const executionPath = path.join(tempDir, \"cli\", \"src\");\n const guardsDir = path.join(executionPath, \"agents\", \"guards\");\n fs.mkdirSync(guardsDir, { recursive: true });\n fs.writeFileSync(path.join(guardsDir, \"executionPolicyResolver.ts\"), \"export const resolver = true;\\n\", \"utf8\");\n\n const memory = createAgentMemory(\"List agents/guards\", tempDir, executionPath);\n memory.task.normalizedQuery = \"List agents/guards\";\n memory.task.primaryIntent = \"Examine the guards directory.\";\n memory.task.queryScope = \"targeted\";\n memory.task.explicitTargets = [\"agents/guards\"];\n memory.evidence.searches.push({\n action: \"search-list-directory\",\n query: \"agents/guards\",\n filePaths: [],\n summary: \"Could not resolve a folder to list.\",\n failure: {\n status: \"failed\",\n failureClass: \"scope-missing\",\n message: \"Could not resolve a folder to list.\",\n },\n recordedAt: new Date(0).toISOString(),\n });\n\n const policy = resolvePolicyState(memory);\n\n expect(policy.hasUsefulEvidence).toBe(false);\n expect(policy.decision.nextAction).toBe(\"search-list-directory\");\n expect(policy.decision.args).toEqual({\n folderPath: guardsDir,\n });\n expect(policy.allowedActions).not.toContain(\"final-answer\");\n } finally {\n fs.rmSync(tempDir, { recursive: true, force: true });\n }\n });\n\n it(\"stops re-listing after one successful listing for a relative folder target\", () => {\n const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), \"scai-policy-folder-relative-progress-\"));\n try {\n const executionPath = path.join(tempDir, \"cli\", \"src\");\n const guardsDir = path.join(executionPath, \"agents\", \"guards\");\n const firstFile = path.join(guardsDir, \"executionPolicyResolver.ts\");\n const secondFile = path.join(guardsDir, \"runnerGate.ts\");\n fs.mkdirSync(guardsDir, { recursive: true });\n fs.writeFileSync(firstFile, \"export const resolver = true;\\n\", \"utf8\");\n fs.writeFileSync(secondFile, \"export const gate = true;\\n\", \"utf8\");\n\n const memory = createAgentMemory(\"List agents/guards\", tempDir, executionPath);\n memory.task.normalizedQuery = \"List agents/guards\";\n memory.task.primaryIntent = \"Examine the guards directory.\";\n memory.task.queryScope = \"targeted\";\n memory.task.explicitTargets = [\"agents/guards\"];\n memory.evidence.searches.push({\n action: \"search-list-directory\",\n query: guardsDir,\n filePaths: [],\n directoryPath: guardsDir,\n directoryEntries: [\n { name: \"executionPolicyResolver.ts\", kind: \"file\" },\n { name: \"runnerGate.ts\", kind: \"file\" },\n ],\n summary: `Contents of ${guardsDir}`,\n recordedAt: new Date(0).toISOString(),\n });\n\n const policy = resolvePolicyState(memory);\n\n expect(policy.allowedActions).toContain(\"read-file\");\n expect(policy.decision.nextAction).toBe(\"read-file\");\n expect(policy.decision.nextAction).not.toBe(\"search-list-directory\");\n } finally {\n fs.rmSync(tempDir, { recursive: true, force: true });\n }\n });\n\n it(\"asks for user input before reading when an explicit filename stays ambiguous\", () => {\n const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), \"scai-policy-ambiguous-file-\"));\n try {\n const cliReadme = path.join(tempDir, \"cli\", \"README.md\");\n const docsReadme = path.join(tempDir, \"docs\", \"README.md\");\n fs.mkdirSync(path.dirname(cliReadme), { recursive: true });\n fs.mkdirSync(path.dirname(docsReadme), { recursive: true });\n fs.writeFileSync(cliReadme, \"# CLI\\n\", \"utf8\");\n fs.writeFileSync(docsReadme, \"# Docs\\n\", \"utf8\");\n\n const memory = createAgentMemory(\"Explain README.md\", tempDir, tempDir);\n memory.task.normalizedQuery = \"Explain README.md\";\n memory.task.primaryIntent = \"Explain one README file.\";\n memory.task.explicitTargets = [\"README.md\"];\n memory.evidence.candidateFiles = [cliReadme, docsReadme];\n memory.evidence.candidateMetadata = {\n [cliReadme]: { searchReasons: [\"exact-basename:readmemd\"] },\n [docsReadme]: { searchReasons: [\"exact-basename:readmemd\"] },\n };\n\n const policy = resolvePolicyState(memory, { forcedEnd: true });\n\n expect(policy.shouldAskUser).toBe(true);\n expect(policy.allowedActions).toEqual([\"request-user-input\"]);\n expect(policy.allowedActions).not.toContain(\"read-file\");\n expect(policy.allowedActions).not.toContain(\"plan\");\n expect(policy.allowedActions).not.toContain(\"search-db\");\n expect(policy.endDecision?.action).toBe(\"request-user-input\");\n expect(policy.primaryAmbiguousTarget).toMatchObject({\n target: \"README.md\",\n candidates: [cliReadme, docsReadme],\n });\n } finally {\n fs.rmSync(tempDir, { recursive: true, force: true });\n }\n });\n\n it(\"does not allow final-answer from search-only evidence for structure questions\", () => {\n const memory = createAgentMemory(\"Explain how agentLoop and agentActions divide responsibilities\", \"/repo\", \"/repo\");\n memory.task.normalizedQuery = \"Explain how agentLoop and agentActions divide responsibilities\";\n memory.task.primaryIntent = \"Explain component responsibilities.\";\n memory.task.queryScope = \"multi-file\";\n memory.evidence.searches.push({\n action: \"search-db\",\n query: \"agentLoop agentActions responsibilities\",\n filePaths: [\"/repo/cli/src/agents/agentLoop.ts\"],\n topHits: [{\n filePath: \"/repo/cli/src/agents/agentLoop.ts\",\n score: 55,\n reasons: [\"path-anchor\"],\n }],\n bestScore: 55,\n recordedAt: \"2026-05-03T10:00:00.000+02:00\",\n });\n memory.evidence.candidateFiles.push(\"/repo/cli/src/agents/agentLoop.ts\");\n\n const policy = resolvePolicyState(memory, { forcedEnd: true });\n\n expect(policy.hasUsefulEvidence).toBe(false);\n expect(policy.allowedActions).toContain(\"read-file\");\n expect(policy.allowedActions).not.toContain(\"final-answer\");\n expect(resolveNextReadTarget(memory)).toBe(\"/repo/cli/src/agents/agentLoop.ts\");\n });\n\n it(\"allows final-answer after one grounded candidate read when no explicit targets exist\", () => {\n const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), \"scai-policy-grounded-\"));\n try {\n const targetFile = path.join(tempDir, \"agentLoop.ts\");\n fs.writeFileSync(targetFile, \"export function runAgentLoop() {}\\n\", \"utf8\");\n const memory = createAgentMemory(\"Explain how agentLoop works\", tempDir, tempDir);\n memory.task.normalizedQuery = \"Explain how agentLoop works\";\n memory.task.primaryIntent = \"Explain agentLoop.\";\n memory.evidence.candidateFiles = [targetFile];\n memory.evidence.fileReads[targetFile] = summarizeFileRead(\n targetFile,\n \"export function runAgentLoop() {}\\n\",\n memory.task.normalizedQuery\n );\n\n const policy = resolvePolicyState(memory, { forcedEnd: true });\n\n expect(policy.hasGroundedEvidence).toBe(true);\n expect(policy.hasUsefulEvidence).toBe(true);\n expect(policy.allowedActions).toContain(\"final-answer\");\n expect(policy.endDecision?.action).toBe(\"final-answer\");\n } finally {\n fs.rmSync(tempDir, { recursive: true, force: true });\n }\n });\n\n it(\"requires all resolvable explicit targets before final-answer becomes legal\", () => {\n const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), \"scai-policy-explicit-\"));\n try {\n const firstFile = path.join(tempDir, \"index.ts\");\n const secondFile = path.join(tempDir, \"factory.ts\");\n fs.writeFileSync(firstFile, \"export function runCli() {}\\n\", \"utf8\");\n fs.writeFileSync(secondFile, \"export function createFactory() {}\\n\", \"utf8\");\n\n const memory = createAgentMemory(\"Explain both files\", tempDir, tempDir);\n memory.task.normalizedQuery = \"Explain both files\";\n memory.task.primaryIntent = \"Explain both files.\";\n memory.task.explicitTargets = [firstFile, secondFile];\n memory.evidence.fileReads[firstFile] = summarizeFileRead(firstFile, \"export function runCli() {}\\n\", memory.task.normalizedQuery);\n\n const policy = resolvePolicyState(memory);\n\n expect(policy.allowedActions).toContain(\"read-file\");\n expect(policy.allowedActions).not.toContain(\"final-answer\");\n expect(resolveNextReadTarget(memory)).toBe(secondFile);\n } finally {\n fs.rmSync(tempDir, { recursive: true, force: true });\n }\n });\n\n it(\"removes read-file once all explicit targets have been read\", () => {\n const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), \"scai-policy-read-\"));\n try {\n const targetFile = path.join(tempDir, \"index.ts\");\n fs.writeFileSync(targetFile, \"export function runCli() {}\\n\", \"utf8\");\n const memory = createAgentMemory(`Explain ${targetFile}`, tempDir, tempDir);\n memory.task.normalizedQuery = `Explain ${targetFile}`;\n memory.task.primaryIntent = \"Explain the CLI entry file.\";\n memory.task.explicitTargets = [targetFile];\n memory.evidence.fileReads[targetFile] = summarizeFileRead(targetFile, \"export function runCli() {}\\n\", memory.task.normalizedQuery);\n\n const policy = resolvePolicyState(memory);\n\n expect(policy.allowedActions).not.toContain(\"read-file\");\n expect(policy.allowedActions).toContain(\"final-answer\");\n } finally {\n fs.rmSync(tempDir, { recursive: true, force: true });\n }\n });\n\n it(\"dedupes absolute-path aliases for the same explicit file\", () => {\n const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), \"scai-policy-alias-\"));\n try {\n const targetFile = path.join(tempDir, \"index.ts\");\n fs.writeFileSync(targetFile, \"export function runCli() {}\\n\", \"utf8\");\n const strippedAlias = targetFile.replace(/^\\//, \"\");\n const memory = createAgentMemory(`Explain ${targetFile}`, tempDir, tempDir);\n memory.task.normalizedQuery = `Explain ${targetFile}`;\n memory.task.primaryIntent = \"Explain the CLI entry file.\";\n memory.task.explicitTargets = [targetFile, strippedAlias];\n memory.evidence.fileReads[targetFile] = summarizeFileRead(targetFile, \"export function runCli() {}\\n\", memory.task.normalizedQuery);\n\n const policy = resolvePolicyState(memory);\n\n expect(policy.allowedActions).toContain(\"final-answer\");\n expect(policy.allowedActions).not.toContain(\"read-file\");\n expect(policy.reason).toContain(\"grounded reads\");\n } finally {\n fs.rmSync(tempDir, { recursive: true, force: true });\n }\n });\n\n it(\"uses triage before promoting broad candidate sets into full reads\", () => {\n const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), \"scai-policy-candidates-\"));\n try {\n const files = [\"a.ts\", \"b.ts\", \"c.ts\", \"d.ts\"].map((name) => path.join(tempDir, name));\n files.forEach((filePath, index) => {\n fs.writeFileSync(filePath, `export const value${index} = ${index};\\n`, \"utf8\");\n });\n\n const memory = createAgentMemory(\"Explain the runtime flow\", tempDir, tempDir);\n memory.task.normalizedQuery = \"Explain the runtime flow\";\n memory.task.primaryIntent = \"Explain the runtime flow.\";\n memory.task.queryScope = \"broad-repo\";\n memory.evidence.candidateFiles = files;\n\n const initialPolicy = resolvePolicyState(memory);\n expect(initialPolicy.allowedActions).toContain(\"triage-file\");\n expect(initialPolicy.allowedActions).not.toContain(\"read-file\");\n expect(resolveNextTriageTarget(memory)).toBe(files[0]);\n\n memory.evidence.fileReads[files[0]] = summarizeFileRead(\n files[0],\n \"export const value0 = 0;\\n\",\n memory.task.normalizedQuery,\n { readMode: \"triage\" }\n );\n expect(resolveNextTriageTarget(memory)).toBe(files[1]);\n expect(resolveNextReadTarget(memory)).toBeUndefined();\n\n memory.evidence.fileReads[files[1]] = summarizeFileRead(\n files[1],\n \"export const value1 = 1;\\n\",\n memory.task.normalizedQuery,\n { readMode: \"triage\" }\n );\n const promotedPolicy = resolvePolicyState(memory);\n expect(resolveNextReadTarget(memory)).toBe(files[0]);\n expect(promotedPolicy.allowedActions).toContain(\"read-file\");\n expect(promotedPolicy.allowedActions).not.toContain(\"triage-file\");\n } finally {\n fs.rmSync(tempDir, { recursive: true, force: true });\n }\n });\n\n it(\"requires more than one grounded read for multi-target explanations\", () => {\n const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), \"scai-policy-multi-target-\"));\n try {\n const firstFile = path.join(tempDir, \"first.ts\");\n const secondFile = path.join(tempDir, \"second.ts\");\n fs.writeFileSync(firstFile, \"export const first = true;\\n\", \"utf8\");\n fs.writeFileSync(secondFile, \"export const second = true;\\n\", \"utf8\");\n\n const memory = createAgentMemory(\"Compare first.ts and second.ts\", tempDir, tempDir);\n memory.task.normalizedQuery = \"Compare first.ts and second.ts\";\n memory.task.primaryIntent = \"Compare two concrete files.\";\n memory.task.explicitTargets = [firstFile, secondFile];\n memory.evidence.fileReads[firstFile] = summarizeFileRead(\n firstFile,\n \"export const first = true;\\n\",\n memory.task.normalizedQuery,\n { readMode: \"full\" }\n );\n\n const incompletePolicy = resolvePolicyState(memory);\n expect(incompletePolicy.hasUsefulEvidence).toBe(false);\n expect(incompletePolicy.allowedActions).toContain(\"read-file\");\n\n memory.evidence.fileReads[secondFile] = summarizeFileRead(\n secondFile,\n \"export const second = true;\\n\",\n memory.task.normalizedQuery,\n { readMode: \"full\" }\n );\n\n const completePolicy = resolvePolicyState(memory);\n expect(completePolicy.hasUsefulEvidence).toBe(true);\n expect(completePolicy.allowedActions).toContain(\"final-answer\");\n } finally {\n fs.rmSync(tempDir, { recursive: true, force: true });\n }\n });\n\n it(\"requires every explicit target for three-file explanations before final-answer\", () => {\n const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), \"scai-policy-three-targets-\"));\n try {\n const firstFile = path.join(tempDir, \"first.ts\");\n const secondFile = path.join(tempDir, \"second.ts\");\n const thirdFile = path.join(tempDir, \"third.ts\");\n fs.writeFileSync(firstFile, \"export const first = true;\\n\", \"utf8\");\n fs.writeFileSync(secondFile, \"export const second = true;\\n\", \"utf8\");\n fs.writeFileSync(thirdFile, \"export const third = true;\\n\", \"utf8\");\n\n const memory = createAgentMemory(\"Explain first.ts second.ts and third.ts\", tempDir, tempDir);\n memory.task.normalizedQuery = \"Explain first.ts second.ts and third.ts\";\n memory.task.primaryIntent = \"Explain three concrete files.\";\n memory.task.explicitTargets = [firstFile, secondFile, thirdFile];\n memory.evidence.fileReads[firstFile] = summarizeFileRead(\n firstFile,\n \"export const first = true;\\n\",\n memory.task.normalizedQuery,\n { readMode: \"full\" }\n );\n memory.evidence.fileReads[secondFile] = summarizeFileRead(\n secondFile,\n \"export const second = true;\\n\",\n memory.task.normalizedQuery,\n { readMode: \"full\" }\n );\n\n const incompletePolicy = resolvePolicyState(memory);\n expect(incompletePolicy.hasUsefulEvidence).toBe(false);\n expect(incompletePolicy.allowedActions).toContain(\"read-file\");\n expect(incompletePolicy.allowedActions).not.toContain(\"final-answer\");\n expect(resolveNextReadTarget(memory)).toBe(thirdFile);\n\n memory.evidence.fileReads[thirdFile] = summarizeFileRead(\n thirdFile,\n \"export const third = true;\\n\",\n memory.task.normalizedQuery,\n { readMode: \"full\" }\n );\n\n const completePolicy = resolvePolicyState(memory);\n expect(completePolicy.hasUsefulEvidence).toBe(true);\n expect(completePolicy.allowedActions).toContain(\"final-answer\");\n } finally {\n fs.rmSync(tempDir, { recursive: true, force: true });\n }\n });\n\n it(\"treats resolved folder targets as structured scope and requires their grounded reads\", () => {\n const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), \"scai-policy-folder-target-\"));\n try {\n const guardsDir = path.join(tempDir, \"cli\", \"src\", \"agents\", \"guards\");\n const executionPolicyFile = path.join(guardsDir, \"executionPolicyResolver.ts\");\n const guardStateFile = path.join(guardsDir, \"guardState.ts\");\n const progressFile = path.join(guardsDir, \"resolveProgressState.ts\");\n fs.mkdirSync(guardsDir, { recursive: true });\n fs.writeFileSync(executionPolicyFile, \"export const policy = true;\\n\", \"utf8\");\n fs.writeFileSync(guardStateFile, \"export const guard = true;\\n\", \"utf8\");\n fs.writeFileSync(progressFile, \"export const progress = true;\\n\", \"utf8\");\n\n const memory = createAgentMemory(\"check agents/guards\", tempDir, tempDir);\n memory.task.normalizedQuery = \"check agents guards\";\n memory.task.primaryIntent = \"Check the agents guards scope.\";\n memory.task.explicitTargets = [\"agents/guards\"];\n memory.evidence.candidateFiles = [executionPolicyFile, guardStateFile, progressFile];\n\n const initialPolicy = resolvePolicyState(memory);\n expect(initialPolicy.allowedActions).toContain(\"read-file\");\n expect(initialPolicy.allowedActions).not.toContain(\"final-answer\");\n expect(resolveNextReadTarget(memory)).toBe(executionPolicyFile);\n\n memory.evidence.fileReads[executionPolicyFile] = summarizeFileRead(\n executionPolicyFile,\n \"export const policy = true;\\n\",\n memory.task.normalizedQuery,\n { readMode: \"full\" }\n );\n memory.evidence.fileReads[guardStateFile] = summarizeFileRead(\n guardStateFile,\n \"export const guard = true;\\n\",\n memory.task.normalizedQuery,\n { readMode: \"full\" }\n );\n\n const incompletePolicy = resolvePolicyState(memory);\n expect(incompletePolicy.allowedActions).toContain(\"read-file\");\n expect(incompletePolicy.allowedActions).not.toContain(\"final-answer\");\n\n memory.evidence.fileReads[progressFile] = summarizeFileRead(\n progressFile,\n \"export const progress = true;\\n\",\n memory.task.normalizedQuery,\n { readMode: \"full\" }\n );\n\n const completePolicy = resolvePolicyState(memory);\n expect(completePolicy.hasUsefulEvidence).toBe(true);\n expect(completePolicy.allowedActions).toContain(\"final-answer\");\n expect(completePolicy.reason).toContain(\"folder\");\n } finally {\n fs.rmSync(tempDir, { recursive: true, force: true });\n }\n });\n\n it(\"requires multi-file grounding for exact-target basename frontiers before final-answer\", () => {\n const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), \"scai-policy-exact-target-frontier-\"));\n try {\n const guardsDir = path.join(tempDir, \"cli\", \"src\", \"agents\", \"guards\");\n const executionPolicyFile = path.join(guardsDir, \"executionPolicyResolver.ts\");\n const guardStateFile = path.join(guardsDir, \"guardState.ts\");\n const progressFile = path.join(guardsDir, \"resolveProgressState.ts\");\n fs.mkdirSync(guardsDir, { recursive: true });\n fs.writeFileSync(executionPolicyFile, \"export const policy = true;\\n\", \"utf8\");\n fs.writeFileSync(guardStateFile, \"export const guard = true;\\n\", \"utf8\");\n fs.writeFileSync(progressFile, \"export const progress = true;\\n\", \"utf8\");\n\n const memory = createAgentMemory(\"check guards\", tempDir, tempDir);\n memory.task.normalizedQuery = \"check guards\";\n memory.task.primaryIntent = \"Check the guards scope.\";\n memory.task.explicitTargets = [\"guards\"];\n memory.evidence.candidateFiles = [executionPolicyFile, guardStateFile, progressFile];\n memory.evidence.searches.push({\n action: \"search-db\",\n lane: \"exact-target\",\n query: \"check guards\",\n filePaths: [executionPolicyFile, guardStateFile, progressFile],\n topHits: [\n { filePath: executionPolicyFile, score: 74, reasons: [\"path-anchor\"] },\n { filePath: guardStateFile, score: 74, reasons: [\"path-anchor\"] },\n { filePath: progressFile, score: 74, reasons: [\"path-anchor\"] },\n ],\n recordedAt: new Date(0).toISOString(),\n });\n memory.evidence.fileReads[executionPolicyFile] = summarizeFileRead(\n executionPolicyFile,\n \"export const policy = true;\\n\",\n memory.task.normalizedQuery,\n { readMode: \"full\" }\n );\n\n const incompletePolicy = resolvePolicyState(memory);\n expect(incompletePolicy.allowedActions).toContain(\"read-file\");\n expect(incompletePolicy.allowedActions).not.toContain(\"final-answer\");\n\n memory.evidence.fileReads[guardStateFile] = summarizeFileRead(\n guardStateFile,\n \"export const guard = true;\\n\",\n memory.task.normalizedQuery,\n { readMode: \"full\" }\n );\n\n const stillIncompletePolicy = resolvePolicyState(memory);\n expect(stillIncompletePolicy.allowedActions).toContain(\"read-file\");\n expect(stillIncompletePolicy.allowedActions).not.toContain(\"final-answer\");\n\n memory.evidence.fileReads[progressFile] = summarizeFileRead(\n progressFile,\n \"export const progress = true;\\n\",\n memory.task.normalizedQuery,\n { readMode: \"full\" }\n );\n\n const completePolicy = resolvePolicyState(memory);\n expect(completePolicy.allowedActions).toContain(\"final-answer\");\n } finally {\n fs.rmSync(tempDir, { recursive: true, force: true });\n }\n });\n\n it(\"requires two full reads for quoted snippet asks when several grounded candidates remain\", () => {\n const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), \"scai-policy-snippet-multi-read-\"));\n try {\n const firstFile = path.join(tempDir, \"analysisPlanGenStep.ts\");\n const secondFile = path.join(tempDir, \"transformPlanGenStep.ts\");\n const snippet = \"const currentQuestionId = currentStep.questionId ?? (orderedQuestions.length === 1 ? orderedQuestions[0].id : undefined);\";\n fs.writeFileSync(firstFile, `${snippet}\\n`, \"utf8\");\n fs.writeFileSync(secondFile, `${snippet}\\n`, \"utf8\");\n\n const memory = createAgentMemory(`\"${snippet}\"`, tempDir, tempDir);\n memory.task.normalizedQuery = \"Extract current question ID from current step or ordered questions array\";\n memory.task.primaryIntent = \"Understand variable assignment logic for current question ID\";\n memory.task.queryScope = \"targeted\";\n memory.evidence.candidateFiles = [firstFile, secondFile];\n memory.evidence.fileReads[firstFile] = summarizeFileRead(\n firstFile,\n `${snippet}\\n`,\n memory.task.normalizedQuery,\n { readMode: \"full\" }\n );\n\n const incompletePolicy = resolvePolicyState(memory);\n expect(incompletePolicy.allowedActions).toContain(\"read-file\");\n expect(incompletePolicy.allowedActions).not.toContain(\"final-answer\");\n\n memory.evidence.fileReads[secondFile] = summarizeFileRead(\n secondFile,\n `${snippet}\\n`,\n memory.task.normalizedQuery,\n { readMode: \"full\" }\n );\n\n const completePolicy = resolvePolicyState(memory);\n expect(completePolicy.allowedActions).toContain(\"final-answer\");\n } finally {\n fs.rmSync(tempDir, { recursive: true, force: true });\n }\n });\n\n it(\"requires more than one full read for broad repo test-entrypoint asks\", () => {\n const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), \"scai-policy-broad-repo-full-read-\"));\n try {\n const packageJson = path.join(tempDir, \"package.json\");\n const registerFile = path.join(tempDir, \"cli\", \"src\", \"testing\", \"registerDevCliCommands.ts\");\n const testCommandsFile = path.join(tempDir, \"cli\", \"src\", \"testing\", \"testCommands.ts\");\n fs.mkdirSync(path.dirname(registerFile), { recursive: true });\n fs.writeFileSync(packageJson, \"{ \\\"scripts\\\": { \\\"test\\\": \\\"vitest\\\" } }\\n\", \"utf8\");\n fs.writeFileSync(registerFile, \"export function registerDevCliCommands() {}\\n\", \"utf8\");\n fs.writeFileSync(testCommandsFile, \"export function registerTestingCommands() {}\\n\", \"utf8\");\n\n const memory = createAgentMemory(\n \"How does this repo run tests and where are the test entry points configured?\",\n tempDir,\n tempDir\n );\n memory.task.normalizedQuery = \"How does this repo run tests and where are the test entry points configured\";\n memory.task.primaryIntent = \"Understand test execution mechanism and configuration locations in a repository\";\n memory.task.queryScope = \"broad-repo\";\n memory.evidence.candidateFiles = [packageJson, registerFile, testCommandsFile];\n memory.evidence.fileReads[packageJson] = summarizeFileRead(\n packageJson,\n \"{ \\\"scripts\\\": { \\\"test\\\": \\\"vitest\\\" } }\\n\",\n memory.task.normalizedQuery,\n { readMode: \"full\" }\n );\n memory.evidence.fileReads[registerFile] = summarizeFileRead(\n registerFile,\n \"export function registerDevCliCommands() {}\\n\",\n memory.task.normalizedQuery,\n { readMode: \"triage\" }\n );\n memory.evidence.fileReads[testCommandsFile] = summarizeFileRead(\n testCommandsFile,\n \"export function registerTestingCommands() {}\\n\",\n memory.task.normalizedQuery,\n { readMode: \"triage\" }\n );\n\n const incompletePolicy = resolvePolicyState(memory);\n expect(incompletePolicy.allowedActions).toContain(\"read-file\");\n expect(incompletePolicy.allowedActions).not.toContain(\"final-answer\");\n\n memory.evidence.fileReads[registerFile] = summarizeFileRead(\n registerFile,\n \"export function registerDevCliCommands() {}\\n\",\n memory.task.normalizedQuery,\n { readMode: \"full\" }\n );\n\n const completePolicy = resolvePolicyState(memory);\n expect(completePolicy.allowedActions).toContain(\"final-answer\");\n } finally {\n fs.rmSync(tempDir, { recursive: true, force: true });\n }\n });\n\n it(\"keeps replanning as a policy hint after repeated weak turns\", () => {\n const repoRoot = process.cwd();\n const memory = createAgentMemory(\"Find the retry policy\", repoRoot, repoRoot);\n memory.task.normalizedQuery = \"Find the retry policy\";\n memory.task.primaryIntent = \"Find the retry policy.\";\n memory.task.replanCount = 3;\n memory.task.explicitTargets = [\"cli/src/agents\"];\n\n const policy = resolvePolicyState(memory);\n\n expect(policy.shouldReplan).toBe(false);\n expect(policy.allowedActions).toContain(\"search-db\");\n });\n\n it(\"prefers cannot-answer over user input when a concrete explicit target already exists\", () => {\n const memory = createAgentMemory(\"Explain /etc/hosts\", \"/repo\", \"/repo\");\n memory.task.normalizedQuery = \"Explain /etc/hosts\";\n memory.task.primaryIntent = \"Explain the target file.\";\n memory.task.explicitTargets = [\"/etc/hosts\"];\n\n const policy = resolvePolicyState(memory, { forcedEnd: true });\n\n expect(policy.shouldAskUser).toBe(false);\n expect(policy.endDecision?.action).toBe(\"cannot-answer\");\n });\n\n it(\"does not allow fallback candidate answers when an explicit file target never resolved\", () => {\n const memory = createAgentMemory(\"Explain /etc/hosts\", \"/repo\", \"/repo\");\n memory.task.normalizedQuery = \"Explain /etc/hosts\";\n memory.task.primaryIntent = \"Explain the target file.\";\n memory.task.explicitTargets = [\"/etc/hosts\"];\n memory.evidence.candidateFiles = [\"/repo/cli/src/index.ts\"];\n memory.evidence.fileReads[\"/repo/cli/src/index.ts\"] = {\n filePath: \"/repo/cli/src/index.ts\",\n summary: \"CLI entry file.\",\n snippets: [\"1: export function runCli() {}\", \"2: export const version = '1';\"],\n keySymbols: [\"runCli\", \"version\"],\n matchedTerms: [\"explain\"],\n relevantContext: [{ kind: \"purpose\", text: \"CLI entry file.\" }],\n contentFingerprint: \"content\",\n queryFingerprint: \"query\",\n recordedAt: \"2026-05-03T10:00:00.000+02:00\",\n };\n\n const policy = resolvePolicyState(memory, { forcedEnd: true });\n\n expect(policy.hasUsefulEvidence).toBe(false);\n expect(policy.allowedActions).not.toContain(\"final-answer\");\n expect(policy.endDecision?.action).toBe(\"cannot-answer\");\n });\n\n it(\"treats broad extracted words as soft hints instead of blocking targets\", () => {\n const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), \"scai-policy-soft-\"));\n try {\n const planFile = path.join(tempDir, \"plan.md\");\n fs.writeFileSync(planFile, \"# Current State\\n## Next Steps\\n\", \"utf8\");\n\n const memory = createAgentMemory(\"List the main sections in plan.md\", tempDir, tempDir);\n memory.task.normalizedQuery = \"List the main sections in plan.md\";\n memory.task.primaryIntent = \"List the main sections in plan.md.\";\n memory.task.explicitTargets = [\"plan.md\", \"List\"];\n memory.evidence.candidateFiles = [planFile];\n memory.evidence.fileReads[planFile] = summarizeFileRead(planFile, \"# Current State\\n## Next Steps\\n\", memory.task.normalizedQuery);\n\n const policy = resolvePolicyState(memory);\n\n expect(policy.reason).not.toContain(\"did not resolve\");\n expect(policy.allowedActions).toContain(\"final-answer\");\n } finally {\n fs.rmSync(tempDir, { recursive: true, force: true });\n }\n });\n});\n"]}
@@ -0,0 +1,170 @@
1
+ /**
2
+ * Covers grounded snippet quality and full-read prompt slicing for modular-agent reads.
3
+ *
4
+ * Why this file exists:
5
+ * - read summarization should prefer real code over imports and banner comments
6
+ * - evidence promotion should not let weak wrapper snippets dominate when better code exists
7
+ */
8
+ import { describe, expect, it } from "vitest";
9
+ import { createAgentMemory } from "../../agents/agentMemory.js";
10
+ import { buildAnswerReadyEvidence } from "../../agent/evidence/index.js";
11
+ import { buildDeterministicFullReadFallback, selectCodeForFullReadPrompt, summarizeFileRead, } from "../../agent/read/summarizeReadEvidence.js";
12
+ describe("summarizeFileRead", () => {
13
+ it("keeps one bridge snippet for wrapper files instead of comment delimiters", () => {
14
+ const code = [
15
+ "/**",
16
+ " * Re-exports modular agent memory helpers from the legacy simple-agent path.",
17
+ " */",
18
+ 'export * from "../agent/state/memory.js";',
19
+ ].join("\n");
20
+ const evidence = summarizeFileRead("/repo/cli/src/agents/agentMemory.ts", code, "agent memory", { readMode: "triage" });
21
+ expect(evidence.snippets).toEqual(['4: export * from "../agent/state/memory.js";']);
22
+ });
23
+ it("prefers direct code lines over import runs for direct files", () => {
24
+ const code = [
25
+ 'import { Command } from "commander";',
26
+ 'import { runThing } from "./runThing.js";',
27
+ "",
28
+ "export function createProgram(): Command {",
29
+ " return new Command('scai');",
30
+ "}",
31
+ ].join("\n");
32
+ const evidence = summarizeFileRead("/repo/cli/src/commands/factory.ts", code, "createProgram command", { readMode: "triage" });
33
+ expect(evidence.snippets[0]).toContain("export function createProgram(): Command {");
34
+ expect(evidence.snippets.some((snippet) => snippet.includes('import { Command }'))).toBe(false);
35
+ });
36
+ it("builds command-focused excerpts and descriptions", () => {
37
+ const code = [
38
+ "export function registerDevCliCommands(cmd: Command) {",
39
+ ' cmd.command("tests").description("Run the full Vitest suite");',
40
+ " return cmd;",
41
+ "}",
42
+ ].join("\n");
43
+ const evidence = summarizeFileRead("/repo/cli/src/testing/registerDevCliCommands.ts", code, "tests entry points", { readMode: "full" });
44
+ expect(evidence.excerpts?.[0]?.description).toBe("CLI command registration for tests");
45
+ expect(evidence.excerpts?.[0]?.code).toContain('.command("tests")');
46
+ });
47
+ it("builds query execution excerpts for db code", () => {
48
+ const code = [
49
+ "export function queryFiles(safeQuery: string, limit = 10): FileRow[] {",
50
+ " const db = getDbForRepo();",
51
+ " return db.prepare(sqlTemplates.queryFilesTemplate).all(safeQuery, limit) as FileRow[];",
52
+ "}",
53
+ ].join("\n");
54
+ const evidence = summarizeFileRead("/repo/cli/src/db/fileIndex.ts", code, "sqlite query definitions", { readMode: "full" });
55
+ expect(evidence.excerpts?.[0]?.description).toBe("SQLite query execution in queryFiles");
56
+ });
57
+ it("keeps concept and implementation strength for explanation queries in one file", () => {
58
+ const code = [
59
+ "/**",
60
+ " * Phase Boundary: Final Answer Module",
61
+ " *",
62
+ " * This module produces the final grounded answer.",
63
+ " */",
64
+ "",
65
+ "function buildFinalAnswer(renderedResponse: string): string {",
66
+ ' return `Final: ${renderedResponse}`;',
67
+ "}",
68
+ "",
69
+ "export const finalAnswerModule = {};",
70
+ ].join("\n");
71
+ const evidence = summarizeFileRead("/repo/cli/src/pipeline/modules/finalAnswerModule.ts", code, "Explain final answer module", { readMode: "full", explicitTargets: ["final answer module"] });
72
+ expect(evidence.strengthSignals?.exactTargetPhrases).toContain("Final Answer Module");
73
+ expect(evidence.strengthSignals?.implementationSymbols).toContain("buildFinalAnswer");
74
+ expect(evidence.strengthSignals?.strongestConceptExcerpt?.description).toContain("Module");
75
+ expect(evidence.strengthSignals?.strongestImplementationExcerpt?.symbols).toContain("buildFinalAnswer");
76
+ expect(evidence.excerpts?.[0]?.code).toContain("Phase Boundary: Final Answer Module");
77
+ expect(evidence.excerpts?.[1]?.code).toContain("function buildFinalAnswer");
78
+ });
79
+ });
80
+ describe("selectCodeForFullReadPrompt", () => {
81
+ it("prefers docblock plus strong code blocks over long import preambles", () => {
82
+ const code = [
83
+ "/**",
84
+ " * Registers the public CLI commands for SCAI.",
85
+ " */",
86
+ ...Array.from({ length: 30 }, (_, index) => `import { dep${index} } from "./dep${index}.js";`),
87
+ "",
88
+ "export function createProgram(): Command {",
89
+ " const cmd = new Command('scai');",
90
+ ' cmd.command("tests").description("Run the full Vitest suite");',
91
+ " return cmd;",
92
+ "}",
93
+ ].join("\n");
94
+ const promptCode = selectCodeForFullReadPrompt(code, "CLI architecture tests command", 1200);
95
+ expect(promptCode).toContain("Registers the public CLI commands for SCAI.");
96
+ expect(promptCode).toContain("export function createProgram(): Command {");
97
+ expect(promptCode).toContain('.command("tests")');
98
+ expect(promptCode).not.toContain('import { dep29 }');
99
+ });
100
+ });
101
+ describe("buildAnswerReadyEvidence", () => {
102
+ it("keeps general-answer packets empty when no repo evidence was read", () => {
103
+ const memory = createAgentMemory("how do I use git bash to save a diff?", "/repo", "/repo");
104
+ memory.task.normalizedQuery = "how do I use git bash to save a diff";
105
+ memory.task.primaryIntent = "Answer a general Git usage question.";
106
+ memory.task.queryScope = "general";
107
+ const packet = buildAnswerReadyEvidence(memory);
108
+ expect(packet.queryScope).toBe("general");
109
+ expect(packet.groundedPrimaryFiles).toEqual([]);
110
+ expect(packet.mustMentionFiles).toEqual([]);
111
+ expect(packet.mustMentionSymbols).toEqual([]);
112
+ expect(packet.mustMentionFacts).toEqual([]);
113
+ });
114
+ it("prefers direct grounded evidence over wrapper-only supporting context", () => {
115
+ var _a;
116
+ const repoRoot = "/repo";
117
+ const memory = createAgentMemory("Explain CLI architecture", repoRoot, repoRoot);
118
+ memory.task.queryScope = "broad-repo";
119
+ memory.evidence.fileReads["/repo/cli/src/agents/agentLoop.ts"] = summarizeFileRead("/repo/cli/src/agents/agentLoop.ts", ['/**', ' * Re-exports the modular agent loop.', ' */', 'export * from "../agent/runtime/runAgentLoop.js";'].join("\n"), "agent loop responsibilities", { readMode: "full" });
120
+ memory.evidence.fileReads["/repo/cli/src/index.ts"] = buildDeterministicFullReadFallback("/repo/cli/src/index.ts", [
121
+ "/**",
122
+ " * Starts the SCAI CLI.",
123
+ " */",
124
+ "export async function runQuery(query: string) {",
125
+ " return runQueryWithDaemonControl(query);",
126
+ "}",
127
+ ].join("\n"), "CLI architecture responsibilities");
128
+ (_a = memory.evidence).candidateMetadata ?? (_a.candidateMetadata = {});
129
+ memory.evidence.candidateMetadata["/repo/cli/src/agents/agentLoop.ts"] = { readPriority: 0.5 };
130
+ memory.evidence.candidateMetadata["/repo/cli/src/index.ts"] = { readPriority: 0.4 };
131
+ const packet = buildAnswerReadyEvidence(memory);
132
+ expect(packet.groundedPrimaryFiles[0]?.filePath).toBe("/repo/cli/src/index.ts");
133
+ });
134
+ it("carries exact target phrases, implementation symbols, and grounded CLI command forms forward", () => {
135
+ const repoRoot = "/repo";
136
+ const memory = createAgentMemory("Explain final answer module", repoRoot, repoRoot);
137
+ memory.task.normalizedQuery = "Explain final answer module";
138
+ memory.task.primaryIntent = "Explain the final answer module.";
139
+ memory.task.explicitTargets = ["final answer module"];
140
+ memory.evidence.fileReads["/repo/cli/src/pipeline/modules/finalAnswerModule.ts"] = summarizeFileRead("/repo/cli/src/pipeline/modules/finalAnswerModule.ts", [
141
+ "/**",
142
+ " * Phase Boundary: Final Answer Module",
143
+ " */",
144
+ "",
145
+ "function buildFinalAnswer(renderedResponse: string): string {",
146
+ " return renderedResponse;",
147
+ "}",
148
+ "",
149
+ "export const finalAnswerModule = {};",
150
+ ].join("\n"), memory.task.normalizedQuery, { readMode: "full", explicitTargets: memory.task.explicitTargets });
151
+ memory.evidence.fileReads["/repo/cli/src/testing/registerDevCliCommands.ts"] = summarizeFileRead("/repo/cli/src/testing/registerDevCliCommands.ts", [
152
+ "export function registerDevCliCommands(cmd: Command): void {",
153
+ ' cmd.command("tests").description("Run the full Vitest suite");',
154
+ "}",
155
+ ].join("\n"), "How does this repo run tests and where are the test entry points configured?", { readMode: "full", explicitTargets: ["tests", "test entry points"] });
156
+ memory.evidence.fileReads["/repo/cli/package.json"] = summarizeFileRead("/repo/cli/package.json", [
157
+ "{",
158
+ ' "name": "scai",',
159
+ ' "bin": {',
160
+ ' "scai": "./dist/index.js"',
161
+ " }",
162
+ "}",
163
+ ].join("\n"), "How does this repo run tests and where are the test entry points configured?", { readMode: "full", explicitTargets: ["tests", "test entry points"] });
164
+ const packet = buildAnswerReadyEvidence(memory);
165
+ expect(packet.mustMentionFacts).toContain("Exact target phrase: Final Answer Module");
166
+ expect(packet.mustMentionSymbols).toContain("buildFinalAnswer");
167
+ expect(packet.mustMentionFacts).toContain("CLI command: scai tests");
168
+ });
169
+ });
170
+ //# sourceMappingURL=agentReadEvidence.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agentReadEvidence.test.js","sourceRoot":"","sources":["../../../src/__tests__/agents/agentReadEvidence.test.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Covers grounded snippet quality and full-read prompt slicing for modular-agent reads.\n *\n * Why this file exists:\n * - read summarization should prefer real code over imports and banner comments\n * - evidence promotion should not let weak wrapper snippets dominate when better code exists\n */\nimport { describe, expect, it } from \"vitest\";\nimport { createAgentMemory } from \"../../agents/agentMemory.js\";\nimport { buildAnswerReadyEvidence } from \"../../agent/evidence/index.js\";\nimport {\n buildDeterministicFullReadFallback,\n selectCodeForFullReadPrompt,\n summarizeFileRead,\n} from \"../../agent/read/summarizeReadEvidence.js\";\n\ndescribe(\"summarizeFileRead\", () => {\n it(\"keeps one bridge snippet for wrapper files instead of comment delimiters\", () => {\n const code = [\n \"/**\",\n \" * Re-exports modular agent memory helpers from the legacy simple-agent path.\",\n \" */\",\n 'export * from \"../agent/state/memory.js\";',\n ].join(\"\\n\");\n\n const evidence = summarizeFileRead(\"/repo/cli/src/agents/agentMemory.ts\", code, \"agent memory\", { readMode: \"triage\" });\n\n expect(evidence.snippets).toEqual(['4: export * from \"../agent/state/memory.js\";']);\n });\n\n it(\"prefers direct code lines over import runs for direct files\", () => {\n const code = [\n 'import { Command } from \"commander\";',\n 'import { runThing } from \"./runThing.js\";',\n \"\",\n \"export function createProgram(): Command {\",\n \" return new Command('scai');\",\n \"}\",\n ].join(\"\\n\");\n\n const evidence = summarizeFileRead(\"/repo/cli/src/commands/factory.ts\", code, \"createProgram command\", { readMode: \"triage\" });\n\n expect(evidence.snippets[0]).toContain(\"export function createProgram(): Command {\");\n expect(evidence.snippets.some((snippet) => snippet.includes('import { Command }'))).toBe(false);\n });\n\n it(\"builds command-focused excerpts and descriptions\", () => {\n const code = [\n \"export function registerDevCliCommands(cmd: Command) {\",\n ' cmd.command(\"tests\").description(\"Run the full Vitest suite\");',\n \" return cmd;\",\n \"}\",\n ].join(\"\\n\");\n\n const evidence = summarizeFileRead(\"/repo/cli/src/testing/registerDevCliCommands.ts\", code, \"tests entry points\", { readMode: \"full\" });\n\n expect(evidence.excerpts?.[0]?.description).toBe(\"CLI command registration for tests\");\n expect(evidence.excerpts?.[0]?.code).toContain('.command(\"tests\")');\n });\n\n it(\"builds query execution excerpts for db code\", () => {\n const code = [\n \"export function queryFiles(safeQuery: string, limit = 10): FileRow[] {\",\n \" const db = getDbForRepo();\",\n \" return db.prepare(sqlTemplates.queryFilesTemplate).all(safeQuery, limit) as FileRow[];\",\n \"}\",\n ].join(\"\\n\");\n\n const evidence = summarizeFileRead(\"/repo/cli/src/db/fileIndex.ts\", code, \"sqlite query definitions\", { readMode: \"full\" });\n\n expect(evidence.excerpts?.[0]?.description).toBe(\"SQLite query execution in queryFiles\");\n });\n\n it(\"keeps concept and implementation strength for explanation queries in one file\", () => {\n const code = [\n \"/**\",\n \" * Phase Boundary: Final Answer Module\",\n \" *\",\n \" * This module produces the final grounded answer.\",\n \" */\",\n \"\",\n \"function buildFinalAnswer(renderedResponse: string): string {\",\n ' return `Final: ${renderedResponse}`;',\n \"}\",\n \"\",\n \"export const finalAnswerModule = {};\",\n ].join(\"\\n\");\n\n const evidence = summarizeFileRead(\n \"/repo/cli/src/pipeline/modules/finalAnswerModule.ts\",\n code,\n \"Explain final answer module\",\n { readMode: \"full\", explicitTargets: [\"final answer module\"] }\n );\n\n expect(evidence.strengthSignals?.exactTargetPhrases).toContain(\"Final Answer Module\");\n expect(evidence.strengthSignals?.implementationSymbols).toContain(\"buildFinalAnswer\");\n expect(evidence.strengthSignals?.strongestConceptExcerpt?.description).toContain(\"Module\");\n expect(evidence.strengthSignals?.strongestImplementationExcerpt?.symbols).toContain(\"buildFinalAnswer\");\n expect(evidence.excerpts?.[0]?.code).toContain(\"Phase Boundary: Final Answer Module\");\n expect(evidence.excerpts?.[1]?.code).toContain(\"function buildFinalAnswer\");\n });\n});\n\ndescribe(\"selectCodeForFullReadPrompt\", () => {\n it(\"prefers docblock plus strong code blocks over long import preambles\", () => {\n const code = [\n \"/**\",\n \" * Registers the public CLI commands for SCAI.\",\n \" */\",\n ...Array.from({ length: 30 }, (_, index) => `import { dep${index} } from \"./dep${index}.js\";`),\n \"\",\n \"export function createProgram(): Command {\",\n \" const cmd = new Command('scai');\",\n ' cmd.command(\"tests\").description(\"Run the full Vitest suite\");',\n \" return cmd;\",\n \"}\",\n ].join(\"\\n\");\n\n const promptCode = selectCodeForFullReadPrompt(code, \"CLI architecture tests command\", 1200);\n\n expect(promptCode).toContain(\"Registers the public CLI commands for SCAI.\");\n expect(promptCode).toContain(\"export function createProgram(): Command {\");\n expect(promptCode).toContain('.command(\"tests\")');\n expect(promptCode).not.toContain('import { dep29 }');\n });\n});\n\ndescribe(\"buildAnswerReadyEvidence\", () => {\n it(\"keeps general-answer packets empty when no repo evidence was read\", () => {\n const memory = createAgentMemory(\"how do I use git bash to save a diff?\", \"/repo\", \"/repo\");\n memory.task.normalizedQuery = \"how do I use git bash to save a diff\";\n memory.task.primaryIntent = \"Answer a general Git usage question.\";\n memory.task.queryScope = \"general\";\n\n const packet = buildAnswerReadyEvidence(memory);\n\n expect(packet.queryScope).toBe(\"general\");\n expect(packet.groundedPrimaryFiles).toEqual([]);\n expect(packet.mustMentionFiles).toEqual([]);\n expect(packet.mustMentionSymbols).toEqual([]);\n expect(packet.mustMentionFacts).toEqual([]);\n });\n\n it(\"prefers direct grounded evidence over wrapper-only supporting context\", () => {\n const repoRoot = \"/repo\";\n const memory = createAgentMemory(\"Explain CLI architecture\", repoRoot, repoRoot);\n memory.task.queryScope = \"broad-repo\";\n\n memory.evidence.fileReads[\"/repo/cli/src/agents/agentLoop.ts\"] = summarizeFileRead(\n \"/repo/cli/src/agents/agentLoop.ts\",\n ['/**', ' * Re-exports the modular agent loop.', ' */', 'export * from \"../agent/runtime/runAgentLoop.js\";'].join(\"\\n\"),\n \"agent loop responsibilities\",\n { readMode: \"full\" }\n );\n memory.evidence.fileReads[\"/repo/cli/src/index.ts\"] = buildDeterministicFullReadFallback(\n \"/repo/cli/src/index.ts\",\n [\n \"/**\",\n \" * Starts the SCAI CLI.\",\n \" */\",\n \"export async function runQuery(query: string) {\",\n \" return runQueryWithDaemonControl(query);\",\n \"}\",\n ].join(\"\\n\"),\n \"CLI architecture responsibilities\"\n );\n\n memory.evidence.candidateMetadata ??= {};\n memory.evidence.candidateMetadata[\"/repo/cli/src/agents/agentLoop.ts\"] = { readPriority: 0.5 };\n memory.evidence.candidateMetadata[\"/repo/cli/src/index.ts\"] = { readPriority: 0.4 };\n\n const packet = buildAnswerReadyEvidence(memory);\n\n expect(packet.groundedPrimaryFiles[0]?.filePath).toBe(\"/repo/cli/src/index.ts\");\n });\n\n it(\"carries exact target phrases, implementation symbols, and grounded CLI command forms forward\", () => {\n const repoRoot = \"/repo\";\n const memory = createAgentMemory(\"Explain final answer module\", repoRoot, repoRoot);\n memory.task.normalizedQuery = \"Explain final answer module\";\n memory.task.primaryIntent = \"Explain the final answer module.\";\n memory.task.explicitTargets = [\"final answer module\"];\n\n memory.evidence.fileReads[\"/repo/cli/src/pipeline/modules/finalAnswerModule.ts\"] = summarizeFileRead(\n \"/repo/cli/src/pipeline/modules/finalAnswerModule.ts\",\n [\n \"/**\",\n \" * Phase Boundary: Final Answer Module\",\n \" */\",\n \"\",\n \"function buildFinalAnswer(renderedResponse: string): string {\",\n \" return renderedResponse;\",\n \"}\",\n \"\",\n \"export const finalAnswerModule = {};\",\n ].join(\"\\n\"),\n memory.task.normalizedQuery,\n { readMode: \"full\", explicitTargets: memory.task.explicitTargets }\n );\n\n memory.evidence.fileReads[\"/repo/cli/src/testing/registerDevCliCommands.ts\"] = summarizeFileRead(\n \"/repo/cli/src/testing/registerDevCliCommands.ts\",\n [\n \"export function registerDevCliCommands(cmd: Command): void {\",\n ' cmd.command(\"tests\").description(\"Run the full Vitest suite\");',\n \"}\",\n ].join(\"\\n\"),\n \"How does this repo run tests and where are the test entry points configured?\",\n { readMode: \"full\", explicitTargets: [\"tests\", \"test entry points\"] }\n );\n\n memory.evidence.fileReads[\"/repo/cli/package.json\"] = summarizeFileRead(\n \"/repo/cli/package.json\",\n [\n \"{\",\n ' \"name\": \"scai\",',\n ' \"bin\": {',\n ' \"scai\": \"./dist/index.js\"',\n \" }\",\n \"}\",\n ].join(\"\\n\"),\n \"How does this repo run tests and where are the test entry points configured?\",\n { readMode: \"full\", explicitTargets: [\"tests\", \"test entry points\"] }\n );\n\n const packet = buildAnswerReadyEvidence(memory);\n\n expect(packet.mustMentionFacts).toContain(\"Exact target phrase: Final Answer Module\");\n expect(packet.mustMentionSymbols).toContain(\"buildFinalAnswer\");\n expect(packet.mustMentionFacts).toContain(\"CLI command: scai tests\");\n });\n});\n"]}
@@ -0,0 +1,129 @@
1
+ /**
2
+ * Covers DB-backed full-read reuse for the modular agent.
3
+ *
4
+ * Why this file exists:
5
+ * - Phase 1 persistence should stay limited to full reads only
6
+ * - full reads should be reusable across later queries when file bytes do not change
7
+ * - changed files should invalidate cached reads by content hash and force a new full read
8
+ */
9
+ import fs from "fs";
10
+ import os from "os";
11
+ import path from "path";
12
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
13
+ const ORIGINAL_ENV = { ...process.env };
14
+ const generateMock = vi.fn();
15
+ vi.mock("../../lib/generate.js", () => ({
16
+ generate: generateMock,
17
+ }));
18
+ function createTempHome() {
19
+ const homeDir = fs.mkdtempSync(path.join(os.tmpdir(), "scai-agent-read-persist-home-"));
20
+ process.env.HOME = homeDir;
21
+ process.env.USERPROFILE = homeDir;
22
+ return homeDir;
23
+ }
24
+ async function bootstrapRepo(repoRoot) {
25
+ const { writeConfig } = await import("../../config.js");
26
+ const { initSchema } = await import("../../db/schema.js");
27
+ writeConfig({
28
+ activeRepo: "repo-a",
29
+ repos: {
30
+ "repo-a": {
31
+ indexDir: repoRoot,
32
+ },
33
+ },
34
+ });
35
+ initSchema();
36
+ }
37
+ describe("read-file persistence", () => {
38
+ beforeEach(() => {
39
+ generateMock.mockReset();
40
+ });
41
+ afterEach(() => {
42
+ vi.resetModules();
43
+ process.env = { ...ORIGINAL_ENV };
44
+ });
45
+ it("persists the first full read and reuses it on later unchanged reads", async () => {
46
+ createTempHome();
47
+ const repoRoot = fs.mkdtempSync(path.join(os.tmpdir(), "scai-agent-read-persist-repo-"));
48
+ const filePath = path.join(repoRoot, "src", "thing.ts");
49
+ fs.mkdirSync(path.dirname(filePath), { recursive: true });
50
+ fs.writeFileSync(filePath, "export function runThing() { return 'ok'; }\n", "utf8");
51
+ await bootstrapRepo(repoRoot);
52
+ const { createAgentMemory } = await import("../../agents/agentMemory.js");
53
+ const { getDbForRepo } = await import("../../db/client.js");
54
+ const { readAgentFile } = await import("../../agent/read/index.js");
55
+ generateMock.mockResolvedValueOnce({
56
+ data: JSON.stringify({
57
+ summary: "Runs the thing.",
58
+ relevanceExplanation: "This file implements runThing.",
59
+ role: "primary",
60
+ excerpts: [{ description: "Implementation block", code: "export function runThing() { return 'ok'; }", symbols: ["runThing"] }],
61
+ keySymbols: ["runThing"],
62
+ }),
63
+ });
64
+ const firstMemory = createAgentMemory("Explain runThing", repoRoot, repoRoot);
65
+ firstMemory.task.normalizedQuery = "Explain runThing";
66
+ const first = await readAgentFile(firstMemory, filePath);
67
+ expect(generateMock).toHaveBeenCalledTimes(1);
68
+ expect(firstMemory.evidence.fileReads[filePath].summary).toBe(first.summary);
69
+ const row = getDbForRepo()
70
+ .prepare("SELECT file_path, read_mode, payload_json FROM agent_file_reads WHERE file_path = ?")
71
+ .get(filePath);
72
+ expect(row?.file_path).toBe(filePath);
73
+ expect(row?.read_mode).toBe("full");
74
+ expect(JSON.parse(String(row?.payload_json)).summary).toBe(first.summary);
75
+ const secondMemory = createAgentMemory("Where is the implementation?", repoRoot, repoRoot);
76
+ secondMemory.task.normalizedQuery = "Where is the implementation";
77
+ const second = await readAgentFile(secondMemory, filePath);
78
+ expect(generateMock).toHaveBeenCalledTimes(1);
79
+ expect(second.summary).toBe(first.summary);
80
+ expect(secondMemory.evidence.fileReads[filePath].summary).toBe(first.summary);
81
+ });
82
+ it("invalidates persisted full reads when file content changes", async () => {
83
+ createTempHome();
84
+ const repoRoot = fs.mkdtempSync(path.join(os.tmpdir(), "scai-agent-read-persist-repo-"));
85
+ const filePath = path.join(repoRoot, "src", "thing.ts");
86
+ fs.mkdirSync(path.dirname(filePath), { recursive: true });
87
+ fs.writeFileSync(filePath, "export function runThing() { return 'ok'; }\n", "utf8");
88
+ await bootstrapRepo(repoRoot);
89
+ const { createAgentMemory } = await import("../../agents/agentMemory.js");
90
+ const { getDbForRepo } = await import("../../db/client.js");
91
+ const { readAgentFile } = await import("../../agent/read/index.js");
92
+ generateMock
93
+ .mockResolvedValueOnce({ data: JSON.stringify({ summary: "Runs the first version." }) })
94
+ .mockResolvedValueOnce({ data: JSON.stringify({ summary: "Runs the updated version." }) });
95
+ const firstMemory = createAgentMemory("Explain runThing", repoRoot, repoRoot);
96
+ firstMemory.task.normalizedQuery = "Explain runThing";
97
+ await readAgentFile(firstMemory, filePath);
98
+ fs.writeFileSync(filePath, "export function runThing() { return 'new'; }\n", "utf8");
99
+ const secondMemory = createAgentMemory("Explain runThing again", repoRoot, repoRoot);
100
+ secondMemory.task.normalizedQuery = "Explain runThing again";
101
+ const second = await readAgentFile(secondMemory, filePath);
102
+ expect(generateMock).toHaveBeenCalledTimes(2);
103
+ expect(second.summary).toBe("Runs the updated version.");
104
+ const row = getDbForRepo()
105
+ .prepare("SELECT payload_json FROM agent_file_reads WHERE file_path = ?")
106
+ .get(filePath);
107
+ expect(JSON.parse(String(row?.payload_json)).summary).toBe("Runs the updated version.");
108
+ });
109
+ it("does not persist triage reads", async () => {
110
+ createTempHome();
111
+ const repoRoot = fs.mkdtempSync(path.join(os.tmpdir(), "scai-agent-read-persist-repo-"));
112
+ const filePath = path.join(repoRoot, "src", "thing.ts");
113
+ fs.mkdirSync(path.dirname(filePath), { recursive: true });
114
+ fs.writeFileSync(filePath, "export function runThing() { return 'ok'; }\n", "utf8");
115
+ await bootstrapRepo(repoRoot);
116
+ const { createAgentMemory } = await import("../../agents/agentMemory.js");
117
+ const { getDbForRepo } = await import("../../db/client.js");
118
+ const { triageAgentFile } = await import("../../agent/read/index.js");
119
+ const memory = createAgentMemory("Explain runThing", repoRoot, repoRoot);
120
+ memory.task.normalizedQuery = "Explain runThing";
121
+ await triageAgentFile(memory, filePath);
122
+ const row = getDbForRepo()
123
+ .prepare("SELECT file_path FROM agent_file_reads WHERE file_path = ?")
124
+ .get(filePath);
125
+ expect(row).toBeUndefined();
126
+ expect(generateMock).not.toHaveBeenCalled();
127
+ });
128
+ });
129
+ //# sourceMappingURL=agentReadPersistence.test.js.map