scai 0.1.178 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +162 -267
- 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
|
@@ -1,3 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resets one repo database and immediately rebuilds its local index queue.
|
|
3
|
+
*
|
|
4
|
+
* Why this file exists:
|
|
5
|
+
* - destructive DB recovery should stay separate from normal setup
|
|
6
|
+
* - reset and reindex belong together in one explicit recovery command
|
|
7
|
+
* - daemon cleanup should happen before DB files are removed
|
|
8
|
+
*/
|
|
1
9
|
import fs from 'fs';
|
|
2
10
|
import path from 'path';
|
|
3
11
|
import lockfile from 'proper-lockfile';
|
|
@@ -5,6 +13,9 @@ import readline from 'readline';
|
|
|
5
13
|
import { backupScaiFolder } from '../db/backup.js';
|
|
6
14
|
import { getDbPathForRepo, getDbForRepo } from '../db/client.js';
|
|
7
15
|
import chalk from 'chalk';
|
|
16
|
+
import { Config } from '../config.js';
|
|
17
|
+
import { getLockedRepo, isDaemonRunning, stopDaemon } from './DaemonCmd.js';
|
|
18
|
+
import { runReindexCommand } from '../setup/reindexOwner.js';
|
|
8
19
|
export async function resetDatabase() {
|
|
9
20
|
const dbPath = getDbPathForRepo();
|
|
10
21
|
console.log(`⚠️ You are about to delete the database at: ${dbPath}`);
|
|
@@ -24,6 +35,10 @@ export async function resetDatabase() {
|
|
|
24
35
|
}
|
|
25
36
|
console.log('🔁 Backing up existing .scai folder...');
|
|
26
37
|
await backupScaiFolder();
|
|
38
|
+
const activeRepo = Config.getRaw().activeRepo;
|
|
39
|
+
if (activeRepo && isDaemonRunning() && getLockedRepo() === activeRepo) {
|
|
40
|
+
await stopDaemon();
|
|
41
|
+
}
|
|
27
42
|
// Close the DB connection
|
|
28
43
|
try {
|
|
29
44
|
const db = getDbForRepo();
|
|
@@ -74,5 +89,7 @@ export async function resetDatabase() {
|
|
|
74
89
|
console.warn('⚠️ Failed to remove lock directory:', err instanceof Error ? err.message : err);
|
|
75
90
|
}
|
|
76
91
|
}
|
|
77
|
-
console.log(
|
|
92
|
+
console.log(chalk.yellow('🔄 Rebuilding local index state...'));
|
|
93
|
+
await runReindexCommand();
|
|
78
94
|
}
|
|
95
|
+
//# sourceMappingURL=ResetDbCmd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ResetDbCmd.js","sourceRoot":"","sources":["../../src/commands/ResetDbCmd.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Resets one repo database and immediately rebuilds its local index queue.\n *\n * Why this file exists:\n * - destructive DB recovery should stay separate from normal setup\n * - reset and reindex belong together in one explicit recovery command\n * - daemon cleanup should happen before DB files are removed\n */\nimport fs from 'fs';\nimport path from 'path';\nimport lockfile from 'proper-lockfile';\nimport readline from 'readline';\nimport { backupScaiFolder } from '../db/backup.js';\nimport { getDbPathForRepo, getDbForRepo } from '../db/client.js';\nimport chalk from 'chalk';\nimport { Config } from '../config.js';\nimport { getLockedRepo, isDaemonRunning, stopDaemon } from './DaemonCmd.js';\nimport { runReindexCommand } from '../setup/reindexOwner.js';\n\nexport async function resetDatabase() {\n const dbPath = getDbPathForRepo();\n console.log(`⚠️ You are about to delete the database at: ${dbPath}`);\r\n\r\n const rl = readline.createInterface({\r\n input: process.stdin,\r\n output: process.stdout,\r\n });\r\n\r\n const confirm = await new Promise((resolve) => {\r\n rl.question('Are you sure you want to proceed? (y/N): ', (answer) => {\r\n rl.close();\r\n resolve(answer.trim().toLowerCase() === 'y');\r\n });\r\n });\r\n\r\n if (!confirm) {\r\n console.log('❌ Reset aborted. Database was not deleted.');\r\n return;\r\n }\r\n\n console.log('🔁 Backing up existing .scai folder...');\n await backupScaiFolder();\n\n const activeRepo = Config.getRaw().activeRepo;\n if (activeRepo && isDaemonRunning() && getLockedRepo() === activeRepo) {\n await stopDaemon();\n }\n\n // Close the DB connection\n try {\n const db = getDbForRepo();\r\n db.close();\r\n console.log('🔒 Closed SQLite database connection.');\r\n } catch (err) {\r\n console.warn('⚠️ Could not close database:', err instanceof Error ? err.message : err);\r\n }\r\n\r\n // Release lockfile if present\r\n try {\r\n const releaseLock = await lockfile.unlock(dbPath).catch(() => null);\r\n if (releaseLock) {\r\n console.log('🔓 Released database lock.');\r\n }\r\n } catch (err) {\r\n console.warn('⚠️ Failed to release database lock:', err instanceof Error ? err.message : err);\r\n }\r\n\r\n // Delete DB and related files\r\n const dbDir = path.dirname(dbPath);\r\n const dbBase = path.basename(dbPath);\r\n const dbPrefix = dbBase.replace(/\\.sqlite$/, '');\r\n\r\n const filesToDelete = [\r\n `${dbPath}`,\r\n path.join(dbDir, `${dbPrefix}.sqlite-wal`),\r\n path.join(dbDir, `${dbPrefix}.sqlite-shm`),\r\n ];\r\n const lockDir = `${dbPath}.lock`;\r\n\r\n for (const file of filesToDelete) {\r\n if (fs.existsSync(file)) {\r\n try {\r\n fs.unlinkSync(file);\r\n console.log(`🧹 Deleted ${path.basename(file)}`);\r\n } catch (err) {\r\n console.error(`❌ Failed to delete ${file}:`, err instanceof Error ? err.message : err);\r\n }\r\n }\r\n }\r\n\r\n // Clean up lock directory\r\n if (fs.existsSync(lockDir)) {\r\n try {\r\n fs.rmSync(lockDir, { recursive: true, force: true });\r\n console.log('🧹 Removed leftover lock directory.');\r\n } catch (err) {\r\n console.warn('⚠️ Failed to remove lock directory:', err instanceof Error ? err.message : err);\r\n }\n }\n\n console.log(chalk.yellow('🔄 Rebuilding local index state...'));\n await runReindexCommand();\n\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReviewCmd.js","sourceRoot":"","sources":["../../src/commands/ReviewCmd.ts"],"names":[],"mappings":"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","sourcesContent":["import readline from 'readline';\r\nimport { fetchOpenPullRequests, getGitHubUsername, submitReview } from '../github/github.js';\r\nimport { getRepoDetails } from '../github/repo.js';\r\nimport { DiffChunk, DiffHunk, ModuleIO, PullRequest, PullRequestWithDiff } from '../types.js';\r\nimport { ensureGitHubAuth } from '../github/auth.js';\r\nimport { reviewModule } from '../pipeline/modules/reviewModule.js';\r\nimport chalk from 'chalk';\r\nimport fs from 'fs';\r\nimport os from 'os';\r\nimport path from 'path';\r\nimport { spawnSync } from 'child_process';\r\nimport columnify from 'columnify';\r\nimport { Spinner } from '../lib/spinner.js';\r\nimport { openDiffInVSCode } from '../utils/vscode.js';\r\n\r\n// --- Helper functions ---\r\n\r\nfunction truncate(str: string, length: number): string {\r\n return str.length > length ? str.slice(0, length - 3) + '...' : str;\r\n}\r\n\r\n// --- Fetch PRs with review requests ---\r\nexport async function getPullRequestsForReview(\r\n token: string,\r\n owner: string,\r\n repo: string,\r\n username: string,\r\n branch: string = 'main',\r\n filterForUser: boolean = true\r\n): Promise<PullRequestWithDiff[]> {\r\n const spinner = new Spinner('Fetching pull requests and diffs...');\r\n spinner.start();\r\n\r\n const filtered: PullRequestWithDiff[] = [];\r\n const failedPRs: PullRequest[] = [];\r\n\r\n try {\r\n const prs = await fetchOpenPullRequests(token, owner, repo);\r\n\r\n for (const pr of prs) {\r\n const shouldInclude =\r\n !pr.draft &&\r\n !pr.merged_at &&\r\n (!filterForUser || pr.requested_reviewers?.some((r) => r.login === username));\r\n\r\n if (!shouldInclude) continue;\r\n\r\n try {\r\n const prNumber = pr.number;\r\n\r\n const prRes = await fetch(`https://api.github.com/repos/${owner}/${repo}/pulls/${prNumber}`, {\r\n headers: {\r\n Authorization: `token ${token}`,\r\n Accept: 'application/vnd.github.v3+json',\r\n },\r\n });\r\n\r\n if (!prRes.ok) throw new Error(`Failed to fetch full PR #${prNumber}`);\r\n const fullPR = await prRes.json();\r\n pr.body = fullPR.body ?? '';\r\n\r\n const diffRes = await fetch(`https://api.github.com/repos/${owner}/${repo}/pulls/${prNumber}.diff`, {\r\n headers: {\r\n Authorization: `token ${token}`,\r\n Accept: 'application/vnd.github.v3.diff',\r\n },\r\n });\r\n\r\n if (!diffRes.ok) throw new Error(`Failed to fetch diff for PR #${prNumber}`);\r\n const diff = await diffRes.text();\r\n\r\n filtered.push({ pr, diff });\r\n } catch (err: any) {\r\n console.warn(`⚠️ Skipping PR #${pr.number}: ${err.message}`);\r\n failedPRs.push(pr);\r\n }\r\n }\r\n\r\n if (filtered.length === 0) {\r\n const msg = filterForUser\r\n ? `No open pull requests found for review by '${username}'.`\r\n : `No open pull requests found.`;\r\n spinner.succeed(msg);\r\n } else {\r\n spinner.succeed(`Fetched ${filtered.length} PR(s) with diffs.`);\r\n }\r\n\r\n if (failedPRs.length > 0) {\r\n const failedList = failedPRs.map((pr) => `#${pr.number}`).join(', ');\r\n console.warn(`⚠️ Skipped ${failedPRs.length} PR(s): ${failedList}`);\r\n }\r\n\r\n return filtered;\r\n } catch (err: any) {\r\n spinner.fail(`Error fetching pull requests: ${err.message}`);\r\n return [];\r\n }\r\n}\r\n\r\n// --- Prompt user to select PR ---\r\nfunction askUserToPickPR(prs: PullRequest[]): Promise<number | null> {\r\n return new Promise((resolve) => {\r\n if (prs.length === 0) {\r\n console.log('⚠️ No pull requests with review requested.');\r\n return resolve(null);\r\n }\r\n\r\n const rows = prs.map((pr, i) => ({\r\n '#': i + 1,\r\n ID: `#${pr.number}`,\r\n Title: chalk.gray(truncate(pr.title, 50)),\r\n Author: chalk.magentaBright(pr.user || '—'),\r\n Created: pr.created_at?.split('T')[0] || '',\r\n 'Requested Reviewers': pr.requested_reviewers?.length\r\n ? pr.requested_reviewers.join(', ')\r\n : chalk.gray('—'),\r\n 'Actual Reviewers': pr.reviewers?.length\r\n ? chalk.cyan(pr.reviewers.join(', '))\r\n : chalk.gray('—'),\r\n Reviews:\r\n pr.review_status === 'Approved'\r\n ? chalk.green('Approved')\r\n : pr.review_status === 'Changes Requested'\r\n ? chalk.red('Changes Requested')\r\n : chalk.gray('—'),\r\n }));\r\n\r\n console.log(chalk.blue('\\n📦 Open Pull Requests:'));\r\n console.log(\r\n columnify(rows, {\r\n columnSplitter: ' ',\r\n headingTransform: (h) => chalk.cyan(h.toUpperCase()),\r\n config: {\r\n '#': { maxWidth: 4 },\r\n Title: { maxWidth: 50 },\r\n 'Requested Reviewers': { maxWidth: 30 },\r\n 'Actual Reviewers': { maxWidth: 30 },\r\n Reviews: { maxWidth: 20 },\r\n },\r\n })\r\n );\r\n\r\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\r\n\r\n rl.question(`\\n👉 Choose a PR to review [1-${prs.length}]: `, (answer) => {\r\n rl.close();\r\n const index = parseInt(answer, 10);\r\n if (!isNaN(index) && index >= 1 && index <= prs.length) {\r\n resolve(index - 1);\r\n } else {\r\n console.log('⚠️ Invalid selection.');\r\n resolve(null);\r\n }\r\n });\r\n });\r\n}\r\n\r\n\r\n// Prompt for review method\r\nfunction askReviewMethod(): Promise<'whole' | 'chunk'> {\r\n return new Promise((resolve) => {\r\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\r\n\r\n console.log(chalk.bold(\"\\n🔍 Choose review method:\\n\"));\r\n console.log('1) Review whole PR at once');\r\n console.log('2) Review chunk by chunk\\n');\r\n\r\n rl.question(`👉 Choose an option [1-2]: `, (answer) => {\r\n rl.close();\r\n resolve(answer === '2' ? 'chunk' : 'whole');\r\n });\r\n });\r\n}\r\n\r\n// Prompt for review approval\r\nfunction askReviewApproval(): Promise<'approve' | 'reject' | 'edit' | 'custom' | 'cancel'> {\r\n return new Promise((resolve) => {\r\n console.log('\\n---');\r\n console.log('1) ✅ Approve');\r\n console.log('2) ❌ Reject');\r\n console.log('3) ✍️ Edit');\r\n console.log('4) ⌨️ Write your own review');\r\n console.log('5) 🚫 Cancel');\r\n\r\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\r\n\r\n rl.question(`\\n👉 Choose an option [1-5]: `, (answer) => {\r\n rl.close();\r\n if (answer === '1') resolve('approve');\r\n else if (answer === '2') resolve('reject');\r\n else if (answer === '3') resolve('edit');\r\n else if (answer === '4') resolve('custom');\r\n else resolve('cancel');\r\n });\r\n });\r\n}\r\n\r\n// Prompt for custom review\r\nfunction promptCustomReview(): Promise<string> {\r\n return new Promise((resolve) => {\r\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\r\n rl.question('\\n📝 Enter your custom review:\\n> ', (input) => {\r\n rl.close();\r\n resolve(input.trim());\r\n });\r\n });\r\n}\r\n\r\n// Prompt for editing review\r\nexport async function promptEditReview(suggestedReview: string): Promise<string> {\r\n const tmpFilePath = path.join(os.tmpdir(), 'scai-review.txt');\r\n fs.writeFileSync(tmpFilePath, `# Edit your review below.\\n# Lines starting with '#' will be ignored.\\n\\n${suggestedReview}`);\r\n\r\n const editor = process.env.EDITOR || (process.platform === 'win32' ? 'notepad' : 'vi');\r\n spawnSync(editor, [tmpFilePath], { stdio: 'inherit' });\r\n\r\n const editedContent = fs.readFileSync(tmpFilePath, 'utf-8');\r\n return editedContent\r\n .split('\\n')\r\n .filter(line => !line.trim().startsWith('#'))\r\n .join('\\n')\r\n .trim() || suggestedReview;\r\n}\r\n\r\n// Split diff into file-based chunks\r\nfunction chunkDiff(diff: string, review_id: string): DiffChunk[] {\r\n const rawChunks = diff.split(/^diff --git /m).filter(Boolean);\r\n\r\n return rawChunks.map(chunk => {\r\n const fullChunk = 'diff --git ' + chunk;\r\n const filePathMatch = fullChunk.match(/^diff --git a\\/(.+?) b\\//);\r\n const filePath = filePathMatch ? filePathMatch[1] : 'unknown';\r\n\r\n const hunks: DiffHunk[] = [];\r\n let currentHunk: DiffHunk | null = null;\r\n\r\n // This counts diff lines for *this file only* (context/+/- lines after first @@)\r\n let positionCounter = 0;\r\n\r\n const lines = fullChunk.split('\\n');\r\n\r\n lines.forEach(line => {\r\n const hunkHeaderMatch = line.match(/^@@ -(\\d+),?(\\d*) \\+(\\d+),?(\\d*) @@/);\r\n if (hunkHeaderMatch) {\r\n if (currentHunk) hunks.push(currentHunk);\r\n\r\n const oldStart = parseInt(hunkHeaderMatch[1], 10);\r\n const newStart = parseInt(hunkHeaderMatch[3], 10);\r\n const oldLines = parseInt(hunkHeaderMatch[2] || '0', 10);\r\n const newLines = parseInt(hunkHeaderMatch[4] || '0', 10);\r\n\r\n currentHunk = {\r\n oldStart,\r\n newStart,\r\n oldLines,\r\n newLines,\r\n lines: [],\r\n };\r\n\r\n return; // don’t count @@ header line in positionCounter\r\n }\r\n\r\n if (currentHunk) {\r\n // Each line after @@ counts towards the diff position\r\n positionCounter++;\r\n\r\n let lineType: 'add' | 'del' | 'context' = 'context';\r\n if (line.startsWith('+')) lineType = 'add';\r\n if (line.startsWith('-')) lineType = 'del';\r\n\r\n currentHunk.lines.push({\r\n line,\r\n type: lineType,\r\n lineNumberOld: lineType === 'del' ? currentHunk.oldStart++ : undefined,\r\n lineNumberNew: lineType === 'add' ? currentHunk.newStart++ : undefined,\r\n position: positionCounter, // <-- key for GitHub inline API\r\n review_id,\r\n });\r\n }\r\n });\r\n\r\n if (currentHunk) hunks.push(currentHunk);\r\n\r\n return {\r\n filePath,\r\n content: fullChunk,\r\n hunks,\r\n review_id,\r\n };\r\n });\r\n}\r\n\r\n// Color lines in diff\r\nfunction colorDiffLine(line: string): string {\r\n if (line.startsWith('+')) return chalk.green(line);\r\n if (line.startsWith('-')) return chalk.red(line);\r\n if (line.startsWith('@@')) return chalk.yellow(line);\r\n return line;\r\n}\r\n\r\nfunction parseAISuggestions(aiOutput: string): string[] {\r\n return aiOutput\r\n .split(/\\n\\d+\\.\\s/) // Split on \"1. \", \"2. \", \"3. \"\r\n .map(s => s.trim())\r\n .filter(Boolean)\r\n .map(s => s.replace(/^💬\\s*/, ''));\r\n}\r\n\r\nasync function promptAIReviewSuggestions(\r\n aiOutput: string,\r\n chunkContent: string\r\n): Promise<string | \"cancel\" | \"skip\" | null> {\r\n\r\n // Strip first line if it's a summary like \"Here are 4 suggestions:\"\r\n const lines = aiOutput.split('\\n');\r\n if (lines.length > 3 && /^here (are|is).*:?\\s*$/i.test(lines[0])) {\r\n aiOutput = lines.slice(1).join('\\n').trim();\r\n }\r\n\r\n let suggestions = parseAISuggestions(aiOutput);\r\n let selected: string | null = null;\r\n\r\n while (!selected) {\r\n const colorFuncs = [\r\n chalk.cyan,\r\n chalk.green,\r\n chalk.yellow,\r\n chalk.magenta,\r\n chalk.blue,\r\n chalk.red\r\n ];\r\n\r\n const rows = suggestions.map((s, i) => ({\r\n No: String(i + 1).padStart(2),\r\n Suggestion: colorFuncs[i % colorFuncs.length](s) // cycle through colors\r\n }));\r\n\r\n const rendered = columnify(rows, {\r\n columns: ['No', 'Suggestion'],\r\n showHeaders: false,\r\n columnSplitter: ' ',\r\n config: {\r\n No: {\r\n align: 'right',\r\n dataTransform: (val: string) => chalk.cyan.bold(`${val}.`)\r\n },\r\n Suggestion: {\r\n maxWidth: 80,\r\n dataTransform: (val: string) => chalk.white(val)\r\n }\r\n }\r\n });\r\n\r\n console.log('\\n' + chalk.yellow(chalk.bold('--- Review Suggestions ---')) + '\\n');\r\n console.log(rendered.replace(/\\n/g, '\\n\\n'));\r\n console.log();\r\n\r\n console.log(chalk.gray('Select an option above or:'));\r\n console.log(chalk.cyan(' r)') + ' Regenerate suggestions');\r\n console.log(chalk.cyan(' c)') + ' Write custom review');\r\n console.log(chalk.cyan(' s)') + ' Skip this chunk');\r\n console.log(chalk.cyan(' q)') + ' Cancel review');\r\n\r\n const range = `1-${suggestions.length}`;\r\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\r\n const answer: string = await new Promise(resolve =>\r\n rl.question(chalk.bold(`\\n👉 Choose [${range},r,c,s,q]: `), resolve)\r\n );\r\n rl.close();\r\n\r\n const trimmed = answer.trim().toLowerCase();\r\n\r\n if (['1', '2', '3'].includes(trimmed)) {\r\n const idx = parseInt(trimmed, 10) - 1;\r\n selected = suggestions[idx];\r\n\r\n const rlEdit = readline.createInterface({ input: process.stdin, output: process.stdout });\r\n const editAnswer: string = await new Promise(resolve =>\r\n rlEdit.question('✍️ Edit this suggestion before submitting? [y/N]: ', resolve)\r\n );\r\n rlEdit.close();\r\n\r\n if (editAnswer.trim().toLowerCase() === 'y') {\r\n selected = await promptEditReview(selected);\r\n }\r\n\r\n } else if (trimmed === 'r') {\r\n console.log(chalk.yellow('\\nRegenerating suggestions...\\n'));\r\n\r\n const ioInput: ModuleIO = {\r\n query: 'regenerate_chunk_review',\r\n content: chunkContent\r\n };\r\n\r\n const newSuggestion: ModuleIO = await reviewModule.run(ioInput);\r\n\r\n const newOutput = typeof newSuggestion.data === 'string'\r\n ? newSuggestion.data\r\n : newSuggestion.content?.toString() || aiOutput;\r\n\r\n suggestions = parseAISuggestions(newOutput);\r\n\r\n } else if (trimmed === 'c') {\r\n selected = await promptCustomReview();\r\n\r\n } else if (trimmed === 's' || trimmed === '' || trimmed === ' ') {\r\n return \"skip\";\r\n\r\n } else if (trimmed === 'q') {\r\n console.log(chalk.red('\\nReview cancelled.\\n'));\r\n return \"cancel\";\r\n\r\n } else {\r\n console.log(chalk.red('\\n⚠️ Invalid input. Try again.\\n'));\r\n }\r\n }\r\n\r\n console.log(chalk.green('\\n✅ Selected suggestion:\\n'), selected, '\\n');\r\n const action = await askReviewApproval();\r\n\r\n if (action === 'approve') return selected;\r\n if (action === 'reject') return selected;\r\n if (action === 'edit') return await promptEditReview(selected);\r\n if (action === 'custom') return await promptCustomReview();\r\n if (action === 'cancel') {\r\n console.log(chalk.yellow('Review cancelled.\\n'));\r\n return \"cancel\";\r\n }\r\n\r\n return null;\r\n}\r\n\r\nexport async function reviewChunk(\r\n chunk: { filePath: string, content: string },\r\n chunkIndex: number,\r\n totalChunks: number\r\n): Promise<{ choice: string, summary: string }> {\r\n console.log(chalk.gray('\\n' + '━'.repeat(60)));\r\n console.log(`📄 ${chalk.bold('File')}: ${chalk.cyan(chunk.filePath)}`);\r\n console.log(`🔢 ${chalk.bold('Chunk')}: ${chunkIndex + 1} of ${totalChunks}`);\r\n\r\n // Build colored diff\r\n const lines = chunk.content.split('\\n');\r\n const coloredDiff = lines.map(colorDiffLine).join('\\n');\r\n\r\n // 1️⃣ Run the AI review using ModuleIO\r\n const ioInput: ModuleIO = {\r\n query: 'review_chunk',\r\n content: {\r\n chunkContent: chunk.content,\r\n filepath: chunk.filePath\r\n }\r\n };\r\n\r\n const suggestion: ModuleIO = await reviewModule.run(ioInput);\r\n const aiOutput = typeof suggestion.data === 'string'\r\n ? suggestion.data.trim()\r\n : suggestion.content?.toString() || '1. AI review summary not available.';\r\n\r\n\r\n // 2️⃣ Show the diff\r\n console.log(`\\n${chalk.bold('--- Diff ---')}\\n`);\r\n console.log(coloredDiff);\r\n\r\n // 3️⃣ Prompt user to pick/skip/cancel\r\n const selectedReview = await promptAIReviewSuggestions(aiOutput, chunk.content);\r\n\r\n if (selectedReview === \"cancel\") {\r\n return { choice: \"cancel\", summary: \"\" };\r\n }\r\n\r\n if (selectedReview === \"skip\") {\r\n await waitForSpaceOrQ();\r\n return { choice: \"skip\", summary: \"\" };\r\n }\r\n\r\n return { choice: selectedReview ?? \"\", summary: selectedReview ?? \"\" };\r\n}\r\n\r\nfunction waitForSpaceOrQ(): Promise<void> {\r\n return new Promise(resolve => {\r\n process.stdin.setRawMode(true);\r\n process.stdin.resume();\r\n process.stdout.write('\\n⏭️ (Press [space] to skip, [q] to quit, or any other key to show menu)\\n');\r\n\r\n function onKeyPress(chunk: Buffer) {\r\n const key = chunk.toString();\r\n if (key === ' ' || key === 'q' || key === 'Q') {\r\n process.stdin.setRawMode(false);\r\n process.stdin.pause();\r\n process.stdin.removeListener('data', onKeyPress);\r\n resolve();\r\n }\r\n }\r\n\r\n process.stdin.on('data', onKeyPress);\r\n });\r\n}\r\n\r\nexport async function promptChunkReviewMenu(): Promise<'approve' | 'reject' | 'edit' | 'custom' | 'skip'> {\r\n return new Promise((resolve) => {\r\n console.log('\\nReview options for this chunk:');\r\n console.log(' 1) 💬 Approve and post AI review as comment');\r\n console.log(' 2) ✍️ Edit the review before posting');\r\n console.log(' 3) ⌨️ Write a custom comment');\r\n console.log(' 4) ❌ Mark this chunk as needing changes');\r\n console.log(' 5) ⏭️ Approve this chunk without commenting');\r\n console.log(chalk.gray(' (Press [space] to skip and approve chunk, [q] to quit review, or any other key to show menu)\\n'));\r\n\r\n // Fallback to menu input if key was not space/q\r\n function askWithReadline() {\r\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\r\n\r\n rl.question('👉 Choose [1–5]: ', (answer) => {\r\n rl.close();\r\n\r\n switch (answer.trim()) {\r\n case '1': return resolve('approve');\r\n case '2': return resolve('edit');\r\n case '3': return resolve('custom');\r\n case '4': return resolve('reject');\r\n case '5': return resolve('skip');\r\n default:\r\n console.log('⚠️ Invalid option. Skipping chunk.');\r\n return resolve('skip');\r\n }\r\n });\r\n }\r\n\r\n // Raw key listener for quick actions\r\n function onKeyPress(key: Buffer) {\r\n const keyStr = key.toString().toLowerCase();\r\n process.stdin.setRawMode(false);\r\n process.stdin.pause();\r\n\r\n if (keyStr === ' ') {\r\n return resolve('skip');\r\n } else if (keyStr === 'q') {\r\n console.log('\\n👋 Exiting review.');\r\n process.exit(0);\r\n } else {\r\n // flush any remaining input\r\n process.stdin.removeAllListeners('data');\r\n askWithReadline();\r\n }\r\n }\r\n\r\n // Prepare for keypress\r\n process.stdin.setRawMode(true);\r\n process.stdin.resume();\r\n process.stdin.once('data', onKeyPress);\r\n });\r\n}\r\n\r\n// Helper to ask if the user wants to open the diff in VSCode\r\nasync function askOpenInVSCode(): Promise<boolean> {\r\n return new Promise((resolve) => {\r\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\r\n rl.question(chalk.cyan('\\n💡 Open this PR diff in VS Code? [Y/n]: '), (answer) => {\r\n rl.close();\r\n resolve(answer.trim().toLowerCase() !== 'n');\r\n });\r\n });\r\n}\r\n\r\n// Main review command\r\nexport async function reviewPullRequestCmd(\r\n branch: string = \"main\",\r\n showAll: boolean = false\r\n): Promise<void> {\r\n try {\r\n const { owner, repo } = await getRepoDetails();\r\n const token = await ensureGitHubAuth();\r\n const username = await getGitHubUsername(token);\r\n\r\n const prsWithReviewRequested = await getPullRequestsForReview(\r\n token,\r\n owner,\r\n repo,\r\n username,\r\n branch,\r\n !showAll\r\n );\r\n if (prsWithReviewRequested.length === 0) return;\r\n\r\n const selectedIndex = await askUserToPickPR(\r\n prsWithReviewRequested.map((p) => p.pr)\r\n );\r\n if (selectedIndex === null) return;\r\n\r\n const { pr, diff } = prsWithReviewRequested[selectedIndex];\r\n\r\n if (pr.body) {\r\n console.log(\r\n chalk.magentaBright(\"\\n📝 PR Description:\\n\") + chalk.white(pr.body)\r\n );\r\n }\r\n\r\n // ✅ Ask user if they want to view diff in VS Code\r\n const openInVSCode = await askOpenInVSCode();\r\n if (openInVSCode) {\r\n console.log(chalk.gray(`\\n🧭 Opening PR #${pr.number} diff in VS Code...`));\r\n await openDiffInVSCode(`${pr.title || \"pull_request\"}.diff`, diff);\r\n }\r\n\r\n // === Continue AI Review ===\r\n const chunks = chunkDiff(diff, pr.number.toString());\r\n const reviewMethod = chunks.length > 1 ? await askReviewMethod() : \"chunk\";\r\n\r\n type ReviewComment = {\r\n path: string;\r\n body: string;\r\n position: number;\r\n };\r\n\r\n const reviewComments: ReviewComment[] = [];\r\n\r\n if (reviewMethod === \"whole\") {\r\n const ioInput: ModuleIO = {\r\n query: 'review_whole_pr',\r\n content: {\r\n diff,\r\n description: \"Whole PR Diff\"\r\n }\r\n };\r\n\r\n const result: ModuleIO = await reviewModule.run(ioInput);\r\n\r\n const rawOutput = typeof result.data === 'string'\r\n ? result.data\r\n : result.content?.toString() || '1. AI review summary not available.';\r\n\r\n console.log(chalk.yellowBright(\"Raw AI output:\\n\"), rawOutput);\r\n\r\n let suggestions = rawOutput.split('\\n').filter(Boolean); // or your old logic\r\n if (\r\n suggestions.length > 3 &&\r\n /here (are|is) \\d+ suggestions/i.test(suggestions[0])\r\n ) {\r\n suggestions = suggestions.slice(1);\r\n }\r\n\r\n const finalReviewChoice = await askReviewApproval();\r\n let reviewText = suggestions[0] || '';\r\n\r\n if (finalReviewChoice === \"approve\") {\r\n reviewText = \"PR approved\";\r\n await submitReview(pr.number, reviewText, \"APPROVE\");\r\n } else if (finalReviewChoice === \"reject\") {\r\n reviewText = \"Changes requested\";\r\n await submitReview(pr.number, reviewText, \"REQUEST_CHANGES\");\r\n } else if (finalReviewChoice === \"custom\") {\r\n reviewText = await promptCustomReview();\r\n await submitReview(pr.number, reviewText, \"COMMENT\");\r\n } else if (finalReviewChoice === \"edit\") {\r\n reviewText = await promptEditReview(reviewText);\r\n await submitReview(pr.number, reviewText, \"COMMENT\");\r\n }\r\n } else {\r\n console.log(chalk.cyan(`🔍 Total Chunks: ${chunks.length}`));\r\n let allApproved = true;\r\n\r\n for (let i = 0; i < chunks.length; i++) {\r\n const chunk = chunks[i];\r\n const { choice, summary } = await reviewChunk(chunk, i, chunks.length);\r\n\r\n if (choice === \"cancel\") {\r\n console.log(chalk.red(`🚫 Review cancelled at chunk ${i + 1}`));\r\n return;\r\n }\r\n\r\n if (choice === \"skip\") {\r\n console.log(chalk.gray(`⏭️ Skipped chunk ${i + 1}`));\r\n continue;\r\n }\r\n\r\n const firstLineWithPosition = chunk.hunks\r\n .flatMap((h) => h.lines)\r\n .find((line) => line.position !== undefined);\r\n\r\n if (!firstLineWithPosition) {\r\n console.warn(\r\n `⚠️ Could not find valid position for inline comment in chunk ${i + 1}. Skipping comment.`\r\n );\r\n continue;\r\n }\r\n\r\n let commentBody = summary;\r\n if (choice === \"custom\") {\r\n commentBody = await promptCustomReview();\r\n } else if (\r\n typeof choice === \"string\" &&\r\n ![\"approve\", \"reject\", \"custom\"].includes(choice)\r\n ) {\r\n commentBody = choice;\r\n }\r\n\r\n reviewComments.push({\r\n path: chunk.filePath,\r\n body: commentBody,\r\n position: firstLineWithPosition.position!,\r\n });\r\n\r\n if (choice === \"reject\") allApproved = false;\r\n }\r\n\r\n console.log(chalk.blueBright(\"\\n📝 Review Comments Preview:\"));\r\n reviewComments.forEach((comment, idx) => {\r\n console.log(`${idx + 1}. ${comment.path}:${comment.position} — ${comment.body}`);\r\n });\r\n\r\n const shouldApprove = allApproved;\r\n const hasInlineComments = reviewComments.length > 0;\r\n\r\n let reviewState: \"APPROVE\" | \"REQUEST_CHANGES\";\r\n let reviewBody: string;\r\n\r\n if (shouldApprove) {\r\n reviewState = \"APPROVE\";\r\n reviewBody = hasInlineComments\r\n ? \"PR approved after inline comments.\"\r\n : \"✅ Reviewed.\";\r\n } else {\r\n reviewState = \"REQUEST_CHANGES\";\r\n reviewBody = \"⛔ Requested changes based on review.\";\r\n }\r\n\r\n console.log(\r\n shouldApprove\r\n ? hasInlineComments\r\n ? chalk.green(\"📝 Submitting inline comments with approval.\")\r\n : chalk.green(\"✔️ All chunks approved. Submitting final PR approval.\")\r\n : chalk.red(\"❌ Not all chunks were approved. Changes requested.\")\r\n );\r\n\r\n await submitReview(pr.number, reviewBody, reviewState, reviewComments);\r\n }\r\n } catch (err: any) {\r\n console.error(\"❌ Error reviewing PR:\", err.message);\r\n }\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n"]}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Renders shared read-only status output for public CLI status commands.
|
|
3
|
+
*
|
|
4
|
+
* Why this file exists:
|
|
5
|
+
* - the status fact owner should stay free of console output
|
|
6
|
+
* - top-level and index-scoped status commands should share one renderer path
|
|
7
|
+
* - CLI wiring should stay thin and direct
|
|
8
|
+
*/
|
|
9
|
+
import { collectStatusFacts, formatIndexStatusLines, formatStatusLines, } from "../status/statusOwner.js";
|
|
10
|
+
export async function showStatusCommand() {
|
|
11
|
+
const facts = await collectStatusFacts();
|
|
12
|
+
for (const line of formatStatusLines(facts)) {
|
|
13
|
+
console.log(line);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export async function showIndexStatusCommand() {
|
|
17
|
+
const facts = await collectStatusFacts();
|
|
18
|
+
for (const line of formatIndexStatusLines(facts)) {
|
|
19
|
+
console.log(line);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=StatusCmd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StatusCmd.js","sourceRoot":"","sources":["../../src/commands/StatusCmd.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EACL,kBAAkB,EAClB,sBAAsB,EACtB,iBAAiB,GAClB,MAAM,0BAA0B,CAAC;AAElC,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACrC,MAAM,KAAK,GAAG,MAAM,kBAAkB,EAAE,CAAC;IACzC,KAAK,MAAM,IAAI,IAAI,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB;IAC1C,MAAM,KAAK,GAAG,MAAM,kBAAkB,EAAE,CAAC;IACzC,KAAK,MAAM,IAAI,IAAI,sBAAsB,CAAC,KAAK,CAAC,EAAE,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC;AACH,CAAC","sourcesContent":["/**\n * Renders shared read-only status output for public CLI status commands.\n *\n * Why this file exists:\n * - the status fact owner should stay free of console output\n * - top-level and index-scoped status commands should share one renderer path\n * - CLI wiring should stay thin and direct\n */\nimport {\n collectStatusFacts,\n formatIndexStatusLines,\n formatStatusLines,\n} from \"../status/statusOwner.js\";\n\nexport async function showStatusCommand(): Promise<void> {\n const facts = await collectStatusFacts();\n for (const line of formatStatusLines(facts)) {\n console.log(line);\n }\n}\n\nexport async function showIndexStatusCommand(): Promise<void> {\n const facts = await collectStatusFacts();\n for (const line of formatIndexStatusLines(facts)) {\n console.log(line);\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StopDaemonCmd.js","sourceRoot":"","sources":["../../src/commands/StopDaemonCmd.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,kBAAkB,CAAC,CAAC;AAE7D,MAAM,CAAC,KAAK,UAAU,oBAAoB;IACxC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;QAClD,OAAO;IACT,CAAC;IAED,MAAM,GAAG,GAAG,QAAQ,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;IAC7D,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;QACrD,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QACxB,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,0BAA0B;QAC1B,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,IAAI,CAAC,kCAAkC,GAAG,4BAA4B,CAAC,CAAC;QAChF,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QACxB,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,mCAAmC;QACnC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAC7B,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,oBAAoB,GAAG,WAAW,CAAC,CAAC;IAClD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,mCAAmC,GAAG,GAAG,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACrG,CAAC;AACH,CAAC","sourcesContent":["import fs from 'fs';\r\nimport os from 'os';\r\nimport path from 'path';\r\n\r\nconst PID_PATH = path.join(os.homedir(), '.scai/daemon.pid');\r\n\r\nexport async function runStopDaemonCommand() {\r\n if (!fs.existsSync(PID_PATH)) {\r\n console.log('🛑 No daemon is currently running.');\r\n return;\r\n }\r\n\r\n const pid = parseInt(fs.readFileSync(PID_PATH, 'utf-8'), 10);\r\n if (isNaN(pid)) {\r\n console.error('⚠️ Invalid PID file. Removing it...');\r\n fs.unlinkSync(PID_PATH);\r\n return;\r\n }\r\n\r\n try {\r\n // Check if process exists\r\n process.kill(pid, 0);\r\n } catch {\r\n console.warn(`⚠️ No running process with PID ${pid}. Removing stale PID file.`);\r\n fs.unlinkSync(PID_PATH);\r\n return;\r\n }\r\n\r\n try {\r\n // Attempt to terminate the process\r\n process.kill(pid, 'SIGTERM');\r\n fs.unlinkSync(PID_PATH);\r\n console.log(`✅ Daemon process ${pid} stopped.`);\r\n } catch (err) {\r\n console.error(`❌ Failed to stop daemon process ${pid}:`, err instanceof Error ? err.message : err);\r\n }\r\n}\r\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SummaryCmd.js","sourceRoot":"","sources":["../../src/commands/SummaryCmd.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from 'fs/promises';\r\nimport path from 'path';\r\nimport readline from 'readline';\r\nimport { queryFiles } from '../db/fileIndex.js';\r\nimport { summaryModule } from '../pipeline/modules/summaryModule.js';\nimport { detectFileType } from '../fileRules/detectFileType.js';\nimport { compileSearchQuery } from '../utils/compileSearchQuery.js';\nimport { styleText } from '../utils/outputFormatter.js';\nimport { indexFile } from '../daemon/runIndexingBatch.js';\n\r\nexport async function summarizeFile(filepath?: string): Promise<void> {\r\n let content = '';\r\n let filePathResolved: string | undefined;\r\n\r\n // 📁 Resolve file path from index or local disk\n if (filepath) {\n const compiled = compileSearchQuery({ query: filepath, mode: \"fts\" });\n const matches = compiled.fts.expression ? queryFiles(compiled.fts.expression) : [];\n\r\n if (matches.length > 0) {\r\n const topMatch = matches[0];\r\n filePathResolved = path.resolve(process.cwd(), topMatch.path);\r\n console.log(`🔗 Matched file from index: ${path.relative(process.cwd(), filePathResolved)}`);\r\n } else {\r\n const localPath = path.resolve(process.cwd(), filepath);\r\n try {\r\n await fs.access(localPath);\r\n filePathResolved = localPath;\r\n console.log(`📁 Using local file: ${path.relative(process.cwd(), localPath)}`);\r\n } catch {\r\n console.error(`❌ Could not find or resolve file: \"${filepath}\"`);\r\n return;\r\n }\r\n }\r\n }\r\n\r\n // 📄 Load file content (from path or stdin)\n if (filePathResolved) {\n const compiled = compileSearchQuery({ query: filePathResolved, mode: \"fts\" });\n const matches = compiled.fts.expression ? queryFiles(compiled.fts.expression) : [];\n const match = matches.find(row => path.resolve(row.path) === filePathResolved);\r\n\r\n if (match?.summary) {\r\n console.log(`🧠 Cached summary for ${filepath}:\\n`);\r\n console.log(styleText(match.summary));\r\n return;\r\n }\r\n\r\n try {\r\n content = await fs.readFile(filePathResolved, 'utf-8');\r\n } catch (err: any) {\r\n console.error(`❌ Could not read file: ${filePathResolved}\\n${err.message}`);\r\n return;\r\n }\r\n } else if (!process.stdin.isTTY) {\r\n const rl = readline.createInterface({\r\n input: process.stdin,\r\n output: process.stdout,\r\n terminal: false,\r\n });\r\n for await (const line of rl) {\r\n content += line + '\\n';\r\n }\r\n } else {\r\n console.error('❌ No file provided and no piped input.\\n👉 Usage: scai summ <file> or cat file | scai summ');\r\n return;\r\n }\r\n\r\n // 🧠 Generate summary and save\r\n if (content.trim()) {\r\n console.log('🧪 Generating summary...\\n');\r\n\r\n const response = await summaryModule.run({\r\n query: `Summarize file: ${filepath ?? 'stdin'}`,\r\n content,\r\n });\r\n\r\n const summary = (response.data as { summary?: string })?.summary;\r\n\r\n if (!summary) {\r\n console.warn('⚠️ No summary generated.');\r\n return;\r\n }\r\n\r\n console.log(styleText(summary));\r\n\r\n if (filePathResolved) {\r\n const fileType = detectFileType(filePathResolved);\r\n indexFile(filePathResolved, summary, fileType);\r\n console.log('💾 Summary saved to local database.');\r\n }\r\n } else {\r\n console.error('❌ No content provided to summarize.');\r\n }\r\n}\r\n"]}
|
|
@@ -1,4 +1,11 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Owns repo activation commands for configured multi-repo CLI flows.
|
|
3
|
+
*
|
|
4
|
+
* Why this file exists:
|
|
5
|
+
* - multi-repo flows still need explicit switching even though `scai setup` is the main first-run path
|
|
6
|
+
* - repo selection should stay out of setup and ask runtime code
|
|
7
|
+
* - switching behavior should stay separate from read-only status rendering
|
|
8
|
+
*/
|
|
2
9
|
import readline from 'readline';
|
|
3
10
|
import { Config, writeConfig } from '../config.js';
|
|
4
11
|
import { getRepoKeyForPath } from '../utils/contentUtils.js';
|
|
@@ -61,17 +68,4 @@ export async function runInteractiveSwitch() {
|
|
|
61
68
|
runSwitchCommand(keys[index]);
|
|
62
69
|
});
|
|
63
70
|
}
|
|
64
|
-
|
|
65
|
-
const config = Config.getRaw();
|
|
66
|
-
const activeRepo = config.activeRepo;
|
|
67
|
-
if (!activeRepo) {
|
|
68
|
-
console.log(chalk.red('🔴 No active repository'));
|
|
69
|
-
console.log(' Run `scai index list` to select one');
|
|
70
|
-
return;
|
|
71
|
-
}
|
|
72
|
-
const repo = config.repos?.[activeRepo];
|
|
73
|
-
const dir = repo?.indexDir ?? '(unknown path)';
|
|
74
|
-
console.log(chalk.green('🟢 Active repository'));
|
|
75
|
-
console.log(` ↳ ${activeRepo}`);
|
|
76
|
-
console.log(` ↳ ${dir}`);
|
|
77
|
-
}
|
|
71
|
+
//# sourceMappingURL=SwitchCmd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SwitchCmd.js","sourceRoot":"","sources":["../../src/commands/SwitchCmd.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Owns repo activation commands for configured multi-repo CLI flows.\n *\n * Why this file exists:\n * - multi-repo flows still need explicit switching even though `scai setup` is the main first-run path\n * - repo selection should stay out of setup and ask runtime code\n * - switching behavior should stay separate from read-only status rendering\n */\nimport readline from 'readline';\nimport { Config, writeConfig } from '../config.js';\nimport { getRepoKeyForPath } from '../utils/contentUtils.js';\nimport chalk from 'chalk';\n\r\nexport function runSwitchCommand(inputPathOrKey: string) {\r\n const config = Config.getRaw();\r\n\r\n // Direct key match\r\n if (config.repos[inputPathOrKey]) {\r\n config.activeRepo = inputPathOrKey;\r\n Config.setGitHubToken(config.repos[inputPathOrKey].githubToken ?? '');\r\n console.log(`✅ Switched active repo to key: ${inputPathOrKey}`);\r\n } else {\r\n // Path match only if key match failed\r\n const repoKey = getRepoKeyForPath(inputPathOrKey, config);\r\n if (!repoKey) {\r\n console.error(`❌ No repo found matching path or key: \"${inputPathOrKey}\"`);\r\n process.exit(1);\r\n }\r\n\r\n config.activeRepo = repoKey;\r\n Config.setGitHubToken(config.repos[repoKey]?.githubToken ?? '');\r\n console.log(`✅ Switched active repo to path match: ${repoKey}`);\r\n }\r\n\r\n // Persist change\r\n writeConfig(config);\r\n}\r\n\r\nexport async function runInteractiveSwitch() {\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 // Otherwise, show interactive selection\r\n console.log('\\n📁 Available Repositories:\\n');\r\n console.log('\\n📁 Available Repositories:\\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 console.log(chalk.yellow(`\\n0) Cancel`));\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 activate: ', (answer) => {\r\n rl.close();\r\n const choice = parseInt(answer.trim(), 10);\r\n\r\n if (choice === 0) {\r\n console.log('ℹ️ Cancelled.');\r\n return;\r\n }\r\n\r\n const index = choice - 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 runSwitchCommand(keys[index]);\r\n });\r\n\r\n}\r\n\r\n"]}
|
|
@@ -1,22 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shows task state for the local task runtime tables.
|
|
3
|
+
*
|
|
4
|
+
* Why this file exists:
|
|
5
|
+
* - task browsing and resume helpers live behind one CLI surface
|
|
6
|
+
* - `task show` should expose latest task state, persisted steps, and per-query turn history
|
|
7
|
+
* - current-context helpers should stay thin and read from the new-agent persistence owner
|
|
8
|
+
*/
|
|
1
9
|
import chalk from "chalk";
|
|
2
10
|
import { getDbForRepo } from "../db/client.js";
|
|
11
|
+
import { initSchema } from "../db/schema.js";
|
|
3
12
|
import { getRl } from "./ReadlineSingleton.js";
|
|
13
|
+
import { runQueryWithDaemonControl } from "../utils/runQueryWithDaemonControl.js";
|
|
14
|
+
import { getAgentTaskDetails, getCurrentAgentTaskDetails, listAgentSteps, listAgentTasks, listAgentTurns, } from "../agent/persistence/index.js";
|
|
15
|
+
function oneLineTruncate(input, max = 80) {
|
|
16
|
+
const singleLine = input.replace(/\s+/g, " ").trim();
|
|
17
|
+
if (singleLine.length <= max)
|
|
18
|
+
return singleLine;
|
|
19
|
+
return singleLine.slice(0, max - 1) + "…";
|
|
20
|
+
}
|
|
21
|
+
export function getCurrentContextDetails() {
|
|
22
|
+
initSchema();
|
|
23
|
+
return getCurrentAgentTaskDetails(getDbForRepo());
|
|
24
|
+
}
|
|
25
|
+
export function buildCurrentContextPromptLabel() {
|
|
26
|
+
const current = getCurrentContextDetails();
|
|
27
|
+
if (!current) {
|
|
28
|
+
return "Write your query (no task):";
|
|
29
|
+
}
|
|
30
|
+
if (current.dialogState?.status === "awaiting-user") {
|
|
31
|
+
return `Reply to task ${current.id} dialog:`;
|
|
32
|
+
}
|
|
33
|
+
const step = current.currentStepId ? ` | step ${oneLineTruncate(current.currentStepId, 48)}` : "";
|
|
34
|
+
return `Write your query (task ${current.id}${step}):`;
|
|
35
|
+
}
|
|
4
36
|
export async function runTasksCommand() {
|
|
37
|
+
initSchema();
|
|
5
38
|
const { rl, isTemporary } = getRl();
|
|
6
39
|
try {
|
|
7
|
-
const
|
|
8
|
-
const tasks = db.prepare(`
|
|
9
|
-
SELECT id, status, initial_query, created_at
|
|
10
|
-
FROM tasks
|
|
11
|
-
ORDER BY id DESC
|
|
12
|
-
`).all();
|
|
40
|
+
const tasks = listAgentTasks(getDbForRepo());
|
|
13
41
|
if (!tasks.length) {
|
|
14
42
|
console.log(chalk.dim("No tasks found."));
|
|
15
43
|
return;
|
|
16
44
|
}
|
|
17
45
|
console.log(chalk.bold("\nTasks:\n"));
|
|
18
46
|
for (const t of tasks) {
|
|
19
|
-
console.log(`${chalk.cyan(`[${t.id}]`)} ${chalk.yellow(t.status.padEnd(9))} ${oneLineTruncate(t.
|
|
47
|
+
console.log(`${chalk.cyan(`[${t.id}]`)} ${chalk.yellow(t.status.padEnd(9))} ${oneLineTruncate(t.initialQuery)}`);
|
|
20
48
|
}
|
|
21
49
|
await new Promise((resolve) => {
|
|
22
50
|
rl.question("\nSelect task id (q to quit): ", answer => {
|
|
@@ -48,8 +76,9 @@ export async function runTasksCommand() {
|
|
|
48
76
|
}
|
|
49
77
|
}
|
|
50
78
|
export function showTaskDetails(taskId) {
|
|
79
|
+
initSchema();
|
|
51
80
|
const db = getDbForRepo();
|
|
52
|
-
const task =
|
|
81
|
+
const task = getAgentTaskDetails(taskId, db);
|
|
53
82
|
if (!task) {
|
|
54
83
|
console.log(chalk.red(`Task ${taskId} not found.`));
|
|
55
84
|
return;
|
|
@@ -84,53 +113,41 @@ export function showTaskDetails(taskId) {
|
|
|
84
113
|
}
|
|
85
114
|
};
|
|
86
115
|
// Lifecycle
|
|
87
|
-
print("Initial query", task.
|
|
88
|
-
if (task.
|
|
116
|
+
print("Initial query", task.initialQuery);
|
|
117
|
+
if (task.finalAnswer) {
|
|
89
118
|
console.log(chalk.green.bold("\nFinal answer:\n"));
|
|
90
|
-
console.log(chalk.white(task.
|
|
119
|
+
console.log(chalk.white(task.finalAnswer));
|
|
91
120
|
console.log();
|
|
92
121
|
}
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
print("
|
|
102
|
-
}
|
|
103
|
-
catch {
|
|
104
|
-
print("Relevant files", "[invalid JSON]");
|
|
122
|
+
const dialogState = task.dialogState;
|
|
123
|
+
if (dialogState) {
|
|
124
|
+
console.log(chalk.blue.bold("\nDialog:\n"));
|
|
125
|
+
print("Dialog status", dialogState.status);
|
|
126
|
+
print("Dialog kind", dialogState.kind);
|
|
127
|
+
print("Dialog prompt", dialogState.prompt);
|
|
128
|
+
print("Dialog options", dialogState.options);
|
|
129
|
+
if (dialogState.response) {
|
|
130
|
+
print("Dialog response", dialogState.response);
|
|
105
131
|
}
|
|
106
132
|
}
|
|
107
|
-
if (task.
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
print("Missing files", "[invalid JSON]");
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
// Routing decision
|
|
116
|
-
if (task.routing_decision_json) {
|
|
117
|
-
try {
|
|
118
|
-
print("Routing decision", JSON.parse(task.routing_decision_json));
|
|
119
|
-
}
|
|
120
|
-
catch {
|
|
121
|
-
print("Routing decision", "[invalid JSON]");
|
|
122
|
-
}
|
|
133
|
+
if (task.latestFinalAnswerPacket) {
|
|
134
|
+
console.log(chalk.blue.bold("\nLatest grounded answer packet:\n"));
|
|
135
|
+
print("Must mention files", task.latestFinalAnswerPacket.mustMentionFiles);
|
|
136
|
+
print("Must mention symbols", task.latestFinalAnswerPacket.mustMentionSymbols);
|
|
137
|
+
print("Must mention facts", task.latestFinalAnswerPacket.mustMentionFacts);
|
|
123
138
|
}
|
|
124
139
|
// Bookkeeping
|
|
125
|
-
print("
|
|
126
|
-
print("
|
|
140
|
+
print("Repo root", task.repoRootPath);
|
|
141
|
+
print("Worktree path", task.worktreePath);
|
|
142
|
+
print("Worktree branch", task.worktreeBranch);
|
|
143
|
+
print("Worktree name", task.worktreeName);
|
|
144
|
+
print("Base branch", task.baseBranch);
|
|
145
|
+
print("Current step id", task.currentStepId);
|
|
146
|
+
print("Latest turn index", task.latestTurnIndex);
|
|
147
|
+
print("Created", task.createdAt);
|
|
148
|
+
print("Updated", task.updatedAt);
|
|
127
149
|
// ----------------- TASK STEPS -----------------
|
|
128
|
-
const steps = db
|
|
129
|
-
SELECT id, file_path, action, status, step_index, start_time, end_time, created_at, updated_at
|
|
130
|
-
FROM task_steps
|
|
131
|
-
WHERE task_id = ?
|
|
132
|
-
ORDER BY step_index ASC
|
|
133
|
-
`).all(taskId);
|
|
150
|
+
const steps = listAgentSteps(taskId, db);
|
|
134
151
|
if (steps.length === 0) {
|
|
135
152
|
console.log(chalk.dim("\nNo task steps recorded."));
|
|
136
153
|
}
|
|
@@ -139,18 +156,86 @@ export function showTaskDetails(taskId) {
|
|
|
139
156
|
steps.forEach(s => {
|
|
140
157
|
console.log(`${chalk.cyan(`[${s.id}]`)} ` +
|
|
141
158
|
`${chalk.yellow((s.status || "").padEnd(9))} ` +
|
|
142
|
-
`${s.
|
|
159
|
+
`${s.filePath}` +
|
|
143
160
|
(s.action ? ` → ${s.action}` : "") +
|
|
144
|
-
` (index=${s.
|
|
145
|
-
(s.start_time ? ` started=${s.start_time}` : "") +
|
|
146
|
-
(s.end_time ? ` ended=${s.end_time}` : ""));
|
|
161
|
+
` (index=${s.stepIndex ?? "-"})`);
|
|
147
162
|
});
|
|
148
163
|
}
|
|
164
|
+
const turns = listAgentTurns(taskId, db);
|
|
165
|
+
if (turns.length === 0) {
|
|
166
|
+
console.log(chalk.dim("\nNo turn history recorded."));
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
console.log(chalk.bold("\nTurns:\n"));
|
|
170
|
+
turns.forEach((turn) => {
|
|
171
|
+
console.log(`${chalk.cyan(`[${turn.turnIndex}]`)} ` +
|
|
172
|
+
`${chalk.yellow(turn.status.padEnd(9))} ` +
|
|
173
|
+
`${oneLineTruncate(turn.userQuery, 80)}`);
|
|
174
|
+
if (turn.finalAnswer) {
|
|
175
|
+
console.log(` answer: ${oneLineTruncate(turn.finalAnswer, 110)}`);
|
|
176
|
+
}
|
|
177
|
+
if (turn.finalAnswerPacket?.mustMentionFiles.length) {
|
|
178
|
+
console.log(` files: ${turn.finalAnswerPacket.mustMentionFiles.slice(0, 3).map((file) => oneLineTruncate(file, 60)).join(", ")}`);
|
|
179
|
+
}
|
|
180
|
+
if (turn.stopMessage) {
|
|
181
|
+
console.log(` stop: ${oneLineTruncate(turn.stopMessage, 110)}`);
|
|
182
|
+
}
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
export async function resumeTaskCommand(taskId, query) {
|
|
186
|
+
initSchema();
|
|
187
|
+
const task = getAgentTaskDetails(taskId, getDbForRepo());
|
|
188
|
+
if (!task) {
|
|
189
|
+
throw new Error(`Task ${taskId} not found.`);
|
|
190
|
+
}
|
|
191
|
+
return await runQueryWithDaemonControl((query ?? task.initialQuery).trim(), {
|
|
192
|
+
resumeTaskId: taskId,
|
|
193
|
+
bindAsCurrentTask: true,
|
|
194
|
+
});
|
|
149
195
|
}
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
196
|
+
export function showTaskCommand(taskId) {
|
|
197
|
+
showTaskDetails(taskId);
|
|
198
|
+
}
|
|
199
|
+
export function taskPathCommand(taskId) {
|
|
200
|
+
initSchema();
|
|
201
|
+
const task = getAgentTaskDetails(taskId, getDbForRepo());
|
|
202
|
+
if (!task) {
|
|
203
|
+
throw new Error(`Task ${taskId} not found.`);
|
|
204
|
+
}
|
|
205
|
+
console.log(task.worktreePath || task.repoRootPath || "");
|
|
206
|
+
}
|
|
207
|
+
export function showCurrentContextCommand() {
|
|
208
|
+
const current = getCurrentContextDetails();
|
|
209
|
+
if (!current) {
|
|
210
|
+
console.log(chalk.dim("No current context."));
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
console.log(chalk.bold("\nCurrent context:\n"));
|
|
214
|
+
console.log(chalk.yellow("Task:"), current.id);
|
|
215
|
+
console.log(chalk.yellow("Status:"), current.status);
|
|
216
|
+
console.log(chalk.yellow("Initial query:"), current.initialQuery);
|
|
217
|
+
if (current.currentStepId) {
|
|
218
|
+
console.log(chalk.yellow("Current step:"), current.currentStepId);
|
|
219
|
+
}
|
|
220
|
+
if (current.dialogState?.status === "awaiting-user") {
|
|
221
|
+
console.log(chalk.yellow("Dialog:"), current.dialogState.kind);
|
|
222
|
+
console.log(chalk.yellow("Prompt:"), current.dialogState.prompt);
|
|
223
|
+
if (current.dialogState.options.length > 0) {
|
|
224
|
+
console.log(chalk.yellow("Options:"), current.dialogState.options.join(", "));
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
if (current.worktreeName) {
|
|
228
|
+
console.log(chalk.yellow("Worktree name:"), current.worktreeName);
|
|
229
|
+
}
|
|
230
|
+
if (current.worktreePath) {
|
|
231
|
+
console.log(chalk.yellow("Worktree path:"), current.worktreePath);
|
|
232
|
+
}
|
|
233
|
+
if (current.worktreeBranch) {
|
|
234
|
+
console.log(chalk.yellow("Worktree branch:"), current.worktreeBranch);
|
|
235
|
+
}
|
|
236
|
+
if (current.baseBranch) {
|
|
237
|
+
console.log(chalk.yellow("Base branch:"), current.baseBranch);
|
|
238
|
+
}
|
|
239
|
+
console.log(chalk.yellow("Latest turn:"), current.latestTurnIndex);
|
|
156
240
|
}
|
|
241
|
+
//# sourceMappingURL=TasksCmd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TasksCmd.js","sourceRoot":"","sources":["../../src/commands/TasksCmd.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Shows task state for the local task runtime tables.\n *\n * Why this file exists:\n * - task browsing and resume helpers live behind one CLI surface\n * - `task show` should expose latest task state, persisted steps, and per-query turn history\n * - current-context helpers should stay thin and read from the new-agent persistence owner\n */\nimport chalk from \"chalk\";\nimport { getDbForRepo } from \"../db/client.js\";\nimport { initSchema } from \"../db/schema.js\";\nimport { getRl } from \"./ReadlineSingleton.js\";\nimport { runQueryWithDaemonControl } from \"../utils/runQueryWithDaemonControl.js\";\nimport {\n getAgentTaskDetails,\n getCurrentAgentTaskDetails,\n listAgentSteps,\n listAgentTasks,\n listAgentTurns,\n type AgentTaskDetails,\n} from \"../agent/persistence/index.js\";\nimport type { AgentMemory } from \"../agent/types.js\";\n\nfunction oneLineTruncate(input: string, max = 80): string {\n const singleLine = input.replace(/\\s+/g, \" \").trim();\n if (singleLine.length <= max) return singleLine;\n return singleLine.slice(0, max - 1) + \"…\";\n}\n\nexport function getCurrentContextDetails(): AgentTaskDetails | undefined {\n initSchema();\n return getCurrentAgentTaskDetails(getDbForRepo());\n}\n\nexport function buildCurrentContextPromptLabel(): string {\n const current = getCurrentContextDetails();\n if (!current) {\n return \"Write your query (no task):\";\n }\n\n if (current.dialogState?.status === \"awaiting-user\") {\n return `Reply to task ${current.id} dialog:`;\n }\n const step = current.currentStepId ? ` | step ${oneLineTruncate(current.currentStepId, 48)}` : \"\";\n return `Write your query (task ${current.id}${step}):`;\n}\n\nexport async function runTasksCommand() {\n initSchema();\n const { rl, isTemporary } = getRl();\n\n try {\n const tasks = listAgentTasks(getDbForRepo());\n\n if (!tasks.length) {\n console.log(chalk.dim(\"No tasks found.\"));\n return;\n }\n\n console.log(chalk.bold(\"\\nTasks:\\n\"));\n for (const t of tasks) {\n console.log(\n `${chalk.cyan(`[${t.id}]`)} ${chalk.yellow(t.status.padEnd(9))} ${oneLineTruncate(t.initialQuery)}`\n );\n }\n\n await new Promise<void>((resolve) => {\n rl.question(\"\\nSelect task id (q to quit): \", answer => {\n const trimmed = answer.trim();\n\n if (trimmed.toLowerCase() === \"q\") {\n resolve();\n return;\n }\n\n if (!trimmed) {\n console.log(chalk.red(\"Please enter a task id or 'q' to quit.\"));\n resolve();\n return;\n }\n\n const id = Number(trimmed);\n if (!Number.isInteger(id)) {\n console.log(chalk.red(\"Invalid task id.\"));\n resolve();\n return;\n }\n\n showTaskDetails(id);\n resolve();\n });\n });\n\n } finally {\n if (isTemporary) {\n rl.close();\n }\n }\n}\n\nexport function showTaskDetails(taskId: number) {\n initSchema();\n const db = getDbForRepo();\n const task = getAgentTaskDetails(taskId, db);\n\n if (!task) {\n console.log(chalk.red(`Task ${taskId} not found.`));\n return;\n }\n\n console.log(chalk.bold(`\\nTask ${task.id} — ${chalk.yellow(task.status)}\\n`));\n\n const print = (label: string, value?: unknown, indent = \" \") => {\n if (value == null) return;\n\n const isArray = Array.isArray(value);\n const isObject = typeof value === \"object\" && !isArray;\n\n if (typeof value === \"string\" && value.length < 80) {\n console.log(chalk.yellow(`${label}:`), value);\n } else if (isArray) {\n console.log(chalk.yellow(`${label}:`));\n const items = value as unknown[];\n const displayCount = Math.min(5, items.length);\n for (let i = 0; i < displayCount; i++) {\n console.log(`${indent}- ${oneLineTruncate(String(items[i]), 100)}`);\n }\n if (items.length > displayCount) {\n console.log(`${indent}… (+${items.length - displayCount} more)`);\n }\n } else if (isObject) {\n console.log(chalk.yellow(`${label}:`));\n console.log(indent + JSON.stringify(value, null, 2).replace(/\\n/g, \"\\n\" + indent));\n } else {\n console.log(chalk.yellow(`${label}:`));\n console.log(indent + String(value));\n }\n };\n\n // Lifecycle\n print(\"Initial query\", task.initialQuery);\n\n if (task.finalAnswer) {\n console.log(chalk.green.bold(\"\\nFinal answer:\\n\"));\n console.log(chalk.white(task.finalAnswer));\n console.log();\n }\n\n const dialogState = task.dialogState;\n if (dialogState) {\n console.log(chalk.blue.bold(\"\\nDialog:\\n\"));\n print(\"Dialog status\", dialogState.status);\n print(\"Dialog kind\", dialogState.kind);\n print(\"Dialog prompt\", dialogState.prompt);\n print(\"Dialog options\", dialogState.options);\n if (dialogState.response) {\n print(\"Dialog response\", dialogState.response);\n }\n }\n\n if (task.latestFinalAnswerPacket) {\n console.log(chalk.blue.bold(\"\\nLatest grounded answer packet:\\n\"));\n print(\"Must mention files\", task.latestFinalAnswerPacket.mustMentionFiles);\n print(\"Must mention symbols\", task.latestFinalAnswerPacket.mustMentionSymbols);\n print(\"Must mention facts\", task.latestFinalAnswerPacket.mustMentionFacts);\n }\n\n // Bookkeeping\n print(\"Repo root\", task.repoRootPath);\n print(\"Worktree path\", task.worktreePath);\n print(\"Worktree branch\", task.worktreeBranch);\n print(\"Worktree name\", task.worktreeName);\n print(\"Base branch\", task.baseBranch);\n print(\"Current step id\", task.currentStepId);\n print(\"Latest turn index\", task.latestTurnIndex);\n print(\"Created\", task.createdAt);\n print(\"Updated\", task.updatedAt);\n\n // ----------------- TASK STEPS -----------------\n const steps = listAgentSteps(taskId, db);\n\n if (steps.length === 0) {\n console.log(chalk.dim(\"\\nNo task steps recorded.\"));\n } else {\n console.log(chalk.bold(\"\\nTask Steps:\\n\"));\n steps.forEach(s => {\n console.log(\n `${chalk.cyan(`[${s.id}]`)} ` +\n `${chalk.yellow((s.status || \"\").padEnd(9))} ` +\n `${s.filePath}` +\n (s.action ? ` → ${s.action}` : \"\") +\n ` (index=${s.stepIndex ?? \"-\"})`\n );\n });\n }\n\n const turns = listAgentTurns(taskId, db);\n\n if (turns.length === 0) {\n console.log(chalk.dim(\"\\nNo turn history recorded.\"));\n return;\n }\n\n console.log(chalk.bold(\"\\nTurns:\\n\"));\n turns.forEach((turn) => {\n console.log(\n `${chalk.cyan(`[${turn.turnIndex}]`)} ` +\n `${chalk.yellow(turn.status.padEnd(9))} ` +\n `${oneLineTruncate(turn.userQuery, 80)}`\n );\n if (turn.finalAnswer) {\n console.log(` answer: ${oneLineTruncate(turn.finalAnswer, 110)}`);\n }\n if (turn.finalAnswerPacket?.mustMentionFiles.length) {\n console.log(` files: ${turn.finalAnswerPacket.mustMentionFiles.slice(0, 3).map((file) => oneLineTruncate(file, 60)).join(\", \")}`);\n }\n if (turn.stopMessage) {\n console.log(` stop: ${oneLineTruncate(turn.stopMessage, 110)}`);\n }\n });\n}\n\nexport async function resumeTaskCommand(taskId: number, query?: string): Promise<AgentMemory | undefined> {\n initSchema();\n const task = getAgentTaskDetails(taskId, getDbForRepo());\n\n if (!task) {\n throw new Error(`Task ${taskId} not found.`);\n }\n\n return await runQueryWithDaemonControl((query ?? task.initialQuery).trim(), {\n resumeTaskId: taskId,\n bindAsCurrentTask: true,\n }) as AgentMemory | undefined;\n}\n\nexport function showTaskCommand(taskId: number) {\n showTaskDetails(taskId);\n}\n\nexport function taskPathCommand(taskId: number) {\n initSchema();\n const task = getAgentTaskDetails(taskId, getDbForRepo());\n\n if (!task) {\n throw new Error(`Task ${taskId} not found.`);\n }\n\n console.log(task.worktreePath || task.repoRootPath || \"\");\n}\n\nexport function showCurrentContextCommand() {\n const current = getCurrentContextDetails();\n if (!current) {\n console.log(chalk.dim(\"No current context.\"));\n return;\n }\n\n console.log(chalk.bold(\"\\nCurrent context:\\n\"));\n console.log(chalk.yellow(\"Task:\"), current.id);\n console.log(chalk.yellow(\"Status:\"), current.status);\n console.log(chalk.yellow(\"Initial query:\"), current.initialQuery);\n if (current.currentStepId) {\n console.log(chalk.yellow(\"Current step:\"), current.currentStepId);\n }\n if (current.dialogState?.status === \"awaiting-user\") {\n console.log(chalk.yellow(\"Dialog:\"), current.dialogState.kind);\n console.log(chalk.yellow(\"Prompt:\"), current.dialogState.prompt);\n if (current.dialogState.options.length > 0) {\n console.log(chalk.yellow(\"Options:\"), current.dialogState.options.join(\", \"));\n }\n }\n if (current.worktreeName) {\n console.log(chalk.yellow(\"Worktree name:\"), current.worktreeName);\n }\n if (current.worktreePath) {\n console.log(chalk.yellow(\"Worktree path:\"), current.worktreePath);\n }\n if (current.worktreeBranch) {\n console.log(chalk.yellow(\"Worktree branch:\"), current.worktreeBranch);\n }\n if (current.baseBranch) {\n console.log(chalk.yellow(\"Base branch:\"), current.baseBranch);\n }\n console.log(chalk.yellow(\"Latest turn:\"), current.latestTurnIndex);\n}\n"]}
|