scai 0.1.178 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (770) hide show
  1. package/README.md +171 -260
  2. package/dist/__tests__/CommitSuggesterCmd.test.js +112 -0
  3. package/dist/__tests__/CommitSuggesterCmd.test.js.map +1 -0
  4. package/dist/__tests__/EvalReportCmd.test.js +645 -0
  5. package/dist/__tests__/EvalReportCmd.test.js.map +1 -0
  6. package/dist/__tests__/ModelCmd.test.js +64 -0
  7. package/dist/__tests__/ModelCmd.test.js.map +1 -0
  8. package/dist/__tests__/agents/agentActions.test.js +345 -0
  9. package/dist/__tests__/agents/agentActions.test.js.map +1 -0
  10. package/dist/__tests__/agents/agentFeedback.test.js +118 -0
  11. package/dist/__tests__/agents/agentFeedback.test.js.map +1 -0
  12. package/dist/__tests__/agents/agentGeneralScope.test.js +74 -0
  13. package/dist/__tests__/agents/agentGeneralScope.test.js.map +1 -0
  14. package/dist/__tests__/agents/agentLoop.test.js +1723 -0
  15. package/dist/__tests__/agents/agentLoop.test.js.map +1 -0
  16. package/dist/__tests__/agents/agentPolicyState.test.js +948 -0
  17. package/dist/__tests__/agents/agentPolicyState.test.js.map +1 -0
  18. package/dist/__tests__/agents/agentReadEvidence.test.js +170 -0
  19. package/dist/__tests__/agents/agentReadEvidence.test.js.map +1 -0
  20. package/dist/__tests__/agents/agentReadPersistence.test.js +129 -0
  21. package/dist/__tests__/agents/agentReadPersistence.test.js.map +1 -0
  22. package/dist/__tests__/agents/agentResumeCheckpoint.test.js +90 -0
  23. package/dist/__tests__/agents/agentResumeCheckpoint.test.js.map +1 -0
  24. package/dist/__tests__/agents/agentSearchBatchPlanner.test.js +289 -0
  25. package/dist/__tests__/agents/agentSearchBatchPlanner.test.js.map +1 -0
  26. package/dist/__tests__/agents/agentSearchOwnership.test.js +166 -0
  27. package/dist/__tests__/agents/agentSearchOwnership.test.js.map +1 -0
  28. package/dist/__tests__/agents/agentSearchRanking.test.js +139 -0
  29. package/dist/__tests__/agents/agentSearchRanking.test.js.map +1 -0
  30. package/dist/__tests__/agents/agentSearchRouting.test.js +584 -0
  31. package/dist/__tests__/agents/agentSearchRouting.test.js.map +1 -0
  32. package/dist/__tests__/agents/agentSearchScoring.test.js +23 -0
  33. package/dist/__tests__/agents/agentSearchScoring.test.js.map +1 -0
  34. package/dist/__tests__/agents/agentSearchShared.test.js +78 -0
  35. package/dist/__tests__/agents/agentSearchShared.test.js.map +1 -0
  36. package/dist/__tests__/agents/agentStateMachine.test.js +58 -0
  37. package/dist/__tests__/agents/agentStateMachine.test.js.map +1 -0
  38. package/dist/__tests__/agents/agentTaskPersistence.test.js +156 -0
  39. package/dist/__tests__/agents/agentTaskPersistence.test.js.map +1 -0
  40. package/dist/__tests__/agents/agentTools.test.js +69 -0
  41. package/dist/__tests__/agents/agentTools.test.js.map +1 -0
  42. package/dist/__tests__/agents/agentTransform.test.js +779 -0
  43. package/dist/__tests__/agents/agentTransform.test.js.map +1 -0
  44. package/dist/__tests__/agents/analysisPlanGenStep.test.js +157 -0
  45. package/dist/__tests__/agents/analysisPlanGenStep.test.js.map +1 -0
  46. package/dist/__tests__/agents/answerOnlyCompletion.test.js +75 -0
  47. package/dist/__tests__/agents/answerOnlyCompletion.test.js.map +1 -0
  48. package/dist/__tests__/agents/decideNextAction.test.js +1662 -0
  49. package/dist/__tests__/agents/decideNextAction.test.js.map +1 -0
  50. package/dist/__tests__/agents/deriveFocusFromSearchStep.test.js +258 -0
  51. package/dist/__tests__/agents/deriveFocusFromSearchStep.test.js.map +1 -0
  52. package/dist/__tests__/agents/evidenceVerifierStep.test.js +113 -0
  53. package/dist/__tests__/agents/evidenceVerifierStep.test.js.map +1 -0
  54. package/dist/__tests__/agents/executionPolicyResolver.test.js +208 -0
  55. package/dist/__tests__/agents/executionPolicyResolver.test.js.map +1 -0
  56. package/dist/__tests__/agents/fileCheckStep.test.js +299 -0
  57. package/dist/__tests__/agents/fileCheckStep.test.js.map +1 -0
  58. package/dist/__tests__/agents/giveUpEvaluatorStep.test.js +35 -0
  59. package/dist/__tests__/agents/giveUpEvaluatorStep.test.js.map +1 -0
  60. package/dist/__tests__/agents/guardState.test.js +297 -0
  61. package/dist/__tests__/agents/guardState.test.js.map +1 -0
  62. package/dist/__tests__/agents/mainAgentHeuristics.test.js +72 -0
  63. package/dist/__tests__/agents/mainAgentHeuristics.test.js.map +1 -0
  64. package/dist/__tests__/agents/objectiveEvaluatorStep.test.js +60 -0
  65. package/dist/__tests__/agents/objectiveEvaluatorStep.test.js.map +1 -0
  66. package/dist/__tests__/agents/outerLoopRecoveryEvaluator.test.js +207 -0
  67. package/dist/__tests__/agents/outerLoopRecoveryEvaluator.test.js.map +1 -0
  68. package/dist/__tests__/agents/prompting.test.js +363 -0
  69. package/dist/__tests__/agents/prompting.test.js.map +1 -0
  70. package/dist/__tests__/agents/readinessGateStep.test.js +180 -0
  71. package/dist/__tests__/agents/readinessGateStep.test.js.map +1 -0
  72. package/dist/__tests__/agents/reasonNextStep.test.js +56 -0
  73. package/dist/__tests__/agents/reasonNextStep.test.js.map +1 -0
  74. package/dist/__tests__/agents/reasonNextTaskStep.test.js +284 -0
  75. package/dist/__tests__/agents/reasonNextTaskStep.test.js.map +1 -0
  76. package/dist/__tests__/agents/resolveAgentTargetClassification.test.js +170 -0
  77. package/dist/__tests__/agents/resolveAgentTargetClassification.test.js.map +1 -0
  78. package/dist/__tests__/agents/resolveProgressState.test.js +526 -0
  79. package/dist/__tests__/agents/resolveProgressState.test.js.map +1 -0
  80. package/dist/__tests__/agents/resumeCheckpoint.test.js +50 -0
  81. package/dist/__tests__/agents/resumeCheckpoint.test.js.map +1 -0
  82. package/dist/__tests__/agents/routingDecisionStep.test.js +134 -0
  83. package/dist/__tests__/agents/routingDecisionStep.test.js.map +1 -0
  84. package/dist/__tests__/agents/scopeClassificationStep.test.js +118 -0
  85. package/dist/__tests__/agents/scopeClassificationStep.test.js.map +1 -0
  86. package/dist/__tests__/agents/searchContext.test.js +97 -0
  87. package/dist/__tests__/agents/searchContext.test.js.map +1 -0
  88. package/dist/__tests__/agents/selectRelevantSourcesStep.test.js +73 -0
  89. package/dist/__tests__/agents/selectRelevantSourcesStep.test.js.map +1 -0
  90. package/dist/__tests__/agents/structuredOutput.test.js +45 -0
  91. package/dist/__tests__/agents/structuredOutput.test.js.map +1 -0
  92. package/dist/__tests__/agents/transformPlanGenStep.fallback.test.js +59 -0
  93. package/dist/__tests__/agents/transformPlanGenStep.fallback.test.js.map +1 -0
  94. package/dist/__tests__/agents/transformPlanGenStep.test.js +92 -0
  95. package/dist/__tests__/agents/transformPlanGenStep.test.js.map +1 -0
  96. package/dist/__tests__/agents/understandIntentStep.test.js +237 -0
  97. package/dist/__tests__/agents/understandIntentStep.test.js.map +1 -0
  98. package/dist/__tests__/agents/understandResumeContext.test.js +65 -0
  99. package/dist/__tests__/agents/understandResumeContext.test.js.map +1 -0
  100. package/dist/__tests__/agents/understandScope.test.js +227 -0
  101. package/dist/__tests__/agents/understandScope.test.js.map +1 -0
  102. package/dist/__tests__/agents/validateChangesStep.test.js +52 -0
  103. package/dist/__tests__/agents/validateChangesStep.test.js.map +1 -0
  104. package/dist/__tests__/askCommandTaskBinding.test.js +176 -0
  105. package/dist/__tests__/askCommandTaskBinding.test.js.map +1 -0
  106. package/dist/__tests__/commandVisibility.test.js +25 -0
  107. package/dist/__tests__/commandVisibility.test.js.map +1 -0
  108. package/dist/__tests__/config.devOutput.test.js +82 -0
  109. package/dist/__tests__/config.devOutput.test.js.map +1 -0
  110. package/dist/__tests__/currentContext.test.js +43 -0
  111. package/dist/__tests__/currentContext.test.js.map +1 -0
  112. package/dist/__tests__/daemonWorker.test.js +51 -0
  113. package/dist/__tests__/daemonWorker.test.js.map +1 -0
  114. package/dist/__tests__/dialogState.test.js +113 -0
  115. package/dist/__tests__/dialogState.test.js.map +1 -0
  116. package/dist/__tests__/evalCommands.test.js +506 -0
  117. package/dist/__tests__/evalCommands.test.js.map +1 -0
  118. package/dist/__tests__/evalCommandsSummary.test.js +68 -0
  119. package/dist/__tests__/evalCommandsSummary.test.js.map +1 -0
  120. package/dist/__tests__/example.test.js +1 -0
  121. package/dist/__tests__/example.test.js.map +1 -0
  122. package/dist/__tests__/factory.commitCommand.test.js +45 -0
  123. package/dist/__tests__/factory.commitCommand.test.js.map +1 -0
  124. package/dist/__tests__/factory.devOutputCommand.test.js +122 -0
  125. package/dist/__tests__/factory.devOutputCommand.test.js.map +1 -0
  126. package/dist/__tests__/factory.evalCommands.test.js +38 -0
  127. package/dist/__tests__/factory.evalCommands.test.js.map +1 -0
  128. package/dist/__tests__/factory.planCommand.test.js +35 -0
  129. package/dist/__tests__/factory.planCommand.test.js.map +1 -0
  130. package/dist/__tests__/factory.setupCommand.test.js +34 -0
  131. package/dist/__tests__/factory.setupCommand.test.js.map +1 -0
  132. package/dist/__tests__/factory.statusCommand.test.js +54 -0
  133. package/dist/__tests__/factory.statusCommand.test.js.map +1 -0
  134. package/dist/__tests__/fileRules/queryTokenRules.test.js +35 -0
  135. package/dist/__tests__/fileRules/queryTokenRules.test.js.map +1 -0
  136. package/dist/__tests__/fileRules/searchPathClassification.test.js +57 -0
  137. package/dist/__tests__/fileRules/searchPathClassification.test.js.map +1 -0
  138. package/dist/__tests__/generate.ollamaRecovery.test.js +344 -0
  139. package/dist/__tests__/generate.ollamaRecovery.test.js.map +1 -0
  140. package/dist/__tests__/index.modelStartup.test.js +24 -0
  141. package/dist/__tests__/index.modelStartup.test.js.map +1 -0
  142. package/dist/__tests__/indexCmd.test.js +85 -0
  143. package/dist/__tests__/indexCmd.test.js.map +1 -0
  144. package/dist/__tests__/indexSlashCommand.test.js +50 -0
  145. package/dist/__tests__/indexSlashCommand.test.js.map +1 -0
  146. package/dist/__tests__/ollamaService.test.js +103 -0
  147. package/dist/__tests__/ollamaService.test.js.map +1 -0
  148. package/dist/__tests__/pipeline/modules/codeTransformModule.small-file.test.js +68 -0
  149. package/dist/__tests__/pipeline/modules/codeTransformModule.small-file.test.js.map +1 -0
  150. package/dist/__tests__/pipeline/modules/commitSuggesterModule.test.js +68 -0
  151. package/dist/__tests__/pipeline/modules/commitSuggesterModule.test.js.map +1 -0
  152. package/dist/__tests__/pipeline/modules/fileSearchModule.test.js +284 -0
  153. package/dist/__tests__/pipeline/modules/fileSearchModule.test.js.map +1 -0
  154. package/dist/__tests__/pipeline/modules/finalAnswerModule.test.js +1139 -0
  155. package/dist/__tests__/pipeline/modules/finalAnswerModule.test.js.map +1 -0
  156. package/dist/__tests__/pipeline/modules/readFileModule.test.js +146 -0
  157. package/dist/__tests__/pipeline/modules/readFileModule.test.js.map +1 -0
  158. package/dist/__tests__/pipeline/modules/semanticAnalysisModule.test.js +192 -0
  159. package/dist/__tests__/pipeline/modules/semanticAnalysisModule.test.js.map +1 -0
  160. package/dist/__tests__/repoIdentity.test.js +31 -0
  161. package/dist/__tests__/repoIdentity.test.js.map +1 -0
  162. package/dist/__tests__/resumeContext.test.js +87 -0
  163. package/dist/__tests__/resumeContext.test.js.map +1 -0
  164. package/dist/__tests__/resumeState.test.js +239 -0
  165. package/dist/__tests__/resumeState.test.js.map +1 -0
  166. package/dist/__tests__/search/SearchOrchestrator.test.js +836 -0
  167. package/dist/__tests__/search/SearchOrchestrator.test.js.map +1 -0
  168. package/dist/__tests__/shellDialogUi.test.js +52 -0
  169. package/dist/__tests__/shellDialogUi.test.js.map +1 -0
  170. package/dist/__tests__/shellSession.test.js +102 -0
  171. package/dist/__tests__/shellSession.test.js.map +1 -0
  172. package/dist/__tests__/statusOwner.test.js +215 -0
  173. package/dist/__tests__/statusOwner.test.js.map +1 -0
  174. package/dist/__tests__/testing/contextEval.test.js +244 -0
  175. package/dist/__tests__/testing/contextEval.test.js.map +1 -0
  176. package/dist/__tests__/testing/harnessArtifacts.test.js +124 -0
  177. package/dist/__tests__/testing/harnessArtifacts.test.js.map +1 -0
  178. package/dist/__tests__/testing/llmTraceSession.test.js +67 -0
  179. package/dist/__tests__/testing/llmTraceSession.test.js.map +1 -0
  180. package/dist/__tests__/testing/registerDevCliCommands.test.js +35 -0
  181. package/dist/__tests__/testing/registerDevCliCommands.test.js.map +1 -0
  182. package/dist/__tests__/testing/runDiagnosis.test.js +159 -0
  183. package/dist/__tests__/testing/runDiagnosis.test.js.map +1 -0
  184. package/dist/__tests__/testing/runtimeLogReader.test.js +66 -0
  185. package/dist/__tests__/testing/runtimeLogReader.test.js.map +1 -0
  186. package/dist/__tests__/testing/testCommands.test.js +53 -0
  187. package/dist/__tests__/testing/testCommands.test.js.map +1 -0
  188. package/dist/__tests__/utils/compileSearchQuery.test.js +38 -0
  189. package/dist/__tests__/utils/compileSearchQuery.test.js.map +1 -0
  190. package/dist/__tests__/utils/consolePresentation.test.js +105 -0
  191. package/dist/__tests__/utils/consolePresentation.test.js.map +1 -0
  192. package/dist/__tests__/utils/extractFileReferences.test.js +41 -0
  193. package/dist/__tests__/utils/extractFileReferences.test.js.map +1 -0
  194. package/dist/__tests__/utils/log.test.js +34 -0
  195. package/dist/__tests__/utils/log.test.js.map +1 -0
  196. package/dist/__tests__/utils/runtimeLogger.test.js +200 -0
  197. package/dist/__tests__/utils/runtimeLogger.test.js.map +1 -0
  198. package/dist/__tests__/utils/spinner.test.js +31 -0
  199. package/dist/__tests__/utils/spinner.test.js.map +1 -0
  200. package/dist/__tests__/utils/verifyFocusPreference.test.js +41 -0
  201. package/dist/__tests__/utils/verifyFocusPreference.test.js.map +1 -0
  202. package/dist/agent/actions/index.js +301 -0
  203. package/dist/agent/actions/index.js.map +1 -0
  204. package/dist/agent/actions/normalize.js +360 -0
  205. package/dist/agent/actions/normalize.js.map +1 -0
  206. package/dist/agent/actions/schemas.js +129 -0
  207. package/dist/agent/actions/schemas.js.map +1 -0
  208. package/dist/agent/evidence/index.js +320 -0
  209. package/dist/agent/evidence/index.js.map +1 -0
  210. package/dist/agent/feedback/index.js +187 -0
  211. package/dist/agent/feedback/index.js.map +1 -0
  212. package/dist/agent/finalization/index.js +35 -0
  213. package/dist/agent/finalization/index.js.map +1 -0
  214. package/dist/agent/index.js +126 -0
  215. package/dist/agent/index.js.map +1 -0
  216. package/dist/agent/logging/index.js +350 -0
  217. package/dist/agent/logging/index.js.map +1 -0
  218. package/dist/agent/persistence/boot.js +58 -0
  219. package/dist/agent/persistence/boot.js.map +1 -0
  220. package/dist/agent/persistence/currentTask.js +36 -0
  221. package/dist/agent/persistence/currentTask.js.map +1 -0
  222. package/dist/agent/persistence/hydrate.js +42 -0
  223. package/dist/agent/persistence/hydrate.js.map +1 -0
  224. package/dist/agent/persistence/index.js +15 -0
  225. package/dist/agent/persistence/index.js.map +1 -0
  226. package/dist/agent/persistence/snapshots.js +97 -0
  227. package/dist/agent/persistence/snapshots.js.map +1 -0
  228. package/dist/agent/persistence/steps.js +95 -0
  229. package/dist/agent/persistence/steps.js.map +1 -0
  230. package/dist/agent/persistence/tasks.js +195 -0
  231. package/dist/agent/persistence/tasks.js.map +1 -0
  232. package/dist/agent/persistence/turns.js +92 -0
  233. package/dist/agent/persistence/turns.js.map +1 -0
  234. package/dist/agent/policy/ambiguityResolution.js +226 -0
  235. package/dist/agent/policy/ambiguityResolution.js.map +1 -0
  236. package/dist/agent/policy/contracts.js +2 -0
  237. package/dist/agent/policy/contracts.js.map +1 -0
  238. package/dist/agent/policy/coveragePolicy.js +309 -0
  239. package/dist/agent/policy/coveragePolicy.js.map +1 -0
  240. package/dist/agent/policy/endDecisionPolicy.js +31 -0
  241. package/dist/agent/policy/endDecisionPolicy.js.map +1 -0
  242. package/dist/agent/policy/index.js +344 -0
  243. package/dist/agent/policy/index.js.map +1 -0
  244. package/dist/agent/policy/loopReview.js +778 -0
  245. package/dist/agent/policy/loopReview.js.map +1 -0
  246. package/dist/agent/policy/readinessPolicy.js +108 -0
  247. package/dist/agent/policy/readinessPolicy.js.map +1 -0
  248. package/dist/agent/policy/resolutionPipeline.js +356 -0
  249. package/dist/agent/policy/resolutionPipeline.js.map +1 -0
  250. package/dist/agent/policy/targetClassification.js +33 -0
  251. package/dist/agent/policy/targetClassification.js.map +1 -0
  252. package/dist/agent/prompting/actionChoice.js +90 -0
  253. package/dist/agent/prompting/actionChoice.js.map +1 -0
  254. package/dist/agent/prompting/finalAnswer.js +38 -0
  255. package/dist/agent/prompting/finalAnswer.js.map +1 -0
  256. package/dist/agent/prompting/index.js +14 -0
  257. package/dist/agent/prompting/index.js.map +1 -0
  258. package/dist/agent/prompting/plan.js +59 -0
  259. package/dist/agent/prompting/plan.js.map +1 -0
  260. package/dist/agent/prompting/transform.js +175 -0
  261. package/dist/agent/prompting/transform.js.map +1 -0
  262. package/dist/agent/prompting/understand.js +70 -0
  263. package/dist/agent/prompting/understand.js.map +1 -0
  264. package/dist/agent/read/freshness.js +29 -0
  265. package/dist/agent/read/freshness.js.map +1 -0
  266. package/dist/agent/read/fullReadPrompt.js +43 -0
  267. package/dist/agent/read/fullReadPrompt.js.map +1 -0
  268. package/dist/agent/read/index.js +140 -0
  269. package/dist/agent/read/index.js.map +1 -0
  270. package/dist/agent/read/persistence.js +88 -0
  271. package/dist/agent/read/persistence.js.map +1 -0
  272. package/dist/agent/read/summarizeReadEvidence.js +733 -0
  273. package/dist/agent/read/summarizeReadEvidence.js.map +1 -0
  274. package/dist/agent/read/targetResolution.js +126 -0
  275. package/dist/agent/read/targetResolution.js.map +1 -0
  276. package/dist/agent/resume/checkpoint.js +41 -0
  277. package/dist/agent/resume/checkpoint.js.map +1 -0
  278. package/dist/agent/runtime/lifecycle.js +67 -0
  279. package/dist/agent/runtime/lifecycle.js.map +1 -0
  280. package/dist/agent/runtime/progress.js +178 -0
  281. package/dist/agent/runtime/progress.js.map +1 -0
  282. package/dist/agent/runtime/runAgentLoop.js +402 -0
  283. package/dist/agent/runtime/runAgentLoop.js.map +1 -0
  284. package/dist/agent/runtime/runAgentPlanOnly.js +127 -0
  285. package/dist/agent/runtime/runAgentPlanOnly.js.map +1 -0
  286. package/dist/agent/runtime/understand.js +336 -0
  287. package/dist/agent/runtime/understand.js.map +1 -0
  288. package/dist/agent/search/batchPlanner.js +274 -0
  289. package/dist/agent/search/batchPlanner.js.map +1 -0
  290. package/dist/agent/search/candidateRetentionPolicy.js +184 -0
  291. package/dist/agent/search/candidateRetentionPolicy.js.map +1 -0
  292. package/dist/agent/search/directory.js +51 -0
  293. package/dist/agent/search/directory.js.map +1 -0
  294. package/dist/agent/search/exactTarget.js +151 -0
  295. package/dist/agent/search/exactTarget.js.map +1 -0
  296. package/dist/agent/search/fragment.js +110 -0
  297. package/dist/agent/search/fragment.js.map +1 -0
  298. package/dist/agent/search/index.js +166 -0
  299. package/dist/agent/search/index.js.map +1 -0
  300. package/dist/agent/search/laneClassifier.js +119 -0
  301. package/dist/agent/search/laneClassifier.js.map +1 -0
  302. package/dist/agent/search/limits.js +10 -0
  303. package/dist/agent/search/limits.js.map +1 -0
  304. package/dist/agent/search/ranking.js +22 -0
  305. package/dist/agent/search/ranking.js.map +1 -0
  306. package/dist/agent/search/regex.js +83 -0
  307. package/dist/agent/search/regex.js.map +1 -0
  308. package/dist/agent/search/routePolicy.js +11 -0
  309. package/dist/agent/search/routePolicy.js.map +1 -0
  310. package/dist/agent/search/searchContext.js +128 -0
  311. package/dist/agent/search/searchContext.js.map +1 -0
  312. package/dist/agent/search/semantic.js +113 -0
  313. package/dist/agent/search/semantic.js.map +1 -0
  314. package/dist/agent/search/semanticIndexSearch.js +202 -0
  315. package/dist/agent/search/semanticIndexSearch.js.map +1 -0
  316. package/dist/agent/search/shared.js +283 -0
  317. package/dist/agent/search/shared.js.map +1 -0
  318. package/dist/agent/search/shell.js +202 -0
  319. package/dist/agent/search/shell.js.map +1 -0
  320. package/dist/agent/search/snippetEvidence.js +57 -0
  321. package/dist/agent/search/snippetEvidence.js.map +1 -0
  322. package/dist/agent/search/types.js +2 -0
  323. package/dist/agent/search/types.js.map +1 -0
  324. package/dist/agent/state/index.js +99 -0
  325. package/dist/agent/state/index.js.map +1 -0
  326. package/dist/agent/state/memory.js +56 -0
  327. package/dist/agent/state/memory.js.map +1 -0
  328. package/dist/agent/structuredOutput/index.js +28 -0
  329. package/dist/agent/structuredOutput/index.js.map +1 -0
  330. package/dist/agent/tools/index.js +199 -0
  331. package/dist/agent/tools/index.js.map +1 -0
  332. package/dist/agent/transform/index.js +519 -0
  333. package/dist/agent/transform/index.js.map +1 -0
  334. package/dist/agent/transform/syntax.js +49 -0
  335. package/dist/agent/transform/syntax.js.map +1 -0
  336. package/dist/agent/types.js +20 -0
  337. package/dist/agent/types.js.map +1 -0
  338. package/dist/agents/actionRegistry.js +114 -0
  339. package/dist/agents/actionRegistry.js.map +1 -0
  340. package/dist/agents/agent.js +5 -0
  341. package/dist/agents/agent.js.map +1 -0
  342. package/dist/agents/agentActions.js +5 -0
  343. package/dist/agents/agentActions.js.map +1 -0
  344. package/dist/agents/agentEvidence.js +5 -0
  345. package/dist/agents/agentEvidence.js.map +1 -0
  346. package/dist/agents/agentFeedback.js +5 -0
  347. package/dist/agents/agentFeedback.js.map +1 -0
  348. package/dist/agents/agentLogging.js +5 -0
  349. package/dist/agents/agentLogging.js.map +1 -0
  350. package/dist/agents/agentLoop.js +5 -0
  351. package/dist/agents/agentLoop.js.map +1 -0
  352. package/dist/agents/agentMemory.js +5 -0
  353. package/dist/agents/agentMemory.js.map +1 -0
  354. package/dist/agents/agentPlanMode.js +5 -0
  355. package/dist/agents/agentPlanMode.js.map +1 -0
  356. package/dist/agents/agentPolicyState.js +5 -0
  357. package/dist/agents/agentPolicyState.js.map +1 -0
  358. package/dist/agents/agentProgress.js +93 -0
  359. package/dist/agents/agentProgress.js.map +1 -0
  360. package/dist/agents/agentSchemas.js +5 -0
  361. package/dist/agents/agentSchemas.js.map +1 -0
  362. package/dist/agents/agentSearchScoring.js +5 -0
  363. package/dist/agents/agentSearchScoring.js.map +1 -0
  364. package/dist/agents/agentStateMachine.js +5 -0
  365. package/dist/agents/agentStateMachine.js.map +1 -0
  366. package/dist/agents/agentTools.js +5 -0
  367. package/dist/agents/agentTools.js.map +1 -0
  368. package/dist/agents/agentTypes.js +5 -0
  369. package/dist/agents/agentTypes.js.map +1 -0
  370. package/dist/agents/agentUnderstand.js +5 -0
  371. package/dist/agents/agentUnderstand.js.map +1 -0
  372. package/dist/agents/analysisPlanGenStep.js +194 -17
  373. package/dist/agents/analysisPlanGenStep.js.map +1 -0
  374. package/dist/agents/answerOnlyCompletion.js +32 -0
  375. package/dist/agents/answerOnlyCompletion.js.map +1 -0
  376. package/dist/agents/collaboratorStep.js +1 -0
  377. package/dist/agents/collaboratorStep.js.map +1 -0
  378. package/dist/agents/decideNextAction.js +444 -0
  379. package/dist/agents/decideNextAction.js.map +1 -0
  380. package/dist/agents/deriveFocusFromSearchStep.js +83 -0
  381. package/dist/agents/deriveFocusFromSearchStep.js.map +1 -0
  382. package/dist/agents/evidenceVerifierStep.js +104 -13
  383. package/dist/agents/evidenceVerifierStep.js.map +1 -0
  384. package/dist/agents/fileCheckStep.js +381 -12
  385. package/dist/agents/fileCheckStep.js.map +1 -0
  386. package/dist/agents/giveUpEvaluatorStep.js +63 -0
  387. package/dist/agents/giveUpEvaluatorStep.js.map +1 -0
  388. package/dist/agents/guardPolicy.js +20 -0
  389. package/dist/agents/guardPolicy.js.map +1 -0
  390. package/dist/agents/guards/executionPolicyResolver.js +165 -0
  391. package/dist/agents/guards/executionPolicyResolver.js.map +1 -0
  392. package/dist/agents/guards/guardState.js +195 -0
  393. package/dist/agents/guards/guardState.js.map +1 -0
  394. package/dist/agents/guards/resolveProgressState.js +403 -0
  395. package/dist/agents/guards/resolveProgressState.js.map +1 -0
  396. package/dist/agents/infoPlanGenStep.js +66 -8
  397. package/dist/agents/infoPlanGenStep.js.map +1 -0
  398. package/dist/agents/integrateFeedbackStep.js +1 -0
  399. package/dist/agents/integrateFeedbackStep.js.map +1 -0
  400. package/dist/agents/iterationFileSelector.js +8 -7
  401. package/dist/agents/iterationFileSelector.js.map +1 -0
  402. package/dist/agents/mainAgentActivityLog.js +85 -0
  403. package/dist/agents/mainAgentActivityLog.js.map +1 -0
  404. package/dist/agents/mainAgentHeuristics.js +173 -0
  405. package/dist/agents/mainAgentHeuristics.js.map +1 -0
  406. package/dist/agents/mainAgentVerify.js +159 -0
  407. package/dist/agents/mainAgentVerify.js.map +1 -0
  408. package/dist/agents/objectiveEvaluatorStep.js +103 -0
  409. package/dist/agents/objectiveEvaluatorStep.js.map +1 -0
  410. package/dist/agents/outerLoopRecoveryEvaluator.js +108 -0
  411. package/dist/agents/outerLoopRecoveryEvaluator.js.map +1 -0
  412. package/dist/agents/readinessGateStep.js +95 -9
  413. package/dist/agents/readinessGateStep.js.map +1 -0
  414. package/dist/agents/reasonNextStep.js +9 -8
  415. package/dist/agents/reasonNextStep.js.map +1 -0
  416. package/dist/agents/reasonNextTaskStep.js +267 -144
  417. package/dist/agents/reasonNextTaskStep.js.map +1 -0
  418. package/dist/agents/researchPlanGenStep.js +61 -25
  419. package/dist/agents/researchPlanGenStep.js.map +1 -0
  420. package/dist/agents/resolveAgentTargetClassification.js +5 -0
  421. package/dist/agents/resolveAgentTargetClassification.js.map +1 -0
  422. package/dist/agents/resolveExecutionModeStep.js +1 -0
  423. package/dist/agents/resolveExecutionModeStep.js.map +1 -0
  424. package/dist/agents/resolveExplicitTargetsStep.js +74 -0
  425. package/dist/agents/resolveExplicitTargetsStep.js.map +1 -0
  426. package/dist/agents/routingDecisionStep.js +58 -11
  427. package/dist/agents/routingDecisionStep.js.map +1 -0
  428. package/dist/agents/scopeClassificationStep.js +66 -3
  429. package/dist/agents/scopeClassificationStep.js.map +1 -0
  430. package/dist/agents/selectRelevantSourcesStep.js +13 -5
  431. package/dist/agents/selectRelevantSourcesStep.js.map +1 -0
  432. package/dist/agents/structuralPreloadStep.js +3 -4
  433. package/dist/agents/structuralPreloadStep.js.map +1 -0
  434. package/dist/agents/transformPlanGenStep.js +105 -18
  435. package/dist/agents/transformPlanGenStep.js.map +1 -0
  436. package/dist/agents/understandIntentStep.js +237 -17
  437. package/dist/agents/understandIntentStep.js.map +1 -0
  438. package/dist/agents/validateChangesStep.js +16 -2
  439. package/dist/agents/validateChangesStep.js.map +1 -0
  440. package/dist/agents/writeFileStep.js +1 -0
  441. package/dist/agents/writeFileStep.js.map +1 -0
  442. package/dist/commands/AskCmd.js +139 -44
  443. package/dist/commands/AskCmd.js.map +1 -0
  444. package/dist/commands/BackupCmd.js +1 -0
  445. package/dist/commands/BackupCmd.js.map +1 -0
  446. package/dist/commands/ChangeLogUpdateCmd.js +1 -0
  447. package/dist/commands/ChangeLogUpdateCmd.js.map +1 -0
  448. package/dist/commands/CommitSuggesterCmd.js +55 -13
  449. package/dist/commands/CommitSuggesterCmd.js.map +1 -0
  450. package/dist/commands/DaemonCmd.js +52 -14
  451. package/dist/commands/DaemonCmd.js.map +1 -0
  452. package/dist/commands/DeleteIndex.js +1 -0
  453. package/dist/commands/DeleteIndex.js.map +1 -0
  454. package/dist/commands/EvalReportCmd.js +374 -0
  455. package/dist/commands/EvalReportCmd.js.map +1 -0
  456. package/dist/commands/FindCmd.js +1 -0
  457. package/dist/commands/FindCmd.js.map +1 -0
  458. package/dist/commands/GitCmd.js +1 -0
  459. package/dist/commands/GitCmd.js.map +1 -0
  460. package/dist/commands/IndexCmd.js +11 -79
  461. package/dist/commands/IndexCmd.js.map +1 -0
  462. package/dist/commands/InspectCmd.js +1 -0
  463. package/dist/commands/InspectCmd.js.map +1 -0
  464. package/dist/commands/ModelCmd.js +24 -0
  465. package/dist/commands/ModelCmd.js.map +1 -0
  466. package/dist/commands/ReadlineSingleton.js +1 -0
  467. package/dist/commands/ReadlineSingleton.js.map +1 -0
  468. package/dist/commands/ResetDbCmd.js +18 -1
  469. package/dist/commands/ResetDbCmd.js.map +1 -0
  470. package/dist/commands/ReviewCmd.js +1 -0
  471. package/dist/commands/ReviewCmd.js.map +1 -0
  472. package/dist/commands/StatusCmd.js +22 -0
  473. package/dist/commands/StatusCmd.js.map +1 -0
  474. package/dist/commands/StopDaemonCmd.js +1 -0
  475. package/dist/commands/StopDaemonCmd.js.map +1 -0
  476. package/dist/commands/SummaryCmd.js +1 -0
  477. package/dist/commands/SummaryCmd.js.map +1 -0
  478. package/dist/commands/SwitchCmd.js +9 -15
  479. package/dist/commands/SwitchCmd.js.map +1 -0
  480. package/dist/commands/TasksCmd.js +142 -57
  481. package/dist/commands/TasksCmd.js.map +1 -0
  482. package/dist/commands/TestCmd.js +66 -0
  483. package/dist/commands/TestCmd.js.map +1 -0
  484. package/dist/commands/WorkflowCmd.js +1 -0
  485. package/dist/commands/WorkflowCmd.js.map +1 -0
  486. package/dist/commands/commandVisibility.js +27 -0
  487. package/dist/commands/commandVisibility.js.map +1 -0
  488. package/dist/commands/evalCommands.js +1337 -0
  489. package/dist/commands/evalCommands.js.map +1 -0
  490. package/dist/commands/factory.js +206 -38
  491. package/dist/commands/factory.js.map +1 -0
  492. package/dist/config.js +62 -11
  493. package/dist/config.js.map +1 -0
  494. package/dist/constants.js +21 -3
  495. package/dist/constants.js.map +1 -0
  496. package/dist/context.js +33 -32
  497. package/dist/context.js.map +1 -0
  498. package/dist/daemon/daemonQueues.js +1 -20
  499. package/dist/daemon/daemonQueues.js.map +1 -0
  500. package/dist/daemon/daemonWorker.js +26 -37
  501. package/dist/daemon/daemonWorker.js.map +1 -0
  502. package/dist/daemon/generateSummaries.js +1 -0
  503. package/dist/daemon/generateSummaries.js.map +1 -0
  504. package/dist/daemon/runFolderCapsuleBatch.js +1 -0
  505. package/dist/daemon/runFolderCapsuleBatch.js.map +1 -0
  506. package/dist/daemon/runIndexingBatch.js +1 -0
  507. package/dist/daemon/runIndexingBatch.js.map +1 -0
  508. package/dist/daemon/runKgBatch.js +9 -1
  509. package/dist/daemon/runKgBatch.js.map +1 -0
  510. package/dist/db/backup.js +1 -0
  511. package/dist/db/backup.js.map +1 -0
  512. package/dist/db/client.js +18 -3
  513. package/dist/db/client.js.map +1 -0
  514. package/dist/db/fileIndex.js +110 -152
  515. package/dist/db/fileIndex.js.map +1 -0
  516. package/dist/db/functionExtractors/extractFromJava.js +1 -0
  517. package/dist/db/functionExtractors/extractFromJava.js.map +1 -0
  518. package/dist/db/functionExtractors/extractFromJs.js +1 -0
  519. package/dist/db/functionExtractors/extractFromJs.js.map +1 -0
  520. package/dist/db/functionExtractors/extractFromTs.js +1 -0
  521. package/dist/db/functionExtractors/extractFromTs.js.map +1 -0
  522. package/dist/db/functionExtractors/extractFromXML.js +1 -0
  523. package/dist/db/functionExtractors/extractFromXML.js.map +1 -0
  524. package/dist/db/functionExtractors/index.js +1 -0
  525. package/dist/db/functionExtractors/index.js.map +1 -0
  526. package/dist/db/functionIndex.js +9 -0
  527. package/dist/db/functionIndex.js.map +1 -0
  528. package/dist/db/schema.js +314 -99
  529. package/dist/db/schema.js.map +1 -0
  530. package/dist/db/sqlTemplates.js +1 -0
  531. package/dist/db/sqlTemplates.js.map +1 -0
  532. package/dist/fileRules/builtins.js +1 -0
  533. package/dist/fileRules/builtins.js.map +1 -0
  534. package/dist/fileRules/classifyFile.js +1 -0
  535. package/dist/fileRules/classifyFile.js.map +1 -0
  536. package/dist/fileRules/codeAllowedExtensions.js +1 -0
  537. package/dist/fileRules/codeAllowedExtensions.js.map +1 -0
  538. package/dist/fileRules/detectFileType.js +1 -0
  539. package/dist/fileRules/detectFileType.js.map +1 -0
  540. package/dist/fileRules/fileClassifier.js +1 -0
  541. package/dist/fileRules/fileClassifier.js.map +1 -0
  542. package/dist/fileRules/fileExceptions.js +1 -0
  543. package/dist/fileRules/fileExceptions.js.map +1 -0
  544. package/dist/fileRules/ignoredExtensions.js +1 -0
  545. package/dist/fileRules/ignoredExtensions.js.map +1 -0
  546. package/dist/fileRules/ignoredPaths.js +48 -5
  547. package/dist/fileRules/ignoredPaths.js.map +1 -0
  548. package/dist/fileRules/queryTokenRules.js +176 -0
  549. package/dist/fileRules/queryTokenRules.js.map +1 -0
  550. package/dist/fileRules/searchPathClassification.js +58 -0
  551. package/dist/fileRules/searchPathClassification.js.map +1 -0
  552. package/dist/fileRules/shouldIgnoreFiles.js +1 -0
  553. package/dist/fileRules/shouldIgnoreFiles.js.map +1 -0
  554. package/dist/fileRules/stopWords.js +9 -0
  555. package/dist/fileRules/stopWords.js.map +1 -0
  556. package/dist/fileRules/wellKnownRepoFiles.js +1 -0
  557. package/dist/fileRules/wellKnownRepoFiles.js.map +1 -0
  558. package/dist/git/commitSummary.js +227 -0
  559. package/dist/git/commitSummary.js.map +1 -0
  560. package/dist/github/api.js +1 -0
  561. package/dist/github/api.js.map +1 -0
  562. package/dist/github/auth.js +1 -0
  563. package/dist/github/auth.js.map +1 -0
  564. package/dist/github/github.js +1 -0
  565. package/dist/github/github.js.map +1 -0
  566. package/dist/github/githubAuthCheck.js +1 -0
  567. package/dist/github/githubAuthCheck.js.map +1 -0
  568. package/dist/github/postComments.js +1 -0
  569. package/dist/github/postComments.js.map +1 -0
  570. package/dist/github/repo.js +15 -24
  571. package/dist/github/repo.js.map +1 -0
  572. package/dist/github/token.js +1 -0
  573. package/dist/github/token.js.map +1 -0
  574. package/dist/github/types.js +1 -0
  575. package/dist/github/types.js.map +1 -0
  576. package/dist/index.js +318 -37
  577. package/dist/index.js.map +1 -0
  578. package/dist/lib/generate.js +264 -20
  579. package/dist/lib/generate.js.map +1 -0
  580. package/dist/lib/generateFolderCapsules.js +1 -0
  581. package/dist/lib/generateFolderCapsules.js.map +1 -0
  582. package/dist/lib/ollamaModelPolicy.js +59 -0
  583. package/dist/lib/ollamaModelPolicy.js.map +1 -0
  584. package/dist/lib/spinner.js +29 -9
  585. package/dist/lib/spinner.js.map +1 -0
  586. package/dist/modelSetup.js +25 -78
  587. package/dist/modelSetup.js.map +1 -0
  588. package/dist/pipeline/modules/changeLogModule.js +10 -1
  589. package/dist/pipeline/modules/changeLogModule.js.map +1 -0
  590. package/dist/pipeline/modules/cleanupModule.js +1 -0
  591. package/dist/pipeline/modules/cleanupModule.js.map +1 -0
  592. package/dist/pipeline/modules/codeTransformModule.js +10 -16
  593. package/dist/pipeline/modules/codeTransformModule.js.map +1 -0
  594. package/dist/pipeline/modules/commentModule.js +12 -0
  595. package/dist/pipeline/modules/commentModule.js.map +1 -0
  596. package/dist/pipeline/modules/commitSuggesterModule.js +82 -12
  597. package/dist/pipeline/modules/commitSuggesterModule.js.map +1 -0
  598. package/dist/pipeline/modules/contextReviewModule.js +12 -1
  599. package/dist/pipeline/modules/contextReviewModule.js.map +1 -0
  600. package/dist/pipeline/modules/dialogAnswerModule.js +58 -0
  601. package/dist/pipeline/modules/dialogAnswerModule.js.map +1 -0
  602. package/dist/pipeline/modules/fileSearchModule.js +5 -143
  603. package/dist/pipeline/modules/fileSearchModule.js.map +1 -0
  604. package/dist/pipeline/modules/finalAnswerModule.js +1176 -151
  605. package/dist/pipeline/modules/finalAnswerModule.js.map +1 -0
  606. package/dist/pipeline/modules/kgModule.js +18 -1
  607. package/dist/pipeline/modules/kgModule.js.map +1 -0
  608. package/dist/pipeline/modules/planAnswerModule.js +99 -0
  609. package/dist/pipeline/modules/planAnswerModule.js.map +1 -0
  610. package/dist/pipeline/modules/readFileModule.js +300 -0
  611. package/dist/pipeline/modules/readFileModule.js.map +1 -0
  612. package/dist/pipeline/modules/reviewModule.js +10 -1
  613. package/dist/pipeline/modules/reviewModule.js.map +1 -0
  614. package/dist/pipeline/modules/searchDbModule.js +159 -0
  615. package/dist/pipeline/modules/searchDbModule.js.map +1 -0
  616. package/dist/pipeline/modules/searchListDirectoryModule.js +62 -0
  617. package/dist/pipeline/modules/searchListDirectoryModule.js.map +1 -0
  618. package/dist/pipeline/modules/searchModuleShared.js +71 -0
  619. package/dist/pipeline/modules/searchModuleShared.js.map +1 -0
  620. package/dist/pipeline/modules/searchRegexModule.js +59 -0
  621. package/dist/pipeline/modules/searchRegexModule.js.map +1 -0
  622. package/dist/pipeline/modules/semanticAnalysisModule.js +185 -28
  623. package/dist/pipeline/modules/semanticAnalysisModule.js.map +1 -0
  624. package/dist/pipeline/modules/summaryModule.js +11 -1
  625. package/dist/pipeline/modules/summaryModule.js.map +1 -0
  626. package/dist/pipeline/registry/moduleRegistry.js +9 -0
  627. package/dist/pipeline/registry/moduleRegistry.js.map +1 -0
  628. package/dist/pipeline/runModulePipeline.js +1 -0
  629. package/dist/pipeline/runModulePipeline.js.map +1 -0
  630. package/dist/scripts/dbScriptSupport.js +172 -0
  631. package/dist/scripts/dbScriptSupport.js.map +1 -0
  632. package/dist/scripts/dbcheck.js +173 -267
  633. package/dist/scripts/dbcheck.js.map +1 -0
  634. package/dist/scripts/dboverview.js +161 -0
  635. package/dist/scripts/dboverview.js.map +1 -0
  636. package/dist/scripts/migrateDb.js +1 -0
  637. package/dist/scripts/migrateDb.js.map +1 -0
  638. package/dist/search/SearchOrchestrator.js +928 -0
  639. package/dist/search/SearchOrchestrator.js.map +1 -0
  640. package/dist/search/sharedRankingPolicy.js +283 -0
  641. package/dist/search/sharedRankingPolicy.js.map +1 -0
  642. package/dist/setup/reindexOwner.js +97 -0
  643. package/dist/setup/reindexOwner.js.map +1 -0
  644. package/dist/setup/setupOwner.js +100 -0
  645. package/dist/setup/setupOwner.js.map +1 -0
  646. package/dist/shell/dialogUi.js +81 -0
  647. package/dist/shell/dialogUi.js.map +1 -0
  648. package/dist/shellSession.js +126 -0
  649. package/dist/shellSession.js.map +1 -0
  650. package/dist/status/statusOwner.js +239 -0
  651. package/dist/status/statusOwner.js.map +1 -0
  652. package/dist/testing/contextEval.js +514 -0
  653. package/dist/testing/contextEval.js.map +1 -0
  654. package/dist/testing/fixtures/transform/small-file.input.js +5 -0
  655. package/dist/testing/fixtures/transform/small-file.input.js.map +1 -0
  656. package/dist/testing/harnessArtifacts.js +112 -0
  657. package/dist/testing/harnessArtifacts.js.map +1 -0
  658. package/dist/testing/llmTraceSession.js +67 -0
  659. package/dist/testing/llmTraceSession.js.map +1 -0
  660. package/dist/testing/registerDevCliCommands.js +43 -0
  661. package/dist/testing/registerDevCliCommands.js.map +1 -0
  662. package/dist/testing/runDiagnosis.js +248 -0
  663. package/dist/testing/runDiagnosis.js.map +1 -0
  664. package/dist/testing/runtimeLogReader.js +144 -0
  665. package/dist/testing/runtimeLogReader.js.map +1 -0
  666. package/dist/testing/testCommands.js +35 -303
  667. package/dist/testing/testCommands.js.map +1 -0
  668. package/dist/testing/testRegistry.js +233 -0
  669. package/dist/testing/testRegistry.js.map +1 -0
  670. package/dist/types.js +1 -0
  671. package/dist/types.js.map +1 -0
  672. package/dist/utils/buildContextualPrompt.js +26 -75
  673. package/dist/utils/buildContextualPrompt.js.map +1 -0
  674. package/dist/utils/changeLogPrompt.js +1 -0
  675. package/dist/utils/changeLogPrompt.js.map +1 -0
  676. package/dist/utils/checkModel.js +17 -92
  677. package/dist/utils/checkModel.js.map +1 -0
  678. package/dist/utils/commentMap.js +1 -0
  679. package/dist/utils/commentMap.js.map +1 -0
  680. package/dist/utils/compileSearchQuery.js +23 -9
  681. package/dist/utils/compileSearchQuery.js.map +1 -0
  682. package/dist/utils/consolePresentation.js +208 -0
  683. package/dist/utils/consolePresentation.js.map +1 -0
  684. package/dist/utils/contentUtils.js +17 -2
  685. package/dist/utils/contentUtils.js.map +1 -0
  686. package/dist/utils/debugContext.js +1 -0
  687. package/dist/utils/debugContext.js.map +1 -0
  688. package/dist/utils/dialogState.js +201 -0
  689. package/dist/utils/dialogState.js.map +1 -0
  690. package/dist/utils/editor.js +1 -0
  691. package/dist/utils/editor.js.map +1 -0
  692. package/dist/utils/executionEvidence.js +50 -0
  693. package/dist/utils/executionEvidence.js.map +1 -0
  694. package/dist/utils/extractFileReferences.js +140 -6
  695. package/dist/utils/extractFileReferences.js.map +1 -0
  696. package/dist/utils/fileEvidenceCache.js +50 -0
  697. package/dist/utils/fileEvidenceCache.js.map +1 -0
  698. package/dist/utils/fileTree.js +1 -0
  699. package/dist/utils/fileTree.js.map +1 -0
  700. package/dist/utils/loadRelevantFolderCapsules.js +35 -5
  701. package/dist/utils/loadRelevantFolderCapsules.js.map +1 -0
  702. package/dist/utils/log.js +10 -1
  703. package/dist/utils/log.js.map +1 -0
  704. package/dist/utils/normalizeData.js +1 -0
  705. package/dist/utils/normalizeData.js.map +1 -0
  706. package/dist/utils/ollamaModelStatus.js +28 -0
  707. package/dist/utils/ollamaModelStatus.js.map +1 -0
  708. package/dist/utils/ollamaService.js +294 -0
  709. package/dist/utils/ollamaService.js.map +1 -0
  710. package/dist/utils/outputFormatter.js +1 -0
  711. package/dist/utils/outputFormatter.js.map +1 -0
  712. package/dist/utils/parseTaggedContent.js +1 -0
  713. package/dist/utils/parseTaggedContent.js.map +1 -0
  714. package/dist/utils/planActions.js +27 -46
  715. package/dist/utils/planActions.js.map +1 -0
  716. package/dist/utils/promptBuilderHelper.js +1 -0
  717. package/dist/utils/promptBuilderHelper.js.map +1 -0
  718. package/dist/utils/promptLogHelper.js +29 -13
  719. package/dist/utils/promptLogHelper.js.map +1 -0
  720. package/dist/utils/queryAnchors.js +71 -0
  721. package/dist/utils/queryAnchors.js.map +1 -0
  722. package/dist/utils/repoIdentity.js +82 -0
  723. package/dist/utils/repoIdentity.js.map +1 -0
  724. package/dist/utils/repoKey.js +1 -0
  725. package/dist/utils/repoKey.js.map +1 -0
  726. package/dist/utils/resolveTargetsToFiles.js +1 -0
  727. package/dist/utils/resolveTargetsToFiles.js.map +1 -0
  728. package/dist/utils/resumeContext.js +219 -0
  729. package/dist/utils/resumeContext.js.map +1 -0
  730. package/dist/utils/resumeState.js +310 -0
  731. package/dist/utils/resumeState.js.map +1 -0
  732. package/dist/utils/rollingPlan.js +118 -0
  733. package/dist/utils/rollingPlan.js.map +1 -0
  734. package/dist/utils/runQueryWithDaemonControl.js +11 -3
  735. package/dist/utils/runQueryWithDaemonControl.js.map +1 -0
  736. package/dist/utils/runtimeLogger.js +252 -0
  737. package/dist/utils/runtimeLogger.js.map +1 -0
  738. package/dist/utils/sanitizeQuery.js +1 -0
  739. package/dist/utils/sanitizeQuery.js.map +1 -0
  740. package/dist/utils/sharedUtils.js +1 -0
  741. package/dist/utils/sharedUtils.js.map +1 -0
  742. package/dist/utils/sleep.js +1 -0
  743. package/dist/utils/sleep.js.map +1 -0
  744. package/dist/utils/splitCodeIntoChunk.js +1 -0
  745. package/dist/utils/splitCodeIntoChunk.js.map +1 -0
  746. package/dist/utils/time.js +66 -0
  747. package/dist/utils/time.js.map +1 -0
  748. package/dist/utils/verifyFocusPreference.js +107 -0
  749. package/dist/utils/verifyFocusPreference.js.map +1 -0
  750. package/dist/utils/vscode.js +1 -0
  751. package/dist/utils/vscode.js.map +1 -0
  752. package/dist/workflow/workflowResolver.js +1 -0
  753. package/dist/workflow/workflowResolver.js.map +1 -0
  754. package/dist/workflow/workflowRunner.js +1 -0
  755. package/dist/workflow/workflowRunner.js.map +1 -0
  756. package/package.json +3 -3
  757. package/dist/agents/MainAgent.js +0 -1886
  758. package/dist/agents/contextReviewStep.js +0 -101
  759. package/dist/agents/finalPlanGenStep.js +0 -107
  760. package/dist/agents/structuralAnalysisStep.js +0 -46
  761. package/dist/agents/validationAnalysisStep.js +0 -87
  762. package/dist/pipeline/modules/chunkManagerModule.js +0 -24
  763. package/dist/pipeline/modules/cleanGeneratedTestsModule.js +0 -33
  764. package/dist/pipeline/modules/fileReaderModule.js +0 -72
  765. package/dist/pipeline/modules/gatherInfoModule.js +0 -181
  766. package/dist/pipeline/modules/generateTestsModule.js +0 -68
  767. package/dist/pipeline/modules/preserveCodeModule.js +0 -195
  768. package/dist/pipeline/modules/refactorModule.js +0 -40
  769. package/dist/pipeline/modules/repairTestsModule.js +0 -48
  770. package/dist/pipeline/modules/runTestsModule.js +0 -37
