scai 0.1.178 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (770) hide show
  1. package/README.md +162 -267
  2. package/dist/__tests__/CommitSuggesterCmd.test.js +112 -0
  3. package/dist/__tests__/CommitSuggesterCmd.test.js.map +1 -0
  4. package/dist/__tests__/EvalReportCmd.test.js +645 -0
  5. package/dist/__tests__/EvalReportCmd.test.js.map +1 -0
  6. package/dist/__tests__/ModelCmd.test.js +64 -0
  7. package/dist/__tests__/ModelCmd.test.js.map +1 -0
  8. package/dist/__tests__/agents/agentActions.test.js +345 -0
  9. package/dist/__tests__/agents/agentActions.test.js.map +1 -0
  10. package/dist/__tests__/agents/agentFeedback.test.js +118 -0
  11. package/dist/__tests__/agents/agentFeedback.test.js.map +1 -0
  12. package/dist/__tests__/agents/agentGeneralScope.test.js +74 -0
  13. package/dist/__tests__/agents/agentGeneralScope.test.js.map +1 -0
  14. package/dist/__tests__/agents/agentLoop.test.js +1723 -0
  15. package/dist/__tests__/agents/agentLoop.test.js.map +1 -0
  16. package/dist/__tests__/agents/agentPolicyState.test.js +948 -0
  17. package/dist/__tests__/agents/agentPolicyState.test.js.map +1 -0
  18. package/dist/__tests__/agents/agentReadEvidence.test.js +170 -0
  19. package/dist/__tests__/agents/agentReadEvidence.test.js.map +1 -0
  20. package/dist/__tests__/agents/agentReadPersistence.test.js +129 -0
  21. package/dist/__tests__/agents/agentReadPersistence.test.js.map +1 -0
  22. package/dist/__tests__/agents/agentResumeCheckpoint.test.js +90 -0
  23. package/dist/__tests__/agents/agentResumeCheckpoint.test.js.map +1 -0
  24. package/dist/__tests__/agents/agentSearchBatchPlanner.test.js +289 -0
  25. package/dist/__tests__/agents/agentSearchBatchPlanner.test.js.map +1 -0
  26. package/dist/__tests__/agents/agentSearchOwnership.test.js +166 -0
  27. package/dist/__tests__/agents/agentSearchOwnership.test.js.map +1 -0
  28. package/dist/__tests__/agents/agentSearchRanking.test.js +139 -0
  29. package/dist/__tests__/agents/agentSearchRanking.test.js.map +1 -0
  30. package/dist/__tests__/agents/agentSearchRouting.test.js +584 -0
  31. package/dist/__tests__/agents/agentSearchRouting.test.js.map +1 -0
  32. package/dist/__tests__/agents/agentSearchScoring.test.js +23 -0
  33. package/dist/__tests__/agents/agentSearchScoring.test.js.map +1 -0
  34. package/dist/__tests__/agents/agentSearchShared.test.js +78 -0
  35. package/dist/__tests__/agents/agentSearchShared.test.js.map +1 -0
  36. package/dist/__tests__/agents/agentStateMachine.test.js +58 -0
  37. package/dist/__tests__/agents/agentStateMachine.test.js.map +1 -0
  38. package/dist/__tests__/agents/agentTaskPersistence.test.js +156 -0
  39. package/dist/__tests__/agents/agentTaskPersistence.test.js.map +1 -0
  40. package/dist/__tests__/agents/agentTools.test.js +69 -0
  41. package/dist/__tests__/agents/agentTools.test.js.map +1 -0
  42. package/dist/__tests__/agents/agentTransform.test.js +779 -0
  43. package/dist/__tests__/agents/agentTransform.test.js.map +1 -0
  44. package/dist/__tests__/agents/analysisPlanGenStep.test.js +157 -0
  45. package/dist/__tests__/agents/analysisPlanGenStep.test.js.map +1 -0
  46. package/dist/__tests__/agents/answerOnlyCompletion.test.js +75 -0
  47. package/dist/__tests__/agents/answerOnlyCompletion.test.js.map +1 -0
  48. package/dist/__tests__/agents/decideNextAction.test.js +1662 -0
  49. package/dist/__tests__/agents/decideNextAction.test.js.map +1 -0
  50. package/dist/__tests__/agents/deriveFocusFromSearchStep.test.js +258 -0
  51. package/dist/__tests__/agents/deriveFocusFromSearchStep.test.js.map +1 -0
  52. package/dist/__tests__/agents/evidenceVerifierStep.test.js +113 -0
  53. package/dist/__tests__/agents/evidenceVerifierStep.test.js.map +1 -0
  54. package/dist/__tests__/agents/executionPolicyResolver.test.js +208 -0
  55. package/dist/__tests__/agents/executionPolicyResolver.test.js.map +1 -0
  56. package/dist/__tests__/agents/fileCheckStep.test.js +299 -0
  57. package/dist/__tests__/agents/fileCheckStep.test.js.map +1 -0
  58. package/dist/__tests__/agents/giveUpEvaluatorStep.test.js +35 -0
  59. package/dist/__tests__/agents/giveUpEvaluatorStep.test.js.map +1 -0
  60. package/dist/__tests__/agents/guardState.test.js +297 -0
  61. package/dist/__tests__/agents/guardState.test.js.map +1 -0
  62. package/dist/__tests__/agents/mainAgentHeuristics.test.js +72 -0
  63. package/dist/__tests__/agents/mainAgentHeuristics.test.js.map +1 -0
  64. package/dist/__tests__/agents/objectiveEvaluatorStep.test.js +60 -0
  65. package/dist/__tests__/agents/objectiveEvaluatorStep.test.js.map +1 -0
  66. package/dist/__tests__/agents/outerLoopRecoveryEvaluator.test.js +207 -0
  67. package/dist/__tests__/agents/outerLoopRecoveryEvaluator.test.js.map +1 -0
  68. package/dist/__tests__/agents/prompting.test.js +363 -0
  69. package/dist/__tests__/agents/prompting.test.js.map +1 -0
  70. package/dist/__tests__/agents/readinessGateStep.test.js +180 -0
  71. package/dist/__tests__/agents/readinessGateStep.test.js.map +1 -0
  72. package/dist/__tests__/agents/reasonNextStep.test.js +56 -0
  73. package/dist/__tests__/agents/reasonNextStep.test.js.map +1 -0
  74. package/dist/__tests__/agents/reasonNextTaskStep.test.js +284 -0
  75. package/dist/__tests__/agents/reasonNextTaskStep.test.js.map +1 -0
  76. package/dist/__tests__/agents/resolveAgentTargetClassification.test.js +170 -0
  77. package/dist/__tests__/agents/resolveAgentTargetClassification.test.js.map +1 -0
  78. package/dist/__tests__/agents/resolveProgressState.test.js +526 -0
  79. package/dist/__tests__/agents/resolveProgressState.test.js.map +1 -0
  80. package/dist/__tests__/agents/resumeCheckpoint.test.js +50 -0
  81. package/dist/__tests__/agents/resumeCheckpoint.test.js.map +1 -0
  82. package/dist/__tests__/agents/routingDecisionStep.test.js +134 -0
  83. package/dist/__tests__/agents/routingDecisionStep.test.js.map +1 -0
  84. package/dist/__tests__/agents/scopeClassificationStep.test.js +118 -0
  85. package/dist/__tests__/agents/scopeClassificationStep.test.js.map +1 -0
  86. package/dist/__tests__/agents/searchContext.test.js +97 -0
  87. package/dist/__tests__/agents/searchContext.test.js.map +1 -0
  88. package/dist/__tests__/agents/selectRelevantSourcesStep.test.js +73 -0
  89. package/dist/__tests__/agents/selectRelevantSourcesStep.test.js.map +1 -0
  90. package/dist/__tests__/agents/structuredOutput.test.js +45 -0
  91. package/dist/__tests__/agents/structuredOutput.test.js.map +1 -0
  92. package/dist/__tests__/agents/transformPlanGenStep.fallback.test.js +59 -0
  93. package/dist/__tests__/agents/transformPlanGenStep.fallback.test.js.map +1 -0
  94. package/dist/__tests__/agents/transformPlanGenStep.test.js +92 -0
  95. package/dist/__tests__/agents/transformPlanGenStep.test.js.map +1 -0
  96. package/dist/__tests__/agents/understandIntentStep.test.js +237 -0
  97. package/dist/__tests__/agents/understandIntentStep.test.js.map +1 -0
  98. package/dist/__tests__/agents/understandResumeContext.test.js +65 -0
  99. package/dist/__tests__/agents/understandResumeContext.test.js.map +1 -0
  100. package/dist/__tests__/agents/understandScope.test.js +227 -0
  101. package/dist/__tests__/agents/understandScope.test.js.map +1 -0
  102. package/dist/__tests__/agents/validateChangesStep.test.js +52 -0
  103. package/dist/__tests__/agents/validateChangesStep.test.js.map +1 -0
  104. package/dist/__tests__/askCommandTaskBinding.test.js +176 -0
  105. package/dist/__tests__/askCommandTaskBinding.test.js.map +1 -0
  106. package/dist/__tests__/commandVisibility.test.js +25 -0
  107. package/dist/__tests__/commandVisibility.test.js.map +1 -0
  108. package/dist/__tests__/config.devOutput.test.js +82 -0
  109. package/dist/__tests__/config.devOutput.test.js.map +1 -0
  110. package/dist/__tests__/currentContext.test.js +43 -0
  111. package/dist/__tests__/currentContext.test.js.map +1 -0
  112. package/dist/__tests__/daemonWorker.test.js +51 -0
  113. package/dist/__tests__/daemonWorker.test.js.map +1 -0
  114. package/dist/__tests__/dialogState.test.js +113 -0
  115. package/dist/__tests__/dialogState.test.js.map +1 -0
  116. package/dist/__tests__/evalCommands.test.js +506 -0
  117. package/dist/__tests__/evalCommands.test.js.map +1 -0
  118. package/dist/__tests__/evalCommandsSummary.test.js +68 -0
  119. package/dist/__tests__/evalCommandsSummary.test.js.map +1 -0
  120. package/dist/__tests__/example.test.js +1 -0
  121. package/dist/__tests__/example.test.js.map +1 -0
  122. package/dist/__tests__/factory.commitCommand.test.js +45 -0
  123. package/dist/__tests__/factory.commitCommand.test.js.map +1 -0
  124. package/dist/__tests__/factory.devOutputCommand.test.js +122 -0
  125. package/dist/__tests__/factory.devOutputCommand.test.js.map +1 -0
  126. package/dist/__tests__/factory.evalCommands.test.js +38 -0
  127. package/dist/__tests__/factory.evalCommands.test.js.map +1 -0
  128. package/dist/__tests__/factory.planCommand.test.js +35 -0
  129. package/dist/__tests__/factory.planCommand.test.js.map +1 -0
  130. package/dist/__tests__/factory.setupCommand.test.js +34 -0
  131. package/dist/__tests__/factory.setupCommand.test.js.map +1 -0
  132. package/dist/__tests__/factory.statusCommand.test.js +54 -0
  133. package/dist/__tests__/factory.statusCommand.test.js.map +1 -0
  134. package/dist/__tests__/fileRules/queryTokenRules.test.js +35 -0
  135. package/dist/__tests__/fileRules/queryTokenRules.test.js.map +1 -0
  136. package/dist/__tests__/fileRules/searchPathClassification.test.js +57 -0
  137. package/dist/__tests__/fileRules/searchPathClassification.test.js.map +1 -0
  138. package/dist/__tests__/generate.ollamaRecovery.test.js +344 -0
  139. package/dist/__tests__/generate.ollamaRecovery.test.js.map +1 -0
  140. package/dist/__tests__/index.modelStartup.test.js +24 -0
  141. package/dist/__tests__/index.modelStartup.test.js.map +1 -0
  142. package/dist/__tests__/indexCmd.test.js +85 -0
  143. package/dist/__tests__/indexCmd.test.js.map +1 -0
  144. package/dist/__tests__/indexSlashCommand.test.js +50 -0
  145. package/dist/__tests__/indexSlashCommand.test.js.map +1 -0
  146. package/dist/__tests__/ollamaService.test.js +103 -0
  147. package/dist/__tests__/ollamaService.test.js.map +1 -0
  148. package/dist/__tests__/pipeline/modules/codeTransformModule.small-file.test.js +68 -0
  149. package/dist/__tests__/pipeline/modules/codeTransformModule.small-file.test.js.map +1 -0
  150. package/dist/__tests__/pipeline/modules/commitSuggesterModule.test.js +68 -0
  151. package/dist/__tests__/pipeline/modules/commitSuggesterModule.test.js.map +1 -0
  152. package/dist/__tests__/pipeline/modules/fileSearchModule.test.js +284 -0
  153. package/dist/__tests__/pipeline/modules/fileSearchModule.test.js.map +1 -0
  154. package/dist/__tests__/pipeline/modules/finalAnswerModule.test.js +1139 -0
  155. package/dist/__tests__/pipeline/modules/finalAnswerModule.test.js.map +1 -0
  156. package/dist/__tests__/pipeline/modules/readFileModule.test.js +146 -0
  157. package/dist/__tests__/pipeline/modules/readFileModule.test.js.map +1 -0
  158. package/dist/__tests__/pipeline/modules/semanticAnalysisModule.test.js +192 -0
  159. package/dist/__tests__/pipeline/modules/semanticAnalysisModule.test.js.map +1 -0
  160. package/dist/__tests__/repoIdentity.test.js +31 -0
  161. package/dist/__tests__/repoIdentity.test.js.map +1 -0
  162. package/dist/__tests__/resumeContext.test.js +87 -0
  163. package/dist/__tests__/resumeContext.test.js.map +1 -0
  164. package/dist/__tests__/resumeState.test.js +239 -0
  165. package/dist/__tests__/resumeState.test.js.map +1 -0
  166. package/dist/__tests__/search/SearchOrchestrator.test.js +836 -0
  167. package/dist/__tests__/search/SearchOrchestrator.test.js.map +1 -0
  168. package/dist/__tests__/shellDialogUi.test.js +52 -0
  169. package/dist/__tests__/shellDialogUi.test.js.map +1 -0
  170. package/dist/__tests__/shellSession.test.js +102 -0
  171. package/dist/__tests__/shellSession.test.js.map +1 -0
  172. package/dist/__tests__/statusOwner.test.js +215 -0
  173. package/dist/__tests__/statusOwner.test.js.map +1 -0
  174. package/dist/__tests__/testing/contextEval.test.js +244 -0
  175. package/dist/__tests__/testing/contextEval.test.js.map +1 -0
  176. package/dist/__tests__/testing/harnessArtifacts.test.js +124 -0
  177. package/dist/__tests__/testing/harnessArtifacts.test.js.map +1 -0
  178. package/dist/__tests__/testing/llmTraceSession.test.js +67 -0
  179. package/dist/__tests__/testing/llmTraceSession.test.js.map +1 -0
  180. package/dist/__tests__/testing/registerDevCliCommands.test.js +35 -0
  181. package/dist/__tests__/testing/registerDevCliCommands.test.js.map +1 -0
  182. package/dist/__tests__/testing/runDiagnosis.test.js +159 -0
  183. package/dist/__tests__/testing/runDiagnosis.test.js.map +1 -0
  184. package/dist/__tests__/testing/runtimeLogReader.test.js +66 -0
  185. package/dist/__tests__/testing/runtimeLogReader.test.js.map +1 -0
  186. package/dist/__tests__/testing/testCommands.test.js +53 -0
  187. package/dist/__tests__/testing/testCommands.test.js.map +1 -0
  188. package/dist/__tests__/utils/compileSearchQuery.test.js +38 -0
  189. package/dist/__tests__/utils/compileSearchQuery.test.js.map +1 -0
  190. package/dist/__tests__/utils/consolePresentation.test.js +105 -0
  191. package/dist/__tests__/utils/consolePresentation.test.js.map +1 -0
  192. package/dist/__tests__/utils/extractFileReferences.test.js +41 -0
  193. package/dist/__tests__/utils/extractFileReferences.test.js.map +1 -0
  194. package/dist/__tests__/utils/log.test.js +34 -0
  195. package/dist/__tests__/utils/log.test.js.map +1 -0
  196. package/dist/__tests__/utils/runtimeLogger.test.js +200 -0
  197. package/dist/__tests__/utils/runtimeLogger.test.js.map +1 -0
  198. package/dist/__tests__/utils/spinner.test.js +31 -0
  199. package/dist/__tests__/utils/spinner.test.js.map +1 -0
  200. package/dist/__tests__/utils/verifyFocusPreference.test.js +41 -0
  201. package/dist/__tests__/utils/verifyFocusPreference.test.js.map +1 -0
  202. package/dist/agent/actions/index.js +301 -0
  203. package/dist/agent/actions/index.js.map +1 -0
  204. package/dist/agent/actions/normalize.js +360 -0
  205. package/dist/agent/actions/normalize.js.map +1 -0
  206. package/dist/agent/actions/schemas.js +129 -0
  207. package/dist/agent/actions/schemas.js.map +1 -0
  208. package/dist/agent/evidence/index.js +320 -0
  209. package/dist/agent/evidence/index.js.map +1 -0
  210. package/dist/agent/feedback/index.js +187 -0
  211. package/dist/agent/feedback/index.js.map +1 -0
  212. package/dist/agent/finalization/index.js +35 -0
  213. package/dist/agent/finalization/index.js.map +1 -0
  214. package/dist/agent/index.js +126 -0
  215. package/dist/agent/index.js.map +1 -0
  216. package/dist/agent/logging/index.js +350 -0
  217. package/dist/agent/logging/index.js.map +1 -0
  218. package/dist/agent/persistence/boot.js +58 -0
  219. package/dist/agent/persistence/boot.js.map +1 -0
  220. package/dist/agent/persistence/currentTask.js +36 -0
  221. package/dist/agent/persistence/currentTask.js.map +1 -0
  222. package/dist/agent/persistence/hydrate.js +42 -0
  223. package/dist/agent/persistence/hydrate.js.map +1 -0
  224. package/dist/agent/persistence/index.js +15 -0
  225. package/dist/agent/persistence/index.js.map +1 -0
  226. package/dist/agent/persistence/snapshots.js +97 -0
  227. package/dist/agent/persistence/snapshots.js.map +1 -0
  228. package/dist/agent/persistence/steps.js +95 -0
  229. package/dist/agent/persistence/steps.js.map +1 -0
  230. package/dist/agent/persistence/tasks.js +195 -0
  231. package/dist/agent/persistence/tasks.js.map +1 -0
  232. package/dist/agent/persistence/turns.js +92 -0
  233. package/dist/agent/persistence/turns.js.map +1 -0
  234. package/dist/agent/policy/ambiguityResolution.js +226 -0
  235. package/dist/agent/policy/ambiguityResolution.js.map +1 -0
  236. package/dist/agent/policy/contracts.js +2 -0
  237. package/dist/agent/policy/contracts.js.map +1 -0
  238. package/dist/agent/policy/coveragePolicy.js +309 -0
  239. package/dist/agent/policy/coveragePolicy.js.map +1 -0
  240. package/dist/agent/policy/endDecisionPolicy.js +31 -0
  241. package/dist/agent/policy/endDecisionPolicy.js.map +1 -0
  242. package/dist/agent/policy/index.js +344 -0
  243. package/dist/agent/policy/index.js.map +1 -0
  244. package/dist/agent/policy/loopReview.js +778 -0
  245. package/dist/agent/policy/loopReview.js.map +1 -0
  246. package/dist/agent/policy/readinessPolicy.js +108 -0
  247. package/dist/agent/policy/readinessPolicy.js.map +1 -0
  248. package/dist/agent/policy/resolutionPipeline.js +356 -0
  249. package/dist/agent/policy/resolutionPipeline.js.map +1 -0
  250. package/dist/agent/policy/targetClassification.js +33 -0
  251. package/dist/agent/policy/targetClassification.js.map +1 -0
  252. package/dist/agent/prompting/actionChoice.js +90 -0
  253. package/dist/agent/prompting/actionChoice.js.map +1 -0
  254. package/dist/agent/prompting/finalAnswer.js +38 -0
  255. package/dist/agent/prompting/finalAnswer.js.map +1 -0
  256. package/dist/agent/prompting/index.js +14 -0
  257. package/dist/agent/prompting/index.js.map +1 -0
  258. package/dist/agent/prompting/plan.js +59 -0
  259. package/dist/agent/prompting/plan.js.map +1 -0
  260. package/dist/agent/prompting/transform.js +175 -0
  261. package/dist/agent/prompting/transform.js.map +1 -0
  262. package/dist/agent/prompting/understand.js +70 -0
  263. package/dist/agent/prompting/understand.js.map +1 -0
  264. package/dist/agent/read/freshness.js +29 -0
  265. package/dist/agent/read/freshness.js.map +1 -0
  266. package/dist/agent/read/fullReadPrompt.js +43 -0
  267. package/dist/agent/read/fullReadPrompt.js.map +1 -0
  268. package/dist/agent/read/index.js +140 -0
  269. package/dist/agent/read/index.js.map +1 -0
  270. package/dist/agent/read/persistence.js +88 -0
  271. package/dist/agent/read/persistence.js.map +1 -0
  272. package/dist/agent/read/summarizeReadEvidence.js +733 -0
  273. package/dist/agent/read/summarizeReadEvidence.js.map +1 -0
  274. package/dist/agent/read/targetResolution.js +126 -0
  275. package/dist/agent/read/targetResolution.js.map +1 -0
  276. package/dist/agent/resume/checkpoint.js +41 -0
  277. package/dist/agent/resume/checkpoint.js.map +1 -0
  278. package/dist/agent/runtime/lifecycle.js +67 -0
  279. package/dist/agent/runtime/lifecycle.js.map +1 -0
  280. package/dist/agent/runtime/progress.js +178 -0
  281. package/dist/agent/runtime/progress.js.map +1 -0
  282. package/dist/agent/runtime/runAgentLoop.js +402 -0
  283. package/dist/agent/runtime/runAgentLoop.js.map +1 -0
  284. package/dist/agent/runtime/runAgentPlanOnly.js +127 -0
  285. package/dist/agent/runtime/runAgentPlanOnly.js.map +1 -0
  286. package/dist/agent/runtime/understand.js +336 -0
  287. package/dist/agent/runtime/understand.js.map +1 -0
  288. package/dist/agent/search/batchPlanner.js +274 -0
  289. package/dist/agent/search/batchPlanner.js.map +1 -0
  290. package/dist/agent/search/candidateRetentionPolicy.js +184 -0
  291. package/dist/agent/search/candidateRetentionPolicy.js.map +1 -0
  292. package/dist/agent/search/directory.js +51 -0
  293. package/dist/agent/search/directory.js.map +1 -0
  294. package/dist/agent/search/exactTarget.js +151 -0
  295. package/dist/agent/search/exactTarget.js.map +1 -0
  296. package/dist/agent/search/fragment.js +110 -0
  297. package/dist/agent/search/fragment.js.map +1 -0
  298. package/dist/agent/search/index.js +166 -0
  299. package/dist/agent/search/index.js.map +1 -0
  300. package/dist/agent/search/laneClassifier.js +119 -0
  301. package/dist/agent/search/laneClassifier.js.map +1 -0
  302. package/dist/agent/search/limits.js +10 -0
  303. package/dist/agent/search/limits.js.map +1 -0
  304. package/dist/agent/search/ranking.js +22 -0
  305. package/dist/agent/search/ranking.js.map +1 -0
  306. package/dist/agent/search/regex.js +83 -0
  307. package/dist/agent/search/regex.js.map +1 -0
  308. package/dist/agent/search/routePolicy.js +11 -0
  309. package/dist/agent/search/routePolicy.js.map +1 -0
  310. package/dist/agent/search/searchContext.js +128 -0
  311. package/dist/agent/search/searchContext.js.map +1 -0
  312. package/dist/agent/search/semantic.js +113 -0
  313. package/dist/agent/search/semantic.js.map +1 -0
  314. package/dist/agent/search/semanticIndexSearch.js +202 -0
  315. package/dist/agent/search/semanticIndexSearch.js.map +1 -0
  316. package/dist/agent/search/shared.js +283 -0
  317. package/dist/agent/search/shared.js.map +1 -0
  318. package/dist/agent/search/shell.js +202 -0
  319. package/dist/agent/search/shell.js.map +1 -0
  320. package/dist/agent/search/snippetEvidence.js +57 -0
  321. package/dist/agent/search/snippetEvidence.js.map +1 -0
  322. package/dist/agent/search/types.js +2 -0
  323. package/dist/agent/search/types.js.map +1 -0
  324. package/dist/agent/state/index.js +99 -0
  325. package/dist/agent/state/index.js.map +1 -0
  326. package/dist/agent/state/memory.js +56 -0
  327. package/dist/agent/state/memory.js.map +1 -0
  328. package/dist/agent/structuredOutput/index.js +28 -0
  329. package/dist/agent/structuredOutput/index.js.map +1 -0
  330. package/dist/agent/tools/index.js +199 -0
  331. package/dist/agent/tools/index.js.map +1 -0
  332. package/dist/agent/transform/index.js +519 -0
  333. package/dist/agent/transform/index.js.map +1 -0
  334. package/dist/agent/transform/syntax.js +49 -0
  335. package/dist/agent/transform/syntax.js.map +1 -0
  336. package/dist/agent/types.js +20 -0
  337. package/dist/agent/types.js.map +1 -0
  338. package/dist/agents/actionRegistry.js +114 -0
  339. package/dist/agents/actionRegistry.js.map +1 -0
  340. package/dist/agents/agent.js +5 -0
  341. package/dist/agents/agent.js.map +1 -0
  342. package/dist/agents/agentActions.js +5 -0
  343. package/dist/agents/agentActions.js.map +1 -0
  344. package/dist/agents/agentEvidence.js +5 -0
  345. package/dist/agents/agentEvidence.js.map +1 -0
  346. package/dist/agents/agentFeedback.js +5 -0
  347. package/dist/agents/agentFeedback.js.map +1 -0
  348. package/dist/agents/agentLogging.js +5 -0
  349. package/dist/agents/agentLogging.js.map +1 -0
  350. package/dist/agents/agentLoop.js +5 -0
  351. package/dist/agents/agentLoop.js.map +1 -0
  352. package/dist/agents/agentMemory.js +5 -0
  353. package/dist/agents/agentMemory.js.map +1 -0
  354. package/dist/agents/agentPlanMode.js +5 -0
  355. package/dist/agents/agentPlanMode.js.map +1 -0
  356. package/dist/agents/agentPolicyState.js +5 -0
  357. package/dist/agents/agentPolicyState.js.map +1 -0
  358. package/dist/agents/agentProgress.js +93 -0
  359. package/dist/agents/agentProgress.js.map +1 -0
  360. package/dist/agents/agentSchemas.js +5 -0
  361. package/dist/agents/agentSchemas.js.map +1 -0
  362. package/dist/agents/agentSearchScoring.js +5 -0
  363. package/dist/agents/agentSearchScoring.js.map +1 -0
  364. package/dist/agents/agentStateMachine.js +5 -0
  365. package/dist/agents/agentStateMachine.js.map +1 -0
  366. package/dist/agents/agentTools.js +5 -0
  367. package/dist/agents/agentTools.js.map +1 -0
  368. package/dist/agents/agentTypes.js +5 -0
  369. package/dist/agents/agentTypes.js.map +1 -0
  370. package/dist/agents/agentUnderstand.js +5 -0
  371. package/dist/agents/agentUnderstand.js.map +1 -0
  372. package/dist/agents/analysisPlanGenStep.js +194 -17
  373. package/dist/agents/analysisPlanGenStep.js.map +1 -0
  374. package/dist/agents/answerOnlyCompletion.js +32 -0
  375. package/dist/agents/answerOnlyCompletion.js.map +1 -0
  376. package/dist/agents/collaboratorStep.js +1 -0
  377. package/dist/agents/collaboratorStep.js.map +1 -0
  378. package/dist/agents/decideNextAction.js +444 -0
  379. package/dist/agents/decideNextAction.js.map +1 -0
  380. package/dist/agents/deriveFocusFromSearchStep.js +83 -0
  381. package/dist/agents/deriveFocusFromSearchStep.js.map +1 -0
  382. package/dist/agents/evidenceVerifierStep.js +104 -13
  383. package/dist/agents/evidenceVerifierStep.js.map +1 -0
  384. package/dist/agents/fileCheckStep.js +381 -12
  385. package/dist/agents/fileCheckStep.js.map +1 -0
  386. package/dist/agents/giveUpEvaluatorStep.js +63 -0
  387. package/dist/agents/giveUpEvaluatorStep.js.map +1 -0
  388. package/dist/agents/guardPolicy.js +20 -0
  389. package/dist/agents/guardPolicy.js.map +1 -0
  390. package/dist/agents/guards/executionPolicyResolver.js +165 -0
  391. package/dist/agents/guards/executionPolicyResolver.js.map +1 -0
  392. package/dist/agents/guards/guardState.js +195 -0
  393. package/dist/agents/guards/guardState.js.map +1 -0
  394. package/dist/agents/guards/resolveProgressState.js +403 -0
  395. package/dist/agents/guards/resolveProgressState.js.map +1 -0
  396. package/dist/agents/infoPlanGenStep.js +66 -8
  397. package/dist/agents/infoPlanGenStep.js.map +1 -0
  398. package/dist/agents/integrateFeedbackStep.js +1 -0
  399. package/dist/agents/integrateFeedbackStep.js.map +1 -0
  400. package/dist/agents/iterationFileSelector.js +8 -7
  401. package/dist/agents/iterationFileSelector.js.map +1 -0
  402. package/dist/agents/mainAgentActivityLog.js +85 -0
  403. package/dist/agents/mainAgentActivityLog.js.map +1 -0
  404. package/dist/agents/mainAgentHeuristics.js +173 -0
  405. package/dist/agents/mainAgentHeuristics.js.map +1 -0
  406. package/dist/agents/mainAgentVerify.js +159 -0
  407. package/dist/agents/mainAgentVerify.js.map +1 -0
  408. package/dist/agents/objectiveEvaluatorStep.js +103 -0
  409. package/dist/agents/objectiveEvaluatorStep.js.map +1 -0
  410. package/dist/agents/outerLoopRecoveryEvaluator.js +108 -0
  411. package/dist/agents/outerLoopRecoveryEvaluator.js.map +1 -0
  412. package/dist/agents/readinessGateStep.js +95 -9
  413. package/dist/agents/readinessGateStep.js.map +1 -0
  414. package/dist/agents/reasonNextStep.js +9 -8
  415. package/dist/agents/reasonNextStep.js.map +1 -0
  416. package/dist/agents/reasonNextTaskStep.js +267 -144
  417. package/dist/agents/reasonNextTaskStep.js.map +1 -0
  418. package/dist/agents/researchPlanGenStep.js +61 -25
  419. package/dist/agents/researchPlanGenStep.js.map +1 -0
  420. package/dist/agents/resolveAgentTargetClassification.js +5 -0
  421. package/dist/agents/resolveAgentTargetClassification.js.map +1 -0
  422. package/dist/agents/resolveExecutionModeStep.js +1 -0
  423. package/dist/agents/resolveExecutionModeStep.js.map +1 -0
  424. package/dist/agents/resolveExplicitTargetsStep.js +74 -0
  425. package/dist/agents/resolveExplicitTargetsStep.js.map +1 -0
  426. package/dist/agents/routingDecisionStep.js +58 -11
  427. package/dist/agents/routingDecisionStep.js.map +1 -0
  428. package/dist/agents/scopeClassificationStep.js +66 -3
  429. package/dist/agents/scopeClassificationStep.js.map +1 -0
  430. package/dist/agents/selectRelevantSourcesStep.js +13 -5
  431. package/dist/agents/selectRelevantSourcesStep.js.map +1 -0
  432. package/dist/agents/structuralPreloadStep.js +3 -4
  433. package/dist/agents/structuralPreloadStep.js.map +1 -0
  434. package/dist/agents/transformPlanGenStep.js +105 -18
  435. package/dist/agents/transformPlanGenStep.js.map +1 -0
  436. package/dist/agents/understandIntentStep.js +237 -17
  437. package/dist/agents/understandIntentStep.js.map +1 -0
  438. package/dist/agents/validateChangesStep.js +16 -2
  439. package/dist/agents/validateChangesStep.js.map +1 -0
  440. package/dist/agents/writeFileStep.js +1 -0
  441. package/dist/agents/writeFileStep.js.map +1 -0
  442. package/dist/commands/AskCmd.js +139 -44
  443. package/dist/commands/AskCmd.js.map +1 -0
  444. package/dist/commands/BackupCmd.js +1 -0
  445. package/dist/commands/BackupCmd.js.map +1 -0
  446. package/dist/commands/ChangeLogUpdateCmd.js +1 -0
  447. package/dist/commands/ChangeLogUpdateCmd.js.map +1 -0
  448. package/dist/commands/CommitSuggesterCmd.js +55 -13
  449. package/dist/commands/CommitSuggesterCmd.js.map +1 -0
  450. package/dist/commands/DaemonCmd.js +52 -14
  451. package/dist/commands/DaemonCmd.js.map +1 -0
  452. package/dist/commands/DeleteIndex.js +1 -0
  453. package/dist/commands/DeleteIndex.js.map +1 -0
  454. package/dist/commands/EvalReportCmd.js +374 -0
  455. package/dist/commands/EvalReportCmd.js.map +1 -0
  456. package/dist/commands/FindCmd.js +1 -0
  457. package/dist/commands/FindCmd.js.map +1 -0
  458. package/dist/commands/GitCmd.js +1 -0
  459. package/dist/commands/GitCmd.js.map +1 -0
  460. package/dist/commands/IndexCmd.js +11 -79
  461. package/dist/commands/IndexCmd.js.map +1 -0
  462. package/dist/commands/InspectCmd.js +1 -0
  463. package/dist/commands/InspectCmd.js.map +1 -0
  464. package/dist/commands/ModelCmd.js +24 -0
  465. package/dist/commands/ModelCmd.js.map +1 -0
  466. package/dist/commands/ReadlineSingleton.js +1 -0
  467. package/dist/commands/ReadlineSingleton.js.map +1 -0
  468. package/dist/commands/ResetDbCmd.js +18 -1
  469. package/dist/commands/ResetDbCmd.js.map +1 -0
  470. package/dist/commands/ReviewCmd.js +1 -0
  471. package/dist/commands/ReviewCmd.js.map +1 -0
  472. package/dist/commands/StatusCmd.js +22 -0
  473. package/dist/commands/StatusCmd.js.map +1 -0
  474. package/dist/commands/StopDaemonCmd.js +1 -0
  475. package/dist/commands/StopDaemonCmd.js.map +1 -0
  476. package/dist/commands/SummaryCmd.js +1 -0
  477. package/dist/commands/SummaryCmd.js.map +1 -0
  478. package/dist/commands/SwitchCmd.js +9 -15
  479. package/dist/commands/SwitchCmd.js.map +1 -0
  480. package/dist/commands/TasksCmd.js +142 -57
  481. package/dist/commands/TasksCmd.js.map +1 -0
  482. package/dist/commands/TestCmd.js +66 -0
  483. package/dist/commands/TestCmd.js.map +1 -0
  484. package/dist/commands/WorkflowCmd.js +1 -0
  485. package/dist/commands/WorkflowCmd.js.map +1 -0
  486. package/dist/commands/commandVisibility.js +27 -0
  487. package/dist/commands/commandVisibility.js.map +1 -0
  488. package/dist/commands/evalCommands.js +1337 -0
  489. package/dist/commands/evalCommands.js.map +1 -0
  490. package/dist/commands/factory.js +206 -38
  491. package/dist/commands/factory.js.map +1 -0
  492. package/dist/config.js +62 -11
  493. package/dist/config.js.map +1 -0
  494. package/dist/constants.js +21 -3
  495. package/dist/constants.js.map +1 -0
  496. package/dist/context.js +33 -32
  497. package/dist/context.js.map +1 -0
  498. package/dist/daemon/daemonQueues.js +1 -20
  499. package/dist/daemon/daemonQueues.js.map +1 -0
  500. package/dist/daemon/daemonWorker.js +26 -37
  501. package/dist/daemon/daemonWorker.js.map +1 -0
  502. package/dist/daemon/generateSummaries.js +1 -0
  503. package/dist/daemon/generateSummaries.js.map +1 -0
  504. package/dist/daemon/runFolderCapsuleBatch.js +1 -0
  505. package/dist/daemon/runFolderCapsuleBatch.js.map +1 -0
  506. package/dist/daemon/runIndexingBatch.js +1 -0
  507. package/dist/daemon/runIndexingBatch.js.map +1 -0
  508. package/dist/daemon/runKgBatch.js +9 -1
  509. package/dist/daemon/runKgBatch.js.map +1 -0
  510. package/dist/db/backup.js +1 -0
  511. package/dist/db/backup.js.map +1 -0
  512. package/dist/db/client.js +18 -3
  513. package/dist/db/client.js.map +1 -0
  514. package/dist/db/fileIndex.js +110 -152
  515. package/dist/db/fileIndex.js.map +1 -0
  516. package/dist/db/functionExtractors/extractFromJava.js +1 -0
  517. package/dist/db/functionExtractors/extractFromJava.js.map +1 -0
  518. package/dist/db/functionExtractors/extractFromJs.js +1 -0
  519. package/dist/db/functionExtractors/extractFromJs.js.map +1 -0
  520. package/dist/db/functionExtractors/extractFromTs.js +1 -0
  521. package/dist/db/functionExtractors/extractFromTs.js.map +1 -0
  522. package/dist/db/functionExtractors/extractFromXML.js +1 -0
  523. package/dist/db/functionExtractors/extractFromXML.js.map +1 -0
  524. package/dist/db/functionExtractors/index.js +1 -0
  525. package/dist/db/functionExtractors/index.js.map +1 -0
  526. package/dist/db/functionIndex.js +9 -0
  527. package/dist/db/functionIndex.js.map +1 -0
  528. package/dist/db/schema.js +314 -99
  529. package/dist/db/schema.js.map +1 -0
  530. package/dist/db/sqlTemplates.js +1 -0
  531. package/dist/db/sqlTemplates.js.map +1 -0
  532. package/dist/fileRules/builtins.js +1 -0
  533. package/dist/fileRules/builtins.js.map +1 -0
  534. package/dist/fileRules/classifyFile.js +1 -0
  535. package/dist/fileRules/classifyFile.js.map +1 -0
  536. package/dist/fileRules/codeAllowedExtensions.js +1 -0
  537. package/dist/fileRules/codeAllowedExtensions.js.map +1 -0
  538. package/dist/fileRules/detectFileType.js +1 -0
  539. package/dist/fileRules/detectFileType.js.map +1 -0
  540. package/dist/fileRules/fileClassifier.js +1 -0
  541. package/dist/fileRules/fileClassifier.js.map +1 -0
  542. package/dist/fileRules/fileExceptions.js +1 -0
  543. package/dist/fileRules/fileExceptions.js.map +1 -0
  544. package/dist/fileRules/ignoredExtensions.js +1 -0
  545. package/dist/fileRules/ignoredExtensions.js.map +1 -0
  546. package/dist/fileRules/ignoredPaths.js +48 -5
  547. package/dist/fileRules/ignoredPaths.js.map +1 -0
  548. package/dist/fileRules/queryTokenRules.js +176 -0
  549. package/dist/fileRules/queryTokenRules.js.map +1 -0
  550. package/dist/fileRules/searchPathClassification.js +58 -0
  551. package/dist/fileRules/searchPathClassification.js.map +1 -0
  552. package/dist/fileRules/shouldIgnoreFiles.js +1 -0
  553. package/dist/fileRules/shouldIgnoreFiles.js.map +1 -0
  554. package/dist/fileRules/stopWords.js +9 -0
  555. package/dist/fileRules/stopWords.js.map +1 -0
  556. package/dist/fileRules/wellKnownRepoFiles.js +1 -0
  557. package/dist/fileRules/wellKnownRepoFiles.js.map +1 -0
  558. package/dist/git/commitSummary.js +227 -0
  559. package/dist/git/commitSummary.js.map +1 -0
  560. package/dist/github/api.js +1 -0
  561. package/dist/github/api.js.map +1 -0
  562. package/dist/github/auth.js +1 -0
  563. package/dist/github/auth.js.map +1 -0
  564. package/dist/github/github.js +1 -0
  565. package/dist/github/github.js.map +1 -0
  566. package/dist/github/githubAuthCheck.js +1 -0
  567. package/dist/github/githubAuthCheck.js.map +1 -0
  568. package/dist/github/postComments.js +1 -0
  569. package/dist/github/postComments.js.map +1 -0
  570. package/dist/github/repo.js +15 -24
  571. package/dist/github/repo.js.map +1 -0
  572. package/dist/github/token.js +1 -0
  573. package/dist/github/token.js.map +1 -0
  574. package/dist/github/types.js +1 -0
  575. package/dist/github/types.js.map +1 -0
  576. package/dist/index.js +318 -37
  577. package/dist/index.js.map +1 -0
  578. package/dist/lib/generate.js +264 -20
  579. package/dist/lib/generate.js.map +1 -0
  580. package/dist/lib/generateFolderCapsules.js +1 -0
  581. package/dist/lib/generateFolderCapsules.js.map +1 -0
  582. package/dist/lib/ollamaModelPolicy.js +59 -0
  583. package/dist/lib/ollamaModelPolicy.js.map +1 -0
  584. package/dist/lib/spinner.js +29 -9
  585. package/dist/lib/spinner.js.map +1 -0
  586. package/dist/modelSetup.js +25 -78
  587. package/dist/modelSetup.js.map +1 -0
  588. package/dist/pipeline/modules/changeLogModule.js +10 -1
  589. package/dist/pipeline/modules/changeLogModule.js.map +1 -0
  590. package/dist/pipeline/modules/cleanupModule.js +1 -0
  591. package/dist/pipeline/modules/cleanupModule.js.map +1 -0
  592. package/dist/pipeline/modules/codeTransformModule.js +10 -16
  593. package/dist/pipeline/modules/codeTransformModule.js.map +1 -0
  594. package/dist/pipeline/modules/commentModule.js +12 -0
  595. package/dist/pipeline/modules/commentModule.js.map +1 -0
  596. package/dist/pipeline/modules/commitSuggesterModule.js +82 -12
  597. package/dist/pipeline/modules/commitSuggesterModule.js.map +1 -0
  598. package/dist/pipeline/modules/contextReviewModule.js +12 -1
  599. package/dist/pipeline/modules/contextReviewModule.js.map +1 -0
  600. package/dist/pipeline/modules/dialogAnswerModule.js +58 -0
  601. package/dist/pipeline/modules/dialogAnswerModule.js.map +1 -0
  602. package/dist/pipeline/modules/fileSearchModule.js +5 -143
  603. package/dist/pipeline/modules/fileSearchModule.js.map +1 -0
  604. package/dist/pipeline/modules/finalAnswerModule.js +1176 -151
  605. package/dist/pipeline/modules/finalAnswerModule.js.map +1 -0
  606. package/dist/pipeline/modules/kgModule.js +18 -1
  607. package/dist/pipeline/modules/kgModule.js.map +1 -0
  608. package/dist/pipeline/modules/planAnswerModule.js +99 -0
  609. package/dist/pipeline/modules/planAnswerModule.js.map +1 -0
  610. package/dist/pipeline/modules/readFileModule.js +300 -0
  611. package/dist/pipeline/modules/readFileModule.js.map +1 -0
  612. package/dist/pipeline/modules/reviewModule.js +10 -1
  613. package/dist/pipeline/modules/reviewModule.js.map +1 -0
  614. package/dist/pipeline/modules/searchDbModule.js +159 -0
  615. package/dist/pipeline/modules/searchDbModule.js.map +1 -0
  616. package/dist/pipeline/modules/searchListDirectoryModule.js +62 -0
  617. package/dist/pipeline/modules/searchListDirectoryModule.js.map +1 -0
  618. package/dist/pipeline/modules/searchModuleShared.js +71 -0
  619. package/dist/pipeline/modules/searchModuleShared.js.map +1 -0
  620. package/dist/pipeline/modules/searchRegexModule.js +59 -0
  621. package/dist/pipeline/modules/searchRegexModule.js.map +1 -0
  622. package/dist/pipeline/modules/semanticAnalysisModule.js +185 -28
  623. package/dist/pipeline/modules/semanticAnalysisModule.js.map +1 -0
  624. package/dist/pipeline/modules/summaryModule.js +11 -1
  625. package/dist/pipeline/modules/summaryModule.js.map +1 -0
  626. package/dist/pipeline/registry/moduleRegistry.js +9 -0
  627. package/dist/pipeline/registry/moduleRegistry.js.map +1 -0
  628. package/dist/pipeline/runModulePipeline.js +1 -0
  629. package/dist/pipeline/runModulePipeline.js.map +1 -0
  630. package/dist/scripts/dbScriptSupport.js +172 -0
  631. package/dist/scripts/dbScriptSupport.js.map +1 -0
  632. package/dist/scripts/dbcheck.js +173 -267
  633. package/dist/scripts/dbcheck.js.map +1 -0
  634. package/dist/scripts/dboverview.js +161 -0
  635. package/dist/scripts/dboverview.js.map +1 -0
  636. package/dist/scripts/migrateDb.js +1 -0
  637. package/dist/scripts/migrateDb.js.map +1 -0
  638. package/dist/search/SearchOrchestrator.js +928 -0
  639. package/dist/search/SearchOrchestrator.js.map +1 -0
  640. package/dist/search/sharedRankingPolicy.js +283 -0
  641. package/dist/search/sharedRankingPolicy.js.map +1 -0
  642. package/dist/setup/reindexOwner.js +97 -0
  643. package/dist/setup/reindexOwner.js.map +1 -0
  644. package/dist/setup/setupOwner.js +100 -0
  645. package/dist/setup/setupOwner.js.map +1 -0
  646. package/dist/shell/dialogUi.js +81 -0
  647. package/dist/shell/dialogUi.js.map +1 -0
  648. package/dist/shellSession.js +126 -0
  649. package/dist/shellSession.js.map +1 -0
  650. package/dist/status/statusOwner.js +239 -0
  651. package/dist/status/statusOwner.js.map +1 -0
  652. package/dist/testing/contextEval.js +514 -0
  653. package/dist/testing/contextEval.js.map +1 -0
  654. package/dist/testing/fixtures/transform/small-file.input.js +5 -0
  655. package/dist/testing/fixtures/transform/small-file.input.js.map +1 -0
  656. package/dist/testing/harnessArtifacts.js +112 -0
  657. package/dist/testing/harnessArtifacts.js.map +1 -0
  658. package/dist/testing/llmTraceSession.js +67 -0
  659. package/dist/testing/llmTraceSession.js.map +1 -0
  660. package/dist/testing/registerDevCliCommands.js +43 -0
  661. package/dist/testing/registerDevCliCommands.js.map +1 -0
  662. package/dist/testing/runDiagnosis.js +248 -0
  663. package/dist/testing/runDiagnosis.js.map +1 -0
  664. package/dist/testing/runtimeLogReader.js +144 -0
  665. package/dist/testing/runtimeLogReader.js.map +1 -0
  666. package/dist/testing/testCommands.js +35 -303
  667. package/dist/testing/testCommands.js.map +1 -0
  668. package/dist/testing/testRegistry.js +233 -0
  669. package/dist/testing/testRegistry.js.map +1 -0
  670. package/dist/types.js +1 -0
  671. package/dist/types.js.map +1 -0
  672. package/dist/utils/buildContextualPrompt.js +26 -75
  673. package/dist/utils/buildContextualPrompt.js.map +1 -0
  674. package/dist/utils/changeLogPrompt.js +1 -0
  675. package/dist/utils/changeLogPrompt.js.map +1 -0
  676. package/dist/utils/checkModel.js +17 -92
  677. package/dist/utils/checkModel.js.map +1 -0
  678. package/dist/utils/commentMap.js +1 -0
  679. package/dist/utils/commentMap.js.map +1 -0
  680. package/dist/utils/compileSearchQuery.js +23 -9
  681. package/dist/utils/compileSearchQuery.js.map +1 -0
  682. package/dist/utils/consolePresentation.js +208 -0
  683. package/dist/utils/consolePresentation.js.map +1 -0
  684. package/dist/utils/contentUtils.js +17 -2
  685. package/dist/utils/contentUtils.js.map +1 -0
  686. package/dist/utils/debugContext.js +1 -0
  687. package/dist/utils/debugContext.js.map +1 -0
  688. package/dist/utils/dialogState.js +201 -0
  689. package/dist/utils/dialogState.js.map +1 -0
  690. package/dist/utils/editor.js +1 -0
  691. package/dist/utils/editor.js.map +1 -0
  692. package/dist/utils/executionEvidence.js +50 -0
  693. package/dist/utils/executionEvidence.js.map +1 -0
  694. package/dist/utils/extractFileReferences.js +140 -6
  695. package/dist/utils/extractFileReferences.js.map +1 -0
  696. package/dist/utils/fileEvidenceCache.js +50 -0
  697. package/dist/utils/fileEvidenceCache.js.map +1 -0
  698. package/dist/utils/fileTree.js +1 -0
  699. package/dist/utils/fileTree.js.map +1 -0
  700. package/dist/utils/loadRelevantFolderCapsules.js +35 -5
  701. package/dist/utils/loadRelevantFolderCapsules.js.map +1 -0
  702. package/dist/utils/log.js +10 -1
  703. package/dist/utils/log.js.map +1 -0
  704. package/dist/utils/normalizeData.js +1 -0
  705. package/dist/utils/normalizeData.js.map +1 -0
  706. package/dist/utils/ollamaModelStatus.js +28 -0
  707. package/dist/utils/ollamaModelStatus.js.map +1 -0
  708. package/dist/utils/ollamaService.js +294 -0
  709. package/dist/utils/ollamaService.js.map +1 -0
  710. package/dist/utils/outputFormatter.js +1 -0
  711. package/dist/utils/outputFormatter.js.map +1 -0
  712. package/dist/utils/parseTaggedContent.js +1 -0
  713. package/dist/utils/parseTaggedContent.js.map +1 -0
  714. package/dist/utils/planActions.js +27 -46
  715. package/dist/utils/planActions.js.map +1 -0
  716. package/dist/utils/promptBuilderHelper.js +1 -0
  717. package/dist/utils/promptBuilderHelper.js.map +1 -0
  718. package/dist/utils/promptLogHelper.js +29 -13
  719. package/dist/utils/promptLogHelper.js.map +1 -0
  720. package/dist/utils/queryAnchors.js +71 -0
  721. package/dist/utils/queryAnchors.js.map +1 -0
  722. package/dist/utils/repoIdentity.js +82 -0
  723. package/dist/utils/repoIdentity.js.map +1 -0
  724. package/dist/utils/repoKey.js +1 -0
  725. package/dist/utils/repoKey.js.map +1 -0
  726. package/dist/utils/resolveTargetsToFiles.js +1 -0
  727. package/dist/utils/resolveTargetsToFiles.js.map +1 -0
  728. package/dist/utils/resumeContext.js +219 -0
  729. package/dist/utils/resumeContext.js.map +1 -0
  730. package/dist/utils/resumeState.js +310 -0
  731. package/dist/utils/resumeState.js.map +1 -0
  732. package/dist/utils/rollingPlan.js +118 -0
  733. package/dist/utils/rollingPlan.js.map +1 -0
  734. package/dist/utils/runQueryWithDaemonControl.js +11 -3
  735. package/dist/utils/runQueryWithDaemonControl.js.map +1 -0
  736. package/dist/utils/runtimeLogger.js +252 -0
  737. package/dist/utils/runtimeLogger.js.map +1 -0
  738. package/dist/utils/sanitizeQuery.js +1 -0
  739. package/dist/utils/sanitizeQuery.js.map +1 -0
  740. package/dist/utils/sharedUtils.js +1 -0
  741. package/dist/utils/sharedUtils.js.map +1 -0
  742. package/dist/utils/sleep.js +1 -0
  743. package/dist/utils/sleep.js.map +1 -0
  744. package/dist/utils/splitCodeIntoChunk.js +1 -0
  745. package/dist/utils/splitCodeIntoChunk.js.map +1 -0
  746. package/dist/utils/time.js +66 -0
  747. package/dist/utils/time.js.map +1 -0
  748. package/dist/utils/verifyFocusPreference.js +107 -0
  749. package/dist/utils/verifyFocusPreference.js.map +1 -0
  750. package/dist/utils/vscode.js +1 -0
  751. package/dist/utils/vscode.js.map +1 -0
  752. package/dist/workflow/workflowResolver.js +1 -0
  753. package/dist/workflow/workflowResolver.js.map +1 -0
  754. package/dist/workflow/workflowRunner.js +1 -0
  755. package/dist/workflow/workflowRunner.js.map +1 -0
  756. package/package.json +3 -3
  757. package/dist/agents/MainAgent.js +0 -1886
  758. package/dist/agents/contextReviewStep.js +0 -101
  759. package/dist/agents/finalPlanGenStep.js +0 -107
  760. package/dist/agents/structuralAnalysisStep.js +0 -46
  761. package/dist/agents/validationAnalysisStep.js +0 -87
  762. package/dist/pipeline/modules/chunkManagerModule.js +0 -24
  763. package/dist/pipeline/modules/cleanGeneratedTestsModule.js +0 -33
  764. package/dist/pipeline/modules/fileReaderModule.js +0 -72
  765. package/dist/pipeline/modules/gatherInfoModule.js +0 -181
  766. package/dist/pipeline/modules/generateTestsModule.js +0 -68
  767. package/dist/pipeline/modules/preserveCodeModule.js +0 -195
  768. package/dist/pipeline/modules/refactorModule.js +0 -40
  769. package/dist/pipeline/modules/repairTestsModule.js +0 -48
  770. package/dist/pipeline/modules/runTestsModule.js +0 -37
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/commands/factory.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,8BAA8B,EAAE,MAAM,8BAA8B,CAAC;AAC9E,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACxE,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC9G,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,yBAAyB,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChI,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,yBAAyB,EAAE,MAAM,uCAAuC,CAAC;AAClF,OAAO,EAAE,sBAAsB,EAAE,MAAM,sCAAsC,CAAC;AAC9E,OAAO,EAAE,4BAA4B,EAAE,MAAM,0BAA0B,CAAC;AACxE,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AACvE,OAAO,EAAE,iCAAiC,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC5F,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAE3E,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;AAClD,MAAM,qBAAqB,GAAG,oBAAoB,EAAE,CAAC;AAErD,SAAS,qBAAqB,CAAC,MAAe;IAC1C,MAAM;SACD,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,8CAA8C,CAAC;SAC3D,MAAM,CAAC,KAAK,IAAI,EAAE;QACnB,MAAM,WAAW,CAAC,KAAK,IAAI,EAAE;YACzB,MAAM,oBAAoB,EAAE,CAAC;QACjC,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;AACP,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAA2B;IACzD,IAAI,CAAC;QACD,MAAM,EAAE,GAAG,MAAM,aAAa,EAAE,CAAC;QACjC,IAAI,CAAC,EAAE;YAAE,OAAO;QAChB,MAAM,MAAM,EAAE,CAAC;IACnB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC5D,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,MAA2B;IAChE,IAAI,CAAC;QACD,iCAAiC,EAAE,CAAC;QACpC,MAAM,MAAM,EAAE,CAAC;IACnB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC5D,CAAC;AACL,CAAC;AAED,MAAM,UAAU,aAAa;IACzB,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAChC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,eAAe,EAAE,4BAA4B,CAAC,CAAC;IAEpE,kDAAkD;IAClD,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;QACxB,MAAM,eAAe,EAAE,CAAC;IAC5B,CAAC,CAAC;IACF,GAAG;SACE,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,uDAAuD,CAAC;SACpE,MAAM,CAAC,QAAQ,CAAC,CAAC;IACtB,GAAG;SACE,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,wBAAwB,CAAC;SACrC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACtB,GAAG;SACE,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,4DAA4D,CAAC;SACzE,MAAM,CAAC,KAAK,IAAI,EAAE;QACf,MAAM,iBAAiB,EAAE,CAAC;IAC9B,CAAC,CAAC,CAAC;IAGP,GAAG;SACE,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,sCAAsC,CAAC;SACnD,MAAM,CAAC,eAAe,CAAC,CAAC;IAE7B,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,yBAAyB,CAAC,CAAC;IACxE,IAAI;SACC,OAAO,CAAC,2BAA2B,CAAC;SACpC,WAAW,CAAC,qBAAqB,CAAC;SAClC,MAAM,CAAC,KAAK,EAAE,EAAU,EAAE,KAAgB,EAAE,EAAE;QAC3C,MAAM,WAAW,CAAC,KAAK,IAAI,EAAE;YACzB,MAAM,iBAAiB,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IACP,IAAI;SACC,OAAO,CAAC,WAAW,CAAC;SACpB,WAAW,CAAC,2BAA2B,CAAC;SACxC,MAAM,CAAC,KAAK,EAAE,EAAU,EAAE,EAAE;QACzB,MAAM,WAAW,CAAC,KAAK,IAAI,EAAE;YACzB,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IACP,IAAI;SACC,OAAO,CAAC,WAAW,CAAC;SACpB,WAAW,CAAC,iDAAiD,CAAC;SAC9D,MAAM,CAAC,KAAK,EAAE,EAAU,EAAE,EAAE;QACzB,MAAM,WAAW,CAAC,KAAK,IAAI,EAAE;YACzB,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEP,GAAG;SACE,OAAO,CAAC,aAAa,CAAC;SACtB,WAAW,CAAC,yDAAyD,CAAC;SACtE,MAAM,CAAC,KAAK,IAAI,EAAE;QACf,MAAM,WAAW,CAAC,KAAK,IAAI,EAAE;YACzB,qBAAqB,CAAC,YAAY,EAAE,CAAC,CAAC;YACtC,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEP,GAAG;SACE,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,yDAAyD,CAAC;SACtE,MAAM,CAAC,KAAK,IAAI,EAAE;QACf,MAAM,WAAW,CAAC,KAAK,IAAI,EAAE;YACzB,yBAAyB,EAAE,CAAC;QAChC,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEP,IAAI,qBAAqB,EAAE,CAAC;QACxB,oBAAoB,CAAC,GAAG,EAAE,yBAAyB,CAAC,CAAC;QACrD,sBAAsB,CAAC,GAAG,EAAE,yBAAyB,CAAC,CAAC;IAC3D,CAAC;IAGD,qBAAqB,CAAC,GAAG,CAAC,CAAC;IAE3B,iDAAiD;IACjD,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC;IAE5D,IAAI,qBAAqB,EAAE,CAAC;QACxB,GAAG;aACE,OAAO,CAAC,QAAQ,CAAC;aACjB,WAAW,CAAC,sCAAsC,CAAC;aACnD,MAAM,CAAC,WAAW,EAAE,iCAAiC,EAAE,KAAK,CAAC;aAC7D,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;YACnB,MAAM,WAAW,CAAC,KAAK,IAAI,EAAE;gBACzB,MAAM,oBAAoB,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;YACjD,CAAC,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;IACX,CAAC;IAED,qBAAqB,CAAC,GAAG,CAAC,CAAC;IAE3B,GAAG;SACE,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,+CAA+C,CAAC;SAC5D,MAAM,CAAC,KAAK,IAAI,EAAE;QACf,MAAM,WAAW,CAAC,KAAK,IAAI,EAAE,GAAG,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEP,kDAAkD;IAClD,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,gCAAgC,CAAC,CAAC;IAE/E,IAAI;SACC,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,yCAAyC,CAAC;SACtD,MAAM,CAAC,KAAK,IAAI,EAAE;QACf,MAAM,WAAW,CAAC,KAAK,IAAI,EAAE;YACzB,IAAI,CAAC;gBACD,MAAM,KAAK,GAAG,MAAM,CAAC,cAAc,EAAE,CAAC;gBACtC,IAAI,CAAC,KAAK;oBAAE,OAAO,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;gBAC5D,MAAM,MAAM,GAAG,MAAM,8BAA8B,EAAE,CAAC;gBACtD,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACxB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACX,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YAC5D,CAAC;QACL,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEP,IAAI;SACC,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,yCAAyC,CAAC;SACtD,MAAM,CAAC,KAAK,IAAI,EAAE;QACf,MAAM,WAAW,CAAC,KAAK,IAAI,EAAE;YACzB,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEP,IAAI;SACC,OAAO,CAAC,KAAK,CAAC;SACd,WAAW,CAAC,kCAAkC,CAAC;SAC/C,MAAM,CAAC,KAAK,IAAI,EAAE;QACf,MAAM,WAAW,CAAC,KAAK,IAAI,EAAE;YACzB,MAAM,KAAK,GAAG,CAAC,MAAM,cAAc,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YAC9C,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;YAC7B,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEP,2CAA2C;IAC3C,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,2BAA2B,CAAC,CAAC;IAE9E,MAAM;SACD,OAAO,CAAC,mBAAmB,CAAC;SAC5B,WAAW,CAAC,sBAAsB,CAAC;SACnC,MAAM,CAAC,cAAc,EAAE,8BAA8B,CAAC;SACtD,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QAC1B,MAAM,WAAW,CAAC,KAAK,IAAI,EAAE;YACzB,MAAM,aAAa,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;YACxC,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YACxD,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;YAEpC,mEAAmE;YACnE,IAAI,aAAa,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;gBAC/C,MAAM,YAAY,GAAG,MAAM,0BAA0B,CAAC,aAAa,CAAC,CAAC;gBACrE,IAAI,YAAY,CAAC,QAAQ,EAAE,CAAC;oBACxB,OAAO,CAAC,GAAG,CAAC,sCAAsC,aAAa,EAAE,CAAC,CAAC;gBACvE,CAAC;qBAAM,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,CAAC;oBAC1B,OAAO,CAAC,GAAG,CAAC,+CAA+C,aAAa,MAAM,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC;gBACzG,CAAC;YACL,CAAC;YAED,MAAM,CAAC,IAAI,EAAE,CAAC;QAClB,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEP,MAAM;SACD,OAAO,CAAC,mBAAmB,CAAC;SAC5B,WAAW,CAAC,uDAAuD,CAAC;SACpE,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,EAAE;QAC3B,MAAM,WAAW,CAAC,KAAK,IAAI,EAAE;YACzB,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YACjD,MAAM,aAAa,GAA4B;gBAC3C,EAAE,EAAE,IAAI;gBACR,GAAG,EAAE,KAAK;gBACV,IAAI,EAAE,IAAI;gBACV,KAAK,EAAE,KAAK;aACf,CAAC;YAEF,IAAI,CAAC,CAAC,cAAc,IAAI,aAAa,CAAC,EAAE,CAAC;gBACrC,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;YAC/E,CAAC;YAED,MAAM,OAAO,GAAG,MAAM,CAAC,YAAY,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC,CAAC;YACnE,IAAI,CAAC,OAAO;gBAAE,OAAO;YAErB,OAAO,CAAC,GAAG,CAAC,2BAA2B,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;QACnF,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEP,MAAM;SACD,OAAO,CAAC,MAAM,CAAC;SACf,MAAM,CAAC,OAAO,EAAE,iBAAiB,CAAC;SAClC,WAAW,CAAC,+BAA+B,CAAC;SAC5C,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACnB,MAAM,WAAW,CAAC,KAAK,IAAI,EAAE;YACzB,IAAI,IAAI,CAAC,GAAG;gBAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;;gBAC/D,MAAM,CAAC,IAAI,EAAE,CAAC;QACvB,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEP,gCAAgC;IAChC,MAAM;SACD,OAAO,CAAC,YAAY,CAAC;SACrB,WAAW,CAAC,8CAA8C,CAAC;SAC3D,MAAM,CAAC,cAAc,EAAE,4CAA4C,CAAC;SACpE,MAAM,CAAC,aAAa,EAAE,sCAAsC,CAAC;SAC7D,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACtB,MAAM,WAAW,CAAC,KAAK,IAAI,EAAE;YACzB,MAAM,OAAO,GAA+C,EAAE,CAAC;YAE/D,IAAI,OAAO,CAAC,KAAK;gBAAE,OAAO,CAAC,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACjE,IAAI,OAAO,CAAC,IAAI;gBAAE,OAAO,CAAC,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAEnE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC;gBAC/B,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;gBAC/D,OAAO;YACX,CAAC;YAED,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YAEhC,MAAM,OAAO,GAAG,MAAM,CAAC,eAAe,EAAE,CAAC;YACzC,OAAO,CAAC,GAAG,CACP,2CAA2C,OAAO,CAAC,OAAO,sBAAsB,OAAO,CAAC,WAAW,IAAI,CAC1G,CAAC;QACN,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEP,0CAA0C;IAC1C,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,kBAAkB,CAAC,CAAC;IAEnE,KAAK;SACA,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,uBAAuB,CAAC;SACpC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,MAAM,WAAW,CAAC,eAAe,CAAC,CAAC,CAAC;IAE5D,KAAK;SACA,OAAO,CAAC,WAAW,CAAC;SACpB,WAAW,CAAC,0CAA0C,CAAC;SACvD,MAAM,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,EAAE,EAAE;QAClC,MAAM,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAC9B,MAAM,CAAC,IAAI,EAAE,CAAC;IAClB,CAAC,CAAC,CAAC;IAEP,KAAK;SACA,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,yDAAyD,CAAC;SACtE,MAAM,CAAC,KAAK,IAAI,EAAE;QACf,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;QAC/B,MAAM,GAAG,GAAG,4BAA4B,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,YAAY,CAAC;QACrE,MAAM,OAAO,GAAG,iBAAiB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAE/C,IAAI,CAAC,OAAO,EAAE,CAAC;YACX,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;YAC9D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;YACxD,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;YACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;QAED,MAAM,WAAW,CAAC,KAAK,IAAI,EAAE;YACzB,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEP,KAAK;SACA,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,4CAA4C,CAAC;SACzD,MAAM,CAAC,KAAK,IAAI,EAAE;QACf,MAAM,sBAAsB,EAAE,CAAC;IACnC,CAAC,CAAC,CAAC;IAEP,KAAK;SACA,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,0CAA0C,CAAC;SACvD,MAAM,CAAC,KAAK,IAAI,EAAE,CACf,WAAW,CAAC,KAAK,IAAI,EAAE;QACnB,MAAM,oBAAoB,EAAE,CAAC;IACjC,CAAC,CAAC,CACL,CAAC;IAEN,KAAK;SACA,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,iCAAiC,CAAC;SAC9C,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,MAAM,WAAW,CAAC,oBAAoB,CAAC,CAAC,CAAC;IAEjE,uCAAuC;IACvC,MAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,qBAAqB,CAAC,CAAC;IAEhE,EAAE;SACG,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,sBAAsB,CAAC;SACnC,MAAM,CAAC,KAAK,IAAI,EAAE;QACf,MAAM,WAAW,CAAC,KAAK,IAAI,EAAE;YACzB,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;YACtC,MAAM,UAAU,GAAG,OAAO,CAAC,SAAS,EAAE,OAAO,EAAE,cAAc,EAAE,YAAY,CAAC,CAAC;YAC7E,IAAI,CAAC;gBAAC,QAAQ,CAAC,SAAS,UAAU,GAAG,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;YAAC,CAAC;YAC/D,OAAO,GAAG,EAAE,CAAC;gBAAC,OAAO,CAAC,KAAK,CAAC,oBAAoB,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YAAC,CAAC;QAClG,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEP,EAAE;SACG,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CAAC,6BAA6B,CAAC;SAC1C,MAAM,CAAC,KAAK,IAAI,EAAE;QACf,MAAM,WAAW,CAAC,KAAK,IAAI,EAAE;YACzB,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;YACtC,MAAM,UAAU,GAAG,OAAO,CAAC,SAAS,EAAE,OAAO,EAAE,cAAc,EAAE,eAAe,CAAC,CAAC;YAChF,IAAI,CAAC;gBAAC,QAAQ,CAAC,SAAS,UAAU,GAAG,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;YAAC,CAAC;YAC/D,OAAO,GAAG,EAAE,CAAC;gBAAC,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YAAC,CAAC;QACrG,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEP,EAAE;SACG,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,qDAAqD,CAAC;SAClE,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,MAAM,kBAAkB,CAAC,aAAa,CAAC,CAAC,CAAC;IAEjE,EAAE;SACG,OAAO,CAAC,oBAAoB,CAAC;SAC7B,WAAW,CAAC,6BAA6B,CAAC;SAC1C,MAAM,CAAC,KAAK,EAAE,QAAgB,EAAE,EAAE,CAAC,MAAM,WAAW,CAAC,GAAG,EAAE,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAE9F,2CAA2C;IAC3C,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,mBAAmB,CAAC,CAAC;IAEtE,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC;IACjG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC;IAC9F,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC;IACvG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC;IACpG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC;IACnG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,iBAAiB,EAAE,kBAAkB,EAAE,IAAI,CAAC;SACrE,WAAW,CAAC,kBAAkB,CAAC;SAC/B,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAEnF,0CAA0C;IAC1C,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,gCAAgC,CAAC,CAAC;IAEjF,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,2BAA2B,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;IACnG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,WAAW,CAAC,2BAA2B,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC;IAErG,wDAAwD;IACxD,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,qBAAqB,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,MAAM,WAAW,CAAC,gBAAgB,CAAC,CAAC,CAAC;IACjH,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,WAAW,CAAC,sBAAsB,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,WAAW,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAChI,IAAI,qBAAqB,EAAE,CAAC;QACxB,GAAG,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,WAAW,CAAC,6DAA6D,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;YAC7H,MAAM,KAAK,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YAC9C,IAAI,CAAC,KAAK,EAAE,CAAC;gBACT,OAAO,CAAC,KAAK,CAAC,oEAAoE,CAAC,CAAC;gBACpF,OAAO;YACX,CAAC;YACD,MAAM,yBAAyB,CAAC,KAAK,EAAE;gBACnC,mBAAmB,EAAE,KAAK;gBAC1B,iBAAiB,EAAE,KAAK;gBACxB,OAAO,EAAE,OAAO;gBAChB,QAAQ,EAAE,IAAI;aACjB,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;IACP,CAAC;IACD,GAAG,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC,WAAW,CAAC,kCAAkC,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QACtG,MAAM,KAAK,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC9C,IAAI,CAAC,KAAK,EAAE,CAAC;YACT,OAAO,CAAC,KAAK,CAAC,kEAAkE,CAAC,CAAC;YAClF,OAAO;QACX,CAAC;QACD,MAAM,yBAAyB,CAAC,KAAK,EAAE;YACnC,mBAAmB,EAAE,KAAK;YAC1B,iBAAiB,EAAE,KAAK;YACxB,OAAO,EAAE,OAAO;SACnB,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IACH,GAAG,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC,WAAW,CAAC,mDAAmD,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QACrH,MAAM,yBAAyB,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,OAAO,GAAG,CAAC;AACf,CAAC","sourcesContent":["/**\n * Registers the public CLI commands for SCAI.\n *\n * Why this file exists:\n * - it keeps the top-level command tree in one place\n * - task and DB commands need simple wiring into built script entrypoints\n * - command descriptions here should match the real CLI behavior\n * - shell-only runtime entrypoints may need matching CLI commands for debugging\n */\nimport { Command } from 'commander';\nimport { runIndexCommand } from './IndexCmd.js';\nimport { resetDatabase } from './ResetDbCmd.js';\nimport { suggestCommitMessage } from './CommitSuggesterCmd.js';\nimport { reviewPullRequestCmd } from './ReviewCmd.js';\nimport { checkGit } from './GitCmd.js';\nimport { promptForToken } from '../github/token.js';\nimport { validateGitHubTokenAgainstRepo } from '../github/githubAuthCheck.js';\nimport { runInteractiveSwitch, runSwitchCommand } from './SwitchCmd.js';\nimport { runInteractiveDelete } from './DeleteIndex.js';\nimport { startDaemon, stopDaemon, restartDaemon, statusDaemon, unlockConfig, showLogs } from './DaemonCmd.js';\nimport { Config } from '../config.js';\nimport { fileURLToPath } from 'url';\nimport { dirname, resolve } from 'path';\nimport { execSync } from 'child_process';\nimport { runInspectCommand } from './InspectCmd.js';\nimport { runFindCommand } from './FindCmd.js';\nimport { runBackupCommand } from './BackupCmd.js';\nimport { updateContext } from '../context.js';\nimport { createRequire } from 'module';\nimport { resumeTaskCommand, runTasksCommand, showCurrentContextCommand, showTaskCommand, taskPathCommand } from './TasksCmd.js';\nimport { registerEvalCommands } from './evalCommands.js';\nimport { isDevCommandsEnabled } from './commandVisibility.js';\nimport { getRepoKeyForPath } from '../utils/contentUtils.js';\nimport { runQueryWithDaemonControl } from '../utils/runQueryWithDaemonControl.js';\nimport { registerDevCliCommands } from '../testing/registerDevCliCommands.js';\nimport { resolveCanonicalRepoIdentity } from '../utils/repoIdentity.js';\nimport { clearCurrentAgentTask } from '../agent/persistence/index.js';\nimport { getDbForRepo } from '../db/client.js';\nimport { restartModel, statusModel } from './ModelCmd.js';\nimport { unloadOllamaModelIfRunning } from '../utils/ollamaService.js';\nimport { ensureRegisteredRepoForCurrentDir, runSetupCommand } from '../setup/setupOwner.js';\nimport { showIndexStatusCommand, showStatusCommand } from './StatusCmd.js';\n\nconst require = createRequire(import.meta.url);\nconst { version } = require('../../package.json');\nconst enableDevTestCommands = isDevCommandsEnabled();\n\nfunction registerCommitCommand(target: Command): void {\n target\n .command('commit')\n .description('Suggest a commit message from staged changes')\n .action(async () => {\n await withContext(async () => {\n await suggestCommitMessage();\n });\n });\n}\n\nexport async function withContext(action: () => Promise<void>) {\n try {\n const ok = await updateContext();\n if (!ok) return;\n await action();\n } catch (err) {\n console.error(err instanceof Error ? err.message : err);\n }\n}\n\nexport async function withRegisteredRepo(action: () => Promise<void>) {\n try {\n ensureRegisteredRepoForCurrentDir();\n await action();\n } catch (err) {\n console.error(err instanceof Error ? err.message : err);\n }\n}\n\nexport function createProgram(): Command {\n const cmd = new Command('scai');\n cmd.version(version, '-v, --version', 'output the current version');\n\n // ---------------- Init commands ----------------\n const runSetup = async () => {\n await runSetupCommand();\n };\n cmd\n .command('setup')\n .description('Set up the current repository and local model runtime')\n .action(runSetup);\n cmd\n .command('init')\n .description('Alias for `scai setup`')\n .action(runSetup);\n cmd\n .command('status')\n .description('Show read-only readiness status for the current repository')\n .action(async () => {\n await showStatusCommand();\n });\n\n\n cmd\n .command(\"tasks\")\n .description(\"List and inspect collaboration tasks\")\n .action(runTasksCommand);\n\n const task = cmd.command(\"task\").description(\"Task lifecycle commands\");\n task\n .command(\"resume <id> [question...]\")\n .description(\"Resume a saved task\")\n .action(async (id: string, parts?: string[]) => {\n await withContext(async () => {\n await resumeTaskCommand(Number(id), parts?.join(\" \"));\n });\n });\n task\n .command(\"show <id>\")\n .description(\"Show details for one task\")\n .action(async (id: string) => {\n await withContext(async () => {\n showTaskCommand(Number(id));\n });\n });\n task\n .command(\"path <id>\")\n .description(\"Print the effective execution path for one task\")\n .action(async (id: string) => {\n await withContext(async () => {\n taskPathCommand(Number(id));\n });\n });\n\n cmd\n .command(\"new-context\")\n .description(\"Clear the current resumable context for the active repo\")\n .action(async () => {\n await withContext(async () => {\n clearCurrentAgentTask(getDbForRepo());\n console.log(\"✅ Cleared current task context.\");\n });\n });\n\n cmd\n .command(\"context\")\n .description(\"Show the current bound task context for the active repo\")\n .action(async () => {\n await withContext(async () => {\n showCurrentContextCommand();\n });\n });\n\n if (enableDevTestCommands) {\n registerEvalCommands(cmd, runQueryWithDaemonControl);\n registerDevCliCommands(cmd, runQueryWithDaemonControl);\n }\n\n\n registerCommitCommand(cmd);\n\n // ---------------- Git commands ----------------\n const git = cmd.command('git').description('Git utilities');\n\n if (enableDevTestCommands) {\n git\n .command('review')\n .description('Review an open pull request using AI')\n .option('-a, --all', 'Show all PRs requiring a review', false)\n .action(async (opts) => {\n await withContext(async () => {\n await reviewPullRequestCmd('main', opts.all);\n });\n });\n }\n\n registerCommitCommand(git);\n\n git\n .command('check')\n .description('Check Git working directory and branch status')\n .action(async () => {\n await withContext(async () => { checkGit(); });\n });\n\n // ---------------- Auth commands ----------------\n const auth = cmd.command('auth').description('GitHub authentication commands');\n\n auth\n .command('check')\n .description('Check if GitHub authentication is valid')\n .action(async () => {\n await withContext(async () => {\n try {\n const token = Config.getGitHubToken();\n if (!token) return console.log('❌ GitHub token not found.');\n const result = await validateGitHubTokenAgainstRepo();\n console.log(result);\n } catch (err) {\n console.error(err instanceof Error ? err.message : err);\n }\n });\n });\n\n auth\n .command('reset')\n .description('Reset GitHub authentication credentials')\n .action(async () => {\n await withContext(async () => {\n Config.setGitHubToken('');\n console.log('✅ GitHub token reset.');\n });\n });\n\n auth\n .command('set')\n .description('Set GitHub Personal Access Token')\n .action(async () => {\n await withContext(async () => {\n const token = (await promptForToken()).trim();\n Config.setGitHubToken(token);\n console.log('🔑 GitHub token set.');\n });\n });\n\n // ---------------- Config ----------------\n const config = cmd.command('config').description('Manage SCAI configuration');\n\n config\n .command('set-model <model>')\n .description('Set the model to use')\n .option('-g, --global', 'Set globally instead of repo')\n .action(async (model, opts) => {\n await withContext(async () => {\n const previousModel = Config.getModel();\n Config.setModel(model, opts.global ? 'global' : 'repo');\n const nextModel = Config.getModel();\n\n // Drop the old Ollama model only when the effective model changed.\n if (previousModel && previousModel !== nextModel) {\n const unloadResult = await unloadOllamaModelIfRunning(previousModel);\n if (unloadResult.unloaded) {\n console.log(`🧹 Unloaded previous Ollama model: ${previousModel}`);\n } else if (!unloadResult.ok) {\n console.log(`⚠️ Could not unload previous Ollama model '${previousModel}': ${unloadResult.detail}`);\n }\n }\n\n Config.show();\n });\n });\n\n config\n .command('dev-output <mode>')\n .description('Enable or disable developer debug output in user logs')\n .action(async (mode: string) => {\n await withContext(async () => {\n const normalizedMode = mode.trim().toLowerCase();\n const enabledByMode: Record<string, boolean> = {\n on: true,\n off: false,\n true: true,\n false: false,\n };\n\n if (!(normalizedMode in enabledByMode)) {\n throw new Error(\"dev-output mode must be 'on', 'off', 'true', or 'false'\");\n }\n\n const updated = Config.setDevOutput(enabledByMode[normalizedMode]);\n if (!updated) return;\n\n console.log(`✅ Effective dev output: ${Config.getDevOutput() ? \"on\" : \"off\"}`);\n });\n });\n\n config\n .command('show')\n .option('--raw', 'Show raw config')\n .description('Display current configuration')\n .action(async (opts) => {\n await withContext(async () => {\n if (opts.raw) console.log(JSON.stringify(Config.getRaw(), null, 2));\n else Config.show();\n });\n });\n\n // 💤 Set daemon sleep intervals\n config\n .command('set-daemon')\n .description('Set daemon sleep intervals (ms between runs)')\n .option('--sleep <ms>', 'Sleep time in milliseconds between batches')\n .option('--idle <ms>', 'Sleep time in milliseconds when idle')\n .action(async (options) => {\n await withContext(async () => {\n const updates: { sleepMs?: number; idleSleepMs?: number } = {};\n\n if (options.sleep) updates.sleepMs = parseInt(options.sleep, 10);\n if (options.idle) updates.idleSleepMs = parseInt(options.idle, 10);\n\n if (!Object.keys(updates).length) {\n console.log('⚠️ No options provided. Use --sleep or --idle.');\n return;\n }\n\n Config.setDaemonConfig(updates);\n\n const current = Config.getDaemonConfig();\n console.log(\n `🕒 Updated daemon settings:\\n sleepMs=${current.sleepMs}ms\\n idleSleepMs=${current.idleSleepMs}ms`\n );\n });\n });\n\n // ---------------- Index ----------------\n const index = cmd.command('index').description('Index operations');\n\n index\n .command('start')\n .description('Index supported files')\n .action(async () => await withContext(runIndexCommand));\n\n index\n .command('set [dir]')\n .description('Register a repository and make it active')\n .action(async (dir = process.cwd()) => {\n await Config.setIndexDir(dir);\n Config.show();\n });\n\n index\n .command('switch')\n .description('Switch active repo to the one for the current directory')\n .action(async () => {\n const config = Config.getRaw();\n const cwd = resolveCanonicalRepoIdentity(process.cwd()).repoRootPath;\n const repoKey = getRepoKeyForPath(cwd, config);\n\n if (!repoKey) {\n console.log(`❌ This directory is not an indexed repository.`);\n console.log(``);\n console.log(`• To see indexed repos: scai index list`);\n console.log(`• To set up this repo: scai setup`);\n process.exit(1);\n }\n\n await withContext(async () => {\n runSwitchCommand(repoKey);\n });\n });\n\n index\n .command('status')\n .description('Show active repository and indexing status')\n .action(async () => {\n await showIndexStatusCommand();\n });\n\n index\n .command('list')\n .description('List indexed repositories and select one')\n .action(async () =>\n withContext(async () => {\n await runInteractiveSwitch();\n })\n );\n\n index\n .command('delete')\n .description('Delete repository interactively')\n .action(async () => await withContext(runInteractiveDelete));\n\n // ---------------- DB ----------------\n const db = cmd.command('db').description('Database operations');\n\n db\n .command('check')\n .description('Run DB health checks')\n .action(async () => {\n await withContext(async () => {\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = dirname(__filename);\n const scriptPath = resolve(__dirname, '../..', 'dist/scripts', 'dbcheck.js');\n try { execSync(`node \"${scriptPath}\"`, { stdio: 'inherit' }); }\n catch (err) { console.error('❌ DB check failed:', err instanceof Error ? err.message : err); }\n });\n });\n\n db\n .command('overview')\n .description('Show a readable DB overview')\n .action(async () => {\n await withContext(async () => {\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = dirname(__filename);\n const scriptPath = resolve(__dirname, '../..', 'dist/scripts', 'dboverview.js');\n try { execSync(`node \"${scriptPath}\"`, { stdio: 'inherit' }); }\n catch (err) { console.error('❌ DB overview failed:', err instanceof Error ? err.message : err); }\n });\n });\n\n db\n .command('reset')\n .description('Reset SQLite database and rebuild local index state')\n .action(async () => await withRegisteredRepo(resetDatabase));\n\n db\n .command('inspect <filepath>')\n .description('Inspect a file in the index')\n .action(async (filepath: string) => await withContext(() => runInspectCommand(filepath)));\n\n // ---------------- Daemon ----------------\n const daemon = cmd.command('daemon').description('Daemon management');\n\n daemon.command('start').description('Start daemon').action(async () => withContext(startDaemon));\n daemon.command('stop').description('Stop daemon').action(async () => withContext(stopDaemon));\n daemon.command('restart').description('Restart daemon').action(async () => withContext(restartDaemon));\n daemon.command('status').description('Daemon status').action(async () => withContext(statusDaemon));\n daemon.command('unlock').description('Force unlock').action(async () => withContext(unlockConfig));\n daemon.command('logs').option('-n, --lines <n>', 'Last N log lines', '20')\n .description('Show daemon logs')\n .action(async (opts) => withContext(() => showLogs(parseInt(opts.lines, 10))));\n\n // ---------------- Model ----------------\n const model = cmd.command('model').description('Ollama model server management');\n\n model.command('status').description('Show Ollama server status').action(async () => statusModel());\n model.command('restart').description('Restart the Ollama server').action(async () => restartModel());\n\n // ---------------- Backup / Find / Ask ----------------\n cmd.command('backup').description('Backup .scai folder').action(async () => await withContext(runBackupCommand));\n cmd.command('find <query>').description('Search indexed files').action(async (q) => await withContext(() => runFindCommand(q)));\n if (enableDevTestCommands) {\n cmd.command('plan [query...]').description('Create a plan with the new agent without starting execution').action(async (parts) => {\n const query = (parts?.join(' ') ?? '').trim();\n if (!query) {\n console.error('❌ No planning query provided.\\n👉 Usage: scai plan \"your question\"');\n return;\n }\n await runQueryWithDaemonControl(query, {\n continueCurrentTask: false,\n bindAsCurrentTask: false,\n runtime: \"agent\",\n planOnly: true,\n });\n });\n }\n cmd.command('agent [question...]').description('Run the new simple agent runtime').action(async (parts) => {\n const query = (parts?.join(' ') ?? '').trim();\n if (!query) {\n console.error('❌ No agent query provided.\\n👉 Usage: scai agent \"your question\"');\n return;\n }\n await runQueryWithDaemonControl(query, {\n continueCurrentTask: false,\n bindAsCurrentTask: false,\n runtime: \"agent\",\n });\n });\n cmd.command('ask [question...]').description('Ask a question with the new default agent runtime').action(async (parts) => {\n await runQueryWithDaemonControl(parts?.join(' '));\n });\n\n return cmd;\n}\n"]}
package/dist/config.js CHANGED
@@ -1,15 +1,24 @@
1
+ /**
2
+ * Reads and writes local CLI config with small typed helpers for runtime features.
3
+ *
4
+ * Why this file exists:
5
+ * - config defaults should stay in one place
6
+ * - repo-scoped overrides should be resolved beside global config
7
+ * - runtime helpers should read config through small methods instead of open-coded JSON reads
8
+ */
1
9
  import fs from 'fs';
2
10
  import path from 'path';
3
11
  import { CONFIG_LOCK_PATH, CONFIG_PATH, DEFAULT_DAEMON_IDLE_SLEEP_MS, DEFAULT_DAEMON_SLEEP_MS, PID_PATH, SCAI_HOME, SCAI_REPOS } from './constants.js';
4
- import { getDbForRepo } from './db/client.js';
5
- import { normalizePath } from './utils/contentUtils.js';
12
+ import { canonicalizeRepoPath } from './utils/contentUtils.js';
6
13
  import chalk from 'chalk';
7
14
  import { getHashedRepoKey } from './utils/repoKey.js';
8
15
  const defaultConfig = {
9
16
  model: 'qwen3-coder:30b',
10
- contextLength: 32768,
17
+ contextLength: 65536,
11
18
  maxOutputTokens: 2048,
19
+ transformMaxFileLines: 1084,
12
20
  language: 'ts',
21
+ devOutput: false,
13
22
  indexDir: '',
14
23
  githubToken: '',
15
24
  repos: {},
@@ -120,6 +129,50 @@ export const Config = {
120
129
  console.log(`🗣️ Default language set to: ${language}`);
121
130
  }
122
131
  },
132
+ getDevOutput() {
133
+ const cfg = readConfig();
134
+ const activeRepo = cfg.activeRepo;
135
+ const repoCfg = activeRepo ? cfg.repos?.[activeRepo] : undefined;
136
+ if (repoCfg?.devOutput !== undefined) {
137
+ return repoCfg.devOutput;
138
+ }
139
+ if (cfg.devOutput !== undefined) {
140
+ return cfg.devOutput;
141
+ }
142
+ return defaultConfig.devOutput ?? false;
143
+ },
144
+ getTransformMaxFileLines() {
145
+ const cfg = readConfig();
146
+ const activeRepo = cfg.activeRepo;
147
+ const repoCfg = activeRepo ? cfg.repos?.[activeRepo] : undefined;
148
+ const repoValue = Number(repoCfg?.transformMaxFileLines);
149
+ if (Number.isFinite(repoValue) && repoValue > 0) {
150
+ return Math.floor(repoValue);
151
+ }
152
+ const globalValue = Number(cfg.transformMaxFileLines);
153
+ if (Number.isFinite(globalValue) && globalValue > 0) {
154
+ return Math.floor(globalValue);
155
+ }
156
+ return defaultConfig.transformMaxFileLines ?? 1084;
157
+ },
158
+ setDevOutput(enabled, scope = 'repo') {
159
+ const cfg = readConfig();
160
+ if (scope === 'repo') {
161
+ const active = cfg.activeRepo;
162
+ if (!active) {
163
+ console.error("❌ No active repo to set dev output for.");
164
+ return false;
165
+ }
166
+ cfg.repos[active] = { ...cfg.repos[active], devOutput: enabled };
167
+ writeConfig(cfg);
168
+ console.log(`🪵 Dev output set for repo '${active}': ${enabled ? 'on' : 'off'}`);
169
+ return true;
170
+ }
171
+ cfg.devOutput = enabled;
172
+ writeConfig(cfg);
173
+ console.log(`🪵 Global dev output set to: ${enabled ? 'on' : 'off'}`);
174
+ return true;
175
+ },
123
176
  getIndexDir() {
124
177
  const cfg = readConfig();
125
178
  const activeRepo = cfg.activeRepo;
@@ -128,17 +181,12 @@ export const Config = {
128
181
  return cfg.repos[activeRepo]?.indexDir ?? '';
129
182
  },
130
183
  async setIndexDir(indexDir) {
131
- const normalizedIndexDir = normalizePath(indexDir);
184
+ const normalizedIndexDir = canonicalizeRepoPath(indexDir);
132
185
  const repoKey = getHashedRepoKey(normalizedIndexDir);
133
- const scaiRepoRoot = path.join(SCAI_REPOS, repoKey);
134
- fs.mkdirSync(scaiRepoRoot, { recursive: true });
186
+ fs.mkdirSync(path.join(SCAI_REPOS, repoKey), { recursive: true });
135
187
  this.setActiveRepo(repoKey);
136
188
  await this.setRepoIndexDir(repoKey, normalizedIndexDir);
137
- const dbPath = path.join(scaiRepoRoot, 'db.sqlite');
138
- if (!fs.existsSync(dbPath)) {
139
- console.log(`📦 Database not found. ${chalk.green('Initializing DB')} at ${normalizePath(dbPath)}`);
140
- getDbForRepo();
141
- }
189
+ return repoKey;
142
190
  },
143
191
  async setRepoIndexDir(repoKey, indexDir) {
144
192
  const cfg = readConfig();
@@ -233,6 +281,8 @@ export const Config = {
233
281
  const repoCfg = active ? cfg.repos[active] : {};
234
282
  console.log(` Model : ${repoCfg?.model || cfg.model}`);
235
283
  console.log(` Language : ${repoCfg?.language || cfg.language}`);
284
+ console.log(` Dev output : ${this.getDevOutput() ? 'On' : 'Off'}`);
285
+ console.log(` Transform max lines: ${this.getTransformMaxFileLines()}`);
236
286
  console.log(` Context length : ${cfg.contextLength} tokens`);
237
287
  console.log(` Max output tokens : ${cfg.maxOutputTokens} tokens`);
238
288
  console.log(` GitHub Token : ${cfg.githubToken ? '*****' : 'Not Set'}`);
@@ -251,3 +301,4 @@ export const Config = {
251
301
  return readConfig();
252
302
  },
253
303
  };
304
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Reads and writes local CLI config with small typed helpers for runtime features.\n *\n * Why this file exists:\n * - config defaults should stay in one place\n * - repo-scoped overrides should be resolved beside global config\n * - runtime helpers should read config through small methods instead of open-coded JSON reads\n */\nimport fs from 'fs';\nimport path from 'path';\nimport { CONFIG_LOCK_PATH, CONFIG_PATH, DEFAULT_DAEMON_IDLE_SLEEP_MS, DEFAULT_DAEMON_SLEEP_MS, PID_PATH, SCAI_HOME, SCAI_REPOS } from './constants.js';\r\nimport { ScaiConfig, SupportedLanguage, SupportedModel } from './types.js';\nimport { getDbForRepo } from './db/client.js';\nimport { canonicalizeRepoPath, normalizePath } from './utils/contentUtils.js';\nimport chalk from 'chalk';\r\nimport { getHashedRepoKey } from './utils/repoKey.js';\r\n\r\nconst defaultConfig: ScaiConfig = {\n model: 'qwen3-coder:30b',\n contextLength: 65536,\n maxOutputTokens: 2048,\n transformMaxFileLines: 1084,\n language: 'ts',\n devOutput: false,\n indexDir: '',\n githubToken: '',\n repos: {},\n activeRepo: null,\r\n daemon: {\r\n sleepMs: DEFAULT_DAEMON_SLEEP_MS,\r\n idleSleepMs: DEFAULT_DAEMON_IDLE_SLEEP_MS,\r\n },\r\n};\r\n\r\nfunction ensureConfigDir() {\r\n if (!fs.existsSync(SCAI_HOME)) {\r\n fs.mkdirSync(SCAI_HOME, { recursive: true });\r\n }\r\n}\r\n\r\nexport function readConfig(): ScaiConfig {\r\n try {\r\n const content = fs.readFileSync(CONFIG_PATH, 'utf-8');\r\n const parsed = JSON.parse(content);\r\n\r\n // ⛔ Never allow static config.json to control token limits\r\n const {\r\n contextLength: _ignoredContextLength,\r\n maxOutputTokens: _ignoredMaxOutputTokens,\r\n ...rest\r\n } = parsed;\r\n\r\n return {\r\n ...defaultConfig,\r\n ...rest,\r\n contextLength: defaultConfig.contextLength,\r\n maxOutputTokens: defaultConfig.maxOutputTokens,\r\n };\r\n } catch {\r\n return defaultConfig;\r\n }\r\n}\r\n\r\nexport function writeConfig(newCfg: Partial<ScaiConfig>) {\r\n ensureConfigDir();\r\n const current = readConfig();\r\n\r\n const merged = {\r\n ...current,\r\n ...newCfg,\r\n repos: {\r\n ...current.repos,\r\n ...(newCfg.repos || {}),\r\n },\r\n };\r\n\r\n // Remove repos explicitly set to null\r\n if (newCfg.repos) {\r\n for (const [key, value] of Object.entries(newCfg.repos)) {\r\n if (value === null) {\r\n delete merged.repos[key];\r\n }\r\n }\r\n }\r\n\r\n fs.writeFileSync(CONFIG_PATH, JSON.stringify(merged, null, 2));\r\n}\r\n\r\nexport function daemonIsRunning(): boolean {\r\n if (!fs.existsSync(PID_PATH)) return false;\r\n const pid = parseInt(fs.readFileSync(PID_PATH, 'utf8'), 10);\r\n try {\r\n process.kill(pid, 0);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nexport function getDaemonLockedRepo(): string | null {\r\n if (!fs.existsSync(CONFIG_LOCK_PATH)) return null;\r\n return fs.readFileSync(CONFIG_LOCK_PATH, 'utf8');\r\n}\r\n\r\nexport const Config = {\n getModel(): SupportedModel {\r\n const cfg = readConfig();\r\n const repoCfg = cfg.repos?.[cfg.activeRepo ?? ''];\r\n return repoCfg?.model || cfg.model;\r\n },\r\n\r\n setModel(model: SupportedModel, scope: 'repo' | 'global' = 'repo') {\r\n const cfg = readConfig();\r\n\r\n if (scope === 'repo') {\r\n const active = cfg.activeRepo;\r\n if (!active) {\r\n console.error(\"❌ No active repo to set model for.\");\r\n return;\r\n }\r\n cfg.repos[active] = { ...cfg.repos[active], model };\r\n console.log(`📦 Model set for repo '${active}': ${model}`);\r\n } else {\r\n cfg.model = model;\r\n console.log(`📦 Global default model set to: ${model}`);\r\n }\r\n writeConfig(cfg);\r\n },\r\n\r\n getLanguage(): SupportedLanguage {\r\n const cfg = readConfig();\r\n const repoCfg = cfg.repos?.[cfg.activeRepo ?? ''];\r\n return repoCfg?.language || cfg.language;\r\n },\r\n\r\n setLanguage(language: SupportedLanguage) {\n const cfg = readConfig();\n const active = cfg.activeRepo;\n if (active) {\n cfg.repos[active] = { ...cfg.repos[active], language };\n writeConfig(cfg);\r\n console.log(`🗣️ Language set to: ${language}`);\r\n } else {\r\n writeConfig({ language });\r\n console.log(`🗣️ Default language set to: ${language}`);\n }\n },\n\n getDevOutput(): boolean {\n const cfg = readConfig();\n const activeRepo = cfg.activeRepo;\n const repoCfg = activeRepo ? cfg.repos?.[activeRepo] : undefined;\n\n if (repoCfg?.devOutput !== undefined) {\n return repoCfg.devOutput;\n }\n if (cfg.devOutput !== undefined) {\n return cfg.devOutput;\n }\n return defaultConfig.devOutput ?? false;\n },\n\n getTransformMaxFileLines(): number {\n const cfg = readConfig();\n const activeRepo = cfg.activeRepo;\n const repoCfg = activeRepo ? cfg.repos?.[activeRepo] : undefined;\n\n const repoValue = Number(repoCfg?.transformMaxFileLines);\n if (Number.isFinite(repoValue) && repoValue > 0) {\n return Math.floor(repoValue);\n }\n\n const globalValue = Number(cfg.transformMaxFileLines);\n if (Number.isFinite(globalValue) && globalValue > 0) {\n return Math.floor(globalValue);\n }\n\n return defaultConfig.transformMaxFileLines ?? 1084;\n },\n\n setDevOutput(enabled: boolean, scope: 'repo' | 'global' = 'repo') {\n const cfg = readConfig();\n\n if (scope === 'repo') {\n const active = cfg.activeRepo;\n if (!active) {\n console.error(\"❌ No active repo to set dev output for.\");\n return false;\n }\n cfg.repos[active] = { ...cfg.repos[active], devOutput: enabled };\n writeConfig(cfg);\n console.log(`🪵 Dev output set for repo '${active}': ${enabled ? 'on' : 'off'}`);\n return true;\n }\n\n cfg.devOutput = enabled;\n writeConfig(cfg);\n console.log(`🪵 Global dev output set to: ${enabled ? 'on' : 'off'}`);\n return true;\n },\n\r\n getIndexDir(): string {\r\n const cfg = readConfig();\r\n const activeRepo = cfg.activeRepo;\r\n if (!activeRepo) return '';\r\n return cfg.repos[activeRepo]?.indexDir ?? '';\r\n },\r\n\r\n async setIndexDir(indexDir: string) {\n const normalizedIndexDir = canonicalizeRepoPath(indexDir);\n const repoKey = getHashedRepoKey(normalizedIndexDir);\n fs.mkdirSync(path.join(SCAI_REPOS, repoKey), { recursive: true });\n\n this.setActiveRepo(repoKey);\n await this.setRepoIndexDir(repoKey, normalizedIndexDir);\n return repoKey;\n },\n\r\n async setRepoIndexDir(repoKey: string, indexDir: string) {\r\n const cfg = readConfig();\r\n if (!cfg.repos[repoKey]) cfg.repos[repoKey] = {};\r\n cfg.repos[repoKey] = { ...cfg.repos[repoKey], indexDir };\r\n writeConfig(cfg);\r\n console.log(`✅ Repo index directory set for ${repoKey} : ${indexDir}`);\r\n },\r\n\r\n setActiveRepo(repoKey: string): boolean {\r\n const cfg = readConfig();\r\n\r\n // 🔒 Check for running daemon lock\r\n const lockedRepo = getDaemonLockedRepo();\r\n if (daemonIsRunning() && lockedRepo && lockedRepo !== repoKey) {\r\n const sps = lockedRepo.split('-')[0];\r\n console.log(\r\n `❌ Cannot switch active repo while daemon is running.\\n` +\r\n ` Daemon is currently locked to repo: ${sps}\\n` +\r\n ` Go to repository: ${sps}, and stop the daemon first: scai daemon stop`\r\n );\r\n return false;\r\n }\r\n\r\n // ✅ If allowed, switch\r\n cfg.activeRepo = repoKey;\r\n if (!cfg.repos[repoKey]) cfg.repos[repoKey] = {};\r\n writeConfig(cfg);\r\n console.log(`✅ Active repo switched to: ${repoKey}`);\r\n return true;\r\n },\r\n\r\n printAllRepos() {\r\n const cfg = readConfig();\r\n const keys = Object.keys(cfg.repos || {});\r\n if (!keys.length) {\r\n console.log('ℹ️ No repositories configured yet.');\r\n return;\r\n }\r\n console.log('📁 Configured repositories:\\n');\r\n for (const key of keys) {\r\n const r = cfg.repos[key];\r\n const isActive = cfg.activeRepo === key;\r\n const label = isActive\r\n ? chalk.green(`✅ ${key} (active)`)\r\n : chalk.white(` ${key}`);\r\n console.log(`- ${label}`);\r\n console.log(\r\n ` ↳ indexDir: ${isActive ? chalk.yellow(r.indexDir) : r.indexDir}`\r\n );\r\n }\r\n },\r\n\r\n getGitHubToken(): string | null {\r\n const cfg = readConfig();\r\n const active = cfg.activeRepo;\r\n if (active) return cfg.repos[active]?.githubToken || null;\r\n return cfg.githubToken || null;\r\n },\r\n\r\n setGitHubToken(token: string) {\r\n const cfg = readConfig();\r\n const active = cfg.activeRepo;\r\n if (active) {\r\n if (!cfg.repos[active]) cfg.repos[active] = {};\r\n cfg.repos[active] = { ...cfg.repos[active], githubToken: token };\r\n } else {\r\n cfg.githubToken = token;\r\n }\r\n writeConfig(cfg);\r\n console.log('✅ GitHub token updated');\r\n },\r\n\r\n /* ------------------- 💤 Daemon Config ------------------- */\r\n getDaemonConfig() {\r\n const cfg = readConfig();\r\n const daemonCfg = cfg.daemon ?? { sleepMs: DEFAULT_DAEMON_SLEEP_MS, idleSleepMs: DEFAULT_DAEMON_IDLE_SLEEP_MS };\r\n\r\n const sleepMs = Number(process.env.SCAI_SLEEP_MS) || daemonCfg.sleepMs;\r\n const idleSleepMs = Number(process.env.SCAI_IDLE_SLEEP_MS) || daemonCfg.idleSleepMs;\r\n\r\n return { sleepMs, idleSleepMs };\r\n },\r\n\r\n\r\n setDaemonConfig(newCfg: Partial<{ sleepMs: number; idleSleepMs: number }>) {\r\n const cfg = readConfig();\r\n cfg.daemon = {\r\n sleepMs: DEFAULT_DAEMON_SLEEP_MS,\r\n idleSleepMs: DEFAULT_DAEMON_IDLE_SLEEP_MS,\r\n ...cfg.daemon,\r\n ...newCfg,\r\n };\r\n writeConfig(cfg);\r\n console.log(\r\n `🕒 Daemon configuration updated: ${JSON.stringify(cfg.daemon, null, 2)}`\r\n );\r\n },\r\n\r\n show() {\r\n const cfg = readConfig();\r\n const active = cfg.activeRepo;\r\n\r\n console.log(`🔧 Current configuration:`);\r\n console.log(` Active index dir : ${active || 'Not Set'}`);\r\n\r\n const repoCfg = active ? cfg.repos[active] : {};\r\n console.log(` Model : ${repoCfg?.model || cfg.model}`);\n console.log(` Language : ${repoCfg?.language || cfg.language}`);\n console.log(` Dev output : ${this.getDevOutput() ? 'On' : 'Off'}`);\n console.log(` Transform max lines: ${this.getTransformMaxFileLines()}`);\n console.log(` Context length : ${cfg.contextLength} tokens`);\n console.log(` Max output tokens : ${cfg.maxOutputTokens} tokens`);\n console.log(` GitHub Token : ${cfg.githubToken ? '*****' : 'Not Set'}`);\n\r\n const daemon = this.getDaemonConfig();\r\n console.log(` Daemon sleepMs : ${daemon.sleepMs}ms`);\r\n console.log(` Daemon idleMs : ${daemon.idleSleepMs}ms`);\r\n\r\n // ✅ Show lock status\r\n let lockStatus = 'Unlocked';\r\n if (fs.existsSync(CONFIG_LOCK_PATH)) {\r\n const lockedRepo = fs.readFileSync(CONFIG_LOCK_PATH, 'utf8');\r\n lockStatus = `Locked to repo '${lockedRepo}'`;\r\n }\r\n console.log(` Daemon Lock : ${lockStatus}`);\r\n },\r\n\r\n\r\n getRaw(): ScaiConfig {\r\n return readConfig();\r\n },\r\n};\r\n\r\n"]}
package/dist/constants.js CHANGED
@@ -1,6 +1,14 @@
1
1
  import os from 'os';
2
2
  import path from 'path';
3
3
  import fs from 'fs';
4
+ /**
5
+ * Defines shared filesystem paths used by the CLI runtime.
6
+ *
7
+ * Why this file exists:
8
+ * - shell, daemon, logs, and repo state should resolve from one small place
9
+ * - user-facing file names like `runtime.log` should stay stable across runtimes
10
+ * - migration aliases can live here while older code is moved over in stages
11
+ */
4
12
  /**
5
13
  * The base directory where internal SCAI config/state is stored:
6
14
  * ~/.scai
@@ -37,10 +45,19 @@ export const LOG_PATH = path.join(SCAI_HOME, 'daemon.log');
37
45
  */
38
46
  export const PROMPT_LOG_PATH = path.join(SCAI_HOME, 'prompt.log');
39
47
  /**
40
- * Path to the per-run agent input/output log:
41
- * ~/.scai/input_output.log
48
+ * Path to the human-readable runtime log:
49
+ * ~/.scai/runtime.log
50
+ */
51
+ export const RUNTIME_LOG_PATH = path.join(SCAI_HOME, 'runtime.log');
52
+ /**
53
+ * Path to the structured runtime log:
54
+ * ~/.scai/runtime.ndjson
55
+ */
56
+ export const RUNTIME_NDJSON_PATH = path.join(SCAI_HOME, 'runtime.ndjson');
57
+ /**
58
+ * Backwards-compatible alias kept during the runtime log migration.
42
59
  */
43
- export const RUN_LOG_PATH = path.join(SCAI_HOME, 'input_output.log');
60
+ export const RUN_LOG_PATH = RUNTIME_LOG_PATH;
44
61
  /**
45
62
  * Default sleep time for the daemon loop in milliseconds.
46
63
  * This is used when no value is configured in the config file or via environment variables.
@@ -87,3 +104,4 @@ export const MAX_SUMMARY_LINES = 12;
87
104
  */
88
105
  export const MAX_FUNCTION_LINES = 12;
89
106
  export const MODULE_STEP_INDENTATION = ' - ';
107
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpB;;;;;;;GAOG;AAEH;;;GAGG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC;AAE1D;;GAEG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;AAExD;;;GAGG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;AAE3D;;;GAGG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;AAE/D;;;;GAIG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;AAEpE;;;GAGG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;AAE3D;;;GAGG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;AAElE;;;GAGG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;AAEpE;;;GAGG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;AAE1E;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,gBAAgB,CAAC;AAE7C;;;GAGG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,MAAM,CAAC,CAAM,WAAW;AAE/D;;;GAGG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,MAAM,CAAC,CAAC,YAAY;AAEhE;;;;;GAKG;AACH,MAAM,UAAU,WAAW;IACzB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;QACjE,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;QACrC,IAAI,UAAU,IAAI,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;YAC3C,OAAO,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,4CAA4C;QACxG,CAAC;QACD,OAAO,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,qCAAqC;IAC5D,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,gDAAgD;IACvE,CAAC;AACH,CAAC;AAGD;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC;AAE9B;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,CAAC;AAEtC;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAEpC;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAErC,MAAM,CAAC,MAAM,uBAAuB,GAAG,KAAK,CAAA","sourcesContent":["import os from 'os';\nimport path from 'path';\nimport fs from 'fs';\n\n/**\n * Defines shared filesystem paths used by the CLI runtime.\n *\n * Why this file exists:\n * - shell, daemon, logs, and repo state should resolve from one small place\n * - user-facing file names like `runtime.log` should stay stable across runtimes\n * - migration aliases can live here while older code is moved over in stages\n */\n\n/**\n * The base directory where internal SCAI config/state is stored:\n * ~/.scai\n */\nexport const SCAI_HOME = path.join(os.homedir(), '.scai');\n\r\n/**\r\n * Repos dir for multi-repo setup\r\n */\r\nexport const SCAI_REPOS = path.join(SCAI_HOME, 'repos');\r\n\r\n/**\r\n * Path to the daemon process ID file (if running in background mode):\r\n * ~/.scai/daemon.pid\r\n */\r\nexport const PID_PATH = path.join(SCAI_HOME, 'daemon.pid');\r\n\r\n/**\r\n * Path to the config file that stores user settings like model, language, indexDir, etc.:\r\n * ~/.scai/config.json\r\n */\r\nexport const CONFIG_PATH = path.join(SCAI_HOME, 'config.json');\r\n\r\n/**\r\n * Path to the daemon lock file that prevents starting multiple daemons\r\n * for different repos simultaneously:\r\n * ~/.scai/daemon.lock\r\n */\r\nexport const CONFIG_LOCK_PATH = path.join(SCAI_HOME, 'daemon.lock');\r\n\r\n/**\r\n * Path to the daemon log file:\r\n * ~/.scai/daemon.log\r\n */\r\nexport const LOG_PATH = path.join(SCAI_HOME, 'daemon.log');\r\n\r\n/**\n * Path to the last prompt sent to the model:\n * ~/.scai/prompt.log\n */\nexport const PROMPT_LOG_PATH = path.join(SCAI_HOME, 'prompt.log');\n\n/**\n * Path to the human-readable runtime log:\n * ~/.scai/runtime.log\n */\nexport const RUNTIME_LOG_PATH = path.join(SCAI_HOME, 'runtime.log');\n\n/**\n * Path to the structured runtime log:\n * ~/.scai/runtime.ndjson\n */\nexport const RUNTIME_NDJSON_PATH = path.join(SCAI_HOME, 'runtime.ndjson');\n\n/**\n * Backwards-compatible alias kept during the runtime log migration.\n */\nexport const RUN_LOG_PATH = RUNTIME_LOG_PATH;\n\r\n/**\r\n * Default sleep time for the daemon loop in milliseconds.\r\n * This is used when no value is configured in the config file or via environment variables.\r\n */\r\nexport const DEFAULT_DAEMON_SLEEP_MS = 120000; // 1 minute\r\n\r\n/**\r\n * Default idle sleep time for the daemon loop in milliseconds.\r\n * Used when the daemon has nothing to process and is idle.\r\n */\r\nexport const DEFAULT_DAEMON_IDLE_SLEEP_MS = 300000; // 5 minutes\r\n\r\n/**\r\n * Get the active index directory based on the active repo.\r\n * \r\n * - If there is an active repository, return its `indexDir` from the config.\r\n * - If no active repo is set, default to the user's home directory (`~`).\r\n */\r\nexport function getIndexDir(): string {\r\n try {\r\n const config = JSON.parse(fs.readFileSync(CONFIG_PATH, 'utf-8'));\r\n const activeRepo = config.activeRepo;\r\n if (activeRepo && config.repos[activeRepo]) {\r\n return config.repos[activeRepo].indexDir || os.homedir(); // Repo-specific indexDir or default to home\r\n }\r\n return os.homedir(); // Fallback to home if no active repo\r\n } catch (e) {\r\n return os.homedir(); // Fallback if config file is missing or invalid\r\n }\r\n}\r\n\r\n\r\n/**\r\n * Highest ranked results\r\n */\r\nexport const NUM_TOPFILES = 5;\r\n\r\n/**\r\n * Limit for number of related files included in model prompt.\r\n */\r\nexport const RELATED_FILES_LIMIT = 50;\r\n\r\n/**\r\n * Limit number of summary lines\r\n */\r\nexport const MAX_SUMMARY_LINES = 12;\r\n\r\n/**\r\n * Limit number of function content\r\n */\r\nexport const MAX_FUNCTION_LINES = 12;\r\n\r\nexport const MODULE_STEP_INDENTATION = ' - '\r\n"]}
package/dist/context.js CHANGED
@@ -1,39 +1,37 @@
1
- // context.ts
1
+ /**
2
+ * Validates the active repo context for commands that depend on completed setup.
3
+ *
4
+ * Why this file exists:
5
+ * - ask-like commands need one place to check repo registration, DB readiness, and model state
6
+ * - validation should stay separate from first-run setup and repair actions
7
+ * - missing setup should point users to one explicit fix path
8
+ */
2
9
  import { readConfig, Config } from "./config.js";
3
10
  import { normalizePath } from "./utils/contentUtils.js";
4
- import { getDbForRepo, getDbPathForRepo } from "./db/client.js";
11
+ import { getDbPathForRepo } from "./db/client.js";
5
12
  import fs from "fs";
6
13
  import chalk from "chalk";
7
- import { execSync } from "child_process";
8
- function modelExists(model) {
9
- try {
10
- const output = execSync("ollama list", { encoding: "utf-8" });
11
- return output
12
- .split("\n")
13
- .map(line => line.trim())
14
- .filter(Boolean)
15
- .some(line => line.toLowerCase().startsWith(model.toLowerCase() + " ") || line.toLowerCase() === model.toLowerCase());
16
- }
17
- catch (err) {
18
- console.error(chalk.red("❌ Failed to check models with `ollama list`"));
19
- return false;
20
- }
21
- }
14
+ import { resolveCanonicalRepoIdentity } from "./utils/repoIdentity.js";
15
+ import { isModelInstalled } from "./utils/ollamaModelStatus.js";
22
16
  export async function updateContext() {
23
17
  const cwd = normalizePath(process.cwd());
18
+ const repoIdentity = resolveCanonicalRepoIdentity(cwd);
24
19
  const cfg = readConfig();
25
20
  // 🔎 Look up existing repo by indexDir
26
- let repoKey = Object.keys(cfg.repos || {}).find((key) => normalizePath(cfg.repos[key]?.indexDir || "") === cwd);
21
+ let repoKey = Object.keys(cfg.repos || {}).find((key) => {
22
+ const indexDir = normalizePath(cfg.repos[key]?.indexDir || "");
23
+ return indexDir === cwd || indexDir === repoIdentity.repoRootPath;
24
+ });
27
25
  if (!repoKey) {
28
26
  const err = new Error();
29
27
  err.message =
30
- chalk.red("❌ Current directory is not in your list of indexed repos. See the 'scai index list' command.") +
28
+ chalk.red("❌ This repository is not set up yet.") +
31
29
  "\n" +
32
- chalk.blueBright(" ↳ To get the full benefit of an indexed repo, navigate to your repository root folder.") +
30
+ chalk.blueBright(" ↳ Run setup from the repository root so SCAI can register it and prepare local state.") +
33
31
  "\n\n" +
34
32
  chalk.greenBright(" Run ") +
35
- chalk.cyan("scai index set") +
36
- chalk.greenBright(" command. This enables Scai to index the repo, find git credentials etc.\n");
33
+ chalk.cyan("scai setup") +
34
+ chalk.greenBright(" to continue.\n");
37
35
  throw err;
38
36
  }
39
37
  const activeRepoChanged = cfg.activeRepo !== repoKey;
@@ -44,7 +42,8 @@ export async function updateContext() {
44
42
  return false;
45
43
  }
46
44
  }
47
- const repoCfg = cfg.repos[repoKey];
45
+ const refreshed = readConfig();
46
+ const repoCfg = refreshed.repos[repoKey];
48
47
  let ok = true;
49
48
  if (activeRepoChanged) {
50
49
  console.log(chalk.yellow("\n🔁 Updating context...\n"));
@@ -62,28 +61,29 @@ export async function updateContext() {
62
61
  // 💾 DB check
63
62
  const dbPath = getDbPathForRepo();
64
63
  if (!fs.existsSync(dbPath)) {
65
- console.log(chalk.yellow(`📦 Initializing DB at ${dbPath}`));
66
- try {
67
- getDbForRepo();
68
- }
69
- catch {
70
- ok = false;
71
- }
64
+ console.log(chalk.red(`❌ Repository database is missing for ${normalizePath(dbPath)}.`) +
65
+ "\n➡️ Run " +
66
+ chalk.bold(chalk.yellow("scai setup")));
67
+ ok = false;
72
68
  }
73
69
  else if (activeRepoChanged) {
74
70
  console.log(chalk.green("✅ Database present"));
75
71
  }
76
72
  // 🧠 Model check
77
- const model = cfg.model;
73
+ const model = Config.getModel();
78
74
  if (!model) {
79
75
  console.log(chalk.red("❌ No model configured.") +
80
76
  "\n➡️ Set one with: " +
77
+ chalk.bold(chalk.bgGreen("scai setup")) +
78
+ " or " +
81
79
  chalk.bold(chalk.bgGreen("scai config set-model <model>")));
82
80
  ok = false;
83
81
  }
84
- else if (!modelExists(model)) {
82
+ else if (!isModelInstalled(model)) {
85
83
  console.log(chalk.red(`❌ Model '${model}' not installed in Ollama.`) +
86
84
  "\n➡️ Install with: " +
85
+ chalk.bold(chalk.yellow("scai setup")) +
86
+ " or " +
87
87
  chalk.bold(chalk.yellow(`ollama pull ${model}`)) +
88
88
  " or choose another with: " +
89
89
  chalk.bold(chalk.yellow("scai config set-model <model>")));
@@ -94,3 +94,4 @@ export async function updateContext() {
94
94
  }
95
95
  return ok;
96
96
  }
97
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Validates the active repo context for commands that depend on completed setup.\n *\n * Why this file exists:\n * - ask-like commands need one place to check repo registration, DB readiness, and model state\n * - validation should stay separate from first-run setup and repair actions\n * - missing setup should point users to one explicit fix path\n */\nimport { readConfig, Config } from \"./config.js\";\nimport { normalizePath } from \"./utils/contentUtils.js\";\nimport { getDbPathForRepo } from \"./db/client.js\";\nimport fs from \"fs\";\nimport chalk from \"chalk\";\nimport { resolveCanonicalRepoIdentity } from \"./utils/repoIdentity.js\";\nimport { isModelInstalled } from \"./utils/ollamaModelStatus.js\";\n\r\nexport async function updateContext(): Promise<boolean> {\n const cwd = normalizePath(process.cwd());\n const repoIdentity = resolveCanonicalRepoIdentity(cwd);\n const cfg = readConfig();\n\n // 🔎 Look up existing repo by indexDir\n let repoKey = Object.keys(cfg.repos || {}).find(\n (key) => {\n const indexDir = normalizePath(cfg.repos[key]?.indexDir || \"\");\n return indexDir === cwd || indexDir === repoIdentity.repoRootPath;\n }\n );\n\r\n if (!repoKey) {\n const err = new Error();\n err.message =\n chalk.red(\"❌ This repository is not set up yet.\") +\n \"\\n\" +\n chalk.blueBright(\" ↳ Run setup from the repository root so SCAI can register it and prepare local state.\") +\n \"\\n\\n\" +\n chalk.greenBright(\" Run \") +\n chalk.cyan(\"scai setup\") +\n chalk.greenBright(\" to continue.\\n\");\n throw err;\n }\n\r\n const activeRepoChanged = cfg.activeRepo !== repoKey;\r\n\r\n if (activeRepoChanged) {\r\n const switched = Config.setActiveRepo(repoKey);\r\n if (switched === false) {\r\n // ❗ If switching is denied by lock, stop updateContext completely\r\n return false;\r\n }\r\n }\r\n\r\n const refreshed = readConfig();\n const repoCfg = refreshed.repos[repoKey];\n let ok = true;\n\r\n if (activeRepoChanged) {\r\n console.log(chalk.yellow(\"\\n🔁 Updating context...\\n\"));\r\n console.log(`✅ Active repo: ${chalk.green(repoKey)}`);\r\n console.log(`✅ Index dir: ${chalk.cyan(repoCfg.indexDir || cwd)}`);\r\n }\r\n\r\n // 🔑 Token check\r\n const token = repoCfg.githubToken || cfg.githubToken;\r\n if (!token) {\r\n console.log(\r\n `ℹ️ No GitHub token found. You can set one with: ${chalk.bold(chalk.bgGreen(\"scai auth set\"))}`\r\n );\r\n } else if (activeRepoChanged) {\r\n console.log(`✅ GitHub token present`);\r\n }\r\n\r\n // 💾 DB check\n const dbPath = getDbPathForRepo();\n if (!fs.existsSync(dbPath)) {\n console.log(\n chalk.red(`❌ Repository database is missing for ${normalizePath(dbPath)}.`) +\n \"\\n➡️ Run \" +\n chalk.bold(chalk.yellow(\"scai setup\"))\n );\n ok = false;\n } else if (activeRepoChanged) {\n console.log(chalk.green(\"✅ Database present\"));\n }\n\n // 🧠 Model check\n const model = Config.getModel();\n if (!model) {\n console.log(\n chalk.red(\"❌ No model configured.\") +\n \"\\n➡️ Set one with: \" +\n chalk.bold(chalk.bgGreen(\"scai setup\")) +\n \" or \" +\n chalk.bold(chalk.bgGreen(\"scai config set-model <model>\"))\n );\n ok = false;\n } else if (!isModelInstalled(model)) {\n console.log(\n chalk.red(`❌ Model '${model}' not installed in Ollama.`) +\n \"\\n➡️ Install with: \" +\n chalk.bold(chalk.yellow(\"scai setup\")) +\n \" or \" +\n chalk.bold(chalk.yellow(`ollama pull ${model}`)) +\n \" or choose another with: \" +\n chalk.bold(chalk.yellow(\"scai config set-model <model>\"))\n );\n ok = false;\n }\r\n\r\n if (!ok) {\r\n console.log(chalk.bold.red(\"\\n⚠️ Repositoriy context not set correctly\\n\"));\r\n }\r\n\r\n return ok;\r\n}\r\n"]}
@@ -41,23 +41,4 @@ export function hasUncapsuledFolders() {
41
41
  return false;
42
42
  }
43
43
  }
44
- /**
45
- * LOOP 3 — Knowledge graph
46
- * Files indexed but KG not extracted yet
47
- */
48
- export function hasPendingKgWork() {
49
- try {
50
- const db = getDbForRepo();
51
- const row = db.prepare(`
52
- SELECT COUNT(*) AS count
53
- FROM files
54
- WHERE functions_extracted_at IS NULL
55
- AND processing_status NOT IN ('skipped', 'failed')
56
- `).get();
57
- return row.count > 0;
58
- }
59
- catch (err) {
60
- log('❌ hasPendingKgWork failed:', err);
61
- return false;
62
- }
63
- }
44
+ //# sourceMappingURL=daemonQueues.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemonQueues.js","sourceRoot":"","sources":["../../src/daemon/daemonQueues.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AACtC,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAE9D;;GAEG;AACH,MAAM,UAAU,iBAAiB;IAC7B,IAAI,CAAC;QACD,MAAM,EAAE,GAAG,YAAY,EAAE,CAAC;QAC1B,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC,GAAG,EAAuB,CAAC;QACzE,OAAO,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC;IACzB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,GAAG,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAC;QACxC,OAAO,KAAK,CAAC;IACjB,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB;IAChC,IAAI,CAAC;QACD,MAAM,EAAE,GAAG,YAAY,EAAE,CAAC;QAE1B,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;;;;;;;SAWtB,CAAC,CAAC,GAAG,EAAuB,CAAC;QAE9B,OAAO,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC;IACzB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,GAAG,CAAC,gCAAgC,EAAE,GAAG,CAAC,CAAC;QAC3C,OAAO,KAAK,CAAC;IACjB,CAAC;AACL,CAAC","sourcesContent":["import { getDbForRepo } from '../db/client.js';\nimport { log } from '../utils/log.js';\nimport { countUnprocessedFiles } from '../db/sqlTemplates.js';\n\n/**\n * LOOP 1 — Fast indexing\n */\nexport function hasUnindexedFiles(): boolean {\n try {\n const db = getDbForRepo();\n const row = db.prepare(countUnprocessedFiles).get() as { count: number };\n return row.count > 0;\n } catch (err) {\n log('❌ hasUnindexedFiles failed:', err);\n return false;\n }\n}\n\n/**\n * LOOP 2 — Folder capsules\n * Any folder that contains files but lacks a capsule\n */\nexport function hasUncapsuledFolders(): boolean {\n try {\n const db = getDbForRepo();\n\n const row = db.prepare(`\n SELECT COUNT(*) AS count\n FROM (\n SELECT DISTINCT\n substr(path, 1, length(path) - length(filename) - 1) AS folder\n FROM files\n WHERE processing_status NOT IN ('skipped', 'failed')\n ) folders\n LEFT JOIN folder_capsules fc\n ON fc.path = folders.folder\n WHERE fc.path IS NULL\n `).get() as { count: number };\n\n return row.count > 0;\n } catch (err) {\n log('❌ hasUncapsuledFolders failed:', err);\n return false;\n }\n}\n\n"]}
@@ -1,49 +1,35 @@
1
- import { hasUnindexedFiles, hasUncapsuledFolders, hasPendingKgWork, } from './daemonQueues.js';
1
+ /**
2
+ * Runs the bounded background indexing worker for the current repo.
3
+ *
4
+ * Why this file exists:
5
+ * - `scai index start` should hand batch indexing to one background worker
6
+ * - the default daemon path should now stop after indexing is done instead of idling forever
7
+ * - legacy folder-capsule generation is kept off the live daemon path while the new agent ignores it
8
+ */
9
+ import { hasUnindexedFiles } from './daemonQueues.js';
2
10
  import { log } from '../utils/log.js';
3
11
  import { Config } from '../config.js';
4
12
  import { runIndexingBatch } from './runIndexingBatch.js';
5
- import { runKgBatch } from './runKgBatch.js';
6
- import { runFolderCapsuleBatch } from './runFolderCapsuleBatch.js';
7
13
  import { sleep } from '../utils/sleep.js';
14
+ import { clearDaemonRuntimeState } from '../commands/DaemonCmd.js';
8
15
  // 🚨 Immediate signal that the worker even starts
9
- log('🛠️ daemonWorker.js loaded');
16
+ if (process.env.BACKGROUND_MODE === 'true') {
17
+ log('🛠️ daemonWorker.js loaded');
18
+ }
10
19
  export async function daemonWorker() {
11
- log('🚀 Daemon worker starting (3-loop mode)...');
12
- const { sleepMs, idleSleepMs } = Config.getDaemonConfig();
20
+ log('🚀 Daemon worker starting (bounded indexing mode)...');
21
+ const { idleSleepMs } = Config.getDaemonConfig();
13
22
  while (true) {
14
23
  try {
15
- // --------------------------------------------------
16
- // LOOP 1: FAST FILE INDEXING (HIGHEST PRIORITY)
17
- // --------------------------------------------------
18
24
  if (await hasUnindexedFiles()) {
19
25
  log('⚡ Indexing loop: processing files...');
20
26
  const didWork = await runIndexingBatch();
21
27
  if (didWork)
22
- continue; // process next batch immediately
23
- }
24
- // --------------------------------------------------
25
- // LOOP 2: FOLDER CAPSULE GENERATION (BLOCKING, FINITE)
26
- // --------------------------------------------------
27
- if (await hasUncapsuledFolders()) {
28
- log('📦 Folder capsule loop: generating capsules...');
29
- const didWork = await runFolderCapsuleBatch();
30
- if (didWork)
31
- continue; // process next folder batch immediately
28
+ continue;
32
29
  }
33
- // --------------------------------------------------
34
- // LOOP 3: KNOWLEDGE GRAPH (BACKGROUND / BEST EFFORT)
35
- // --------------------------------------------------
36
- if (await hasPendingKgWork()) {
37
- log('🧠 KG loop: background enrichment...');
38
- await runKgBatch(); // intentionally ignore didWork
39
- await sleep(idleSleepMs);
40
- continue;
41
- }
42
- // --------------------------------------------------
43
- // IDLE
44
- // --------------------------------------------------
45
- log('🕊️ All queues empty. Idling...');
46
- await sleep(idleSleepMs * 6);
30
+ log('✅ No indexing work left. Stopping daemon.');
31
+ clearDaemonRuntimeState({ expectedPid: process.pid });
32
+ return;
47
33
  }
48
34
  catch (err) {
49
35
  log('🔥 Fatal error in daemon worker:', err);
@@ -51,7 +37,10 @@ export async function daemonWorker() {
51
37
  }
52
38
  }
53
39
  }
54
- // Boot
55
- daemonWorker().catch(err => {
56
- log('❌ daemonWorker failed to start:', err);
57
- });
40
+ if (process.env.BACKGROUND_MODE === 'true') {
41
+ daemonWorker().catch(err => {
42
+ log('❌ daemonWorker failed to start:', err);
43
+ clearDaemonRuntimeState({ expectedPid: process.pid });
44
+ });
45
+ }
46
+ //# sourceMappingURL=daemonWorker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemonWorker.js","sourceRoot":"","sources":["../../src/daemon/daemonWorker.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AAEnE,kDAAkD;AAClD,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,MAAM,EAAE,CAAC;IAC3C,GAAG,CAAC,4BAA4B,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,GAAG,CAAC,sDAAsD,CAAC,CAAC;IAE5D,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC,eAAe,EAAE,CAAC;IAEjD,OAAO,IAAI,EAAE,CAAC;QACZ,IAAI,CAAC;YACH,IAAI,MAAM,iBAAiB,EAAE,EAAE,CAAC;gBAC9B,GAAG,CAAC,sCAAsC,CAAC,CAAC;gBAC5C,MAAM,OAAO,GAAG,MAAM,gBAAgB,EAAE,CAAC;gBACzC,IAAI,OAAO;oBAAE,SAAS;YACxB,CAAC;YAED,GAAG,CAAC,2CAA2C,CAAC,CAAC;YACjD,uBAAuB,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;YACtD,OAAO;QACT,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,kCAAkC,EAAE,GAAG,CAAC,CAAC;YAC7C,MAAM,KAAK,CAAC,WAAW,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;AACH,CAAC;AAED,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,MAAM,EAAE,CAAC;IAC3C,YAAY,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;QACzB,GAAG,CAAC,iCAAiC,EAAE,GAAG,CAAC,CAAC;QAC5C,uBAAuB,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["/**\n * Runs the bounded background indexing worker for the current repo.\n *\n * Why this file exists:\n * - `scai index start` should hand batch indexing to one background worker\n * - the default daemon path should now stop after indexing is done instead of idling forever\n * - legacy folder-capsule generation is kept off the live daemon path while the new agent ignores it\n */\nimport { hasUnindexedFiles } from './daemonQueues.js';\n\nimport { log } from '../utils/log.js';\nimport { Config } from '../config.js';\nimport { runIndexingBatch } from './runIndexingBatch.js';\nimport { sleep } from '../utils/sleep.js';\nimport { clearDaemonRuntimeState } from '../commands/DaemonCmd.js';\n\n// 🚨 Immediate signal that the worker even starts\nif (process.env.BACKGROUND_MODE === 'true') {\n log('🛠️ daemonWorker.js loaded');\n}\n\nexport async function daemonWorker() {\n log('🚀 Daemon worker starting (bounded indexing mode)...');\n\n const { idleSleepMs } = Config.getDaemonConfig();\n\n while (true) {\n try {\n if (await hasUnindexedFiles()) {\n log('⚡ Indexing loop: processing files...');\n const didWork = await runIndexingBatch();\n if (didWork) continue;\n }\n\n log('✅ No indexing work left. Stopping daemon.');\n clearDaemonRuntimeState({ expectedPid: process.pid });\n return;\n } catch (err) {\n log('🔥 Fatal error in daemon worker:', err);\n await sleep(idleSleepMs);\n }\n }\n}\n\nif (process.env.BACKGROUND_MODE === 'true') {\n daemonWorker().catch(err => {\n log('❌ daemonWorker failed to start:', err);\n clearDaemonRuntimeState({ expectedPid: process.pid });\n });\n}\n"]}
@@ -56,3 +56,4 @@ export async function generateSummaries() {
56
56
  `).run(projectSummary);
57
57
  console.log("🏗️ Project-level summary generated");
58
58
  }
59
+ //# sourceMappingURL=generateSummaries.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generateSummaries.js","sourceRoot":"","sources":["../../src/daemon/generateSummaries.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAS9C,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACnC,MAAM,EAAE,GAAG,YAAY,EAAE,CAAC;IAE1B,MAAM,KAAK,GAAG,EAAE;SACX,OAAO,CAAC,2DAA2D,CAAC;SACpE,GAAG,EAAe,CAAC;IAExB,0BAA0B;IAC1B,MAAM,OAAO,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC5C,KAAK,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,KAAK,EAAE,CAAC;QACpC,IAAI,CAAC,OAAO;YAAE,SAAS;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC9B,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,kBAAkB;QAC/B,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC;QAC1C,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;YAAE,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,UAAU,CAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3C,CAAC;IAED,0CAA0C;IAC1C,KAAK,MAAM,CAAC,UAAU,EAAE,SAAS,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;QACtD,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACvC,MAAM,KAAK,GAAa;YACpB,KAAK,EAAE,oBAAoB,UAAU,EAAE;YACvC,OAAO,EAAE,+DAA+D,UAAU,cAAc,OAAO,EAAE;SAC5G,CAAC;QAEF,MAAM,QAAQ,GAAa,MAAM,QAAQ,CAAC,KAAK,CAAC,CAAC;QACjD,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAE1D,EAAE,CAAC,OAAO,CAAC;;;;;;KAMd,CAAC,CAAC,GAAG,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;QAE5B,OAAO,CAAC,GAAG,CAAC,mCAAmC,UAAU,EAAE,CAAC,CAAC;IACjE,CAAC;IAED,2CAA2C;IAC3C,MAAM,kBAAkB,GAAG,EAAE;SACxB,OAAO,CAAC,mDAAmD,CAAC;SAC5D,GAAG,EAAE;SACL,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;SAC1B,IAAI,CAAC,MAAM,CAAC,CAAC;IAElB,MAAM,YAAY,GAAa;QAC3B,KAAK,EAAE,mBAAmB;QAC1B,OAAO,EAAE,kGAAkG,kBAAkB,EAAE;KAClI,CAAC;IAEF,MAAM,eAAe,GAAa,MAAM,QAAQ,CAAC,YAAY,CAAC,CAAC;IAC/D,MAAM,cAAc,GAAG,MAAM,CAAC,eAAe,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAEpE,EAAE,CAAC,OAAO,CAAC;;;;;;GAMZ,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAErB,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;AACvD,CAAC","sourcesContent":["import { getDbForRepo } from \"../db/client.js\";\nimport { generate } from \"../lib/generate.js\";\nimport { ModuleIO } from \"../types.js\";\n\n// --- Local type for DB results ---\ninterface FileRow {\n path: string;\n summary: string | null;\n}\n\nexport async function generateSummaries() {\n const db = getDbForRepo();\n\n const files = db\n .prepare(`SELECT path, summary FROM files WHERE summary IS NOT NULL`)\n .all() as FileRow[];\n\n // --- Group by folder ---\n const folders = new Map<string, string[]>();\n for (const { path, summary } of files) {\n if (!summary) continue;\n const parts = path.split(\"/\");\n parts.pop(); // remove filename\n const folderPath = parts.join(\"/\") || \"/\";\n if (!folders.has(folderPath)) folders.set(folderPath, []);\n folders.get(folderPath)!.push(summary);\n }\n\n // --- Generate folder-level summaries ---\n for (const [folderPath, summaries] of folders.entries()) {\n const content = summaries.join(\"\\n\\n\");\n const input: ModuleIO = {\n query: `Summarize folder ${folderPath}`,\n content: `Summarize the following files to describe what this folder (${folderPath}) does:\\n\\n${content}`,\n };\n\n const response: ModuleIO = await generate(input);\n const summaryText = String(response.content ?? \"\").trim();\n\n db.prepare(`\n INSERT INTO summaries (path, type, summary, last_generated)\n VALUES (?, 'folder', ?, datetime('now'))\n ON CONFLICT(path) DO UPDATE SET\n summary=excluded.summary,\n last_generated=datetime('now')\n `).run(folderPath, summaryText);\n\n console.log(`🧠 Folder summary generated for ${folderPath}`);\n }\n\n // --- Project-level summary generation ---\n const allFolderSummaries = db\n .prepare(`SELECT summary FROM summaries WHERE type='folder'`)\n .all()\n .map((r: any) => r.summary)\n .join(\"\\n\\n\");\n\n const projectInput: ModuleIO = {\n query: \"Summarize project\",\n content: `Summarize the overall purpose and structure of the project based on these folder summaries:\\n\\n${allFolderSummaries}`,\n };\n\n const projectResponse: ModuleIO = await generate(projectInput);\n const projectSummary = String(projectResponse.content ?? \"\").trim();\n\n db.prepare(`\n INSERT INTO summaries (path, type, summary, last_generated)\n VALUES ('/', 'project', ?, datetime('now'))\n ON CONFLICT(path) DO UPDATE SET\n summary=excluded.summary,\n last_generated=datetime('now')\n `).run(projectSummary);\n\n console.log(\"🏗️ Project-level summary generated\");\n}\n"]}
@@ -246,3 +246,4 @@ Expected JSON shape:
246
246
  log('📦 Folder capsule batch complete.');
247
247
  return true;
248
248
  }
249
+ //# sourceMappingURL=runFolderCapsuleBatch.js.map