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.
- package/README.md +171 -260
- package/dist/__tests__/CommitSuggesterCmd.test.js +112 -0
- package/dist/__tests__/CommitSuggesterCmd.test.js.map +1 -0
- package/dist/__tests__/EvalReportCmd.test.js +645 -0
- package/dist/__tests__/EvalReportCmd.test.js.map +1 -0
- package/dist/__tests__/ModelCmd.test.js +64 -0
- package/dist/__tests__/ModelCmd.test.js.map +1 -0
- package/dist/__tests__/agents/agentActions.test.js +345 -0
- package/dist/__tests__/agents/agentActions.test.js.map +1 -0
- package/dist/__tests__/agents/agentFeedback.test.js +118 -0
- package/dist/__tests__/agents/agentFeedback.test.js.map +1 -0
- package/dist/__tests__/agents/agentGeneralScope.test.js +74 -0
- package/dist/__tests__/agents/agentGeneralScope.test.js.map +1 -0
- package/dist/__tests__/agents/agentLoop.test.js +1723 -0
- package/dist/__tests__/agents/agentLoop.test.js.map +1 -0
- package/dist/__tests__/agents/agentPolicyState.test.js +948 -0
- package/dist/__tests__/agents/agentPolicyState.test.js.map +1 -0
- package/dist/__tests__/agents/agentReadEvidence.test.js +170 -0
- package/dist/__tests__/agents/agentReadEvidence.test.js.map +1 -0
- package/dist/__tests__/agents/agentReadPersistence.test.js +129 -0
- package/dist/__tests__/agents/agentReadPersistence.test.js.map +1 -0
- package/dist/__tests__/agents/agentResumeCheckpoint.test.js +90 -0
- package/dist/__tests__/agents/agentResumeCheckpoint.test.js.map +1 -0
- package/dist/__tests__/agents/agentSearchBatchPlanner.test.js +289 -0
- package/dist/__tests__/agents/agentSearchBatchPlanner.test.js.map +1 -0
- package/dist/__tests__/agents/agentSearchOwnership.test.js +166 -0
- package/dist/__tests__/agents/agentSearchOwnership.test.js.map +1 -0
- package/dist/__tests__/agents/agentSearchRanking.test.js +139 -0
- package/dist/__tests__/agents/agentSearchRanking.test.js.map +1 -0
- package/dist/__tests__/agents/agentSearchRouting.test.js +584 -0
- package/dist/__tests__/agents/agentSearchRouting.test.js.map +1 -0
- package/dist/__tests__/agents/agentSearchScoring.test.js +23 -0
- package/dist/__tests__/agents/agentSearchScoring.test.js.map +1 -0
- package/dist/__tests__/agents/agentSearchShared.test.js +78 -0
- package/dist/__tests__/agents/agentSearchShared.test.js.map +1 -0
- package/dist/__tests__/agents/agentStateMachine.test.js +58 -0
- package/dist/__tests__/agents/agentStateMachine.test.js.map +1 -0
- package/dist/__tests__/agents/agentTaskPersistence.test.js +156 -0
- package/dist/__tests__/agents/agentTaskPersistence.test.js.map +1 -0
- package/dist/__tests__/agents/agentTools.test.js +69 -0
- package/dist/__tests__/agents/agentTools.test.js.map +1 -0
- package/dist/__tests__/agents/agentTransform.test.js +779 -0
- package/dist/__tests__/agents/agentTransform.test.js.map +1 -0
- package/dist/__tests__/agents/analysisPlanGenStep.test.js +157 -0
- package/dist/__tests__/agents/analysisPlanGenStep.test.js.map +1 -0
- package/dist/__tests__/agents/answerOnlyCompletion.test.js +75 -0
- package/dist/__tests__/agents/answerOnlyCompletion.test.js.map +1 -0
- package/dist/__tests__/agents/decideNextAction.test.js +1662 -0
- package/dist/__tests__/agents/decideNextAction.test.js.map +1 -0
- package/dist/__tests__/agents/deriveFocusFromSearchStep.test.js +258 -0
- package/dist/__tests__/agents/deriveFocusFromSearchStep.test.js.map +1 -0
- package/dist/__tests__/agents/evidenceVerifierStep.test.js +113 -0
- package/dist/__tests__/agents/evidenceVerifierStep.test.js.map +1 -0
- package/dist/__tests__/agents/executionPolicyResolver.test.js +208 -0
- package/dist/__tests__/agents/executionPolicyResolver.test.js.map +1 -0
- package/dist/__tests__/agents/fileCheckStep.test.js +299 -0
- package/dist/__tests__/agents/fileCheckStep.test.js.map +1 -0
- package/dist/__tests__/agents/giveUpEvaluatorStep.test.js +35 -0
- package/dist/__tests__/agents/giveUpEvaluatorStep.test.js.map +1 -0
- package/dist/__tests__/agents/guardState.test.js +297 -0
- package/dist/__tests__/agents/guardState.test.js.map +1 -0
- package/dist/__tests__/agents/mainAgentHeuristics.test.js +72 -0
- package/dist/__tests__/agents/mainAgentHeuristics.test.js.map +1 -0
- package/dist/__tests__/agents/objectiveEvaluatorStep.test.js +60 -0
- package/dist/__tests__/agents/objectiveEvaluatorStep.test.js.map +1 -0
- package/dist/__tests__/agents/outerLoopRecoveryEvaluator.test.js +207 -0
- package/dist/__tests__/agents/outerLoopRecoveryEvaluator.test.js.map +1 -0
- package/dist/__tests__/agents/prompting.test.js +363 -0
- package/dist/__tests__/agents/prompting.test.js.map +1 -0
- package/dist/__tests__/agents/readinessGateStep.test.js +180 -0
- package/dist/__tests__/agents/readinessGateStep.test.js.map +1 -0
- package/dist/__tests__/agents/reasonNextStep.test.js +56 -0
- package/dist/__tests__/agents/reasonNextStep.test.js.map +1 -0
- package/dist/__tests__/agents/reasonNextTaskStep.test.js +284 -0
- package/dist/__tests__/agents/reasonNextTaskStep.test.js.map +1 -0
- package/dist/__tests__/agents/resolveAgentTargetClassification.test.js +170 -0
- package/dist/__tests__/agents/resolveAgentTargetClassification.test.js.map +1 -0
- package/dist/__tests__/agents/resolveProgressState.test.js +526 -0
- package/dist/__tests__/agents/resolveProgressState.test.js.map +1 -0
- package/dist/__tests__/agents/resumeCheckpoint.test.js +50 -0
- package/dist/__tests__/agents/resumeCheckpoint.test.js.map +1 -0
- package/dist/__tests__/agents/routingDecisionStep.test.js +134 -0
- package/dist/__tests__/agents/routingDecisionStep.test.js.map +1 -0
- package/dist/__tests__/agents/scopeClassificationStep.test.js +118 -0
- package/dist/__tests__/agents/scopeClassificationStep.test.js.map +1 -0
- package/dist/__tests__/agents/searchContext.test.js +97 -0
- package/dist/__tests__/agents/searchContext.test.js.map +1 -0
- package/dist/__tests__/agents/selectRelevantSourcesStep.test.js +73 -0
- package/dist/__tests__/agents/selectRelevantSourcesStep.test.js.map +1 -0
- package/dist/__tests__/agents/structuredOutput.test.js +45 -0
- package/dist/__tests__/agents/structuredOutput.test.js.map +1 -0
- package/dist/__tests__/agents/transformPlanGenStep.fallback.test.js +59 -0
- package/dist/__tests__/agents/transformPlanGenStep.fallback.test.js.map +1 -0
- package/dist/__tests__/agents/transformPlanGenStep.test.js +92 -0
- package/dist/__tests__/agents/transformPlanGenStep.test.js.map +1 -0
- package/dist/__tests__/agents/understandIntentStep.test.js +237 -0
- package/dist/__tests__/agents/understandIntentStep.test.js.map +1 -0
- package/dist/__tests__/agents/understandResumeContext.test.js +65 -0
- package/dist/__tests__/agents/understandResumeContext.test.js.map +1 -0
- package/dist/__tests__/agents/understandScope.test.js +227 -0
- package/dist/__tests__/agents/understandScope.test.js.map +1 -0
- package/dist/__tests__/agents/validateChangesStep.test.js +52 -0
- package/dist/__tests__/agents/validateChangesStep.test.js.map +1 -0
- package/dist/__tests__/askCommandTaskBinding.test.js +176 -0
- package/dist/__tests__/askCommandTaskBinding.test.js.map +1 -0
- package/dist/__tests__/commandVisibility.test.js +25 -0
- package/dist/__tests__/commandVisibility.test.js.map +1 -0
- package/dist/__tests__/config.devOutput.test.js +82 -0
- package/dist/__tests__/config.devOutput.test.js.map +1 -0
- package/dist/__tests__/currentContext.test.js +43 -0
- package/dist/__tests__/currentContext.test.js.map +1 -0
- package/dist/__tests__/daemonWorker.test.js +51 -0
- package/dist/__tests__/daemonWorker.test.js.map +1 -0
- package/dist/__tests__/dialogState.test.js +113 -0
- package/dist/__tests__/dialogState.test.js.map +1 -0
- package/dist/__tests__/evalCommands.test.js +506 -0
- package/dist/__tests__/evalCommands.test.js.map +1 -0
- package/dist/__tests__/evalCommandsSummary.test.js +68 -0
- package/dist/__tests__/evalCommandsSummary.test.js.map +1 -0
- package/dist/__tests__/example.test.js +1 -0
- package/dist/__tests__/example.test.js.map +1 -0
- package/dist/__tests__/factory.commitCommand.test.js +45 -0
- package/dist/__tests__/factory.commitCommand.test.js.map +1 -0
- package/dist/__tests__/factory.devOutputCommand.test.js +122 -0
- package/dist/__tests__/factory.devOutputCommand.test.js.map +1 -0
- package/dist/__tests__/factory.evalCommands.test.js +38 -0
- package/dist/__tests__/factory.evalCommands.test.js.map +1 -0
- package/dist/__tests__/factory.planCommand.test.js +35 -0
- package/dist/__tests__/factory.planCommand.test.js.map +1 -0
- package/dist/__tests__/factory.setupCommand.test.js +34 -0
- package/dist/__tests__/factory.setupCommand.test.js.map +1 -0
- package/dist/__tests__/factory.statusCommand.test.js +54 -0
- package/dist/__tests__/factory.statusCommand.test.js.map +1 -0
- package/dist/__tests__/fileRules/queryTokenRules.test.js +35 -0
- package/dist/__tests__/fileRules/queryTokenRules.test.js.map +1 -0
- package/dist/__tests__/fileRules/searchPathClassification.test.js +57 -0
- package/dist/__tests__/fileRules/searchPathClassification.test.js.map +1 -0
- package/dist/__tests__/generate.ollamaRecovery.test.js +344 -0
- package/dist/__tests__/generate.ollamaRecovery.test.js.map +1 -0
- package/dist/__tests__/index.modelStartup.test.js +24 -0
- package/dist/__tests__/index.modelStartup.test.js.map +1 -0
- package/dist/__tests__/indexCmd.test.js +85 -0
- package/dist/__tests__/indexCmd.test.js.map +1 -0
- package/dist/__tests__/indexSlashCommand.test.js +50 -0
- package/dist/__tests__/indexSlashCommand.test.js.map +1 -0
- package/dist/__tests__/ollamaService.test.js +103 -0
- package/dist/__tests__/ollamaService.test.js.map +1 -0
- package/dist/__tests__/pipeline/modules/codeTransformModule.small-file.test.js +68 -0
- package/dist/__tests__/pipeline/modules/codeTransformModule.small-file.test.js.map +1 -0
- package/dist/__tests__/pipeline/modules/commitSuggesterModule.test.js +68 -0
- package/dist/__tests__/pipeline/modules/commitSuggesterModule.test.js.map +1 -0
- package/dist/__tests__/pipeline/modules/fileSearchModule.test.js +284 -0
- package/dist/__tests__/pipeline/modules/fileSearchModule.test.js.map +1 -0
- package/dist/__tests__/pipeline/modules/finalAnswerModule.test.js +1139 -0
- package/dist/__tests__/pipeline/modules/finalAnswerModule.test.js.map +1 -0
- package/dist/__tests__/pipeline/modules/readFileModule.test.js +146 -0
- package/dist/__tests__/pipeline/modules/readFileModule.test.js.map +1 -0
- package/dist/__tests__/pipeline/modules/semanticAnalysisModule.test.js +192 -0
- package/dist/__tests__/pipeline/modules/semanticAnalysisModule.test.js.map +1 -0
- package/dist/__tests__/repoIdentity.test.js +31 -0
- package/dist/__tests__/repoIdentity.test.js.map +1 -0
- package/dist/__tests__/resumeContext.test.js +87 -0
- package/dist/__tests__/resumeContext.test.js.map +1 -0
- package/dist/__tests__/resumeState.test.js +239 -0
- package/dist/__tests__/resumeState.test.js.map +1 -0
- package/dist/__tests__/search/SearchOrchestrator.test.js +836 -0
- package/dist/__tests__/search/SearchOrchestrator.test.js.map +1 -0
- package/dist/__tests__/shellDialogUi.test.js +52 -0
- package/dist/__tests__/shellDialogUi.test.js.map +1 -0
- package/dist/__tests__/shellSession.test.js +102 -0
- package/dist/__tests__/shellSession.test.js.map +1 -0
- package/dist/__tests__/statusOwner.test.js +215 -0
- package/dist/__tests__/statusOwner.test.js.map +1 -0
- package/dist/__tests__/testing/contextEval.test.js +244 -0
- package/dist/__tests__/testing/contextEval.test.js.map +1 -0
- package/dist/__tests__/testing/harnessArtifacts.test.js +124 -0
- package/dist/__tests__/testing/harnessArtifacts.test.js.map +1 -0
- package/dist/__tests__/testing/llmTraceSession.test.js +67 -0
- package/dist/__tests__/testing/llmTraceSession.test.js.map +1 -0
- package/dist/__tests__/testing/registerDevCliCommands.test.js +35 -0
- package/dist/__tests__/testing/registerDevCliCommands.test.js.map +1 -0
- package/dist/__tests__/testing/runDiagnosis.test.js +159 -0
- package/dist/__tests__/testing/runDiagnosis.test.js.map +1 -0
- package/dist/__tests__/testing/runtimeLogReader.test.js +66 -0
- package/dist/__tests__/testing/runtimeLogReader.test.js.map +1 -0
- package/dist/__tests__/testing/testCommands.test.js +53 -0
- package/dist/__tests__/testing/testCommands.test.js.map +1 -0
- package/dist/__tests__/utils/compileSearchQuery.test.js +38 -0
- package/dist/__tests__/utils/compileSearchQuery.test.js.map +1 -0
- package/dist/__tests__/utils/consolePresentation.test.js +105 -0
- package/dist/__tests__/utils/consolePresentation.test.js.map +1 -0
- package/dist/__tests__/utils/extractFileReferences.test.js +41 -0
- package/dist/__tests__/utils/extractFileReferences.test.js.map +1 -0
- package/dist/__tests__/utils/log.test.js +34 -0
- package/dist/__tests__/utils/log.test.js.map +1 -0
- package/dist/__tests__/utils/runtimeLogger.test.js +200 -0
- package/dist/__tests__/utils/runtimeLogger.test.js.map +1 -0
- package/dist/__tests__/utils/spinner.test.js +31 -0
- package/dist/__tests__/utils/spinner.test.js.map +1 -0
- package/dist/__tests__/utils/verifyFocusPreference.test.js +41 -0
- package/dist/__tests__/utils/verifyFocusPreference.test.js.map +1 -0
- package/dist/agent/actions/index.js +301 -0
- package/dist/agent/actions/index.js.map +1 -0
- package/dist/agent/actions/normalize.js +360 -0
- package/dist/agent/actions/normalize.js.map +1 -0
- package/dist/agent/actions/schemas.js +129 -0
- package/dist/agent/actions/schemas.js.map +1 -0
- package/dist/agent/evidence/index.js +320 -0
- package/dist/agent/evidence/index.js.map +1 -0
- package/dist/agent/feedback/index.js +187 -0
- package/dist/agent/feedback/index.js.map +1 -0
- package/dist/agent/finalization/index.js +35 -0
- package/dist/agent/finalization/index.js.map +1 -0
- package/dist/agent/index.js +126 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/agent/logging/index.js +350 -0
- package/dist/agent/logging/index.js.map +1 -0
- package/dist/agent/persistence/boot.js +58 -0
- package/dist/agent/persistence/boot.js.map +1 -0
- package/dist/agent/persistence/currentTask.js +36 -0
- package/dist/agent/persistence/currentTask.js.map +1 -0
- package/dist/agent/persistence/hydrate.js +42 -0
- package/dist/agent/persistence/hydrate.js.map +1 -0
- package/dist/agent/persistence/index.js +15 -0
- package/dist/agent/persistence/index.js.map +1 -0
- package/dist/agent/persistence/snapshots.js +97 -0
- package/dist/agent/persistence/snapshots.js.map +1 -0
- package/dist/agent/persistence/steps.js +95 -0
- package/dist/agent/persistence/steps.js.map +1 -0
- package/dist/agent/persistence/tasks.js +195 -0
- package/dist/agent/persistence/tasks.js.map +1 -0
- package/dist/agent/persistence/turns.js +92 -0
- package/dist/agent/persistence/turns.js.map +1 -0
- package/dist/agent/policy/ambiguityResolution.js +226 -0
- package/dist/agent/policy/ambiguityResolution.js.map +1 -0
- package/dist/agent/policy/contracts.js +2 -0
- package/dist/agent/policy/contracts.js.map +1 -0
- package/dist/agent/policy/coveragePolicy.js +309 -0
- package/dist/agent/policy/coveragePolicy.js.map +1 -0
- package/dist/agent/policy/endDecisionPolicy.js +31 -0
- package/dist/agent/policy/endDecisionPolicy.js.map +1 -0
- package/dist/agent/policy/index.js +344 -0
- package/dist/agent/policy/index.js.map +1 -0
- package/dist/agent/policy/loopReview.js +778 -0
- package/dist/agent/policy/loopReview.js.map +1 -0
- package/dist/agent/policy/readinessPolicy.js +108 -0
- package/dist/agent/policy/readinessPolicy.js.map +1 -0
- package/dist/agent/policy/resolutionPipeline.js +356 -0
- package/dist/agent/policy/resolutionPipeline.js.map +1 -0
- package/dist/agent/policy/targetClassification.js +33 -0
- package/dist/agent/policy/targetClassification.js.map +1 -0
- package/dist/agent/prompting/actionChoice.js +90 -0
- package/dist/agent/prompting/actionChoice.js.map +1 -0
- package/dist/agent/prompting/finalAnswer.js +38 -0
- package/dist/agent/prompting/finalAnswer.js.map +1 -0
- package/dist/agent/prompting/index.js +14 -0
- package/dist/agent/prompting/index.js.map +1 -0
- package/dist/agent/prompting/plan.js +59 -0
- package/dist/agent/prompting/plan.js.map +1 -0
- package/dist/agent/prompting/transform.js +175 -0
- package/dist/agent/prompting/transform.js.map +1 -0
- package/dist/agent/prompting/understand.js +70 -0
- package/dist/agent/prompting/understand.js.map +1 -0
- package/dist/agent/read/freshness.js +29 -0
- package/dist/agent/read/freshness.js.map +1 -0
- package/dist/agent/read/fullReadPrompt.js +43 -0
- package/dist/agent/read/fullReadPrompt.js.map +1 -0
- package/dist/agent/read/index.js +140 -0
- package/dist/agent/read/index.js.map +1 -0
- package/dist/agent/read/persistence.js +88 -0
- package/dist/agent/read/persistence.js.map +1 -0
- package/dist/agent/read/summarizeReadEvidence.js +733 -0
- package/dist/agent/read/summarizeReadEvidence.js.map +1 -0
- package/dist/agent/read/targetResolution.js +126 -0
- package/dist/agent/read/targetResolution.js.map +1 -0
- package/dist/agent/resume/checkpoint.js +41 -0
- package/dist/agent/resume/checkpoint.js.map +1 -0
- package/dist/agent/runtime/lifecycle.js +67 -0
- package/dist/agent/runtime/lifecycle.js.map +1 -0
- package/dist/agent/runtime/progress.js +178 -0
- package/dist/agent/runtime/progress.js.map +1 -0
- package/dist/agent/runtime/runAgentLoop.js +402 -0
- package/dist/agent/runtime/runAgentLoop.js.map +1 -0
- package/dist/agent/runtime/runAgentPlanOnly.js +127 -0
- package/dist/agent/runtime/runAgentPlanOnly.js.map +1 -0
- package/dist/agent/runtime/understand.js +336 -0
- package/dist/agent/runtime/understand.js.map +1 -0
- package/dist/agent/search/batchPlanner.js +274 -0
- package/dist/agent/search/batchPlanner.js.map +1 -0
- package/dist/agent/search/candidateRetentionPolicy.js +184 -0
- package/dist/agent/search/candidateRetentionPolicy.js.map +1 -0
- package/dist/agent/search/directory.js +51 -0
- package/dist/agent/search/directory.js.map +1 -0
- package/dist/agent/search/exactTarget.js +151 -0
- package/dist/agent/search/exactTarget.js.map +1 -0
- package/dist/agent/search/fragment.js +110 -0
- package/dist/agent/search/fragment.js.map +1 -0
- package/dist/agent/search/index.js +166 -0
- package/dist/agent/search/index.js.map +1 -0
- package/dist/agent/search/laneClassifier.js +119 -0
- package/dist/agent/search/laneClassifier.js.map +1 -0
- package/dist/agent/search/limits.js +10 -0
- package/dist/agent/search/limits.js.map +1 -0
- package/dist/agent/search/ranking.js +22 -0
- package/dist/agent/search/ranking.js.map +1 -0
- package/dist/agent/search/regex.js +83 -0
- package/dist/agent/search/regex.js.map +1 -0
- package/dist/agent/search/routePolicy.js +11 -0
- package/dist/agent/search/routePolicy.js.map +1 -0
- package/dist/agent/search/searchContext.js +128 -0
- package/dist/agent/search/searchContext.js.map +1 -0
- package/dist/agent/search/semantic.js +113 -0
- package/dist/agent/search/semantic.js.map +1 -0
- package/dist/agent/search/semanticIndexSearch.js +202 -0
- package/dist/agent/search/semanticIndexSearch.js.map +1 -0
- package/dist/agent/search/shared.js +283 -0
- package/dist/agent/search/shared.js.map +1 -0
- package/dist/agent/search/shell.js +202 -0
- package/dist/agent/search/shell.js.map +1 -0
- package/dist/agent/search/snippetEvidence.js +57 -0
- package/dist/agent/search/snippetEvidence.js.map +1 -0
- package/dist/agent/search/types.js +2 -0
- package/dist/agent/search/types.js.map +1 -0
- package/dist/agent/state/index.js +99 -0
- package/dist/agent/state/index.js.map +1 -0
- package/dist/agent/state/memory.js +56 -0
- package/dist/agent/state/memory.js.map +1 -0
- package/dist/agent/structuredOutput/index.js +28 -0
- package/dist/agent/structuredOutput/index.js.map +1 -0
- package/dist/agent/tools/index.js +199 -0
- package/dist/agent/tools/index.js.map +1 -0
- package/dist/agent/transform/index.js +519 -0
- package/dist/agent/transform/index.js.map +1 -0
- package/dist/agent/transform/syntax.js +49 -0
- package/dist/agent/transform/syntax.js.map +1 -0
- package/dist/agent/types.js +20 -0
- package/dist/agent/types.js.map +1 -0
- package/dist/agents/actionRegistry.js +114 -0
- package/dist/agents/actionRegistry.js.map +1 -0
- package/dist/agents/agent.js +5 -0
- package/dist/agents/agent.js.map +1 -0
- package/dist/agents/agentActions.js +5 -0
- package/dist/agents/agentActions.js.map +1 -0
- package/dist/agents/agentEvidence.js +5 -0
- package/dist/agents/agentEvidence.js.map +1 -0
- package/dist/agents/agentFeedback.js +5 -0
- package/dist/agents/agentFeedback.js.map +1 -0
- package/dist/agents/agentLogging.js +5 -0
- package/dist/agents/agentLogging.js.map +1 -0
- package/dist/agents/agentLoop.js +5 -0
- package/dist/agents/agentLoop.js.map +1 -0
- package/dist/agents/agentMemory.js +5 -0
- package/dist/agents/agentMemory.js.map +1 -0
- package/dist/agents/agentPlanMode.js +5 -0
- package/dist/agents/agentPlanMode.js.map +1 -0
- package/dist/agents/agentPolicyState.js +5 -0
- package/dist/agents/agentPolicyState.js.map +1 -0
- package/dist/agents/agentProgress.js +93 -0
- package/dist/agents/agentProgress.js.map +1 -0
- package/dist/agents/agentSchemas.js +5 -0
- package/dist/agents/agentSchemas.js.map +1 -0
- package/dist/agents/agentSearchScoring.js +5 -0
- package/dist/agents/agentSearchScoring.js.map +1 -0
- package/dist/agents/agentStateMachine.js +5 -0
- package/dist/agents/agentStateMachine.js.map +1 -0
- package/dist/agents/agentTools.js +5 -0
- package/dist/agents/agentTools.js.map +1 -0
- package/dist/agents/agentTypes.js +5 -0
- package/dist/agents/agentTypes.js.map +1 -0
- package/dist/agents/agentUnderstand.js +5 -0
- package/dist/agents/agentUnderstand.js.map +1 -0
- package/dist/agents/analysisPlanGenStep.js +194 -17
- package/dist/agents/analysisPlanGenStep.js.map +1 -0
- package/dist/agents/answerOnlyCompletion.js +32 -0
- package/dist/agents/answerOnlyCompletion.js.map +1 -0
- package/dist/agents/collaboratorStep.js +1 -0
- package/dist/agents/collaboratorStep.js.map +1 -0
- package/dist/agents/decideNextAction.js +444 -0
- package/dist/agents/decideNextAction.js.map +1 -0
- package/dist/agents/deriveFocusFromSearchStep.js +83 -0
- package/dist/agents/deriveFocusFromSearchStep.js.map +1 -0
- package/dist/agents/evidenceVerifierStep.js +104 -13
- package/dist/agents/evidenceVerifierStep.js.map +1 -0
- package/dist/agents/fileCheckStep.js +381 -12
- package/dist/agents/fileCheckStep.js.map +1 -0
- package/dist/agents/giveUpEvaluatorStep.js +63 -0
- package/dist/agents/giveUpEvaluatorStep.js.map +1 -0
- package/dist/agents/guardPolicy.js +20 -0
- package/dist/agents/guardPolicy.js.map +1 -0
- package/dist/agents/guards/executionPolicyResolver.js +165 -0
- package/dist/agents/guards/executionPolicyResolver.js.map +1 -0
- package/dist/agents/guards/guardState.js +195 -0
- package/dist/agents/guards/guardState.js.map +1 -0
- package/dist/agents/guards/resolveProgressState.js +403 -0
- package/dist/agents/guards/resolveProgressState.js.map +1 -0
- package/dist/agents/infoPlanGenStep.js +66 -8
- package/dist/agents/infoPlanGenStep.js.map +1 -0
- package/dist/agents/integrateFeedbackStep.js +1 -0
- package/dist/agents/integrateFeedbackStep.js.map +1 -0
- package/dist/agents/iterationFileSelector.js +8 -7
- package/dist/agents/iterationFileSelector.js.map +1 -0
- package/dist/agents/mainAgentActivityLog.js +85 -0
- package/dist/agents/mainAgentActivityLog.js.map +1 -0
- package/dist/agents/mainAgentHeuristics.js +173 -0
- package/dist/agents/mainAgentHeuristics.js.map +1 -0
- package/dist/agents/mainAgentVerify.js +159 -0
- package/dist/agents/mainAgentVerify.js.map +1 -0
- package/dist/agents/objectiveEvaluatorStep.js +103 -0
- package/dist/agents/objectiveEvaluatorStep.js.map +1 -0
- package/dist/agents/outerLoopRecoveryEvaluator.js +108 -0
- package/dist/agents/outerLoopRecoveryEvaluator.js.map +1 -0
- package/dist/agents/readinessGateStep.js +95 -9
- package/dist/agents/readinessGateStep.js.map +1 -0
- package/dist/agents/reasonNextStep.js +9 -8
- package/dist/agents/reasonNextStep.js.map +1 -0
- package/dist/agents/reasonNextTaskStep.js +267 -144
- package/dist/agents/reasonNextTaskStep.js.map +1 -0
- package/dist/agents/researchPlanGenStep.js +61 -25
- package/dist/agents/researchPlanGenStep.js.map +1 -0
- package/dist/agents/resolveAgentTargetClassification.js +5 -0
- package/dist/agents/resolveAgentTargetClassification.js.map +1 -0
- package/dist/agents/resolveExecutionModeStep.js +1 -0
- package/dist/agents/resolveExecutionModeStep.js.map +1 -0
- package/dist/agents/resolveExplicitTargetsStep.js +74 -0
- package/dist/agents/resolveExplicitTargetsStep.js.map +1 -0
- package/dist/agents/routingDecisionStep.js +58 -11
- package/dist/agents/routingDecisionStep.js.map +1 -0
- package/dist/agents/scopeClassificationStep.js +66 -3
- package/dist/agents/scopeClassificationStep.js.map +1 -0
- package/dist/agents/selectRelevantSourcesStep.js +13 -5
- package/dist/agents/selectRelevantSourcesStep.js.map +1 -0
- package/dist/agents/structuralPreloadStep.js +3 -4
- package/dist/agents/structuralPreloadStep.js.map +1 -0
- package/dist/agents/transformPlanGenStep.js +105 -18
- package/dist/agents/transformPlanGenStep.js.map +1 -0
- package/dist/agents/understandIntentStep.js +237 -17
- package/dist/agents/understandIntentStep.js.map +1 -0
- package/dist/agents/validateChangesStep.js +16 -2
- package/dist/agents/validateChangesStep.js.map +1 -0
- package/dist/agents/writeFileStep.js +1 -0
- package/dist/agents/writeFileStep.js.map +1 -0
- package/dist/commands/AskCmd.js +139 -44
- package/dist/commands/AskCmd.js.map +1 -0
- package/dist/commands/BackupCmd.js +1 -0
- package/dist/commands/BackupCmd.js.map +1 -0
- package/dist/commands/ChangeLogUpdateCmd.js +1 -0
- package/dist/commands/ChangeLogUpdateCmd.js.map +1 -0
- package/dist/commands/CommitSuggesterCmd.js +55 -13
- package/dist/commands/CommitSuggesterCmd.js.map +1 -0
- package/dist/commands/DaemonCmd.js +52 -14
- package/dist/commands/DaemonCmd.js.map +1 -0
- package/dist/commands/DeleteIndex.js +1 -0
- package/dist/commands/DeleteIndex.js.map +1 -0
- package/dist/commands/EvalReportCmd.js +374 -0
- package/dist/commands/EvalReportCmd.js.map +1 -0
- package/dist/commands/FindCmd.js +1 -0
- package/dist/commands/FindCmd.js.map +1 -0
- package/dist/commands/GitCmd.js +1 -0
- package/dist/commands/GitCmd.js.map +1 -0
- package/dist/commands/IndexCmd.js +11 -79
- package/dist/commands/IndexCmd.js.map +1 -0
- package/dist/commands/InspectCmd.js +1 -0
- package/dist/commands/InspectCmd.js.map +1 -0
- package/dist/commands/ModelCmd.js +24 -0
- package/dist/commands/ModelCmd.js.map +1 -0
- package/dist/commands/ReadlineSingleton.js +1 -0
- package/dist/commands/ReadlineSingleton.js.map +1 -0
- package/dist/commands/ResetDbCmd.js +18 -1
- package/dist/commands/ResetDbCmd.js.map +1 -0
- package/dist/commands/ReviewCmd.js +1 -0
- package/dist/commands/ReviewCmd.js.map +1 -0
- package/dist/commands/StatusCmd.js +22 -0
- package/dist/commands/StatusCmd.js.map +1 -0
- package/dist/commands/StopDaemonCmd.js +1 -0
- package/dist/commands/StopDaemonCmd.js.map +1 -0
- package/dist/commands/SummaryCmd.js +1 -0
- package/dist/commands/SummaryCmd.js.map +1 -0
- package/dist/commands/SwitchCmd.js +9 -15
- package/dist/commands/SwitchCmd.js.map +1 -0
- package/dist/commands/TasksCmd.js +142 -57
- package/dist/commands/TasksCmd.js.map +1 -0
- package/dist/commands/TestCmd.js +66 -0
- package/dist/commands/TestCmd.js.map +1 -0
- package/dist/commands/WorkflowCmd.js +1 -0
- package/dist/commands/WorkflowCmd.js.map +1 -0
- package/dist/commands/commandVisibility.js +27 -0
- package/dist/commands/commandVisibility.js.map +1 -0
- package/dist/commands/evalCommands.js +1337 -0
- package/dist/commands/evalCommands.js.map +1 -0
- package/dist/commands/factory.js +206 -38
- package/dist/commands/factory.js.map +1 -0
- package/dist/config.js +62 -11
- package/dist/config.js.map +1 -0
- package/dist/constants.js +21 -3
- package/dist/constants.js.map +1 -0
- package/dist/context.js +33 -32
- package/dist/context.js.map +1 -0
- package/dist/daemon/daemonQueues.js +1 -20
- package/dist/daemon/daemonQueues.js.map +1 -0
- package/dist/daemon/daemonWorker.js +26 -37
- package/dist/daemon/daemonWorker.js.map +1 -0
- package/dist/daemon/generateSummaries.js +1 -0
- package/dist/daemon/generateSummaries.js.map +1 -0
- package/dist/daemon/runFolderCapsuleBatch.js +1 -0
- package/dist/daemon/runFolderCapsuleBatch.js.map +1 -0
- package/dist/daemon/runIndexingBatch.js +1 -0
- package/dist/daemon/runIndexingBatch.js.map +1 -0
- package/dist/daemon/runKgBatch.js +9 -1
- package/dist/daemon/runKgBatch.js.map +1 -0
- package/dist/db/backup.js +1 -0
- package/dist/db/backup.js.map +1 -0
- package/dist/db/client.js +18 -3
- package/dist/db/client.js.map +1 -0
- package/dist/db/fileIndex.js +110 -152
- package/dist/db/fileIndex.js.map +1 -0
- package/dist/db/functionExtractors/extractFromJava.js +1 -0
- package/dist/db/functionExtractors/extractFromJava.js.map +1 -0
- package/dist/db/functionExtractors/extractFromJs.js +1 -0
- package/dist/db/functionExtractors/extractFromJs.js.map +1 -0
- package/dist/db/functionExtractors/extractFromTs.js +1 -0
- package/dist/db/functionExtractors/extractFromTs.js.map +1 -0
- package/dist/db/functionExtractors/extractFromXML.js +1 -0
- package/dist/db/functionExtractors/extractFromXML.js.map +1 -0
- package/dist/db/functionExtractors/index.js +1 -0
- package/dist/db/functionExtractors/index.js.map +1 -0
- package/dist/db/functionIndex.js +9 -0
- package/dist/db/functionIndex.js.map +1 -0
- package/dist/db/schema.js +314 -99
- package/dist/db/schema.js.map +1 -0
- package/dist/db/sqlTemplates.js +1 -0
- package/dist/db/sqlTemplates.js.map +1 -0
- package/dist/fileRules/builtins.js +1 -0
- package/dist/fileRules/builtins.js.map +1 -0
- package/dist/fileRules/classifyFile.js +1 -0
- package/dist/fileRules/classifyFile.js.map +1 -0
- package/dist/fileRules/codeAllowedExtensions.js +1 -0
- package/dist/fileRules/codeAllowedExtensions.js.map +1 -0
- package/dist/fileRules/detectFileType.js +1 -0
- package/dist/fileRules/detectFileType.js.map +1 -0
- package/dist/fileRules/fileClassifier.js +1 -0
- package/dist/fileRules/fileClassifier.js.map +1 -0
- package/dist/fileRules/fileExceptions.js +1 -0
- package/dist/fileRules/fileExceptions.js.map +1 -0
- package/dist/fileRules/ignoredExtensions.js +1 -0
- package/dist/fileRules/ignoredExtensions.js.map +1 -0
- package/dist/fileRules/ignoredPaths.js +48 -5
- package/dist/fileRules/ignoredPaths.js.map +1 -0
- package/dist/fileRules/queryTokenRules.js +176 -0
- package/dist/fileRules/queryTokenRules.js.map +1 -0
- package/dist/fileRules/searchPathClassification.js +58 -0
- package/dist/fileRules/searchPathClassification.js.map +1 -0
- package/dist/fileRules/shouldIgnoreFiles.js +1 -0
- package/dist/fileRules/shouldIgnoreFiles.js.map +1 -0
- package/dist/fileRules/stopWords.js +9 -0
- package/dist/fileRules/stopWords.js.map +1 -0
- package/dist/fileRules/wellKnownRepoFiles.js +1 -0
- package/dist/fileRules/wellKnownRepoFiles.js.map +1 -0
- package/dist/git/commitSummary.js +227 -0
- package/dist/git/commitSummary.js.map +1 -0
- package/dist/github/api.js +1 -0
- package/dist/github/api.js.map +1 -0
- package/dist/github/auth.js +1 -0
- package/dist/github/auth.js.map +1 -0
- package/dist/github/github.js +1 -0
- package/dist/github/github.js.map +1 -0
- package/dist/github/githubAuthCheck.js +1 -0
- package/dist/github/githubAuthCheck.js.map +1 -0
- package/dist/github/postComments.js +1 -0
- package/dist/github/postComments.js.map +1 -0
- package/dist/github/repo.js +15 -24
- package/dist/github/repo.js.map +1 -0
- package/dist/github/token.js +1 -0
- package/dist/github/token.js.map +1 -0
- package/dist/github/types.js +1 -0
- package/dist/github/types.js.map +1 -0
- package/dist/index.js +318 -37
- package/dist/index.js.map +1 -0
- package/dist/lib/generate.js +264 -20
- package/dist/lib/generate.js.map +1 -0
- package/dist/lib/generateFolderCapsules.js +1 -0
- package/dist/lib/generateFolderCapsules.js.map +1 -0
- package/dist/lib/ollamaModelPolicy.js +59 -0
- package/dist/lib/ollamaModelPolicy.js.map +1 -0
- package/dist/lib/spinner.js +29 -9
- package/dist/lib/spinner.js.map +1 -0
- package/dist/modelSetup.js +25 -78
- package/dist/modelSetup.js.map +1 -0
- package/dist/pipeline/modules/changeLogModule.js +10 -1
- package/dist/pipeline/modules/changeLogModule.js.map +1 -0
- package/dist/pipeline/modules/cleanupModule.js +1 -0
- package/dist/pipeline/modules/cleanupModule.js.map +1 -0
- package/dist/pipeline/modules/codeTransformModule.js +10 -16
- package/dist/pipeline/modules/codeTransformModule.js.map +1 -0
- package/dist/pipeline/modules/commentModule.js +12 -0
- package/dist/pipeline/modules/commentModule.js.map +1 -0
- package/dist/pipeline/modules/commitSuggesterModule.js +82 -12
- package/dist/pipeline/modules/commitSuggesterModule.js.map +1 -0
- package/dist/pipeline/modules/contextReviewModule.js +12 -1
- package/dist/pipeline/modules/contextReviewModule.js.map +1 -0
- package/dist/pipeline/modules/dialogAnswerModule.js +58 -0
- package/dist/pipeline/modules/dialogAnswerModule.js.map +1 -0
- package/dist/pipeline/modules/fileSearchModule.js +5 -143
- package/dist/pipeline/modules/fileSearchModule.js.map +1 -0
- package/dist/pipeline/modules/finalAnswerModule.js +1176 -151
- package/dist/pipeline/modules/finalAnswerModule.js.map +1 -0
- package/dist/pipeline/modules/kgModule.js +18 -1
- package/dist/pipeline/modules/kgModule.js.map +1 -0
- package/dist/pipeline/modules/planAnswerModule.js +99 -0
- package/dist/pipeline/modules/planAnswerModule.js.map +1 -0
- package/dist/pipeline/modules/readFileModule.js +300 -0
- package/dist/pipeline/modules/readFileModule.js.map +1 -0
- package/dist/pipeline/modules/reviewModule.js +10 -1
- package/dist/pipeline/modules/reviewModule.js.map +1 -0
- package/dist/pipeline/modules/searchDbModule.js +159 -0
- package/dist/pipeline/modules/searchDbModule.js.map +1 -0
- package/dist/pipeline/modules/searchListDirectoryModule.js +62 -0
- package/dist/pipeline/modules/searchListDirectoryModule.js.map +1 -0
- package/dist/pipeline/modules/searchModuleShared.js +71 -0
- package/dist/pipeline/modules/searchModuleShared.js.map +1 -0
- package/dist/pipeline/modules/searchRegexModule.js +59 -0
- package/dist/pipeline/modules/searchRegexModule.js.map +1 -0
- package/dist/pipeline/modules/semanticAnalysisModule.js +185 -28
- package/dist/pipeline/modules/semanticAnalysisModule.js.map +1 -0
- package/dist/pipeline/modules/summaryModule.js +11 -1
- package/dist/pipeline/modules/summaryModule.js.map +1 -0
- package/dist/pipeline/registry/moduleRegistry.js +9 -0
- package/dist/pipeline/registry/moduleRegistry.js.map +1 -0
- package/dist/pipeline/runModulePipeline.js +1 -0
- package/dist/pipeline/runModulePipeline.js.map +1 -0
- package/dist/scripts/dbScriptSupport.js +172 -0
- package/dist/scripts/dbScriptSupport.js.map +1 -0
- package/dist/scripts/dbcheck.js +173 -267
- package/dist/scripts/dbcheck.js.map +1 -0
- package/dist/scripts/dboverview.js +161 -0
- package/dist/scripts/dboverview.js.map +1 -0
- package/dist/scripts/migrateDb.js +1 -0
- package/dist/scripts/migrateDb.js.map +1 -0
- package/dist/search/SearchOrchestrator.js +928 -0
- package/dist/search/SearchOrchestrator.js.map +1 -0
- package/dist/search/sharedRankingPolicy.js +283 -0
- package/dist/search/sharedRankingPolicy.js.map +1 -0
- package/dist/setup/reindexOwner.js +97 -0
- package/dist/setup/reindexOwner.js.map +1 -0
- package/dist/setup/setupOwner.js +100 -0
- package/dist/setup/setupOwner.js.map +1 -0
- package/dist/shell/dialogUi.js +81 -0
- package/dist/shell/dialogUi.js.map +1 -0
- package/dist/shellSession.js +126 -0
- package/dist/shellSession.js.map +1 -0
- package/dist/status/statusOwner.js +239 -0
- package/dist/status/statusOwner.js.map +1 -0
- package/dist/testing/contextEval.js +514 -0
- package/dist/testing/contextEval.js.map +1 -0
- package/dist/testing/fixtures/transform/small-file.input.js +5 -0
- package/dist/testing/fixtures/transform/small-file.input.js.map +1 -0
- package/dist/testing/harnessArtifacts.js +112 -0
- package/dist/testing/harnessArtifacts.js.map +1 -0
- package/dist/testing/llmTraceSession.js +67 -0
- package/dist/testing/llmTraceSession.js.map +1 -0
- package/dist/testing/registerDevCliCommands.js +43 -0
- package/dist/testing/registerDevCliCommands.js.map +1 -0
- package/dist/testing/runDiagnosis.js +248 -0
- package/dist/testing/runDiagnosis.js.map +1 -0
- package/dist/testing/runtimeLogReader.js +144 -0
- package/dist/testing/runtimeLogReader.js.map +1 -0
- package/dist/testing/testCommands.js +35 -303
- package/dist/testing/testCommands.js.map +1 -0
- package/dist/testing/testRegistry.js +233 -0
- package/dist/testing/testRegistry.js.map +1 -0
- package/dist/types.js +1 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/buildContextualPrompt.js +26 -75
- package/dist/utils/buildContextualPrompt.js.map +1 -0
- package/dist/utils/changeLogPrompt.js +1 -0
- package/dist/utils/changeLogPrompt.js.map +1 -0
- package/dist/utils/checkModel.js +17 -92
- package/dist/utils/checkModel.js.map +1 -0
- package/dist/utils/commentMap.js +1 -0
- package/dist/utils/commentMap.js.map +1 -0
- package/dist/utils/compileSearchQuery.js +23 -9
- package/dist/utils/compileSearchQuery.js.map +1 -0
- package/dist/utils/consolePresentation.js +208 -0
- package/dist/utils/consolePresentation.js.map +1 -0
- package/dist/utils/contentUtils.js +17 -2
- package/dist/utils/contentUtils.js.map +1 -0
- package/dist/utils/debugContext.js +1 -0
- package/dist/utils/debugContext.js.map +1 -0
- package/dist/utils/dialogState.js +201 -0
- package/dist/utils/dialogState.js.map +1 -0
- package/dist/utils/editor.js +1 -0
- package/dist/utils/editor.js.map +1 -0
- package/dist/utils/executionEvidence.js +50 -0
- package/dist/utils/executionEvidence.js.map +1 -0
- package/dist/utils/extractFileReferences.js +140 -6
- package/dist/utils/extractFileReferences.js.map +1 -0
- package/dist/utils/fileEvidenceCache.js +50 -0
- package/dist/utils/fileEvidenceCache.js.map +1 -0
- package/dist/utils/fileTree.js +1 -0
- package/dist/utils/fileTree.js.map +1 -0
- package/dist/utils/loadRelevantFolderCapsules.js +35 -5
- package/dist/utils/loadRelevantFolderCapsules.js.map +1 -0
- package/dist/utils/log.js +10 -1
- package/dist/utils/log.js.map +1 -0
- package/dist/utils/normalizeData.js +1 -0
- package/dist/utils/normalizeData.js.map +1 -0
- package/dist/utils/ollamaModelStatus.js +28 -0
- package/dist/utils/ollamaModelStatus.js.map +1 -0
- package/dist/utils/ollamaService.js +294 -0
- package/dist/utils/ollamaService.js.map +1 -0
- package/dist/utils/outputFormatter.js +1 -0
- package/dist/utils/outputFormatter.js.map +1 -0
- package/dist/utils/parseTaggedContent.js +1 -0
- package/dist/utils/parseTaggedContent.js.map +1 -0
- package/dist/utils/planActions.js +27 -46
- package/dist/utils/planActions.js.map +1 -0
- package/dist/utils/promptBuilderHelper.js +1 -0
- package/dist/utils/promptBuilderHelper.js.map +1 -0
- package/dist/utils/promptLogHelper.js +29 -13
- package/dist/utils/promptLogHelper.js.map +1 -0
- package/dist/utils/queryAnchors.js +71 -0
- package/dist/utils/queryAnchors.js.map +1 -0
- package/dist/utils/repoIdentity.js +82 -0
- package/dist/utils/repoIdentity.js.map +1 -0
- package/dist/utils/repoKey.js +1 -0
- package/dist/utils/repoKey.js.map +1 -0
- package/dist/utils/resolveTargetsToFiles.js +1 -0
- package/dist/utils/resolveTargetsToFiles.js.map +1 -0
- package/dist/utils/resumeContext.js +219 -0
- package/dist/utils/resumeContext.js.map +1 -0
- package/dist/utils/resumeState.js +310 -0
- package/dist/utils/resumeState.js.map +1 -0
- package/dist/utils/rollingPlan.js +118 -0
- package/dist/utils/rollingPlan.js.map +1 -0
- package/dist/utils/runQueryWithDaemonControl.js +11 -3
- package/dist/utils/runQueryWithDaemonControl.js.map +1 -0
- package/dist/utils/runtimeLogger.js +252 -0
- package/dist/utils/runtimeLogger.js.map +1 -0
- package/dist/utils/sanitizeQuery.js +1 -0
- package/dist/utils/sanitizeQuery.js.map +1 -0
- package/dist/utils/sharedUtils.js +1 -0
- package/dist/utils/sharedUtils.js.map +1 -0
- package/dist/utils/sleep.js +1 -0
- package/dist/utils/sleep.js.map +1 -0
- package/dist/utils/splitCodeIntoChunk.js +1 -0
- package/dist/utils/splitCodeIntoChunk.js.map +1 -0
- package/dist/utils/time.js +66 -0
- package/dist/utils/time.js.map +1 -0
- package/dist/utils/verifyFocusPreference.js +107 -0
- package/dist/utils/verifyFocusPreference.js.map +1 -0
- package/dist/utils/vscode.js +1 -0
- package/dist/utils/vscode.js.map +1 -0
- package/dist/workflow/workflowResolver.js +1 -0
- package/dist/workflow/workflowResolver.js.map +1 -0
- package/dist/workflow/workflowRunner.js +1 -0
- package/dist/workflow/workflowRunner.js.map +1 -0
- package/package.json +3 -3
- package/dist/agents/MainAgent.js +0 -1886
- package/dist/agents/contextReviewStep.js +0 -101
- package/dist/agents/finalPlanGenStep.js +0 -107
- package/dist/agents/structuralAnalysisStep.js +0 -46
- package/dist/agents/validationAnalysisStep.js +0 -87
- package/dist/pipeline/modules/chunkManagerModule.js +0 -24
- package/dist/pipeline/modules/cleanGeneratedTestsModule.js +0 -33
- package/dist/pipeline/modules/fileReaderModule.js +0 -72
- package/dist/pipeline/modules/gatherInfoModule.js +0 -181
- package/dist/pipeline/modules/generateTestsModule.js +0 -68
- package/dist/pipeline/modules/preserveCodeModule.js +0 -195
- package/dist/pipeline/modules/refactorModule.js +0 -40
- package/dist/pipeline/modules/repairTestsModule.js +0 -48
- package/dist/pipeline/modules/runTestsModule.js +0 -37
package/dist/commands/AskCmd.js
CHANGED
|
@@ -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 {
|
|
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
|
-
|
|
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
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
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
|
-
|
|
39
|
-
|
|
41
|
+
ui.message(formatIndexRootMessage(getIndexDir()));
|
|
42
|
+
ui.message(formatAgentLaunchMessage(runtime));
|
|
40
43
|
spinner.start();
|
|
41
|
-
const
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
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
|
-
|
|
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"]}
|
|
@@ -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"]}
|
|
@@ -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
|
-
|
|
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(
|
|
88
|
+
export async function suggestCommitMessage() {
|
|
81
89
|
const { rl, isTemporary } = getRl();
|
|
82
90
|
try {
|
|
83
|
-
|
|
84
|
-
if (!
|
|
85
|
-
|
|
86
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
48
|
-
|
|
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
|
-
|
|
54
|
-
|
|
55
|
-
|
|
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
|
-
|
|
91
|
+
if (shouldPrint) {
|
|
92
|
+
console.log(`⚠️ Daemon already running with PID ${pid}.`);
|
|
93
|
+
}
|
|
62
94
|
return;
|
|
63
95
|
}
|
|
64
96
|
else {
|
|
65
|
-
|
|
66
|
-
|
|
97
|
+
if (shouldPrint) {
|
|
98
|
+
console.log(`🧹 Removing stale PID file...`);
|
|
99
|
+
}
|
|
100
|
+
clearDaemonRuntimeState({ expectedPid: pid });
|
|
67
101
|
}
|
|
68
102
|
}
|
|
69
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,KAAK,EAAgB,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACvE,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnD,kBAAkB;AAElB,MAAM,UAAU,eAAe;IAC7B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3C,MAAM,GAAG,GAAG,QAAQ,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;IAC5D,OAAO,gBAAgB,CAAC,GAAG,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,GAAW;IAC1C,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,OAAe;IACjC,EAAE,CAAC,aAAa,CAAC,gBAAgB,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;AACpE,CAAC;AAED,SAAS,gBAAgB;IACvB,IAAI,EAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACpC,EAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC;IAClC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,OAAkC;IACxE,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IAC1C,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,QAAQ,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;QAC5D,MAAM,eAAe,GAAG,OAAO,EAAE,WAAW,IAAI,IAAI,IAAI,GAAG,KAAK,OAAO,CAAC,WAAW,CAAC;QACpF,IAAI,eAAe,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;YAC9C,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YACxB,UAAU,GAAG,IAAI,CAAC;QACpB,CAAC;IACH,CAAC;IAED,IAAI,UAAU,EAAE,CAAC;QACf,gBAAgB,EAAE,CAAC;IACrB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,EAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC;QACpC,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,gBAAgB,EAAE,MAAM,CAAC;QAC3C,CAAC,CAAC,IAAI,CAAC;AACX,CAAC;AAED,mBAAmB;AACnB,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,UAA6C,EAAE;IAC/E,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,QAAQ,CAAC;IAC5C,MAAM,WAAW,GAAG,OAAO,KAAK,QAAQ,CAAC;IACzC,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;IAC5B,MAAM,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC;IAClC,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,kEAAkE,CAAC,CAAC;QAClF,CAAC;QACD,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;IAClC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,mEAAmE,UAAU,IAAI,CAAC,CAAC;YAC/F,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;QAChD,CAAC;QACD,OAAO;IACT,CAAC;IAED,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;IACnC,IAAI,UAAU,IAAI,UAAU,KAAK,UAAU,EAAE,CAAC;QAC5C,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,qCAAqC,UAAU,EAAE,CAAC,CAAC;YAC/D,OAAO,CAAC,GAAG,CAAC,2BAA2B,UAAU,EAAE,CAAC,CAAC;YACrD,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;QAC7D,CAAC;QACD,OAAO;IACT,CAAC;IAED,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,QAAQ,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;QAC5D,IAAI,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1B,IAAI,WAAW,EAAE,CAAC;gBAChB,OAAO,CAAC,GAAG,CAAC,uCAAuC,GAAG,GAAG,CAAC,CAAC;YAC7D,CAAC;YACD,OAAO;QACT,CAAC;aAAM,CAAC;YACN,IAAI,WAAW,EAAE,CAAC;gBAChB,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;YAC/C,CAAC;YACD,uBAAuB,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAED,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,gCAAgC,UAAU,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC3C,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,2BAA2B,CAAC,CAAC;IAErE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE1D,MAAM,GAAG,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IACvC,MAAM,GAAG,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAEvC,MAAM,KAAK,GAAiB,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,UAAU,CAAC,EAAE;QAChE,QAAQ,EAAE,IAAI;QACd,KAAK,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,CAAC;QAC3B,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,eAAe,EAAE,MAAM,EAAE;KACjD,CAAC,CAAC;IAEH,KAAK,CAAC,KAAK,EAAE,CAAC;IAEd,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9C,UAAU,CAAC,UAAU,CAAC,CAAC;IACvB,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,yBAAyB,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC;IACrD,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;QACtC,OAAO;IACT,CAAC;IACD,MAAM,GAAG,GAAG,QAAQ,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;IAC5D,IAAI,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,2BAA2B,GAAG,MAAM,CAAC,CAAC;QAClD,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACpB,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,iBAAiB,GAAG,GAAG,CAAC,CAAC;IACvC,CAAC;IACD,uBAAuB,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC;IAC9C,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;IACnC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;QACtC,IAAI,UAAU;YAAE,OAAO,CAAC,GAAG,CAAC,sBAAsB,UAAU,GAAG,CAAC,CAAC;QACjE,OAAO;IACT,CAAC;IAED,MAAM,GAAG,GAAG,QAAQ,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;IAC5D,IAAI,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,0BAA0B,GAAG,GAAG,CAAC,CAAC;QAC9C,IAAI,UAAU;YAAE,OAAO,CAAC,GAAG,CAAC,cAAc,UAAU,EAAE,CAAC,CAAC;IAC1D,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,sBAAsB,GAAG,UAAU,CAAC,CAAC;IACnD,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;IACvC,MAAM,UAAU,EAAE,CAAC;IACnB,MAAM,WAAW,EAAE,CAAC;AACtB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,gBAAgB,EAAE,CAAC;IACnB,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,QAAgB,EAAE;IAC/C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;QAChC,OAAO;IACT,CAAC;IACD,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAClD,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1D,OAAO,CAAC,GAAG,CAAC,2BAA2B,KAAK,eAAe,CAAC,CAAC;IAC7D,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACpB,CAAC","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"]}
|
|
@@ -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"]}
|