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 @@
|
|
|
1
|
+
{"version":3,"file":"loadRelevantFolderCapsules.js","sourceRoot":"","sources":["../../src/utils/loadRelevantFolderCapsules.ts"],"names":[],"mappings":"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","sourcesContent":["// src/utils/loadRelevantFolderCapsules.ts\nimport { getDbForRepo } from '../db/client.js';\nimport path from 'path';\nimport type { FolderCapsule } from '../types.js';\nimport fs from 'fs';\nimport { normalizePath } from './contentUtils.js';\n\nexport function loadRelevantFolderCapsules(\n paths: string[],\n options?: { repoRootPath?: string; executionPath?: string }\n): FolderCapsule[] {\n const db = getDbForRepo();\n const capsules: FolderCapsule[] = [];\n const repoRootPath = options?.repoRootPath ? normalizePath(options.repoRootPath) : undefined;\n const executionPath = options?.executionPath ? normalizePath(options.executionPath) : undefined;\n const toCanonical = (inputPath: string) => {\n const normalized = normalizePath(inputPath);\n if (!repoRootPath || !executionPath || repoRootPath === executionPath) return normalized;\n const relative = path.relative(executionPath, normalized);\n if (!relative || relative.startsWith(\"..\")) return normalized;\n return normalizePath(path.join(repoRootPath, relative));\n };\n const toExecution = (inputPath: string) => {\n const normalized = normalizePath(inputPath);\n if (!repoRootPath || !executionPath || repoRootPath === executionPath) return normalized;\n const relative = path.relative(repoRootPath, normalized);\n if (!relative || relative.startsWith(\"..\")) return normalized;\n return normalizePath(path.join(executionPath, relative));\n };\n const canonicalPaths = paths.map(toCanonical);\n\n // 1ļøā£ Query DB first\n const dbRows = canonicalPaths.length\n ? db.prepare(\n `SELECT capsule_json FROM folder_capsules WHERE path IN (${canonicalPaths.map(() => '?').join(',')})`\n ).all(...canonicalPaths) as { capsule_json: string }[]\n : [];\n\n for (const row of dbRows) {\n try {\n const c = JSON.parse(row.capsule_json) as FolderCapsule;\n capsules.push({\n ...c,\n path: toExecution(c.path),\n keyFiles: (c.keyFiles ?? []).map(keyFile => ({\n ...keyFile,\n path: toExecution(keyFile.path),\n })),\n });\n } catch {\n // skip malformed JSON\n }\n }\n\n // 2ļøā£ Generate ephemeral capsules for missing paths\n const existingPaths = new Set(capsules.map(c => c.path));\n for (const p of paths) {\n if (existingPaths.has(p)) continue;\n if (!fs.existsSync(p)) continue;\n\n const files = fs.readdirSync(p, { withFileTypes: true })\n .filter(f => f.isFile())\n .map(f => f.name);\n\n const byType: Record<string, number> = {};\n for (const f of files) {\n const ext = path.extname(f).replace('.', '') || 'unknown';\n byType[ext] = (byType[ext] || 0) + 1;\n }\n\n capsules.push({\n path: p,\n depth: p.split('/').length,\n stats: { fileCount: files.length, byType },\n roles: [],\n concerns: [],\n keyFiles: files\n .filter(f => /index|main|cli|app|server|config/i.test(f))\n .slice(0, 5)\n .map(f => ({ path: path.join(p, f), reason: 'heuristic key file' })),\n dependencies: { importsFrom: [], usedBy: [] },\n confidence: 0.35,\n });\n }\n\n // 3ļøā£ Always add root capsule\n if (!capsules.some(c => c.path === '/')) {\n capsules.push({\n path: '/',\n depth: 1,\n stats: { fileCount: 0, byType: {} },\n roles: [],\n concerns: [],\n keyFiles: [],\n dependencies: { importsFrom: [], usedBy: [] },\n confidence: 0.5,\n });\n }\n\n return capsules;\n}\n"]}
|
package/dist/utils/log.js
CHANGED
|
@@ -1,9 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prints or appends small debug log lines with local machine timestamps.
|
|
3
|
+
*
|
|
4
|
+
* Why this file exists:
|
|
5
|
+
* - fallback diagnostics should use the same local-time policy as runtime logs
|
|
6
|
+
* - background and foreground debug output should stay consistent
|
|
7
|
+
*/
|
|
1
8
|
import { LOG_PATH } from "../constants.js";
|
|
2
9
|
import fs from 'fs';
|
|
10
|
+
import { nowLocalIso } from "./time.js";
|
|
3
11
|
export const DEBUG = false;
|
|
4
12
|
export const SUMMARY_LENGTH = 120;
|
|
5
13
|
export function log(...args) {
|
|
6
|
-
const timestamp =
|
|
14
|
+
const timestamp = nowLocalIso();
|
|
7
15
|
const message = args.map(arg => typeof arg === 'string' ? arg : JSON.stringify(arg, null, 2)).join(' ');
|
|
8
16
|
const isBackground = process.env.BACKGROUND_MODE === 'true';
|
|
9
17
|
if (isBackground) {
|
|
@@ -15,3 +23,4 @@ export function log(...args) {
|
|
|
15
23
|
console.log(`[${timestamp}] ${message}`);
|
|
16
24
|
}
|
|
17
25
|
}
|
|
26
|
+
//# sourceMappingURL=log.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log.js","sourceRoot":"","sources":["../../src/utils/log.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,MAAM,CAAC,MAAM,KAAK,GAAG,KAAK,CAAC;AAC3B,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,CAAC;AAElC,MAAM,UAAU,GAAG,CAAC,GAAG,IAAe;IACpC,MAAM,SAAS,GAAG,WAAW,EAAE,CAAC;IAChC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAC7B,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAC7D,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEZ,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,MAAM,CAAC;IAE5D,IAAI,YAAY,EAAE,CAAC;QACjB,0CAA0C;QAC1C,EAAE,CAAC,cAAc,CAAC,QAAQ,EAAE,IAAI,SAAS,KAAK,OAAO,IAAI,CAAC,CAAC;IAC7D,CAAC;SAAM,CAAC;QACN,gCAAgC;QAChC,OAAO,CAAC,GAAG,CAAC,IAAI,SAAS,KAAK,OAAO,EAAE,CAAC,CAAC;IAC3C,CAAC;AACH,CAAC","sourcesContent":["/**\n * Prints or appends small debug log lines with local machine timestamps.\n *\n * Why this file exists:\n * - fallback diagnostics should use the same local-time policy as runtime logs\n * - background and foreground debug output should stay consistent\n */\nimport { LOG_PATH } from \"../constants.js\";\nimport fs from 'fs';\nimport { nowLocalIso } from \"./time.js\";\n\r\nexport const DEBUG = false;\nexport const SUMMARY_LENGTH = 120;\n\nexport function log(...args: unknown[]) {\n const timestamp = nowLocalIso();\n const message = args.map(arg =>\r\n typeof arg === 'string' ? arg : JSON.stringify(arg, null, 2)\r\n ).join(' ');\r\n\r\n const isBackground = process.env.BACKGROUND_MODE === 'true';\r\n\r\n if (isBackground) {\r\n // If running in background, log to a file\r\n fs.appendFileSync(LOG_PATH, `[${timestamp}] ${message}\\n`);\r\n } else {\r\n // Otherwise, log to the console\r\n console.log(`[${timestamp}] ${message}`);\r\n }\r\n}\r\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalizeData.js","sourceRoot":"","sources":["../../src/utils/normalizeData.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,MAAM,UAAU,aAAa,CAAU,IAAiC;IACpE,IAAI,IAAI,IAAI,IAAI;QAAE,OAAO,EAAO,CAAC;IAEjC,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAS,CAAC;IAE/C,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC3B,IAAI,CAAC;YACD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAM,CAAC;QACjC,CAAC;QAAC,MAAM,CAAC;YACL,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAC5D,CAAC;IACL,CAAC;IAED,OAAO,EAAO,CAAC;AACnB,CAAC","sourcesContent":["/**\n * normalizeData ensures that ModuleIO.data is always returned as a usable object.\n *\n * Modules may output either a JSON string or a structured object. This helper\n * converts JSON strings into objects, passes objects through unchanged, and\n * provides a safe fallback for null/undefined. It centralizes the parsing logic\n * so individual modules donāt need to guess the data format.\n */\n\n\nexport function normalizeData<T = any>(data: string | object | undefined): T {\n if (data == null) return {} as T;\n\n if (typeof data === \"object\") return data as T;\n\n if (typeof data === \"string\") {\n try {\n return JSON.parse(data) as T;\n } catch {\n throw new Error(\"Invalid JSON string in ModuleIO.data\");\n }\n }\n\n return {} as T;\n}\n"]}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Checks local Ollama model availability without changing runtime state.
|
|
3
|
+
*
|
|
4
|
+
* Why this file exists:
|
|
5
|
+
* - setup validation and status output both need one model-installed check
|
|
6
|
+
* - the check should stay read-only and free of console formatting
|
|
7
|
+
* - Ollama list parsing should not drift across commands
|
|
8
|
+
*/
|
|
9
|
+
import { execFileSync } from "child_process";
|
|
10
|
+
/**
|
|
11
|
+
* Returns true when `ollama list` contains the requested model name.
|
|
12
|
+
* Example: "qwen3-coder:30b" -> true when Ollama lists that exact model.
|
|
13
|
+
*/
|
|
14
|
+
export function isModelInstalled(model) {
|
|
15
|
+
try {
|
|
16
|
+
const output = execFileSync("ollama", ["list"], { encoding: "utf-8" });
|
|
17
|
+
const normalizedModel = model.trim().toLowerCase();
|
|
18
|
+
return output
|
|
19
|
+
.split("\n")
|
|
20
|
+
.map((line) => line.trim().toLowerCase())
|
|
21
|
+
.filter(Boolean)
|
|
22
|
+
.some((line) => line === normalizedModel || line.startsWith(`${normalizedModel} `));
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=ollamaModelStatus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ollamaModelStatus.js","sourceRoot":"","sources":["../../src/utils/ollamaModelStatus.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,YAAY,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;QACvE,MAAM,eAAe,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAEnD,OAAO,MAAM;aACV,KAAK,CAAC,IAAI,CAAC;aACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;aACxC,MAAM,CAAC,OAAO,CAAC;aACf,IAAI,CACH,CAAC,IAAI,EAAE,EAAE,CACP,IAAI,KAAK,eAAe,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,eAAe,GAAG,CAAC,CACrE,CAAC;IACN,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC","sourcesContent":["/**\n * Checks local Ollama model availability without changing runtime state.\n *\n * Why this file exists:\n * - setup validation and status output both need one model-installed check\n * - the check should stay read-only and free of console formatting\n * - Ollama list parsing should not drift across commands\n */\nimport { execFileSync } from \"child_process\";\n\n/**\n * Returns true when `ollama list` contains the requested model name.\n * Example: \"qwen3-coder:30b\" -> true when Ollama lists that exact model.\n */\nexport function isModelInstalled(model: string): boolean {\n try {\n const output = execFileSync(\"ollama\", [\"list\"], { encoding: \"utf-8\" });\n const normalizedModel = model.trim().toLowerCase();\n\n return output\n .split(\"\\n\")\n .map((line) => line.trim().toLowerCase())\n .filter(Boolean)\n .some(\n (line) =>\n line === normalizedModel || line.startsWith(`${normalizedModel} `)\n );\n } catch {\n return false;\n }\n}\n"]}
|
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wraps low-level Ollama service endpoints and local server lifecycle helpers.
|
|
3
|
+
*
|
|
4
|
+
* Why this file exists:
|
|
5
|
+
* - Ollama URLs should be shared instead of repeated across commands
|
|
6
|
+
* - health, status, and restart behavior should stay in one service boundary
|
|
7
|
+
* - model gateway code should depend on a small stable API
|
|
8
|
+
*/
|
|
9
|
+
import { execFileSync, spawn } from 'node:child_process';
|
|
10
|
+
import { platform as getPlatform } from 'node:os';
|
|
11
|
+
export const OLLAMA_BASE_URL = 'http://127.0.0.1:11434/';
|
|
12
|
+
export const OLLAMA_CHAT_URL = `${OLLAMA_BASE_URL}api/chat`;
|
|
13
|
+
export const OLLAMA_GENERATE_URL = `${OLLAMA_BASE_URL}api/generate`;
|
|
14
|
+
export const OLLAMA_HEALTH_TIMEOUT_MS = 1500;
|
|
15
|
+
export const OLLAMA_READY_TIMEOUT_MS = 30000;
|
|
16
|
+
const DEFAULT_FETCH = (...args) => fetch(...args);
|
|
17
|
+
export async function probeOllamaHealth(opts = {}) {
|
|
18
|
+
const timeoutMs = opts.timeoutMs ?? OLLAMA_HEALTH_TIMEOUT_MS;
|
|
19
|
+
const fetchImpl = opts.fetchImpl ?? DEFAULT_FETCH;
|
|
20
|
+
try {
|
|
21
|
+
const res = await fetchImpl(OLLAMA_BASE_URL, {
|
|
22
|
+
method: 'GET',
|
|
23
|
+
signal: AbortSignal.timeout(timeoutMs),
|
|
24
|
+
});
|
|
25
|
+
if (res.ok) {
|
|
26
|
+
return { ok: true, status: 'healthy', detail: 'Ollama responded to the health probe.' };
|
|
27
|
+
}
|
|
28
|
+
return {
|
|
29
|
+
ok: false,
|
|
30
|
+
status: 'error',
|
|
31
|
+
detail: `Ollama returned HTTP ${res.status} to the health probe.`,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
catch (err) {
|
|
35
|
+
if (err?.name === 'TimeoutError' || err?.name === 'AbortError') {
|
|
36
|
+
return { ok: false, status: 'timeout', detail: 'Ollama did not answer the health probe in time.' };
|
|
37
|
+
}
|
|
38
|
+
return { ok: false, status: 'unreachable', detail: 'Ollama could not be reached on port 11434.' };
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
export async function waitForOllamaReady(opts = {}) {
|
|
42
|
+
const timeoutMs = opts.timeoutMs ?? OLLAMA_READY_TIMEOUT_MS;
|
|
43
|
+
const fetchImpl = opts.fetchImpl ?? DEFAULT_FETCH;
|
|
44
|
+
const sleepImpl = opts.sleepImpl ?? sleep;
|
|
45
|
+
const start = Date.now();
|
|
46
|
+
let lastHealth = {
|
|
47
|
+
ok: false,
|
|
48
|
+
status: 'unreachable',
|
|
49
|
+
detail: 'Ollama could not be reached on port 11434.',
|
|
50
|
+
};
|
|
51
|
+
while (Date.now() - start < timeoutMs) {
|
|
52
|
+
lastHealth = await probeOllamaHealth({ fetchImpl });
|
|
53
|
+
if (lastHealth.ok) {
|
|
54
|
+
return lastHealth;
|
|
55
|
+
}
|
|
56
|
+
await sleepImpl(300);
|
|
57
|
+
}
|
|
58
|
+
return lastHealth.status === 'timeout'
|
|
59
|
+
? lastHealth
|
|
60
|
+
: { ok: false, status: 'timeout', detail: `Ollama did not become ready within ${timeoutMs}ms.` };
|
|
61
|
+
}
|
|
62
|
+
export async function fetchOllamaVersion(fetchImpl = DEFAULT_FETCH) {
|
|
63
|
+
try {
|
|
64
|
+
const res = await fetchImpl(`${OLLAMA_BASE_URL}api/version`, {
|
|
65
|
+
signal: AbortSignal.timeout(OLLAMA_HEALTH_TIMEOUT_MS),
|
|
66
|
+
});
|
|
67
|
+
if (!res.ok)
|
|
68
|
+
return undefined;
|
|
69
|
+
const json = await res.json();
|
|
70
|
+
return typeof json.version === 'string' ? json.version : undefined;
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
return undefined;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
export async function getRunningModels(fetchImpl = DEFAULT_FETCH) {
|
|
77
|
+
try {
|
|
78
|
+
const res = await fetchImpl(`${OLLAMA_BASE_URL}api/ps`, {
|
|
79
|
+
signal: AbortSignal.timeout(OLLAMA_HEALTH_TIMEOUT_MS),
|
|
80
|
+
});
|
|
81
|
+
if (!res.ok)
|
|
82
|
+
return [];
|
|
83
|
+
const json = await res.json();
|
|
84
|
+
return Array.isArray(json.models) ? json.models : [];
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
return [];
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
export async function unloadOllamaModelIfRunning(model, fetchImpl = DEFAULT_FETCH) {
|
|
91
|
+
const normalizedModel = model.trim().toLowerCase();
|
|
92
|
+
if (!normalizedModel) {
|
|
93
|
+
return { ok: true, unloaded: false, skipped: true, detail: 'No model name was provided.' };
|
|
94
|
+
}
|
|
95
|
+
const runningModels = await getRunningModels(fetchImpl);
|
|
96
|
+
const matchingModel = runningModels.find((entry) => entry.name.trim().toLowerCase() === normalizedModel);
|
|
97
|
+
if (!matchingModel) {
|
|
98
|
+
return {
|
|
99
|
+
ok: true,
|
|
100
|
+
unloaded: false,
|
|
101
|
+
skipped: true,
|
|
102
|
+
detail: `Model '${model}' is not loaded in Ollama.`,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
try {
|
|
106
|
+
const response = await fetchImpl(OLLAMA_GENERATE_URL, {
|
|
107
|
+
method: 'POST',
|
|
108
|
+
headers: { 'Content-Type': 'application/json' },
|
|
109
|
+
body: JSON.stringify({
|
|
110
|
+
model: matchingModel.name,
|
|
111
|
+
keep_alive: 0,
|
|
112
|
+
}),
|
|
113
|
+
signal: AbortSignal.timeout(OLLAMA_HEALTH_TIMEOUT_MS),
|
|
114
|
+
});
|
|
115
|
+
if (!response.ok) {
|
|
116
|
+
return {
|
|
117
|
+
ok: false,
|
|
118
|
+
unloaded: false,
|
|
119
|
+
skipped: false,
|
|
120
|
+
detail: `Ollama returned HTTP ${response.status} while unloading '${matchingModel.name}'.`,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
return {
|
|
124
|
+
ok: true,
|
|
125
|
+
unloaded: true,
|
|
126
|
+
skipped: false,
|
|
127
|
+
detail: `Model '${matchingModel.name}' was unloaded from Ollama.`,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
catch (err) {
|
|
131
|
+
if (err?.name === 'TimeoutError' || err?.name === 'AbortError') {
|
|
132
|
+
return {
|
|
133
|
+
ok: false,
|
|
134
|
+
unloaded: false,
|
|
135
|
+
skipped: false,
|
|
136
|
+
detail: `Timed out while unloading '${matchingModel.name}'.`,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
return {
|
|
140
|
+
ok: false,
|
|
141
|
+
unloaded: false,
|
|
142
|
+
skipped: false,
|
|
143
|
+
detail: `Failed to unload '${matchingModel.name}' from Ollama.`,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
export async function getOllamaStatusSnapshot(fetchImpl = DEFAULT_FETCH) {
|
|
148
|
+
const health = await probeOllamaHealth({ fetchImpl });
|
|
149
|
+
if (!health.ok) {
|
|
150
|
+
return { health, runningModels: [] };
|
|
151
|
+
}
|
|
152
|
+
const [version, runningModels] = await Promise.all([
|
|
153
|
+
fetchOllamaVersion(fetchImpl),
|
|
154
|
+
getRunningModels(fetchImpl),
|
|
155
|
+
]);
|
|
156
|
+
return { health, version, runningModels };
|
|
157
|
+
}
|
|
158
|
+
export async function startOllamaServer() {
|
|
159
|
+
const candidates = getOllamaStartCandidates();
|
|
160
|
+
let lastError;
|
|
161
|
+
for (const candidate of candidates) {
|
|
162
|
+
const result = await spawnDetached(candidate.command, candidate.args);
|
|
163
|
+
if (result.ok) {
|
|
164
|
+
return { ok: true, command: [candidate.command, ...candidate.args].join(' '), reason: 'spawned' };
|
|
165
|
+
}
|
|
166
|
+
lastError = result.error;
|
|
167
|
+
if (result.reason !== 'not_found') {
|
|
168
|
+
return { ok: false, command: [candidate.command, ...candidate.args].join(' '), reason: 'error', error: result.error };
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
return { ok: false, reason: 'not_found', error: lastError };
|
|
172
|
+
}
|
|
173
|
+
export async function stopOllamaServer() {
|
|
174
|
+
const platform = getPlatform();
|
|
175
|
+
if (platform === 'win32') {
|
|
176
|
+
try {
|
|
177
|
+
execFileSync('taskkill', ['/IM', 'ollama.exe', '/F'], { stdio: 'ignore' });
|
|
178
|
+
}
|
|
179
|
+
catch {
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
const patterns = [
|
|
185
|
+
'ollama serve',
|
|
186
|
+
'/Applications/Ollama.app/Contents/Resources/ollama',
|
|
187
|
+
];
|
|
188
|
+
for (const pattern of patterns) {
|
|
189
|
+
try {
|
|
190
|
+
execFileSync('pkill', ['-f', pattern], { stdio: 'ignore' });
|
|
191
|
+
}
|
|
192
|
+
catch {
|
|
193
|
+
continue;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
export async function restartOllamaServer(opts = {}) {
|
|
198
|
+
await stopOllamaServer();
|
|
199
|
+
const sleepImpl = opts.sleepImpl ?? sleep;
|
|
200
|
+
await sleepImpl(500);
|
|
201
|
+
const startResult = await startOllamaServer();
|
|
202
|
+
if (!startResult.ok) {
|
|
203
|
+
return {
|
|
204
|
+
restarted: false,
|
|
205
|
+
ready: false,
|
|
206
|
+
health: { ok: false, status: 'unreachable', detail: 'SCAI could not start the Ollama server.' },
|
|
207
|
+
startResult,
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
const health = await waitForOllamaReady({ fetchImpl: opts.fetchImpl, sleepImpl });
|
|
211
|
+
return {
|
|
212
|
+
restarted: true,
|
|
213
|
+
ready: health.ok,
|
|
214
|
+
health,
|
|
215
|
+
startResult,
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
export function formatOllamaStatusMessage(snapshot) {
|
|
219
|
+
const lines = [];
|
|
220
|
+
if (!snapshot.health.ok) {
|
|
221
|
+
lines.push(`ā Ollama unhealthy: ${snapshot.health.detail}`);
|
|
222
|
+
lines.push(' Run `scai model restart` to restart the Ollama server.');
|
|
223
|
+
return lines;
|
|
224
|
+
}
|
|
225
|
+
const loadedCount = snapshot.runningModels.length;
|
|
226
|
+
if (loadedCount > 0) {
|
|
227
|
+
lines.push(`ā
Ollama ready (${loadedCount} model${loadedCount === 1 ? '' : 's'} loaded)`);
|
|
228
|
+
}
|
|
229
|
+
else {
|
|
230
|
+
lines.push('ā
Ollama ready (service up, no models loaded yet)');
|
|
231
|
+
}
|
|
232
|
+
if (snapshot.version) {
|
|
233
|
+
lines.push(`š¦ Ollama version: ${snapshot.version}`);
|
|
234
|
+
}
|
|
235
|
+
if (loadedCount > 0) {
|
|
236
|
+
lines.push('š„ Running models:');
|
|
237
|
+
for (const model of snapshot.runningModels) {
|
|
238
|
+
const sizeGB = (model.size / 1024 ** 3).toFixed(1);
|
|
239
|
+
lines.push(` ⢠${model.name}` +
|
|
240
|
+
` | ${model.details?.parameter_size ?? '??'} params` +
|
|
241
|
+
` | q=${model.details?.quantization_level ?? '?'}` +
|
|
242
|
+
` | ~${sizeGB} GB in RAM`);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
return lines;
|
|
246
|
+
}
|
|
247
|
+
async function spawnDetached(command, args) {
|
|
248
|
+
return await new Promise((resolve) => {
|
|
249
|
+
try {
|
|
250
|
+
const child = spawn(command, args, {
|
|
251
|
+
detached: true,
|
|
252
|
+
stdio: 'ignore',
|
|
253
|
+
windowsHide: true,
|
|
254
|
+
});
|
|
255
|
+
let settled = false;
|
|
256
|
+
const finish = (result) => {
|
|
257
|
+
if (settled)
|
|
258
|
+
return;
|
|
259
|
+
settled = true;
|
|
260
|
+
resolve(result);
|
|
261
|
+
};
|
|
262
|
+
child.once('error', (err) => {
|
|
263
|
+
finish({
|
|
264
|
+
ok: false,
|
|
265
|
+
reason: err?.code === 'ENOENT' ? 'not_found' : 'error',
|
|
266
|
+
error: err,
|
|
267
|
+
});
|
|
268
|
+
});
|
|
269
|
+
child.unref();
|
|
270
|
+
setTimeout(() => finish({ ok: true, reason: 'spawned' }), 200);
|
|
271
|
+
}
|
|
272
|
+
catch (err) {
|
|
273
|
+
resolve({
|
|
274
|
+
ok: false,
|
|
275
|
+
reason: err?.code === 'ENOENT' ? 'not_found' : 'error',
|
|
276
|
+
error: err,
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
});
|
|
280
|
+
}
|
|
281
|
+
function getOllamaStartCandidates() {
|
|
282
|
+
const candidates = [{ command: 'ollama', args: ['serve'] }];
|
|
283
|
+
if (getPlatform() === 'darwin') {
|
|
284
|
+
candidates.push({
|
|
285
|
+
command: '/Applications/Ollama.app/Contents/Resources/ollama',
|
|
286
|
+
args: ['serve'],
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
return candidates;
|
|
290
|
+
}
|
|
291
|
+
function sleep(ms) {
|
|
292
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
293
|
+
}
|
|
294
|
+
//# sourceMappingURL=ollamaService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ollamaService.js","sourceRoot":"","sources":["../../src/utils/ollamaService.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Wraps low-level Ollama service endpoints and local server lifecycle helpers.\n *\n * Why this file exists:\n * - Ollama URLs should be shared instead of repeated across commands\n * - health, status, and restart behavior should stay in one service boundary\n * - model gateway code should depend on a small stable API\n */\nimport { execFileSync, spawn } from 'node:child_process';\nimport { platform as getPlatform } from 'node:os';\n\nexport const OLLAMA_BASE_URL = 'http://127.0.0.1:11434/';\nexport const OLLAMA_CHAT_URL = `${OLLAMA_BASE_URL}api/chat`;\nexport const OLLAMA_GENERATE_URL = `${OLLAMA_BASE_URL}api/generate`;\nexport const OLLAMA_HEALTH_TIMEOUT_MS = 1500;\nexport const OLLAMA_READY_TIMEOUT_MS = 30000;\n\nexport type OllamaHealthStatus = 'healthy' | 'unreachable' | 'timeout' | 'error';\n\nexport type OllamaHealthResult = {\n ok: boolean;\n status: OllamaHealthStatus;\n detail: string;\n};\n\nexport type OllamaModel = {\n name: string;\n size: number;\n modified_at: string;\n details?: {\n format?: string;\n family?: string;\n parameter_size?: string;\n quantization_level?: string;\n };\n};\n\nexport type OllamaStatusSnapshot = {\n health: OllamaHealthResult;\n version?: string;\n runningModels: OllamaModel[];\n};\n\nexport type OllamaStartResult = {\n ok: boolean;\n command?: string;\n reason: 'spawned' | 'not_found' | 'error';\n error?: unknown;\n};\n\nexport type OllamaUnloadResult =\n | { ok: true; unloaded: true; skipped: false; detail: string }\n | { ok: true; unloaded: false; skipped: true; detail: string }\n | { ok: false; unloaded: false; skipped: false; detail: string };\n\ntype FetchLike = typeof fetch;\n\nconst DEFAULT_FETCH: FetchLike = (...args) => fetch(...args);\n\nexport async function probeOllamaHealth(\n opts: { timeoutMs?: number; fetchImpl?: FetchLike } = {}\n): Promise<OllamaHealthResult> {\n const timeoutMs = opts.timeoutMs ?? OLLAMA_HEALTH_TIMEOUT_MS;\n const fetchImpl = opts.fetchImpl ?? DEFAULT_FETCH;\n\n try {\n const res = await fetchImpl(OLLAMA_BASE_URL, {\n method: 'GET',\n signal: AbortSignal.timeout(timeoutMs),\n });\n\n if (res.ok) {\n return { ok: true, status: 'healthy', detail: 'Ollama responded to the health probe.' };\n }\n\n return {\n ok: false,\n status: 'error',\n detail: `Ollama returned HTTP ${res.status} to the health probe.`,\n };\n } catch (err: any) {\n if (err?.name === 'TimeoutError' || err?.name === 'AbortError') {\n return { ok: false, status: 'timeout', detail: 'Ollama did not answer the health probe in time.' };\n }\n\n return { ok: false, status: 'unreachable', detail: 'Ollama could not be reached on port 11434.' };\n }\n}\n\nexport async function waitForOllamaReady(\n opts: { timeoutMs?: number; fetchImpl?: FetchLike; sleepImpl?: (ms: number) => Promise<void> } = {}\n): Promise<OllamaHealthResult> {\n const timeoutMs = opts.timeoutMs ?? OLLAMA_READY_TIMEOUT_MS;\n const fetchImpl = opts.fetchImpl ?? DEFAULT_FETCH;\n const sleepImpl = opts.sleepImpl ?? sleep;\n const start = Date.now();\n let lastHealth: OllamaHealthResult = {\n ok: false,\n status: 'unreachable',\n detail: 'Ollama could not be reached on port 11434.',\n };\n\n while (Date.now() - start < timeoutMs) {\n lastHealth = await probeOllamaHealth({ fetchImpl });\n if (lastHealth.ok) {\n return lastHealth;\n }\n await sleepImpl(300);\n }\n\n return lastHealth.status === 'timeout'\n ? lastHealth\n : { ok: false, status: 'timeout', detail: `Ollama did not become ready within ${timeoutMs}ms.` };\n}\n\nexport async function fetchOllamaVersion(fetchImpl: FetchLike = DEFAULT_FETCH): Promise<string | undefined> {\n try {\n const res = await fetchImpl(`${OLLAMA_BASE_URL}api/version`, {\n signal: AbortSignal.timeout(OLLAMA_HEALTH_TIMEOUT_MS),\n });\n if (!res.ok) return undefined;\n const json = await res.json();\n return typeof json.version === 'string' ? json.version : undefined;\n } catch {\n return undefined;\n }\n}\n\nexport async function getRunningModels(fetchImpl: FetchLike = DEFAULT_FETCH): Promise<OllamaModel[]> {\n try {\n const res = await fetchImpl(`${OLLAMA_BASE_URL}api/ps`, {\n signal: AbortSignal.timeout(OLLAMA_HEALTH_TIMEOUT_MS),\n });\n if (!res.ok) return [];\n const json = await res.json();\n return Array.isArray(json.models) ? (json.models as OllamaModel[]) : [];\n } catch {\n return [];\n }\n}\n\nexport async function unloadOllamaModelIfRunning(\n model: string,\n fetchImpl: FetchLike = DEFAULT_FETCH\n): Promise<OllamaUnloadResult> {\n const normalizedModel = model.trim().toLowerCase();\n if (!normalizedModel) {\n return { ok: true, unloaded: false, skipped: true, detail: 'No model name was provided.' };\n }\n\n const runningModels = await getRunningModels(fetchImpl);\n const matchingModel = runningModels.find(\n (entry) => entry.name.trim().toLowerCase() === normalizedModel\n );\n\n if (!matchingModel) {\n return {\n ok: true,\n unloaded: false,\n skipped: true,\n detail: `Model '${model}' is not loaded in Ollama.`,\n };\n }\n\n try {\n const response = await fetchImpl(OLLAMA_GENERATE_URL, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n model: matchingModel.name,\n keep_alive: 0,\n }),\n signal: AbortSignal.timeout(OLLAMA_HEALTH_TIMEOUT_MS),\n });\n\n if (!response.ok) {\n return {\n ok: false,\n unloaded: false,\n skipped: false,\n detail: `Ollama returned HTTP ${response.status} while unloading '${matchingModel.name}'.`,\n };\n }\n\n return {\n ok: true,\n unloaded: true,\n skipped: false,\n detail: `Model '${matchingModel.name}' was unloaded from Ollama.`,\n };\n } catch (err: any) {\n if (err?.name === 'TimeoutError' || err?.name === 'AbortError') {\n return {\n ok: false,\n unloaded: false,\n skipped: false,\n detail: `Timed out while unloading '${matchingModel.name}'.`,\n };\n }\n\n return {\n ok: false,\n unloaded: false,\n skipped: false,\n detail: `Failed to unload '${matchingModel.name}' from Ollama.`,\n };\n }\n}\n\nexport async function getOllamaStatusSnapshot(fetchImpl: FetchLike = DEFAULT_FETCH): Promise<OllamaStatusSnapshot> {\n const health = await probeOllamaHealth({ fetchImpl });\n if (!health.ok) {\n return { health, runningModels: [] };\n }\n\n const [version, runningModels] = await Promise.all([\n fetchOllamaVersion(fetchImpl),\n getRunningModels(fetchImpl),\n ]);\n\n return { health, version, runningModels };\n}\n\nexport async function startOllamaServer(): Promise<OllamaStartResult> {\n const candidates = getOllamaStartCandidates();\n let lastError: unknown;\n\n for (const candidate of candidates) {\n const result = await spawnDetached(candidate.command, candidate.args);\n if (result.ok) {\n return { ok: true, command: [candidate.command, ...candidate.args].join(' '), reason: 'spawned' };\n }\n lastError = result.error;\n if (result.reason !== 'not_found') {\n return { ok: false, command: [candidate.command, ...candidate.args].join(' '), reason: 'error', error: result.error };\n }\n }\n\n return { ok: false, reason: 'not_found', error: lastError };\n}\n\nexport async function stopOllamaServer(): Promise<void> {\n const platform = getPlatform();\n\n if (platform === 'win32') {\n try {\n execFileSync('taskkill', ['/IM', 'ollama.exe', '/F'], { stdio: 'ignore' });\n } catch {\n return;\n }\n return;\n }\n\n const patterns = [\n 'ollama serve',\n '/Applications/Ollama.app/Contents/Resources/ollama',\n ];\n\n for (const pattern of patterns) {\n try {\n execFileSync('pkill', ['-f', pattern], { stdio: 'ignore' });\n } catch {\n continue;\n }\n }\n}\n\nexport async function restartOllamaServer(\n opts: { fetchImpl?: FetchLike; sleepImpl?: (ms: number) => Promise<void> } = {}\n): Promise<{ restarted: boolean; ready: boolean; health: OllamaHealthResult; startResult: OllamaStartResult }> {\n await stopOllamaServer();\n const sleepImpl = opts.sleepImpl ?? sleep;\n await sleepImpl(500);\n\n const startResult = await startOllamaServer();\n if (!startResult.ok) {\n return {\n restarted: false,\n ready: false,\n health: { ok: false, status: 'unreachable', detail: 'SCAI could not start the Ollama server.' },\n startResult,\n };\n }\n\n const health = await waitForOllamaReady({ fetchImpl: opts.fetchImpl, sleepImpl });\n return {\n restarted: true,\n ready: health.ok,\n health,\n startResult,\n };\n}\n\nexport function formatOllamaStatusMessage(snapshot: OllamaStatusSnapshot): string[] {\n const lines: string[] = [];\n\n if (!snapshot.health.ok) {\n lines.push(`ā Ollama unhealthy: ${snapshot.health.detail}`);\n lines.push(' Run `scai model restart` to restart the Ollama server.');\n return lines;\n }\n\n const loadedCount = snapshot.runningModels.length;\n if (loadedCount > 0) {\n lines.push(`ā
Ollama ready (${loadedCount} model${loadedCount === 1 ? '' : 's'} loaded)`);\n } else {\n lines.push('ā
Ollama ready (service up, no models loaded yet)');\n }\n\n if (snapshot.version) {\n lines.push(`š¦ Ollama version: ${snapshot.version}`);\n }\n\n if (loadedCount > 0) {\n lines.push('š„ Running models:');\n for (const model of snapshot.runningModels) {\n const sizeGB = (model.size / 1024 ** 3).toFixed(1);\n lines.push(\n ` ⢠${model.name}` +\n ` | ${model.details?.parameter_size ?? '??'} params` +\n ` | q=${model.details?.quantization_level ?? '?'}` +\n ` | ~${sizeGB} GB in RAM`\n );\n }\n }\n\n return lines;\n}\n\nasync function spawnDetached(\n command: string,\n args: string[]\n): Promise<{ ok: boolean; reason: 'spawned' | 'not_found' | 'error'; error?: unknown }> {\n return await new Promise((resolve) => {\n try {\n const child = spawn(command, args, {\n detached: true,\n stdio: 'ignore',\n windowsHide: true,\n });\n\n let settled = false;\n const finish = (result: { ok: boolean; reason: 'spawned' | 'not_found' | 'error'; error?: unknown }) => {\n if (settled) return;\n settled = true;\n resolve(result);\n };\n\n child.once('error', (err: any) => {\n finish({\n ok: false,\n reason: err?.code === 'ENOENT' ? 'not_found' : 'error',\n error: err,\n });\n });\n\n child.unref();\n setTimeout(() => finish({ ok: true, reason: 'spawned' }), 200);\n } catch (err: any) {\n resolve({\n ok: false,\n reason: err?.code === 'ENOENT' ? 'not_found' : 'error',\n error: err,\n });\n }\n });\n}\n\nfunction getOllamaStartCandidates(): Array<{ command: string; args: string[] }> {\n const candidates = [{ command: 'ollama', args: ['serve'] }];\n if (getPlatform() === 'darwin') {\n candidates.push({\n command: '/Applications/Ollama.app/Contents/Resources/ollama',\n args: ['serve'],\n });\n }\n return candidates;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outputFormatter.js","sourceRoot":"","sources":["../../src/utils/outputFormatter.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,WAAW,CAAC;AAElC;;GAEG;AACH,MAAM,UAAU,SAAS,CACvB,IAA8B,EAC9B,UAAyC,EAAE;IAE3C,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAE1C,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;IACnD,MAAM,EAAE,gBAAgB,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,OAAO,CAAC;IAE7C,OAAO,SAAS,CAAC,IAAI,EAAE;QACrB,cAAc,EAAE,IAAI;QACpB,YAAY,EAAE,aAAa;QAC3B,MAAM,EAAE,MAAM,CAAC,WAAW,CACxB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC;YAChC,GAAG;YACH,EAAE,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,gBAAgB,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE;SAC1E,CAAC,CACH;KACF,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CACvB,IAAY,EACZ,UAAyC,EAAE;IAE3C,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;IACnD,MAAM,EAAE,gBAAgB,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,OAAO,CAAC;IAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,gBAAgB,CAAC,CAAC;IAE9D,6BAA6B;IAC7B,MAAM,OAAO,GAAG,IAAI;SACjB,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACZ,IAAI,IAAI,CAAC,MAAM,IAAI,QAAQ;YAAE,OAAO,IAAI,CAAC;QAEzC,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,OAAO,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YAC3B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC;YACjD,KAAK,IAAI,QAAQ,CAAC;QACpB,CAAC;QACD,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB,CACtC,IAAY,EACZ,UAAyC,EAAE;IAE3C,+DAA+D;IAC/D,MAAM,IAAI,GAAG,IAAI;SACd,IAAI,EAAE;SACN,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAExE,OAAO,SAAS,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AAClC,CAAC","sourcesContent":["import columnify from \"columnify\";\r\n\r\n/**\r\n * Format structured rows for terminal output.\r\n */\r\nexport function styleRows(\r\n rows: Record<string, string>[],\r\n options: { maxWidthFraction?: number } = {}\r\n): string {\r\n if (!rows || rows.length === 0) return \"\";\r\n\r\n const terminalWidth = process.stdout.columns || 80;\r\n const { maxWidthFraction = 2 / 3 } = options;\r\n\r\n return columnify(rows, {\r\n columnSplitter: \" \",\r\n maxLineWidth: terminalWidth,\r\n config: Object.fromEntries(\r\n Object.keys(rows[0]).map((key) => [\r\n key,\r\n { maxWidth: Math.floor(terminalWidth * maxWidthFraction), align: \"left\" },\r\n ])\r\n ),\r\n });\r\n}\r\n\r\n/**\r\n * Format a plain string for terminal output (wraps lines to terminal width).\r\n */\r\nexport function styleText(\r\n text: string,\r\n options: { maxWidthFraction?: number } = {}\r\n): string {\r\n const terminalWidth = process.stdout.columns || 80;\r\n const { maxWidthFraction = 2 / 3 } = options;\r\n const maxWidth = Math.floor(terminalWidth * maxWidthFraction);\r\n\r\n // Wrap each line to maxWidth\r\n const wrapped = text\r\n .split(\"\\n\")\r\n .map((line) => {\r\n if (line.length <= maxWidth) return line;\r\n\r\n const chunks: string[] = [];\r\n let start = 0;\r\n while (start < line.length) {\r\n chunks.push(line.slice(start, start + maxWidth));\r\n start += maxWidth;\r\n }\r\n return chunks.join(\"\\n\");\r\n })\r\n .join(\"\\n\");\r\n\r\n return wrapped;\r\n}\r\n\r\n/**\r\n * Parse numbered suggestions or key-value text into rows for columnify.\r\n */\r\nexport function parseAndStyleSuggestions(\r\n text: string,\r\n options: { maxWidthFraction?: number } = {}\r\n): string {\r\n // Simple parser: each line becomes { No: n, Suggestion: line }\r\n const rows = text\r\n .trim()\r\n .split(\"\\n\")\r\n .map((line, idx) => ({ No: (idx + 1).toString(), Suggestion: line }));\r\n\r\n return styleRows(rows, options);\r\n}\r\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parseTaggedContent.js","sourceRoot":"","sources":["../../src/utils/parseTaggedContent.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAChC,OAAe,EACf,GAAW;IAEX,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IAEjC,MAAM,QAAQ,GAAG,IAAI,MAAM,CACvB,IAAI,OAAO,oBAAoB,OAAO,GAAG,EACzC,IAAI,CACP,CAAC;IACF,MAAM,UAAU,GAAG,6BAA6B,CAAC;IAEjD,MAAM,OAAO,GAAG,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IAChD,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,YAAY,GAAG,uBAAuB,CAAC,CAAC;IAC5D,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACtD,IAAI,CAAC,OAAO,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,IAAI,GAAG,4BAA4B,CAAC,CAAC;IACzD,CAAC;IAED,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAE7C,OAAO;QACH,OAAO;QACP,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI;KAClD,CAAC;AACN,CAAC;AAED,SAAS,WAAW,CAAC,CAAS;IAC1B,OAAO,CAAC,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AACpD,CAAC","sourcesContent":["/**\n * Strict helper to extract tagged content.\n * - Requires the tag to be present\n * - Throws on missing or empty content\n * - No markdown fallback\n */\nexport function extractTaggedContent(\n rawText: string,\n tag: string\n): { content: string; notes: string | null } {\n const safeTag = escapeRegex(tag);\n\n const tagRegex = new RegExp(\n `<${safeTag}>([\\\\s\\\\S]*?)<\\\\/${safeTag}>`,\n 'gi'\n );\n const notesRegex = /<NOTES>([\\s\\S]*?)<\\/NOTES>/i;\n\n const matches = [...rawText.matchAll(tagRegex)];\n if (!matches.length) {\n throw new Error(`Missing <${tag}> tag in LLM response`);\n }\n\n const content = matches[matches.length - 1][1].trim();\n if (!content) {\n throw new Error(`<${tag}> tag is present but empty`);\n }\n\n const notesMatch = rawText.match(notesRegex);\n\n return {\n content,\n notes: notesMatch ? notesMatch[1].trim() : null\n };\n}\n\nfunction escapeRegex(s: string) {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n"]}
|
|
@@ -1,46 +1,27 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
{
|
|
29
|
-
action: "codeTransform",
|
|
30
|
-
groups: ["transform"],
|
|
31
|
-
description: "Generate concrete code changes according to the execution plan and selected source files. " +
|
|
32
|
-
"This produces structured patches or full file rewrites, but does NOT write anything to disk. " +
|
|
33
|
-
"It should only be planned when actual code modifications are required, never for analysis purposes. " +
|
|
34
|
-
"Must complete successfully before any 'writeFile' steps are executed."
|
|
35
|
-
},
|
|
36
|
-
// =====================================================
|
|
37
|
-
// FINALIZE PHASE
|
|
38
|
-
// Purpose: commit results and respond to the user
|
|
39
|
-
// =====================================================
|
|
40
|
-
{
|
|
41
|
-
action: "finalAnswer",
|
|
42
|
-
groups: ["finalize"],
|
|
43
|
-
description: "Produce the final user-facing response, explanation, or report. " +
|
|
44
|
-
"Summarizes actions taken and results produced."
|
|
45
|
-
},
|
|
46
|
-
];
|
|
1
|
+
import { getActionRegistry } from "../agents/actionRegistry.js";
|
|
2
|
+
/**
|
|
3
|
+
* Refactor note:
|
|
4
|
+
* - Temporary planner bridge derived from ActionRegistry.
|
|
5
|
+
* - Why it exists: keep legacy planner prompts stable during typed-action migration.
|
|
6
|
+
*/
|
|
7
|
+
const phaseToGroup = {
|
|
8
|
+
info: "info",
|
|
9
|
+
analysis: "analysis",
|
|
10
|
+
transform: "transform",
|
|
11
|
+
finalize: "finalize",
|
|
12
|
+
research: "analysis",
|
|
13
|
+
system: "transform",
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Migration bridge:
|
|
17
|
+
* planners still read PLAN_ACTIONS while runtime authority is ActionRegistry.
|
|
18
|
+
*/
|
|
19
|
+
export const PLAN_ACTIONS = Object.values(getActionRegistry()).map((spec) => ({
|
|
20
|
+
// Example bridge row:
|
|
21
|
+
// { action: "semanticAnalysis", actionId: "semanticAnalysis", groups:["analysis"] }.
|
|
22
|
+
action: spec.id,
|
|
23
|
+
actionId: spec.id,
|
|
24
|
+
groups: [phaseToGroup[spec.phase] ?? "analysis"],
|
|
25
|
+
description: `${spec.phase} action (${spec.executorKind}, ${spec.safety})`,
|
|
26
|
+
}));
|
|
27
|
+
//# sourceMappingURL=planActions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"planActions.js","sourceRoot":"","sources":["../../src/utils/planActions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAEhE;;;;GAIG;AACH,MAAM,YAAY,GAA2B;IAC3C,IAAI,EAAE,MAAM;IACZ,QAAQ,EAAE,UAAU;IACpB,SAAS,EAAE,WAAW;IACtB,QAAQ,EAAE,UAAU;IACpB,QAAQ,EAAE,UAAU;IACpB,MAAM,EAAE,WAAW;CACpB,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,iBAAiB,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC5E,sBAAsB;IACtB,qFAAqF;IACrF,MAAM,EAAE,IAAI,CAAC,EAAE;IACf,QAAQ,EAAE,IAAI,CAAC,EAAE;IACjB,MAAM,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,UAAU,CAAC;IAChD,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,YAAY,IAAI,CAAC,YAAY,KAAK,IAAI,CAAC,MAAM,GAAG;CAC3E,CAAC,CAAC,CAAC","sourcesContent":["import { getActionRegistry } from \"../agents/actionRegistry.js\";\n\n/**\n * Refactor note:\n * - Temporary planner bridge derived from ActionRegistry.\n * - Why it exists: keep legacy planner prompts stable during typed-action migration.\n */\nconst phaseToGroup: Record<string, string> = {\n info: \"info\",\n analysis: \"analysis\",\n transform: \"transform\",\n finalize: \"finalize\",\n research: \"analysis\",\n system: \"transform\",\n};\n\n/**\n * Migration bridge:\n * planners still read PLAN_ACTIONS while runtime authority is ActionRegistry.\n */\nexport const PLAN_ACTIONS = Object.values(getActionRegistry()).map((spec) => ({\n // Example bridge row:\n // { action: \"semanticAnalysis\", actionId: \"semanticAnalysis\", groups:[\"analysis\"] }.\n action: spec.id,\n actionId: spec.id,\n groups: [phaseToGroup[spec.phase] ?? \"analysis\"],\n description: `${spec.phase} action (${spec.executorKind}, ${spec.safety})`,\n}));\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"promptBuilderHelper.js","sourceRoot":"","sources":["../../src/utils/promptBuilderHelper.ts"],"names":[],"mappings":"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","sourcesContent":["import chalk from \"chalk\";\nimport { BuildContextualPromptArgs, StructuredContext } from \"../types.js\";\nimport { buildLightContext } from \"./buildContextualPrompt.js\";\n\n/**\n * Responsible only for building the contextual prompt text (no file writes).\n */\nexport async function buildContext(\n args: BuildContextualPromptArgs\n): Promise<string> {\n console.log(chalk.blueBright(\"\\nš¦ Building contextual prompt...\"));\n\n // ā³ Now returns a StructuredContext object\n const ctx: StructuredContext = await buildLightContext(args);\n\n // Serialize to prompt string\n const promptContent = serializeContext(ctx);\n\n console.log(chalk.greenBright(\"ā
Prompt built successfully.\"));\n console.log(\n chalk.cyan(\n `[PromptBuilder] Token estimate: ~${Math.round(promptContent.length / 4)} tokens`\n )\n );\n\n return promptContent;\n}\n\n\nfunction serializeContext(ctx: StructuredContext): string {\n const out: string[] = [];\n\n out.push(`# User Query\\n${ctx.initContext?.userQuery}\\n`);\n\n if (ctx.initContext?.projectSummary) {\n out.push(`# Project Summary\\n${ctx.initContext?.projectSummary}\\n`);\n }\n\n if (ctx.initContext?.moduleSummaries?.length) {\n out.push(`# Module Summaries`);\n for (const m of ctx.initContext?.moduleSummaries) {\n out.push(`- **${m.path}**: ${m.summary}`);\n }\n out.push(\"\");\n }\n\n if (ctx.workingFiles?.length) {\n out.push(`# Working Files`);\n for (const f of ctx.workingFiles) {\n out.push(`\\n## ${f.path}`);\n if (f.summary) out.push(`Summary: ${f.summary}`);\n if (f.code) out.push(`\\nCode (truncated):\\n${f.code.slice(0, 1000)}`);\n }\n }\n\n if (ctx.analysis?.focus?.selectedFiles?.length) {\n out.push(`# Focused Files (semantic analysis)`);\n for (const path of ctx.analysis.focus.selectedFiles) {\n out.push(`- ${path}`);\n }\n if (ctx.analysis.focus.rationale) {\n out.push(`Rationale: ${ctx.analysis.focus.rationale}`);\n }\n }\n\n if (ctx.analysis?.understanding) {\n out.push(`# Semantic Understanding`);\n if (ctx.analysis.understanding.problemStatement)\n out.push(`Problem: ${ctx.analysis.understanding.problemStatement}`);\n if (ctx.analysis.understanding.assumptions?.length)\n out.push(`Assumptions: ${ctx.analysis.understanding.assumptions.join(\", \")}`);\n if (ctx.analysis.understanding.risks?.length)\n out.push(`Risks: ${ctx.analysis.understanding.risks.join(\", \")}`);\n }\n\n if (ctx.initContext?.repoTree) {\n out.push(`# Repo Tree\\n${ctx.initContext?.repoTree}\\n`);\n }\n\n if (ctx.initContext?.kgSample?.length) {\n out.push(`# Knowledge Graph Sample`);\n for (const e of ctx.initContext?.kgSample) {\n out.push(`- ${e.source} -> (${e.relation}) -> ${e.target}`);\n }\n }\n\n return out.join(\"\\n\");\n}\n"]}
|
|
@@ -1,6 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Keeps legacy prompt and input/output helpers working during the runtime-log migration.
|
|
3
|
+
*/
|
|
1
4
|
import fs from "fs";
|
|
2
5
|
import { log } from "../utils/log.js";
|
|
3
|
-
import { SCAI_HOME, PROMPT_LOG_PATH
|
|
6
|
+
import { SCAI_HOME, PROMPT_LOG_PATH } from "../constants.js";
|
|
7
|
+
import { clearRuntimeLogs, logRuntimeRecord } from "./runtimeLogger.js";
|
|
8
|
+
/**
|
|
9
|
+
* Keeps the old prompt and input/output logging helpers working during migration.
|
|
10
|
+
*
|
|
11
|
+
* Why this file exists:
|
|
12
|
+
* - many legacy call sites still use `logInputOutput(...)`
|
|
13
|
+
* - Stage 1 moves the shared file names and backend first
|
|
14
|
+
* - Stage 2 can migrate callers away from this compatibility layer
|
|
15
|
+
*/
|
|
4
16
|
/**
|
|
5
17
|
* Ensures SCAI_HOME exists before writing logs.
|
|
6
18
|
*/
|
|
@@ -31,18 +43,22 @@ export function logPrompt(prompt) {
|
|
|
31
43
|
}
|
|
32
44
|
/**
|
|
33
45
|
* Appends module input/output data to a separate log file.
|
|
34
|
-
*
|
|
46
|
+
* Writes one shared runtime record so migration callers do not duplicate
|
|
47
|
+
* both the old banner block and the new structured record in `runtime.log`.
|
|
35
48
|
*/
|
|
36
49
|
export function logInputOutput(stepName, type, content) {
|
|
37
50
|
try {
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
51
|
+
logRuntimeRecord({
|
|
52
|
+
runtime: "shared",
|
|
53
|
+
kind: "legacy",
|
|
54
|
+
phase: type,
|
|
55
|
+
summary: `${stepName} ${type}`,
|
|
56
|
+
payload: {
|
|
57
|
+
stepName,
|
|
58
|
+
type,
|
|
59
|
+
content,
|
|
60
|
+
},
|
|
61
|
+
});
|
|
46
62
|
}
|
|
47
63
|
catch (err) {
|
|
48
64
|
log(`ā Failed to append ${type} for ${stepName}:`, err);
|
|
@@ -54,10 +70,10 @@ export function logInputOutput(stepName, type, content) {
|
|
|
54
70
|
*/
|
|
55
71
|
export function clearRunLog() {
|
|
56
72
|
try {
|
|
57
|
-
|
|
58
|
-
fs.writeFileSync(RUN_LOG_PATH, "", { flag: "w" });
|
|
73
|
+
clearRuntimeLogs();
|
|
59
74
|
}
|
|
60
75
|
catch (err) {
|
|
61
|
-
log(`ā Failed to clear
|
|
76
|
+
log(`ā Failed to clear runtime logs:`, err);
|
|
62
77
|
}
|
|
63
78
|
}
|
|
79
|
+
//# sourceMappingURL=promptLogHelper.js.map
|