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
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Owns explicit first-run setup for one repository.
|
|
3
|
+
*
|
|
4
|
+
* Why this file exists:
|
|
5
|
+
* - `scai setup` should be the only default onboarding path
|
|
6
|
+
* - repo registration, DB readiness, and model bootstrap should stay in one owner
|
|
7
|
+
* - unrelated helpers should validate setup instead of silently creating it
|
|
8
|
+
*/
|
|
9
|
+
import fs from "fs";
|
|
10
|
+
import path from "path";
|
|
11
|
+
import { CONFIG_PATH, SCAI_REPOS } from "../constants.js";
|
|
12
|
+
import { getDbForRepo, getDbPathForRepo } from "../db/client.js";
|
|
13
|
+
import { initSchema } from "../db/schema.js";
|
|
14
|
+
import { bootstrap as bootstrapModels } from "../modelSetup.js";
|
|
15
|
+
import { readConfig, writeConfig } from "../config.js";
|
|
16
|
+
import { canonicalizeRepoPath, normalizePath } from "../utils/contentUtils.js";
|
|
17
|
+
import { getHashedRepoKey } from "../utils/repoKey.js";
|
|
18
|
+
import { resolveCanonicalRepoIdentity } from "../utils/repoIdentity.js";
|
|
19
|
+
import { runReindexCommand } from "./reindexOwner.js";
|
|
20
|
+
function buildSetupRequiredError() {
|
|
21
|
+
return new Error("❌ This repository is not set up yet.\n" +
|
|
22
|
+
"➡️ Run `scai setup` from the repository root.");
|
|
23
|
+
}
|
|
24
|
+
export function ensureConfigExists() {
|
|
25
|
+
if (!fs.existsSync(CONFIG_PATH)) {
|
|
26
|
+
writeConfig({});
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
function persistRegisteredRepo(repoKey, repoRootPath) {
|
|
30
|
+
const cfg = readConfig();
|
|
31
|
+
cfg.activeRepo = repoKey;
|
|
32
|
+
cfg.repos[repoKey] = {
|
|
33
|
+
...cfg.repos[repoKey],
|
|
34
|
+
indexDir: repoRootPath,
|
|
35
|
+
};
|
|
36
|
+
writeConfig(cfg);
|
|
37
|
+
}
|
|
38
|
+
export function registerRepoPath(targetPath = process.cwd()) {
|
|
39
|
+
ensureConfigExists();
|
|
40
|
+
const repoRootPath = canonicalizeRepoPath(resolveCanonicalRepoIdentity(targetPath).repoRootPath);
|
|
41
|
+
const repoKey = getHashedRepoKey(repoRootPath);
|
|
42
|
+
const cfg = readConfig();
|
|
43
|
+
const existingIndexDir = cfg.repos[repoKey]?.indexDir
|
|
44
|
+
? canonicalizeRepoPath(cfg.repos[repoKey].indexDir)
|
|
45
|
+
: undefined;
|
|
46
|
+
const alreadyRegistered = existingIndexDir === repoRootPath;
|
|
47
|
+
fs.mkdirSync(path.join(SCAI_REPOS, repoKey), { recursive: true });
|
|
48
|
+
persistRegisteredRepo(repoKey, repoRootPath);
|
|
49
|
+
return { repoKey, repoRootPath, alreadyRegistered };
|
|
50
|
+
}
|
|
51
|
+
export function ensureRegisteredRepoForCurrentDir() {
|
|
52
|
+
ensureConfigExists();
|
|
53
|
+
const cfg = readConfig();
|
|
54
|
+
const repoRootPath = canonicalizeRepoPath(resolveCanonicalRepoIdentity(process.cwd()).repoRootPath);
|
|
55
|
+
const repoKey = Object.entries(cfg.repos || {}).find(([, repoCfg]) => {
|
|
56
|
+
if (!repoCfg?.indexDir)
|
|
57
|
+
return false;
|
|
58
|
+
return canonicalizeRepoPath(repoCfg.indexDir) === repoRootPath;
|
|
59
|
+
})?.[0];
|
|
60
|
+
if (!repoKey) {
|
|
61
|
+
throw buildSetupRequiredError();
|
|
62
|
+
}
|
|
63
|
+
persistRegisteredRepo(repoKey, repoRootPath);
|
|
64
|
+
return { repoKey, repoRootPath, alreadyRegistered: true };
|
|
65
|
+
}
|
|
66
|
+
function getIndexQueueState() {
|
|
67
|
+
const db = getDbForRepo();
|
|
68
|
+
const totals = db
|
|
69
|
+
.prepare(`SELECT
|
|
70
|
+
COUNT(*) AS totalFiles,
|
|
71
|
+
SUM(CASE WHEN processing_status = 'unprocessed' THEN 1 ELSE 0 END) AS unprocessedFiles
|
|
72
|
+
FROM files`)
|
|
73
|
+
.get();
|
|
74
|
+
return {
|
|
75
|
+
totalFiles: Number(totals.totalFiles ?? 0),
|
|
76
|
+
unprocessedFiles: Number(totals.unprocessedFiles ?? 0),
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
export function ensureRepoDatabaseReady() {
|
|
80
|
+
const dbPath = getDbPathForRepo();
|
|
81
|
+
const existed = fs.existsSync(dbPath);
|
|
82
|
+
const db = getDbForRepo();
|
|
83
|
+
db.close();
|
|
84
|
+
initSchema();
|
|
85
|
+
return { dbPath, existed };
|
|
86
|
+
}
|
|
87
|
+
export async function runSetupCommand() {
|
|
88
|
+
const { repoRootPath } = registerRepoPath();
|
|
89
|
+
const { existed } = ensureRepoDatabaseReady();
|
|
90
|
+
await bootstrapModels();
|
|
91
|
+
const { totalFiles, unprocessedFiles } = getIndexQueueState();
|
|
92
|
+
const shouldQueueIndexing = !existed || totalFiles === 0 || unprocessedFiles > 0;
|
|
93
|
+
if (shouldQueueIndexing) {
|
|
94
|
+
await runReindexCommand();
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
console.log(`✅ Setup is ready for ${normalizePath(repoRootPath)}`);
|
|
98
|
+
console.log("📄 No reindex needed right now.");
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=setupOwner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setupOwner.js","sourceRoot":"","sources":["../../src/setup/setupOwner.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Owns explicit first-run setup for one repository.\n *\n * Why this file exists:\n * - `scai setup` should be the only default onboarding path\n * - repo registration, DB readiness, and model bootstrap should stay in one owner\n * - unrelated helpers should validate setup instead of silently creating it\n */\nimport fs from \"fs\";\nimport path from \"path\";\nimport { CONFIG_PATH, SCAI_REPOS } from \"../constants.js\";\nimport { getDbForRepo, getDbPathForRepo } from \"../db/client.js\";\nimport { initSchema } from \"../db/schema.js\";\nimport { bootstrap as bootstrapModels } from \"../modelSetup.js\";\nimport { readConfig, writeConfig } from \"../config.js\";\nimport { canonicalizeRepoPath, normalizePath } from \"../utils/contentUtils.js\";\nimport { getHashedRepoKey } from \"../utils/repoKey.js\";\nimport { resolveCanonicalRepoIdentity } from \"../utils/repoIdentity.js\";\nimport { runReindexCommand } from \"./reindexOwner.js\";\n\nexport type RegisteredRepoInfo = {\n repoKey: string;\n repoRootPath: string;\n alreadyRegistered: boolean;\n};\n\nfunction buildSetupRequiredError(): Error {\n return new Error(\n \"❌ This repository is not set up yet.\\n\" +\n \"➡️ Run `scai setup` from the repository root.\"\n );\n}\n\nexport function ensureConfigExists(): void {\n if (!fs.existsSync(CONFIG_PATH)) {\n writeConfig({});\n }\n}\n\nfunction persistRegisteredRepo(repoKey: string, repoRootPath: string): void {\n const cfg = readConfig();\n cfg.activeRepo = repoKey;\n cfg.repos[repoKey] = {\n ...cfg.repos[repoKey],\n indexDir: repoRootPath,\n };\n writeConfig(cfg);\n}\n\nexport function registerRepoPath(targetPath = process.cwd()): RegisteredRepoInfo {\n ensureConfigExists();\n const repoRootPath = canonicalizeRepoPath(resolveCanonicalRepoIdentity(targetPath).repoRootPath);\n const repoKey = getHashedRepoKey(repoRootPath);\n const cfg = readConfig();\n const existingIndexDir = cfg.repos[repoKey]?.indexDir\n ? canonicalizeRepoPath(cfg.repos[repoKey].indexDir!)\n : undefined;\n const alreadyRegistered = existingIndexDir === repoRootPath;\n\n fs.mkdirSync(path.join(SCAI_REPOS, repoKey), { recursive: true });\n persistRegisteredRepo(repoKey, repoRootPath);\n\n return { repoKey, repoRootPath, alreadyRegistered };\n}\n\nexport function ensureRegisteredRepoForCurrentDir(): RegisteredRepoInfo {\n ensureConfigExists();\n const cfg = readConfig();\n const repoRootPath = canonicalizeRepoPath(resolveCanonicalRepoIdentity(process.cwd()).repoRootPath);\n const repoKey = Object.entries(cfg.repos || {}).find(([, repoCfg]) => {\n if (!repoCfg?.indexDir) return false;\n return canonicalizeRepoPath(repoCfg.indexDir) === repoRootPath;\n })?.[0];\n\n if (!repoKey) {\n throw buildSetupRequiredError();\n }\n\n persistRegisteredRepo(repoKey, repoRootPath);\n return { repoKey, repoRootPath, alreadyRegistered: true };\n}\n\nfunction getIndexQueueState(): { totalFiles: number; unprocessedFiles: number } {\n const db = getDbForRepo();\n const totals = db\n .prepare(\n `SELECT\n COUNT(*) AS totalFiles,\n SUM(CASE WHEN processing_status = 'unprocessed' THEN 1 ELSE 0 END) AS unprocessedFiles\n FROM files`\n )\n .get() as { totalFiles?: number; unprocessedFiles?: number };\n\n return {\n totalFiles: Number(totals.totalFiles ?? 0),\n unprocessedFiles: Number(totals.unprocessedFiles ?? 0),\n };\n}\n\nexport function ensureRepoDatabaseReady(): { dbPath: string; existed: boolean } {\n const dbPath = getDbPathForRepo();\n const existed = fs.existsSync(dbPath);\n\n const db = getDbForRepo();\n db.close();\n initSchema();\n\n return { dbPath, existed };\n}\n\nexport async function runSetupCommand(): Promise<void> {\n const { repoRootPath } = registerRepoPath();\n const { existed } = ensureRepoDatabaseReady();\n await bootstrapModels();\n\n const { totalFiles, unprocessedFiles } = getIndexQueueState();\n const shouldQueueIndexing = !existed || totalFiles === 0 || unprocessedFiles > 0;\n\n if (shouldQueueIndexing) {\n await runReindexCommand();\n return;\n }\n\n console.log(`✅ Setup is ready for ${normalizePath(repoRootPath)}`);\n console.log(\"📄 No reindex needed right now.\");\n}\n"]}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
function parseNumericSelection(value) {
|
|
2
|
+
const match = value.match(/^(\d+)(?:\s*[:|-]\s*(.+))?$/);
|
|
3
|
+
if (!match) {
|
|
4
|
+
return null;
|
|
5
|
+
}
|
|
6
|
+
return {
|
|
7
|
+
index: Number.parseInt(match[1] ?? "", 10) - 1,
|
|
8
|
+
comment: match[2]?.trim() || undefined,
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Formats a numbered list for the shell.
|
|
13
|
+
* Example: ["/repo/a.ts", "/repo/b.ts"] -> ["1. /repo/a.ts", "2. /repo/b.ts"].
|
|
14
|
+
*/
|
|
15
|
+
export function formatDialogOptionsList(options) {
|
|
16
|
+
return options.map((option, index) => `${index + 1}. ${option}`);
|
|
17
|
+
}
|
|
18
|
+
export function buildDialogReplyHint(dialog) {
|
|
19
|
+
if (dialog.options.length === 0) {
|
|
20
|
+
return dialog.allowFreeText
|
|
21
|
+
? "Reply with the needed clarification."
|
|
22
|
+
: "Reply with one listed option.";
|
|
23
|
+
}
|
|
24
|
+
return dialog.allowFreeText
|
|
25
|
+
? `Choose [1-${dialog.options.length}] or paste a path.`
|
|
26
|
+
: `Choose [1-${dialog.options.length}].`;
|
|
27
|
+
}
|
|
28
|
+
export function buildDialogDisplayLines(dialog) {
|
|
29
|
+
const lines = [dialog.prompt];
|
|
30
|
+
if (dialog.options.length > 0) {
|
|
31
|
+
lines.push(...formatDialogOptionsList(dialog.options));
|
|
32
|
+
}
|
|
33
|
+
lines.push(buildDialogReplyHint(dialog));
|
|
34
|
+
return lines;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Resolves shell input routing without mixing slash-command rules into agent runtime code.
|
|
38
|
+
* Example: "/Users/me/file.ts" is a dialog reply while waiting, but a slash command otherwise.
|
|
39
|
+
*/
|
|
40
|
+
export function resolveShellInputKind(rawInput, dialog) {
|
|
41
|
+
const trimmed = rawInput.trim();
|
|
42
|
+
if (!trimmed) {
|
|
43
|
+
return "query";
|
|
44
|
+
}
|
|
45
|
+
if (dialog) {
|
|
46
|
+
return "dialog-reply";
|
|
47
|
+
}
|
|
48
|
+
if (trimmed.startsWith("!") || trimmed.startsWith("/")) {
|
|
49
|
+
return "shell-command";
|
|
50
|
+
}
|
|
51
|
+
return "query";
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Normalizes shell replies into dialog data while keeping the current agent input path string-based.
|
|
55
|
+
* Example: "2" -> { response: "/repo/b.ts", selectedOption: "/repo/b.ts" }.
|
|
56
|
+
*/
|
|
57
|
+
export function normalizeShellDialogReply(dialog, rawInput) {
|
|
58
|
+
const response = rawInput.trim();
|
|
59
|
+
if (!response) {
|
|
60
|
+
return { response: "" };
|
|
61
|
+
}
|
|
62
|
+
const numericSelection = parseNumericSelection(response);
|
|
63
|
+
if (numericSelection) {
|
|
64
|
+
const selectedOption = dialog.options[numericSelection.index];
|
|
65
|
+
if (selectedOption) {
|
|
66
|
+
return {
|
|
67
|
+
selectedOption,
|
|
68
|
+
comment: numericSelection.comment,
|
|
69
|
+
response: numericSelection.comment
|
|
70
|
+
? `${selectedOption}: ${numericSelection.comment}`
|
|
71
|
+
: selectedOption,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
const selectedOption = dialog.options.find((option) => option === response);
|
|
76
|
+
if (selectedOption) {
|
|
77
|
+
return { selectedOption, response: selectedOption };
|
|
78
|
+
}
|
|
79
|
+
return { response };
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=dialogUi.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dialogUi.js","sourceRoot":"","sources":["../../src/shell/dialogUi.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Owns shell-only rendering and reply parsing for waiting dialogs.\n *\n * Why this file exists:\n * - agent feedback should stay data-only and should not know terminal UI rules\n * - the current shell needs numbered choices and safe absolute-path replies\n * - later shells can swap rendering without changing agent policy or memory\n */\nimport type { AgentDialogState } from \"../agent/types.js\";\n\nexport interface ShellDialogReply {\n response: string;\n selectedOption?: string;\n comment?: string;\n}\n\nexport type ShellInputKind = \"dialog-reply\" | \"shell-command\" | \"query\";\n\nfunction parseNumericSelection(value: string): { index: number; comment?: string } | null {\n const match = value.match(/^(\\d+)(?:\\s*[:|-]\\s*(.+))?$/);\n if (!match) {\n return null;\n }\n return {\n index: Number.parseInt(match[1] ?? \"\", 10) - 1,\n comment: match[2]?.trim() || undefined,\n };\n}\n\n/**\n * Formats a numbered list for the shell.\n * Example: [\"/repo/a.ts\", \"/repo/b.ts\"] -> [\"1. /repo/a.ts\", \"2. /repo/b.ts\"].\n */\nexport function formatDialogOptionsList(options: string[]): string[] {\n return options.map((option, index) => `${index + 1}. ${option}`);\n}\n\nexport function buildDialogReplyHint(dialog: AgentDialogState): string {\n if (dialog.options.length === 0) {\n return dialog.allowFreeText\n ? \"Reply with the needed clarification.\"\n : \"Reply with one listed option.\";\n }\n return dialog.allowFreeText\n ? `Choose [1-${dialog.options.length}] or paste a path.`\n : `Choose [1-${dialog.options.length}].`;\n}\n\nexport function buildDialogDisplayLines(dialog: AgentDialogState): string[] {\n const lines = [dialog.prompt];\n if (dialog.options.length > 0) {\n lines.push(...formatDialogOptionsList(dialog.options));\n }\n lines.push(buildDialogReplyHint(dialog));\n return lines;\n}\n\n/**\n * Resolves shell input routing without mixing slash-command rules into agent runtime code.\n * Example: \"/Users/me/file.ts\" is a dialog reply while waiting, but a slash command otherwise.\n */\nexport function resolveShellInputKind(rawInput: string, dialog?: AgentDialogState): ShellInputKind {\n const trimmed = rawInput.trim();\n if (!trimmed) {\n return \"query\";\n }\n if (dialog) {\n return \"dialog-reply\";\n }\n if (trimmed.startsWith(\"!\") || trimmed.startsWith(\"/\")) {\n return \"shell-command\";\n }\n return \"query\";\n}\n\n/**\n * Normalizes shell replies into dialog data while keeping the current agent input path string-based.\n * Example: \"2\" -> { response: \"/repo/b.ts\", selectedOption: \"/repo/b.ts\" }.\n */\nexport function normalizeShellDialogReply(dialog: AgentDialogState, rawInput: string): ShellDialogReply {\n const response = rawInput.trim();\n if (!response) {\n return { response: \"\" };\n }\n\n const numericSelection = parseNumericSelection(response);\n if (numericSelection) {\n const selectedOption = dialog.options[numericSelection.index];\n if (selectedOption) {\n return {\n selectedOption,\n comment: numericSelection.comment,\n response: numericSelection.comment\n ? `${selectedOption}: ${numericSelection.comment}`\n : selectedOption,\n };\n }\n }\n\n const selectedOption = dialog.options.find((option) => option === response);\n if (selectedOption) {\n return { selectedOption, response: selectedOption };\n }\n\n return { response };\n}\n"]}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Keeps the shell's lightweight collaboration state in one place.
|
|
3
|
+
*
|
|
4
|
+
* Why this file exists:
|
|
5
|
+
* - the shell needs a tiny view of the current task, not the full runtime context
|
|
6
|
+
* - shell context should stay task-shaped and new-agent only
|
|
7
|
+
* - dev-only plan mode can enter a short-lived input mode before the query is known
|
|
8
|
+
* - `/resume` can reuse that same pattern for one follow-up query
|
|
9
|
+
* - `/cancel` should leave task binding alone while it exits those short-lived modes
|
|
10
|
+
* - plain shell queries start a fresh new-agent task unless the user resumes explicitly
|
|
11
|
+
* - active task dialogs should be visible in the prompt so follow-up replies feel natural
|
|
12
|
+
*/
|
|
13
|
+
import chalk from "chalk";
|
|
14
|
+
import { formatDialogOptionsList } from "./shell/dialogUi.js";
|
|
15
|
+
export function clearShellTaskBinding(state) {
|
|
16
|
+
state.task = undefined;
|
|
17
|
+
state.agentMemory = undefined;
|
|
18
|
+
}
|
|
19
|
+
export function setShellInputMode(state, inputMode) {
|
|
20
|
+
state.inputMode = inputMode;
|
|
21
|
+
}
|
|
22
|
+
export function clearShellInputMode(state) {
|
|
23
|
+
state.inputMode = "normal";
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Exits one temporary shell input mode without clearing the current task binding.
|
|
27
|
+
* Example: `resume-query` -> `normal`, while the shell still points at the same task.
|
|
28
|
+
*/
|
|
29
|
+
export function cancelShellInputMode(state) {
|
|
30
|
+
if (state.inputMode === "plan-query" || state.inputMode === "resume-query") {
|
|
31
|
+
const previousMode = state.inputMode;
|
|
32
|
+
state.inputMode = "normal";
|
|
33
|
+
return previousMode;
|
|
34
|
+
}
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
export function updateShellTaskBindingFromAgentMemory(state, memory) {
|
|
38
|
+
const task = memory?.task;
|
|
39
|
+
if (!task?.id)
|
|
40
|
+
return;
|
|
41
|
+
const currentStep = task.currentStepId
|
|
42
|
+
? memory?.steps.find((step) => step.id === task.currentStepId)
|
|
43
|
+
: undefined;
|
|
44
|
+
state.task = {
|
|
45
|
+
taskId: task.id,
|
|
46
|
+
status: task.status,
|
|
47
|
+
initialQuery: task.initialQuery,
|
|
48
|
+
currentStepPath: currentStep ? `${currentStep.action}` : task.currentStepId,
|
|
49
|
+
dialogState: task.dialogState,
|
|
50
|
+
};
|
|
51
|
+
state.agentMemory = memory;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Builds shell run options for the simple agent with explicit-only resume behavior.
|
|
55
|
+
* Example: plain shell queries start fresh, `/resume ...` reuses in-memory agent state.
|
|
56
|
+
*/
|
|
57
|
+
export function buildShellAgentRunOptions(state, explicitResume) {
|
|
58
|
+
const isAgentWaitingForReply = state.task?.status === "waiting" &&
|
|
59
|
+
state.task.dialogState?.status === "awaiting-user";
|
|
60
|
+
const shouldReuseMemory = !!state.task && (explicitResume || isAgentWaitingForReply);
|
|
61
|
+
const memory = shouldReuseMemory ? state.agentMemory : undefined;
|
|
62
|
+
const resumeTaskId = shouldReuseMemory && typeof state.task?.taskId === "number"
|
|
63
|
+
? state.task.taskId
|
|
64
|
+
: undefined;
|
|
65
|
+
return {
|
|
66
|
+
continueCurrentTask: !!memory || !!resumeTaskId,
|
|
67
|
+
bindAsCurrentTask: true,
|
|
68
|
+
...(typeof resumeTaskId === "number" ? { resumeTaskId } : {}),
|
|
69
|
+
...(memory ? { agentMemory: memory } : {}),
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
export function buildShellPromptLabel(state) {
|
|
73
|
+
if (state.inputMode === "plan-query") {
|
|
74
|
+
return "Plan mode: describe the task you want planned:";
|
|
75
|
+
}
|
|
76
|
+
const task = state.task;
|
|
77
|
+
if (state.inputMode === "resume-query") {
|
|
78
|
+
return task
|
|
79
|
+
? `Resume task ${task.taskId}:`
|
|
80
|
+
: "Resume the current task:";
|
|
81
|
+
}
|
|
82
|
+
if (!task) {
|
|
83
|
+
return "Write your query:";
|
|
84
|
+
}
|
|
85
|
+
if (task.dialogState?.status === "awaiting-user") {
|
|
86
|
+
return `Reply to agent task ${task.taskId}:`;
|
|
87
|
+
}
|
|
88
|
+
const step = task.currentStepPath ? ` | step ${task.currentStepPath}` : "";
|
|
89
|
+
return `Write your query (/resume to continue agent task ${task.taskId}${step}):`;
|
|
90
|
+
}
|
|
91
|
+
export function getAwaitingAgentDialog(state) {
|
|
92
|
+
if (state.task?.status !== "waiting") {
|
|
93
|
+
return undefined;
|
|
94
|
+
}
|
|
95
|
+
const dialogState = state.task.dialogState;
|
|
96
|
+
if (dialogState?.status === "awaiting-user" &&
|
|
97
|
+
"allowFreeText" in dialogState) {
|
|
98
|
+
return dialogState;
|
|
99
|
+
}
|
|
100
|
+
return undefined;
|
|
101
|
+
}
|
|
102
|
+
export function printShellCurrentContext(state) {
|
|
103
|
+
const task = state.task;
|
|
104
|
+
if (!task) {
|
|
105
|
+
console.log(chalk.dim("No current context."));
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
console.log(chalk.bold("\nCurrent context:\n"));
|
|
109
|
+
console.log(chalk.yellow("Task:"), task.taskId);
|
|
110
|
+
console.log(chalk.yellow("Status:"), task.status);
|
|
111
|
+
console.log(chalk.yellow("Initial query:"), task.initialQuery);
|
|
112
|
+
if (task.currentStepPath) {
|
|
113
|
+
console.log(chalk.yellow("Current step:"), task.currentStepPath);
|
|
114
|
+
}
|
|
115
|
+
if (task.dialogState?.status === "awaiting-user") {
|
|
116
|
+
console.log(chalk.yellow("Dialog:"), task.dialogState.kind);
|
|
117
|
+
console.log(chalk.yellow("Prompt:"), task.dialogState.prompt);
|
|
118
|
+
if (task.dialogState.options.length > 0) {
|
|
119
|
+
console.log(chalk.yellow("Options:"));
|
|
120
|
+
for (const optionLine of formatDialogOptionsList(task.dialogState.options)) {
|
|
121
|
+
console.log(optionLine);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=shellSession.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shellSession.js","sourceRoot":"","sources":["../src/shellSession.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Keeps the shell's lightweight collaboration state in one place.\n *\n * Why this file exists:\n * - the shell needs a tiny view of the current task, not the full runtime context\n * - shell context should stay task-shaped and new-agent only\n * - dev-only plan mode can enter a short-lived input mode before the query is known\n * - `/resume` can reuse that same pattern for one follow-up query\n * - `/cancel` should leave task binding alone while it exits those short-lived modes\n * - plain shell queries start a fresh new-agent task unless the user resumes explicitly\n * - active task dialogs should be visible in the prompt so follow-up replies feel natural\n */\nimport chalk from \"chalk\";\nimport type { AgentDialogState, AgentMemory } from \"./agent/types.js\";\nimport { formatDialogOptionsList } from \"./shell/dialogUi.js\";\n\nexport type ShellTaskBinding = {\n taskId: number | string;\n status: string;\n initialQuery: string;\n currentStepPath?: string;\n dialogState?: AgentDialogState;\n};\n\nexport type ShellInputMode = \"normal\" | \"plan-query\" | \"resume-query\";\n\nexport type ShellSessionState = {\n task?: ShellTaskBinding;\n agentMemory?: AgentMemory;\n inputMode?: ShellInputMode;\n};\n\nexport function clearShellTaskBinding(state: ShellSessionState): void {\n state.task = undefined;\n state.agentMemory = undefined;\n}\n\nexport function setShellInputMode(state: ShellSessionState, inputMode: ShellInputMode): void {\n state.inputMode = inputMode;\n}\n\nexport function clearShellInputMode(state: ShellSessionState): void {\n state.inputMode = \"normal\";\n}\n\n/**\n * Exits one temporary shell input mode without clearing the current task binding.\n * Example: `resume-query` -> `normal`, while the shell still points at the same task.\n */\nexport function cancelShellInputMode(state: ShellSessionState): ShellInputMode | undefined {\n if (state.inputMode === \"plan-query\" || state.inputMode === \"resume-query\") {\n const previousMode = state.inputMode;\n state.inputMode = \"normal\";\n return previousMode;\n }\n return undefined;\n}\n\nexport function updateShellTaskBindingFromAgentMemory(\n state: ShellSessionState,\n memory?: AgentMemory\n): void {\n const task = memory?.task;\n if (!task?.id) return;\n\n const currentStep = task.currentStepId\n ? memory?.steps.find((step) => step.id === task.currentStepId)\n : undefined;\n\n state.task = {\n taskId: task.id,\n status: task.status,\n initialQuery: task.initialQuery,\n currentStepPath: currentStep ? `${currentStep.action}` : task.currentStepId,\n dialogState: task.dialogState,\n };\n state.agentMemory = memory;\n}\n\n/**\n * Builds shell run options for the simple agent with explicit-only resume behavior.\n * Example: plain shell queries start fresh, `/resume ...` reuses in-memory agent state.\n */\nexport function buildShellAgentRunOptions(\n state: ShellSessionState,\n explicitResume: boolean\n): {\n continueCurrentTask: boolean;\n bindAsCurrentTask: boolean;\n agentMemory?: AgentMemory;\n resumeTaskId?: number;\n} {\n const isAgentWaitingForReply =\n state.task?.status === \"waiting\" &&\n state.task.dialogState?.status === \"awaiting-user\";\n const shouldReuseMemory = !!state.task && (explicitResume || isAgentWaitingForReply);\n const memory = shouldReuseMemory ? state.agentMemory : undefined;\n const resumeTaskId = shouldReuseMemory && typeof state.task?.taskId === \"number\"\n ? state.task.taskId\n : undefined;\n return {\n continueCurrentTask: !!memory || !!resumeTaskId,\n bindAsCurrentTask: true,\n ...(typeof resumeTaskId === \"number\" ? { resumeTaskId } : {}),\n ...(memory ? { agentMemory: memory } : {}),\n };\n}\n\nexport function buildShellPromptLabel(state: ShellSessionState): string {\n if (state.inputMode === \"plan-query\") {\n return \"Plan mode: describe the task you want planned:\";\n }\n\n const task = state.task;\n if (state.inputMode === \"resume-query\") {\n return task\n ? `Resume task ${task.taskId}:`\n : \"Resume the current task:\";\n }\n\n if (!task) {\n return \"Write your query:\";\n }\n\n if (task.dialogState?.status === \"awaiting-user\") {\n return `Reply to agent task ${task.taskId}:`;\n }\n\n const step = task.currentStepPath ? ` | step ${task.currentStepPath}` : \"\";\n return `Write your query (/resume to continue agent task ${task.taskId}${step}):`;\n}\n\nexport function getAwaitingAgentDialog(state: ShellSessionState): AgentDialogState | undefined {\n if (state.task?.status !== \"waiting\") {\n return undefined;\n }\n const dialogState = state.task.dialogState;\n if (\n dialogState?.status === \"awaiting-user\" &&\n \"allowFreeText\" in dialogState\n ) {\n return dialogState;\n }\n return undefined;\n}\n\nexport function printShellCurrentContext(state: ShellSessionState): void {\n const task = state.task;\n if (!task) {\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:\"), task.taskId);\n console.log(chalk.yellow(\"Status:\"), task.status);\n console.log(chalk.yellow(\"Initial query:\"), task.initialQuery);\n if (task.currentStepPath) {\n console.log(chalk.yellow(\"Current step:\"), task.currentStepPath);\n }\n if (task.dialogState?.status === \"awaiting-user\") {\n console.log(chalk.yellow(\"Dialog:\"), task.dialogState.kind);\n console.log(chalk.yellow(\"Prompt:\"), task.dialogState.prompt);\n if (task.dialogState.options.length > 0) {\n console.log(chalk.yellow(\"Options:\"));\n for (const optionLine of formatDialogOptionsList(task.dialogState.options)) {\n console.log(optionLine);\n }\n }\n }\n}\n"]}
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Collects read-only readiness facts for repo, DB, indexing, daemon, and model state.
|
|
3
|
+
*
|
|
4
|
+
* Why this file exists:
|
|
5
|
+
* - `scai status` needs one fact owner that does not repair setup
|
|
6
|
+
* - `scai index status` should share the same source of truth
|
|
7
|
+
* - formatting should stay separate from fact collection
|
|
8
|
+
*/
|
|
9
|
+
import fs from "fs";
|
|
10
|
+
import Database from "better-sqlite3";
|
|
11
|
+
import { readConfig } from "../config.js";
|
|
12
|
+
import { getDbPathForRepoKey } from "../db/client.js";
|
|
13
|
+
import { getLockedRepo, isDaemonRunning } from "../commands/DaemonCmd.js";
|
|
14
|
+
import { getRepoKeyForPath } from "../utils/contentUtils.js";
|
|
15
|
+
import { getOllamaStatusSnapshot } from "../utils/ollamaService.js";
|
|
16
|
+
import { isModelInstalled } from "../utils/ollamaModelStatus.js";
|
|
17
|
+
import { resolveCanonicalRepoIdentity } from "../utils/repoIdentity.js";
|
|
18
|
+
function readQueueCounts(dbPath) {
|
|
19
|
+
try {
|
|
20
|
+
const db = new Database(dbPath, { readonly: true, fileMustExist: true });
|
|
21
|
+
try {
|
|
22
|
+
const totals = db
|
|
23
|
+
.prepare(`SELECT
|
|
24
|
+
COUNT(*) AS totalFiles,
|
|
25
|
+
SUM(CASE WHEN processing_status = 'unprocessed' THEN 1 ELSE 0 END) AS queuedFiles
|
|
26
|
+
FROM files`)
|
|
27
|
+
.get();
|
|
28
|
+
return {
|
|
29
|
+
totalFiles: Number(totals.totalFiles ?? 0),
|
|
30
|
+
queuedFiles: Number(totals.queuedFiles ?? 0),
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
finally {
|
|
34
|
+
db.close();
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return undefined;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
function resolveEffectiveModelName(repoKey) {
|
|
42
|
+
const config = readConfig();
|
|
43
|
+
const repoModel = repoKey ? config.repos?.[repoKey]?.model : undefined;
|
|
44
|
+
return (repoModel ?? config.model);
|
|
45
|
+
}
|
|
46
|
+
function deriveOverallState(facts) {
|
|
47
|
+
if (!facts.repo.isRegistered) {
|
|
48
|
+
return {
|
|
49
|
+
overall: { state: "missing", summary: "setup missing" },
|
|
50
|
+
nextCommand: "scai setup",
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
if (facts.database.state === "missing") {
|
|
54
|
+
return {
|
|
55
|
+
overall: { state: "missing", summary: "database missing" },
|
|
56
|
+
nextCommand: "scai setup",
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
if (facts.model.state === "missing") {
|
|
60
|
+
return {
|
|
61
|
+
overall: { state: "missing", summary: "model missing" },
|
|
62
|
+
nextCommand: "scai setup",
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
if (!facts.model.health.ok) {
|
|
66
|
+
return {
|
|
67
|
+
overall: { state: "unknown", summary: "model runtime unavailable" },
|
|
68
|
+
nextCommand: "scai model status",
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
if (facts.indexing.state === "queued" && facts.daemon.state !== "running") {
|
|
72
|
+
return {
|
|
73
|
+
overall: { state: "queued", summary: "indexing queued" },
|
|
74
|
+
nextCommand: "scai index start",
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
if (facts.indexing.state === "running") {
|
|
78
|
+
return {
|
|
79
|
+
overall: { state: "running", summary: "indexing in progress" },
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
if (facts.database.state === "unknown" || facts.indexing.state === "unknown") {
|
|
83
|
+
return {
|
|
84
|
+
overall: { state: "unknown", summary: "status incomplete" },
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
return {
|
|
88
|
+
overall: { state: "ok", summary: "ready" },
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
function formatDatabaseStatus(facts) {
|
|
92
|
+
if (facts.database.state === "missing")
|
|
93
|
+
return "missing";
|
|
94
|
+
if (facts.database.state === "unknown")
|
|
95
|
+
return "unknown";
|
|
96
|
+
return "ok";
|
|
97
|
+
}
|
|
98
|
+
function formatIndexingStatus(facts) {
|
|
99
|
+
const counts = facts.indexing.totalFiles != null
|
|
100
|
+
? ` (${facts.indexing.totalFiles} files`
|
|
101
|
+
: "";
|
|
102
|
+
const suffix = facts.indexing.totalFiles != null
|
|
103
|
+
? facts.indexing.queuedFiles != null
|
|
104
|
+
? `, ${facts.indexing.queuedFiles} queued)`
|
|
105
|
+
: ")"
|
|
106
|
+
: "";
|
|
107
|
+
switch (facts.indexing.state) {
|
|
108
|
+
case "not-started":
|
|
109
|
+
return "not started";
|
|
110
|
+
case "idle":
|
|
111
|
+
return `idle${counts}${suffix}`;
|
|
112
|
+
case "queued":
|
|
113
|
+
return `queued${counts}${suffix}`;
|
|
114
|
+
case "running":
|
|
115
|
+
return `running${counts}${suffix}`;
|
|
116
|
+
default:
|
|
117
|
+
return "unknown";
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
function formatDaemonStatus(facts) {
|
|
121
|
+
if (facts.daemon.lockedRepo) {
|
|
122
|
+
return `${facts.daemon.state} (${facts.daemon.lockedRepo})`;
|
|
123
|
+
}
|
|
124
|
+
return facts.daemon.state;
|
|
125
|
+
}
|
|
126
|
+
function formatModelStatus(facts) {
|
|
127
|
+
const modelName = facts.model.name ?? "(none)";
|
|
128
|
+
if (!facts.model.name)
|
|
129
|
+
return "missing";
|
|
130
|
+
if (!facts.model.installed)
|
|
131
|
+
return `${modelName} (missing)`;
|
|
132
|
+
if (!facts.model.health.ok)
|
|
133
|
+
return `${modelName} (${facts.model.health.status})`;
|
|
134
|
+
return `${modelName} (installed, Ollama reachable)`;
|
|
135
|
+
}
|
|
136
|
+
function formatSetupStatus(facts) {
|
|
137
|
+
return facts.setup.state;
|
|
138
|
+
}
|
|
139
|
+
export async function collectStatusFacts() {
|
|
140
|
+
const config = readConfig();
|
|
141
|
+
const repoRootPath = resolveCanonicalRepoIdentity().repoRootPath;
|
|
142
|
+
const repoKey = getRepoKeyForPath(repoRootPath, config) ?? undefined;
|
|
143
|
+
const isRegistered = Boolean(repoKey);
|
|
144
|
+
const isActive = Boolean(repoKey && config.activeRepo === repoKey);
|
|
145
|
+
const daemonState = isDaemonRunning() ? "running" : "idle";
|
|
146
|
+
const lockedRepo = getLockedRepo() ?? undefined;
|
|
147
|
+
const databasePath = repoKey ? getDbPathForRepoKey(repoKey) : undefined;
|
|
148
|
+
const databaseExists = Boolean(databasePath && fs.existsSync(databasePath));
|
|
149
|
+
const queueCounts = databaseExists && databasePath ? readQueueCounts(databasePath) : undefined;
|
|
150
|
+
const databaseState = !repoKey || !databasePath
|
|
151
|
+
? "missing"
|
|
152
|
+
: !databaseExists
|
|
153
|
+
? "missing"
|
|
154
|
+
: queueCounts
|
|
155
|
+
? "ok"
|
|
156
|
+
: "unknown";
|
|
157
|
+
let indexingState = "not-started";
|
|
158
|
+
if (databaseState === "unknown") {
|
|
159
|
+
indexingState = "unknown";
|
|
160
|
+
}
|
|
161
|
+
else if (queueCounts) {
|
|
162
|
+
if (queueCounts.totalFiles === 0) {
|
|
163
|
+
indexingState = "not-started";
|
|
164
|
+
}
|
|
165
|
+
else if (queueCounts.queuedFiles > 0) {
|
|
166
|
+
indexingState = daemonState === "running" ? "running" : "queued";
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
indexingState = "idle";
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
const modelName = resolveEffectiveModelName(repoKey);
|
|
173
|
+
const modelInstalled = modelName ? isModelInstalled(modelName) : false;
|
|
174
|
+
const modelHealth = await getOllamaStatusSnapshot();
|
|
175
|
+
const modelState = !modelName || !modelInstalled ? "missing" : modelHealth.health.ok ? "ok" : "unknown";
|
|
176
|
+
const baseFacts = {
|
|
177
|
+
repo: {
|
|
178
|
+
rootPath: repoRootPath,
|
|
179
|
+
repoKey,
|
|
180
|
+
isRegistered,
|
|
181
|
+
isActive,
|
|
182
|
+
},
|
|
183
|
+
setup: {
|
|
184
|
+
state: isRegistered ? "ok" : "missing",
|
|
185
|
+
},
|
|
186
|
+
database: {
|
|
187
|
+
state: databaseState,
|
|
188
|
+
path: databasePath,
|
|
189
|
+
},
|
|
190
|
+
indexing: {
|
|
191
|
+
state: indexingState,
|
|
192
|
+
totalFiles: queueCounts?.totalFiles,
|
|
193
|
+
queuedFiles: queueCounts?.queuedFiles,
|
|
194
|
+
},
|
|
195
|
+
daemon: {
|
|
196
|
+
state: daemonState,
|
|
197
|
+
lockedRepo,
|
|
198
|
+
},
|
|
199
|
+
model: {
|
|
200
|
+
state: modelState,
|
|
201
|
+
name: modelName,
|
|
202
|
+
installed: modelInstalled,
|
|
203
|
+
health: modelHealth.health,
|
|
204
|
+
},
|
|
205
|
+
};
|
|
206
|
+
const { overall, nextCommand } = deriveOverallState(baseFacts);
|
|
207
|
+
return { ...baseFacts, overall, nextCommand };
|
|
208
|
+
}
|
|
209
|
+
export function formatStatusLines(facts) {
|
|
210
|
+
const lines = [
|
|
211
|
+
`Repo : ${facts.repo.rootPath}`,
|
|
212
|
+
`Setup : ${formatSetupStatus(facts)}`,
|
|
213
|
+
`Database : ${formatDatabaseStatus(facts)}`,
|
|
214
|
+
`Indexing : ${formatIndexingStatus(facts)}`,
|
|
215
|
+
`Daemon : ${formatDaemonStatus(facts)}`,
|
|
216
|
+
`Model : ${formatModelStatus(facts)}`,
|
|
217
|
+
`Overall : ${facts.overall.summary}`,
|
|
218
|
+
];
|
|
219
|
+
if (facts.nextCommand) {
|
|
220
|
+
lines.push(`Next : ${facts.nextCommand}`);
|
|
221
|
+
}
|
|
222
|
+
return lines;
|
|
223
|
+
}
|
|
224
|
+
export function formatIndexStatusLines(facts) {
|
|
225
|
+
const repoLabel = facts.repo.repoKey
|
|
226
|
+
? `${facts.repo.repoKey}${facts.repo.isActive ? " (active)" : ""}`
|
|
227
|
+
: facts.repo.rootPath;
|
|
228
|
+
const lines = [
|
|
229
|
+
`Repo : ${repoLabel}`,
|
|
230
|
+
`Database : ${formatDatabaseStatus(facts)}`,
|
|
231
|
+
`Indexing : ${formatIndexingStatus(facts)}`,
|
|
232
|
+
`Daemon : ${formatDaemonStatus(facts)}`,
|
|
233
|
+
];
|
|
234
|
+
if (facts.nextCommand === "scai setup" || facts.nextCommand === "scai index start") {
|
|
235
|
+
lines.push(`Next : ${facts.nextCommand}`);
|
|
236
|
+
}
|
|
237
|
+
return lines;
|
|
238
|
+
}
|
|
239
|
+
//# sourceMappingURL=statusOwner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"statusOwner.js","sourceRoot":"","sources":["../../src/status/statusOwner.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Collects read-only readiness facts for repo, DB, indexing, daemon, and model state.\n *\n * Why this file exists:\n * - `scai status` needs one fact owner that does not repair setup\n * - `scai index status` should share the same source of truth\n * - formatting should stay separate from fact collection\n */\nimport fs from \"fs\";\nimport Database from \"better-sqlite3\";\nimport { readConfig } from \"../config.js\";\nimport { getDbPathForRepoKey } from \"../db/client.js\";\nimport { getLockedRepo, isDaemonRunning } from \"../commands/DaemonCmd.js\";\nimport { getRepoKeyForPath } from \"../utils/contentUtils.js\";\nimport { getOllamaStatusSnapshot } from \"../utils/ollamaService.js\";\nimport { isModelInstalled } from \"../utils/ollamaModelStatus.js\";\nimport { resolveCanonicalRepoIdentity } from \"../utils/repoIdentity.js\";\nimport type { OllamaHealthResult } from \"../utils/ollamaService.js\";\nimport type { SupportedModel } from \"../types.js\";\n\ntype SimpleState = \"ok\" | \"missing\" | \"idle\" | \"running\" | \"queued\" | \"unknown\";\n\nexport type StatusFacts = {\n repo: {\n rootPath: string;\n repoKey?: string;\n isRegistered: boolean;\n isActive: boolean;\n };\n setup: {\n state: \"ok\" | \"missing\";\n };\n database: {\n state: \"ok\" | \"missing\" | \"unknown\";\n path?: string;\n };\n indexing: {\n state: \"not-started\" | \"idle\" | \"queued\" | \"running\" | \"unknown\";\n totalFiles?: number;\n queuedFiles?: number;\n };\n daemon: {\n state: \"idle\" | \"running\";\n lockedRepo?: string;\n };\n model: {\n state: \"ok\" | \"missing\" | \"unknown\";\n name?: SupportedModel;\n installed: boolean;\n health: OllamaHealthResult;\n };\n overall: {\n state: SimpleState;\n summary: string;\n };\n nextCommand?: string;\n};\n\ntype QueueCounts = {\n totalFiles: number;\n queuedFiles: number;\n};\n\nfunction readQueueCounts(dbPath: string): QueueCounts | undefined {\n try {\n const db = new Database(dbPath, { readonly: true, fileMustExist: true });\n try {\n const totals = db\n .prepare(\n `SELECT\n COUNT(*) AS totalFiles,\n SUM(CASE WHEN processing_status = 'unprocessed' THEN 1 ELSE 0 END) AS queuedFiles\n FROM files`\n )\n .get() as { totalFiles?: number; queuedFiles?: number };\n\n return {\n totalFiles: Number(totals.totalFiles ?? 0),\n queuedFiles: Number(totals.queuedFiles ?? 0),\n };\n } finally {\n db.close();\n }\n } catch {\n return undefined;\n }\n}\n\nfunction resolveEffectiveModelName(repoKey?: string): SupportedModel | undefined {\n const config = readConfig();\n const repoModel = repoKey ? config.repos?.[repoKey]?.model : undefined;\n return (repoModel ?? config.model) as SupportedModel | undefined;\n}\n\nfunction deriveOverallState(facts: Omit<StatusFacts, \"overall\" | \"nextCommand\">): {\n overall: StatusFacts[\"overall\"];\n nextCommand?: string;\n} {\n if (!facts.repo.isRegistered) {\n return {\n overall: { state: \"missing\", summary: \"setup missing\" },\n nextCommand: \"scai setup\",\n };\n }\n\n if (facts.database.state === \"missing\") {\n return {\n overall: { state: \"missing\", summary: \"database missing\" },\n nextCommand: \"scai setup\",\n };\n }\n\n if (facts.model.state === \"missing\") {\n return {\n overall: { state: \"missing\", summary: \"model missing\" },\n nextCommand: \"scai setup\",\n };\n }\n\n if (!facts.model.health.ok) {\n return {\n overall: { state: \"unknown\", summary: \"model runtime unavailable\" },\n nextCommand: \"scai model status\",\n };\n }\n\n if (facts.indexing.state === \"queued\" && facts.daemon.state !== \"running\") {\n return {\n overall: { state: \"queued\", summary: \"indexing queued\" },\n nextCommand: \"scai index start\",\n };\n }\n\n if (facts.indexing.state === \"running\") {\n return {\n overall: { state: \"running\", summary: \"indexing in progress\" },\n };\n }\n\n if (facts.database.state === \"unknown\" || facts.indexing.state === \"unknown\") {\n return {\n overall: { state: \"unknown\", summary: \"status incomplete\" },\n };\n }\n\n return {\n overall: { state: \"ok\", summary: \"ready\" },\n };\n}\n\nfunction formatDatabaseStatus(facts: StatusFacts): string {\n if (facts.database.state === \"missing\") return \"missing\";\n if (facts.database.state === \"unknown\") return \"unknown\";\n return \"ok\";\n}\n\nfunction formatIndexingStatus(facts: StatusFacts): string {\n const counts =\n facts.indexing.totalFiles != null\n ? ` (${facts.indexing.totalFiles} files`\n : \"\";\n const suffix =\n facts.indexing.totalFiles != null\n ? facts.indexing.queuedFiles != null\n ? `, ${facts.indexing.queuedFiles} queued)`\n : \")\"\n : \"\";\n\n switch (facts.indexing.state) {\n case \"not-started\":\n return \"not started\";\n case \"idle\":\n return `idle${counts}${suffix}`;\n case \"queued\":\n return `queued${counts}${suffix}`;\n case \"running\":\n return `running${counts}${suffix}`;\n default:\n return \"unknown\";\n }\n}\n\nfunction formatDaemonStatus(facts: StatusFacts): string {\n if (facts.daemon.lockedRepo) {\n return `${facts.daemon.state} (${facts.daemon.lockedRepo})`;\n }\n return facts.daemon.state;\n}\n\nfunction formatModelStatus(facts: StatusFacts): string {\n const modelName = facts.model.name ?? \"(none)\";\n if (!facts.model.name) return \"missing\";\n if (!facts.model.installed) return `${modelName} (missing)`;\n if (!facts.model.health.ok) return `${modelName} (${facts.model.health.status})`;\n return `${modelName} (installed, Ollama reachable)`;\n}\n\nfunction formatSetupStatus(facts: StatusFacts): string {\n return facts.setup.state;\n}\n\nexport async function collectStatusFacts(): Promise<StatusFacts> {\n const config = readConfig();\n const repoRootPath = resolveCanonicalRepoIdentity().repoRootPath;\n const repoKey = getRepoKeyForPath(repoRootPath, config) ?? undefined;\n const isRegistered = Boolean(repoKey);\n const isActive = Boolean(repoKey && config.activeRepo === repoKey);\n\n const daemonState = isDaemonRunning() ? \"running\" : \"idle\";\n const lockedRepo = getLockedRepo() ?? undefined;\n\n const databasePath = repoKey ? getDbPathForRepoKey(repoKey) : undefined;\n const databaseExists = Boolean(databasePath && fs.existsSync(databasePath));\n const queueCounts = databaseExists && databasePath ? readQueueCounts(databasePath) : undefined;\n\n const databaseState =\n !repoKey || !databasePath\n ? \"missing\"\n : !databaseExists\n ? \"missing\"\n : queueCounts\n ? \"ok\"\n : \"unknown\";\n\n let indexingState: StatusFacts[\"indexing\"][\"state\"] = \"not-started\";\n if (databaseState === \"unknown\") {\n indexingState = \"unknown\";\n } else if (queueCounts) {\n if (queueCounts.totalFiles === 0) {\n indexingState = \"not-started\";\n } else if (queueCounts.queuedFiles > 0) {\n indexingState = daemonState === \"running\" ? \"running\" : \"queued\";\n } else {\n indexingState = \"idle\";\n }\n }\n\n const modelName = resolveEffectiveModelName(repoKey);\n const modelInstalled = modelName ? isModelInstalled(modelName) : false;\n const modelHealth = await getOllamaStatusSnapshot();\n const modelState = !modelName || !modelInstalled ? \"missing\" : modelHealth.health.ok ? \"ok\" : \"unknown\";\n\n const baseFacts = {\n repo: {\n rootPath: repoRootPath,\n repoKey,\n isRegistered,\n isActive,\n },\n setup: {\n state: isRegistered ? \"ok\" : \"missing\",\n },\n database: {\n state: databaseState,\n path: databasePath,\n },\n indexing: {\n state: indexingState,\n totalFiles: queueCounts?.totalFiles,\n queuedFiles: queueCounts?.queuedFiles,\n },\n daemon: {\n state: daemonState,\n lockedRepo,\n },\n model: {\n state: modelState,\n name: modelName,\n installed: modelInstalled,\n health: modelHealth.health,\n },\n } satisfies Omit<StatusFacts, \"overall\" | \"nextCommand\">;\n\n const { overall, nextCommand } = deriveOverallState(baseFacts);\n return { ...baseFacts, overall, nextCommand };\n}\n\nexport function formatStatusLines(facts: StatusFacts): string[] {\n const lines = [\n `Repo : ${facts.repo.rootPath}`,\n `Setup : ${formatSetupStatus(facts)}`,\n `Database : ${formatDatabaseStatus(facts)}`,\n `Indexing : ${formatIndexingStatus(facts)}`,\n `Daemon : ${formatDaemonStatus(facts)}`,\n `Model : ${formatModelStatus(facts)}`,\n `Overall : ${facts.overall.summary}`,\n ];\n\n if (facts.nextCommand) {\n lines.push(`Next : ${facts.nextCommand}`);\n }\n\n return lines;\n}\n\nexport function formatIndexStatusLines(facts: StatusFacts): string[] {\n const repoLabel = facts.repo.repoKey\n ? `${facts.repo.repoKey}${facts.repo.isActive ? \" (active)\" : \"\"}`\n : facts.repo.rootPath;\n const lines = [\n `Repo : ${repoLabel}`,\n `Database : ${formatDatabaseStatus(facts)}`,\n `Indexing : ${formatIndexingStatus(facts)}`,\n `Daemon : ${formatDaemonStatus(facts)}`,\n ];\n\n if (facts.nextCommand === \"scai setup\" || facts.nextCommand === \"scai index start\") {\n lines.push(`Next : ${facts.nextCommand}`);\n }\n\n return lines;\n}\n"]}
|