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
@@ -1,99 +1,24 @@
1
- // src/utils/checkModel.ts
2
- import { spawn } from 'node:child_process';
3
- const OLLAMA_URL = 'http://127.0.0.1:11434/';
4
- /* ──────────────────────────────────────────────── */
5
- /* Public entry point (called from main.ts) */
6
- /* ──────────────────────────────────────────────── */
1
+ import { formatOllamaStatusMessage, getOllamaStatusSnapshot, startOllamaServer, waitForOllamaReady, } from './ollamaService.js';
7
2
  export async function startModelProcess() {
8
- if (await isModelRunning()) {
9
- console.log('✅ Model already running');
10
- await logRunningModels();
3
+ const snapshot = await getOllamaStatusSnapshot();
4
+ if (snapshot.health.ok) {
5
+ for (const line of formatOllamaStatusMessage(snapshot)) {
6
+ console.log(line);
7
+ }
11
8
  return;
12
9
  }
13
- console.log('🚀 Serving model…');
14
- spawnOllamaSilently();
15
- await waitForModelReady();
16
- await logOllamaVersion();
17
- await logRunningModels();
18
- console.log('✅ Model ready');
19
- }
20
- /* ──────────────────────────────────────────────── */
21
- /* Internals */
22
- /* ──────────────────────────────────────────────── */
23
- function spawnOllamaSilently() {
24
- const child = spawn('/Applications/Ollama.app/Contents/Resources/ollama', ['serve'], {
25
- stdio: 'ignore', // 👈 suppress ALL Ollama output
26
- detached: true,
27
- });
28
- child.unref();
29
- }
30
- async function isModelRunning() {
31
- try {
32
- const res = await fetch(OLLAMA_URL, { method: 'GET' });
33
- return res.ok;
34
- }
35
- catch {
36
- return false;
37
- }
38
- }
39
- async function waitForModelReady(timeoutMs = 30000) {
40
- const start = Date.now();
41
- while (Date.now() - start < timeoutMs) {
42
- if (await isModelRunning())
43
- return;
44
- await sleep(300);
45
- }
46
- throw new Error('Model failed to become ready');
47
- }
48
- function sleep(ms) {
49
- return new Promise(resolve => setTimeout(resolve, ms));
50
- }
51
- async function logModelInfo(model) {
52
- try {
53
- const res = await fetch(`${OLLAMA_URL}api/show`, {
54
- method: 'POST',
55
- headers: { 'Content-Type': 'application/json' },
56
- body: JSON.stringify({ name: model }),
57
- });
58
- const json = await res.json();
59
- console.log(`🧠 Model info: ${model}`);
60
- console.log(` • family: ${json.details?.family}`);
61
- console.log(` • params: ${json.details?.parameter_size}`);
62
- console.log(` • quantization: ${json.details?.quantization_level}`);
63
- console.log(` • context: ${json.parameters?.num_ctx ?? 'unknown'}`);
64
- }
65
- catch {
66
- console.warn(`⚠️ Failed to fetch info for model ${model}`);
67
- }
68
- }
69
- async function logOllamaVersion() {
70
- try {
71
- const res = await fetch(`${OLLAMA_URL}api/version`);
72
- const json = await res.json();
73
- console.log(`🦙 Ollama version: ${json.version}`);
74
- }
75
- catch (err) {
76
- console.warn('⚠️ Failed to fetch Ollama version');
10
+ console.log('⚙️ Ollama is not running. Attempting to start it...');
11
+ const startResult = await startOllamaServer();
12
+ if (!startResult.ok) {
13
+ throw new Error('Ollama is not installed or could not be started. Run `scai model status` for details.');
77
14
  }
78
- }
79
- async function logRunningModels() {
80
- try {
81
- const res = await fetch(`${OLLAMA_URL}api/ps`);
82
- const json = await res.json();
83
- if (!json.models?.length) {
84
- console.log('🧊 No models currently loaded');
85
- return;
86
- }
87
- console.log('🔥 Running models:');
88
- for (const m of json.models) {
89
- const sizeGB = (m.size / 1024 ** 3).toFixed(1);
90
- console.log(` • ${m.name}` +
91
- ` | ${m.details?.parameter_size ?? '??'} params` +
92
- ` | q=${m.details?.quantization_level ?? '?'}` +
93
- ` | ~${sizeGB} GB in RAM`);
94
- }
15
+ const health = await waitForOllamaReady();
16
+ if (!health.ok) {
17
+ throw new Error(`Ollama did not become ready: ${health.detail}`);
95
18
  }
96
- catch {
97
- console.warn('⚠️ Failed to fetch running models');
19
+ const readySnapshot = await getOllamaStatusSnapshot();
20
+ for (const line of formatOllamaStatusMessage(readySnapshot)) {
21
+ console.log(line);
98
22
  }
99
23
  }
24
+ //# sourceMappingURL=checkModel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkModel.js","sourceRoot":"","sources":["../../src/utils/checkModel.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,yBAAyB,EACzB,uBAAuB,EACvB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACrC,MAAM,QAAQ,GAAG,MAAM,uBAAuB,EAAE,CAAC;IACjD,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACvB,KAAK,MAAM,IAAI,IAAI,yBAAyB,CAAC,QAAQ,CAAC,EAAE,CAAC;YACvD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC;QACD,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;IACpE,MAAM,WAAW,GAAG,MAAM,iBAAiB,EAAE,CAAC;IAC9C,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,uFAAuF,CAAC,CAAC;IAC3G,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,kBAAkB,EAAE,CAAC;IAC1C,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,gCAAgC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IACnE,CAAC;IAED,MAAM,aAAa,GAAG,MAAM,uBAAuB,EAAE,CAAC;IACtD,KAAK,MAAM,IAAI,IAAI,yBAAyB,CAAC,aAAa,CAAC,EAAE,CAAC;QAC5D,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC;AACH,CAAC","sourcesContent":["import {\n formatOllamaStatusMessage,\n getOllamaStatusSnapshot,\n startOllamaServer,\n waitForOllamaReady,\n} from './ollamaService.js';\n\nexport async function startModelProcess() {\n const snapshot = await getOllamaStatusSnapshot();\n if (snapshot.health.ok) {\n for (const line of formatOllamaStatusMessage(snapshot)) {\n console.log(line);\n }\n return;\n }\n\n console.log('⚙️ Ollama is not running. Attempting to start it...');\n const startResult = await startOllamaServer();\n if (!startResult.ok) {\n throw new Error('Ollama is not installed or could not be started. Run `scai model status` for details.');\n }\n\n const health = await waitForOllamaReady();\n if (!health.ok) {\n throw new Error(`Ollama did not become ready: ${health.detail}`);\n }\n\n const readySnapshot = await getOllamaStatusSnapshot();\n for (const line of formatOllamaStatusMessage(readySnapshot)) {\n console.log(line);\n }\n}\n"]}
@@ -78,3 +78,4 @@ export function getCommentSyntax(language) {
78
78
  return (commentMap[normalized] ||
79
79
  { singleLine: ["//"], multiLine: ["/*", "*/"] });
80
80
  }
81
+ //# sourceMappingURL=commentMap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commentMap.js","sourceRoot":"","sources":["../../src/utils/commentMap.ts"],"names":[],"mappings":"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","sourcesContent":["// utils/commentMap.ts\r\n\r\nexport type CommentSyntax = {\r\n singleLine: string[]; // e.g., [\"//\"]\r\n multiLine?: {\r\n start: string; // e.g., \"/*\"\r\n end: string; // e.g., \"*/\"\r\n }[];\r\n};\r\n\r\nexport const commentMap: Record<string, CommentSyntax> = {\r\n javascript: {\r\n singleLine: [\"//\"],\r\n multiLine: [{ start: \"/*\", end: \"*/\" }]\r\n },\r\n typescript: {\r\n singleLine: [\"//\"],\r\n multiLine: [{ start: \"/*\", end: \"*/\" }]\r\n },\r\n java: {\r\n singleLine: [\"//\"],\r\n multiLine: [{ start: \"/*\", end: \"*/\" }]\r\n },\r\n c: {\r\n singleLine: [\"//\"],\r\n multiLine: [{ start: \"/*\", end: \"*/\" }]\r\n },\r\n cpp: {\r\n singleLine: [\"//\"],\r\n multiLine: [{ start: \"/*\", end: \"*/\" }]\r\n },\r\n csharp: {\r\n singleLine: [\"//\"],\r\n multiLine: [{ start: \"/*\", end: \"*/\" }]\r\n },\r\n python: {\r\n singleLine: [\"#\"],\r\n multiLine: [\r\n { start: `\"\"\"`, end: `\"\"\"` },\r\n { start: `'''`, end: `'''` }\r\n ]\r\n },\r\n ruby: {\r\n singleLine: [\"#\"],\r\n multiLine: [{ start: `=begin`, end: `=end` }]\r\n },\r\n shell: {\r\n singleLine: [\"#\"]\r\n },\r\n bash: {\r\n singleLine: [\"#\"]\r\n },\r\n html: {\r\n singleLine: [],\r\n multiLine: [{ start: \"<!--\", end: \"-->\" }]\r\n },\r\n css: {\r\n singleLine: [],\r\n multiLine: [{ start: \"/*\", end: \"*/\" }]\r\n },\r\n sql: {\r\n singleLine: [\"--\"],\r\n multiLine: []\r\n },\r\n xml: {\r\n singleLine: [],\r\n multiLine: [{ start: \"<!--\", end: \"-->\" }]\r\n },\r\n json: {\r\n singleLine: [],\r\n multiLine: [{ start: \"/*\", end: \"*/\" }]\r\n },\r\n markdown: {\r\n singleLine: [],\r\n multiLine: [{ start: \"<!--\", end: \"-->\" }]\r\n },\r\n text: {\r\n singleLine: [\"#\"]\r\n }\r\n};\r\n\r\n/**\r\n * Returns the CommentSyntax for a given language.\r\n * Falls back to single-line `#` if language is unknown.\r\n */\r\nexport function getCommentSyntax(language: string): CommentSyntax {\r\n const normalized = language.toLowerCase();\r\n return (\r\n commentMap[normalized] ||\r\n { singleLine: [\"//\"], multiLine: [\"/*\", \"*/\"] }\r\n );\r\n}\r\n"]}
@@ -1,5 +1,14 @@
1
+ /**
2
+ * Compiles one user query into aligned anchors, FTS terms, literals, and regex hints.
3
+ *
4
+ * Why this file exists:
5
+ * - search preparation should stay consistent with explicit-ref extraction and search routing
6
+ * - shell command tokens like `/resume` should not leak into file anchors
7
+ * - code-call prose like `Trace how generate() works` should not auto-enable regex mode
8
+ */
1
9
  import path from "path";
2
- import { STOP_WORDS } from "../fileRules/stopWords.js";
10
+ import { isExplicitRefCandidate, queryNeedsRegexMode } from "../fileRules/queryTokenRules.js";
11
+ import { SENTENCE_STARTER_WORDS, STOP_WORDS } from "../fileRules/stopWords.js";
3
12
  import { extractFileReferences } from "./extractFileReferences.js";
4
13
  const QUERY_OPERATOR_TOKENS = new Set(["or", "and", "not", "near"]);
5
14
  const GENERIC_FTS_TERMS = new Set([
@@ -56,7 +65,7 @@ export function compileSearchQuery(args) {
56
65
  ...symbolRefs,
57
66
  ...filteredTerms,
58
67
  ]).filter(Boolean);
59
- const regexEnabled = mode === "regex" || (mode === "auto" && looksLikeRegex(rawQuery));
68
+ const regexEnabled = mode === "regex" || (mode === "auto" && queryNeedsRegexMode(rawQuery));
60
69
  return {
61
70
  rawQuery,
62
71
  mode,
@@ -85,7 +94,7 @@ function collectIntentFileRefs(intent) {
85
94
  return [];
86
95
  return intent.targetFiles
87
96
  .map(entry => String(entry ?? "").trim())
88
- .filter(Boolean);
97
+ .filter(entry => isExplicitRefCandidate(entry));
89
98
  }
90
99
  function collectIntentSymbols(intent) {
91
100
  if (!Array.isArray(intent.targetSymbols))
@@ -112,15 +121,24 @@ function dedupeNormalizedStrings(tokens) {
112
121
  return out;
113
122
  }
114
123
  function extractLikelySymbols(input) {
124
+ // Keep identifier-like terms for anchor expansion, reject conversational starters.
125
+ // Example: "trace routingDecisionStep" -> includes "routingDecisionStep".
126
+ // Example: "Can you trace..." -> excludes "Can".
115
127
  const matches = String(input ?? "").match(/[A-Za-z_][A-Za-z0-9_]{2,}/g) ?? [];
116
128
  const out = new Set();
117
129
  for (const token of matches) {
118
130
  const lowered = token.toLowerCase();
119
- const looksLikeSymbol = /[A-Z]/.test(token) ||
131
+ if (STOP_WORDS.has(lowered) || SENTENCE_STARTER_WORDS.has(lowered))
132
+ continue;
133
+ const looksLikeSymbol = /[a-z][A-Z]/.test(token) ||
134
+ /[A-Z]{2,}[a-z]/.test(token) ||
120
135
  token.includes("_") ||
136
+ /[0-9]/.test(token) ||
121
137
  SYMBOL_HINT_SUFFIXES.some(suffix => lowered.endsWith(suffix));
122
138
  if (!looksLikeSymbol)
123
139
  continue;
140
+ if (token.length < 4 && !SYMBOL_HINT_SUFFIXES.some(suffix => lowered.endsWith(suffix)))
141
+ continue;
124
142
  out.add(token);
125
143
  }
126
144
  return Array.from(out);
@@ -131,8 +149,4 @@ function toSearchTerms(input) {
131
149
  .match(/[a-z0-9_]{2,}/g) ?? [];
132
150
  return Array.from(new Set(matches));
133
151
  }
134
- function looksLikeRegex(input) {
135
- if (!input)
136
- return false;
137
- return /[\[\]{}()+?|\\.^$]/.test(input);
138
- }
152
+ //# sourceMappingURL=compileSearchQuery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compileSearchQuery.js","sourceRoot":"","sources":["../../src/utils/compileSearchQuery.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Compiles one user query into aligned anchors, FTS terms, literals, and regex hints.\n *\n * Why this file exists:\n * - search preparation should stay consistent with explicit-ref extraction and search routing\n * - shell command tokens like `/resume` should not leak into file anchors\n * - code-call prose like `Trace how generate() works` should not auto-enable regex mode\n */\nimport path from \"path\";\n\nimport type { AnalysisState } from \"../types.js\";\nimport { isExplicitRefCandidate, queryNeedsRegexMode } from \"../fileRules/queryTokenRules.js\";\nimport { SENTENCE_STARTER_WORDS, STOP_WORDS } from \"../fileRules/stopWords.js\";\nimport { extractFileReferences } from \"./extractFileReferences.js\";\n\ntype SearchIntent = NonNullable<AnalysisState[\"intent\"]>;\n\nexport type SearchMode = \"auto\" | \"literal\" | \"fts\" | \"regex\";\n\nexport interface CompiledSearchQuery {\n rawQuery: string;\n mode: SearchMode;\n anchors: {\n files: string[];\n symbols: string[];\n };\n fts: {\n terms: string[];\n expression: string | null;\n };\n literal: {\n terms: string[];\n };\n regex: {\n terms: string[];\n enabled: boolean;\n };\n diagnostics: {\n droppedTerms: string[];\n };\n}\n\nconst QUERY_OPERATOR_TOKENS = new Set([\"or\", \"and\", \"not\", \"near\"]);\nconst GENERIC_FTS_TERMS = new Set([\n \"file\",\n \"files\",\n \"code\",\n \"source\",\n \"repository\",\n \"result\",\n \"results\",\n \"output\",\n \"entry\",\n \"database\",\n \"configuration\",\n]);\n\nconst SYMBOL_HINT_SUFFIXES = [\"step\", \"module\", \"service\", \"controller\", \"handler\", \"manager\"];\nexport function compileSearchQuery(args: {\n query: string;\n intent?: Partial<SearchIntent>;\n mode?: SearchMode;\n maxTerms?: number;\n}): CompiledSearchQuery {\n const rawQuery = String(args.query ?? \"\").trim();\n const intent = args.intent ?? {};\n const mode = args.mode ?? \"auto\";\n const maxTerms = Math.max(1, args.maxTerms ?? 12);\n\n const fileRefs = dedupeNormalizedStrings([\n ...extractFileReferences(rawQuery),\n ...collectIntentFileRefs(intent),\n ]);\n\n const symbolRefs = dedupeNormalizedStrings([\n ...collectIntentSymbols(intent),\n ...extractLikelySymbols(rawQuery),\n ]);\n\n const anchorFileTerms = fileRefs.flatMap(ref => toSearchTerms(path.basename(ref)));\n const anchorSymbolTerms = symbolRefs.flatMap(ref => toSearchTerms(ref));\n\n const baseTerms = dedupeNormalizedStrings([\n ...toSearchTerms(rawQuery),\n ...anchorFileTerms,\n ...anchorSymbolTerms,\n ]);\n\n const droppedTerms: string[] = [];\n const filteredTerms = baseTerms.filter(term => {\n if (term.length < 2) {\n droppedTerms.push(term);\n return false;\n }\n if (STOP_WORDS.has(term) || QUERY_OPERATOR_TOKENS.has(term)) {\n droppedTerms.push(term);\n return false;\n }\n return true;\n });\n\n const hasAnchors = anchorFileTerms.length > 0 || anchorSymbolTerms.length > 0;\n const ftsTerms = dedupeNormalizedStrings(\n filteredTerms.filter(term => !(hasAnchors && GENERIC_FTS_TERMS.has(term)))\n ).slice(0, maxTerms);\n\n const literalTerms = dedupeNormalizedStrings([\n rawQuery,\n ...fileRefs,\n ...symbolRefs,\n ...filteredTerms,\n ]).filter(Boolean);\n\n const regexEnabled = mode === \"regex\" || (mode === \"auto\" && queryNeedsRegexMode(rawQuery));\n\n return {\n rawQuery,\n mode,\n anchors: {\n files: fileRefs,\n symbols: symbolRefs,\n },\n fts: {\n terms: ftsTerms,\n expression: ftsTerms.length > 0 ? ftsTerms.map(term => `${term}*`).join(\" OR \") : null,\n },\n literal: {\n terms: literalTerms,\n },\n regex: {\n terms: regexEnabled ? [rawQuery].filter(Boolean) : [],\n enabled: regexEnabled,\n },\n diagnostics: {\n droppedTerms,\n },\n };\n}\n\nfunction collectIntentFileRefs(intent: Partial<SearchIntent>): string[] {\n if (!Array.isArray(intent.targetFiles)) return [];\n return intent.targetFiles\n .map(entry => String(entry ?? \"\").trim())\n .filter(entry => isExplicitRefCandidate(entry));\n}\n\nfunction collectIntentSymbols(intent: Partial<SearchIntent>): string[] {\n if (!Array.isArray(intent.targetSymbols)) return [];\n return intent.targetSymbols\n .map(entry => String(entry ?? \"\").trim())\n .filter(Boolean);\n}\n\nfunction dedupeNormalizedStrings(tokens: string[]): string[] {\n const out: string[] = [];\n const seen = new Set<string>();\n\n for (const token of tokens) {\n if (typeof token !== \"string\") continue;\n const normalized = token.trim().replace(/\\\\/g, \"/\");\n if (!normalized) continue;\n const key = normalized.toLowerCase();\n if (seen.has(key)) continue;\n seen.add(key);\n out.push(normalized);\n }\n\n return out;\n}\n\nfunction extractLikelySymbols(input: string): string[] {\n // Keep identifier-like terms for anchor expansion, reject conversational starters.\n // Example: \"trace routingDecisionStep\" -> includes \"routingDecisionStep\".\n // Example: \"Can you trace...\" -> excludes \"Can\".\n const matches = String(input ?? \"\").match(/[A-Za-z_][A-Za-z0-9_]{2,}/g) ?? [];\n const out = new Set<string>();\n\n for (const token of matches) {\n const lowered = token.toLowerCase();\n if (STOP_WORDS.has(lowered) || SENTENCE_STARTER_WORDS.has(lowered)) continue;\n\n const looksLikeSymbol =\n /[a-z][A-Z]/.test(token) ||\n /[A-Z]{2,}[a-z]/.test(token) ||\n token.includes(\"_\") ||\n /[0-9]/.test(token) ||\n SYMBOL_HINT_SUFFIXES.some(suffix => lowered.endsWith(suffix));\n\n if (!looksLikeSymbol) continue;\n if (token.length < 4 && !SYMBOL_HINT_SUFFIXES.some(suffix => lowered.endsWith(suffix))) continue;\n out.add(token);\n }\n\n return Array.from(out);\n}\n\nfunction toSearchTerms(input: string): string[] {\n const matches = String(input ?? \"\")\n .toLowerCase()\n .match(/[a-z0-9_]{2,}/g) ?? [];\n\n return Array.from(new Set(matches));\n}\n"]}
@@ -0,0 +1,208 @@
1
+ /**
2
+ * Centralizes console presentation for transient spinner state and durable messages.
3
+ *
4
+ * Why this file exists:
5
+ * - runtime logs and console logs should have separate sinks
6
+ * - the modular agent should share one durable message path across milestones
7
+ * - spinner pause/resume should not be reimplemented in each runtime
8
+ * - dev-only state debug lines should stay out of the normal user path
9
+ */
10
+ import chalk from "chalk";
11
+ import { Config } from "../config.js";
12
+ import { logRuntimeRecord } from "./runtimeLogger.js";
13
+ function formatRuntimeLabel(runtime) {
14
+ return runtime === "agent" ? "simple" : "autonomous";
15
+ }
16
+ export function shouldShowConsoleTiming() {
17
+ return Config.getDevOutput();
18
+ }
19
+ export function formatConsoleDuration(durationMs) {
20
+ if (durationMs < 1000) {
21
+ return `${durationMs}ms`;
22
+ }
23
+ if (durationMs < 60000) {
24
+ const seconds = durationMs / 1000;
25
+ return `${Number(seconds.toFixed(1))}s`;
26
+ }
27
+ const totalSeconds = Math.round(durationMs / 1000);
28
+ const minutes = Math.floor(totalSeconds / 60);
29
+ const seconds = totalSeconds % 60;
30
+ return `${minutes}m ${seconds}s`;
31
+ }
32
+ function formatTimingSuffix(durationMs, attemptCount) {
33
+ const retryText = typeof attemptCount === "number" && attemptCount > 1
34
+ ? `, ${attemptCount} attempts`
35
+ : "";
36
+ return ` (${formatConsoleDuration(durationMs)}${retryText})`;
37
+ }
38
+ function describeCompletedAgentLlmCall(label) {
39
+ switch (label) {
40
+ case "agent.understand":
41
+ return "understand";
42
+ case "agent.action-choice":
43
+ return "action-choice";
44
+ case "agent.plan":
45
+ return "plan";
46
+ case "agent.final-answer":
47
+ return "final-answer";
48
+ default:
49
+ return null;
50
+ }
51
+ }
52
+ function formatAttemptSuffix(attemptCount) {
53
+ return typeof attemptCount === "number" && attemptCount > 1
54
+ ? ` | attempts=${attemptCount}`
55
+ : "";
56
+ }
57
+ /**
58
+ * Formats one durable section header line for console presentation.
59
+ * Example: `Boot` -> `== Boot ==`.
60
+ */
61
+ export function formatConsoleSectionHeader(title, hasPrintedHeader) {
62
+ return `${hasPrintedHeader ? "\n" : ""}== ${title} ==`;
63
+ }
64
+ /**
65
+ * Formats the shared simple-agent failure block for user-facing console output.
66
+ * Example: one runtime error becomes one durable multi-line message.
67
+ */
68
+ export function formatStructuredAgentFailure(details) {
69
+ return [
70
+ `❌ Simple agent failed at ${details.stage}.`,
71
+ ...(details.stepId ? [`Step: ${details.stepId}`] : []),
72
+ ...(details.action ? [`Action: ${details.action}`] : []),
73
+ `Reason: ${details.message}`,
74
+ "Use /context to inspect the task, or check runtime.log for details.",
75
+ ].join("\n");
76
+ }
77
+ /**
78
+ * Formats the shared simple-agent blocked/incomplete message.
79
+ * Example: `max-turns` -> `Simple agent stopped without a final answer.`
80
+ */
81
+ export function formatStructuredAgentIncomplete(details) {
82
+ return [
83
+ `⚠️ Simple agent stopped without a final answer.`,
84
+ `Status: ${details.status}`,
85
+ ...(details.reason ? [`Reason: ${details.reason}`] : []),
86
+ "Use /context to inspect the task, or check runtime.log for details.",
87
+ ].join("\n");
88
+ }
89
+ /**
90
+ * Formats the shared ask-run startup line for both runtimes.
91
+ * Example: `agent` -> `Launching simple agent...`.
92
+ */
93
+ export function formatAgentLaunchMessage(runtime) {
94
+ return `Launching ${formatRuntimeLabel(runtime)} agent...`;
95
+ }
96
+ /**
97
+ * Formats the shared ask-run environment line before agent work starts.
98
+ * Example: `/repo/.scai/index` -> `Using index root: /repo/.scai/index`.
99
+ */
100
+ export function formatIndexRootMessage(indexRoot) {
101
+ return `Using index root: ${indexRoot}`;
102
+ }
103
+ /**
104
+ * Formats the shared top-level ask failure line for the main runtime.
105
+ * Example: `timeout` -> `Autonomous agent run failed: timeout`.
106
+ */
107
+ export function formatTopLevelAgentFailure(runtime, message) {
108
+ return `${formatRuntimeLabel(runtime)} agent run failed: ${message}`;
109
+ }
110
+ /**
111
+ * Formats the shared final-answer block for durable console output.
112
+ * Example: `Done.` -> `[FINAL ANSWER]\nDone.`
113
+ */
114
+ export function formatFinalAnswerBlock(answer) {
115
+ return chalk.yellow(`\n\n[FINAL ANSWER]\n${answer}\n`);
116
+ }
117
+ export function formatAgentLlmTimingMessage(label, trace) {
118
+ if (!shouldShowConsoleTiming() || typeof trace?.durationMs !== "number") {
119
+ return null;
120
+ }
121
+ const stage = describeCompletedAgentLlmCall(label);
122
+ if (!stage) {
123
+ return null;
124
+ }
125
+ return `[LLM] ${stage} finished | ${formatConsoleDuration(trace.durationMs)}${formatAttemptSuffix(trace.attemptCount)}`;
126
+ }
127
+ export function formatAgentStepStateMessage(details) {
128
+ const duration = typeof details.durationMs === "number"
129
+ ? ` | ${formatConsoleDuration(details.durationMs)}`
130
+ : "";
131
+ return `[STATE] step ${details.stepId} ${details.from} -> ${details.to} | action=${details.action}${duration}`;
132
+ }
133
+ export function formatAgentTaskStateMessage(details) {
134
+ const reason = details.reason ? ` | reason=${details.reason}` : "";
135
+ return `[STATE] task ${details.from} -> ${details.to}${reason}`;
136
+ }
137
+ /**
138
+ * Builds one shared console UI for CLI agent runs.
139
+ * Example: spinner shows the current step while durable milestone lines print below it.
140
+ */
141
+ export function createConsoleAgentUI(spinner, runtime, getTaskId) {
142
+ return {
143
+ update: (text) => spinner.update(text),
144
+ message: (text) => {
145
+ const restartSpinner = spinner.isActive();
146
+ spinner.stop();
147
+ try {
148
+ process.stdout.write("\r\x1b[K");
149
+ console.log(text);
150
+ logRuntimeRecord({
151
+ runtime,
152
+ taskId: getTaskId(),
153
+ kind: "user-message",
154
+ phase: "shown",
155
+ status: "active",
156
+ summary: text,
157
+ });
158
+ }
159
+ finally {
160
+ if (restartSpinner) {
161
+ spinner.start();
162
+ }
163
+ }
164
+ },
165
+ pause: (fn) => {
166
+ const restartSpinner = spinner.isActive();
167
+ spinner.stop();
168
+ try {
169
+ fn();
170
+ }
171
+ finally {
172
+ if (restartSpinner) {
173
+ spinner.start();
174
+ }
175
+ }
176
+ },
177
+ succeed: (msg) => spinner.succeed(msg),
178
+ fail: (msg) => spinner.fail(msg),
179
+ stop: () => spinner.stop(),
180
+ };
181
+ }
182
+ /**
183
+ * Prints one durable console line through the shared UI when available.
184
+ * Example: new-agent milestone lines and final answers both use this path.
185
+ */
186
+ export function emitConsoleMessage(ui, message) {
187
+ ui.message(message);
188
+ }
189
+ export function emitFinalAnswerBlock(ui, answer) {
190
+ ui.message(formatFinalAnswerBlock(answer));
191
+ }
192
+ export function emitAgentLlmTimingMessage(ui, label, trace) {
193
+ const message = formatAgentLlmTimingMessage(label, trace);
194
+ if (message) {
195
+ ui.message(message);
196
+ }
197
+ }
198
+ export function emitAgentStepStateMessage(ui, details) {
199
+ if (!shouldShowConsoleTiming())
200
+ return;
201
+ ui.message(formatAgentStepStateMessage(details));
202
+ }
203
+ export function emitAgentTaskStateMessage(ui, details) {
204
+ if (!shouldShowConsoleTiming())
205
+ return;
206
+ ui.message(formatAgentTaskStateMessage(details));
207
+ }
208
+ //# sourceMappingURL=consolePresentation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consolePresentation.js","sourceRoot":"","sources":["../../src/utils/consolePresentation.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Centralizes console presentation for transient spinner state and durable messages.\n *\n * Why this file exists:\n * - runtime logs and console logs should have separate sinks\n * - the modular agent should share one durable message path across milestones\n * - spinner pause/resume should not be reimplemented in each runtime\n * - dev-only state debug lines should stay out of the normal user path\n */\nimport chalk from \"chalk\";\nimport { Config } from \"../config.js\";\nimport type { AgentUI } from \"../types.js\";\nimport { Spinner } from \"../lib/spinner.js\";\nimport { logRuntimeRecord } from \"./runtimeLogger.js\";\n\ntype RuntimeName = \"main\" | \"agent\";\n\nfunction formatRuntimeLabel(runtime: RuntimeName): string {\n return runtime === \"agent\" ? \"simple\" : \"autonomous\";\n}\n\ntype AgentTrace = {\n durationMs?: number;\n attemptCount?: number;\n};\n\ntype AgentStepStateLine = {\n stepId: string;\n action: string;\n from: string;\n to: string;\n durationMs?: number;\n};\n\ntype AgentTaskStateLine = {\n from: string;\n to: string;\n reason?: string;\n};\n\nexport function shouldShowConsoleTiming(): boolean {\n return Config.getDevOutput();\n}\n\nexport function formatConsoleDuration(durationMs: number): string {\n if (durationMs < 1000) {\n return `${durationMs}ms`;\n }\n\n if (durationMs < 60_000) {\n const seconds = durationMs / 1000;\n return `${Number(seconds.toFixed(1))}s`;\n }\n\n const totalSeconds = Math.round(durationMs / 1000);\n const minutes = Math.floor(totalSeconds / 60);\n const seconds = totalSeconds % 60;\n return `${minutes}m ${seconds}s`;\n}\n\nfunction formatTimingSuffix(durationMs: number, attemptCount?: number): string {\n const retryText = typeof attemptCount === \"number\" && attemptCount > 1\n ? `, ${attemptCount} attempts`\n : \"\";\n return ` (${formatConsoleDuration(durationMs)}${retryText})`;\n}\n\nfunction describeCompletedAgentLlmCall(label: string): string | null {\n switch (label) {\n case \"agent.understand\":\n return \"understand\";\n case \"agent.action-choice\":\n return \"action-choice\";\n case \"agent.plan\":\n return \"plan\";\n case \"agent.final-answer\":\n return \"final-answer\";\n default:\n return null;\n }\n}\n\nfunction formatAttemptSuffix(attemptCount?: number): string {\n return typeof attemptCount === \"number\" && attemptCount > 1\n ? ` | attempts=${attemptCount}`\n : \"\";\n}\n\n/**\n * Formats one durable section header line for console presentation.\n * Example: `Boot` -> `== Boot ==`.\n */\nexport function formatConsoleSectionHeader(title: string, hasPrintedHeader: boolean): string {\n return `${hasPrintedHeader ? \"\\n\" : \"\"}== ${title} ==`;\n}\n\n/**\n * Formats the shared simple-agent failure block for user-facing console output.\n * Example: one runtime error becomes one durable multi-line message.\n */\nexport function formatStructuredAgentFailure(details: {\n stage: string;\n message: string;\n stepId?: string;\n action?: string;\n}): string {\n return [\n `❌ Simple agent failed at ${details.stage}.`,\n ...(details.stepId ? [`Step: ${details.stepId}`] : []),\n ...(details.action ? [`Action: ${details.action}`] : []),\n `Reason: ${details.message}`,\n \"Use /context to inspect the task, or check runtime.log for details.\",\n ].join(\"\\n\");\n}\n\n/**\n * Formats the shared simple-agent blocked/incomplete message.\n * Example: `max-turns` -> `Simple agent stopped without a final answer.`\n */\nexport function formatStructuredAgentIncomplete(details: {\n status: string;\n reason?: string;\n}): string {\n return [\n `⚠️ Simple agent stopped without a final answer.`,\n `Status: ${details.status}`,\n ...(details.reason ? [`Reason: ${details.reason}`] : []),\n \"Use /context to inspect the task, or check runtime.log for details.\",\n ].join(\"\\n\");\n}\n\n/**\n * Formats the shared ask-run startup line for both runtimes.\n * Example: `agent` -> `Launching simple agent...`.\n */\nexport function formatAgentLaunchMessage(runtime: RuntimeName): string {\n return `Launching ${formatRuntimeLabel(runtime)} agent...`;\n}\n\n/**\n * Formats the shared ask-run environment line before agent work starts.\n * Example: `/repo/.scai/index` -> `Using index root: /repo/.scai/index`.\n */\nexport function formatIndexRootMessage(indexRoot: string): string {\n return `Using index root: ${indexRoot}`;\n}\n\n/**\n * Formats the shared top-level ask failure line for the main runtime.\n * Example: `timeout` -> `Autonomous agent run failed: timeout`.\n */\nexport function formatTopLevelAgentFailure(runtime: RuntimeName, message: string): string {\n return `${formatRuntimeLabel(runtime)} agent run failed: ${message}`;\n}\n\n/**\n * Formats the shared final-answer block for durable console output.\n * Example: `Done.` -> `[FINAL ANSWER]\\nDone.`\n */\nexport function formatFinalAnswerBlock(answer: string): string {\n return chalk.yellow(`\\n\\n[FINAL ANSWER]\\n${answer}\\n`);\n}\n\nexport function formatAgentLlmTimingMessage(label: string, trace?: AgentTrace): string | null {\n if (!shouldShowConsoleTiming() || typeof trace?.durationMs !== \"number\") {\n return null;\n }\n\n const stage = describeCompletedAgentLlmCall(label);\n if (!stage) {\n return null;\n }\n\n return `[LLM] ${stage} finished | ${formatConsoleDuration(trace.durationMs)}${formatAttemptSuffix(trace.attemptCount)}`;\n}\n\nexport function formatAgentStepStateMessage(details: AgentStepStateLine): string {\n const duration = typeof details.durationMs === \"number\"\n ? ` | ${formatConsoleDuration(details.durationMs)}`\n : \"\";\n return `[STATE] step ${details.stepId} ${details.from} -> ${details.to} | action=${details.action}${duration}`;\n}\n\nexport function formatAgentTaskStateMessage(details: AgentTaskStateLine): string {\n const reason = details.reason ? ` | reason=${details.reason}` : \"\";\n return `[STATE] task ${details.from} -> ${details.to}${reason}`;\n}\n\n/**\n * Builds one shared console UI for CLI agent runs.\n * Example: spinner shows the current step while durable milestone lines print below it.\n */\nexport function createConsoleAgentUI(\n spinner: Spinner,\n runtime: RuntimeName,\n getTaskId: () => string | number | undefined\n): AgentUI {\n return {\n update: (text) => spinner.update(text),\n message: (text) => {\n const restartSpinner = spinner.isActive();\n spinner.stop();\n try {\n process.stdout.write(\"\\r\\x1b[K\");\n console.log(text);\n logRuntimeRecord({\n runtime,\n taskId: getTaskId(),\n kind: \"user-message\",\n phase: \"shown\",\n status: \"active\",\n summary: text,\n });\n } finally {\n if (restartSpinner) {\n spinner.start();\n }\n }\n },\n pause: (fn) => {\n const restartSpinner = spinner.isActive();\n spinner.stop();\n try {\n fn();\n } finally {\n if (restartSpinner) {\n spinner.start();\n }\n }\n },\n succeed: (msg) => spinner.succeed(msg),\n fail: (msg) => spinner.fail(msg),\n stop: () => spinner.stop(),\n };\n}\n\n/**\n * Prints one durable console line through the shared UI when available.\n * Example: new-agent milestone lines and final answers both use this path.\n */\nexport function emitConsoleMessage(ui: AgentUI, message: string): void {\n ui.message(message);\n}\n\nexport function emitFinalAnswerBlock(ui: AgentUI, answer: string): void {\n ui.message(formatFinalAnswerBlock(answer));\n}\n\nexport function emitAgentLlmTimingMessage(ui: Pick<AgentUI, \"message\">, label: string, trace?: AgentTrace): void {\n const message = formatAgentLlmTimingMessage(label, trace);\n if (message) {\n ui.message(message);\n }\n}\n\nexport function emitAgentStepStateMessage(\n ui: Pick<AgentUI, \"message\">,\n details: AgentStepStateLine\n): void {\n if (!shouldShowConsoleTiming()) return;\n ui.message(formatAgentStepStateMessage(details));\n}\n\nexport function emitAgentTaskStateMessage(\n ui: Pick<AgentUI, \"message\">,\n details: AgentTaskStateLine\n): void {\n if (!shouldShowConsoleTiming()) return;\n ui.message(formatAgentTaskStateMessage(details));\n}\n"]}
@@ -1,5 +1,6 @@
1
1
  import os from 'os';
2
2
  import path from "path";
3
+ import { execFileSync } from "child_process";
3
4
  /**
4
5
  * Normalizes a path string for loose, fuzzy matching:
5
6
  * - Lowercases
@@ -16,9 +17,22 @@ export function normalizePath(p) {
16
17
  }
17
18
  return path.resolve(p).replace(/\\/g, '/');
18
19
  }
20
+ export function canonicalizeRepoPath(p) {
21
+ const normalized = normalizePath(p);
22
+ try {
23
+ return normalizePath(execFileSync("git", ["rev-parse", "--show-toplevel"], {
24
+ cwd: normalized,
25
+ encoding: "utf-8",
26
+ stdio: ["ignore", "pipe", "ignore"],
27
+ }).trim());
28
+ }
29
+ catch {
30
+ return normalized;
31
+ }
32
+ }
19
33
  export function getRepoKeyForPath(pathToMatch, config) {
20
- const norm = normalizePath(pathToMatch);
21
- return Object.entries(config.repos).find(([, val]) => normalizePath(val.indexDir) === norm)?.[0] || null;
34
+ const norm = canonicalizeRepoPath(pathToMatch);
35
+ return Object.entries(config.repos).find(([, val]) => val.indexDir ? canonicalizeRepoPath(val.indexDir) === norm : false)?.[0] || null;
22
36
  }
23
37
  export function normalizeText(txt) {
24
38
  return txt.replace(/\r\n/g, "\n").replace(/\r/g, "\n");
@@ -47,3 +61,4 @@ export function isCodeLike(line) {
47
61
  return true;
48
62
  return false;
49
63
  }
64
+ //# sourceMappingURL=contentUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contentUtils.js","sourceRoot":"","sources":["../../src/utils/contentUtils.ts"],"names":[],"mappings":"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","sourcesContent":["import os from 'os';\nimport path from \"path\";\nimport { execFileSync } from \"child_process\";\nimport { ScaiConfig } from \"../types\";\n\r\n/**\r\n * Normalizes a path string for loose, fuzzy matching:\r\n * - Lowercases\r\n * - Removes slashes and backslashes\r\n * - Removes whitespace\r\n */\r\nexport function normalizePathForLooseMatch(p: string): string {\r\n return p.toLowerCase().replace(/[\\\\/]/g, '').replace(/\\s+/g, '');\r\n}\r\n\r\n// Helper to normalize and resolve paths to a consistent format (forward slashes)\r\nexport function normalizePath(p: string): string {\n if (p.startsWith('~')) {\r\n p = path.join(os.homedir(), p.slice(1));\r\n }\r\n return path.resolve(p).replace(/\\\\/g, '/');\n}\n\nexport function canonicalizeRepoPath(p: string): string {\n const normalized = normalizePath(p);\n try {\n return normalizePath(\n execFileSync(\"git\", [\"rev-parse\", \"--show-toplevel\"], {\n cwd: normalized,\n encoding: \"utf-8\",\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n }).trim()\n );\n } catch {\n return normalized;\n }\n}\n\nexport function getRepoKeyForPath(pathToMatch: string, config: ScaiConfig): string | null {\n const norm = canonicalizeRepoPath(pathToMatch);\n return Object.entries(config.repos).find(\n ([, val]) => val.indexDir ? canonicalizeRepoPath(val.indexDir) === norm : false\n )?.[0] || null;\n}\n\r\nexport function normalizeText(txt: string): string {\r\n return txt.replace(/\\r\\n/g, \"\\n\").replace(/\\r/g, \"\\n\");\r\n}\r\n\r\nexport function stripMarkdownFences(txt: string): string {\r\n return txt\r\n .replace(/```[\\w-]*\\s*/g, \"\") // ``` or ```java\r\n .replace(/```/g, \"\"); // closing ```\r\n}\r\n\r\n// Very naive classifier: decide if a line is \"code-like\"\r\nexport function isCodeLike(line: string): boolean {\r\n const trimmed = line.trim();\r\n if (!trimmed) return false;\r\n\r\n // obvious markdown / prose markers\r\n if (/^(This|Here is|Note)\\b/.test(trimmed)) return false;\r\n if (/^\\d+\\./.test(trimmed)) return false; // bullet list\r\n if (/^[-*] /.test(trimmed)) return false; // list\r\n\r\n // allow imports, class, functions, braces, annotations, etc.\r\n if (/^(import|export|public|private|protected|class|function|@Test|@Before)/.test(trimmed)) return true;\r\n if (/[;{}()=]/.test(trimmed)) return true;\r\n\r\n return false;\r\n}\r\n"]}
@@ -22,3 +22,4 @@ export function debugContext(context, options = {}) {
22
22
  process.exit(0);
23
23
  }
24
24
  }
25
+ //# sourceMappingURL=debugContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debugContext.js","sourceRoot":"","sources":["../../src/utils/debugContext.ts"],"names":[],"mappings":"AAAA,kCAAkC;AAClC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,KAAK,MAAM,OAAO,CAAC;AAU1B,MAAM,UAAU,YAAY,CAC1B,OAA0B,EAC1B,UAAwB,EAAE;IAE1B,MAAM,EACJ,IAAI,GAAG,cAAc,EACrB,IAAI,EACJ,IAAI,GAAG,IAAI,EACX,KAAK,GAAG,CAAC,EACV,GAAG,OAAO,CAAC;IAEZ,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAClB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC,CAAC;IACjE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,CAAC;IAC3C,IAAI,IAAI;QAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,CAAC;IAEnD,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;IAElD,OAAO,CAAC,GAAG,CACT,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;QACpB,KAAK;QACL,MAAM,EAAE,IAAI;QACZ,OAAO,EAAE,KAAK;QACd,cAAc,EAAE,EAAE;QAClB,WAAW,EAAE,GAAG;KACjB,CAAC,CACH,CAAC;IAEF,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;IAE/D,IAAI,IAAI,EAAE,CAAC;QACT,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC,CAAC;QACtE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC","sourcesContent":["// File: src/utils/debugContext.ts\nimport util from \"util\";\nimport chalk from \"chalk\";\nimport type { StructuredContext } from \"../types\";\n\ninterface DebugOptions {\n step?: string;\n note?: string;\n exit?: boolean;\n depth?: number;\n}\n\nexport function debugContext(\n context: StructuredContext,\n options: DebugOptions = {}\n): never | void {\n const {\n step = \"unknown-step\",\n note,\n exit = true,\n depth = 6\n } = options;\n\n console.log(\"\\n\");\n console.log(chalk.bgYellow.black(\" 🛑 AGENT DEBUG BREAKPOINT \"));\n console.log(chalk.yellow(`Step: ${step}`));\n if (note) console.log(chalk.gray(`Note: ${note}`));\n\n console.log(\"\\n📦 StructuredContext snapshot:\\n\");\n\n console.log(\n util.inspect(context, {\n depth,\n colors: true,\n compact: false,\n maxArrayLength: 20,\n breakLength: 120\n })\n );\n\n console.log(\"\\n---------------------------------------------\");\n\n if (exit) {\n console.log(chalk.red(\"🚨 Exiting process after debug breakpoint\\n\"));\n process.exit(0);\n }\n}\n"]}