scai 0.1.178 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (770) hide show
  1. package/README.md +171 -260
  2. package/dist/__tests__/CommitSuggesterCmd.test.js +112 -0
  3. package/dist/__tests__/CommitSuggesterCmd.test.js.map +1 -0
  4. package/dist/__tests__/EvalReportCmd.test.js +645 -0
  5. package/dist/__tests__/EvalReportCmd.test.js.map +1 -0
  6. package/dist/__tests__/ModelCmd.test.js +64 -0
  7. package/dist/__tests__/ModelCmd.test.js.map +1 -0
  8. package/dist/__tests__/agents/agentActions.test.js +345 -0
  9. package/dist/__tests__/agents/agentActions.test.js.map +1 -0
  10. package/dist/__tests__/agents/agentFeedback.test.js +118 -0
  11. package/dist/__tests__/agents/agentFeedback.test.js.map +1 -0
  12. package/dist/__tests__/agents/agentGeneralScope.test.js +74 -0
  13. package/dist/__tests__/agents/agentGeneralScope.test.js.map +1 -0
  14. package/dist/__tests__/agents/agentLoop.test.js +1723 -0
  15. package/dist/__tests__/agents/agentLoop.test.js.map +1 -0
  16. package/dist/__tests__/agents/agentPolicyState.test.js +948 -0
  17. package/dist/__tests__/agents/agentPolicyState.test.js.map +1 -0
  18. package/dist/__tests__/agents/agentReadEvidence.test.js +170 -0
  19. package/dist/__tests__/agents/agentReadEvidence.test.js.map +1 -0
  20. package/dist/__tests__/agents/agentReadPersistence.test.js +129 -0
  21. package/dist/__tests__/agents/agentReadPersistence.test.js.map +1 -0
  22. package/dist/__tests__/agents/agentResumeCheckpoint.test.js +90 -0
  23. package/dist/__tests__/agents/agentResumeCheckpoint.test.js.map +1 -0
  24. package/dist/__tests__/agents/agentSearchBatchPlanner.test.js +289 -0
  25. package/dist/__tests__/agents/agentSearchBatchPlanner.test.js.map +1 -0
  26. package/dist/__tests__/agents/agentSearchOwnership.test.js +166 -0
  27. package/dist/__tests__/agents/agentSearchOwnership.test.js.map +1 -0
  28. package/dist/__tests__/agents/agentSearchRanking.test.js +139 -0
  29. package/dist/__tests__/agents/agentSearchRanking.test.js.map +1 -0
  30. package/dist/__tests__/agents/agentSearchRouting.test.js +584 -0
  31. package/dist/__tests__/agents/agentSearchRouting.test.js.map +1 -0
  32. package/dist/__tests__/agents/agentSearchScoring.test.js +23 -0
  33. package/dist/__tests__/agents/agentSearchScoring.test.js.map +1 -0
  34. package/dist/__tests__/agents/agentSearchShared.test.js +78 -0
  35. package/dist/__tests__/agents/agentSearchShared.test.js.map +1 -0
  36. package/dist/__tests__/agents/agentStateMachine.test.js +58 -0
  37. package/dist/__tests__/agents/agentStateMachine.test.js.map +1 -0
  38. package/dist/__tests__/agents/agentTaskPersistence.test.js +156 -0
  39. package/dist/__tests__/agents/agentTaskPersistence.test.js.map +1 -0
  40. package/dist/__tests__/agents/agentTools.test.js +69 -0
  41. package/dist/__tests__/agents/agentTools.test.js.map +1 -0
  42. package/dist/__tests__/agents/agentTransform.test.js +779 -0
  43. package/dist/__tests__/agents/agentTransform.test.js.map +1 -0
  44. package/dist/__tests__/agents/analysisPlanGenStep.test.js +157 -0
  45. package/dist/__tests__/agents/analysisPlanGenStep.test.js.map +1 -0
  46. package/dist/__tests__/agents/answerOnlyCompletion.test.js +75 -0
  47. package/dist/__tests__/agents/answerOnlyCompletion.test.js.map +1 -0
  48. package/dist/__tests__/agents/decideNextAction.test.js +1662 -0
  49. package/dist/__tests__/agents/decideNextAction.test.js.map +1 -0
  50. package/dist/__tests__/agents/deriveFocusFromSearchStep.test.js +258 -0
  51. package/dist/__tests__/agents/deriveFocusFromSearchStep.test.js.map +1 -0
  52. package/dist/__tests__/agents/evidenceVerifierStep.test.js +113 -0
  53. package/dist/__tests__/agents/evidenceVerifierStep.test.js.map +1 -0
  54. package/dist/__tests__/agents/executionPolicyResolver.test.js +208 -0
  55. package/dist/__tests__/agents/executionPolicyResolver.test.js.map +1 -0
  56. package/dist/__tests__/agents/fileCheckStep.test.js +299 -0
  57. package/dist/__tests__/agents/fileCheckStep.test.js.map +1 -0
  58. package/dist/__tests__/agents/giveUpEvaluatorStep.test.js +35 -0
  59. package/dist/__tests__/agents/giveUpEvaluatorStep.test.js.map +1 -0
  60. package/dist/__tests__/agents/guardState.test.js +297 -0
  61. package/dist/__tests__/agents/guardState.test.js.map +1 -0
  62. package/dist/__tests__/agents/mainAgentHeuristics.test.js +72 -0
  63. package/dist/__tests__/agents/mainAgentHeuristics.test.js.map +1 -0
  64. package/dist/__tests__/agents/objectiveEvaluatorStep.test.js +60 -0
  65. package/dist/__tests__/agents/objectiveEvaluatorStep.test.js.map +1 -0
  66. package/dist/__tests__/agents/outerLoopRecoveryEvaluator.test.js +207 -0
  67. package/dist/__tests__/agents/outerLoopRecoveryEvaluator.test.js.map +1 -0
  68. package/dist/__tests__/agents/prompting.test.js +363 -0
  69. package/dist/__tests__/agents/prompting.test.js.map +1 -0
  70. package/dist/__tests__/agents/readinessGateStep.test.js +180 -0
  71. package/dist/__tests__/agents/readinessGateStep.test.js.map +1 -0
  72. package/dist/__tests__/agents/reasonNextStep.test.js +56 -0
  73. package/dist/__tests__/agents/reasonNextStep.test.js.map +1 -0
  74. package/dist/__tests__/agents/reasonNextTaskStep.test.js +284 -0
  75. package/dist/__tests__/agents/reasonNextTaskStep.test.js.map +1 -0
  76. package/dist/__tests__/agents/resolveAgentTargetClassification.test.js +170 -0
  77. package/dist/__tests__/agents/resolveAgentTargetClassification.test.js.map +1 -0
  78. package/dist/__tests__/agents/resolveProgressState.test.js +526 -0
  79. package/dist/__tests__/agents/resolveProgressState.test.js.map +1 -0
  80. package/dist/__tests__/agents/resumeCheckpoint.test.js +50 -0
  81. package/dist/__tests__/agents/resumeCheckpoint.test.js.map +1 -0
  82. package/dist/__tests__/agents/routingDecisionStep.test.js +134 -0
  83. package/dist/__tests__/agents/routingDecisionStep.test.js.map +1 -0
  84. package/dist/__tests__/agents/scopeClassificationStep.test.js +118 -0
  85. package/dist/__tests__/agents/scopeClassificationStep.test.js.map +1 -0
  86. package/dist/__tests__/agents/searchContext.test.js +97 -0
  87. package/dist/__tests__/agents/searchContext.test.js.map +1 -0
  88. package/dist/__tests__/agents/selectRelevantSourcesStep.test.js +73 -0
  89. package/dist/__tests__/agents/selectRelevantSourcesStep.test.js.map +1 -0
  90. package/dist/__tests__/agents/structuredOutput.test.js +45 -0
  91. package/dist/__tests__/agents/structuredOutput.test.js.map +1 -0
  92. package/dist/__tests__/agents/transformPlanGenStep.fallback.test.js +59 -0
  93. package/dist/__tests__/agents/transformPlanGenStep.fallback.test.js.map +1 -0
  94. package/dist/__tests__/agents/transformPlanGenStep.test.js +92 -0
  95. package/dist/__tests__/agents/transformPlanGenStep.test.js.map +1 -0
  96. package/dist/__tests__/agents/understandIntentStep.test.js +237 -0
  97. package/dist/__tests__/agents/understandIntentStep.test.js.map +1 -0
  98. package/dist/__tests__/agents/understandResumeContext.test.js +65 -0
  99. package/dist/__tests__/agents/understandResumeContext.test.js.map +1 -0
  100. package/dist/__tests__/agents/understandScope.test.js +227 -0
  101. package/dist/__tests__/agents/understandScope.test.js.map +1 -0
  102. package/dist/__tests__/agents/validateChangesStep.test.js +52 -0
  103. package/dist/__tests__/agents/validateChangesStep.test.js.map +1 -0
  104. package/dist/__tests__/askCommandTaskBinding.test.js +176 -0
  105. package/dist/__tests__/askCommandTaskBinding.test.js.map +1 -0
  106. package/dist/__tests__/commandVisibility.test.js +25 -0
  107. package/dist/__tests__/commandVisibility.test.js.map +1 -0
  108. package/dist/__tests__/config.devOutput.test.js +82 -0
  109. package/dist/__tests__/config.devOutput.test.js.map +1 -0
  110. package/dist/__tests__/currentContext.test.js +43 -0
  111. package/dist/__tests__/currentContext.test.js.map +1 -0
  112. package/dist/__tests__/daemonWorker.test.js +51 -0
  113. package/dist/__tests__/daemonWorker.test.js.map +1 -0
  114. package/dist/__tests__/dialogState.test.js +113 -0
  115. package/dist/__tests__/dialogState.test.js.map +1 -0
  116. package/dist/__tests__/evalCommands.test.js +506 -0
  117. package/dist/__tests__/evalCommands.test.js.map +1 -0
  118. package/dist/__tests__/evalCommandsSummary.test.js +68 -0
  119. package/dist/__tests__/evalCommandsSummary.test.js.map +1 -0
  120. package/dist/__tests__/example.test.js +1 -0
  121. package/dist/__tests__/example.test.js.map +1 -0
  122. package/dist/__tests__/factory.commitCommand.test.js +45 -0
  123. package/dist/__tests__/factory.commitCommand.test.js.map +1 -0
  124. package/dist/__tests__/factory.devOutputCommand.test.js +122 -0
  125. package/dist/__tests__/factory.devOutputCommand.test.js.map +1 -0
  126. package/dist/__tests__/factory.evalCommands.test.js +38 -0
  127. package/dist/__tests__/factory.evalCommands.test.js.map +1 -0
  128. package/dist/__tests__/factory.planCommand.test.js +35 -0
  129. package/dist/__tests__/factory.planCommand.test.js.map +1 -0
  130. package/dist/__tests__/factory.setupCommand.test.js +34 -0
  131. package/dist/__tests__/factory.setupCommand.test.js.map +1 -0
  132. package/dist/__tests__/factory.statusCommand.test.js +54 -0
  133. package/dist/__tests__/factory.statusCommand.test.js.map +1 -0
  134. package/dist/__tests__/fileRules/queryTokenRules.test.js +35 -0
  135. package/dist/__tests__/fileRules/queryTokenRules.test.js.map +1 -0
  136. package/dist/__tests__/fileRules/searchPathClassification.test.js +57 -0
  137. package/dist/__tests__/fileRules/searchPathClassification.test.js.map +1 -0
  138. package/dist/__tests__/generate.ollamaRecovery.test.js +344 -0
  139. package/dist/__tests__/generate.ollamaRecovery.test.js.map +1 -0
  140. package/dist/__tests__/index.modelStartup.test.js +24 -0
  141. package/dist/__tests__/index.modelStartup.test.js.map +1 -0
  142. package/dist/__tests__/indexCmd.test.js +85 -0
  143. package/dist/__tests__/indexCmd.test.js.map +1 -0
  144. package/dist/__tests__/indexSlashCommand.test.js +50 -0
  145. package/dist/__tests__/indexSlashCommand.test.js.map +1 -0
  146. package/dist/__tests__/ollamaService.test.js +103 -0
  147. package/dist/__tests__/ollamaService.test.js.map +1 -0
  148. package/dist/__tests__/pipeline/modules/codeTransformModule.small-file.test.js +68 -0
  149. package/dist/__tests__/pipeline/modules/codeTransformModule.small-file.test.js.map +1 -0
  150. package/dist/__tests__/pipeline/modules/commitSuggesterModule.test.js +68 -0
  151. package/dist/__tests__/pipeline/modules/commitSuggesterModule.test.js.map +1 -0
  152. package/dist/__tests__/pipeline/modules/fileSearchModule.test.js +284 -0
  153. package/dist/__tests__/pipeline/modules/fileSearchModule.test.js.map +1 -0
  154. package/dist/__tests__/pipeline/modules/finalAnswerModule.test.js +1139 -0
  155. package/dist/__tests__/pipeline/modules/finalAnswerModule.test.js.map +1 -0
  156. package/dist/__tests__/pipeline/modules/readFileModule.test.js +146 -0
  157. package/dist/__tests__/pipeline/modules/readFileModule.test.js.map +1 -0
  158. package/dist/__tests__/pipeline/modules/semanticAnalysisModule.test.js +192 -0
  159. package/dist/__tests__/pipeline/modules/semanticAnalysisModule.test.js.map +1 -0
  160. package/dist/__tests__/repoIdentity.test.js +31 -0
  161. package/dist/__tests__/repoIdentity.test.js.map +1 -0
  162. package/dist/__tests__/resumeContext.test.js +87 -0
  163. package/dist/__tests__/resumeContext.test.js.map +1 -0
  164. package/dist/__tests__/resumeState.test.js +239 -0
  165. package/dist/__tests__/resumeState.test.js.map +1 -0
  166. package/dist/__tests__/search/SearchOrchestrator.test.js +836 -0
  167. package/dist/__tests__/search/SearchOrchestrator.test.js.map +1 -0
  168. package/dist/__tests__/shellDialogUi.test.js +52 -0
  169. package/dist/__tests__/shellDialogUi.test.js.map +1 -0
  170. package/dist/__tests__/shellSession.test.js +102 -0
  171. package/dist/__tests__/shellSession.test.js.map +1 -0
  172. package/dist/__tests__/statusOwner.test.js +215 -0
  173. package/dist/__tests__/statusOwner.test.js.map +1 -0
  174. package/dist/__tests__/testing/contextEval.test.js +244 -0
  175. package/dist/__tests__/testing/contextEval.test.js.map +1 -0
  176. package/dist/__tests__/testing/harnessArtifacts.test.js +124 -0
  177. package/dist/__tests__/testing/harnessArtifacts.test.js.map +1 -0
  178. package/dist/__tests__/testing/llmTraceSession.test.js +67 -0
  179. package/dist/__tests__/testing/llmTraceSession.test.js.map +1 -0
  180. package/dist/__tests__/testing/registerDevCliCommands.test.js +35 -0
  181. package/dist/__tests__/testing/registerDevCliCommands.test.js.map +1 -0
  182. package/dist/__tests__/testing/runDiagnosis.test.js +159 -0
  183. package/dist/__tests__/testing/runDiagnosis.test.js.map +1 -0
  184. package/dist/__tests__/testing/runtimeLogReader.test.js +66 -0
  185. package/dist/__tests__/testing/runtimeLogReader.test.js.map +1 -0
  186. package/dist/__tests__/testing/testCommands.test.js +53 -0
  187. package/dist/__tests__/testing/testCommands.test.js.map +1 -0
  188. package/dist/__tests__/utils/compileSearchQuery.test.js +38 -0
  189. package/dist/__tests__/utils/compileSearchQuery.test.js.map +1 -0
  190. package/dist/__tests__/utils/consolePresentation.test.js +105 -0
  191. package/dist/__tests__/utils/consolePresentation.test.js.map +1 -0
  192. package/dist/__tests__/utils/extractFileReferences.test.js +41 -0
  193. package/dist/__tests__/utils/extractFileReferences.test.js.map +1 -0
  194. package/dist/__tests__/utils/log.test.js +34 -0
  195. package/dist/__tests__/utils/log.test.js.map +1 -0
  196. package/dist/__tests__/utils/runtimeLogger.test.js +200 -0
  197. package/dist/__tests__/utils/runtimeLogger.test.js.map +1 -0
  198. package/dist/__tests__/utils/spinner.test.js +31 -0
  199. package/dist/__tests__/utils/spinner.test.js.map +1 -0
  200. package/dist/__tests__/utils/verifyFocusPreference.test.js +41 -0
  201. package/dist/__tests__/utils/verifyFocusPreference.test.js.map +1 -0
  202. package/dist/agent/actions/index.js +301 -0
  203. package/dist/agent/actions/index.js.map +1 -0
  204. package/dist/agent/actions/normalize.js +360 -0
  205. package/dist/agent/actions/normalize.js.map +1 -0
  206. package/dist/agent/actions/schemas.js +129 -0
  207. package/dist/agent/actions/schemas.js.map +1 -0
  208. package/dist/agent/evidence/index.js +320 -0
  209. package/dist/agent/evidence/index.js.map +1 -0
  210. package/dist/agent/feedback/index.js +187 -0
  211. package/dist/agent/feedback/index.js.map +1 -0
  212. package/dist/agent/finalization/index.js +35 -0
  213. package/dist/agent/finalization/index.js.map +1 -0
  214. package/dist/agent/index.js +126 -0
  215. package/dist/agent/index.js.map +1 -0
  216. package/dist/agent/logging/index.js +350 -0
  217. package/dist/agent/logging/index.js.map +1 -0
  218. package/dist/agent/persistence/boot.js +58 -0
  219. package/dist/agent/persistence/boot.js.map +1 -0
  220. package/dist/agent/persistence/currentTask.js +36 -0
  221. package/dist/agent/persistence/currentTask.js.map +1 -0
  222. package/dist/agent/persistence/hydrate.js +42 -0
  223. package/dist/agent/persistence/hydrate.js.map +1 -0
  224. package/dist/agent/persistence/index.js +15 -0
  225. package/dist/agent/persistence/index.js.map +1 -0
  226. package/dist/agent/persistence/snapshots.js +97 -0
  227. package/dist/agent/persistence/snapshots.js.map +1 -0
  228. package/dist/agent/persistence/steps.js +95 -0
  229. package/dist/agent/persistence/steps.js.map +1 -0
  230. package/dist/agent/persistence/tasks.js +195 -0
  231. package/dist/agent/persistence/tasks.js.map +1 -0
  232. package/dist/agent/persistence/turns.js +92 -0
  233. package/dist/agent/persistence/turns.js.map +1 -0
  234. package/dist/agent/policy/ambiguityResolution.js +226 -0
  235. package/dist/agent/policy/ambiguityResolution.js.map +1 -0
  236. package/dist/agent/policy/contracts.js +2 -0
  237. package/dist/agent/policy/contracts.js.map +1 -0
  238. package/dist/agent/policy/coveragePolicy.js +309 -0
  239. package/dist/agent/policy/coveragePolicy.js.map +1 -0
  240. package/dist/agent/policy/endDecisionPolicy.js +31 -0
  241. package/dist/agent/policy/endDecisionPolicy.js.map +1 -0
  242. package/dist/agent/policy/index.js +344 -0
  243. package/dist/agent/policy/index.js.map +1 -0
  244. package/dist/agent/policy/loopReview.js +778 -0
  245. package/dist/agent/policy/loopReview.js.map +1 -0
  246. package/dist/agent/policy/readinessPolicy.js +108 -0
  247. package/dist/agent/policy/readinessPolicy.js.map +1 -0
  248. package/dist/agent/policy/resolutionPipeline.js +356 -0
  249. package/dist/agent/policy/resolutionPipeline.js.map +1 -0
  250. package/dist/agent/policy/targetClassification.js +33 -0
  251. package/dist/agent/policy/targetClassification.js.map +1 -0
  252. package/dist/agent/prompting/actionChoice.js +90 -0
  253. package/dist/agent/prompting/actionChoice.js.map +1 -0
  254. package/dist/agent/prompting/finalAnswer.js +38 -0
  255. package/dist/agent/prompting/finalAnswer.js.map +1 -0
  256. package/dist/agent/prompting/index.js +14 -0
  257. package/dist/agent/prompting/index.js.map +1 -0
  258. package/dist/agent/prompting/plan.js +59 -0
  259. package/dist/agent/prompting/plan.js.map +1 -0
  260. package/dist/agent/prompting/transform.js +175 -0
  261. package/dist/agent/prompting/transform.js.map +1 -0
  262. package/dist/agent/prompting/understand.js +70 -0
  263. package/dist/agent/prompting/understand.js.map +1 -0
  264. package/dist/agent/read/freshness.js +29 -0
  265. package/dist/agent/read/freshness.js.map +1 -0
  266. package/dist/agent/read/fullReadPrompt.js +43 -0
  267. package/dist/agent/read/fullReadPrompt.js.map +1 -0
  268. package/dist/agent/read/index.js +140 -0
  269. package/dist/agent/read/index.js.map +1 -0
  270. package/dist/agent/read/persistence.js +88 -0
  271. package/dist/agent/read/persistence.js.map +1 -0
  272. package/dist/agent/read/summarizeReadEvidence.js +733 -0
  273. package/dist/agent/read/summarizeReadEvidence.js.map +1 -0
  274. package/dist/agent/read/targetResolution.js +126 -0
  275. package/dist/agent/read/targetResolution.js.map +1 -0
  276. package/dist/agent/resume/checkpoint.js +41 -0
  277. package/dist/agent/resume/checkpoint.js.map +1 -0
  278. package/dist/agent/runtime/lifecycle.js +67 -0
  279. package/dist/agent/runtime/lifecycle.js.map +1 -0
  280. package/dist/agent/runtime/progress.js +178 -0
  281. package/dist/agent/runtime/progress.js.map +1 -0
  282. package/dist/agent/runtime/runAgentLoop.js +402 -0
  283. package/dist/agent/runtime/runAgentLoop.js.map +1 -0
  284. package/dist/agent/runtime/runAgentPlanOnly.js +127 -0
  285. package/dist/agent/runtime/runAgentPlanOnly.js.map +1 -0
  286. package/dist/agent/runtime/understand.js +336 -0
  287. package/dist/agent/runtime/understand.js.map +1 -0
  288. package/dist/agent/search/batchPlanner.js +274 -0
  289. package/dist/agent/search/batchPlanner.js.map +1 -0
  290. package/dist/agent/search/candidateRetentionPolicy.js +184 -0
  291. package/dist/agent/search/candidateRetentionPolicy.js.map +1 -0
  292. package/dist/agent/search/directory.js +51 -0
  293. package/dist/agent/search/directory.js.map +1 -0
  294. package/dist/agent/search/exactTarget.js +151 -0
  295. package/dist/agent/search/exactTarget.js.map +1 -0
  296. package/dist/agent/search/fragment.js +110 -0
  297. package/dist/agent/search/fragment.js.map +1 -0
  298. package/dist/agent/search/index.js +166 -0
  299. package/dist/agent/search/index.js.map +1 -0
  300. package/dist/agent/search/laneClassifier.js +119 -0
  301. package/dist/agent/search/laneClassifier.js.map +1 -0
  302. package/dist/agent/search/limits.js +10 -0
  303. package/dist/agent/search/limits.js.map +1 -0
  304. package/dist/agent/search/ranking.js +22 -0
  305. package/dist/agent/search/ranking.js.map +1 -0
  306. package/dist/agent/search/regex.js +83 -0
  307. package/dist/agent/search/regex.js.map +1 -0
  308. package/dist/agent/search/routePolicy.js +11 -0
  309. package/dist/agent/search/routePolicy.js.map +1 -0
  310. package/dist/agent/search/searchContext.js +128 -0
  311. package/dist/agent/search/searchContext.js.map +1 -0
  312. package/dist/agent/search/semantic.js +113 -0
  313. package/dist/agent/search/semantic.js.map +1 -0
  314. package/dist/agent/search/semanticIndexSearch.js +202 -0
  315. package/dist/agent/search/semanticIndexSearch.js.map +1 -0
  316. package/dist/agent/search/shared.js +283 -0
  317. package/dist/agent/search/shared.js.map +1 -0
  318. package/dist/agent/search/shell.js +202 -0
  319. package/dist/agent/search/shell.js.map +1 -0
  320. package/dist/agent/search/snippetEvidence.js +57 -0
  321. package/dist/agent/search/snippetEvidence.js.map +1 -0
  322. package/dist/agent/search/types.js +2 -0
  323. package/dist/agent/search/types.js.map +1 -0
  324. package/dist/agent/state/index.js +99 -0
  325. package/dist/agent/state/index.js.map +1 -0
  326. package/dist/agent/state/memory.js +56 -0
  327. package/dist/agent/state/memory.js.map +1 -0
  328. package/dist/agent/structuredOutput/index.js +28 -0
  329. package/dist/agent/structuredOutput/index.js.map +1 -0
  330. package/dist/agent/tools/index.js +199 -0
  331. package/dist/agent/tools/index.js.map +1 -0
  332. package/dist/agent/transform/index.js +519 -0
  333. package/dist/agent/transform/index.js.map +1 -0
  334. package/dist/agent/transform/syntax.js +49 -0
  335. package/dist/agent/transform/syntax.js.map +1 -0
  336. package/dist/agent/types.js +20 -0
  337. package/dist/agent/types.js.map +1 -0
  338. package/dist/agents/actionRegistry.js +114 -0
  339. package/dist/agents/actionRegistry.js.map +1 -0
  340. package/dist/agents/agent.js +5 -0
  341. package/dist/agents/agent.js.map +1 -0
  342. package/dist/agents/agentActions.js +5 -0
  343. package/dist/agents/agentActions.js.map +1 -0
  344. package/dist/agents/agentEvidence.js +5 -0
  345. package/dist/agents/agentEvidence.js.map +1 -0
  346. package/dist/agents/agentFeedback.js +5 -0
  347. package/dist/agents/agentFeedback.js.map +1 -0
  348. package/dist/agents/agentLogging.js +5 -0
  349. package/dist/agents/agentLogging.js.map +1 -0
  350. package/dist/agents/agentLoop.js +5 -0
  351. package/dist/agents/agentLoop.js.map +1 -0
  352. package/dist/agents/agentMemory.js +5 -0
  353. package/dist/agents/agentMemory.js.map +1 -0
  354. package/dist/agents/agentPlanMode.js +5 -0
  355. package/dist/agents/agentPlanMode.js.map +1 -0
  356. package/dist/agents/agentPolicyState.js +5 -0
  357. package/dist/agents/agentPolicyState.js.map +1 -0
  358. package/dist/agents/agentProgress.js +93 -0
  359. package/dist/agents/agentProgress.js.map +1 -0
  360. package/dist/agents/agentSchemas.js +5 -0
  361. package/dist/agents/agentSchemas.js.map +1 -0
  362. package/dist/agents/agentSearchScoring.js +5 -0
  363. package/dist/agents/agentSearchScoring.js.map +1 -0
  364. package/dist/agents/agentStateMachine.js +5 -0
  365. package/dist/agents/agentStateMachine.js.map +1 -0
  366. package/dist/agents/agentTools.js +5 -0
  367. package/dist/agents/agentTools.js.map +1 -0
  368. package/dist/agents/agentTypes.js +5 -0
  369. package/dist/agents/agentTypes.js.map +1 -0
  370. package/dist/agents/agentUnderstand.js +5 -0
  371. package/dist/agents/agentUnderstand.js.map +1 -0
  372. package/dist/agents/analysisPlanGenStep.js +194 -17
  373. package/dist/agents/analysisPlanGenStep.js.map +1 -0
  374. package/dist/agents/answerOnlyCompletion.js +32 -0
  375. package/dist/agents/answerOnlyCompletion.js.map +1 -0
  376. package/dist/agents/collaboratorStep.js +1 -0
  377. package/dist/agents/collaboratorStep.js.map +1 -0
  378. package/dist/agents/decideNextAction.js +444 -0
  379. package/dist/agents/decideNextAction.js.map +1 -0
  380. package/dist/agents/deriveFocusFromSearchStep.js +83 -0
  381. package/dist/agents/deriveFocusFromSearchStep.js.map +1 -0
  382. package/dist/agents/evidenceVerifierStep.js +104 -13
  383. package/dist/agents/evidenceVerifierStep.js.map +1 -0
  384. package/dist/agents/fileCheckStep.js +381 -12
  385. package/dist/agents/fileCheckStep.js.map +1 -0
  386. package/dist/agents/giveUpEvaluatorStep.js +63 -0
  387. package/dist/agents/giveUpEvaluatorStep.js.map +1 -0
  388. package/dist/agents/guardPolicy.js +20 -0
  389. package/dist/agents/guardPolicy.js.map +1 -0
  390. package/dist/agents/guards/executionPolicyResolver.js +165 -0
  391. package/dist/agents/guards/executionPolicyResolver.js.map +1 -0
  392. package/dist/agents/guards/guardState.js +195 -0
  393. package/dist/agents/guards/guardState.js.map +1 -0
  394. package/dist/agents/guards/resolveProgressState.js +403 -0
  395. package/dist/agents/guards/resolveProgressState.js.map +1 -0
  396. package/dist/agents/infoPlanGenStep.js +66 -8
  397. package/dist/agents/infoPlanGenStep.js.map +1 -0
  398. package/dist/agents/integrateFeedbackStep.js +1 -0
  399. package/dist/agents/integrateFeedbackStep.js.map +1 -0
  400. package/dist/agents/iterationFileSelector.js +8 -7
  401. package/dist/agents/iterationFileSelector.js.map +1 -0
  402. package/dist/agents/mainAgentActivityLog.js +85 -0
  403. package/dist/agents/mainAgentActivityLog.js.map +1 -0
  404. package/dist/agents/mainAgentHeuristics.js +173 -0
  405. package/dist/agents/mainAgentHeuristics.js.map +1 -0
  406. package/dist/agents/mainAgentVerify.js +159 -0
  407. package/dist/agents/mainAgentVerify.js.map +1 -0
  408. package/dist/agents/objectiveEvaluatorStep.js +103 -0
  409. package/dist/agents/objectiveEvaluatorStep.js.map +1 -0
  410. package/dist/agents/outerLoopRecoveryEvaluator.js +108 -0
  411. package/dist/agents/outerLoopRecoveryEvaluator.js.map +1 -0
  412. package/dist/agents/readinessGateStep.js +95 -9
  413. package/dist/agents/readinessGateStep.js.map +1 -0
  414. package/dist/agents/reasonNextStep.js +9 -8
  415. package/dist/agents/reasonNextStep.js.map +1 -0
  416. package/dist/agents/reasonNextTaskStep.js +267 -144
  417. package/dist/agents/reasonNextTaskStep.js.map +1 -0
  418. package/dist/agents/researchPlanGenStep.js +61 -25
  419. package/dist/agents/researchPlanGenStep.js.map +1 -0
  420. package/dist/agents/resolveAgentTargetClassification.js +5 -0
  421. package/dist/agents/resolveAgentTargetClassification.js.map +1 -0
  422. package/dist/agents/resolveExecutionModeStep.js +1 -0
  423. package/dist/agents/resolveExecutionModeStep.js.map +1 -0
  424. package/dist/agents/resolveExplicitTargetsStep.js +74 -0
  425. package/dist/agents/resolveExplicitTargetsStep.js.map +1 -0
  426. package/dist/agents/routingDecisionStep.js +58 -11
  427. package/dist/agents/routingDecisionStep.js.map +1 -0
  428. package/dist/agents/scopeClassificationStep.js +66 -3
  429. package/dist/agents/scopeClassificationStep.js.map +1 -0
  430. package/dist/agents/selectRelevantSourcesStep.js +13 -5
  431. package/dist/agents/selectRelevantSourcesStep.js.map +1 -0
  432. package/dist/agents/structuralPreloadStep.js +3 -4
  433. package/dist/agents/structuralPreloadStep.js.map +1 -0
  434. package/dist/agents/transformPlanGenStep.js +105 -18
  435. package/dist/agents/transformPlanGenStep.js.map +1 -0
  436. package/dist/agents/understandIntentStep.js +237 -17
  437. package/dist/agents/understandIntentStep.js.map +1 -0
  438. package/dist/agents/validateChangesStep.js +16 -2
  439. package/dist/agents/validateChangesStep.js.map +1 -0
  440. package/dist/agents/writeFileStep.js +1 -0
  441. package/dist/agents/writeFileStep.js.map +1 -0
  442. package/dist/commands/AskCmd.js +139 -44
  443. package/dist/commands/AskCmd.js.map +1 -0
  444. package/dist/commands/BackupCmd.js +1 -0
  445. package/dist/commands/BackupCmd.js.map +1 -0
  446. package/dist/commands/ChangeLogUpdateCmd.js +1 -0
  447. package/dist/commands/ChangeLogUpdateCmd.js.map +1 -0
  448. package/dist/commands/CommitSuggesterCmd.js +55 -13
  449. package/dist/commands/CommitSuggesterCmd.js.map +1 -0
  450. package/dist/commands/DaemonCmd.js +52 -14
  451. package/dist/commands/DaemonCmd.js.map +1 -0
  452. package/dist/commands/DeleteIndex.js +1 -0
  453. package/dist/commands/DeleteIndex.js.map +1 -0
  454. package/dist/commands/EvalReportCmd.js +374 -0
  455. package/dist/commands/EvalReportCmd.js.map +1 -0
  456. package/dist/commands/FindCmd.js +1 -0
  457. package/dist/commands/FindCmd.js.map +1 -0
  458. package/dist/commands/GitCmd.js +1 -0
  459. package/dist/commands/GitCmd.js.map +1 -0
  460. package/dist/commands/IndexCmd.js +11 -79
  461. package/dist/commands/IndexCmd.js.map +1 -0
  462. package/dist/commands/InspectCmd.js +1 -0
  463. package/dist/commands/InspectCmd.js.map +1 -0
  464. package/dist/commands/ModelCmd.js +24 -0
  465. package/dist/commands/ModelCmd.js.map +1 -0
  466. package/dist/commands/ReadlineSingleton.js +1 -0
  467. package/dist/commands/ReadlineSingleton.js.map +1 -0
  468. package/dist/commands/ResetDbCmd.js +18 -1
  469. package/dist/commands/ResetDbCmd.js.map +1 -0
  470. package/dist/commands/ReviewCmd.js +1 -0
  471. package/dist/commands/ReviewCmd.js.map +1 -0
  472. package/dist/commands/StatusCmd.js +22 -0
  473. package/dist/commands/StatusCmd.js.map +1 -0
  474. package/dist/commands/StopDaemonCmd.js +1 -0
  475. package/dist/commands/StopDaemonCmd.js.map +1 -0
  476. package/dist/commands/SummaryCmd.js +1 -0
  477. package/dist/commands/SummaryCmd.js.map +1 -0
  478. package/dist/commands/SwitchCmd.js +9 -15
  479. package/dist/commands/SwitchCmd.js.map +1 -0
  480. package/dist/commands/TasksCmd.js +142 -57
  481. package/dist/commands/TasksCmd.js.map +1 -0
  482. package/dist/commands/TestCmd.js +66 -0
  483. package/dist/commands/TestCmd.js.map +1 -0
  484. package/dist/commands/WorkflowCmd.js +1 -0
  485. package/dist/commands/WorkflowCmd.js.map +1 -0
  486. package/dist/commands/commandVisibility.js +27 -0
  487. package/dist/commands/commandVisibility.js.map +1 -0
  488. package/dist/commands/evalCommands.js +1337 -0
  489. package/dist/commands/evalCommands.js.map +1 -0
  490. package/dist/commands/factory.js +206 -38
  491. package/dist/commands/factory.js.map +1 -0
  492. package/dist/config.js +62 -11
  493. package/dist/config.js.map +1 -0
  494. package/dist/constants.js +21 -3
  495. package/dist/constants.js.map +1 -0
  496. package/dist/context.js +33 -32
  497. package/dist/context.js.map +1 -0
  498. package/dist/daemon/daemonQueues.js +1 -20
  499. package/dist/daemon/daemonQueues.js.map +1 -0
  500. package/dist/daemon/daemonWorker.js +26 -37
  501. package/dist/daemon/daemonWorker.js.map +1 -0
  502. package/dist/daemon/generateSummaries.js +1 -0
  503. package/dist/daemon/generateSummaries.js.map +1 -0
  504. package/dist/daemon/runFolderCapsuleBatch.js +1 -0
  505. package/dist/daemon/runFolderCapsuleBatch.js.map +1 -0
  506. package/dist/daemon/runIndexingBatch.js +1 -0
  507. package/dist/daemon/runIndexingBatch.js.map +1 -0
  508. package/dist/daemon/runKgBatch.js +9 -1
  509. package/dist/daemon/runKgBatch.js.map +1 -0
  510. package/dist/db/backup.js +1 -0
  511. package/dist/db/backup.js.map +1 -0
  512. package/dist/db/client.js +18 -3
  513. package/dist/db/client.js.map +1 -0
  514. package/dist/db/fileIndex.js +110 -152
  515. package/dist/db/fileIndex.js.map +1 -0
  516. package/dist/db/functionExtractors/extractFromJava.js +1 -0
  517. package/dist/db/functionExtractors/extractFromJava.js.map +1 -0
  518. package/dist/db/functionExtractors/extractFromJs.js +1 -0
  519. package/dist/db/functionExtractors/extractFromJs.js.map +1 -0
  520. package/dist/db/functionExtractors/extractFromTs.js +1 -0
  521. package/dist/db/functionExtractors/extractFromTs.js.map +1 -0
  522. package/dist/db/functionExtractors/extractFromXML.js +1 -0
  523. package/dist/db/functionExtractors/extractFromXML.js.map +1 -0
  524. package/dist/db/functionExtractors/index.js +1 -0
  525. package/dist/db/functionExtractors/index.js.map +1 -0
  526. package/dist/db/functionIndex.js +9 -0
  527. package/dist/db/functionIndex.js.map +1 -0
  528. package/dist/db/schema.js +314 -99
  529. package/dist/db/schema.js.map +1 -0
  530. package/dist/db/sqlTemplates.js +1 -0
  531. package/dist/db/sqlTemplates.js.map +1 -0
  532. package/dist/fileRules/builtins.js +1 -0
  533. package/dist/fileRules/builtins.js.map +1 -0
  534. package/dist/fileRules/classifyFile.js +1 -0
  535. package/dist/fileRules/classifyFile.js.map +1 -0
  536. package/dist/fileRules/codeAllowedExtensions.js +1 -0
  537. package/dist/fileRules/codeAllowedExtensions.js.map +1 -0
  538. package/dist/fileRules/detectFileType.js +1 -0
  539. package/dist/fileRules/detectFileType.js.map +1 -0
  540. package/dist/fileRules/fileClassifier.js +1 -0
  541. package/dist/fileRules/fileClassifier.js.map +1 -0
  542. package/dist/fileRules/fileExceptions.js +1 -0
  543. package/dist/fileRules/fileExceptions.js.map +1 -0
  544. package/dist/fileRules/ignoredExtensions.js +1 -0
  545. package/dist/fileRules/ignoredExtensions.js.map +1 -0
  546. package/dist/fileRules/ignoredPaths.js +48 -5
  547. package/dist/fileRules/ignoredPaths.js.map +1 -0
  548. package/dist/fileRules/queryTokenRules.js +176 -0
  549. package/dist/fileRules/queryTokenRules.js.map +1 -0
  550. package/dist/fileRules/searchPathClassification.js +58 -0
  551. package/dist/fileRules/searchPathClassification.js.map +1 -0
  552. package/dist/fileRules/shouldIgnoreFiles.js +1 -0
  553. package/dist/fileRules/shouldIgnoreFiles.js.map +1 -0
  554. package/dist/fileRules/stopWords.js +9 -0
  555. package/dist/fileRules/stopWords.js.map +1 -0
  556. package/dist/fileRules/wellKnownRepoFiles.js +1 -0
  557. package/dist/fileRules/wellKnownRepoFiles.js.map +1 -0
  558. package/dist/git/commitSummary.js +227 -0
  559. package/dist/git/commitSummary.js.map +1 -0
  560. package/dist/github/api.js +1 -0
  561. package/dist/github/api.js.map +1 -0
  562. package/dist/github/auth.js +1 -0
  563. package/dist/github/auth.js.map +1 -0
  564. package/dist/github/github.js +1 -0
  565. package/dist/github/github.js.map +1 -0
  566. package/dist/github/githubAuthCheck.js +1 -0
  567. package/dist/github/githubAuthCheck.js.map +1 -0
  568. package/dist/github/postComments.js +1 -0
  569. package/dist/github/postComments.js.map +1 -0
  570. package/dist/github/repo.js +15 -24
  571. package/dist/github/repo.js.map +1 -0
  572. package/dist/github/token.js +1 -0
  573. package/dist/github/token.js.map +1 -0
  574. package/dist/github/types.js +1 -0
  575. package/dist/github/types.js.map +1 -0
  576. package/dist/index.js +318 -37
  577. package/dist/index.js.map +1 -0
  578. package/dist/lib/generate.js +264 -20
  579. package/dist/lib/generate.js.map +1 -0
  580. package/dist/lib/generateFolderCapsules.js +1 -0
  581. package/dist/lib/generateFolderCapsules.js.map +1 -0
  582. package/dist/lib/ollamaModelPolicy.js +59 -0
  583. package/dist/lib/ollamaModelPolicy.js.map +1 -0
  584. package/dist/lib/spinner.js +29 -9
  585. package/dist/lib/spinner.js.map +1 -0
  586. package/dist/modelSetup.js +25 -78
  587. package/dist/modelSetup.js.map +1 -0
  588. package/dist/pipeline/modules/changeLogModule.js +10 -1
  589. package/dist/pipeline/modules/changeLogModule.js.map +1 -0
  590. package/dist/pipeline/modules/cleanupModule.js +1 -0
  591. package/dist/pipeline/modules/cleanupModule.js.map +1 -0
  592. package/dist/pipeline/modules/codeTransformModule.js +10 -16
  593. package/dist/pipeline/modules/codeTransformModule.js.map +1 -0
  594. package/dist/pipeline/modules/commentModule.js +12 -0
  595. package/dist/pipeline/modules/commentModule.js.map +1 -0
  596. package/dist/pipeline/modules/commitSuggesterModule.js +82 -12
  597. package/dist/pipeline/modules/commitSuggesterModule.js.map +1 -0
  598. package/dist/pipeline/modules/contextReviewModule.js +12 -1
  599. package/dist/pipeline/modules/contextReviewModule.js.map +1 -0
  600. package/dist/pipeline/modules/dialogAnswerModule.js +58 -0
  601. package/dist/pipeline/modules/dialogAnswerModule.js.map +1 -0
  602. package/dist/pipeline/modules/fileSearchModule.js +5 -143
  603. package/dist/pipeline/modules/fileSearchModule.js.map +1 -0
  604. package/dist/pipeline/modules/finalAnswerModule.js +1176 -151
  605. package/dist/pipeline/modules/finalAnswerModule.js.map +1 -0
  606. package/dist/pipeline/modules/kgModule.js +18 -1
  607. package/dist/pipeline/modules/kgModule.js.map +1 -0
  608. package/dist/pipeline/modules/planAnswerModule.js +99 -0
  609. package/dist/pipeline/modules/planAnswerModule.js.map +1 -0
  610. package/dist/pipeline/modules/readFileModule.js +300 -0
  611. package/dist/pipeline/modules/readFileModule.js.map +1 -0
  612. package/dist/pipeline/modules/reviewModule.js +10 -1
  613. package/dist/pipeline/modules/reviewModule.js.map +1 -0
  614. package/dist/pipeline/modules/searchDbModule.js +159 -0
  615. package/dist/pipeline/modules/searchDbModule.js.map +1 -0
  616. package/dist/pipeline/modules/searchListDirectoryModule.js +62 -0
  617. package/dist/pipeline/modules/searchListDirectoryModule.js.map +1 -0
  618. package/dist/pipeline/modules/searchModuleShared.js +71 -0
  619. package/dist/pipeline/modules/searchModuleShared.js.map +1 -0
  620. package/dist/pipeline/modules/searchRegexModule.js +59 -0
  621. package/dist/pipeline/modules/searchRegexModule.js.map +1 -0
  622. package/dist/pipeline/modules/semanticAnalysisModule.js +185 -28
  623. package/dist/pipeline/modules/semanticAnalysisModule.js.map +1 -0
  624. package/dist/pipeline/modules/summaryModule.js +11 -1
  625. package/dist/pipeline/modules/summaryModule.js.map +1 -0
  626. package/dist/pipeline/registry/moduleRegistry.js +9 -0
  627. package/dist/pipeline/registry/moduleRegistry.js.map +1 -0
  628. package/dist/pipeline/runModulePipeline.js +1 -0
  629. package/dist/pipeline/runModulePipeline.js.map +1 -0
  630. package/dist/scripts/dbScriptSupport.js +172 -0
  631. package/dist/scripts/dbScriptSupport.js.map +1 -0
  632. package/dist/scripts/dbcheck.js +173 -267
  633. package/dist/scripts/dbcheck.js.map +1 -0
  634. package/dist/scripts/dboverview.js +161 -0
  635. package/dist/scripts/dboverview.js.map +1 -0
  636. package/dist/scripts/migrateDb.js +1 -0
  637. package/dist/scripts/migrateDb.js.map +1 -0
  638. package/dist/search/SearchOrchestrator.js +928 -0
  639. package/dist/search/SearchOrchestrator.js.map +1 -0
  640. package/dist/search/sharedRankingPolicy.js +283 -0
  641. package/dist/search/sharedRankingPolicy.js.map +1 -0
  642. package/dist/setup/reindexOwner.js +97 -0
  643. package/dist/setup/reindexOwner.js.map +1 -0
  644. package/dist/setup/setupOwner.js +100 -0
  645. package/dist/setup/setupOwner.js.map +1 -0
  646. package/dist/shell/dialogUi.js +81 -0
  647. package/dist/shell/dialogUi.js.map +1 -0
  648. package/dist/shellSession.js +126 -0
  649. package/dist/shellSession.js.map +1 -0
  650. package/dist/status/statusOwner.js +239 -0
  651. package/dist/status/statusOwner.js.map +1 -0
  652. package/dist/testing/contextEval.js +514 -0
  653. package/dist/testing/contextEval.js.map +1 -0
  654. package/dist/testing/fixtures/transform/small-file.input.js +5 -0
  655. package/dist/testing/fixtures/transform/small-file.input.js.map +1 -0
  656. package/dist/testing/harnessArtifacts.js +112 -0
  657. package/dist/testing/harnessArtifacts.js.map +1 -0
  658. package/dist/testing/llmTraceSession.js +67 -0
  659. package/dist/testing/llmTraceSession.js.map +1 -0
  660. package/dist/testing/registerDevCliCommands.js +43 -0
  661. package/dist/testing/registerDevCliCommands.js.map +1 -0
  662. package/dist/testing/runDiagnosis.js +248 -0
  663. package/dist/testing/runDiagnosis.js.map +1 -0
  664. package/dist/testing/runtimeLogReader.js +144 -0
  665. package/dist/testing/runtimeLogReader.js.map +1 -0
  666. package/dist/testing/testCommands.js +35 -303
  667. package/dist/testing/testCommands.js.map +1 -0
  668. package/dist/testing/testRegistry.js +233 -0
  669. package/dist/testing/testRegistry.js.map +1 -0
  670. package/dist/types.js +1 -0
  671. package/dist/types.js.map +1 -0
  672. package/dist/utils/buildContextualPrompt.js +26 -75
  673. package/dist/utils/buildContextualPrompt.js.map +1 -0
  674. package/dist/utils/changeLogPrompt.js +1 -0
  675. package/dist/utils/changeLogPrompt.js.map +1 -0
  676. package/dist/utils/checkModel.js +17 -92
  677. package/dist/utils/checkModel.js.map +1 -0
  678. package/dist/utils/commentMap.js +1 -0
  679. package/dist/utils/commentMap.js.map +1 -0
  680. package/dist/utils/compileSearchQuery.js +23 -9
  681. package/dist/utils/compileSearchQuery.js.map +1 -0
  682. package/dist/utils/consolePresentation.js +208 -0
  683. package/dist/utils/consolePresentation.js.map +1 -0
  684. package/dist/utils/contentUtils.js +17 -2
  685. package/dist/utils/contentUtils.js.map +1 -0
  686. package/dist/utils/debugContext.js +1 -0
  687. package/dist/utils/debugContext.js.map +1 -0
  688. package/dist/utils/dialogState.js +201 -0
  689. package/dist/utils/dialogState.js.map +1 -0
  690. package/dist/utils/editor.js +1 -0
  691. package/dist/utils/editor.js.map +1 -0
  692. package/dist/utils/executionEvidence.js +50 -0
  693. package/dist/utils/executionEvidence.js.map +1 -0
  694. package/dist/utils/extractFileReferences.js +140 -6
  695. package/dist/utils/extractFileReferences.js.map +1 -0
  696. package/dist/utils/fileEvidenceCache.js +50 -0
  697. package/dist/utils/fileEvidenceCache.js.map +1 -0
  698. package/dist/utils/fileTree.js +1 -0
  699. package/dist/utils/fileTree.js.map +1 -0
  700. package/dist/utils/loadRelevantFolderCapsules.js +35 -5
  701. package/dist/utils/loadRelevantFolderCapsules.js.map +1 -0
  702. package/dist/utils/log.js +10 -1
  703. package/dist/utils/log.js.map +1 -0
  704. package/dist/utils/normalizeData.js +1 -0
  705. package/dist/utils/normalizeData.js.map +1 -0
  706. package/dist/utils/ollamaModelStatus.js +28 -0
  707. package/dist/utils/ollamaModelStatus.js.map +1 -0
  708. package/dist/utils/ollamaService.js +294 -0
  709. package/dist/utils/ollamaService.js.map +1 -0
  710. package/dist/utils/outputFormatter.js +1 -0
  711. package/dist/utils/outputFormatter.js.map +1 -0
  712. package/dist/utils/parseTaggedContent.js +1 -0
  713. package/dist/utils/parseTaggedContent.js.map +1 -0
  714. package/dist/utils/planActions.js +27 -46
  715. package/dist/utils/planActions.js.map +1 -0
  716. package/dist/utils/promptBuilderHelper.js +1 -0
  717. package/dist/utils/promptBuilderHelper.js.map +1 -0
  718. package/dist/utils/promptLogHelper.js +29 -13
  719. package/dist/utils/promptLogHelper.js.map +1 -0
  720. package/dist/utils/queryAnchors.js +71 -0
  721. package/dist/utils/queryAnchors.js.map +1 -0
  722. package/dist/utils/repoIdentity.js +82 -0
  723. package/dist/utils/repoIdentity.js.map +1 -0
  724. package/dist/utils/repoKey.js +1 -0
  725. package/dist/utils/repoKey.js.map +1 -0
  726. package/dist/utils/resolveTargetsToFiles.js +1 -0
  727. package/dist/utils/resolveTargetsToFiles.js.map +1 -0
  728. package/dist/utils/resumeContext.js +219 -0
  729. package/dist/utils/resumeContext.js.map +1 -0
  730. package/dist/utils/resumeState.js +310 -0
  731. package/dist/utils/resumeState.js.map +1 -0
  732. package/dist/utils/rollingPlan.js +118 -0
  733. package/dist/utils/rollingPlan.js.map +1 -0
  734. package/dist/utils/runQueryWithDaemonControl.js +11 -3
  735. package/dist/utils/runQueryWithDaemonControl.js.map +1 -0
  736. package/dist/utils/runtimeLogger.js +252 -0
  737. package/dist/utils/runtimeLogger.js.map +1 -0
  738. package/dist/utils/sanitizeQuery.js +1 -0
  739. package/dist/utils/sanitizeQuery.js.map +1 -0
  740. package/dist/utils/sharedUtils.js +1 -0
  741. package/dist/utils/sharedUtils.js.map +1 -0
  742. package/dist/utils/sleep.js +1 -0
  743. package/dist/utils/sleep.js.map +1 -0
  744. package/dist/utils/splitCodeIntoChunk.js +1 -0
  745. package/dist/utils/splitCodeIntoChunk.js.map +1 -0
  746. package/dist/utils/time.js +66 -0
  747. package/dist/utils/time.js.map +1 -0
  748. package/dist/utils/verifyFocusPreference.js +107 -0
  749. package/dist/utils/verifyFocusPreference.js.map +1 -0
  750. package/dist/utils/vscode.js +1 -0
  751. package/dist/utils/vscode.js.map +1 -0
  752. package/dist/workflow/workflowResolver.js +1 -0
  753. package/dist/workflow/workflowResolver.js.map +1 -0
  754. package/dist/workflow/workflowRunner.js +1 -0
  755. package/dist/workflow/workflowRunner.js.map +1 -0
  756. package/package.json +3 -3
  757. package/dist/agents/MainAgent.js +0 -1886
  758. package/dist/agents/contextReviewStep.js +0 -101
  759. package/dist/agents/finalPlanGenStep.js +0 -107
  760. package/dist/agents/structuralAnalysisStep.js +0 -46
  761. package/dist/agents/validationAnalysisStep.js +0 -87
  762. package/dist/pipeline/modules/chunkManagerModule.js +0 -24
  763. package/dist/pipeline/modules/cleanGeneratedTestsModule.js +0 -33
  764. package/dist/pipeline/modules/fileReaderModule.js +0 -72
  765. package/dist/pipeline/modules/gatherInfoModule.js +0 -181
  766. package/dist/pipeline/modules/generateTestsModule.js +0 -68
  767. package/dist/pipeline/modules/preserveCodeModule.js +0 -195
  768. package/dist/pipeline/modules/refactorModule.js +0 -40
  769. package/dist/pipeline/modules/repairTestsModule.js +0 -48
  770. package/dist/pipeline/modules/runTestsModule.js +0 -37
