scai 0.1.178 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (770) hide show
  1. package/README.md +162 -267
  2. package/dist/__tests__/CommitSuggesterCmd.test.js +112 -0
  3. package/dist/__tests__/CommitSuggesterCmd.test.js.map +1 -0
  4. package/dist/__tests__/EvalReportCmd.test.js +645 -0
  5. package/dist/__tests__/EvalReportCmd.test.js.map +1 -0
  6. package/dist/__tests__/ModelCmd.test.js +64 -0
  7. package/dist/__tests__/ModelCmd.test.js.map +1 -0
  8. package/dist/__tests__/agents/agentActions.test.js +345 -0
  9. package/dist/__tests__/agents/agentActions.test.js.map +1 -0
  10. package/dist/__tests__/agents/agentFeedback.test.js +118 -0
  11. package/dist/__tests__/agents/agentFeedback.test.js.map +1 -0
  12. package/dist/__tests__/agents/agentGeneralScope.test.js +74 -0
  13. package/dist/__tests__/agents/agentGeneralScope.test.js.map +1 -0
  14. package/dist/__tests__/agents/agentLoop.test.js +1723 -0
  15. package/dist/__tests__/agents/agentLoop.test.js.map +1 -0
  16. package/dist/__tests__/agents/agentPolicyState.test.js +948 -0
  17. package/dist/__tests__/agents/agentPolicyState.test.js.map +1 -0
  18. package/dist/__tests__/agents/agentReadEvidence.test.js +170 -0
  19. package/dist/__tests__/agents/agentReadEvidence.test.js.map +1 -0
  20. package/dist/__tests__/agents/agentReadPersistence.test.js +129 -0
  21. package/dist/__tests__/agents/agentReadPersistence.test.js.map +1 -0
  22. package/dist/__tests__/agents/agentResumeCheckpoint.test.js +90 -0
  23. package/dist/__tests__/agents/agentResumeCheckpoint.test.js.map +1 -0
  24. package/dist/__tests__/agents/agentSearchBatchPlanner.test.js +289 -0
  25. package/dist/__tests__/agents/agentSearchBatchPlanner.test.js.map +1 -0
  26. package/dist/__tests__/agents/agentSearchOwnership.test.js +166 -0
  27. package/dist/__tests__/agents/agentSearchOwnership.test.js.map +1 -0
  28. package/dist/__tests__/agents/agentSearchRanking.test.js +139 -0
  29. package/dist/__tests__/agents/agentSearchRanking.test.js.map +1 -0
  30. package/dist/__tests__/agents/agentSearchRouting.test.js +584 -0
  31. package/dist/__tests__/agents/agentSearchRouting.test.js.map +1 -0
  32. package/dist/__tests__/agents/agentSearchScoring.test.js +23 -0
  33. package/dist/__tests__/agents/agentSearchScoring.test.js.map +1 -0
  34. package/dist/__tests__/agents/agentSearchShared.test.js +78 -0
  35. package/dist/__tests__/agents/agentSearchShared.test.js.map +1 -0
  36. package/dist/__tests__/agents/agentStateMachine.test.js +58 -0
  37. package/dist/__tests__/agents/agentStateMachine.test.js.map +1 -0
  38. package/dist/__tests__/agents/agentTaskPersistence.test.js +156 -0
  39. package/dist/__tests__/agents/agentTaskPersistence.test.js.map +1 -0
  40. package/dist/__tests__/agents/agentTools.test.js +69 -0
  41. package/dist/__tests__/agents/agentTools.test.js.map +1 -0
  42. package/dist/__tests__/agents/agentTransform.test.js +779 -0
  43. package/dist/__tests__/agents/agentTransform.test.js.map +1 -0
  44. package/dist/__tests__/agents/analysisPlanGenStep.test.js +157 -0
  45. package/dist/__tests__/agents/analysisPlanGenStep.test.js.map +1 -0
  46. package/dist/__tests__/agents/answerOnlyCompletion.test.js +75 -0
  47. package/dist/__tests__/agents/answerOnlyCompletion.test.js.map +1 -0
  48. package/dist/__tests__/agents/decideNextAction.test.js +1662 -0
  49. package/dist/__tests__/agents/decideNextAction.test.js.map +1 -0
  50. package/dist/__tests__/agents/deriveFocusFromSearchStep.test.js +258 -0
  51. package/dist/__tests__/agents/deriveFocusFromSearchStep.test.js.map +1 -0
  52. package/dist/__tests__/agents/evidenceVerifierStep.test.js +113 -0
  53. package/dist/__tests__/agents/evidenceVerifierStep.test.js.map +1 -0
  54. package/dist/__tests__/agents/executionPolicyResolver.test.js +208 -0
  55. package/dist/__tests__/agents/executionPolicyResolver.test.js.map +1 -0
  56. package/dist/__tests__/agents/fileCheckStep.test.js +299 -0
  57. package/dist/__tests__/agents/fileCheckStep.test.js.map +1 -0
  58. package/dist/__tests__/agents/giveUpEvaluatorStep.test.js +35 -0
  59. package/dist/__tests__/agents/giveUpEvaluatorStep.test.js.map +1 -0
  60. package/dist/__tests__/agents/guardState.test.js +297 -0
  61. package/dist/__tests__/agents/guardState.test.js.map +1 -0
  62. package/dist/__tests__/agents/mainAgentHeuristics.test.js +72 -0
  63. package/dist/__tests__/agents/mainAgentHeuristics.test.js.map +1 -0
  64. package/dist/__tests__/agents/objectiveEvaluatorStep.test.js +60 -0
  65. package/dist/__tests__/agents/objectiveEvaluatorStep.test.js.map +1 -0
  66. package/dist/__tests__/agents/outerLoopRecoveryEvaluator.test.js +207 -0
  67. package/dist/__tests__/agents/outerLoopRecoveryEvaluator.test.js.map +1 -0
  68. package/dist/__tests__/agents/prompting.test.js +363 -0
  69. package/dist/__tests__/agents/prompting.test.js.map +1 -0
  70. package/dist/__tests__/agents/readinessGateStep.test.js +180 -0
  71. package/dist/__tests__/agents/readinessGateStep.test.js.map +1 -0
  72. package/dist/__tests__/agents/reasonNextStep.test.js +56 -0
  73. package/dist/__tests__/agents/reasonNextStep.test.js.map +1 -0
  74. package/dist/__tests__/agents/reasonNextTaskStep.test.js +284 -0
  75. package/dist/__tests__/agents/reasonNextTaskStep.test.js.map +1 -0
  76. package/dist/__tests__/agents/resolveAgentTargetClassification.test.js +170 -0
  77. package/dist/__tests__/agents/resolveAgentTargetClassification.test.js.map +1 -0
  78. package/dist/__tests__/agents/resolveProgressState.test.js +526 -0
  79. package/dist/__tests__/agents/resolveProgressState.test.js.map +1 -0
  80. package/dist/__tests__/agents/resumeCheckpoint.test.js +50 -0
  81. package/dist/__tests__/agents/resumeCheckpoint.test.js.map +1 -0
  82. package/dist/__tests__/agents/routingDecisionStep.test.js +134 -0
  83. package/dist/__tests__/agents/routingDecisionStep.test.js.map +1 -0
  84. package/dist/__tests__/agents/scopeClassificationStep.test.js +118 -0
  85. package/dist/__tests__/agents/scopeClassificationStep.test.js.map +1 -0
  86. package/dist/__tests__/agents/searchContext.test.js +97 -0
  87. package/dist/__tests__/agents/searchContext.test.js.map +1 -0
  88. package/dist/__tests__/agents/selectRelevantSourcesStep.test.js +73 -0
  89. package/dist/__tests__/agents/selectRelevantSourcesStep.test.js.map +1 -0
  90. package/dist/__tests__/agents/structuredOutput.test.js +45 -0
  91. package/dist/__tests__/agents/structuredOutput.test.js.map +1 -0
  92. package/dist/__tests__/agents/transformPlanGenStep.fallback.test.js +59 -0
  93. package/dist/__tests__/agents/transformPlanGenStep.fallback.test.js.map +1 -0
  94. package/dist/__tests__/agents/transformPlanGenStep.test.js +92 -0
  95. package/dist/__tests__/agents/transformPlanGenStep.test.js.map +1 -0
  96. package/dist/__tests__/agents/understandIntentStep.test.js +237 -0
  97. package/dist/__tests__/agents/understandIntentStep.test.js.map +1 -0
  98. package/dist/__tests__/agents/understandResumeContext.test.js +65 -0
  99. package/dist/__tests__/agents/understandResumeContext.test.js.map +1 -0
  100. package/dist/__tests__/agents/understandScope.test.js +227 -0
  101. package/dist/__tests__/agents/understandScope.test.js.map +1 -0
  102. package/dist/__tests__/agents/validateChangesStep.test.js +52 -0
  103. package/dist/__tests__/agents/validateChangesStep.test.js.map +1 -0
  104. package/dist/__tests__/askCommandTaskBinding.test.js +176 -0
  105. package/dist/__tests__/askCommandTaskBinding.test.js.map +1 -0
  106. package/dist/__tests__/commandVisibility.test.js +25 -0
  107. package/dist/__tests__/commandVisibility.test.js.map +1 -0
  108. package/dist/__tests__/config.devOutput.test.js +82 -0
  109. package/dist/__tests__/config.devOutput.test.js.map +1 -0
  110. package/dist/__tests__/currentContext.test.js +43 -0
  111. package/dist/__tests__/currentContext.test.js.map +1 -0
  112. package/dist/__tests__/daemonWorker.test.js +51 -0
  113. package/dist/__tests__/daemonWorker.test.js.map +1 -0
  114. package/dist/__tests__/dialogState.test.js +113 -0
  115. package/dist/__tests__/dialogState.test.js.map +1 -0
  116. package/dist/__tests__/evalCommands.test.js +506 -0
  117. package/dist/__tests__/evalCommands.test.js.map +1 -0
  118. package/dist/__tests__/evalCommandsSummary.test.js +68 -0
  119. package/dist/__tests__/evalCommandsSummary.test.js.map +1 -0
  120. package/dist/__tests__/example.test.js +1 -0
  121. package/dist/__tests__/example.test.js.map +1 -0
  122. package/dist/__tests__/factory.commitCommand.test.js +45 -0
  123. package/dist/__tests__/factory.commitCommand.test.js.map +1 -0
  124. package/dist/__tests__/factory.devOutputCommand.test.js +122 -0
  125. package/dist/__tests__/factory.devOutputCommand.test.js.map +1 -0
  126. package/dist/__tests__/factory.evalCommands.test.js +38 -0
  127. package/dist/__tests__/factory.evalCommands.test.js.map +1 -0
  128. package/dist/__tests__/factory.planCommand.test.js +35 -0
  129. package/dist/__tests__/factory.planCommand.test.js.map +1 -0
  130. package/dist/__tests__/factory.setupCommand.test.js +34 -0
  131. package/dist/__tests__/factory.setupCommand.test.js.map +1 -0
  132. package/dist/__tests__/factory.statusCommand.test.js +54 -0
  133. package/dist/__tests__/factory.statusCommand.test.js.map +1 -0
  134. package/dist/__tests__/fileRules/queryTokenRules.test.js +35 -0
  135. package/dist/__tests__/fileRules/queryTokenRules.test.js.map +1 -0
  136. package/dist/__tests__/fileRules/searchPathClassification.test.js +57 -0
  137. package/dist/__tests__/fileRules/searchPathClassification.test.js.map +1 -0
  138. package/dist/__tests__/generate.ollamaRecovery.test.js +344 -0
  139. package/dist/__tests__/generate.ollamaRecovery.test.js.map +1 -0
  140. package/dist/__tests__/index.modelStartup.test.js +24 -0
  141. package/dist/__tests__/index.modelStartup.test.js.map +1 -0
  142. package/dist/__tests__/indexCmd.test.js +85 -0
  143. package/dist/__tests__/indexCmd.test.js.map +1 -0
  144. package/dist/__tests__/indexSlashCommand.test.js +50 -0
  145. package/dist/__tests__/indexSlashCommand.test.js.map +1 -0
  146. package/dist/__tests__/ollamaService.test.js +103 -0
  147. package/dist/__tests__/ollamaService.test.js.map +1 -0
  148. package/dist/__tests__/pipeline/modules/codeTransformModule.small-file.test.js +68 -0
  149. package/dist/__tests__/pipeline/modules/codeTransformModule.small-file.test.js.map +1 -0
  150. package/dist/__tests__/pipeline/modules/commitSuggesterModule.test.js +68 -0
  151. package/dist/__tests__/pipeline/modules/commitSuggesterModule.test.js.map +1 -0
  152. package/dist/__tests__/pipeline/modules/fileSearchModule.test.js +284 -0
  153. package/dist/__tests__/pipeline/modules/fileSearchModule.test.js.map +1 -0
  154. package/dist/__tests__/pipeline/modules/finalAnswerModule.test.js +1139 -0
  155. package/dist/__tests__/pipeline/modules/finalAnswerModule.test.js.map +1 -0
  156. package/dist/__tests__/pipeline/modules/readFileModule.test.js +146 -0
  157. package/dist/__tests__/pipeline/modules/readFileModule.test.js.map +1 -0
  158. package/dist/__tests__/pipeline/modules/semanticAnalysisModule.test.js +192 -0
  159. package/dist/__tests__/pipeline/modules/semanticAnalysisModule.test.js.map +1 -0
  160. package/dist/__tests__/repoIdentity.test.js +31 -0
  161. package/dist/__tests__/repoIdentity.test.js.map +1 -0
  162. package/dist/__tests__/resumeContext.test.js +87 -0
  163. package/dist/__tests__/resumeContext.test.js.map +1 -0
  164. package/dist/__tests__/resumeState.test.js +239 -0
  165. package/dist/__tests__/resumeState.test.js.map +1 -0
  166. package/dist/__tests__/search/SearchOrchestrator.test.js +836 -0
  167. package/dist/__tests__/search/SearchOrchestrator.test.js.map +1 -0
  168. package/dist/__tests__/shellDialogUi.test.js +52 -0
  169. package/dist/__tests__/shellDialogUi.test.js.map +1 -0
  170. package/dist/__tests__/shellSession.test.js +102 -0
  171. package/dist/__tests__/shellSession.test.js.map +1 -0
  172. package/dist/__tests__/statusOwner.test.js +215 -0
  173. package/dist/__tests__/statusOwner.test.js.map +1 -0
  174. package/dist/__tests__/testing/contextEval.test.js +244 -0
  175. package/dist/__tests__/testing/contextEval.test.js.map +1 -0
  176. package/dist/__tests__/testing/harnessArtifacts.test.js +124 -0
  177. package/dist/__tests__/testing/harnessArtifacts.test.js.map +1 -0
  178. package/dist/__tests__/testing/llmTraceSession.test.js +67 -0
  179. package/dist/__tests__/testing/llmTraceSession.test.js.map +1 -0
  180. package/dist/__tests__/testing/registerDevCliCommands.test.js +35 -0
  181. package/dist/__tests__/testing/registerDevCliCommands.test.js.map +1 -0
  182. package/dist/__tests__/testing/runDiagnosis.test.js +159 -0
  183. package/dist/__tests__/testing/runDiagnosis.test.js.map +1 -0
  184. package/dist/__tests__/testing/runtimeLogReader.test.js +66 -0
  185. package/dist/__tests__/testing/runtimeLogReader.test.js.map +1 -0
  186. package/dist/__tests__/testing/testCommands.test.js +53 -0
  187. package/dist/__tests__/testing/testCommands.test.js.map +1 -0
  188. package/dist/__tests__/utils/compileSearchQuery.test.js +38 -0
  189. package/dist/__tests__/utils/compileSearchQuery.test.js.map +1 -0
  190. package/dist/__tests__/utils/consolePresentation.test.js +105 -0
  191. package/dist/__tests__/utils/consolePresentation.test.js.map +1 -0
  192. package/dist/__tests__/utils/extractFileReferences.test.js +41 -0
  193. package/dist/__tests__/utils/extractFileReferences.test.js.map +1 -0
  194. package/dist/__tests__/utils/log.test.js +34 -0
  195. package/dist/__tests__/utils/log.test.js.map +1 -0
  196. package/dist/__tests__/utils/runtimeLogger.test.js +200 -0
  197. package/dist/__tests__/utils/runtimeLogger.test.js.map +1 -0
  198. package/dist/__tests__/utils/spinner.test.js +31 -0
  199. package/dist/__tests__/utils/spinner.test.js.map +1 -0
  200. package/dist/__tests__/utils/verifyFocusPreference.test.js +41 -0
  201. package/dist/__tests__/utils/verifyFocusPreference.test.js.map +1 -0
  202. package/dist/agent/actions/index.js +301 -0
  203. package/dist/agent/actions/index.js.map +1 -0
  204. package/dist/agent/actions/normalize.js +360 -0
  205. package/dist/agent/actions/normalize.js.map +1 -0
  206. package/dist/agent/actions/schemas.js +129 -0
  207. package/dist/agent/actions/schemas.js.map +1 -0
  208. package/dist/agent/evidence/index.js +320 -0
  209. package/dist/agent/evidence/index.js.map +1 -0
  210. package/dist/agent/feedback/index.js +187 -0
  211. package/dist/agent/feedback/index.js.map +1 -0
  212. package/dist/agent/finalization/index.js +35 -0
  213. package/dist/agent/finalization/index.js.map +1 -0
  214. package/dist/agent/index.js +126 -0
  215. package/dist/agent/index.js.map +1 -0
  216. package/dist/agent/logging/index.js +350 -0
  217. package/dist/agent/logging/index.js.map +1 -0
  218. package/dist/agent/persistence/boot.js +58 -0
  219. package/dist/agent/persistence/boot.js.map +1 -0
  220. package/dist/agent/persistence/currentTask.js +36 -0
  221. package/dist/agent/persistence/currentTask.js.map +1 -0
  222. package/dist/agent/persistence/hydrate.js +42 -0
  223. package/dist/agent/persistence/hydrate.js.map +1 -0
  224. package/dist/agent/persistence/index.js +15 -0
  225. package/dist/agent/persistence/index.js.map +1 -0
  226. package/dist/agent/persistence/snapshots.js +97 -0
  227. package/dist/agent/persistence/snapshots.js.map +1 -0
  228. package/dist/agent/persistence/steps.js +95 -0
  229. package/dist/agent/persistence/steps.js.map +1 -0
  230. package/dist/agent/persistence/tasks.js +195 -0
  231. package/dist/agent/persistence/tasks.js.map +1 -0
  232. package/dist/agent/persistence/turns.js +92 -0
  233. package/dist/agent/persistence/turns.js.map +1 -0
  234. package/dist/agent/policy/ambiguityResolution.js +226 -0
  235. package/dist/agent/policy/ambiguityResolution.js.map +1 -0
  236. package/dist/agent/policy/contracts.js +2 -0
  237. package/dist/agent/policy/contracts.js.map +1 -0
  238. package/dist/agent/policy/coveragePolicy.js +309 -0
  239. package/dist/agent/policy/coveragePolicy.js.map +1 -0
  240. package/dist/agent/policy/endDecisionPolicy.js +31 -0
  241. package/dist/agent/policy/endDecisionPolicy.js.map +1 -0
  242. package/dist/agent/policy/index.js +344 -0
  243. package/dist/agent/policy/index.js.map +1 -0
  244. package/dist/agent/policy/loopReview.js +778 -0
  245. package/dist/agent/policy/loopReview.js.map +1 -0
  246. package/dist/agent/policy/readinessPolicy.js +108 -0
  247. package/dist/agent/policy/readinessPolicy.js.map +1 -0
  248. package/dist/agent/policy/resolutionPipeline.js +356 -0
  249. package/dist/agent/policy/resolutionPipeline.js.map +1 -0
  250. package/dist/agent/policy/targetClassification.js +33 -0
  251. package/dist/agent/policy/targetClassification.js.map +1 -0
  252. package/dist/agent/prompting/actionChoice.js +90 -0
  253. package/dist/agent/prompting/actionChoice.js.map +1 -0
  254. package/dist/agent/prompting/finalAnswer.js +38 -0
  255. package/dist/agent/prompting/finalAnswer.js.map +1 -0
  256. package/dist/agent/prompting/index.js +14 -0
  257. package/dist/agent/prompting/index.js.map +1 -0
  258. package/dist/agent/prompting/plan.js +59 -0
  259. package/dist/agent/prompting/plan.js.map +1 -0
  260. package/dist/agent/prompting/transform.js +175 -0
  261. package/dist/agent/prompting/transform.js.map +1 -0
  262. package/dist/agent/prompting/understand.js +70 -0
  263. package/dist/agent/prompting/understand.js.map +1 -0
  264. package/dist/agent/read/freshness.js +29 -0
  265. package/dist/agent/read/freshness.js.map +1 -0
  266. package/dist/agent/read/fullReadPrompt.js +43 -0
  267. package/dist/agent/read/fullReadPrompt.js.map +1 -0
  268. package/dist/agent/read/index.js +140 -0
  269. package/dist/agent/read/index.js.map +1 -0
  270. package/dist/agent/read/persistence.js +88 -0
  271. package/dist/agent/read/persistence.js.map +1 -0
  272. package/dist/agent/read/summarizeReadEvidence.js +733 -0
  273. package/dist/agent/read/summarizeReadEvidence.js.map +1 -0
  274. package/dist/agent/read/targetResolution.js +126 -0
  275. package/dist/agent/read/targetResolution.js.map +1 -0
  276. package/dist/agent/resume/checkpoint.js +41 -0
  277. package/dist/agent/resume/checkpoint.js.map +1 -0
  278. package/dist/agent/runtime/lifecycle.js +67 -0
  279. package/dist/agent/runtime/lifecycle.js.map +1 -0
  280. package/dist/agent/runtime/progress.js +178 -0
  281. package/dist/agent/runtime/progress.js.map +1 -0
  282. package/dist/agent/runtime/runAgentLoop.js +402 -0
  283. package/dist/agent/runtime/runAgentLoop.js.map +1 -0
  284. package/dist/agent/runtime/runAgentPlanOnly.js +127 -0
  285. package/dist/agent/runtime/runAgentPlanOnly.js.map +1 -0
  286. package/dist/agent/runtime/understand.js +336 -0
  287. package/dist/agent/runtime/understand.js.map +1 -0
  288. package/dist/agent/search/batchPlanner.js +274 -0
  289. package/dist/agent/search/batchPlanner.js.map +1 -0
  290. package/dist/agent/search/candidateRetentionPolicy.js +184 -0
  291. package/dist/agent/search/candidateRetentionPolicy.js.map +1 -0
  292. package/dist/agent/search/directory.js +51 -0
  293. package/dist/agent/search/directory.js.map +1 -0
  294. package/dist/agent/search/exactTarget.js +151 -0
  295. package/dist/agent/search/exactTarget.js.map +1 -0
  296. package/dist/agent/search/fragment.js +110 -0
  297. package/dist/agent/search/fragment.js.map +1 -0
  298. package/dist/agent/search/index.js +166 -0
  299. package/dist/agent/search/index.js.map +1 -0
  300. package/dist/agent/search/laneClassifier.js +119 -0
  301. package/dist/agent/search/laneClassifier.js.map +1 -0
  302. package/dist/agent/search/limits.js +10 -0
  303. package/dist/agent/search/limits.js.map +1 -0
  304. package/dist/agent/search/ranking.js +22 -0
  305. package/dist/agent/search/ranking.js.map +1 -0
  306. package/dist/agent/search/regex.js +83 -0
  307. package/dist/agent/search/regex.js.map +1 -0
  308. package/dist/agent/search/routePolicy.js +11 -0
  309. package/dist/agent/search/routePolicy.js.map +1 -0
  310. package/dist/agent/search/searchContext.js +128 -0
  311. package/dist/agent/search/searchContext.js.map +1 -0
  312. package/dist/agent/search/semantic.js +113 -0
  313. package/dist/agent/search/semantic.js.map +1 -0
  314. package/dist/agent/search/semanticIndexSearch.js +202 -0
  315. package/dist/agent/search/semanticIndexSearch.js.map +1 -0
  316. package/dist/agent/search/shared.js +283 -0
  317. package/dist/agent/search/shared.js.map +1 -0
  318. package/dist/agent/search/shell.js +202 -0
  319. package/dist/agent/search/shell.js.map +1 -0
  320. package/dist/agent/search/snippetEvidence.js +57 -0
  321. package/dist/agent/search/snippetEvidence.js.map +1 -0
  322. package/dist/agent/search/types.js +2 -0
  323. package/dist/agent/search/types.js.map +1 -0
  324. package/dist/agent/state/index.js +99 -0
  325. package/dist/agent/state/index.js.map +1 -0
  326. package/dist/agent/state/memory.js +56 -0
  327. package/dist/agent/state/memory.js.map +1 -0
  328. package/dist/agent/structuredOutput/index.js +28 -0
  329. package/dist/agent/structuredOutput/index.js.map +1 -0
  330. package/dist/agent/tools/index.js +199 -0
  331. package/dist/agent/tools/index.js.map +1 -0
  332. package/dist/agent/transform/index.js +519 -0
  333. package/dist/agent/transform/index.js.map +1 -0
  334. package/dist/agent/transform/syntax.js +49 -0
  335. package/dist/agent/transform/syntax.js.map +1 -0
  336. package/dist/agent/types.js +20 -0
  337. package/dist/agent/types.js.map +1 -0
  338. package/dist/agents/actionRegistry.js +114 -0
  339. package/dist/agents/actionRegistry.js.map +1 -0
  340. package/dist/agents/agent.js +5 -0
  341. package/dist/agents/agent.js.map +1 -0
  342. package/dist/agents/agentActions.js +5 -0
  343. package/dist/agents/agentActions.js.map +1 -0
  344. package/dist/agents/agentEvidence.js +5 -0
  345. package/dist/agents/agentEvidence.js.map +1 -0
  346. package/dist/agents/agentFeedback.js +5 -0
  347. package/dist/agents/agentFeedback.js.map +1 -0
  348. package/dist/agents/agentLogging.js +5 -0
  349. package/dist/agents/agentLogging.js.map +1 -0
  350. package/dist/agents/agentLoop.js +5 -0
  351. package/dist/agents/agentLoop.js.map +1 -0
  352. package/dist/agents/agentMemory.js +5 -0
  353. package/dist/agents/agentMemory.js.map +1 -0
  354. package/dist/agents/agentPlanMode.js +5 -0
  355. package/dist/agents/agentPlanMode.js.map +1 -0
  356. package/dist/agents/agentPolicyState.js +5 -0
  357. package/dist/agents/agentPolicyState.js.map +1 -0
  358. package/dist/agents/agentProgress.js +93 -0
  359. package/dist/agents/agentProgress.js.map +1 -0
  360. package/dist/agents/agentSchemas.js +5 -0
  361. package/dist/agents/agentSchemas.js.map +1 -0
  362. package/dist/agents/agentSearchScoring.js +5 -0
  363. package/dist/agents/agentSearchScoring.js.map +1 -0
  364. package/dist/agents/agentStateMachine.js +5 -0
  365. package/dist/agents/agentStateMachine.js.map +1 -0
  366. package/dist/agents/agentTools.js +5 -0
  367. package/dist/agents/agentTools.js.map +1 -0
  368. package/dist/agents/agentTypes.js +5 -0
  369. package/dist/agents/agentTypes.js.map +1 -0
  370. package/dist/agents/agentUnderstand.js +5 -0
  371. package/dist/agents/agentUnderstand.js.map +1 -0
  372. package/dist/agents/analysisPlanGenStep.js +194 -17
  373. package/dist/agents/analysisPlanGenStep.js.map +1 -0
  374. package/dist/agents/answerOnlyCompletion.js +32 -0
  375. package/dist/agents/answerOnlyCompletion.js.map +1 -0
  376. package/dist/agents/collaboratorStep.js +1 -0
  377. package/dist/agents/collaboratorStep.js.map +1 -0
  378. package/dist/agents/decideNextAction.js +444 -0
  379. package/dist/agents/decideNextAction.js.map +1 -0
  380. package/dist/agents/deriveFocusFromSearchStep.js +83 -0
  381. package/dist/agents/deriveFocusFromSearchStep.js.map +1 -0
  382. package/dist/agents/evidenceVerifierStep.js +104 -13
  383. package/dist/agents/evidenceVerifierStep.js.map +1 -0
  384. package/dist/agents/fileCheckStep.js +381 -12
  385. package/dist/agents/fileCheckStep.js.map +1 -0
  386. package/dist/agents/giveUpEvaluatorStep.js +63 -0
  387. package/dist/agents/giveUpEvaluatorStep.js.map +1 -0
  388. package/dist/agents/guardPolicy.js +20 -0
  389. package/dist/agents/guardPolicy.js.map +1 -0
  390. package/dist/agents/guards/executionPolicyResolver.js +165 -0
  391. package/dist/agents/guards/executionPolicyResolver.js.map +1 -0
  392. package/dist/agents/guards/guardState.js +195 -0
  393. package/dist/agents/guards/guardState.js.map +1 -0
  394. package/dist/agents/guards/resolveProgressState.js +403 -0
  395. package/dist/agents/guards/resolveProgressState.js.map +1 -0
  396. package/dist/agents/infoPlanGenStep.js +66 -8
  397. package/dist/agents/infoPlanGenStep.js.map +1 -0
  398. package/dist/agents/integrateFeedbackStep.js +1 -0
  399. package/dist/agents/integrateFeedbackStep.js.map +1 -0
  400. package/dist/agents/iterationFileSelector.js +8 -7
  401. package/dist/agents/iterationFileSelector.js.map +1 -0
  402. package/dist/agents/mainAgentActivityLog.js +85 -0
  403. package/dist/agents/mainAgentActivityLog.js.map +1 -0
  404. package/dist/agents/mainAgentHeuristics.js +173 -0
  405. package/dist/agents/mainAgentHeuristics.js.map +1 -0
  406. package/dist/agents/mainAgentVerify.js +159 -0
  407. package/dist/agents/mainAgentVerify.js.map +1 -0
  408. package/dist/agents/objectiveEvaluatorStep.js +103 -0
  409. package/dist/agents/objectiveEvaluatorStep.js.map +1 -0
  410. package/dist/agents/outerLoopRecoveryEvaluator.js +108 -0
  411. package/dist/agents/outerLoopRecoveryEvaluator.js.map +1 -0
  412. package/dist/agents/readinessGateStep.js +95 -9
  413. package/dist/agents/readinessGateStep.js.map +1 -0
  414. package/dist/agents/reasonNextStep.js +9 -8
  415. package/dist/agents/reasonNextStep.js.map +1 -0
  416. package/dist/agents/reasonNextTaskStep.js +267 -144
  417. package/dist/agents/reasonNextTaskStep.js.map +1 -0
  418. package/dist/agents/researchPlanGenStep.js +61 -25
  419. package/dist/agents/researchPlanGenStep.js.map +1 -0
  420. package/dist/agents/resolveAgentTargetClassification.js +5 -0
  421. package/dist/agents/resolveAgentTargetClassification.js.map +1 -0
  422. package/dist/agents/resolveExecutionModeStep.js +1 -0
  423. package/dist/agents/resolveExecutionModeStep.js.map +1 -0
  424. package/dist/agents/resolveExplicitTargetsStep.js +74 -0
  425. package/dist/agents/resolveExplicitTargetsStep.js.map +1 -0
  426. package/dist/agents/routingDecisionStep.js +58 -11
  427. package/dist/agents/routingDecisionStep.js.map +1 -0
  428. package/dist/agents/scopeClassificationStep.js +66 -3
  429. package/dist/agents/scopeClassificationStep.js.map +1 -0
  430. package/dist/agents/selectRelevantSourcesStep.js +13 -5
  431. package/dist/agents/selectRelevantSourcesStep.js.map +1 -0
  432. package/dist/agents/structuralPreloadStep.js +3 -4
  433. package/dist/agents/structuralPreloadStep.js.map +1 -0
  434. package/dist/agents/transformPlanGenStep.js +105 -18
  435. package/dist/agents/transformPlanGenStep.js.map +1 -0
  436. package/dist/agents/understandIntentStep.js +237 -17
  437. package/dist/agents/understandIntentStep.js.map +1 -0
  438. package/dist/agents/validateChangesStep.js +16 -2
  439. package/dist/agents/validateChangesStep.js.map +1 -0
  440. package/dist/agents/writeFileStep.js +1 -0
  441. package/dist/agents/writeFileStep.js.map +1 -0
  442. package/dist/commands/AskCmd.js +139 -44
  443. package/dist/commands/AskCmd.js.map +1 -0
  444. package/dist/commands/BackupCmd.js +1 -0
  445. package/dist/commands/BackupCmd.js.map +1 -0
  446. package/dist/commands/ChangeLogUpdateCmd.js +1 -0
  447. package/dist/commands/ChangeLogUpdateCmd.js.map +1 -0
  448. package/dist/commands/CommitSuggesterCmd.js +55 -13
  449. package/dist/commands/CommitSuggesterCmd.js.map +1 -0
  450. package/dist/commands/DaemonCmd.js +52 -14
  451. package/dist/commands/DaemonCmd.js.map +1 -0
  452. package/dist/commands/DeleteIndex.js +1 -0
  453. package/dist/commands/DeleteIndex.js.map +1 -0
  454. package/dist/commands/EvalReportCmd.js +374 -0
  455. package/dist/commands/EvalReportCmd.js.map +1 -0
  456. package/dist/commands/FindCmd.js +1 -0
  457. package/dist/commands/FindCmd.js.map +1 -0
  458. package/dist/commands/GitCmd.js +1 -0
  459. package/dist/commands/GitCmd.js.map +1 -0
  460. package/dist/commands/IndexCmd.js +11 -79
  461. package/dist/commands/IndexCmd.js.map +1 -0
  462. package/dist/commands/InspectCmd.js +1 -0
  463. package/dist/commands/InspectCmd.js.map +1 -0
  464. package/dist/commands/ModelCmd.js +24 -0
  465. package/dist/commands/ModelCmd.js.map +1 -0
  466. package/dist/commands/ReadlineSingleton.js +1 -0
  467. package/dist/commands/ReadlineSingleton.js.map +1 -0
  468. package/dist/commands/ResetDbCmd.js +18 -1
  469. package/dist/commands/ResetDbCmd.js.map +1 -0
  470. package/dist/commands/ReviewCmd.js +1 -0
  471. package/dist/commands/ReviewCmd.js.map +1 -0
  472. package/dist/commands/StatusCmd.js +22 -0
  473. package/dist/commands/StatusCmd.js.map +1 -0
  474. package/dist/commands/StopDaemonCmd.js +1 -0
  475. package/dist/commands/StopDaemonCmd.js.map +1 -0
  476. package/dist/commands/SummaryCmd.js +1 -0
  477. package/dist/commands/SummaryCmd.js.map +1 -0
  478. package/dist/commands/SwitchCmd.js +9 -15
  479. package/dist/commands/SwitchCmd.js.map +1 -0
  480. package/dist/commands/TasksCmd.js +142 -57
  481. package/dist/commands/TasksCmd.js.map +1 -0
  482. package/dist/commands/TestCmd.js +66 -0
  483. package/dist/commands/TestCmd.js.map +1 -0
  484. package/dist/commands/WorkflowCmd.js +1 -0
  485. package/dist/commands/WorkflowCmd.js.map +1 -0
  486. package/dist/commands/commandVisibility.js +27 -0
  487. package/dist/commands/commandVisibility.js.map +1 -0
  488. package/dist/commands/evalCommands.js +1337 -0
  489. package/dist/commands/evalCommands.js.map +1 -0
  490. package/dist/commands/factory.js +206 -38
  491. package/dist/commands/factory.js.map +1 -0
  492. package/dist/config.js +62 -11
  493. package/dist/config.js.map +1 -0
  494. package/dist/constants.js +21 -3
  495. package/dist/constants.js.map +1 -0
  496. package/dist/context.js +33 -32
  497. package/dist/context.js.map +1 -0
  498. package/dist/daemon/daemonQueues.js +1 -20
  499. package/dist/daemon/daemonQueues.js.map +1 -0
  500. package/dist/daemon/daemonWorker.js +26 -37
  501. package/dist/daemon/daemonWorker.js.map +1 -0
  502. package/dist/daemon/generateSummaries.js +1 -0
  503. package/dist/daemon/generateSummaries.js.map +1 -0
  504. package/dist/daemon/runFolderCapsuleBatch.js +1 -0
  505. package/dist/daemon/runFolderCapsuleBatch.js.map +1 -0
  506. package/dist/daemon/runIndexingBatch.js +1 -0
  507. package/dist/daemon/runIndexingBatch.js.map +1 -0
  508. package/dist/daemon/runKgBatch.js +9 -1
  509. package/dist/daemon/runKgBatch.js.map +1 -0
  510. package/dist/db/backup.js +1 -0
  511. package/dist/db/backup.js.map +1 -0
  512. package/dist/db/client.js +18 -3
  513. package/dist/db/client.js.map +1 -0
  514. package/dist/db/fileIndex.js +110 -152
  515. package/dist/db/fileIndex.js.map +1 -0
  516. package/dist/db/functionExtractors/extractFromJava.js +1 -0
  517. package/dist/db/functionExtractors/extractFromJava.js.map +1 -0
  518. package/dist/db/functionExtractors/extractFromJs.js +1 -0
  519. package/dist/db/functionExtractors/extractFromJs.js.map +1 -0
  520. package/dist/db/functionExtractors/extractFromTs.js +1 -0
  521. package/dist/db/functionExtractors/extractFromTs.js.map +1 -0
  522. package/dist/db/functionExtractors/extractFromXML.js +1 -0
  523. package/dist/db/functionExtractors/extractFromXML.js.map +1 -0
  524. package/dist/db/functionExtractors/index.js +1 -0
  525. package/dist/db/functionExtractors/index.js.map +1 -0
  526. package/dist/db/functionIndex.js +9 -0
  527. package/dist/db/functionIndex.js.map +1 -0
  528. package/dist/db/schema.js +314 -99
  529. package/dist/db/schema.js.map +1 -0
  530. package/dist/db/sqlTemplates.js +1 -0
  531. package/dist/db/sqlTemplates.js.map +1 -0
  532. package/dist/fileRules/builtins.js +1 -0
  533. package/dist/fileRules/builtins.js.map +1 -0
  534. package/dist/fileRules/classifyFile.js +1 -0
  535. package/dist/fileRules/classifyFile.js.map +1 -0
  536. package/dist/fileRules/codeAllowedExtensions.js +1 -0
  537. package/dist/fileRules/codeAllowedExtensions.js.map +1 -0
  538. package/dist/fileRules/detectFileType.js +1 -0
  539. package/dist/fileRules/detectFileType.js.map +1 -0
  540. package/dist/fileRules/fileClassifier.js +1 -0
  541. package/dist/fileRules/fileClassifier.js.map +1 -0
  542. package/dist/fileRules/fileExceptions.js +1 -0
  543. package/dist/fileRules/fileExceptions.js.map +1 -0
  544. package/dist/fileRules/ignoredExtensions.js +1 -0
  545. package/dist/fileRules/ignoredExtensions.js.map +1 -0
  546. package/dist/fileRules/ignoredPaths.js +48 -5
  547. package/dist/fileRules/ignoredPaths.js.map +1 -0
  548. package/dist/fileRules/queryTokenRules.js +176 -0
  549. package/dist/fileRules/queryTokenRules.js.map +1 -0
  550. package/dist/fileRules/searchPathClassification.js +58 -0
  551. package/dist/fileRules/searchPathClassification.js.map +1 -0
  552. package/dist/fileRules/shouldIgnoreFiles.js +1 -0
  553. package/dist/fileRules/shouldIgnoreFiles.js.map +1 -0
  554. package/dist/fileRules/stopWords.js +9 -0
  555. package/dist/fileRules/stopWords.js.map +1 -0
  556. package/dist/fileRules/wellKnownRepoFiles.js +1 -0
  557. package/dist/fileRules/wellKnownRepoFiles.js.map +1 -0
  558. package/dist/git/commitSummary.js +227 -0
  559. package/dist/git/commitSummary.js.map +1 -0
  560. package/dist/github/api.js +1 -0
  561. package/dist/github/api.js.map +1 -0
  562. package/dist/github/auth.js +1 -0
  563. package/dist/github/auth.js.map +1 -0
  564. package/dist/github/github.js +1 -0
  565. package/dist/github/github.js.map +1 -0
  566. package/dist/github/githubAuthCheck.js +1 -0
  567. package/dist/github/githubAuthCheck.js.map +1 -0
  568. package/dist/github/postComments.js +1 -0
  569. package/dist/github/postComments.js.map +1 -0
  570. package/dist/github/repo.js +15 -24
  571. package/dist/github/repo.js.map +1 -0
  572. package/dist/github/token.js +1 -0
  573. package/dist/github/token.js.map +1 -0
  574. package/dist/github/types.js +1 -0
  575. package/dist/github/types.js.map +1 -0
  576. package/dist/index.js +318 -37
  577. package/dist/index.js.map +1 -0
  578. package/dist/lib/generate.js +264 -20
  579. package/dist/lib/generate.js.map +1 -0
  580. package/dist/lib/generateFolderCapsules.js +1 -0
  581. package/dist/lib/generateFolderCapsules.js.map +1 -0
  582. package/dist/lib/ollamaModelPolicy.js +59 -0
  583. package/dist/lib/ollamaModelPolicy.js.map +1 -0
  584. package/dist/lib/spinner.js +29 -9
  585. package/dist/lib/spinner.js.map +1 -0
  586. package/dist/modelSetup.js +25 -78
  587. package/dist/modelSetup.js.map +1 -0
  588. package/dist/pipeline/modules/changeLogModule.js +10 -1
  589. package/dist/pipeline/modules/changeLogModule.js.map +1 -0
  590. package/dist/pipeline/modules/cleanupModule.js +1 -0
  591. package/dist/pipeline/modules/cleanupModule.js.map +1 -0
  592. package/dist/pipeline/modules/codeTransformModule.js +10 -16
  593. package/dist/pipeline/modules/codeTransformModule.js.map +1 -0
  594. package/dist/pipeline/modules/commentModule.js +12 -0
  595. package/dist/pipeline/modules/commentModule.js.map +1 -0
  596. package/dist/pipeline/modules/commitSuggesterModule.js +82 -12
  597. package/dist/pipeline/modules/commitSuggesterModule.js.map +1 -0
  598. package/dist/pipeline/modules/contextReviewModule.js +12 -1
  599. package/dist/pipeline/modules/contextReviewModule.js.map +1 -0
  600. package/dist/pipeline/modules/dialogAnswerModule.js +58 -0
  601. package/dist/pipeline/modules/dialogAnswerModule.js.map +1 -0
  602. package/dist/pipeline/modules/fileSearchModule.js +5 -143
  603. package/dist/pipeline/modules/fileSearchModule.js.map +1 -0
  604. package/dist/pipeline/modules/finalAnswerModule.js +1176 -151
  605. package/dist/pipeline/modules/finalAnswerModule.js.map +1 -0
  606. package/dist/pipeline/modules/kgModule.js +18 -1
  607. package/dist/pipeline/modules/kgModule.js.map +1 -0
  608. package/dist/pipeline/modules/planAnswerModule.js +99 -0
  609. package/dist/pipeline/modules/planAnswerModule.js.map +1 -0
  610. package/dist/pipeline/modules/readFileModule.js +300 -0
  611. package/dist/pipeline/modules/readFileModule.js.map +1 -0
  612. package/dist/pipeline/modules/reviewModule.js +10 -1
  613. package/dist/pipeline/modules/reviewModule.js.map +1 -0
  614. package/dist/pipeline/modules/searchDbModule.js +159 -0
  615. package/dist/pipeline/modules/searchDbModule.js.map +1 -0
  616. package/dist/pipeline/modules/searchListDirectoryModule.js +62 -0
  617. package/dist/pipeline/modules/searchListDirectoryModule.js.map +1 -0
  618. package/dist/pipeline/modules/searchModuleShared.js +71 -0
  619. package/dist/pipeline/modules/searchModuleShared.js.map +1 -0
  620. package/dist/pipeline/modules/searchRegexModule.js +59 -0
  621. package/dist/pipeline/modules/searchRegexModule.js.map +1 -0
  622. package/dist/pipeline/modules/semanticAnalysisModule.js +185 -28
  623. package/dist/pipeline/modules/semanticAnalysisModule.js.map +1 -0
  624. package/dist/pipeline/modules/summaryModule.js +11 -1
  625. package/dist/pipeline/modules/summaryModule.js.map +1 -0
  626. package/dist/pipeline/registry/moduleRegistry.js +9 -0
  627. package/dist/pipeline/registry/moduleRegistry.js.map +1 -0
  628. package/dist/pipeline/runModulePipeline.js +1 -0
  629. package/dist/pipeline/runModulePipeline.js.map +1 -0
  630. package/dist/scripts/dbScriptSupport.js +172 -0
  631. package/dist/scripts/dbScriptSupport.js.map +1 -0
  632. package/dist/scripts/dbcheck.js +173 -267
  633. package/dist/scripts/dbcheck.js.map +1 -0
  634. package/dist/scripts/dboverview.js +161 -0
  635. package/dist/scripts/dboverview.js.map +1 -0
  636. package/dist/scripts/migrateDb.js +1 -0
  637. package/dist/scripts/migrateDb.js.map +1 -0
  638. package/dist/search/SearchOrchestrator.js +928 -0
  639. package/dist/search/SearchOrchestrator.js.map +1 -0
  640. package/dist/search/sharedRankingPolicy.js +283 -0
  641. package/dist/search/sharedRankingPolicy.js.map +1 -0
  642. package/dist/setup/reindexOwner.js +97 -0
  643. package/dist/setup/reindexOwner.js.map +1 -0
  644. package/dist/setup/setupOwner.js +100 -0
  645. package/dist/setup/setupOwner.js.map +1 -0
  646. package/dist/shell/dialogUi.js +81 -0
  647. package/dist/shell/dialogUi.js.map +1 -0
  648. package/dist/shellSession.js +126 -0
  649. package/dist/shellSession.js.map +1 -0
  650. package/dist/status/statusOwner.js +239 -0
  651. package/dist/status/statusOwner.js.map +1 -0
  652. package/dist/testing/contextEval.js +514 -0
  653. package/dist/testing/contextEval.js.map +1 -0
  654. package/dist/testing/fixtures/transform/small-file.input.js +5 -0
  655. package/dist/testing/fixtures/transform/small-file.input.js.map +1 -0
  656. package/dist/testing/harnessArtifacts.js +112 -0
  657. package/dist/testing/harnessArtifacts.js.map +1 -0
  658. package/dist/testing/llmTraceSession.js +67 -0
  659. package/dist/testing/llmTraceSession.js.map +1 -0
  660. package/dist/testing/registerDevCliCommands.js +43 -0
  661. package/dist/testing/registerDevCliCommands.js.map +1 -0
  662. package/dist/testing/runDiagnosis.js +248 -0
  663. package/dist/testing/runDiagnosis.js.map +1 -0
  664. package/dist/testing/runtimeLogReader.js +144 -0
  665. package/dist/testing/runtimeLogReader.js.map +1 -0
  666. package/dist/testing/testCommands.js +35 -303
  667. package/dist/testing/testCommands.js.map +1 -0
  668. package/dist/testing/testRegistry.js +233 -0
  669. package/dist/testing/testRegistry.js.map +1 -0
  670. package/dist/types.js +1 -0
  671. package/dist/types.js.map +1 -0
  672. package/dist/utils/buildContextualPrompt.js +26 -75
  673. package/dist/utils/buildContextualPrompt.js.map +1 -0
  674. package/dist/utils/changeLogPrompt.js +1 -0
  675. package/dist/utils/changeLogPrompt.js.map +1 -0
  676. package/dist/utils/checkModel.js +17 -92
  677. package/dist/utils/checkModel.js.map +1 -0
  678. package/dist/utils/commentMap.js +1 -0
  679. package/dist/utils/commentMap.js.map +1 -0
  680. package/dist/utils/compileSearchQuery.js +23 -9
  681. package/dist/utils/compileSearchQuery.js.map +1 -0
  682. package/dist/utils/consolePresentation.js +208 -0
  683. package/dist/utils/consolePresentation.js.map +1 -0
  684. package/dist/utils/contentUtils.js +17 -2
  685. package/dist/utils/contentUtils.js.map +1 -0
  686. package/dist/utils/debugContext.js +1 -0
  687. package/dist/utils/debugContext.js.map +1 -0
  688. package/dist/utils/dialogState.js +201 -0
  689. package/dist/utils/dialogState.js.map +1 -0
  690. package/dist/utils/editor.js +1 -0
  691. package/dist/utils/editor.js.map +1 -0
  692. package/dist/utils/executionEvidence.js +50 -0
  693. package/dist/utils/executionEvidence.js.map +1 -0
  694. package/dist/utils/extractFileReferences.js +140 -6
  695. package/dist/utils/extractFileReferences.js.map +1 -0
  696. package/dist/utils/fileEvidenceCache.js +50 -0
  697. package/dist/utils/fileEvidenceCache.js.map +1 -0
  698. package/dist/utils/fileTree.js +1 -0
  699. package/dist/utils/fileTree.js.map +1 -0
  700. package/dist/utils/loadRelevantFolderCapsules.js +35 -5
  701. package/dist/utils/loadRelevantFolderCapsules.js.map +1 -0
  702. package/dist/utils/log.js +10 -1
  703. package/dist/utils/log.js.map +1 -0
  704. package/dist/utils/normalizeData.js +1 -0
  705. package/dist/utils/normalizeData.js.map +1 -0
  706. package/dist/utils/ollamaModelStatus.js +28 -0
  707. package/dist/utils/ollamaModelStatus.js.map +1 -0
  708. package/dist/utils/ollamaService.js +294 -0
  709. package/dist/utils/ollamaService.js.map +1 -0
  710. package/dist/utils/outputFormatter.js +1 -0
  711. package/dist/utils/outputFormatter.js.map +1 -0
  712. package/dist/utils/parseTaggedContent.js +1 -0
  713. package/dist/utils/parseTaggedContent.js.map +1 -0
  714. package/dist/utils/planActions.js +27 -46
  715. package/dist/utils/planActions.js.map +1 -0
  716. package/dist/utils/promptBuilderHelper.js +1 -0
  717. package/dist/utils/promptBuilderHelper.js.map +1 -0
  718. package/dist/utils/promptLogHelper.js +29 -13
  719. package/dist/utils/promptLogHelper.js.map +1 -0
  720. package/dist/utils/queryAnchors.js +71 -0
  721. package/dist/utils/queryAnchors.js.map +1 -0
  722. package/dist/utils/repoIdentity.js +82 -0
  723. package/dist/utils/repoIdentity.js.map +1 -0
  724. package/dist/utils/repoKey.js +1 -0
  725. package/dist/utils/repoKey.js.map +1 -0
  726. package/dist/utils/resolveTargetsToFiles.js +1 -0
  727. package/dist/utils/resolveTargetsToFiles.js.map +1 -0
  728. package/dist/utils/resumeContext.js +219 -0
  729. package/dist/utils/resumeContext.js.map +1 -0
  730. package/dist/utils/resumeState.js +310 -0
  731. package/dist/utils/resumeState.js.map +1 -0
  732. package/dist/utils/rollingPlan.js +118 -0
  733. package/dist/utils/rollingPlan.js.map +1 -0
  734. package/dist/utils/runQueryWithDaemonControl.js +11 -3
  735. package/dist/utils/runQueryWithDaemonControl.js.map +1 -0
  736. package/dist/utils/runtimeLogger.js +252 -0
  737. package/dist/utils/runtimeLogger.js.map +1 -0
  738. package/dist/utils/sanitizeQuery.js +1 -0
  739. package/dist/utils/sanitizeQuery.js.map +1 -0
  740. package/dist/utils/sharedUtils.js +1 -0
  741. package/dist/utils/sharedUtils.js.map +1 -0
  742. package/dist/utils/sleep.js +1 -0
  743. package/dist/utils/sleep.js.map +1 -0
  744. package/dist/utils/splitCodeIntoChunk.js +1 -0
  745. package/dist/utils/splitCodeIntoChunk.js.map +1 -0
  746. package/dist/utils/time.js +66 -0
  747. package/dist/utils/time.js.map +1 -0
  748. package/dist/utils/verifyFocusPreference.js +107 -0
  749. package/dist/utils/verifyFocusPreference.js.map +1 -0
  750. package/dist/utils/vscode.js +1 -0
  751. package/dist/utils/vscode.js.map +1 -0
  752. package/dist/workflow/workflowResolver.js +1 -0
  753. package/dist/workflow/workflowResolver.js.map +1 -0
  754. package/dist/workflow/workflowRunner.js +1 -0
  755. package/dist/workflow/workflowRunner.js.map +1 -0
  756. package/package.json +3 -3
  757. package/dist/agents/MainAgent.js +0 -1886
  758. package/dist/agents/contextReviewStep.js +0 -101
  759. package/dist/agents/finalPlanGenStep.js +0 -107
  760. package/dist/agents/structuralAnalysisStep.js +0 -46
  761. package/dist/agents/validationAnalysisStep.js +0 -87
  762. package/dist/pipeline/modules/chunkManagerModule.js +0 -24
  763. package/dist/pipeline/modules/cleanGeneratedTestsModule.js +0 -33
  764. package/dist/pipeline/modules/fileReaderModule.js +0 -72
  765. package/dist/pipeline/modules/gatherInfoModule.js +0 -181
  766. package/dist/pipeline/modules/generateTestsModule.js +0 -68
  767. package/dist/pipeline/modules/preserveCodeModule.js +0 -195
  768. package/dist/pipeline/modules/refactorModule.js +0 -40
  769. package/dist/pipeline/modules/repairTestsModule.js +0 -48
  770. package/dist/pipeline/modules/runTestsModule.js +0 -37