@@ -1,5 +1,24 @@
1
- // File: lib/generate.ts
1
+ /**
2
+ * Sends one model request through Ollama and, when enabled, saves exact call inputs for integration review.
3
+ *
4
+ * Why this file exists:
5
+ * - all normal model calls go through one gateway
6
+ * - recovery and retry behavior should stay consistent across callers
7
+ * - integration tracing belongs here so callers only provide caller name and exact input context
8
+ */
2
9
  import { Config, readConfig } from '../config.js';
10
+ import { OLLAMA_CHAT_URL, OLLAMA_GENERATE_URL, probeOllamaHealth, restartOllamaServer, } from '../utils/ollamaService.js';
11
+ import { nowLocalIso, startTimer } from '../utils/time.js';
12
+ import { writeLlmTraceRecord } from '../testing/llmTraceSession.js';
13
+ import { getOllamaModelPolicy, } from './ollamaModelPolicy.js';
14
+ class OllamaRequestError extends Error {
15
+ constructor(message, options) {
16
+ super(message);
17
+ this.name = 'OllamaRequestError';
18
+ this.status = options?.status;
19
+ this.responseBody = options?.responseBody;
20
+ }
21
+ }
3
22
  /**
4
23
  * The generate module uses the local model API to produce output
5
24
  * based on the `content` of the input. It returns the response
@@ -7,7 +26,7 @@ import { Config, readConfig } from '../config.js';
7
26
  *
8
27
  * Assumes the model is already running. Does NOT attempt to start or restart it.
9
28
  */