@@ -1,64 +1,158 @@
1
+ /**
2
+ * Starts one CLI ask run through the modular agent runtime.
3
+ *
4
+ * Why this exists:
5
+ * - CLI asks still bootstrap the live runtime state from one entry point
6
+ * - the command owns prompt handling and task binding defaults
7
+ * - the new agent now owns all live ask and plan-only flows
8
+ * - stop messages should flow through one shared output path
9
+ */
1
10
  import readline from 'readline';
2
11
  import { getIndexDir } from '../constants.js';
3
- import { MainAgent } from '../agents/MainAgent.js';
12
+ import { Agent } from '../agent/index.js';
13
+ import { AgentRuntimeError } from '../agent/types.js';
4
14
  import { Spinner } from '../lib/spinner.js';
5
15
  import { clearRunLog } from '../utils/promptLogHelper.js';
6
- export async function runAskCommand(query) {
16
+ import { createConsoleAgentUI, emitFinalAnswerBlock, formatConsoleDuration, formatAgentLaunchMessage, formatIndexRootMessage, formatStructuredAgentIncomplete, formatStructuredAgentFailure, formatTopLevelAgentFailure, } from '../utils/consolePresentation.js';
17
+ import { logRunStart, logRuntimeRecord } from '../utils/runtimeLogger.js';
18
+ import { initSchema } from '../db/schema.js';
19
+ import { resolveAgentResumeTaskId } from '../agent/persistence/index.js';
20
+ import { getDbForRepo } from '../db/client.js';
21
+ import { startTimer } from '../utils/time.js';
22
+ export async function runAskCommand(query, options) {
7
23
  // STEP 0: Get user query
8
24
  if (!query)
9
25
  query = await promptOnce('💬 Ask your question:\n');
10
26
  query = query.trim();
11
27
  if (!query) {
12
28
  console.error('❌ No question provided.\n👉 Usage: scai ask "your question"');
13
- return;
29
+ return undefined;
14
30
  }
15
31
  clearRunLog();
16
- console.log(`📁 Using index root: ${getIndexDir()}`);
17
- const now = new Date().toISOString();
18
- const context = {
19
- task: {
20
- id: 0,
21
- projectId: 0,
22
- status: "active",
23
- initialQuery: query,
24
- createdAt: now,
25
- updatedAt: now,
26
- taskSteps: [],
27
- },
28
- initContext: {
29
- userQuery: query,
30
- relatedFiles: [],
31
- relatedFileScores: {},
32
- folderCapsules: [],
33
- queryExpansionTerms: [],
34
- },
35
- };
32
+ const runtime = "agent";
33
+ logRunStart(runtime, query);
34
+ initSchema();
35
+ let currentTaskId = options?.agentMemory?.task.id;
36
+ const spinner = new Spinner();
37
+ const ui = createConsoleAgentUI(spinner, runtime, () => currentTaskId);
38
+ const stopTimer = startTimer();
36
39
  // STEP 1: Run agent
37
40
  try {
38
- console.log('\n🤖 Launching autonomous agent...');
39
- const spinner = new Spinner();
41
+ ui.message(formatIndexRootMessage(getIndexDir()));
42
+ ui.message(formatAgentLaunchMessage(runtime));
40
43
  spinner.start();
41
- const ui = {
42
- update: text => spinner.update(text),
43
- pause: fn => {
44
- spinner.stop(); // pause spinner
45
- try {
46
- fn();
47
- }
48
- finally {
49
- spinner.start(); // resume spinner
50
- }
51
- },
52
- succeed: msg => spinner.succeed(msg),
53
- fail: msg => spinner.fail(msg),
54
- stop: () => spinner.stop() // ✅ proper stop implementation
55
- };
56
- const agent = new MainAgent(context, ui);
57
- await agent.run();
58
- spinner.succeed('Done');
44
+ const effectiveResumeTaskId = resolveAgentResumeTaskId(options?.resumeTaskId, options?.continueCurrentTask, getDbForRepo());
45
+ const agent = new Agent(query, ui, options?.agentMemory, {
46
+ planOnly: options?.planOnly === true,
47
+ resumeTaskId: effectiveResumeTaskId,
48
+ bindAsCurrentTask: options?.bindAsCurrentTask ?? options?.continueCurrentTask !== false,
49
+ });
50
+ const memory = await agent.run();
51
+ if (memory?.task?.id) {
52
+ currentTaskId = memory.task.id;
53
+ }
54
+ const durationMs = stopTimer();
55
+ const durationText = formatConsoleDuration(durationMs);
56
+ if (memory.artifacts.finalAnswer) {
57
+ emitFinalAnswerBlock(ui, memory.artifacts.finalAnswer);
58
+ spinner.succeed(`Done (${durationText})`);
59
+ logRuntimeRecord({
60
+ runtime,
61
+ taskId: currentTaskId,
62
+ kind: "task",
63
+ phase: "finalized",
64
+ status: "done",
65
+ summary: `run completed in ${durationText}`,
66
+ payload: {
67
+ query,
68
+ durationMs,
69
+ durationText,
70
+ },
71
+ });
72
+ }
73
+ else {
74
+ ui.message(memory.artifacts.stopMessage ?? formatStructuredAgentIncomplete({
75
+ status: memory.task.status,
76
+ reason: memory.task.stopReason,
77
+ }));
78
+ if (memory.task.status === "waiting") {
79
+ spinner.fail(`Waiting for input (${durationText})`);
80
+ }
81
+ else {
82
+ spinner.fail(`Agent stopped (${durationText})`);
83
+ }
84
+ logRuntimeRecord({
85
+ runtime,
86
+ taskId: currentTaskId,
87
+ kind: "task",
88
+ phase: "finalized",
89
+ status: memory.task.status === "waiting"
90
+ ? "waiting"
91
+ : memory.task.status === "blocked"
92
+ ? "blocked"
93
+ : "failed",
94
+ summary: `run stopped after ${durationText}`,
95
+ payload: {
96
+ query,
97
+ status: memory.task.status,
98
+ reason: memory.task.stopReason ?? null,
99
+ durationMs,
100
+ durationText,
101
+ },
102
+ });
103
+ }
104
+ return memory;
59
105
  }
60
106
  catch (err) {
61
- console.error('❌ Autonomous agent run failed:', err);
107
+ const durationMs = stopTimer();
108
+ const durationText = formatConsoleDuration(durationMs);
109
+ spinner.stop();
110
+ if (err instanceof AgentRuntimeError) {
111
+ ui.message(formatStructuredAgentFailure(err.details));
112
+ logRuntimeRecord({
113
+ runtime,
114
+ taskId: currentTaskId,
115
+ kind: "task",
116
+ phase: "failed",
117
+ status: "error",
118
+ summary: `run failed after ${durationText}`,
119
+ payload: {
120
+ query,
121
+ durationMs,
122
+ durationText,
123
+ ...err.details,
124
+ },
125
+ });
126
+ ui.stop();
127
+ return undefined;
128
+ }
129
+ const message = err instanceof Error ? err.message : String(err);
130
+ ui.message(formatTopLevelAgentFailure(runtime, message));
131
+ logRuntimeRecord({
132
+ runtime,
133
+ kind: "error",
134
+ phase: "failed",
135
+ status: "error",
136
+ summary: "Top-level ask command failed.",
137
+ payload: {
138
+ message,
139
+ },
140
+ });
141
+ logRuntimeRecord({
142
+ runtime,
143
+ taskId: currentTaskId,
144
+ kind: "task",
145
+ phase: "failed",
146
+ status: "error",
147
+ summary: `run failed after ${durationText}`,
148
+ payload: {
149
+ query,
150
+ durationMs,
151
+ durationText,
152
+ message,
153
+ },
154
+ });
155
+ return undefined;
62
156
  }
63
157
  }
64
158
  // helper
@@ -72,3 +166,4 @@ function promptOnce(promptText) {
72
166
  });