@@ -0,0 +1 @@
1
+ {"version":3,"file":"laneClassifier.js","sourceRoot":"","sources":["../../../src/agent/search/laneClassifier.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Owns first-lane choice for the modular agent search area.\n *\n * Why this file exists:\n * - search should have one clear owner for first-lane choice\n * - the route decision should be explainable from one derived context packet\n * - later policy and readiness stages should consume the chosen lane, not recompute it\n */\nimport type { AgentSearchContext } from \"./searchContext.js\";\nimport type { AgentLaneDecision } from \"./types.js\";\nimport { isDirectoryLikeHint, isStrongFileLikeRef } from \"./searchContext.js\";\n\n/**\n * Detects direct folder-content questions before file search runs.\n * Example: `list files in cli/src/agent/search` should use the directory lane.\n */\nexport function looksLikeDirectoryListingQuery(context: AgentSearchContext): boolean {\n const lowered = String(context.query ?? \"\").toLowerCase();\n const hasStrongFileTarget = context.explicitTargets.some(isStrongFileLikeRef);\n if (hasStrongFileTarget) {\n return false;\n }\n const hasListingVerb = /\\b(list|contents?|files|folders|show)\\b/.test(lowered);\n const hasFolderWord = /\\b(folder|directory|contents?)\\b/.test(lowered);\n const hasFolderHint = context.softHints.some(isDirectoryLikeHint) || context.explicitTargets.some(isDirectoryLikeHint);\n const asksForExplanation = /\\b(why|how|what does|explain|trace|summari[sz]e)\\b/.test(lowered);\n return hasListingVerb && (hasFolderWord || hasFolderHint) && !asksForExplanation;\n}\n\nfunction resolveExplicitFolderTarget(context: AgentSearchContext): string | undefined {\n return context.resolvedTargets.find((resolution) => resolution.kind === \"resolved-folder\")?.folderPath;\n}\n\nfunction resolveExplicitFileTarget(context: AgentSearchContext): string | undefined {\n const resolvedFile = context.resolvedTargets.find((resolution) => resolution.kind === \"resolved-file\");\n if (resolvedFile?.kind === \"resolved-file\") {\n return resolvedFile.filePath;\n }\n if (context.explicitTargets.some(isStrongFileLikeRef)) {\n return context.explicitTargets.find(isStrongFileLikeRef);\n }\n if (context.quotedFragments.length === 0 && context.explicitTargets.length > 0) {\n return context.explicitTargets[0];\n }\n return undefined;\n}\n\nfunction hasUnresolvedExplicitTarget(context: AgentSearchContext): boolean {\n if (context.explicitTargets.length === 0) {\n return false;\n }\n if (resolveExplicitFolderTarget(context) || resolveExplicitFileTarget(context)) {\n return false;\n }\n return true;\n}\n\n/**\n * Detects broad read-only repo questions that are best served by literal content search first.\n * Example: `where do I set the max count for how many loops the agent can run?` should try grep-like search.\n */\nfunction looksLikeShellContentQuery(context: AgentSearchContext): boolean {\n if (context.explicitTargets.length > 0 || context.quotedFragments.length > 0 || context.regexLike) {\n return false;\n }\n\n const lowered = String(context.query ?? \"\").toLowerCase();\n const asksForOwner = /\\b(where|which|what)\\b/.test(lowered) &&\n /\\b(set|sets|setting|defined|defines|configured|configures|controls|decides|owner|owns|limit|limits|threshold|count|max)\\b/.test(lowered);\n const asksForSpecificField = /\\bwhere\\b.+\\b(set|defined|configured)\\b/.test(lowered) ||\n /\\bwhich\\s+file\\b.+\\b(set|defines|configures|controls|decides)\\b/.test(lowered) ||\n /\\bwhat\\s+file\\b.+\\b(set|defines|configures|controls|decides)\\b/.test(lowered);\n const broadScope = context.scopeKind === \"broad-repo\" || context.scopeKind === \"general\";\n return broadScope && (asksForOwner || asksForSpecificField);\n}\n\n/**\n * Chooses one search lane from the shared context packet.\n * Example: a resolved folder target uses `directory`, while a quoted snippet uses `fragment`.\n */\nexport function classifySearchLane(context: AgentSearchContext): AgentLaneDecision {\n const resolvedFolder = resolveExplicitFolderTarget(context);\n if (resolvedFolder && context.allowDirectoryLane) {\n return {\n lane: \"directory\",\n reason: \"resolved explicit folder target\",\n resolvedTarget: resolvedFolder,\n };\n }\n\n if (context.allowDirectoryLane && looksLikeDirectoryListingQuery(context)) {\n return {\n lane: \"directory\",\n reason: \"directory-listing wording with folder-like hints\",\n resolvedTarget: context.softHints.find(isDirectoryLikeHint)\n ?? context.explicitTargets.find(isDirectoryLikeHint),\n };\n }\n\n const resolvedFile = resolveExplicitFileTarget(context);\n if (resolvedFile) {\n return {\n lane: \"exact-target\",\n reason: \"explicit file-like or resolved file target\",\n resolvedTarget: resolvedFile,\n };\n }\n\n if (context.quotedFragments.length > 0) {\n return {\n lane: \"fragment\",\n reason: \"quoted fragment present in the query\",\n };\n }\n\n if (context.allowRegexLane && context.regexLike) {\n return {\n lane: \"regex\",\n reason: \"regex-like query with regex lane enabled\",\n };\n }\n\n if (hasUnresolvedExplicitTarget(context)) {\n return {\n lane: \"exact-target\",\n reason: \"unresolved explicit target still needs exact-target search\",\n resolvedTarget: context.explicitTargets[0],\n };\n }\n\n if (looksLikeShellContentQuery(context)) {\n return {\n lane: \"shell-content\",\n reason: \"broad read-only question with no explicit target\",\n };\n }\n\n return {\n lane: \"semantic\",\n reason: \"no explicit lane signals matched\",\n };\n}\n"]}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Defines shared search limits for the modular agent search area.
3
+ *
4
+ * Why this file exists:
5
+ * - visible result limits should stay consistent across lanes
6
+ * - semantic retrieval may need a wider internal frontier than the UI-facing shortlist
7
+ */
8
+ export const DEFAULT_VISIBLE_SEARCH_LIMIT = 5;
9
+ export const DEFAULT_INTERNAL_SEMANTIC_LIMIT = 12;
10
+ //# sourceMappingURL=limits.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"limits.js","sourceRoot":"","sources":["../../../src/agent/search/limits.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,CAAC;AAC9C,MAAM,CAAC,MAAM,+BAA+B,GAAG,EAAE,CAAC","sourcesContent":["/**\n * Defines shared search limits for the modular agent search area.\n *\n * Why this file exists:\n * - visible result limits should stay consistent across lanes\n * - semantic retrieval may need a wider internal frontier than the UI-facing shortlist\n */\nexport const DEFAULT_VISIBLE_SEARCH_LIMIT = 5;\nexport const DEFAULT_INTERNAL_SEMANTIC_LIMIT = 12;\n"]}
@@ -0,0 +1,22 @@
1
+ import { scoreCandidateFiles } from "../../search/sharedRankingPolicy.js";
2
+ export function rankAgentSearchHits(filePaths, relatedFileScores, query, matches = [], hintTerms = []) {
3
+ const matchesByFile = matches.reduce((acc, match) => {
4
+ const list = acc[match.filePath] ?? [];
5
+ list.push({
6
+ snippet: match.snippet,
7
+ ...(match.reasons ? { reasons: match.reasons } : {}),
8
+ });
9
+ acc[match.filePath] = list;
10
+ return acc;
11
+ }, {});
12
+ return scoreCandidateFiles(filePaths, relatedFileScores, query, {
13
+ matchesByFile,
14
+ hintTerms,
15
+ }).map((hit) => ({
16
+ filePath: hit.filePath,
17
+ score: hit.score,
18
+ ...(typeof hit.bm25Raw === "number" ? { bm25Raw: hit.bm25Raw } : {}),
19
+ reasons: hit.reasons,
20
+ }));
21
+ }
22
+ //# sourceMappingURL=ranking.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ranking.js","sourceRoot":"","sources":["../../../src/agent/search/ranking.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAS1E,MAAM,UAAU,mBAAmB,CACjC,SAAmB,EACnB,iBAAyC,EACzC,KAAa,EACb,UAA8B,EAAE,EAChC,YAAsB,EAAE;IAExB,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,CAAiE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;QAClH,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACvC,IAAI,CAAC,IAAI,CAAC;YACR,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACrD,CAAC,CAAC;QACH,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC;QAC3B,OAAO,GAAG,CAAC;IACb,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,mBAAmB,CAAC,SAAS,EAAE,iBAAiB,EAAE,KAAK,EAAE;QAC9D,aAAa;QACb,SAAS;KACV,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACf,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,GAAG,CAAC,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACpE,OAAO,EAAE,GAAG,CAAC,OAAO;KACrB,CAAC,CAAC,CAAC;AACN,CAAC","sourcesContent":["/**\n * Adapts the shared scorer into the modular agent search hit shape.\n *\n * Why this file exists:\n * - the modular agent should not own a second scorer implementation\n * - search tools and retention need one small local adapter type\n */\nimport type { AgentSearchMatch } from \"../types.js\";\nimport { scoreCandidateFiles } from \"../../search/sharedRankingPolicy.js\";\n\nexport interface AgentScoredSearchHit {\n filePath: string;\n score: number;\n bm25Raw?: number;\n reasons: string[];\n}\n\nexport function rankAgentSearchHits(\n filePaths: string[],\n relatedFileScores: Record<string, number>,\n query: string,\n matches: AgentSearchMatch[] = [],\n hintTerms: string[] = []\n): AgentScoredSearchHit[] {\n const matchesByFile = matches.reduce<Record<string, Array<{ snippet: string; reasons?: string[] }>>>((acc, match) => {\n const list = acc[match.filePath] ?? [];\n list.push({\n snippet: match.snippet,\n ...(match.reasons ? { reasons: match.reasons } : {}),\n });\n acc[match.filePath] = list;\n return acc;\n }, {});\n\n return scoreCandidateFiles(filePaths, relatedFileScores, query, {\n matchesByFile,\n hintTerms,\n }).map((hit) => ({\n filePath: hit.filePath,\n score: hit.score,\n ...(typeof hit.bm25Raw === \"number\" ? { bm25Raw: hit.bm25Raw } : {}),\n reasons: hit.reasons,\n }));\n}\n"]}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Runs validated regex search for modular-agent search.
3
+ */
4
+ import { classifyFileRulePath } from "../../fileRules/searchPathClassification.js";
5
+ import { collectRegexMatches, collectSearchablePaths, dedupeStrings } from "./shared.js";
6
+ function safeCreateRegex(pattern, flags = "i") {
7
+ try {
8
+ return new RegExp(pattern, flags);
9
+ }
10
+ catch {
11
+ return null;
12
+ }
13
+ }
14
+ export function runRegexSearch(rootDir, pattern, target, flags) {
15
+ const regex = safeCreateRegex(pattern, flags ?? "i");
16
+ if (!regex) {
17
+ return {
18
+ lane: "regex",
19
+ query: pattern,
20
+ filePaths: [],
21
+ failure: {
22
+ status: "failed",
23
+ failureClass: "invalid-regex",
24
+ message: "Regex pattern could not be compiled.",
25
+ pattern,
26
+ flags,
27
+ },
28
+ };
29
+ }
30
+ const files = collectSearchablePaths(rootDir, { allowIgnoredPaths: true }).filter((filePath) => {
31
+ const classification = classifyFileRulePath(filePath);
32
+ return !classification.isGeneratedBuild
33
+ && !classification.isArtifact
34
+ && !classification.isLogLike
35
+ && !classification.isSourceMap
36
+ && !classification.isHarnessLike;
37
+ });
38
+ const hits = [];
39
+ let matchCount = 0;
40
+ const matches = target === "content" || target === "both"
41
+ ? collectRegexMatches(files, pattern, flags ?? "i", {
42
+ maxPerFile: 2,
43
+ maxTotal: 10,
44
+ })
45
+ : [];
46
+ const matchedFiles = new Set(matches.map((match) => match.filePath));
47
+ for (const filePath of files) {
48
+ let matched = false;
49
+ if (target === "path" || target === "both") {
50
+ if (regex.test(filePath)) {
51
+ matched = true;
52
+ matchCount += 1;
53
+ }
54
+ regex.lastIndex = 0;
55
+ }
56
+ if (!matched && matchedFiles.has(filePath)) {
57
+ matched = true;
58
+ matchCount += matches.filter((match) => match.filePath === filePath).length;
59
+ }
60
+ if (matched) {
61
+ hits.push(filePath);
62
+ }
63
+ }
64
+ return {
65
+ lane: "regex",
66
+ query: pattern,
67
+ filePaths: dedupeStrings(hits).slice(0, 5),
68
+ matches,
69
+ matchCount,
70
+ ...(hits.length === 0
71
+ ? {
72
+ failure: {
73
+ status: "failed",
74
+ failureClass: "no-match",
75
+ message: "Regex search found no matches in scope.",
76
+ pattern,
77
+ flags,
78
+ },
79
+ }
80
+ : {}),
81
+ };
82
+ }
83
+ //# sourceMappingURL=regex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"regex.js","sourceRoot":"","sources":["../../../src/agent/search/regex.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Runs validated regex search for modular-agent search.\n */\nimport { classifyFileRulePath } from \"../../fileRules/searchPathClassification.js\";\nimport type { AgentSearchPacket } from \"./types.js\";\nimport { collectRegexMatches, collectSearchablePaths, dedupeStrings } from \"./shared.js\";\n\nfunction safeCreateRegex(pattern: string, flags = \"i\"): RegExp | null {\n try {\n return new RegExp(pattern, flags);\n } catch {\n return null;\n }\n}\n\nexport function runRegexSearch(\n rootDir: string,\n pattern: string,\n target: \"path\" | \"content\" | \"both\",\n flags?: string\n): AgentSearchPacket {\n const regex = safeCreateRegex(pattern, flags ?? \"i\");\n if (!regex) {\n return {\n lane: \"regex\",\n query: pattern,\n filePaths: [],\n failure: {\n status: \"failed\",\n failureClass: \"invalid-regex\",\n message: \"Regex pattern could not be compiled.\",\n pattern,\n flags,\n },\n };\n }\n\n const files = collectSearchablePaths(rootDir, { allowIgnoredPaths: true }).filter((filePath) => {\n const classification = classifyFileRulePath(filePath);\n return !classification.isGeneratedBuild\n && !classification.isArtifact\n && !classification.isLogLike\n && !classification.isSourceMap\n && !classification.isHarnessLike;\n });\n const hits: string[] = [];\n let matchCount = 0;\n const matches = target === \"content\" || target === \"both\"\n ? collectRegexMatches(files, pattern, flags ?? \"i\", {\n maxPerFile: 2,\n maxTotal: 10,\n })\n : [];\n const matchedFiles = new Set(matches.map((match) => match.filePath));\n\n for (const filePath of files) {\n let matched = false;\n if (target === \"path\" || target === \"both\") {\n if (regex.test(filePath)) {\n matched = true;\n matchCount += 1;\n }\n regex.lastIndex = 0;\n }\n if (!matched && matchedFiles.has(filePath)) {\n matched = true;\n matchCount += matches.filter((match) => match.filePath === filePath).length;\n }\n if (matched) {\n hits.push(filePath);\n }\n }\n\n return {\n lane: \"regex\",\n query: pattern,\n filePaths: dedupeStrings(hits).slice(0, 5),\n matches,\n matchCount,\n ...(hits.length === 0\n ? {\n failure: {\n status: \"failed\" as const,\n failureClass: \"no-match\" as const,\n message: \"Regex search found no matches in scope.\",\n pattern,\n flags,\n },\n }\n : {}),\n };\n}\n"]}
@@ -0,0 +1,11 @@
1
+ import { classifySearchLane } from "./laneClassifier.js";
2
+ export { extractQuotedFragments } from "./searchContext.js";
3
+ export { looksLikeDirectoryListingQuery } from "./laneClassifier.js";
4
+ /**
5
+ * Chooses one search lane from the derived pre-search packet.
6
+ * Example: path-like targets go to `exact-target`, while quoted snippets go to `fragment`.
7
+ */
8
+ export function chooseSearchRoute(context) {
9
+ return classifySearchLane(context).lane;
10
+ }
11
+ //# sourceMappingURL=routePolicy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routePolicy.js","sourceRoot":"","sources":["../../../src/agent/search/routePolicy.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,kBAAkB,EAAkC,MAAM,qBAAqB,CAAC;AACzF,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,8BAA8B,EAAE,MAAM,qBAAqB,CAAC;AAErE;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAA2B;IAC3D,OAAO,kBAAkB,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC;AAC1C,CAAC","sourcesContent":["/**\n * Chooses the search lane for the modular agent search area.\n *\n * Why this file exists:\n * - lane choice is a search concern and should have one owner\n * - the search facade should delegate route decisions instead of inlining them\n * - route rules should stay separate from retention and ranking\n * - lane choice should consume one pre-search fact packet instead of raw task state\n */\nimport type { AgentSearchLane } from \"./types.js\";\nimport type { AgentSearchContext } from \"./searchContext.js\";\nimport { classifySearchLane, looksLikeDirectoryListingQuery } from \"./laneClassifier.js\";\nexport { extractQuotedFragments } from \"./searchContext.js\";\nexport { looksLikeDirectoryListingQuery } from \"./laneClassifier.js\";\n\n/**\n * Chooses one search lane from the derived pre-search packet.\n * Example: path-like targets go to `exact-target`, while quoted snippets go to `fragment`.\n */\nexport function chooseSearchRoute(context: AgentSearchContext): AgentSearchLane {\n return classifySearchLane(context).lane;\n}\n"]}
@@ -0,0 +1,128 @@
1
+ /**
2
+ * Builds one derived pre-search fact packet for first-lane choice.
3
+ *
4
+ * Why this file exists:
5
+ * - search should gather its facts once instead of rediscovering them in several modules
6
+ * - route choice should consume one stable packet before later policy stages run
7
+ * - resolved target meaning should come from the resolver, not fresh path guessing in search
8
+ */
9
+ import path from "path";
10
+ import { queryNeedsRegexMode } from "../../fileRules/queryTokenRules.js";
11
+ import { uniqueStrings } from "../evidence/index.js";
12
+ import { resolveTargetResolutions } from "../policy/resolutionPipeline.js";
13
+ function resolveBootstrapSearchMode(query) {
14
+ const trimmed = String(query ?? "").trim();
15
+ if (!trimmed) {
16
+ return "semantic";
17
+ }
18
+ if (/["'`][^"'`\n]{4,}["'`]/.test(trimmed)) {
19
+ return "auto";
20
+ }
21
+ if (trimmed.includes("|") || /[\[\]{}()+\\.^$]/.test(trimmed)) {
22
+ return "auto";
23
+ }
24
+ return "semantic";
25
+ }
26
+ export function isDirectoryLikeHint(value) {
27
+ const trimmed = String(value ?? "").trim();
28
+ if (!trimmed) {
29
+ return false;
30
+ }
31
+ if (trimmed === "." || trimmed === "..") {
32
+ return true;
33
+ }
34
+ if (trimmed.endsWith(path.sep) || trimmed.endsWith("/")) {
35
+ return true;
36
+ }
37
+ if (!(trimmed.includes("/") || trimmed.includes("\\"))) {
38
+ return false;
39
+ }
40
+ return !/\.[A-Za-z0-9_]{1,10}$/.test(path.basename(trimmed));
41
+ }
42
+ export function isStrongFileLikeRef(value) {
43
+ const trimmed = String(value ?? "").trim();
44
+ if (!trimmed) {
45
+ return false;
46
+ }
47
+ return trimmed.includes("/") || trimmed.includes("\\") || /\.[A-Za-z0-9_]{1,10}$/.test(trimmed);
48
+ }
49
+ /**
50
+ * Finds raw quoted fragments that should stay in fixed-string search.
51
+ * Example: `"const run ="` should prefer the fragment lane over semantic search.
52
+ */
53
+ export function extractQuotedFragments(query) {
54
+ const out = new Set();
55
+ const patterns = [
56
+ /"([^"\n]{4,})"/g,
57
+ /'([^'\n]{4,})'/g,
58
+ /`([^`\n]{4,})`/g,
59
+ ];
60
+ for (const pattern of patterns) {
61
+ let match = null;
62
+ while ((match = pattern.exec(query)) !== null) {
63
+ const fragment = String(match[1] ?? "").trim();
64
+ if (fragment.length >= 4) {
65
+ out.add(fragment);
66
+ }
67
+ }
68
+ }
69
+ return Array.from(out);
70
+ }
71
+ function looksFolderShapedQuery(query, explicitTargets, softHints, resolvedTargets) {
72
+ const lowered = String(query ?? "").toLowerCase();
73
+ if (/\b(folder|directory|contents?|files)\b/.test(lowered)) {
74
+ return true;
75
+ }
76
+ if (resolvedTargets.some((resolution) => resolution.kind === "resolved-folder")) {
77
+ return true;
78
+ }
79
+ if (explicitTargets.some(isDirectoryLikeHint) || softHints.some(isDirectoryLikeHint)) {
80
+ return true;
81
+ }
82
+ return /^(check|inspect|review|show|list)\b/.test(lowered)
83
+ && explicitTargets.length === 1
84
+ && !isStrongFileLikeRef(explicitTargets[0]);
85
+ }
86
+ /**
87
+ * Builds one stable packet for search lane selection and search logging.
88
+ * Example: `check guards` becomes a targeted, folder-shaped packet even before a lane is chosen.
89
+ */
90
+ export function buildSearchContext(memory, query, options = {}) {
91
+ const explicitTargets = uniqueStrings(memory.task.explicitTargets);
92
+ const resolutionMemory = {
93
+ ...memory,
94
+ task: {
95
+ ...memory.task,
96
+ explicitTargets,
97
+ },
98
+ };
99
+ const resolvedTargets = resolveTargetResolutions(resolutionMemory);
100
+ const quotedFragments = extractQuotedFragments(query);
101
+ const normalizedQuery = String(memory.task.normalizedQuery ?? query).trim() || query;
102
+ const hardFileTargets = uniqueStrings([
103
+ ...memory.task.hardFileTargets,
104
+ ...resolvedTargets
105
+ .filter((resolution) => resolution.kind === "resolved-file")
106
+ .map((resolution) => resolution.filePath),
107
+ ]);
108
+ const softHints = uniqueStrings(memory.task.softHints);
109
+ const regexLike = resolveBootstrapSearchMode(query) === "auto" && queryNeedsRegexMode(query);
110
+ const folderShaped = looksFolderShapedQuery(query, explicitTargets, softHints, resolvedTargets);
111
+ return {
112
+ query,
113
+ normalizedQuery,
114
+ taskKind: "ask",
115
+ scopeKind: memory.task.queryScope,
116
+ explicitTargets,
117
+ quotedFragments,
118
+ regexLike,
119
+ folderShaped,
120
+ resolvedTargets,
121
+ hardFileTargets,
122
+ softHints,
123
+ searchTermGroups: memory.task.searchTermGroups,
124
+ allowDirectoryLane: options.allowDirectoryLane ?? false,
125
+ allowRegexLane: options.allowRegexLane ?? false,
126
+ };
127
+ }
128
+ //# sourceMappingURL=searchContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"searchContext.js","sourceRoot":"","sources":["../../../src/agent/search/searchContext.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Builds one derived pre-search fact packet for first-lane choice.\n *\n * Why this file exists:\n * - search should gather its facts once instead of rediscovering them in several modules\n * - route choice should consume one stable packet before later policy stages run\n * - resolved target meaning should come from the resolver, not fresh path guessing in search\n */\nimport path from \"path\";\nimport { queryNeedsRegexMode } from \"../../fileRules/queryTokenRules.js\";\nimport { uniqueStrings } from \"../evidence/index.js\";\nimport { resolveTargetResolutions } from \"../policy/resolutionPipeline.js\";\nimport type { TargetResolution } from \"../policy/contracts.js\";\nimport type { AgentMemory, AgentQueryScope, AgentSearchTermGroup } from \"../types.js\";\n\nexport type AgentSearchScopeKind = AgentQueryScope;\n\nexport interface AgentSearchContext {\n query: string;\n normalizedQuery: string;\n taskKind: \"ask\";\n scopeKind: AgentSearchScopeKind;\n explicitTargets: string[];\n quotedFragments: string[];\n regexLike: boolean;\n folderShaped: boolean;\n resolvedTargets: TargetResolution[];\n hardFileTargets: string[];\n softHints: string[];\n searchTermGroups: AgentSearchTermGroup[];\n allowDirectoryLane: boolean;\n allowRegexLane: boolean;\n}\n\nexport interface BuildSearchContextOptions {\n allowDirectoryLane?: boolean;\n allowRegexLane?: boolean;\n}\n\nfunction resolveBootstrapSearchMode(query: string): \"semantic\" | \"auto\" {\n const trimmed = String(query ?? \"\").trim();\n if (!trimmed) {\n return \"semantic\";\n }\n if (/[\"'`][^\"'`\\n]{4,}[\"'`]/.test(trimmed)) {\n return \"auto\";\n }\n if (trimmed.includes(\"|\") || /[\\[\\]{}()+\\\\.^$]/.test(trimmed)) {\n return \"auto\";\n }\n return \"semantic\";\n}\n\nexport function isDirectoryLikeHint(value: string): boolean {\n const trimmed = String(value ?? \"\").trim();\n if (!trimmed) {\n return false;\n }\n if (trimmed === \".\" || trimmed === \"..\") {\n return true;\n }\n if (trimmed.endsWith(path.sep) || trimmed.endsWith(\"/\")) {\n return true;\n }\n if (!(trimmed.includes(\"/\") || trimmed.includes(\"\\\\\"))) {\n return false;\n }\n return !/\\.[A-Za-z0-9_]{1,10}$/.test(path.basename(trimmed));\n}\n\nexport function isStrongFileLikeRef(value: string): boolean {\n const trimmed = String(value ?? \"\").trim();\n if (!trimmed) {\n return false;\n }\n return trimmed.includes(\"/\") || trimmed.includes(\"\\\\\") || /\\.[A-Za-z0-9_]{1,10}$/.test(trimmed);\n}\n\n/**\n * Finds raw quoted fragments that should stay in fixed-string search.\n * Example: `\"const run =\"` should prefer the fragment lane over semantic search.\n */\nexport function extractQuotedFragments(query: string): string[] {\n const out = new Set<string>();\n const patterns = [\n /\"([^\"\\n]{4,})\"/g,\n /'([^'\\n]{4,})'/g,\n /`([^`\\n]{4,})`/g,\n ];\n for (const pattern of patterns) {\n let match: RegExpExecArray | null = null;\n while ((match = pattern.exec(query)) !== null) {\n const fragment = String(match[1] ?? \"\").trim();\n if (fragment.length >= 4) {\n out.add(fragment);\n }\n }\n }\n return Array.from(out);\n}\n\nfunction looksFolderShapedQuery(\n query: string,\n explicitTargets: string[],\n softHints: string[],\n resolvedTargets: TargetResolution[]\n): boolean {\n const lowered = String(query ?? \"\").toLowerCase();\n if (/\\b(folder|directory|contents?|files)\\b/.test(lowered)) {\n return true;\n }\n if (resolvedTargets.some((resolution) => resolution.kind === \"resolved-folder\")) {\n return true;\n }\n if (explicitTargets.some(isDirectoryLikeHint) || softHints.some(isDirectoryLikeHint)) {\n return true;\n }\n return /^(check|inspect|review|show|list)\\b/.test(lowered)\n && explicitTargets.length === 1\n && !isStrongFileLikeRef(explicitTargets[0]);\n}\n\n/**\n * Builds one stable packet for search lane selection and search logging.\n * Example: `check guards` becomes a targeted, folder-shaped packet even before a lane is chosen.\n */\nexport function buildSearchContext(\n memory: AgentMemory,\n query: string,\n options: BuildSearchContextOptions = {}\n): AgentSearchContext {\n const explicitTargets = uniqueStrings(memory.task.explicitTargets);\n const resolutionMemory: AgentMemory = {\n ...memory,\n task: {\n ...memory.task,\n explicitTargets,\n },\n };\n const resolvedTargets = resolveTargetResolutions(resolutionMemory);\n const quotedFragments = extractQuotedFragments(query);\n const normalizedQuery = String(memory.task.normalizedQuery ?? query).trim() || query;\n const hardFileTargets = uniqueStrings([\n ...memory.task.hardFileTargets,\n ...resolvedTargets\n .filter((resolution): resolution is Extract<TargetResolution, { kind: \"resolved-file\" }> => resolution.kind === \"resolved-file\")\n .map((resolution) => resolution.filePath),\n ]);\n const softHints = uniqueStrings(memory.task.softHints);\n const regexLike = resolveBootstrapSearchMode(query) === \"auto\" && queryNeedsRegexMode(query);\n const folderShaped = looksFolderShapedQuery(query, explicitTargets, softHints, resolvedTargets);\n\n return {\n query,\n normalizedQuery,\n taskKind: \"ask\",\n scopeKind: memory.task.queryScope,\n explicitTargets,\n quotedFragments,\n regexLike,\n folderShaped,\n resolvedTargets,\n hardFileTargets,\n softHints,\n searchTermGroups: memory.task.searchTermGroups,\n allowDirectoryLane: options.allowDirectoryLane ?? false,\n allowRegexLane: options.allowRegexLane ?? false,\n };\n}\n"]}
@@ -0,0 +1,113 @@
1
+ /**
2
+ * Runs indexed semantic retrieval for modular-agent search.
3
+ *
4
+ * Why this file exists:
5
+ * - DB retrieval and local fallback stay in one semantic owner
6
+ * - snippet extraction should use the same effective search terms that retrieval used
7
+ * - deterministic local fallback should only run after search-owned DB recovery
8
+ * - semantic hits must stay inside the active repo before ranking can trust them
9
+ */
10
+ import fs from "fs";
11
+ import path from "path";
12
+ import { classifyFileRulePath } from "../../fileRules/searchPathClassification.js";
13
+ import { DEFAULT_VISIBLE_SEARCH_LIMIT } from "./limits.js";
14
+ import { runSemanticIndexSearch } from "./semanticIndexSearch.js";
15
+ import { collectFixedStringMatches, collectSearchablePaths, tokenizeSearchTerms, } from "./shared.js";
16
+ function resolveLocalSearchTerms(query) {
17
+ return tokenizeSearchTerms(query);
18
+ }
19
+ function getSemanticPathPenalty(filePath) {
20
+ const classification = classifyFileRulePath(filePath);
21
+ let penalty = 0;
22
+ if (classification.isGeneratedBuild || classification.isArtifact || classification.isLogLike || classification.isSourceMap || classification.isHarnessLike) {
23
+ penalty += 12;
24
+ }
25
+ if (classification.isDocumentation) {
26
+ penalty += 3;
27
+ }
28
+ return penalty;
29
+ }
30
+ /**
31
+ * Keeps semantic DB hits scoped to the active repo/worktree.
32
+ * Example: a temp test repo should not inherit hits from the main repo index.
33
+ */
34
+ function isWithinRootDir(rootDir, filePath) {
35
+ const relative = path.relative(rootDir, filePath);
36
+ return relative === "" || (!relative.startsWith("..") && !path.isAbsolute(relative));
37
+ }
38
+ function runLocalFallbackSearch(rootDir, terms, limit) {
39
+ const scored = collectSearchablePaths(rootDir).map((filePath) => {
40
+ const loweredPath = filePath.toLowerCase();
41
+ let score = 0;
42
+ for (const term of terms) {
43
+ if (loweredPath.includes(term)) {
44
+ score += 4;
45
+ }
46
+ }
47
+ try {
48
+ const code = fs.readFileSync(filePath, "utf-8").toLowerCase();
49
+ for (const term of terms) {
50
+ if (code.includes(term)) {
51
+ score += 2;
52
+ }
53
+ }
54
+ }
55
+ catch {
56
+ return { filePath, score: 0 };
57
+ }
58
+ return { filePath, score: score - getSemanticPathPenalty(filePath) };
59
+ }).filter((entry) => entry.score > 0);
60
+ const selected = scored
61
+ .sort((left, right) => right.score - left.score)
62
+ .slice(0, limit);
63
+ return {
64
+ filePaths: selected.map((entry) => entry.filePath),
65
+ relatedFileScores: Object.fromEntries(selected.map((entry) => [entry.filePath, -entry.score])),
66
+ };
67
+ }
68
+ export async function runSemanticSearch(rootDir, query, limit = DEFAULT_VISIBLE_SEARCH_LIMIT) {
69
+ let filePaths = [];
70
+ let relatedFileScores = {};
71
+ let debug;
72
+ let matchTerms = resolveLocalSearchTerms(query);
73
+ try {
74
+ const results = await runSemanticIndexSearch(query, limit);
75
+ filePaths = results.hits
76
+ .map((result) => result.path)
77
+ .filter((filePath) => isWithinRootDir(rootDir, filePath));
78
+ relatedFileScores = Object.fromEntries(Object.entries(results.relatedFileScores).filter(([filePath]) => isWithinRootDir(rootDir, filePath)));
79
+ matchTerms = results.matchTerms.length > 0 ? results.matchTerms : matchTerms;
80
+ debug = {
81
+ queriesRun: results.debug.queriesRun,
82
+ recoveryUsed: results.debug.recoveryUsed,
83
+ ...(results.debug.recoveryReason ? { recoveryReason: results.debug.recoveryReason } : {}),
84
+ matchTerms: results.matchTerms,
85
+ };
86
+ }
87
+ catch {
88
+ filePaths = [];
89
+ relatedFileScores = {};
90
+ debug = undefined;
91
+ }
92
+ const localSearchTerms = resolveLocalSearchTerms(query);
93
+ const fallback = filePaths.length > 0
94
+ ? {
95
+ filePaths,
96
+ relatedFileScores: Object.fromEntries(Object.entries(relatedFileScores).map(([filePath, score]) => [filePath, score + getSemanticPathPenalty(filePath)])),
97
+ }
98
+ : runLocalFallbackSearch(rootDir, localSearchTerms, limit);
99
+ const matches = collectFixedStringMatches(fallback.filePaths, matchTerms, "semantic-content", {
100
+ caseSensitive: false,
101
+ maxPerFile: 2,
102
+ maxTotal: Math.max(limit * 2, DEFAULT_VISIBLE_SEARCH_LIMIT * 2),
103
+ });
104
+ return {
105
+ lane: "semantic",
106
+ query,
107
+ filePaths: fallback.filePaths,
108
+ matches,
109
+ ...(Object.keys(fallback.relatedFileScores).length > 0 ? { relatedFileScores: fallback.relatedFileScores } : {}),
110
+ ...(debug ? { debug } : {}),
111
+ };
112
+ }
113
+ //# sourceMappingURL=semantic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semantic.js","sourceRoot":"","sources":["../../../src/agent/search/semantic.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Runs indexed semantic retrieval for modular-agent search.\n *\n * Why this file exists:\n * - DB retrieval and local fallback stay in one semantic owner\n * - snippet extraction should use the same effective search terms that retrieval used\n * - deterministic local fallback should only run after search-owned DB recovery\n * - semantic hits must stay inside the active repo before ranking can trust them\n */\nimport fs from \"fs\";\nimport path from \"path\";\nimport { classifyFileRulePath } from \"../../fileRules/searchPathClassification.js\";\nimport type { AgentSearchPacket } from \"./types.js\";\nimport { DEFAULT_VISIBLE_SEARCH_LIMIT } from \"./limits.js\";\nimport { runSemanticIndexSearch } from \"./semanticIndexSearch.js\";\nimport {\n collectFixedStringMatches,\n collectSearchablePaths,\n tokenizeSearchTerms,\n} from \"./shared.js\";\n\nfunction resolveLocalSearchTerms(query: string): string[] {\n return tokenizeSearchTerms(query);\n}\n\nfunction getSemanticPathPenalty(filePath: string): number {\n const classification = classifyFileRulePath(filePath);\n let penalty = 0;\n if (classification.isGeneratedBuild || classification.isArtifact || classification.isLogLike || classification.isSourceMap || classification.isHarnessLike) {\n penalty += 12;\n }\n if (classification.isDocumentation) {\n penalty += 3;\n }\n return penalty;\n}\n\n/**\n * Keeps semantic DB hits scoped to the active repo/worktree.\n * Example: a temp test repo should not inherit hits from the main repo index.\n */\nfunction isWithinRootDir(rootDir: string, filePath: string): boolean {\n const relative = path.relative(rootDir, filePath);\n return relative === \"\" || (!relative.startsWith(\"..\") && !path.isAbsolute(relative));\n}\n\nfunction runLocalFallbackSearch(\n rootDir: string,\n terms: string[],\n limit: number\n): { filePaths: string[]; relatedFileScores: Record<string, number> } {\n const scored = collectSearchablePaths(rootDir).map((filePath) => {\n const loweredPath = filePath.toLowerCase();\n let score = 0;\n\n for (const term of terms) {\n if (loweredPath.includes(term)) {\n score += 4;\n }\n }\n\n try {\n const code = fs.readFileSync(filePath, \"utf-8\").toLowerCase();\n for (const term of terms) {\n if (code.includes(term)) {\n score += 2;\n }\n }\n } catch {\n return { filePath, score: 0 };\n }\n\n return { filePath, score: score - getSemanticPathPenalty(filePath) };\n }).filter((entry) => entry.score > 0);\n\n const selected = scored\n .sort((left, right) => right.score - left.score)\n .slice(0, limit);\n\n return {\n filePaths: selected.map((entry) => entry.filePath),\n relatedFileScores: Object.fromEntries(selected.map((entry) => [entry.filePath, -entry.score])),\n };\n}\n\nexport async function runSemanticSearch(\n rootDir: string,\n query: string,\n limit = DEFAULT_VISIBLE_SEARCH_LIMIT\n): Promise<AgentSearchPacket> {\n let filePaths: string[] = [];\n let relatedFileScores: Record<string, number> = {};\n let debug: AgentSearchPacket[\"debug\"] | undefined;\n let matchTerms = resolveLocalSearchTerms(query);\n try {\n const results = await runSemanticIndexSearch(query, limit);\n filePaths = results.hits\n .map((result) => result.path)\n .filter((filePath) => isWithinRootDir(rootDir, filePath));\n relatedFileScores = Object.fromEntries(\n Object.entries(results.relatedFileScores).filter(([filePath]) => isWithinRootDir(rootDir, filePath))\n );\n matchTerms = results.matchTerms.length > 0 ? results.matchTerms : matchTerms;\n debug = {\n queriesRun: results.debug.queriesRun,\n recoveryUsed: results.debug.recoveryUsed,\n ...(results.debug.recoveryReason ? { recoveryReason: results.debug.recoveryReason } : {}),\n matchTerms: results.matchTerms,\n };\n } catch {\n filePaths = [];\n relatedFileScores = {};\n debug = undefined;\n }\n const localSearchTerms = resolveLocalSearchTerms(query);\n const fallback = filePaths.length > 0\n ? {\n filePaths,\n relatedFileScores: Object.fromEntries(\n Object.entries(relatedFileScores).map(([filePath, score]) => [filePath, score + getSemanticPathPenalty(filePath)])\n ),\n }\n : runLocalFallbackSearch(rootDir, localSearchTerms, limit);\n const matches = collectFixedStringMatches(\n fallback.filePaths,\n matchTerms,\n \"semantic-content\",\n {\n caseSensitive: false,\n maxPerFile: 2,\n maxTotal: Math.max(limit * 2, DEFAULT_VISIBLE_SEARCH_LIMIT * 2),\n }\n );\n return {\n lane: \"semantic\",\n query,\n filePaths: fallback.filePaths,\n matches,\n ...(Object.keys(fallback.relatedFileScores).length > 0 ? { relatedFileScores: fallback.relatedFileScores } : {}),\n ...(debug ? { debug } : {}),\n };\n}\n"]}