10
- export async function generate(input) {
29
+ export async function generate(input, traceInput) {
11
30
  const model = Config.getModel();
12
31
  const { contextLength, maxOutputTokens } = readConfig();
13
32
  // Safely build prompt
@@ -16,39 +35,264 @@ export async function generate(input) {
16
35
  ? JSON.stringify(input.content, null, 2)
17
36
  : input.content || '';
18
37
  const prompt = `${queryPart}${contentPart}`.trim();
19
- const data = await doGenerate(prompt, model, contextLength, maxOutputTokens);
20
- return { query: input.query, data };
38
+ const policy = getOllamaModelPolicy(model);
39
+ const initialRequest = buildOllamaRequest({
40
+ model,
41
+ prompt,
42
+ contextLength,
43
+ maxOutputTokens,
44
+ policy,
45
+ transport: policy.transport,
46
+ });
47
+ const startedAt = nowLocalIso();
48
+ const stop = startTimer();
49
+ try {
50
+ const result = await doGenerate(prompt, model, contextLength, maxOutputTokens);
51
+ const timing = finalizeTiming(startedAt, stop, result.attemptCount);
52
+ const trace = writeGenerateTrace({
53
+ traceInput,
54
+ input,
55
+ model,
56
+ requestBody: result.requestBody,
57
+ prompt,
58
+ timing,
59
+ });
60
+ return { query: input.query, data: result.data, trace };
61
+ }
62
+ catch (err) {
63
+ const error = err instanceof Error ? err : new Error(String(err));
64
+ const tracedError = error;
65
+ const timing = finalizeTiming(startedAt, stop, inferAttemptCount(error));
66
+ const trace = writeGenerateTrace({
67
+ traceInput,
68
+ input,
69
+ model,
70
+ requestBody: tracedError.requestBody ?? initialRequest.body,
71
+ prompt,
72
+ timing,
73
+ errorMessage: error.message,
74
+ });
75
+ tracedError.trace = trace ?? timing;
76
+ throw tracedError;
77
+ }
21
78
  }
22
79
  async function doGenerate(prompt, model, contextLength, maxOutputTokens) {
23
80
  const REQUEST_TIMEOUT_MS = 270000;
81
+ const policy = getOllamaModelPolicy(model);
82
+ let activeRequest = buildOllamaRequest({
83
+ model,
84
+ prompt,
85
+ contextLength,
86
+ maxOutputTokens,
87
+ policy,
88
+ transport: policy.transport,
89
+ });
90
+ let attemptCount = 1;
91
+ try {
92
+ const data = await sendOllamaRequest(activeRequest, REQUEST_TIMEOUT_MS);
93
+ return { data, attemptCount, requestBody: activeRequest.body };
94
+ }
95
+ catch (err) {
96
+ if (shouldFallbackToGenerate(policy, activeRequest.transport, err)) {
97
+ activeRequest = buildOllamaRequest({
98
+ model,
99
+ prompt,
100
+ contextLength,
101
+ maxOutputTokens,
102
+ policy,
103
+ transport: 'generate',
104
+ });
105
+ try {
106
+ const data = await sendOllamaRequest(activeRequest, REQUEST_TIMEOUT_MS);
107
+ return { data, attemptCount, requestBody: activeRequest.body };
108
+ }
109
+ catch (fallbackErr) {
110
+ err = fallbackErr;
111
+ }
112
+ }
113
+ if (!isRecoverableGenerateError(err)) {
114
+ attachAttemptCount(err, attemptCount);
115
+ attachRequestBody(err, activeRequest.body);
116
+ throw err;
117
+ }
118
+ const health = await probeOllamaHealth();
119
+ if (health.status === 'unreachable') {
120
+ console.log('⚠️ Ollama is not running. SCAI is restarting the Ollama server and retrying once.');
121
+ }
122
+ else {
123
+ console.log('⚠️ Ollama is not responding. SCAI is restarting the Ollama server and retrying once.');
124
+ }
125
+ const restart = await restartOllamaServer();
126
+ if (!restart.restarted || !restart.ready) {
127
+ throw new Error(buildRecoveryFailureMessage(health.status, restart.health.detail, true));
128
+ }
129
+ console.log('✅ Ollama restarted. Retrying the model request once.');
130
+ attemptCount += 1;
131
+ try {
132
+ const data = await sendOllamaRequest(activeRequest, REQUEST_TIMEOUT_MS);
133
+ return { data, attemptCount, requestBody: activeRequest.body };
134
+ }
135
+ catch (retryErr) {
136
+ const error = new Error(buildRecoveryFailureMessage(classifyGenerateError(retryErr), retryErr?.message, false));
137
+ attachAttemptCount(error, attemptCount);
138
+ attachRequestBody(error, activeRequest.body);
139
+ throw error;
140
+ }
141
+ }
142
+ }
143
+ async function sendOllamaRequest(request, timeoutMs) {
24
144
  let res;
25
145
  try {
26
- res = await fetch('http://localhost:11434/api/generate', {
146
+ res = await fetch(request.url, {
27
147
  method: 'POST',
28
148
  headers: { 'Content-Type': 'application/json' },
29
- signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),
30
- body: JSON.stringify({
31
- model,
32
- prompt,
33
- stream: false,
34
- options: {
35
- // context window
36
- num_ctx: contextLength,
37
- // limit output to avoid exceeding context
38
- max_output_tokens: maxOutputTokens,
39
- },
40
- }),
149
+ signal: AbortSignal.timeout(timeoutMs),
150
+ body: JSON.stringify(request.body),
41
151
  });
42
152
  }
43
153
  catch (err) {
44
154
  if (err?.name === 'TimeoutError' || err?.name === 'AbortError') {
45
- throw new Error(`Model request timed out after ${REQUEST_TIMEOUT_MS}ms. Verify Ollama is responsive or retry with a smaller prompt.`);
155
+ throw new Error(`Model request timed out after ${timeoutMs}ms. Verify Ollama is responsive or retry with a smaller prompt.`);
46
156
  }
47
157
  throw err;
48
158
  }
49
159
  if (!res.ok) {
50
- throw new Error(`Model request failed with status ${res.status}`);
160
+ const responseBody = await safeReadResponseText(res);
161
+ throw new OllamaRequestError(`Model request failed with status ${res.status}`, {
162
+ status: res.status,
163
+ responseBody,
164
+ });
51
165
  }
52
166
  const data = await res.json();
53
- return data.response?.trim() ?? '';
167
+ return extractResponseText(data, request.transport);
168
+ }
169
+ function isRecoverableGenerateError(err) {
170
+ return classifyGenerateError(err) !== 'non_recoverable';
171
+ }
172
+ function classifyGenerateError(err) {
173
+ const message = typeof err?.message === 'string' ? err.message.toLowerCase() : '';
174
+ if (err?.name === 'TimeoutError' || err?.name === 'AbortError' || message.includes('timed out')) {
175
+ return 'timeout';
176
+ }
177
+ if (message.includes('fetch failed') || message.includes('econnrefused') || message.includes('network')) {
178
+ return 'unreachable';
179
+ }
180
+ if (err instanceof TypeError) {
181
+ return 'transport';
182
+ }
183
+ return 'non_recoverable';
184
+ }
185
+ function buildOllamaRequest(args) {
186
+ const common = {
187
+ model: args.model,
188
+ stream: false,
189
+ options: {
190
+ num_ctx: args.contextLength,
191
+ max_output_tokens: args.maxOutputTokens,
192
+ },
193
+ };
194
+ if (args.policy.sendThinkFlag) {
195
+ common.think = false;
196
+ }
197
+ if (args.transport === 'chat') {
198
+ return {
199
+ url: OLLAMA_CHAT_URL,
200
+ transport: 'chat',
201
+ body: {
202
+ ...common,
203
+ messages: [{ role: 'user', content: args.prompt }],
204
+ },
205
+ };
206
+ }
207
+ return {
208
+ url: OLLAMA_GENERATE_URL,
209
+ transport: 'generate',
210
+ body: {
211
+ ...common,
212
+ prompt: args.prompt,
213
+ },
214
+ };
215
+ }
216
+ function shouldFallbackToGenerate(policy, transport, err) {
217
+ if (transport !== 'chat' || !policy.fallbackToGenerate)
218
+ return false;
219
+ if (!(err instanceof OllamaRequestError))
220
+ return false;
221
+ if (err.status === 404 || err.status === 405 || err.status === 501) {
222
+ return true;
223
+ }
224
+ if (err.status !== 400) {
225
+ return false;
226
+ }
227
+ const body = err.responseBody?.toLowerCase() ?? '';
228
+ return body.includes('messages') || body.includes('chat') || body.includes('unsupported');
229
+ }
230
+ function extractResponseText(data, transport) {
231
+ if (transport === 'chat') {
232
+ return typeof data?.message?.content === 'string' ? data.message.content.trim() : '';
233
+ }
234
+ return typeof data?.response === 'string' ? data.response.trim() : '';
235
+ }
236
+ async function safeReadResponseText(res) {
237
+ try {
238
+ const text = await res.text();
239
+ return text.length > 0 ? text : undefined;
240
+ }
241
+ catch {
242
+ return undefined;
243
+ }
244
+ }
245
+ function buildRecoveryFailureMessage(kind, detail, beforeRetry) {
246
+ const suffix = ' Run `scai model status` to inspect the server or `scai model restart` to retry manually.';
247
+ if (beforeRetry) {
248
+ if (kind === 'unreachable') {
249
+ return `Ollama was not running, and SCAI could not restart it. ${detail ?? ''}`.trimEnd() + suffix;
250
+ }
251
+ return `Ollama is not responding, and SCAI could not recover it automatically. ${detail ?? ''}`.trimEnd() + suffix;
252
+ }
253
+ if (kind === 'timeout') {
254
+ return `Ollama restarted, but the model request still timed out. ${detail ?? ''}`.trimEnd() + suffix;
255
+ }
256
+ return `Ollama restarted, but the model request still failed. ${detail ?? ''}`.trimEnd() + suffix;
257
+ }
258
+ function finalizeTiming(startedAt, stop, attemptCount) {
259
+ return {
260
+ startedAt,
261
+ finishedAt: nowLocalIso(),
262
+ durationMs: stop(),
263
+ attemptCount,
264
+ };
265
+ }
266
+ function writeGenerateTrace(input) {
267
+ if (!input.traceInput) {
268
+ return input.timing;
269
+ }
270
+ const trace = writeLlmTraceRecord({
271
+ caller: input.traceInput.caller,
272
+ query: input.input.query,
273
+ model: input.model,
274
+ requestBody: input.requestBody,
275
+ promptText: input.prompt,
276
+ inputContext: input.traceInput.inputContext,
277
+ ...input.timing,
278
+ ...(input.errorMessage ? { errorMessage: input.errorMessage } : {}),
279
+ });
280
+ return trace ? { callId: trace.callId, ...input.timing } : input.timing;
281
+ }
282
+ function attachAttemptCount(error, attemptCount) {
283
+ if (error && typeof error === "object") {
284
+ error.attemptCount = attemptCount;
285
+ }
286
+ }
287
+ function attachRequestBody(error, requestBody) {
288
+ if (error && typeof error === "object") {
289
+ error.requestBody = requestBody;
290
+ }
291
+ }
292
+ function inferAttemptCount(error) {
293
+ if (error && typeof error === "object" && typeof error.attemptCount === "number") {
294
+ return error.attemptCount;
295
+ }
296
+ return 1;
54
297
  }
298
+ //# sourceMappingURL=generate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/lib/generate.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAElD,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,EACL,oBAAoB,GAGrB,MAAM,wBAAwB,CAAC;AAyChC,MAAM,kBAAmB,SAAQ,KAAK;IAIpC,YAAY,OAAe,EAAE,OAAoD;QAC/E,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;QACjC,IAAI,CAAC,MAAM,GAAG,OAAO,EAAE,MAAM,CAAC;QAC9B,IAAI,CAAC,YAAY,GAAG,OAAO,EAAE,YAAY,CAAC;IAC5C,CAAC;CACF;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,KAAe,EAAE,UAA+B;IAC7E,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;IAChC,MAAM,EAAE,aAAa,EAAE,eAAe,EAAE,GAAG,UAAU,EAAE,CAAC;IAExD,sBAAsB;IACtB,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,gBAAgB,KAAK,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IACvE,MAAM,WAAW,GACf,KAAK,CAAC,OAAO,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ;QAChD,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACxC,CAAC,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC;IAE1B,MAAM,MAAM,GAAG,GAAG,SAAS,GAAG,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;IACnD,MAAM,MAAM,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAC3C,MAAM,cAAc,GAAG,kBAAkB,CAAC;QACxC,KAAK;QACL,MAAM;QACN,aAAa;QACb,eAAe;QACf,MAAM;QACN,SAAS,EAAE,MAAM,CAAC,SAAS;KAC5B,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,WAAW,EAAE,CAAC;IAChC,MAAM,IAAI,GAAG,UAAU,EAAE,CAAC;IAE1B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,eAAe,CAAC,CAAC;QAC/E,MAAM,MAAM,GAAG,cAAc,CAAC,SAAS,EAAE,IAAI,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;QACpE,MAAM,KAAK,GAAG,kBAAkB,CAAC;YAC/B,UAAU;YACV,KAAK;YACL,KAAK;YACL,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,MAAM;YACN,MAAM;SACP,CAAC,CAAC;QAEH,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;IAC1D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,KAAK,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAClE,MAAM,WAAW,GAAG,KAA+B,CAAC;QACpD,MAAM,MAAM,GAAG,cAAc,CAAC,SAAS,EAAE,IAAI,EAAE,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC;QACzE,MAAM,KAAK,GAAG,kBAAkB,CAAC;YAC/B,UAAU;YACV,KAAK;YACL,KAAK;YACL,WAAW,EAAE,WAAW,CAAC,WAAW,IAAI,cAAc,CAAC,IAAI;YAC3D,MAAM;YACN,MAAM;YACN,YAAY,EAAE,KAAK,CAAC,OAAO;SAC5B,CAAC,CAAC;QAEH,WAAW,CAAC,KAAK,GAAG,KAAK,IAAI,MAAM,CAAC;QACpC,MAAM,WAAW,CAAC;IACpB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,UAAU,CACvB,MAAc,EACd,KAAa,EACb,aAAqB,EACrB,eAAuB;IAEvB,MAAM,kBAAkB,GAAG,MAAO,CAAC;IACnC,MAAM,MAAM,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAC3C,IAAI,aAAa,GAAG,kBAAkB,CAAC;QACrC,KAAK;QACL,MAAM;QACN,aAAa;QACb,eAAe;QACf,MAAM;QACN,SAAS,EAAE,MAAM,CAAC,SAAS;KAC5B,CAAC,CAAC;IACH,IAAI,YAAY,GAAG,CAAC,CAAC;IAErB,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,iBAAiB,CAAC,aAAa,EAAE,kBAAkB,CAAC,CAAC;QACxE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,aAAa,CAAC,IAAI,EAAE,CAAC;IACjE,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,IAAI,wBAAwB,CAAC,MAAM,EAAE,aAAa,CAAC,SAAS,EAAE,GAAG,CAAC,EAAE,CAAC;YACnE,aAAa,GAAG,kBAAkB,CAAC;gBACjC,KAAK;gBACL,MAAM;gBACN,aAAa;gBACb,eAAe;gBACf,MAAM;gBACN,SAAS,EAAE,UAAU;aACtB,CAAC,CAAC;YAEH,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,iBAAiB,CAAC,aAAa,EAAE,kBAAkB,CAAC,CAAC;gBACxE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,aAAa,CAAC,IAAI,EAAE,CAAC;YACjE,CAAC;YAAC,OAAO,WAAgB,EAAE,CAAC;gBAC1B,GAAG,GAAG,WAAW,CAAC;YACpB,CAAC;QACH,CAAC;QAED,IAAI,CAAC,0BAA0B,CAAC,GAAG,CAAC,EAAE,CAAC;YACrC,kBAAkB,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;YACtC,iBAAiB,CAAC,GAAG,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC;YAC3C,MAAM,GAAG,CAAC;QACZ,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,iBAAiB,EAAE,CAAC;QACzC,IAAI,MAAM,CAAC,MAAM,KAAK,aAAa,EAAE,CAAC;YACpC,OAAO,CAAC,GAAG,CAAC,oFAAoF,CAAC,CAAC;QACpG,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,uFAAuF,CAAC,CAAC;QACvG,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,mBAAmB,EAAE,CAAC;QAC5C,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACzC,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;QAC3F,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;QACpE,YAAY,IAAI,CAAC,CAAC;QAElB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,iBAAiB,CAAC,aAAa,EAAE,kBAAkB,CAAC,CAAC;YACxE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,aAAa,CAAC,IAAI,EAAE,CAAC;QACjE,CAAC;QAAC,OAAO,QAAa,EAAE,CAAC;YACvB,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,2BAA2B,CAAC,qBAAqB,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;YAChH,kBAAkB,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;YACxC,iBAAiB,CAAC,KAAK,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC;YAC7C,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;AACH,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,OAAsB,EAAE,SAAiB;IACxE,IAAI,GAAa,CAAC;IAClB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE;YAC7B,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC;YACtC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC;SACnC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,IAAI,GAAG,EAAE,IAAI,KAAK,cAAc,IAAI,GAAG,EAAE,IAAI,KAAK,YAAY,EAAE,CAAC;YAC/D,MAAM,IAAI,KAAK,CACb,iCAAiC,SAAS,iEAAiE,CAC5G,CAAC;QACJ,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;IAED,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,YAAY,GAAG,MAAM,oBAAoB,CAAC,GAAG,CAAC,CAAC;QACrD,MAAM,IAAI,kBAAkB,CAAC,oCAAoC,GAAG,CAAC,MAAM,EAAE,EAAE;YAC7E,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,YAAY;SACb,CAAC,CAAC;IACL,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;IAC9B,OAAO,mBAAmB,CAAC,IAAI,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;AACtD,CAAC;AAED,SAAS,0BAA0B,CAAC,GAAY;IAC9C,OAAO,qBAAqB,CAAC,GAAG,CAAC,KAAK,iBAAiB,CAAC;AAC1D,CAAC;AAED,SAAS,qBAAqB,CAAC,GAAQ;IACrC,MAAM,OAAO,GAAG,OAAO,GAAG,EAAE,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAElF,IAAI,GAAG,EAAE,IAAI,KAAK,cAAc,IAAI,GAAG,EAAE,IAAI,KAAK,YAAY,IAAI,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QAChG,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACxG,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,IAAI,GAAG,YAAY,SAAS,EAAE,CAAC;QAC7B,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,OAAO,iBAAiB,CAAC;AAC3B,CAAC;AAED,SAAS,kBAAkB,CAAC,IAO3B;IACC,MAAM,MAAM,GAA4B;QACtC,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,MAAM,EAAE,KAAK;QACb,OAAO,EAAE;YACP,OAAO,EAAE,IAAI,CAAC,aAAa;YAC3B,iBAAiB,EAAE,IAAI,CAAC,eAAe;SACxC;KACF,CAAC;IAEF,IAAI,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;QAC9B,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;IACvB,CAAC;IAED,IAAI,IAAI,CAAC,SAAS,KAAK,MAAM,EAAE,CAAC;QAC9B,OAAO;YACL,GAAG,EAAE,eAAe;YACpB,SAAS,EAAE,MAAM;YACjB,IAAI,EAAE;gBACJ,GAAG,MAAM;gBACT,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;aACnD;SACF,CAAC;IACJ,CAAC;IAED,OAAO;QACL,GAAG,EAAE,mBAAmB;QACxB,SAAS,EAAE,UAAU;QACrB,IAAI,EAAE;YACJ,GAAG,MAAM;YACT,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB;KACF,CAAC;AACJ,CAAC;AAED,SAAS,wBAAwB,CAC/B,MAAyB,EACzB,SAA0B,EAC1B,GAAY;IAEZ,IAAI,SAAS,KAAK,MAAM,IAAI,CAAC,MAAM,CAAC,kBAAkB;QAAE,OAAO,KAAK,CAAC;IACrE,IAAI,CAAC,CAAC,GAAG,YAAY,kBAAkB,CAAC;QAAE,OAAO,KAAK,CAAC;IAEvD,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QACnE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QACvB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,IAAI,GAAG,GAAG,CAAC,YAAY,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IACnD,OAAO,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;AAC5F,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAS,EAAE,SAA0B;IAChE,IAAI,SAAS,KAAK,MAAM,EAAE,CAAC;QACzB,OAAO,OAAO,IAAI,EAAE,OAAO,EAAE,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACvF,CAAC;IAED,OAAO,OAAO,IAAI,EAAE,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AACxE,CAAC;AAED,KAAK,UAAU,oBAAoB,CAAC,GAAa;IAC/C,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,2BAA2B,CAClC,IAAuF,EACvF,MAA0B,EAC1B,WAAoB;IAEpB,MAAM,MAAM,GAAG,2FAA2F,CAAC;IAE3G,IAAI,WAAW,EAAE,CAAC;QAChB,IAAI,IAAI,KAAK,aAAa,EAAE,CAAC;YAC3B,OAAO,0DAA0D,MAAM,IAAI,EAAE,EAAE,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC;QACrG,CAAC;QAED,OAAO,0EAA0E,MAAM,IAAI,EAAE,EAAE,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC;IACrH,CAAC;IAED,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,4DAA4D,MAAM,IAAI,EAAE,EAAE,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC;IACvG,CAAC;IAED,OAAO,yDAAyD,MAAM,IAAI,EAAE,EAAE,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC;AACpG,CAAC;AAED,SAAS,cAAc,CAAC,SAAiB,EAAE,IAAkB,EAAE,YAAoB;IACjF,OAAO;QACL,SAAS;QACT,UAAU,EAAE,WAAW,EAAE;QACzB,UAAU,EAAE,IAAI,EAAE;QAClB,YAAY;KACb,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CAAC,KAA8B;IACxD,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;QACtB,OAAO,KAAK,CAAC,MAAM,CAAC;IACtB,CAAC;IAED,MAAM,KAAK,GAAG,mBAAmB,CAAC;QAChC,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC,MAAM;QAC/B,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK;QACxB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,UAAU,EAAE,KAAK,CAAC,MAAM;QACxB,YAAY,EAAE,KAAK,CAAC,UAAU,CAAC,YAAY;QAC3C,GAAG,KAAK,CAAC,MAAM;QACf,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACpE,CAAC,CAAC;IAEH,OAAO,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;AAC1E,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAc,EAAE,YAAoB;IAC9D,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACtC,KAAmC,CAAC,YAAY,GAAG,YAAY,CAAC;IACnE,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAc,EAAE,WAAoC;IAC7E,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACtC,KAAmD,CAAC,WAAW,GAAG,WAAW,CAAC;IACjF,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAc;IACvC,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAQ,KAAoC,CAAC,YAAY,KAAK,QAAQ,EAAE,CAAC;QACjH,OAAQ,KAAkC,CAAC,YAAY,CAAC;IAC1D,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC","sourcesContent":["/**\n * Sends one model request through Ollama and, when enabled, saves exact call inputs for integration review.\n *\n * Why this file exists:\n * - all normal model calls go through one gateway\n * - recovery and retry behavior should stay consistent across callers\n * - integration tracing belongs here so callers only provide caller name and exact input context\n */\nimport { Config, readConfig } from '../config.js';\nimport { ModuleIO } from '../types.js';\nimport {\n OLLAMA_CHAT_URL,\n OLLAMA_GENERATE_URL,\n probeOllamaHealth,\n restartOllamaServer,\n} from '../utils/ollamaService.js';\nimport { nowLocalIso, startTimer } from '../utils/time.js';\nimport { writeLlmTraceRecord } from '../testing/llmTraceSession.js';\nimport {\n getOllamaModelPolicy,\n type OllamaModelPolicy,\n type OllamaTransport,\n} from './ollamaModelPolicy.js';\n\nexport type GenerateTraceInput = {\n caller: string;\n inputContext: unknown;\n};\n\ntype GenerateTiming = {\n startedAt: string;\n finishedAt: string;\n durationMs: number;\n attemptCount: number;\n};\n\ntype GenerateResult = {\n data: string;\n attemptCount: number;\n requestBody: Record<string, unknown>;\n};\n\ntype GenerateErrorWithTrace = Error & {\n trace?: ModuleIO[\"trace\"];\n requestBody?: Record<string, unknown>;\n};\n\ntype GenerateTraceWriteInput = {\n traceInput?: GenerateTraceInput;\n input: ModuleIO;\n model: string;\n requestBody: Record<string, unknown>;\n prompt: string;\n timing: GenerateTiming;\n errorMessage?: string;\n};\n\ntype OllamaRequest = {\n url: string;\n body: Record<string, unknown>;\n transport: OllamaTransport;\n};\n\nclass OllamaRequestError extends Error {\n status?: number;\n responseBody?: string;\n\n constructor(message: string, options?: { status?: number; responseBody?: string }) {\n super(message);\n this.name = 'OllamaRequestError';\n this.status = options?.status;\n this.responseBody = options?.responseBody;\n }\n}\n\n/**\n * The generate module uses the local model API to produce output\n * based on the `content` of the input. It returns the response\n * on the `data` property of ModuleIO.\n *\n * Assumes the model is already running. Does NOT attempt to start or restart it.\n */\nexport async function generate(input: ModuleIO, traceInput?: GenerateTraceInput): Promise<ModuleIO> {\n const model = Config.getModel();\n const { contextLength, maxOutputTokens } = readConfig();\n\n // Safely build prompt\n const queryPart = input.query ? `User query:\\n${input.query}\\n\\n` : '';\n const contentPart =\n input.content && typeof input.content !== 'string'\n ? JSON.stringify(input.content, null, 2)\n : input.content || '';\n\n const prompt = `${queryPart}${contentPart}`.trim();\n const policy = getOllamaModelPolicy(model);\n const initialRequest = buildOllamaRequest({\n model,\n prompt,\n contextLength,\n maxOutputTokens,\n policy,\n transport: policy.transport,\n });\n\n const startedAt = nowLocalIso();\n const stop = startTimer();\n\n try {\n const result = await doGenerate(prompt, model, contextLength, maxOutputTokens);\n const timing = finalizeTiming(startedAt, stop, result.attemptCount);\n const trace = writeGenerateTrace({\n traceInput,\n input,\n model,\n requestBody: result.requestBody,\n prompt,\n timing,\n });\n\n return { query: input.query, data: result.data, trace };\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n const tracedError = error as GenerateErrorWithTrace;\n const timing = finalizeTiming(startedAt, stop, inferAttemptCount(error));\n const trace = writeGenerateTrace({\n traceInput,\n input,\n model,\n requestBody: tracedError.requestBody ?? initialRequest.body,\n prompt,\n timing,\n errorMessage: error.message,\n });\n\n tracedError.trace = trace ?? timing;\n throw tracedError;\n }\n}\n\nasync function doGenerate(\n prompt: string,\n model: string,\n contextLength: number,\n maxOutputTokens: number\n): Promise<GenerateResult> {\n const REQUEST_TIMEOUT_MS = 270_000;\n const policy = getOllamaModelPolicy(model);\n let activeRequest = buildOllamaRequest({\n model,\n prompt,\n contextLength,\n maxOutputTokens,\n policy,\n transport: policy.transport,\n });\n let attemptCount = 1;\n\n try {\n const data = await sendOllamaRequest(activeRequest, REQUEST_TIMEOUT_MS);\n return { data, attemptCount, requestBody: activeRequest.body };\n } catch (err: any) {\n if (shouldFallbackToGenerate(policy, activeRequest.transport, err)) {\n activeRequest = buildOllamaRequest({\n model,\n prompt,\n contextLength,\n maxOutputTokens,\n policy,\n transport: 'generate',\n });\n\n try {\n const data = await sendOllamaRequest(activeRequest, REQUEST_TIMEOUT_MS);\n return { data, attemptCount, requestBody: activeRequest.body };\n } catch (fallbackErr: any) {\n err = fallbackErr;\n }\n }\n\n if (!isRecoverableGenerateError(err)) {\n attachAttemptCount(err, attemptCount);\n attachRequestBody(err, activeRequest.body);\n throw err;\n }\n\n const health = await probeOllamaHealth();\n if (health.status === 'unreachable') {\n console.log('⚠️ Ollama is not running. SCAI is restarting the Ollama server and retrying once.');\n } else {\n console.log('⚠️ Ollama is not responding. SCAI is restarting the Ollama server and retrying once.');\n }\n\n const restart = await restartOllamaServer();\n if (!restart.restarted || !restart.ready) {\n throw new Error(buildRecoveryFailureMessage(health.status, restart.health.detail, true));\n }\n\n console.log('✅ Ollama restarted. Retrying the model request once.');\n attemptCount += 1;\n\n try {\n const data = await sendOllamaRequest(activeRequest, REQUEST_TIMEOUT_MS);\n return { data, attemptCount, requestBody: activeRequest.body };\n } catch (retryErr: any) {\n const error = new Error(buildRecoveryFailureMessage(classifyGenerateError(retryErr), retryErr?.message, false));\n attachAttemptCount(error, attemptCount);\n attachRequestBody(error, activeRequest.body);\n throw error;\n }\n }\n}\n\nasync function sendOllamaRequest(request: OllamaRequest, timeoutMs: number): Promise<string> {\n let res: Response;\n try {\n res = await fetch(request.url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n signal: AbortSignal.timeout(timeoutMs),\n body: JSON.stringify(request.body),\n });\n } catch (err: any) {\n if (err?.name === 'TimeoutError' || err?.name === 'AbortError') {\n throw new Error(\n `Model request timed out after ${timeoutMs}ms. Verify Ollama is responsive or retry with a smaller prompt.`\n );\n }\n throw err;\n }\n\n if (!res.ok) {\n const responseBody = await safeReadResponseText(res);\n throw new OllamaRequestError(`Model request failed with status ${res.status}`, {\n status: res.status,\n responseBody,\n });\n }\n\n const data = await res.json();\n return extractResponseText(data, request.transport);\n}\n\nfunction isRecoverableGenerateError(err: unknown): boolean {\n return classifyGenerateError(err) !== 'non_recoverable';\n}\n\nfunction classifyGenerateError(err: any): 'unreachable' | 'timeout' | 'transport' | 'non_recoverable' {\n const message = typeof err?.message === 'string' ? err.message.toLowerCase() : '';\n\n if (err?.name === 'TimeoutError' || err?.name === 'AbortError' || message.includes('timed out')) {\n return 'timeout';\n }\n\n if (message.includes('fetch failed') || message.includes('econnrefused') || message.includes('network')) {\n return 'unreachable';\n }\n\n if (err instanceof TypeError) {\n return 'transport';\n }\n\n return 'non_recoverable';\n}\n\nfunction buildOllamaRequest(args: {\n model: string;\n prompt: string;\n contextLength: number;\n maxOutputTokens: number;\n policy: OllamaModelPolicy;\n transport: OllamaTransport;\n}): OllamaRequest {\n const common: Record<string, unknown> = {\n model: args.model,\n stream: false,\n options: {\n num_ctx: args.contextLength,\n max_output_tokens: args.maxOutputTokens,\n },\n };\n\n if (args.policy.sendThinkFlag) {\n common.think = false;\n }\n\n if (args.transport === 'chat') {\n return {\n url: OLLAMA_CHAT_URL,\n transport: 'chat',\n body: {\n ...common,\n messages: [{ role: 'user', content: args.prompt }],\n },\n };\n }\n\n return {\n url: OLLAMA_GENERATE_URL,\n transport: 'generate',\n body: {\n ...common,\n prompt: args.prompt,\n },\n };\n}\n\nfunction shouldFallbackToGenerate(\n policy: OllamaModelPolicy,\n transport: OllamaTransport,\n err: unknown\n): boolean {\n if (transport !== 'chat' || !policy.fallbackToGenerate) return false;\n if (!(err instanceof OllamaRequestError)) return false;\n\n if (err.status === 404 || err.status === 405 || err.status === 501) {\n return true;\n }\n\n if (err.status !== 400) {\n return false;\n }\n\n const body = err.responseBody?.toLowerCase() ?? '';\n return body.includes('messages') || body.includes('chat') || body.includes('unsupported');\n}\n\nfunction extractResponseText(data: any, transport: OllamaTransport): string {\n if (transport === 'chat') {\n return typeof data?.message?.content === 'string' ? data.message.content.trim() : '';\n }\n\n return typeof data?.response === 'string' ? data.response.trim() : '';\n}\n\nasync function safeReadResponseText(res: Response): Promise<string | undefined> {\n try {\n const text = await res.text();\n return text.length > 0 ? text : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction buildRecoveryFailureMessage(\n kind: 'healthy' | 'unreachable' | 'timeout' | 'error' | 'transport' | 'non_recoverable',\n detail: string | undefined,\n beforeRetry: boolean\n): string {\n const suffix = ' Run `scai model status` to inspect the server or `scai model restart` to retry manually.';\n\n if (beforeRetry) {\n if (kind === 'unreachable') {\n return `Ollama was not running, and SCAI could not restart it. ${detail ?? ''}`.trimEnd() + suffix;\n }\n\n return `Ollama is not responding, and SCAI could not recover it automatically. ${detail ?? ''}`.trimEnd() + suffix;\n }\n\n if (kind === 'timeout') {\n return `Ollama restarted, but the model request still timed out. ${detail ?? ''}`.trimEnd() + suffix;\n }\n\n return `Ollama restarted, but the model request still failed. ${detail ?? ''}`.trimEnd() + suffix;\n}\n\nfunction finalizeTiming(startedAt: string, stop: () => number, attemptCount: number): GenerateTiming {\n return {\n startedAt,\n finishedAt: nowLocalIso(),\n durationMs: stop(),\n attemptCount,\n };\n}\n\nfunction writeGenerateTrace(input: GenerateTraceWriteInput): ModuleIO[\"trace\"] | undefined {\n if (!input.traceInput) {\n return input.timing;\n }\n\n const trace = writeLlmTraceRecord({\n caller: input.traceInput.caller,\n query: input.input.query,\n model: input.model,\n requestBody: input.requestBody,\n promptText: input.prompt,\n inputContext: input.traceInput.inputContext,\n ...input.timing,\n ...(input.errorMessage ? { errorMessage: input.errorMessage } : {}),\n });\n\n return trace ? { callId: trace.callId, ...input.timing } : input.timing;\n}\n\nfunction attachAttemptCount(error: unknown, attemptCount: number): void {\n if (error && typeof error === \"object\") {\n (error as { attemptCount?: number }).attemptCount = attemptCount;\n }\n}\n\nfunction attachRequestBody(error: unknown, requestBody: Record<string, unknown>): void {\n if (error && typeof error === \"object\") {\n (error as { requestBody?: Record<string, unknown> }).requestBody = requestBody;\n }\n}\n\nfunction inferAttemptCount(error: unknown): number {\n if (error && typeof error === \"object\" && typeof (error as { attemptCount?: unknown }).attemptCount === \"number\") {\n return (error as { attemptCount: number }).attemptCount;\n }\n return 1;\n}\n"]}
@@ -107,3 +107,4 @@ ${JSON.stringify(inputPayload, null, 2)}
107
107
  console.log(`📦 Folder capsule generated for ${folder.path}`);
108
108
  }
109
109
  }
110
+ //# sourceMappingURL=generateFolderCapsules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generateFolderCapsules.js","sourceRoot":"","sources":["../../src/lib/generateFolderCapsules.ts"],"names":[],"mappings":"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","sourcesContent":["import { getDbForRepo } from \"../db/client.js\";\nimport { generate } from \"../lib/generate.js\";\nimport { cleanupModule } from \"../pipeline/modules/cleanupModule.js\";\n\nimport { ModuleIO, FolderCapsule, FilePathRow } from \"../types.js\";\nimport path from \"path\";\n\ntype FolderFacts = {\n path: string;\n depth: number;\n files: {\n name: string;\n ext: string;\n }[];\n};\n\nexport async function generateFolderCapsules() {\n const db = getDbForRepo();\n\n // --- Load files (paths only) ---\n const files = db\n .prepare(`SELECT path FROM files`)\n .all() as FilePathRow[];\n\n // --- Group files by folder ---\n const folders = new Map<string, FolderFacts>();\n\n for (const { path: filePath } of files) {\n const dir = path.dirname(filePath) || \"/\";\n const depth = dir === \"/\" ? 0 : dir.split(\"/\").length;\n\n if (!folders.has(dir)) {\n folders.set(dir, {\n path: dir,\n depth,\n files: [],\n });\n }\n\n folders.get(dir)!.files.push({\n name: path.basename(filePath),\n ext: path.extname(filePath).replace(\".\", \"\") || \"unknown\",\n });\n }\n\n // --- Generate one capsule per folder ---\n for (const folder of folders.values()) {\n const byType: Record<string, number> = {};\n for (const f of folder.files) {\n byType[f.ext] = (byType[f.ext] ?? 0) + 1;\n }\n\n const inputPayload = {\n path: folder.path,\n depth: folder.depth,\n fileCount: folder.files.length,\n byType,\n files: folder.files.map((f) => f.name),\n };\n\n const input: ModuleIO = {\n query: `Generate a FolderCapsule for ${folder.path}`,\n content: `\nYou are generating a structured FolderCapsule describing the architectural role of a folder.\n\nReturn ONLY valid JSON matching this TypeScript interface:\n\ninterface FolderCapsule {\n path: string;\n depth: number;\n stats: {\n fileCount: number;\n byType: Record<string, number>;\n };\n roles: string[];\n concerns: string[];\n keyFiles: { path: string; reason: string }[];\n dependencies: {\n importsFrom: string[];\n usedBy: string[];\n };\n confidence: number;\n}\n\nFolder facts:\n${JSON.stringify(inputPayload, null, 2)}\n `.trim(),\n };\n\n const response = await generate(input);\n\n // --- Cleanup model output ---\n const cleaned = await cleanupModule.run({\n query: input.query,\n content: response.content,\n });\n\n let capsule: FolderCapsule | null = null;\n\n try {\n capsule = JSON.parse(String(cleaned.content));\n } catch {\n console.warn(`⚠️ Failed to parse FolderCapsule for ${folder.path}`);\n continue;\n }\n\n db.prepare(`\n INSERT INTO folder_capsules\n (path, depth, capsule_json, confidence, last_generated, source_file_count)\n VALUES\n (\n @path,\n @depth,\n @capsule_json,\n @confidence,\n datetime('now'),\n @source_file_count\n )\n ON CONFLICT(path) DO UPDATE SET\n capsule_json = excluded.capsule_json,\n confidence = excluded.confidence,\n last_generated = datetime('now'),\n source_file_count = excluded.source_file_count\n `).run({\n path: folder.path,\n depth: folder.depth,\n capsule_json: JSON.stringify(capsule),\n confidence: capsule?.confidence ?? null,\n source_file_count: folder.files.length,\n });\n\n console.log(`📦 Folder capsule generated for ${folder.path}`);\n }\n}\n"]}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Resolves one shared Ollama request policy from a model tag.
3
+ *
4
+ * Why this file exists:
5
+ * - all model-family request behavior should stay in one place
6
+ * - transport, thinking defaults, and fallback rules should not be duplicated
7
+ * - table-driven matching keeps future model-family updates small and testable
8
+ */
9
+ const DEFAULT_OLLAMA_MODEL_POLICY = {
10
+ transport: "chat",
11
+ fallbackToGenerate: true,
12
+ thinkingDefault: "unsupported",
13
+ sendThinkFlag: false,
14
+ };
15
+ const OLLAMA_MODEL_POLICY_RULES = [
16
+ {
17
+ prefixes: [
18
+ "qwen3-coder:",
19
+ "qwen3:",
20
+ "qwen3.5:",
21
+ "qwen3.6:",
22
+ "qwen3-next:",
23
+ "qwen3-vl:",
24
+ "aratan/qwen3.5-agent-multimodal:",
25
+ "gpt-oss:",
26
+ "nemotron-cascade-2:",
27
+ "gemma4:",
28
+ "granite4.1:",
29
+ ],
30
+ transport: "chat",
31
+ fallbackToGenerate: true,
32
+ thinkingDefault: "off",
33
+ },
34
+ {
35
+ prefixes: [
36
+ "glm-4.7-flash:",
37
+ ],
38
+ transport: "chat",
39
+ fallbackToGenerate: true,
40
+ thinkingDefault: "unsupported",
41
+ },
42
+ ];
43
+ export function getOllamaModelPolicy(model) {
44
+ const normalized = normalizeModelTag(model);
45
+ const matchedRule = OLLAMA_MODEL_POLICY_RULES.find((rule) => rule.prefixes.some((prefix) => normalized.startsWith(prefix)));
46
+ if (!matchedRule) {
47
+ return { ...DEFAULT_OLLAMA_MODEL_POLICY };
48
+ }
49
+ return {
50
+ transport: matchedRule.transport,
51
+ fallbackToGenerate: matchedRule.fallbackToGenerate,
52
+ thinkingDefault: matchedRule.thinkingDefault,
53
+ sendThinkFlag: matchedRule.thinkingDefault === "off",
54
+ };
55
+ }
56
+ function normalizeModelTag(model) {
57
+ return String(model ?? "").trim().toLowerCase();
58
+ }
59
+ //# sourceMappingURL=ollamaModelPolicy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ollamaModelPolicy.js","sourceRoot":"","sources":["../../src/lib/ollamaModelPolicy.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAmBH,MAAM,2BAA2B,GAAsB;IACrD,SAAS,EAAE,MAAM;IACjB,kBAAkB,EAAE,IAAI;IACxB,eAAe,EAAE,aAAa;IAC9B,aAAa,EAAE,KAAK;CACrB,CAAC;AAEF,MAAM,yBAAyB,GAA4B;IACzD;QACE,QAAQ,EAAE;YACR,cAAc;YACd,QAAQ;YACR,UAAU;YACV,UAAU;YACV,aAAa;YACb,WAAW;YACX,kCAAkC;YAClC,UAAU;YACV,qBAAqB;YACrB,SAAS;YACT,aAAa;SACd;QACD,SAAS,EAAE,MAAM;QACjB,kBAAkB,EAAE,IAAI;QACxB,eAAe,EAAE,KAAK;KACvB;IACD;QACE,QAAQ,EAAE;YACR,gBAAgB;SACjB;QACD,SAAS,EAAE,MAAM;QACjB,kBAAkB,EAAE,IAAI;QACxB,eAAe,EAAE,aAAa;KAC/B;CACF,CAAC;AAEF,MAAM,UAAU,oBAAoB,CAAC,KAAa;IAChD,MAAM,UAAU,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAC5C,MAAM,WAAW,GAAG,yBAAyB,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAC1D,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAC9D,CAAC;IAEF,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,EAAE,GAAG,2BAA2B,EAAE,CAAC;IAC5C,CAAC;IAED,OAAO;QACL,SAAS,EAAE,WAAW,CAAC,SAAS;QAChC,kBAAkB,EAAE,WAAW,CAAC,kBAAkB;QAClD,eAAe,EAAE,WAAW,CAAC,eAAe;QAC5C,aAAa,EAAE,WAAW,CAAC,eAAe,KAAK,KAAK;KACrD,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAa;IACtC,OAAO,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AAClD,CAAC","sourcesContent":["/**\n * Resolves one shared Ollama request policy from a model tag.\n *\n * Why this file exists:\n * - all model-family request behavior should stay in one place\n * - transport, thinking defaults, and fallback rules should not be duplicated\n * - table-driven matching keeps future model-family updates small and testable\n */\n\nexport type OllamaTransport = \"chat\" | \"generate\";\nexport type OllamaThinkingDefault = \"off\" | \"unsupported\";\n\nexport type OllamaModelPolicy = {\n transport: OllamaTransport;\n fallbackToGenerate: boolean;\n thinkingDefault: OllamaThinkingDefault;\n sendThinkFlag: boolean;\n};\n\ntype OllamaModelPolicyRule = {\n prefixes: string[];\n transport: OllamaTransport;\n fallbackToGenerate: boolean;\n thinkingDefault: OllamaThinkingDefault;\n};\n\nconst DEFAULT_OLLAMA_MODEL_POLICY: OllamaModelPolicy = {\n transport: \"chat\",\n fallbackToGenerate: true,\n thinkingDefault: \"unsupported\",\n sendThinkFlag: false,\n};\n\nconst OLLAMA_MODEL_POLICY_RULES: OllamaModelPolicyRule[] = [\n {\n prefixes: [\n \"qwen3-coder:\",\n \"qwen3:\",\n \"qwen3.5:\",\n \"qwen3.6:\",\n \"qwen3-next:\",\n \"qwen3-vl:\",\n \"aratan/qwen3.5-agent-multimodal:\",\n \"gpt-oss:\",\n \"nemotron-cascade-2:\",\n \"gemma4:\",\n \"granite4.1:\",\n ],\n transport: \"chat\",\n fallbackToGenerate: true,\n thinkingDefault: \"off\",\n },\n {\n prefixes: [\n \"glm-4.7-flash:\",\n ],\n transport: \"chat\",\n fallbackToGenerate: true,\n thinkingDefault: \"unsupported\",\n },\n];\n\nexport function getOllamaModelPolicy(model: string): OllamaModelPolicy {\n const normalized = normalizeModelTag(model);\n const matchedRule = OLLAMA_MODEL_POLICY_RULES.find((rule) =>\n rule.prefixes.some((prefix) => normalized.startsWith(prefix))\n );\n\n if (!matchedRule) {\n return { ...DEFAULT_OLLAMA_MODEL_POLICY };\n }\n\n return {\n transport: matchedRule.transport,\n fallbackToGenerate: matchedRule.fallbackToGenerate,\n thinkingDefault: matchedRule.thinkingDefault,\n sendThinkFlag: matchedRule.thinkingDefault === \"off\",\n };\n}\n\nfunction normalizeModelTag(model: string): string {\n return String(model ?? \"\").trim().toLowerCase();\n}\n"]}
@@ -1,3 +1,10 @@
1
+ /**
2
+ * Renders one in-place CLI spinner line without leaking stale text between updates.
3
+ *
4
+ * Why this exists:
5
+ * - durable agent messages should pause cleanly while long-running work is active
6
+ * - spinner redraws must clear the current row first so shorter status text does not leave old tails behind
7
+ */
1
8
  export class Spinner {
2
9
  constructor(message) {
3
10
  this.frames = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
@@ -9,29 +16,30 @@ export class Spinner {
9
16
  }
10
17
  start() {
11
18
  process.stdout.write('\x1b[?25l'); // hide cursor
12
- if (this.text) {
13
- process.stdout.write(` ${this.text}`);
14
- }
19
+ this.render();
15
20
  this.interval = setInterval(() => {
16
- const text = this.text ?? '';
17
- process.stdout.write('\r');
18
- process.stdout.write(`${this.frames[this.i]} ${text}`);
19
- this.i = (this.i + 1) % this.frames.length;
21
+ this.render();
20
22
  }, 80);
21
23
  }
24
+ isActive() {
25
+ return this.interval !== null;
26
+ }
22
27
  update(text) {
23
28
  this.text = text;
29
+ if (this.interval) {
30
+ this.render();
31
+ }
24
32
  }
25
33
  succeed(msg) {
26
34
  this.stop();
27
- process.stdout.write('\r'); // go to start
35
+ process.stdout.write('\r\x1b[K'); // go to start + clear line
28
36
  if (msg) {
29
37
  console.log(`✅ ${msg}`);
30
38
  }
31
39
  }
32
40
  fail(msg) {
33
41
  this.stop();
34
- process.stdout.write('\r'); // go to start
42
+ process.stdout.write('\r\x1b[K'); // go to start + clear line
35
43
  console.log(`❌ ${msg}`);
36
44
  }
37
45
  stop() {
@@ -39,6 +47,18 @@ export class Spinner {
39
47
  clearInterval(this.interval);
40
48
  this.interval = null;
41
49
  }
50
+ process.stdout.write('\r\x1b[K'); // clear any partial spinner line before normal output resumes
42
51
  process.stdout.write('\x1b[?25h'); // show cursor
43
52
  }
53
+ /**
54
+ * Repaints the full spinner row.
55
+ * Example: switching from "long-module-name.ts" to "a.ts" clears the stale tail first.
56
+ */
57
+ render() {
58
+ const text = this.text ?? '';
59
+ process.stdout.write('\r\x1b[K');
60
+ process.stdout.write(`${this.frames[this.i]} ${text}`);
61
+ this.i = (this.i + 1) % this.frames.length;
62
+ }
44
63
  }
64
+ //# sourceMappingURL=spinner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spinner.js","sourceRoot":"","sources":["../../src/lib/spinner.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,OAAO,OAAO;IAMlB,YAAY,OAAgB;QALpB,WAAM,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QAC5D,aAAQ,GAA0C,IAAI,CAAC;QAEvD,MAAC,GAAG,CAAC,CAAC;QAGZ,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC;QACtB,CAAC;IACH,CAAC;IAED,KAAK;QACH,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,cAAc;QACjD,IAAI,CAAC,MAAM,EAAE,CAAC;QAEd,IAAI,CAAC,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE;YAC/B,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,CAAC,EAAE,EAAE,CAAC,CAAC;IACT,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC;IAChC,CAAC;IAGD,MAAM,CAAC,IAAY;QACjB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAY;QAClB,IAAI,CAAC,IAAI,EAAE,CAAC;QACZ,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,2BAA2B;QAE7D,IAAI,GAAG,EAAE,CAAC;YACR,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,IAAI,CAAC,GAAW;QACd,IAAI,CAAC,IAAI,EAAE,CAAC;QACZ,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,2BAA2B;QAC7D,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;IAC1B,CAAC;IAED,IAAI;QACF,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC7B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACvB,CAAC;QACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,8DAA8D;QAChG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,cAAc;IACnD,CAAC;IAED;;;OAGG;IACK,MAAM;QACZ,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;QAC7B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACjC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QACvD,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;IAC7C,CAAC;CACF","sourcesContent":["/**\n * Renders one in-place CLI spinner line without leaking stale text between updates.\n *\n * Why this exists:\n * - durable agent messages should pause cleanly while long-running work is active\n * - spinner redraws must clear the current row first so shorter status text does not leave old tails behind\n */\nexport class Spinner {\n private frames = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];\n private interval: ReturnType<typeof setInterval> | null = null;\n private text?: string;\n private i = 0;\n\r\n constructor(message?: string) {\r\n if (message) {\r\n this.text = message;\r\n }\r\n }\r\n\r\n start() {\n process.stdout.write('\\x1b[?25l'); // hide cursor\n this.render();\n\n this.interval = setInterval(() => {\n this.render();\n }, 80);\n }\n\n isActive() {\n return this.interval !== null;\n }\n\n\n update(text: string) {\n this.text = text;\n if (this.interval) {\n this.render();\n }\n }\n\r\n succeed(msg?: string) {\n this.stop();\n process.stdout.write('\\r\\x1b[K'); // go to start + clear line\n\n if (msg) {\n console.log(`✅ ${msg}`);\n }\n }\n\n fail(msg: string) {\n this.stop();\n process.stdout.write('\\r\\x1b[K'); // go to start + clear line\n console.log(`❌ ${msg}`);\n }\n\r\n stop() {\n if (this.interval) {\n clearInterval(this.interval);\n this.interval = null;\n }\n process.stdout.write('\\r\\x1b[K'); // clear any partial spinner line before normal output resumes\n process.stdout.write('\\x1b[?25h'); // show cursor\n }\n\n /**\n * Repaints the full spinner row.\n * Example: switching from \"long-module-name.ts\" to \"a.ts\" clears the stale tail first.\n */\n private render() {\n const text = this.text ?? '';\n process.stdout.write('\\r\\x1b[K');\n process.stdout.write(`${this.frames[this.i]} ${text}`);\n this.i = (this.i + 1) % this.frames.length;\n }\n}\n"]}