73
167
  });
74
168
  }
169
+ //# sourceMappingURL=AskCmd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AskCmd.js","sourceRoot":"","sources":["../../src/commands/AskCmd.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Starts one CLI ask run through the modular agent runtime.\n *\n * Why this exists:\n * - CLI asks still bootstrap the live runtime state from one entry point\n * - the command owns prompt handling and task binding defaults\n * - the new agent now owns all live ask and plan-only flows\n * - stop messages should flow through one shared output path\n */\nimport readline from 'readline';\nimport { getIndexDir } from '../constants.js';\nimport { AgentUI } from '../types.js';\nimport { Agent } from '../agent/index.js';\nimport { AgentRuntimeError, type AgentMemory } from '../agent/types.js';\nimport { Spinner } from '../lib/spinner.js';\nimport { clearRunLog } from '../utils/promptLogHelper.js';\nimport {\n createConsoleAgentUI,\n emitFinalAnswerBlock,\n formatConsoleDuration,\n formatAgentLaunchMessage,\n formatIndexRootMessage,\n formatStructuredAgentIncomplete,\n formatStructuredAgentFailure,\n formatTopLevelAgentFailure,\n} from '../utils/consolePresentation.js';\nimport { logRunStart, logRuntimeRecord } from '../utils/runtimeLogger.js';\nimport { initSchema } from '../db/schema.js';\nimport { resolveAgentResumeTaskId } from '../agent/persistence/index.js';\nimport { getDbForRepo } from '../db/client.js';\nimport { startTimer } from '../utils/time.js';\n\nexport async function runAskCommand(\n query?: string,\n options?: {\n resumeTaskId?: number;\n continueCurrentTask?: boolean;\n bindAsCurrentTask?: boolean;\n runtime?: \"agent\";\n agentMemory?: AgentMemory;\n planOnly?: boolean;\n }\n): Promise<AgentMemory | undefined> {\n // STEP 0: Get user query\r\n if (!query) query = await promptOnce('💬 Ask your question:\\n');\r\n query = query.trim();\n if (!query) {\n console.error('❌ No question provided.\\n👉 Usage: scai ask \"your question\"');\n return undefined;\n }\n\n clearRunLog();\n const runtime = \"agent\";\n logRunStart(runtime, query);\n initSchema();\n let currentTaskId: string | number | undefined = options?.agentMemory?.task.id;\n const spinner = new Spinner();\n const ui: AgentUI = createConsoleAgentUI(spinner, runtime, () => currentTaskId);\n const stopTimer = startTimer();\n\n // STEP 1: Run agent\n try {\n ui.message(formatIndexRootMessage(getIndexDir()));\n ui.message(formatAgentLaunchMessage(runtime));\n\n spinner.start();\n\n const effectiveResumeTaskId = resolveAgentResumeTaskId(\n options?.resumeTaskId,\n options?.continueCurrentTask,\n getDbForRepo()\n );\n const agent = new Agent(query, ui, options?.agentMemory, {\n planOnly: options?.planOnly === true,\n resumeTaskId: effectiveResumeTaskId,\n bindAsCurrentTask: options?.bindAsCurrentTask ?? options?.continueCurrentTask !== false,\n });\n const memory = await agent.run();\n if (memory?.task?.id) {\n currentTaskId = memory.task.id;\n }\n const durationMs = stopTimer();\n const durationText = formatConsoleDuration(durationMs);\n if (memory.artifacts.finalAnswer) {\n emitFinalAnswerBlock(ui, memory.artifacts.finalAnswer);\n spinner.succeed(`Done (${durationText})`);\n logRuntimeRecord({\n runtime,\n taskId: currentTaskId,\n kind: \"task\",\n phase: \"finalized\",\n status: \"done\",\n summary: `run completed in ${durationText}`,\n payload: {\n query,\n durationMs,\n durationText,\n },\n });\n } else {\n ui.message(memory.artifacts.stopMessage ?? formatStructuredAgentIncomplete({\n status: memory.task.status,\n reason: memory.task.stopReason,\n }));\n if (memory.task.status === \"waiting\") {\n spinner.fail(`Waiting for input (${durationText})`);\n } else {\n spinner.fail(`Agent stopped (${durationText})`);\n }\n logRuntimeRecord({\n runtime,\n taskId: currentTaskId,\n kind: \"task\",\n phase: \"finalized\",\n status: memory.task.status === \"waiting\"\n ? \"waiting\"\n : memory.task.status === \"blocked\"\n ? \"blocked\"\n : \"failed\",\n summary: `run stopped after ${durationText}`,\n payload: {\n query,\n status: memory.task.status,\n reason: memory.task.stopReason ?? null,\n durationMs,\n durationText,\n },\n });\n }\n return memory;\n } catch (err) {\n const durationMs = stopTimer();\n const durationText = formatConsoleDuration(durationMs);\n spinner.stop();\n if (err instanceof AgentRuntimeError) {\n ui.message(formatStructuredAgentFailure(err.details));\n logRuntimeRecord({\n runtime,\n taskId: currentTaskId,\n kind: \"task\",\n phase: \"failed\",\n status: \"error\",\n summary: `run failed after ${durationText}`,\n payload: {\n query,\n durationMs,\n durationText,\n ...err.details,\n },\n });\n ui.stop();\n return undefined;\n }\n const message = err instanceof Error ? err.message : String(err);\n ui.message(formatTopLevelAgentFailure(runtime, message));\n logRuntimeRecord({\n runtime,\n kind: \"error\",\n phase: \"failed\",\n status: \"error\",\n summary: \"Top-level ask command failed.\",\n payload: {\n message,\n },\n });\n logRuntimeRecord({\n runtime,\n taskId: currentTaskId,\n kind: \"task\",\n phase: \"failed\",\n status: \"error\",\n summary: `run failed after ${durationText}`,\n payload: {\n query,\n durationMs,\n durationText,\n message,\n },\n });\n return undefined;\n }\n}\n\r\n// helper\r\nfunction promptOnce(promptText: string): Promise<string> {\r\n return new Promise(resolve => {\r\n console.log(promptText);\r\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\r\n rl.question('> ', answer => {\r\n rl.close();\r\n resolve(answer.trim());\r\n });\r\n });\r\n}\r\n\r\n"]}
@@ -10,3 +10,4 @@ export async function runBackupCommand() {
10
10
  console.error('❌ Backup failed.');
11
11
  }
12
12
  }
13
+ //# sourceMappingURL=BackupCmd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BackupCmd.js","sourceRoot":"","sources":["../../src/commands/BackupCmd.ts"],"names":[],"mappings":"AAAA,4BAA4B;AAE5B,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnD,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,MAAM,gBAAgB,EAAE,CAAC;IAExC,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IACpC,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;IACpC,CAAC;AACH,CAAC","sourcesContent":["// src/commands/BackupCmd.ts\r\n\r\nimport { backupScaiFolder } from '../db/backup.js';\r\n\r\nexport async function runBackupCommand() {\r\n console.log('🔁 Backing up .scai folder...');\r\n const result = await backupScaiFolder();\r\n\r\n if (result) {\r\n console.log('✅ Backup complete.');\r\n } else {\r\n console.error('❌ Backup failed.');\r\n }\r\n}\r\n"]}
@@ -132,3 +132,4 @@ export async function handleChangelogWithCommitMessage(commitMsg) {
132
132
  }
133
133
  }
134
134
  }
135
+ //# sourceMappingURL=ChangeLogUpdateCmd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChangeLogUpdateCmd.js","sourceRoot":"","sources":["../../src/commands/ChangeLogUpdateCmd.ts"],"names":[],"mappings":"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","sourcesContent":["// src/commands/ChangeLogUpdateCmd.ts\r\nimport { execSync } from 'child_process';\r\nimport fs from 'fs/promises';\r\nimport path from 'path';\r\nimport { runModulePipeline } from '../pipeline/runModulePipeline.js';\r\nimport { changelogModule } from '../pipeline/modules/changeLogModule.js';\r\nimport { askChangelogApproval } from '../utils/changeLogPrompt.js';\r\nimport { openTextEditor } from '../utils/editor.js';\r\nimport type { ModuleIO } from '../types.js';\r\n\r\nexport async function handleStandaloneChangelogUpdate() {\r\n let entry: string | null = await generateChangelogEntry();\r\n\r\n if (!entry) {\r\n console.log('⚠️ No significant changes found.');\r\n return;\r\n }\r\n\r\n while (true) {\r\n const userChoice = await askChangelogApproval(entry);\r\n\r\n if (userChoice === 'yes') {\r\n const path = await updateChangelogFile(entry);\r\n console.log(`✅ CHANGELOG.md updated: ${path}`);\r\n break;\r\n } else if (userChoice === 'redo') {\r\n console.log('🔁 Regenerating changelog...');\r\n entry = await generateChangelogEntry();\r\n if (!entry) {\r\n console.log('⚠️ Could not regenerate entry. Exiting.');\r\n break;\r\n }\r\n } else {\r\n console.log('❌ Skipped changelog update.');\r\n break;\r\n }\r\n }\r\n}\r\n\r\nexport async function generateChangelogEntry(currentCommitMsg?: string): Promise<string | null> {\r\n try {\r\n const lastTag = getLastGitTag();\r\n\r\n if (!lastTag) {\r\n console.log(\"⚠️ No previous git tag found. Using all commits.\");\r\n }\r\n\r\n let commits = lastTag\r\n ? getCommitsSinceTag(lastTag)\r\n : execSync('git log --pretty=format:%s', { encoding: 'utf-8' }).trim();\r\n\r\n if (currentCommitMsg) {\r\n commits = commits ? `${commits}\\n${currentCommitMsg}` : currentCommitMsg;\r\n }\r\n\r\n console.log('Number of commits:', commits.split('\\n').length);\r\n\r\n if (!commits) {\r\n console.log(\"⚠️ No commits found since last release.\");\r\n return null;\r\n }\r\n\r\n // --- ModuleIO usage ---\r\n const result: ModuleIO = await runModulePipeline([changelogModule], {\r\n query: 'generate changelog entry',\r\n content: commits\r\n });\r\n\r\n const output = result?.data\r\n ? typeof result.data === 'string'\r\n ? result.data.trim()\r\n : JSON.stringify(result.data, null, 2)\r\n : null;\r\n\r\n if (!output || output === 'NO UPDATE') {\r\n console.log('⚠️ No significant changes detected for changelog.');\r\n return null;\r\n }\r\n\r\n return output;\r\n } catch (err: any) {\r\n console.error(\"❌ Failed to generate changelog entry:\", err.message);\r\n return null;\r\n }\r\n}\r\n\r\nfunction getLastGitTag(): string | null {\r\n try {\r\n return execSync('git describe --tags --abbrev=0', { encoding: 'utf-8' }).trim();\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nfunction getCommitsSinceTag(tag: string): string {\r\n return execSync(`git log ${tag}..HEAD --pretty=format:%s`, { encoding: 'utf-8' }).trim();\r\n}\r\n\r\nexport async function updateChangelogFile(entry: string): Promise<string> {\r\n const root = execSync(\"git rev-parse --show-toplevel\", { encoding: \"utf-8\" }).trim();\r\n const changelogPath = path.join(root, \"CHANGELOG.md\");\r\n\r\n let existing = '';\r\n try {\r\n existing = await fs.readFile(changelogPath, 'utf-8');\r\n } catch {\r\n console.log(\"📄 Creating new CHANGELOG.md\");\r\n }\r\n\r\n const today = new Date().toISOString().split(\"T\")[0];\r\n const newEntry = `\\n\\n## ${today}\\n\\n${entry.trim()}`;\r\n\r\n await fs.writeFile(changelogPath, existing + newEntry, 'utf-8');\r\n return changelogPath;\r\n}\r\n\r\nexport async function handleChangelogWithCommitMessage(commitMsg: string) {\r\n let entryFinalized = false;\r\n let changelogEntry = await generateChangelogEntry(commitMsg);\r\n\r\n if (!changelogEntry) {\r\n console.log(\"ℹ️ No changelog entry generated.\");\r\n return;\r\n }\r\n\r\n while (!entryFinalized) {\r\n const userChoice = await askChangelogApproval(changelogEntry);\r\n\r\n if (userChoice === 'yes') {\r\n const changelogPath = await updateChangelogFile(changelogEntry);\r\n execSync(`git add \"${changelogPath}\"`);\r\n console.log(\"✅ CHANGELOG.md staged.\");\r\n entryFinalized = true;\r\n } else if (userChoice === 'redo') {\r\n console.log(\"🔁 Regenerating changelog entry...\");\r\n changelogEntry = await generateChangelogEntry(commitMsg);\r\n if (!changelogEntry) {\r\n console.log('⚠️ Could not regenerate entry. Exiting.');\r\n break;\r\n }\r\n } else if (userChoice === 'edit') {\r\n changelogEntry = await openTextEditor(changelogEntry, 'scai-changelog.txt');\r\n if (!changelogEntry) {\r\n console.log('⚠️ No changes made to changelog. Returning to prompt.');\r\n }\r\n } else {\r\n console.log(\"❌ Skipped changelog update.\");\r\n entryFinalized = true;\r\n }\r\n }\r\n}\r\n"]}
@@ -1,12 +1,20 @@
1
- // File: src/commands/CommitSuggesterCmd.ts
1
+ /**
2
+ * Runs the standalone commit-message suggestion command.
3
+ *
4
+ * Why this file exists:
5
+ * - `scai commit` should stay in the direct command world instead of entering the ask/task agent runtime
6
+ * - the command owns the user interaction loop for choose, edit, regenerate, and commit
7
+ * - commit input collection is kept small and staged-only so large commits stay responsive
8
+ */
2
9
  import { execSync, spawnSync } from 'child_process';
3
10
  import fs from 'fs';
4
11
  import os from 'os';
5
12
  import path from 'path';
6
13
  import chalk from 'chalk';
7
14
  import { commitSuggesterModule } from '../pipeline/modules/commitSuggesterModule.js';
8
- import { handleChangelogWithCommitMessage } from './ChangeLogUpdateCmd.js';
9
15
  import { getRl } from './ReadlineSingleton.js';
16
+ import { buildStagedCommitSummary } from '../git/commitSummary.js';
17
+ import { logInputOutput } from '../utils/promptLogHelper.js';
10
18
  // --- Use the passed readline instance ---
11
19
  function askUserToChoose(rl, suggestions) {
12
20
  return new Promise((resolve) => {
@@ -77,60 +85,93 @@ async function promptEditCommitMessage(suggestedMessage) {
77
85
  .trim() || suggestedMessage;
78
86
  }
79
87
  // --- Main function ---
80
- export async function suggestCommitMessage(options) {
88
+ export async function suggestCommitMessage() {
81
89
  const { rl, isTemporary } = getRl();
82
90
  try {
83
- let diff = execSync("git diff --cached", { encoding: "utf-8", stdio: "pipe" }).trim();
84
- if (!diff)
85
- diff = execSync("git diff", { encoding: "utf-8", stdio: "pipe" }).trim();
86
- if (!diff) {
91
+ const summary = buildStagedCommitSummary();
92
+ if (!summary) {
93
+ logInputOutput('commitSuggesterCmd', 'output', {
94
+ status: 'no-staged-changes',
95
+ });
87
96
  console.log('⚠️ No staged changes to suggest a message for.');
97
+ console.log("👉 Stage files with 'git add <files>' and rerun 'scai commit'.");
88
98
  return;
89
99
  }
90
- const input = { query: 'Generate commit messages', content: diff };
100
+ logInputOutput('commitSuggesterCmd', 'input', {
101
+ summary,
102
+ });
103
+ const input = { query: 'Generate commit messages', content: summary };
91
104
  const response = await commitSuggesterModule.run(input);
92
105
  const suggestions = response.suggestions || [];
93
106
  if (!suggestions.length) {
107
+ logInputOutput('commitSuggesterCmd', 'output', {
108
+ status: 'no-suggestions',
109
+ });
94
110
  console.log('⚠️ No commit suggestions generated.');
95
111
  return;
96
112
  }
97
113
  let message = null;
114
+ let messageSource = 'selected-suggestion';
115
+ let regenerateCount = 0;
98
116
  while (message === null) {
99
117
  const choice = await askUserToChoose(rl, suggestions);
100
118
  if (choice === 'regenerate') {
119
+ regenerateCount += 1;
101
120
  console.log('\n🔄 Regenerating suggestions...\n');
102
121
  const newResponse = await commitSuggesterModule.run(input);
103
122
  suggestions.splice(0, suggestions.length, ...(newResponse.suggestions || []));
104
123
  continue;
105
124
  }
106
- if (choice === 'custom')
125
+ if (choice === 'custom') {
126
+ messageSource = 'custom';
107
127
  message = await promptCustomMessage(rl);
128
+ }
108
129
  else if (choice === 'edit') {
109
130
  const editChoice = await askWhichSuggestionToEdit(rl, suggestions);
110
- if (typeof editChoice === 'number')
131
+ if (typeof editChoice === 'number') {
132
+ messageSource = 'edited-suggestion';
111
133
  message = await promptEditCommitMessage(suggestions[editChoice]);
134
+ }
112
135
  else {
113
136
  console.log('⚠️ Edit cancelled, returning to main menu.');
114
137
  continue;
115
138
  }
116
139
  }
117
140
  else if (choice === 'cancel') {
141
+ logInputOutput('commitSuggesterCmd', 'output', {
142
+ status: 'cancelled',
143
+ regenerateCount,
144
+ });
118
145
  console.log('❌ Commit cancelled.');
119
146
  return;
120
147
  }
121
- else
148
+ else {
149
+ messageSource = 'selected-suggestion';
122
150
  message = suggestions[choice];
151
+ }
123
152
  }
153
+ logInputOutput('commitSuggesterCmd', 'output', {
154
+ status: 'selected-message',
155
+ source: messageSource,
156
+ regenerateCount,
157
+ message,
158
+ });
124
159
  console.log(`\n✅ Selected commit message:\n${message}\n`);
125
- if (options.changelog)
126
- await handleChangelogWithCommitMessage(message);
127
160
  const staged = execSync("git diff --cached", { encoding: "utf-8" }).trim();
128
161
  if (!staged) {
162
+ logInputOutput('commitSuggesterCmd', 'output', {
163
+ status: 'staged-changes-missing-before-commit',
164
+ message,
165
+ });
129
166
  console.log("⚠️ No files are currently staged for commit.");
130
167
  console.log("👉 Please stage your changes with 'git add <files>' and rerun the command.");
131
168
  return;
132
169
  }
133
170
  execSync(`git commit -m "${message.replace(/"/g, '\\"')}"`, { stdio: 'inherit' });
171
+ logInputOutput('commitSuggesterCmd', 'output', {
172
+ status: 'committed',
173
+ message,
174
+ });
134
175
  console.log('✅ Committed with selected message.');
135
176
  }
136
177
  catch (err) {
@@ -142,3 +183,4 @@ export async function suggestCommitMessage(options) {
142
183
  }
143
184
  }
144
185
  }
186
+ //# sourceMappingURL=CommitSuggesterCmd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CommitSuggesterCmd.js","sourceRoot":"","sources":["../../src/commands/CommitSuggesterCmd.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Runs the standalone commit-message suggestion command.\n *\n * Why this file exists:\n * - `scai commit` should stay in the direct command world instead of entering the ask/task agent runtime\n * - the command owns the user interaction loop for choose, edit, regenerate, and commit\n * - commit input collection is kept small and staged-only so large commits stay responsive\n */\nimport { execSync, spawnSync } from 'child_process';\nimport readline from 'readline';\nimport fs from 'fs';\nimport os from 'os';\nimport path from 'path';\nimport chalk from 'chalk';\nimport { commitSuggesterModule } from '../pipeline/modules/commitSuggesterModule.js';\nimport { ModuleIO } from '../types.js';\nimport { getRl } from './ReadlineSingleton.js';\nimport { buildStagedCommitSummary } from '../git/commitSummary.js';\nimport { logInputOutput } from '../utils/promptLogHelper.js';\n\n// --- Use the passed readline instance ---\nfunction askUserToChoose(rl: readline.Interface, suggestions: string[]): Promise<number | 'custom' | 'cancel' | 'regenerate' | 'edit'> {\n return new Promise((resolve) => {\n console.log('\\n💡 AI-suggested commit messages:\\n');\n suggestions.forEach((msg, i) => {\n console.log(`${i + 1}) ${chalk.hex('#FFA500')(`\\`${msg}\\``)}`);\n });\n\n console.log('\\n---');\n console.log(`${suggestions.length + 1}) 🔁 Regenerate suggestions`);\n console.log(`${suggestions.length + 2}) ✍️ Write your own commit message`);\n console.log(`${suggestions.length + 3}) 🖋️ Edit a suggested commit message`);\n console.log(`${suggestions.length + 4}) ❌ Cancel`);\n\n rl.question(`\\n👉 Choose a commit message [1-${suggestions.length + 4}]: `, (answer) => {\n const choice = parseInt(answer, 10);\n\n if (choice === suggestions.length + 1) resolve('regenerate');\n else if (choice === suggestions.length + 2) resolve('custom');\n else if (choice === suggestions.length + 3) resolve('edit');\n else if (choice === suggestions.length + 4) resolve('cancel');\n else if (!isNaN(choice) && choice >= 1 && choice <= suggestions.length) resolve(choice - 1);\n else {\n console.log('⚠️ Invalid selection. Using the first suggestion by default.');\n resolve(0);\n }\n });\n });\n}\n\nfunction askWhichSuggestionToEdit(rl: readline.Interface, suggestions: string[]): Promise<number | 'cancel'> {\n return new Promise((resolve) => {\n console.log('\\n🖋️ Select a commit message to edit:\\n');\n suggestions.forEach((msg, i) => console.log(`${i + 1}) ${chalk.hex('#FFA500')(`\\`${msg}\\``)}`));\n console.log(`${suggestions.length + 1}) ❌ Cancel`);\n\n const promptText = chalk.magenta(`\\n👉 Choose a commit message to edit [1-${suggestions.length + 1}]: `);\n rl.question(promptText, (answer) => {\n const choice = parseInt(answer, 10);\n if (!isNaN(choice) && choice >= 1 && choice <= suggestions.length) resolve(choice - 1);\n else if (choice === suggestions.length + 1) resolve('cancel');\n else {\n console.log('⚠️ Invalid selection.');\n resolve('cancel');\n }\n });\n });\n}\n\nfunction promptCustomMessage(rl: readline.Interface): Promise<string> {\n return new Promise((resolve) => {\n rl.question('\\n📝 Enter your custom commit message:\\n> ', (input) => {\n resolve(input.trim());\n });\n });\n}\n\nasync function promptEditCommitMessage(suggestedMessage: string): Promise<string> {\n const tmpFilePath = path.join(os.tmpdir(), 'scai-commit-msg.txt');\n fs.writeFileSync(tmpFilePath, `# Edit your commit message below.\\n# Lines starting with '#' will be ignored.\\n\\n${suggestedMessage}`);\n\n const editor = process.env.EDITOR || (process.platform === 'win32' ? 'notepad' : 'vi');\n spawnSync(editor, [tmpFilePath], { stdio: 'inherit' });\n\n const editedContent = fs.readFileSync(tmpFilePath, 'utf-8');\n return editedContent\n .split('\\n')\n .filter(line => !line.trim().startsWith('#'))\n .join('\\n')\n .trim() || suggestedMessage;\n}\n\n// --- Main function ---\nexport async function suggestCommitMessage() {\n const { rl, isTemporary } = getRl();\n try {\n const summary = buildStagedCommitSummary();\n if (!summary) {\n logInputOutput('commitSuggesterCmd', 'output', {\n status: 'no-staged-changes',\n });\n console.log('⚠️ No staged changes to suggest a message for.');\n console.log(\"👉 Stage files with 'git add <files>' and rerun 'scai commit'.\");\n return;\n }\n\n logInputOutput('commitSuggesterCmd', 'input', {\n summary,\n });\n\n const input: ModuleIO = { query: 'Generate commit messages', content: summary };\n const response = await commitSuggesterModule.run(input);\n const suggestions: string[] = (response as any).suggestions || [];\n\n if (!suggestions.length) {\n logInputOutput('commitSuggesterCmd', 'output', {\n status: 'no-suggestions',\n });\n console.log('⚠️ No commit suggestions generated.');\n return;\n }\n\n let message: string | null = null;\n let messageSource: 'selected-suggestion' | 'custom' | 'edited-suggestion' | 'cancelled' = 'selected-suggestion';\n let regenerateCount = 0;\n\n while (message === null) {\n const choice = await askUserToChoose(rl, suggestions);\n\n if (choice === 'regenerate') {\n regenerateCount += 1;\n console.log('\\n🔄 Regenerating suggestions...\\n');\n const newResponse = await commitSuggesterModule.run(input);\n suggestions.splice(0, suggestions.length, ...((newResponse as any).suggestions || []));\n continue;\n }\n\n if (choice === 'custom') {\n messageSource = 'custom';\n message = await promptCustomMessage(rl);\n }\n else if (choice === 'edit') {\n const editChoice = await askWhichSuggestionToEdit(rl, suggestions);\n if (typeof editChoice === 'number') {\n messageSource = 'edited-suggestion';\n message = await promptEditCommitMessage(suggestions[editChoice]);\n }\n else { console.log('⚠️ Edit cancelled, returning to main menu.'); continue; }\n }\n else if (choice === 'cancel') {\n logInputOutput('commitSuggesterCmd', 'output', {\n status: 'cancelled',\n regenerateCount,\n });\n console.log('❌ Commit cancelled.');\n return;\n }\n else {\n messageSource = 'selected-suggestion';\n message = suggestions[choice];\n }\n }\n\n logInputOutput('commitSuggesterCmd', 'output', {\n status: 'selected-message',\n source: messageSource,\n regenerateCount,\n message,\n });\n\n console.log(`\\n✅ Selected commit message:\\n${message}\\n`);\n\n const staged = execSync(\"git diff --cached\", { encoding: \"utf-8\" }).trim();\n if (!staged) {\n logInputOutput('commitSuggesterCmd', 'output', {\n status: 'staged-changes-missing-before-commit',\n message,\n });\n console.log(\"⚠️ No files are currently staged for commit.\");\n console.log(\"👉 Please stage your changes with 'git add <files>' and rerun the command.\");\n return;\n }\n\n execSync(`git commit -m \"${message.replace(/\"/g, '\\\\\"')}\"`, { stdio: 'inherit' });\n logInputOutput('commitSuggesterCmd', 'output', {\n status: 'committed',\n message,\n });\n console.log('✅ Committed with selected message.');\n\n } catch (err: any) {\n console.error('❌ Error in commit message suggestion:', err.message);\n } finally {\n if (isTemporary) {\n rl.close(); // 👈 THIS is what allows the process to exit\n }\n }\n}\n"]}
@@ -1,3 +1,11 @@
1
+ /**
2
+ * Owns the public daemon lifecycle commands and shared runtime-state cleanup.
3
+ *
4
+ * Why this file exists:
5
+ * - the CLI needs one place to start, stop, inspect, and unlock the background worker
6
+ * - PID and repo-lock cleanup should stay consistent between manual stop and natural worker exit
7
+ * - the bounded indexing worker should not duplicate runtime-state cleanup logic
8
+ */
1
9
  import fs from 'fs';
2
10
  import path from 'path';
3
11
  import { spawn } from 'child_process';
@@ -29,44 +37,72 @@ function unlockConfigFile() {
29
37
  fs.unlinkSync(CONFIG_LOCK_PATH);
30
38
  }
31
39
  }
40
+ export function clearDaemonRuntimeState(options) {
41
+ let pidRemoved = !fs.existsSync(PID_PATH);
42
+ if (fs.existsSync(PID_PATH)) {
43
+ const pid = parseInt(fs.readFileSync(PID_PATH, 'utf8'), 10);
44
+ const matchesExpected = options?.expectedPid == null || pid === options.expectedPid;
45
+ if (matchesExpected || !isProcessRunning(pid)) {
46
+ fs.unlinkSync(PID_PATH);
47
+ pidRemoved = true;
48
+ }
49
+ }
50
+ if (pidRemoved) {
51
+ unlockConfigFile();
52
+ }
53
+ }
32
54
  export function getLockedRepo() {
33
55
  return fs.existsSync(CONFIG_LOCK_PATH)
34
56
  ? fs.readFileSync(CONFIG_LOCK_PATH, 'utf8')
35
57
  : null;
36
58
  }
37
59
  // --- Commands ---
38
- export async function startDaemon() {
60
+ export async function startDaemon(options = {}) {
61
+ const surface = options.surface ?? 'daemon';
62
+ const shouldPrint = surface === 'daemon';
39
63
  const cfg = Config.getRaw();
40
64
  const activeRepo = cfg.activeRepo;
41
65
  if (!activeRepo) {
42
- console.log('❌ No active repo configured. Use `askcmd repo set <path>` first.');
66
+ if (shouldPrint) {
67
+ console.log('❌ No active repo configured. Use `askcmd repo set <path>` first.');
68
+ }
43
69
  return;
44
70
  }
45
71
  const dbPath = getDbPathForRepo();
46
72
  if (!fs.existsSync(dbPath)) {
47
- console.log(`❌ Cannot start daemon. Index/database not initialized for repo '${activeRepo}'.`);
48
- console.log(` Run the index command first: scai index start`);
73
+ if (shouldPrint) {
74
+ console.log(`❌ Cannot start daemon. Index/database not initialized for repo '${activeRepo}'.`);
75
+ console.log(` Run setup first: scai setup`);
76
+ }
49
77
  return;
50
78
  }
51
79
  const lockedRepo = getLockedRepo();
52
80
  if (lockedRepo && lockedRepo !== activeRepo) {
53
- console.log(`🔒 Daemon already locked to repo: ${lockedRepo}`);
54
- console.log(` Current active repo: ${activeRepo}`);
55
- console.log(` Stop the daemon before starting another.`);
81
+ if (shouldPrint) {
82
+ console.log(`🔒 Daemon already locked to repo: ${lockedRepo}`);
83
+ console.log(` Current active repo: ${activeRepo}`);
84
+ console.log(` Stop the daemon before starting another.`);
85
+ }
56
86
  return;
57
87
  }
58
88
  if (fs.existsSync(PID_PATH)) {
59
89
  const pid = parseInt(fs.readFileSync(PID_PATH, 'utf8'), 10);
60
90
  if (isProcessRunning(pid)) {
61
- console.log(`⚠️ Daemon already running with PID ${pid}.`);
91
+ if (shouldPrint) {
92
+ console.log(`⚠️ Daemon already running with PID ${pid}.`);
93
+ }
62
94
  return;
63
95
  }
64
96
  else {
65
- console.log(`🧹 Removing stale PID file...`);
66
- fs.unlinkSync(PID_PATH);
97
+ if (shouldPrint) {
98
+ console.log(`🧹 Removing stale PID file...`);
99
+ }
100
+ clearDaemonRuntimeState({ expectedPid: pid });
67
101
  }
68
102
  }
69
- console.log(`🚀 Starting daemon for repo: ${activeRepo}`);
103
+ if (shouldPrint) {
104
+ console.log(`🚀 Starting daemon for repo: ${activeRepo}`);
105
+ }
70
106
  const __filename = fileURLToPath(import.meta.url);
71
107
  const __dirname = path.dirname(__filename);
72
108
  const workerPath = path.join(__dirname, '../daemon/daemonWorker.js');
@@ -82,7 +118,9 @@ export async function startDaemon() {
82
118
  child.unref();
83
119
  fs.writeFileSync(PID_PATH, String(child.pid));
84
120
  lockConfig(activeRepo);
85
- console.log(`✅ Daemon started (PID ${child.pid})`);
121
+ if (shouldPrint) {
122
+ console.log(`✅ Daemon started (PID ${child.pid})`);
123
+ }
86
124
  }
87
125
  export async function stopDaemon() {
88
126
  if (!fs.existsSync(PID_PATH)) {
@@ -97,8 +135,7 @@ export async function stopDaemon() {
97
135
  else {
98
136
  console.log(`⚠️ Stale PID ${pid}.`);
99
137
  }
100
- fs.unlinkSync(PID_PATH);
101
- unlockConfigFile();
138
+ clearDaemonRuntimeState({ expectedPid: pid });
102
139
  console.log(`✅ Daemon stopped and unlocked.`);
103
140
  }
104
141
  export async function statusDaemon() {
@@ -138,3 +175,4 @@ export async function showLogs(lines = 20) {
138
175
  console.log(`\n--- Daemon Logs (last ${lines} lines) ---\n`);
139
176
  console.log(tail);
140
177
  }
178
+ //# sourceMappingURL=DaemonCmd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DaemonCmd.js","sourceRoot":"","sources":["../../src/commands/DaemonCmd.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Owns the public daemon lifecycle commands and shared runtime-state cleanup.\n *\n * Why this file exists:\n * - the CLI needs one place to start, stop, inspect, and unlock the background worker\n * - PID and repo-lock cleanup should stay consistent between manual stop and natural worker exit\n * - the bounded indexing worker should not duplicate runtime-state cleanup logic\n */\nimport fs from 'fs';\nimport path from 'path';\nimport { spawn, ChildProcess } from 'child_process';\nimport { fileURLToPath } from 'url';\nimport { LOG_PATH, PID_PATH, CONFIG_LOCK_PATH } from '../constants.js';\nimport { Config } from '../config.js';\r\nimport { getDbPathForRepo } from '../db/client.js';\r\n\r\n// --- Helpers ---\r\n\r\nexport function isDaemonRunning(): boolean {\r\n if (!fs.existsSync(PID_PATH)) return false;\r\n const pid = parseInt(fs.readFileSync(PID_PATH, 'utf8'), 10);\r\n return isProcessRunning(pid);\r\n}\r\n\r\nexport function isProcessRunning(pid: number): boolean {\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\nfunction lockConfig(repoKey: string): void {\r\n fs.writeFileSync(CONFIG_LOCK_PATH, repoKey, { encoding: 'utf8' });\r\n}\r\n\r\nfunction unlockConfigFile(): void {\n if (fs.existsSync(CONFIG_LOCK_PATH)) {\n fs.unlinkSync(CONFIG_LOCK_PATH);\n }\n}\n\nexport function clearDaemonRuntimeState(options?: { expectedPid?: number }): void {\n let pidRemoved = !fs.existsSync(PID_PATH);\n if (fs.existsSync(PID_PATH)) {\n const pid = parseInt(fs.readFileSync(PID_PATH, 'utf8'), 10);\n const matchesExpected = options?.expectedPid == null || pid === options.expectedPid;\n if (matchesExpected || !isProcessRunning(pid)) {\n fs.unlinkSync(PID_PATH);\n pidRemoved = true;\n }\n }\n\n if (pidRemoved) {\n unlockConfigFile();\n }\n}\n\r\nexport function getLockedRepo(): string | null {\r\n return fs.existsSync(CONFIG_LOCK_PATH)\r\n ? fs.readFileSync(CONFIG_LOCK_PATH, 'utf8')\r\n : null;\r\n}\r\n\r\n// --- Commands ---\r\nexport async function startDaemon(options: { surface?: 'daemon' | 'silent' } = {}): Promise<void> {\n const surface = options.surface ?? 'daemon';\n const shouldPrint = surface === 'daemon';\n const cfg = Config.getRaw();\n const activeRepo = cfg.activeRepo;\n if (!activeRepo) {\n if (shouldPrint) {\n console.log('❌ No active repo configured. Use `askcmd repo set <path>` first.');\n }\n return;\n }\n\n const dbPath = getDbPathForRepo();\n if (!fs.existsSync(dbPath)) {\n if (shouldPrint) {\n console.log(`❌ Cannot start daemon. Index/database not initialized for repo '${activeRepo}'.`);\n console.log(` Run setup first: scai setup`);\n }\n return;\n }\n\n const lockedRepo = getLockedRepo();\n if (lockedRepo && lockedRepo !== activeRepo) {\n if (shouldPrint) {\n console.log(`🔒 Daemon already locked to repo: ${lockedRepo}`);\n console.log(` Current active repo: ${activeRepo}`);\n console.log(` Stop the daemon before starting another.`);\n }\n return;\n }\n\r\n if (fs.existsSync(PID_PATH)) {\n const pid = parseInt(fs.readFileSync(PID_PATH, 'utf8'), 10);\n if (isProcessRunning(pid)) {\n if (shouldPrint) {\n console.log(`⚠️ Daemon already running with PID ${pid}.`);\n }\n return;\n } else {\n if (shouldPrint) {\n console.log(`🧹 Removing stale PID file...`);\n }\n clearDaemonRuntimeState({ expectedPid: pid });\n }\n }\n\n if (shouldPrint) {\n console.log(`🚀 Starting daemon for repo: ${activeRepo}`);\n }\n\r\n const __filename = fileURLToPath(import.meta.url);\r\n const __dirname = path.dirname(__filename);\r\n const workerPath = path.join(__dirname, '../daemon/daemonWorker.js');\r\n\r\n fs.mkdirSync(path.dirname(LOG_PATH), { recursive: true });\r\n fs.mkdirSync(path.dirname(PID_PATH), { recursive: true });\r\n\r\n const out = fs.openSync(LOG_PATH, 'a');\r\n const err = fs.openSync(LOG_PATH, 'a');\r\n\r\n const child: ChildProcess = spawn(process.execPath, [workerPath], {\r\n detached: true,\r\n stdio: ['ignore', out, err],\r\n env: { ...process.env, BACKGROUND_MODE: 'true' },\r\n });\r\n\r\n child.unref();\n\n fs.writeFileSync(PID_PATH, String(child.pid));\n lockConfig(activeRepo);\n if (shouldPrint) {\n console.log(`✅ Daemon started (PID ${child.pid})`);\n }\n}\n\r\nexport async function stopDaemon(): Promise<void> {\n if (!fs.existsSync(PID_PATH)) {\n console.log(`ℹ️ No PID file found.`);\n return;\n }\n const pid = parseInt(fs.readFileSync(PID_PATH, 'utf8'), 10);\r\n if (isProcessRunning(pid)) {\n console.log(`🛑 Stopping daemon (PID ${pid})...`);\n process.kill(pid);\n } else {\n console.log(`⚠️ Stale PID ${pid}.`);\n }\n clearDaemonRuntimeState({ expectedPid: pid });\n console.log(`✅ Daemon stopped and unlocked.`);\n}\n\r\nexport async function statusDaemon(): Promise<void> {\r\n const lockedRepo = getLockedRepo();\r\n if (!fs.existsSync(PID_PATH)) {\r\n console.log(`🔴 Daemon not running.`);\r\n if (lockedRepo) console.log(` (Locked to repo ${lockedRepo})`);\r\n return;\r\n }\r\n\r\n const pid = parseInt(fs.readFileSync(PID_PATH, 'utf8'), 10);\r\n if (isProcessRunning(pid)) {\r\n console.log(`🟢 Daemon running (PID ${pid})`);\r\n if (lockedRepo) console.log(` ↳ Repo: ${lockedRepo}`);\r\n } else {\r\n console.log(`🟡 Stale PID file (${pid}) found.`);\r\n }\r\n}\r\n\r\nexport async function restartDaemon(): Promise<void> {\r\n console.log(`♻️ Restarting daemon...`);\r\n await stopDaemon();\r\n await startDaemon();\r\n}\r\n\r\nexport async function unlockConfig(): Promise<void> {\r\n unlockConfigFile();\r\n console.log(`🔓 Configuration unlocked.`);\r\n}\r\n\r\nexport async function showLogs(lines: number = 20): Promise<void> {\r\n if (!fs.existsSync(LOG_PATH)) {\r\n console.log(`ℹ️ No logs yet.`);\r\n return;\r\n }\r\n const content = fs.readFileSync(LOG_PATH, 'utf8');\r\n const tail = content.split('\\n').slice(-lines).join('\\n');\r\n console.log(`\\n--- Daemon Logs (last ${lines} lines) ---\\n`);\r\n console.log(tail);\r\n}\r\n"]}
@@ -48,3 +48,4 @@ export async function runInteractiveDelete() {
48
48
  }
49
49
  });
50
50
  }
51
+ //# sourceMappingURL=DeleteIndex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DeleteIndex.js","sourceRoot":"","sources":["../../src/commands/DeleteIndex.ts"],"names":[],"mappings":"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","sourcesContent":["// File: src/commands/delete.ts\r\nimport readline from 'readline';\r\nimport { Config, writeConfig } from '../config.js';\r\nimport chalk from 'chalk';\r\n\r\nexport async function runInteractiveDelete() {\r\n const config = Config.getRaw();\r\n const keys = Object.keys(config.repos || {});\r\n\r\n if (!keys.length) {\r\n console.log('⚠️ No repositories configured.');\r\n return;\r\n }\r\n\r\n console.log('\\n🗑️ Repositories Available for Deletion:\\n');\r\n keys.forEach((key, i) => {\r\n const isActive = config.activeRepo === key ? chalk.green('(active)') : '';\r\n const dir = config.repos[key]?.indexDir ?? '';\r\n console.log(`${chalk.blue(`${i + 1})`)} ${key} ${isActive}`);\r\n console.log(` ↳ ${chalk.grey(dir)}`);\r\n });\r\n\r\n const rl = readline.createInterface({\r\n input: process.stdin,\r\n output: process.stdout,\r\n });\r\n\r\n rl.question('\\n👉 Select a repository number to delete: ', (answer) => {\r\n rl.close();\r\n\r\n const index = parseInt(answer.trim(), 10) - 1;\r\n if (isNaN(index) || index < 0 || index >= keys.length) {\r\n console.log('❌ Invalid selection.');\r\n return;\r\n }\r\n\r\n const selectedKey = keys[index];\r\n console.log(`\\n⚠️ Deleting repository: ${chalk.red(selectedKey)}\\n`);\r\n\r\n // Build an update that uses the null-sentinel for deletion.\r\n const update: any = { repos: { [selectedKey]: null } };\r\n\r\n // If deleting the active repo, pick another one (first remaining) or unset.\r\n if (config.activeRepo === selectedKey) {\r\n const remainingKeys = keys.filter(k => k !== selectedKey);\r\n update.activeRepo = remainingKeys[0] || undefined;\r\n console.log(`ℹ️ Active repo reset to: ${chalk.green(update.activeRepo ?? 'none')}`);\r\n }\r\n\r\n try {\r\n writeConfig(update); // this will actually remove the repo key\r\n console.log(`✅ Repository \"${selectedKey}\" removed from config.json.`);\r\n // NOTE: We intentionally do NOT delete the on-disk repo folder here.\r\n // Only remove data when a --purge flag is explicitly used.\r\n } catch (err) {\r\n console.error('❌ Failed to update config.json:', err instanceof Error ? err.message : err);\r\n }\r\n });\r\n}\r\n"]}