scai 0.1.178 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +171 -260
- package/dist/__tests__/CommitSuggesterCmd.test.js +112 -0
- package/dist/__tests__/CommitSuggesterCmd.test.js.map +1 -0
- package/dist/__tests__/EvalReportCmd.test.js +645 -0
- package/dist/__tests__/EvalReportCmd.test.js.map +1 -0
- package/dist/__tests__/ModelCmd.test.js +64 -0
- package/dist/__tests__/ModelCmd.test.js.map +1 -0
- package/dist/__tests__/agents/agentActions.test.js +345 -0
- package/dist/__tests__/agents/agentActions.test.js.map +1 -0
- package/dist/__tests__/agents/agentFeedback.test.js +118 -0
- package/dist/__tests__/agents/agentFeedback.test.js.map +1 -0
- package/dist/__tests__/agents/agentGeneralScope.test.js +74 -0
- package/dist/__tests__/agents/agentGeneralScope.test.js.map +1 -0
- package/dist/__tests__/agents/agentLoop.test.js +1723 -0
- package/dist/__tests__/agents/agentLoop.test.js.map +1 -0
- package/dist/__tests__/agents/agentPolicyState.test.js +948 -0
- package/dist/__tests__/agents/agentPolicyState.test.js.map +1 -0
- package/dist/__tests__/agents/agentReadEvidence.test.js +170 -0
- package/dist/__tests__/agents/agentReadEvidence.test.js.map +1 -0
- package/dist/__tests__/agents/agentReadPersistence.test.js +129 -0
- package/dist/__tests__/agents/agentReadPersistence.test.js.map +1 -0
- package/dist/__tests__/agents/agentResumeCheckpoint.test.js +90 -0
- package/dist/__tests__/agents/agentResumeCheckpoint.test.js.map +1 -0
- package/dist/__tests__/agents/agentSearchBatchPlanner.test.js +289 -0
- package/dist/__tests__/agents/agentSearchBatchPlanner.test.js.map +1 -0
- package/dist/__tests__/agents/agentSearchOwnership.test.js +166 -0
- package/dist/__tests__/agents/agentSearchOwnership.test.js.map +1 -0
- package/dist/__tests__/agents/agentSearchRanking.test.js +139 -0
- package/dist/__tests__/agents/agentSearchRanking.test.js.map +1 -0
- package/dist/__tests__/agents/agentSearchRouting.test.js +584 -0
- package/dist/__tests__/agents/agentSearchRouting.test.js.map +1 -0
- package/dist/__tests__/agents/agentSearchScoring.test.js +23 -0
- package/dist/__tests__/agents/agentSearchScoring.test.js.map +1 -0
- package/dist/__tests__/agents/agentSearchShared.test.js +78 -0
- package/dist/__tests__/agents/agentSearchShared.test.js.map +1 -0
- package/dist/__tests__/agents/agentStateMachine.test.js +58 -0
- package/dist/__tests__/agents/agentStateMachine.test.js.map +1 -0
- package/dist/__tests__/agents/agentTaskPersistence.test.js +156 -0
- package/dist/__tests__/agents/agentTaskPersistence.test.js.map +1 -0
- package/dist/__tests__/agents/agentTools.test.js +69 -0
- package/dist/__tests__/agents/agentTools.test.js.map +1 -0
- package/dist/__tests__/agents/agentTransform.test.js +779 -0
- package/dist/__tests__/agents/agentTransform.test.js.map +1 -0
- package/dist/__tests__/agents/analysisPlanGenStep.test.js +157 -0
- package/dist/__tests__/agents/analysisPlanGenStep.test.js.map +1 -0
- package/dist/__tests__/agents/answerOnlyCompletion.test.js +75 -0
- package/dist/__tests__/agents/answerOnlyCompletion.test.js.map +1 -0
- package/dist/__tests__/agents/decideNextAction.test.js +1662 -0
- package/dist/__tests__/agents/decideNextAction.test.js.map +1 -0
- package/dist/__tests__/agents/deriveFocusFromSearchStep.test.js +258 -0
- package/dist/__tests__/agents/deriveFocusFromSearchStep.test.js.map +1 -0
- package/dist/__tests__/agents/evidenceVerifierStep.test.js +113 -0
- package/dist/__tests__/agents/evidenceVerifierStep.test.js.map +1 -0
- package/dist/__tests__/agents/executionPolicyResolver.test.js +208 -0
- package/dist/__tests__/agents/executionPolicyResolver.test.js.map +1 -0
- package/dist/__tests__/agents/fileCheckStep.test.js +299 -0
- package/dist/__tests__/agents/fileCheckStep.test.js.map +1 -0
- package/dist/__tests__/agents/giveUpEvaluatorStep.test.js +35 -0
- package/dist/__tests__/agents/giveUpEvaluatorStep.test.js.map +1 -0
- package/dist/__tests__/agents/guardState.test.js +297 -0
- package/dist/__tests__/agents/guardState.test.js.map +1 -0
- package/dist/__tests__/agents/mainAgentHeuristics.test.js +72 -0
- package/dist/__tests__/agents/mainAgentHeuristics.test.js.map +1 -0
- package/dist/__tests__/agents/objectiveEvaluatorStep.test.js +60 -0
- package/dist/__tests__/agents/objectiveEvaluatorStep.test.js.map +1 -0
- package/dist/__tests__/agents/outerLoopRecoveryEvaluator.test.js +207 -0
- package/dist/__tests__/agents/outerLoopRecoveryEvaluator.test.js.map +1 -0
- package/dist/__tests__/agents/prompting.test.js +363 -0
- package/dist/__tests__/agents/prompting.test.js.map +1 -0
- package/dist/__tests__/agents/readinessGateStep.test.js +180 -0
- package/dist/__tests__/agents/readinessGateStep.test.js.map +1 -0
- package/dist/__tests__/agents/reasonNextStep.test.js +56 -0
- package/dist/__tests__/agents/reasonNextStep.test.js.map +1 -0
- package/dist/__tests__/agents/reasonNextTaskStep.test.js +284 -0
- package/dist/__tests__/agents/reasonNextTaskStep.test.js.map +1 -0
- package/dist/__tests__/agents/resolveAgentTargetClassification.test.js +170 -0
- package/dist/__tests__/agents/resolveAgentTargetClassification.test.js.map +1 -0
- package/dist/__tests__/agents/resolveProgressState.test.js +526 -0
- package/dist/__tests__/agents/resolveProgressState.test.js.map +1 -0
- package/dist/__tests__/agents/resumeCheckpoint.test.js +50 -0
- package/dist/__tests__/agents/resumeCheckpoint.test.js.map +1 -0
- package/dist/__tests__/agents/routingDecisionStep.test.js +134 -0
- package/dist/__tests__/agents/routingDecisionStep.test.js.map +1 -0
- package/dist/__tests__/agents/scopeClassificationStep.test.js +118 -0
- package/dist/__tests__/agents/scopeClassificationStep.test.js.map +1 -0
- package/dist/__tests__/agents/searchContext.test.js +97 -0
- package/dist/__tests__/agents/searchContext.test.js.map +1 -0
- package/dist/__tests__/agents/selectRelevantSourcesStep.test.js +73 -0
- package/dist/__tests__/agents/selectRelevantSourcesStep.test.js.map +1 -0
- package/dist/__tests__/agents/structuredOutput.test.js +45 -0
- package/dist/__tests__/agents/structuredOutput.test.js.map +1 -0
- package/dist/__tests__/agents/transformPlanGenStep.fallback.test.js +59 -0
- package/dist/__tests__/agents/transformPlanGenStep.fallback.test.js.map +1 -0
- package/dist/__tests__/agents/transformPlanGenStep.test.js +92 -0
- package/dist/__tests__/agents/transformPlanGenStep.test.js.map +1 -0
- package/dist/__tests__/agents/understandIntentStep.test.js +237 -0
- package/dist/__tests__/agents/understandIntentStep.test.js.map +1 -0
- package/dist/__tests__/agents/understandResumeContext.test.js +65 -0
- package/dist/__tests__/agents/understandResumeContext.test.js.map +1 -0
- package/dist/__tests__/agents/understandScope.test.js +227 -0
- package/dist/__tests__/agents/understandScope.test.js.map +1 -0
- package/dist/__tests__/agents/validateChangesStep.test.js +52 -0
- package/dist/__tests__/agents/validateChangesStep.test.js.map +1 -0
- package/dist/__tests__/askCommandTaskBinding.test.js +176 -0
- package/dist/__tests__/askCommandTaskBinding.test.js.map +1 -0
- package/dist/__tests__/commandVisibility.test.js +25 -0
- package/dist/__tests__/commandVisibility.test.js.map +1 -0
- package/dist/__tests__/config.devOutput.test.js +82 -0
- package/dist/__tests__/config.devOutput.test.js.map +1 -0
- package/dist/__tests__/currentContext.test.js +43 -0
- package/dist/__tests__/currentContext.test.js.map +1 -0
- package/dist/__tests__/daemonWorker.test.js +51 -0
- package/dist/__tests__/daemonWorker.test.js.map +1 -0
- package/dist/__tests__/dialogState.test.js +113 -0
- package/dist/__tests__/dialogState.test.js.map +1 -0
- package/dist/__tests__/evalCommands.test.js +506 -0
- package/dist/__tests__/evalCommands.test.js.map +1 -0
- package/dist/__tests__/evalCommandsSummary.test.js +68 -0
- package/dist/__tests__/evalCommandsSummary.test.js.map +1 -0
- package/dist/__tests__/example.test.js +1 -0
- package/dist/__tests__/example.test.js.map +1 -0
- package/dist/__tests__/factory.commitCommand.test.js +45 -0
- package/dist/__tests__/factory.commitCommand.test.js.map +1 -0
- package/dist/__tests__/factory.devOutputCommand.test.js +122 -0
- package/dist/__tests__/factory.devOutputCommand.test.js.map +1 -0
- package/dist/__tests__/factory.evalCommands.test.js +38 -0
- package/dist/__tests__/factory.evalCommands.test.js.map +1 -0
- package/dist/__tests__/factory.planCommand.test.js +35 -0
- package/dist/__tests__/factory.planCommand.test.js.map +1 -0
- package/dist/__tests__/factory.setupCommand.test.js +34 -0
- package/dist/__tests__/factory.setupCommand.test.js.map +1 -0
- package/dist/__tests__/factory.statusCommand.test.js +54 -0
- package/dist/__tests__/factory.statusCommand.test.js.map +1 -0
- package/dist/__tests__/fileRules/queryTokenRules.test.js +35 -0
- package/dist/__tests__/fileRules/queryTokenRules.test.js.map +1 -0
- package/dist/__tests__/fileRules/searchPathClassification.test.js +57 -0
- package/dist/__tests__/fileRules/searchPathClassification.test.js.map +1 -0
- package/dist/__tests__/generate.ollamaRecovery.test.js +344 -0
- package/dist/__tests__/generate.ollamaRecovery.test.js.map +1 -0
- package/dist/__tests__/index.modelStartup.test.js +24 -0
- package/dist/__tests__/index.modelStartup.test.js.map +1 -0
- package/dist/__tests__/indexCmd.test.js +85 -0
- package/dist/__tests__/indexCmd.test.js.map +1 -0
- package/dist/__tests__/indexSlashCommand.test.js +50 -0
- package/dist/__tests__/indexSlashCommand.test.js.map +1 -0
- package/dist/__tests__/ollamaService.test.js +103 -0
- package/dist/__tests__/ollamaService.test.js.map +1 -0
- package/dist/__tests__/pipeline/modules/codeTransformModule.small-file.test.js +68 -0
- package/dist/__tests__/pipeline/modules/codeTransformModule.small-file.test.js.map +1 -0
- package/dist/__tests__/pipeline/modules/commitSuggesterModule.test.js +68 -0
- package/dist/__tests__/pipeline/modules/commitSuggesterModule.test.js.map +1 -0
- package/dist/__tests__/pipeline/modules/fileSearchModule.test.js +284 -0
- package/dist/__tests__/pipeline/modules/fileSearchModule.test.js.map +1 -0
- package/dist/__tests__/pipeline/modules/finalAnswerModule.test.js +1139 -0
- package/dist/__tests__/pipeline/modules/finalAnswerModule.test.js.map +1 -0
- package/dist/__tests__/pipeline/modules/readFileModule.test.js +146 -0
- package/dist/__tests__/pipeline/modules/readFileModule.test.js.map +1 -0
- package/dist/__tests__/pipeline/modules/semanticAnalysisModule.test.js +192 -0
- package/dist/__tests__/pipeline/modules/semanticAnalysisModule.test.js.map +1 -0
- package/dist/__tests__/repoIdentity.test.js +31 -0
- package/dist/__tests__/repoIdentity.test.js.map +1 -0
- package/dist/__tests__/resumeContext.test.js +87 -0
- package/dist/__tests__/resumeContext.test.js.map +1 -0
- package/dist/__tests__/resumeState.test.js +239 -0
- package/dist/__tests__/resumeState.test.js.map +1 -0
- package/dist/__tests__/search/SearchOrchestrator.test.js +836 -0
- package/dist/__tests__/search/SearchOrchestrator.test.js.map +1 -0
- package/dist/__tests__/shellDialogUi.test.js +52 -0
- package/dist/__tests__/shellDialogUi.test.js.map +1 -0
- package/dist/__tests__/shellSession.test.js +102 -0
- package/dist/__tests__/shellSession.test.js.map +1 -0
- package/dist/__tests__/statusOwner.test.js +215 -0
- package/dist/__tests__/statusOwner.test.js.map +1 -0
- package/dist/__tests__/testing/contextEval.test.js +244 -0
- package/dist/__tests__/testing/contextEval.test.js.map +1 -0
- package/dist/__tests__/testing/harnessArtifacts.test.js +124 -0
- package/dist/__tests__/testing/harnessArtifacts.test.js.map +1 -0
- package/dist/__tests__/testing/llmTraceSession.test.js +67 -0
- package/dist/__tests__/testing/llmTraceSession.test.js.map +1 -0
- package/dist/__tests__/testing/registerDevCliCommands.test.js +35 -0
- package/dist/__tests__/testing/registerDevCliCommands.test.js.map +1 -0
- package/dist/__tests__/testing/runDiagnosis.test.js +159 -0
- package/dist/__tests__/testing/runDiagnosis.test.js.map +1 -0
- package/dist/__tests__/testing/runtimeLogReader.test.js +66 -0
- package/dist/__tests__/testing/runtimeLogReader.test.js.map +1 -0
- package/dist/__tests__/testing/testCommands.test.js +53 -0
- package/dist/__tests__/testing/testCommands.test.js.map +1 -0
- package/dist/__tests__/utils/compileSearchQuery.test.js +38 -0
- package/dist/__tests__/utils/compileSearchQuery.test.js.map +1 -0
- package/dist/__tests__/utils/consolePresentation.test.js +105 -0
- package/dist/__tests__/utils/consolePresentation.test.js.map +1 -0
- package/dist/__tests__/utils/extractFileReferences.test.js +41 -0
- package/dist/__tests__/utils/extractFileReferences.test.js.map +1 -0
- package/dist/__tests__/utils/log.test.js +34 -0
- package/dist/__tests__/utils/log.test.js.map +1 -0
- package/dist/__tests__/utils/runtimeLogger.test.js +200 -0
- package/dist/__tests__/utils/runtimeLogger.test.js.map +1 -0
- package/dist/__tests__/utils/spinner.test.js +31 -0
- package/dist/__tests__/utils/spinner.test.js.map +1 -0
- package/dist/__tests__/utils/verifyFocusPreference.test.js +41 -0
- package/dist/__tests__/utils/verifyFocusPreference.test.js.map +1 -0
- package/dist/agent/actions/index.js +301 -0
- package/dist/agent/actions/index.js.map +1 -0
- package/dist/agent/actions/normalize.js +360 -0
- package/dist/agent/actions/normalize.js.map +1 -0
- package/dist/agent/actions/schemas.js +129 -0
- package/dist/agent/actions/schemas.js.map +1 -0
- package/dist/agent/evidence/index.js +320 -0
- package/dist/agent/evidence/index.js.map +1 -0
- package/dist/agent/feedback/index.js +187 -0
- package/dist/agent/feedback/index.js.map +1 -0
- package/dist/agent/finalization/index.js +35 -0
- package/dist/agent/finalization/index.js.map +1 -0
- package/dist/agent/index.js +126 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/agent/logging/index.js +350 -0
- package/dist/agent/logging/index.js.map +1 -0
- package/dist/agent/persistence/boot.js +58 -0
- package/dist/agent/persistence/boot.js.map +1 -0
- package/dist/agent/persistence/currentTask.js +36 -0
- package/dist/agent/persistence/currentTask.js.map +1 -0
- package/dist/agent/persistence/hydrate.js +42 -0
- package/dist/agent/persistence/hydrate.js.map +1 -0
- package/dist/agent/persistence/index.js +15 -0
- package/dist/agent/persistence/index.js.map +1 -0
- package/dist/agent/persistence/snapshots.js +97 -0
- package/dist/agent/persistence/snapshots.js.map +1 -0
- package/dist/agent/persistence/steps.js +95 -0
- package/dist/agent/persistence/steps.js.map +1 -0
- package/dist/agent/persistence/tasks.js +195 -0
- package/dist/agent/persistence/tasks.js.map +1 -0
- package/dist/agent/persistence/turns.js +92 -0
- package/dist/agent/persistence/turns.js.map +1 -0
- package/dist/agent/policy/ambiguityResolution.js +226 -0
- package/dist/agent/policy/ambiguityResolution.js.map +1 -0
- package/dist/agent/policy/contracts.js +2 -0
- package/dist/agent/policy/contracts.js.map +1 -0
- package/dist/agent/policy/coveragePolicy.js +309 -0
- package/dist/agent/policy/coveragePolicy.js.map +1 -0
- package/dist/agent/policy/endDecisionPolicy.js +31 -0
- package/dist/agent/policy/endDecisionPolicy.js.map +1 -0
- package/dist/agent/policy/index.js +344 -0
- package/dist/agent/policy/index.js.map +1 -0
- package/dist/agent/policy/loopReview.js +778 -0
- package/dist/agent/policy/loopReview.js.map +1 -0
- package/dist/agent/policy/readinessPolicy.js +108 -0
- package/dist/agent/policy/readinessPolicy.js.map +1 -0
- package/dist/agent/policy/resolutionPipeline.js +356 -0
- package/dist/agent/policy/resolutionPipeline.js.map +1 -0
- package/dist/agent/policy/targetClassification.js +33 -0
- package/dist/agent/policy/targetClassification.js.map +1 -0
- package/dist/agent/prompting/actionChoice.js +90 -0
- package/dist/agent/prompting/actionChoice.js.map +1 -0
- package/dist/agent/prompting/finalAnswer.js +38 -0
- package/dist/agent/prompting/finalAnswer.js.map +1 -0
- package/dist/agent/prompting/index.js +14 -0
- package/dist/agent/prompting/index.js.map +1 -0
- package/dist/agent/prompting/plan.js +59 -0
- package/dist/agent/prompting/plan.js.map +1 -0
- package/dist/agent/prompting/transform.js +175 -0
- package/dist/agent/prompting/transform.js.map +1 -0
- package/dist/agent/prompting/understand.js +70 -0
- package/dist/agent/prompting/understand.js.map +1 -0
- package/dist/agent/read/freshness.js +29 -0
- package/dist/agent/read/freshness.js.map +1 -0
- package/dist/agent/read/fullReadPrompt.js +43 -0
- package/dist/agent/read/fullReadPrompt.js.map +1 -0
- package/dist/agent/read/index.js +140 -0
- package/dist/agent/read/index.js.map +1 -0
- package/dist/agent/read/persistence.js +88 -0
- package/dist/agent/read/persistence.js.map +1 -0
- package/dist/agent/read/summarizeReadEvidence.js +733 -0
- package/dist/agent/read/summarizeReadEvidence.js.map +1 -0
- package/dist/agent/read/targetResolution.js +126 -0
- package/dist/agent/read/targetResolution.js.map +1 -0
- package/dist/agent/resume/checkpoint.js +41 -0
- package/dist/agent/resume/checkpoint.js.map +1 -0
- package/dist/agent/runtime/lifecycle.js +67 -0
- package/dist/agent/runtime/lifecycle.js.map +1 -0
- package/dist/agent/runtime/progress.js +178 -0
- package/dist/agent/runtime/progress.js.map +1 -0
- package/dist/agent/runtime/runAgentLoop.js +402 -0
- package/dist/agent/runtime/runAgentLoop.js.map +1 -0
- package/dist/agent/runtime/runAgentPlanOnly.js +127 -0
- package/dist/agent/runtime/runAgentPlanOnly.js.map +1 -0
- package/dist/agent/runtime/understand.js +336 -0
- package/dist/agent/runtime/understand.js.map +1 -0
- package/dist/agent/search/batchPlanner.js +274 -0
- package/dist/agent/search/batchPlanner.js.map +1 -0
- package/dist/agent/search/candidateRetentionPolicy.js +184 -0
- package/dist/agent/search/candidateRetentionPolicy.js.map +1 -0
- package/dist/agent/search/directory.js +51 -0
- package/dist/agent/search/directory.js.map +1 -0
- package/dist/agent/search/exactTarget.js +151 -0
- package/dist/agent/search/exactTarget.js.map +1 -0
- package/dist/agent/search/fragment.js +110 -0
- package/dist/agent/search/fragment.js.map +1 -0
- package/dist/agent/search/index.js +166 -0
- package/dist/agent/search/index.js.map +1 -0
- package/dist/agent/search/laneClassifier.js +119 -0
- package/dist/agent/search/laneClassifier.js.map +1 -0
- package/dist/agent/search/limits.js +10 -0
- package/dist/agent/search/limits.js.map +1 -0
- package/dist/agent/search/ranking.js +22 -0
- package/dist/agent/search/ranking.js.map +1 -0
- package/dist/agent/search/regex.js +83 -0
- package/dist/agent/search/regex.js.map +1 -0
- package/dist/agent/search/routePolicy.js +11 -0
- package/dist/agent/search/routePolicy.js.map +1 -0
- package/dist/agent/search/searchContext.js +128 -0
- package/dist/agent/search/searchContext.js.map +1 -0
- package/dist/agent/search/semantic.js +113 -0
- package/dist/agent/search/semantic.js.map +1 -0
- package/dist/agent/search/semanticIndexSearch.js +202 -0
- package/dist/agent/search/semanticIndexSearch.js.map +1 -0
- package/dist/agent/search/shared.js +283 -0
- package/dist/agent/search/shared.js.map +1 -0
- package/dist/agent/search/shell.js +202 -0
- package/dist/agent/search/shell.js.map +1 -0
- package/dist/agent/search/snippetEvidence.js +57 -0
- package/dist/agent/search/snippetEvidence.js.map +1 -0
- package/dist/agent/search/types.js +2 -0
- package/dist/agent/search/types.js.map +1 -0
- package/dist/agent/state/index.js +99 -0
- package/dist/agent/state/index.js.map +1 -0
- package/dist/agent/state/memory.js +56 -0
- package/dist/agent/state/memory.js.map +1 -0
- package/dist/agent/structuredOutput/index.js +28 -0
- package/dist/agent/structuredOutput/index.js.map +1 -0
- package/dist/agent/tools/index.js +199 -0
- package/dist/agent/tools/index.js.map +1 -0
- package/dist/agent/transform/index.js +519 -0
- package/dist/agent/transform/index.js.map +1 -0
- package/dist/agent/transform/syntax.js +49 -0
- package/dist/agent/transform/syntax.js.map +1 -0
- package/dist/agent/types.js +20 -0
- package/dist/agent/types.js.map +1 -0
- package/dist/agents/actionRegistry.js +114 -0
- package/dist/agents/actionRegistry.js.map +1 -0
- package/dist/agents/agent.js +5 -0
- package/dist/agents/agent.js.map +1 -0
- package/dist/agents/agentActions.js +5 -0
- package/dist/agents/agentActions.js.map +1 -0
- package/dist/agents/agentEvidence.js +5 -0
- package/dist/agents/agentEvidence.js.map +1 -0
- package/dist/agents/agentFeedback.js +5 -0
- package/dist/agents/agentFeedback.js.map +1 -0
- package/dist/agents/agentLogging.js +5 -0
- package/dist/agents/agentLogging.js.map +1 -0
- package/dist/agents/agentLoop.js +5 -0
- package/dist/agents/agentLoop.js.map +1 -0
- package/dist/agents/agentMemory.js +5 -0
- package/dist/agents/agentMemory.js.map +1 -0
- package/dist/agents/agentPlanMode.js +5 -0
- package/dist/agents/agentPlanMode.js.map +1 -0
- package/dist/agents/agentPolicyState.js +5 -0
- package/dist/agents/agentPolicyState.js.map +1 -0
- package/dist/agents/agentProgress.js +93 -0
- package/dist/agents/agentProgress.js.map +1 -0
- package/dist/agents/agentSchemas.js +5 -0
- package/dist/agents/agentSchemas.js.map +1 -0
- package/dist/agents/agentSearchScoring.js +5 -0
- package/dist/agents/agentSearchScoring.js.map +1 -0
- package/dist/agents/agentStateMachine.js +5 -0
- package/dist/agents/agentStateMachine.js.map +1 -0
- package/dist/agents/agentTools.js +5 -0
- package/dist/agents/agentTools.js.map +1 -0
- package/dist/agents/agentTypes.js +5 -0
- package/dist/agents/agentTypes.js.map +1 -0
- package/dist/agents/agentUnderstand.js +5 -0
- package/dist/agents/agentUnderstand.js.map +1 -0
- package/dist/agents/analysisPlanGenStep.js +194 -17
- package/dist/agents/analysisPlanGenStep.js.map +1 -0
- package/dist/agents/answerOnlyCompletion.js +32 -0
- package/dist/agents/answerOnlyCompletion.js.map +1 -0
- package/dist/agents/collaboratorStep.js +1 -0
- package/dist/agents/collaboratorStep.js.map +1 -0
- package/dist/agents/decideNextAction.js +444 -0
- package/dist/agents/decideNextAction.js.map +1 -0
- package/dist/agents/deriveFocusFromSearchStep.js +83 -0
- package/dist/agents/deriveFocusFromSearchStep.js.map +1 -0
- package/dist/agents/evidenceVerifierStep.js +104 -13
- package/dist/agents/evidenceVerifierStep.js.map +1 -0
- package/dist/agents/fileCheckStep.js +381 -12
- package/dist/agents/fileCheckStep.js.map +1 -0
- package/dist/agents/giveUpEvaluatorStep.js +63 -0
- package/dist/agents/giveUpEvaluatorStep.js.map +1 -0
- package/dist/agents/guardPolicy.js +20 -0
- package/dist/agents/guardPolicy.js.map +1 -0
- package/dist/agents/guards/executionPolicyResolver.js +165 -0
- package/dist/agents/guards/executionPolicyResolver.js.map +1 -0
- package/dist/agents/guards/guardState.js +195 -0
- package/dist/agents/guards/guardState.js.map +1 -0
- package/dist/agents/guards/resolveProgressState.js +403 -0
- package/dist/agents/guards/resolveProgressState.js.map +1 -0
- package/dist/agents/infoPlanGenStep.js +66 -8
- package/dist/agents/infoPlanGenStep.js.map +1 -0
- package/dist/agents/integrateFeedbackStep.js +1 -0
- package/dist/agents/integrateFeedbackStep.js.map +1 -0
- package/dist/agents/iterationFileSelector.js +8 -7
- package/dist/agents/iterationFileSelector.js.map +1 -0
- package/dist/agents/mainAgentActivityLog.js +85 -0
- package/dist/agents/mainAgentActivityLog.js.map +1 -0
- package/dist/agents/mainAgentHeuristics.js +173 -0
- package/dist/agents/mainAgentHeuristics.js.map +1 -0
- package/dist/agents/mainAgentVerify.js +159 -0
- package/dist/agents/mainAgentVerify.js.map +1 -0
- package/dist/agents/objectiveEvaluatorStep.js +103 -0
- package/dist/agents/objectiveEvaluatorStep.js.map +1 -0
- package/dist/agents/outerLoopRecoveryEvaluator.js +108 -0
- package/dist/agents/outerLoopRecoveryEvaluator.js.map +1 -0
- package/dist/agents/readinessGateStep.js +95 -9
- package/dist/agents/readinessGateStep.js.map +1 -0
- package/dist/agents/reasonNextStep.js +9 -8
- package/dist/agents/reasonNextStep.js.map +1 -0
- package/dist/agents/reasonNextTaskStep.js +267 -144
- package/dist/agents/reasonNextTaskStep.js.map +1 -0
- package/dist/agents/researchPlanGenStep.js +61 -25
- package/dist/agents/researchPlanGenStep.js.map +1 -0
- package/dist/agents/resolveAgentTargetClassification.js +5 -0
- package/dist/agents/resolveAgentTargetClassification.js.map +1 -0
- package/dist/agents/resolveExecutionModeStep.js +1 -0
- package/dist/agents/resolveExecutionModeStep.js.map +1 -0
- package/dist/agents/resolveExplicitTargetsStep.js +74 -0
- package/dist/agents/resolveExplicitTargetsStep.js.map +1 -0
- package/dist/agents/routingDecisionStep.js +58 -11
- package/dist/agents/routingDecisionStep.js.map +1 -0
- package/dist/agents/scopeClassificationStep.js +66 -3
- package/dist/agents/scopeClassificationStep.js.map +1 -0
- package/dist/agents/selectRelevantSourcesStep.js +13 -5
- package/dist/agents/selectRelevantSourcesStep.js.map +1 -0
- package/dist/agents/structuralPreloadStep.js +3 -4
- package/dist/agents/structuralPreloadStep.js.map +1 -0
- package/dist/agents/transformPlanGenStep.js +105 -18
- package/dist/agents/transformPlanGenStep.js.map +1 -0
- package/dist/agents/understandIntentStep.js +237 -17
- package/dist/agents/understandIntentStep.js.map +1 -0
- package/dist/agents/validateChangesStep.js +16 -2
- package/dist/agents/validateChangesStep.js.map +1 -0
- package/dist/agents/writeFileStep.js +1 -0
- package/dist/agents/writeFileStep.js.map +1 -0
- package/dist/commands/AskCmd.js +139 -44
- package/dist/commands/AskCmd.js.map +1 -0
- package/dist/commands/BackupCmd.js +1 -0
- package/dist/commands/BackupCmd.js.map +1 -0
- package/dist/commands/ChangeLogUpdateCmd.js +1 -0
- package/dist/commands/ChangeLogUpdateCmd.js.map +1 -0
- package/dist/commands/CommitSuggesterCmd.js +55 -13
- package/dist/commands/CommitSuggesterCmd.js.map +1 -0
- package/dist/commands/DaemonCmd.js +52 -14
- package/dist/commands/DaemonCmd.js.map +1 -0
- package/dist/commands/DeleteIndex.js +1 -0
- package/dist/commands/DeleteIndex.js.map +1 -0
- package/dist/commands/EvalReportCmd.js +374 -0
- package/dist/commands/EvalReportCmd.js.map +1 -0
- package/dist/commands/FindCmd.js +1 -0
- package/dist/commands/FindCmd.js.map +1 -0
- package/dist/commands/GitCmd.js +1 -0
- package/dist/commands/GitCmd.js.map +1 -0
- package/dist/commands/IndexCmd.js +11 -79
- package/dist/commands/IndexCmd.js.map +1 -0
- package/dist/commands/InspectCmd.js +1 -0
- package/dist/commands/InspectCmd.js.map +1 -0
- package/dist/commands/ModelCmd.js +24 -0
- package/dist/commands/ModelCmd.js.map +1 -0
- package/dist/commands/ReadlineSingleton.js +1 -0
- package/dist/commands/ReadlineSingleton.js.map +1 -0
- package/dist/commands/ResetDbCmd.js +18 -1
- package/dist/commands/ResetDbCmd.js.map +1 -0
- package/dist/commands/ReviewCmd.js +1 -0
- package/dist/commands/ReviewCmd.js.map +1 -0
- package/dist/commands/StatusCmd.js +22 -0
- package/dist/commands/StatusCmd.js.map +1 -0
- package/dist/commands/StopDaemonCmd.js +1 -0
- package/dist/commands/StopDaemonCmd.js.map +1 -0
- package/dist/commands/SummaryCmd.js +1 -0
- package/dist/commands/SummaryCmd.js.map +1 -0
- package/dist/commands/SwitchCmd.js +9 -15
- package/dist/commands/SwitchCmd.js.map +1 -0
- package/dist/commands/TasksCmd.js +142 -57
- package/dist/commands/TasksCmd.js.map +1 -0
- package/dist/commands/TestCmd.js +66 -0
- package/dist/commands/TestCmd.js.map +1 -0
- package/dist/commands/WorkflowCmd.js +1 -0
- package/dist/commands/WorkflowCmd.js.map +1 -0
- package/dist/commands/commandVisibility.js +27 -0
- package/dist/commands/commandVisibility.js.map +1 -0
- package/dist/commands/evalCommands.js +1337 -0
- package/dist/commands/evalCommands.js.map +1 -0
- package/dist/commands/factory.js +206 -38
- package/dist/commands/factory.js.map +1 -0
- package/dist/config.js +62 -11
- package/dist/config.js.map +1 -0
- package/dist/constants.js +21 -3
- package/dist/constants.js.map +1 -0
- package/dist/context.js +33 -32
- package/dist/context.js.map +1 -0
- package/dist/daemon/daemonQueues.js +1 -20
- package/dist/daemon/daemonQueues.js.map +1 -0
- package/dist/daemon/daemonWorker.js +26 -37
- package/dist/daemon/daemonWorker.js.map +1 -0
- package/dist/daemon/generateSummaries.js +1 -0
- package/dist/daemon/generateSummaries.js.map +1 -0
- package/dist/daemon/runFolderCapsuleBatch.js +1 -0
- package/dist/daemon/runFolderCapsuleBatch.js.map +1 -0
- package/dist/daemon/runIndexingBatch.js +1 -0
- package/dist/daemon/runIndexingBatch.js.map +1 -0
- package/dist/daemon/runKgBatch.js +9 -1
- package/dist/daemon/runKgBatch.js.map +1 -0
- package/dist/db/backup.js +1 -0
- package/dist/db/backup.js.map +1 -0
- package/dist/db/client.js +18 -3
- package/dist/db/client.js.map +1 -0
- package/dist/db/fileIndex.js +110 -152
- package/dist/db/fileIndex.js.map +1 -0
- package/dist/db/functionExtractors/extractFromJava.js +1 -0
- package/dist/db/functionExtractors/extractFromJava.js.map +1 -0
- package/dist/db/functionExtractors/extractFromJs.js +1 -0
- package/dist/db/functionExtractors/extractFromJs.js.map +1 -0
- package/dist/db/functionExtractors/extractFromTs.js +1 -0
- package/dist/db/functionExtractors/extractFromTs.js.map +1 -0
- package/dist/db/functionExtractors/extractFromXML.js +1 -0
- package/dist/db/functionExtractors/extractFromXML.js.map +1 -0
- package/dist/db/functionExtractors/index.js +1 -0
- package/dist/db/functionExtractors/index.js.map +1 -0
- package/dist/db/functionIndex.js +9 -0
- package/dist/db/functionIndex.js.map +1 -0
- package/dist/db/schema.js +314 -99
- package/dist/db/schema.js.map +1 -0
- package/dist/db/sqlTemplates.js +1 -0
- package/dist/db/sqlTemplates.js.map +1 -0
- package/dist/fileRules/builtins.js +1 -0
- package/dist/fileRules/builtins.js.map +1 -0
- package/dist/fileRules/classifyFile.js +1 -0
- package/dist/fileRules/classifyFile.js.map +1 -0
- package/dist/fileRules/codeAllowedExtensions.js +1 -0
- package/dist/fileRules/codeAllowedExtensions.js.map +1 -0
- package/dist/fileRules/detectFileType.js +1 -0
- package/dist/fileRules/detectFileType.js.map +1 -0
- package/dist/fileRules/fileClassifier.js +1 -0
- package/dist/fileRules/fileClassifier.js.map +1 -0
- package/dist/fileRules/fileExceptions.js +1 -0
- package/dist/fileRules/fileExceptions.js.map +1 -0
- package/dist/fileRules/ignoredExtensions.js +1 -0
- package/dist/fileRules/ignoredExtensions.js.map +1 -0
- package/dist/fileRules/ignoredPaths.js +48 -5
- package/dist/fileRules/ignoredPaths.js.map +1 -0
- package/dist/fileRules/queryTokenRules.js +176 -0
- package/dist/fileRules/queryTokenRules.js.map +1 -0
- package/dist/fileRules/searchPathClassification.js +58 -0
- package/dist/fileRules/searchPathClassification.js.map +1 -0
- package/dist/fileRules/shouldIgnoreFiles.js +1 -0
- package/dist/fileRules/shouldIgnoreFiles.js.map +1 -0
- package/dist/fileRules/stopWords.js +9 -0
- package/dist/fileRules/stopWords.js.map +1 -0
- package/dist/fileRules/wellKnownRepoFiles.js +1 -0
- package/dist/fileRules/wellKnownRepoFiles.js.map +1 -0
- package/dist/git/commitSummary.js +227 -0
- package/dist/git/commitSummary.js.map +1 -0
- package/dist/github/api.js +1 -0
- package/dist/github/api.js.map +1 -0
- package/dist/github/auth.js +1 -0
- package/dist/github/auth.js.map +1 -0
- package/dist/github/github.js +1 -0
- package/dist/github/github.js.map +1 -0
- package/dist/github/githubAuthCheck.js +1 -0
- package/dist/github/githubAuthCheck.js.map +1 -0
- package/dist/github/postComments.js +1 -0
- package/dist/github/postComments.js.map +1 -0
- package/dist/github/repo.js +15 -24
- package/dist/github/repo.js.map +1 -0
- package/dist/github/token.js +1 -0
- package/dist/github/token.js.map +1 -0
- package/dist/github/types.js +1 -0
- package/dist/github/types.js.map +1 -0
- package/dist/index.js +318 -37
- package/dist/index.js.map +1 -0
- package/dist/lib/generate.js +264 -20
- package/dist/lib/generate.js.map +1 -0
- package/dist/lib/generateFolderCapsules.js +1 -0
- package/dist/lib/generateFolderCapsules.js.map +1 -0
- package/dist/lib/ollamaModelPolicy.js +59 -0
- package/dist/lib/ollamaModelPolicy.js.map +1 -0
- package/dist/lib/spinner.js +29 -9
- package/dist/lib/spinner.js.map +1 -0
- package/dist/modelSetup.js +25 -78
- package/dist/modelSetup.js.map +1 -0
- package/dist/pipeline/modules/changeLogModule.js +10 -1
- package/dist/pipeline/modules/changeLogModule.js.map +1 -0
- package/dist/pipeline/modules/cleanupModule.js +1 -0
- package/dist/pipeline/modules/cleanupModule.js.map +1 -0
- package/dist/pipeline/modules/codeTransformModule.js +10 -16
- package/dist/pipeline/modules/codeTransformModule.js.map +1 -0
- package/dist/pipeline/modules/commentModule.js +12 -0
- package/dist/pipeline/modules/commentModule.js.map +1 -0
- package/dist/pipeline/modules/commitSuggesterModule.js +82 -12
- package/dist/pipeline/modules/commitSuggesterModule.js.map +1 -0
- package/dist/pipeline/modules/contextReviewModule.js +12 -1
- package/dist/pipeline/modules/contextReviewModule.js.map +1 -0
- package/dist/pipeline/modules/dialogAnswerModule.js +58 -0
- package/dist/pipeline/modules/dialogAnswerModule.js.map +1 -0
- package/dist/pipeline/modules/fileSearchModule.js +5 -143
- package/dist/pipeline/modules/fileSearchModule.js.map +1 -0
- package/dist/pipeline/modules/finalAnswerModule.js +1176 -151
- package/dist/pipeline/modules/finalAnswerModule.js.map +1 -0
- package/dist/pipeline/modules/kgModule.js +18 -1
- package/dist/pipeline/modules/kgModule.js.map +1 -0
- package/dist/pipeline/modules/planAnswerModule.js +99 -0
- package/dist/pipeline/modules/planAnswerModule.js.map +1 -0
- package/dist/pipeline/modules/readFileModule.js +300 -0
- package/dist/pipeline/modules/readFileModule.js.map +1 -0
- package/dist/pipeline/modules/reviewModule.js +10 -1
- package/dist/pipeline/modules/reviewModule.js.map +1 -0
- package/dist/pipeline/modules/searchDbModule.js +159 -0
- package/dist/pipeline/modules/searchDbModule.js.map +1 -0
- package/dist/pipeline/modules/searchListDirectoryModule.js +62 -0
- package/dist/pipeline/modules/searchListDirectoryModule.js.map +1 -0
- package/dist/pipeline/modules/searchModuleShared.js +71 -0
- package/dist/pipeline/modules/searchModuleShared.js.map +1 -0
- package/dist/pipeline/modules/searchRegexModule.js +59 -0
- package/dist/pipeline/modules/searchRegexModule.js.map +1 -0
- package/dist/pipeline/modules/semanticAnalysisModule.js +185 -28
- package/dist/pipeline/modules/semanticAnalysisModule.js.map +1 -0
- package/dist/pipeline/modules/summaryModule.js +11 -1
- package/dist/pipeline/modules/summaryModule.js.map +1 -0
- package/dist/pipeline/registry/moduleRegistry.js +9 -0
- package/dist/pipeline/registry/moduleRegistry.js.map +1 -0
- package/dist/pipeline/runModulePipeline.js +1 -0
- package/dist/pipeline/runModulePipeline.js.map +1 -0
- package/dist/scripts/dbScriptSupport.js +172 -0
- package/dist/scripts/dbScriptSupport.js.map +1 -0
- package/dist/scripts/dbcheck.js +173 -267
- package/dist/scripts/dbcheck.js.map +1 -0
- package/dist/scripts/dboverview.js +161 -0
- package/dist/scripts/dboverview.js.map +1 -0
- package/dist/scripts/migrateDb.js +1 -0
- package/dist/scripts/migrateDb.js.map +1 -0
- package/dist/search/SearchOrchestrator.js +928 -0
- package/dist/search/SearchOrchestrator.js.map +1 -0
- package/dist/search/sharedRankingPolicy.js +283 -0
- package/dist/search/sharedRankingPolicy.js.map +1 -0
- package/dist/setup/reindexOwner.js +97 -0
- package/dist/setup/reindexOwner.js.map +1 -0
- package/dist/setup/setupOwner.js +100 -0
- package/dist/setup/setupOwner.js.map +1 -0
- package/dist/shell/dialogUi.js +81 -0
- package/dist/shell/dialogUi.js.map +1 -0
- package/dist/shellSession.js +126 -0
- package/dist/shellSession.js.map +1 -0
- package/dist/status/statusOwner.js +239 -0
- package/dist/status/statusOwner.js.map +1 -0
- package/dist/testing/contextEval.js +514 -0
- package/dist/testing/contextEval.js.map +1 -0
- package/dist/testing/fixtures/transform/small-file.input.js +5 -0
- package/dist/testing/fixtures/transform/small-file.input.js.map +1 -0
- package/dist/testing/harnessArtifacts.js +112 -0
- package/dist/testing/harnessArtifacts.js.map +1 -0
- package/dist/testing/llmTraceSession.js +67 -0
- package/dist/testing/llmTraceSession.js.map +1 -0
- package/dist/testing/registerDevCliCommands.js +43 -0
- package/dist/testing/registerDevCliCommands.js.map +1 -0
- package/dist/testing/runDiagnosis.js +248 -0
- package/dist/testing/runDiagnosis.js.map +1 -0
- package/dist/testing/runtimeLogReader.js +144 -0
- package/dist/testing/runtimeLogReader.js.map +1 -0
- package/dist/testing/testCommands.js +35 -303
- package/dist/testing/testCommands.js.map +1 -0
- package/dist/testing/testRegistry.js +233 -0
- package/dist/testing/testRegistry.js.map +1 -0
- package/dist/types.js +1 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/buildContextualPrompt.js +26 -75
- package/dist/utils/buildContextualPrompt.js.map +1 -0
- package/dist/utils/changeLogPrompt.js +1 -0
- package/dist/utils/changeLogPrompt.js.map +1 -0
- package/dist/utils/checkModel.js +17 -92
- package/dist/utils/checkModel.js.map +1 -0
- package/dist/utils/commentMap.js +1 -0
- package/dist/utils/commentMap.js.map +1 -0
- package/dist/utils/compileSearchQuery.js +23 -9
- package/dist/utils/compileSearchQuery.js.map +1 -0
- package/dist/utils/consolePresentation.js +208 -0
- package/dist/utils/consolePresentation.js.map +1 -0
- package/dist/utils/contentUtils.js +17 -2
- package/dist/utils/contentUtils.js.map +1 -0
- package/dist/utils/debugContext.js +1 -0
- package/dist/utils/debugContext.js.map +1 -0
- package/dist/utils/dialogState.js +201 -0
- package/dist/utils/dialogState.js.map +1 -0
- package/dist/utils/editor.js +1 -0
- package/dist/utils/editor.js.map +1 -0
- package/dist/utils/executionEvidence.js +50 -0
- package/dist/utils/executionEvidence.js.map +1 -0
- package/dist/utils/extractFileReferences.js +140 -6
- package/dist/utils/extractFileReferences.js.map +1 -0
- package/dist/utils/fileEvidenceCache.js +50 -0
- package/dist/utils/fileEvidenceCache.js.map +1 -0
- package/dist/utils/fileTree.js +1 -0
- package/dist/utils/fileTree.js.map +1 -0
- package/dist/utils/loadRelevantFolderCapsules.js +35 -5
- package/dist/utils/loadRelevantFolderCapsules.js.map +1 -0
- package/dist/utils/log.js +10 -1
- package/dist/utils/log.js.map +1 -0
- package/dist/utils/normalizeData.js +1 -0
- package/dist/utils/normalizeData.js.map +1 -0
- package/dist/utils/ollamaModelStatus.js +28 -0
- package/dist/utils/ollamaModelStatus.js.map +1 -0
- package/dist/utils/ollamaService.js +294 -0
- package/dist/utils/ollamaService.js.map +1 -0
- package/dist/utils/outputFormatter.js +1 -0
- package/dist/utils/outputFormatter.js.map +1 -0
- package/dist/utils/parseTaggedContent.js +1 -0
- package/dist/utils/parseTaggedContent.js.map +1 -0
- package/dist/utils/planActions.js +27 -46
- package/dist/utils/planActions.js.map +1 -0
- package/dist/utils/promptBuilderHelper.js +1 -0
- package/dist/utils/promptBuilderHelper.js.map +1 -0
- package/dist/utils/promptLogHelper.js +29 -13
- package/dist/utils/promptLogHelper.js.map +1 -0
- package/dist/utils/queryAnchors.js +71 -0
- package/dist/utils/queryAnchors.js.map +1 -0
- package/dist/utils/repoIdentity.js +82 -0
- package/dist/utils/repoIdentity.js.map +1 -0
- package/dist/utils/repoKey.js +1 -0
- package/dist/utils/repoKey.js.map +1 -0
- package/dist/utils/resolveTargetsToFiles.js +1 -0
- package/dist/utils/resolveTargetsToFiles.js.map +1 -0
- package/dist/utils/resumeContext.js +219 -0
- package/dist/utils/resumeContext.js.map +1 -0
- package/dist/utils/resumeState.js +310 -0
- package/dist/utils/resumeState.js.map +1 -0
- package/dist/utils/rollingPlan.js +118 -0
- package/dist/utils/rollingPlan.js.map +1 -0
- package/dist/utils/runQueryWithDaemonControl.js +11 -3
- package/dist/utils/runQueryWithDaemonControl.js.map +1 -0
- package/dist/utils/runtimeLogger.js +252 -0
- package/dist/utils/runtimeLogger.js.map +1 -0
- package/dist/utils/sanitizeQuery.js +1 -0
- package/dist/utils/sanitizeQuery.js.map +1 -0
- package/dist/utils/sharedUtils.js +1 -0
- package/dist/utils/sharedUtils.js.map +1 -0
- package/dist/utils/sleep.js +1 -0
- package/dist/utils/sleep.js.map +1 -0
- package/dist/utils/splitCodeIntoChunk.js +1 -0
- package/dist/utils/splitCodeIntoChunk.js.map +1 -0
- package/dist/utils/time.js +66 -0
- package/dist/utils/time.js.map +1 -0
- package/dist/utils/verifyFocusPreference.js +107 -0
- package/dist/utils/verifyFocusPreference.js.map +1 -0
- package/dist/utils/vscode.js +1 -0
- package/dist/utils/vscode.js.map +1 -0
- package/dist/workflow/workflowResolver.js +1 -0
- package/dist/workflow/workflowResolver.js.map +1 -0
- package/dist/workflow/workflowRunner.js +1 -0
- package/dist/workflow/workflowRunner.js.map +1 -0
- package/package.json +3 -3
- package/dist/agents/MainAgent.js +0 -1886
- package/dist/agents/contextReviewStep.js +0 -101
- package/dist/agents/finalPlanGenStep.js +0 -107
- package/dist/agents/structuralAnalysisStep.js +0 -46
- package/dist/agents/validationAnalysisStep.js +0 -87
- package/dist/pipeline/modules/chunkManagerModule.js +0 -24
- package/dist/pipeline/modules/cleanGeneratedTestsModule.js +0 -33
- package/dist/pipeline/modules/fileReaderModule.js +0 -72
- package/dist/pipeline/modules/gatherInfoModule.js +0 -181
- package/dist/pipeline/modules/generateTestsModule.js +0 -68
- package/dist/pipeline/modules/preserveCodeModule.js +0 -195
- package/dist/pipeline/modules/refactorModule.js +0 -40
- package/dist/pipeline/modules/repairTestsModule.js +0 -48
- package/dist/pipeline/modules/runTestsModule.js +0 -37
package/dist/modelSetup.js
CHANGED
|
@@ -1,36 +1,22 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Bootstraps local model availability for commands that explicitly own setup.
|
|
3
|
+
*
|
|
4
|
+
* Why this file exists:
|
|
5
|
+
* - explicit setup should verify Ollama before model-backed flows rely on it
|
|
6
|
+
* - recommended model suggestions should stay in one small owner
|
|
7
|
+
* - unrelated repo setup should not leak into model-only bootstrap logic
|
|
8
|
+
*/
|
|
9
|
+
import { execSync } from 'child_process';
|
|
2
10
|
import * as readline from 'readline';
|
|
3
|
-
import * as fs from 'fs';
|
|
4
|
-
import * as path from 'path';
|
|
5
11
|
import chalk from 'chalk';
|
|
6
12
|
import { platform } from 'os';
|
|
7
|
-
import {
|
|
8
|
-
import { readConfig, writeConfig } from './config.js';
|
|
9
|
-
import { CONFIG_PATH } from './constants.js';
|
|
13
|
+
import { probeOllamaHealth, startOllamaServer, waitForOllamaReady } from './utils/ollamaService.js';
|
|
10
14
|
// Constants
|
|
11
|
-
const
|
|
12
|
-
const REQUIRED_MODELS = ['qwen3-coder:30b'];
|
|
15
|
+
const REQUIRED_MODELS = ['qwen3-coder:30b', 'granite4.1:30b'];
|
|
13
16
|
const OLLAMA_URL = 'https://ollama.com/download';
|
|
14
|
-
const VSCODE_URL = 'https://code.visualstudio.com/download';
|
|
15
17
|
const isYesMode = process.argv.includes('--yes') || process.env.SCAI_YES === '1';
|
|
16
18
|
let ollamaChecked = false;
|
|
17
19
|
let ollamaAvailable = false;
|
|
18
|
-
// 🧠 Auto init config/db if missing
|
|
19
|
-
export async function autoInitIfNeeded() {
|
|
20
|
-
const cfg = readConfig();
|
|
21
|
-
if (!fs.existsSync(CONFIG_PATH)) {
|
|
22
|
-
console.log(chalk.green('🛠️ Config not found. Initializing...'));
|
|
23
|
-
writeConfig({});
|
|
24
|
-
}
|
|
25
|
-
const activeRepo = cfg.activeRepo && cfg.repos[cfg.activeRepo];
|
|
26
|
-
if (activeRepo) {
|
|
27
|
-
const dbPath = path.join(activeRepo.indexDir, 'scai.db');
|
|
28
|
-
if (!fs.existsSync(dbPath)) {
|
|
29
|
-
console.log(chalk.green('📦 DB not found. Initializing...'));
|
|
30
|
-
getDbForRepo();
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
20
|
// 🗨 Prompt user with configurable timeout
|
|
35
21
|
function promptUser(question, timeout = 20000) {
|
|
36
22
|
if (isYesMode)
|
|
@@ -64,13 +50,8 @@ function openBrowser(url) {
|
|
|
64
50
|
}
|
|
65
51
|
// 🌐 Check if Ollama is running
|
|
66
52
|
async function isOllamaRunning() {
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
return res.ok;
|
|
70
|
-
}
|
|
71
|
-
catch {
|
|
72
|
-
return false;
|
|
73
|
-
}
|
|
53
|
+
const health = await probeOllamaHealth();
|
|
54
|
+
return health.ok;
|
|
74
55
|
}
|
|
75
56
|
// 🚀 Ensure Ollama server is running
|
|
76
57
|
async function ensureOllamaRunning() {
|
|
@@ -83,25 +64,20 @@ async function ensureOllamaRunning() {
|
|
|
83
64
|
return;
|
|
84
65
|
}
|
|
85
66
|
console.log(chalk.yellow('⚙️ Ollama is not running. Attempting to start it...'));
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
windowsHide: true,
|
|
91
|
-
});
|
|
92
|
-
child.unref();
|
|
93
|
-
await new Promise((res) => setTimeout(res, 10000));
|
|
94
|
-
if (await isOllamaRunning()) {
|
|
67
|
+
const startResult = await startOllamaServer();
|
|
68
|
+
if (startResult.ok) {
|
|
69
|
+
const health = await waitForOllamaReady();
|
|
70
|
+
if (health.ok) {
|
|
95
71
|
console.log(chalk.green('✅ Ollama started successfully.'));
|
|
96
72
|
ollamaAvailable = true;
|
|
97
73
|
return;
|
|
98
74
|
}
|
|
75
|
+
console.log(chalk.red(`❌ Ollama did not become ready: ${health.detail}`));
|
|
76
|
+
process.exit(1);
|
|
99
77
|
}
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
process.exit(1);
|
|
104
|
-
}
|
|
78
|
+
if (startResult.reason === 'error') {
|
|
79
|
+
console.log(chalk.red('❌ Unexpected error starting Ollama.'));
|
|
80
|
+
process.exit(1);
|
|
105
81
|
}
|
|
106
82
|
console.log(chalk.red('❌ Ollama is not installed or not in PATH.'));
|
|
107
83
|
console.log(chalk.yellow(`📦 Ollama is required to run local AI models.`));
|
|
@@ -124,7 +100,8 @@ async function getInstalledModels() {
|
|
|
124
100
|
const result = execSync('ollama list', { encoding: 'utf-8' });
|
|
125
101
|
return result
|
|
126
102
|
.split('\n')
|
|
127
|
-
.
|
|
103
|
+
// Keep the full Ollama tag so exact names like "granite4.1:30b" still match.
|
|
104
|
+
.map((line) => line.split(/\s+/)[0])
|
|
128
105
|
.filter((model) => REQUIRED_MODELS.includes(model));
|
|
129
106
|
}
|
|
130
107
|
catch {
|
|
@@ -158,39 +135,9 @@ async function ensureModelsDownloaded() {
|
|
|
158
135
|
}
|
|
159
136
|
}
|
|
160
137
|
}
|
|
161
|
-
// 🌟 Check if VSCode CLI is available
|
|
162
|
-
async function isVSCodeAvailable() {
|
|
163
|
-
try {
|
|
164
|
-
execSync('code --version', { stdio: 'ignore' });
|
|
165
|
-
return true;
|
|
166
|
-
}
|
|
167
|
-
catch {
|
|
168
|
-
return false;
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
// ⚡ Ensure VSCode CLI is installed
|
|
172
|
-
async function ensureVSCodeInstalled() {
|
|
173
|
-
if (await isVSCodeAvailable()) {
|
|
174
|
-
console.log(chalk.green('✅ VSCode CLI is available.'));
|
|
175
|
-
return;
|
|
176
|
-
}
|
|
177
|
-
console.log(chalk.red('❌ VSCode CLI not found.'));
|
|
178
|
-
const answer = await promptUser('Do you want to open the VSCode download page? (y/N): ');
|
|
179
|
-
if (answer.toLowerCase() === 'y')
|
|
180
|
-
openBrowser(VSCODE_URL);
|
|
181
|
-
await promptUser('VSCode CLI was not found. If you want to use VSCode features, please install it manually. ' +
|
|
182
|
-
'Once installed, press Enter to continue. If you prefer to skip VSCode, just press Enter to continue without it: ');
|
|
183
|
-
if (await isVSCodeAvailable()) {
|
|
184
|
-
console.log(chalk.green('✅ VSCode CLI detected. Continuing...'));
|
|
185
|
-
}
|
|
186
|
-
else {
|
|
187
|
-
console.log(chalk.yellow('⚠️ VSCode CLI still not found. Some features may be disabled.'));
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
138
|
// 🏁 Main bootstrap logic
|
|
191
139
|
export async function bootstrap() {
|
|
192
|
-
await autoInitIfNeeded();
|
|
193
140
|
await ensureOllamaRunning();
|
|
194
141
|
await ensureModelsDownloaded();
|
|
195
|
-
await ensureVSCodeInstalled();
|
|
196
142
|
}
|
|
143
|
+
//# sourceMappingURL=modelSetup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modelSetup.js","sourceRoot":"","sources":["../src/modelSetup.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Bootstraps local model availability for commands that explicitly own setup.\n *\n * Why this file exists:\n * - explicit setup should verify Ollama before model-backed flows rely on it\n * - recommended model suggestions should stay in one small owner\n * - unrelated repo setup should not leak into model-only bootstrap logic\n */\nimport { execSync } from 'child_process';\nimport * as readline from 'readline';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport chalk from 'chalk';\nimport { platform } from 'os';\nimport { readConfig } from './config.js';\nimport { probeOllamaHealth, startOllamaServer, waitForOllamaReady } from './utils/ollamaService.js';\n\r\n// Constants\nconst REQUIRED_MODELS = ['qwen3-coder:30b', 'granite4.1:30b'];\nconst OLLAMA_URL = 'https://ollama.com/download';\r\nconst isYesMode = process.argv.includes('--yes') || process.env.SCAI_YES === '1';\n\r\nlet ollamaChecked = false;\r\nlet ollamaAvailable = false;\r\n\r\n// 🗨 Prompt user with configurable timeout\nfunction promptUser(question: string, timeout = 20000): Promise<string> {\n if (isYesMode) return Promise.resolve('y');\r\n\r\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\r\n\r\n return new Promise((resolve) => {\r\n const timer = setTimeout(() => {\r\n rl.close();\r\n resolve('');\r\n }, timeout);\r\n\r\n rl.question(question, (answer) => {\r\n clearTimeout(timer);\r\n rl.close();\r\n resolve(answer.trim());\r\n });\r\n });\r\n}\r\n\r\n// 🧭 Cross-platform browser opener\r\nfunction openBrowser(url: string) {\r\n const command = platform() === 'win32'\r\n ? `start ${url}`\r\n : platform() === 'darwin'\r\n ? `open ${url}`\r\n : `xdg-open ${url}`;\r\n\r\n try {\r\n execSync(command, { stdio: 'ignore' });\r\n } catch {\r\n console.log(chalk.yellow('🔗 Please manually open:'), url);\r\n }\r\n}\r\n\r\n// 🌐 Check if Ollama is running\r\nasync function isOllamaRunning(): Promise<boolean> {\n const health = await probeOllamaHealth();\n return health.ok;\n}\n\r\n// 🚀 Ensure Ollama server is running\r\nasync function ensureOllamaRunning(): Promise<void> {\r\n if (ollamaChecked) return;\r\n ollamaChecked = true;\r\n\r\n if (await isOllamaRunning()) {\r\n console.log(chalk.green('✅ Ollama is already running.'));\r\n ollamaAvailable = true;\r\n return;\r\n }\r\n\r\n console.log(chalk.yellow('⚙️ Ollama is not running. Attempting to start it...'));\n\n const startResult = await startOllamaServer();\n if (startResult.ok) {\n const health = await waitForOllamaReady();\n if (health.ok) {\n console.log(chalk.green('✅ Ollama started successfully.'));\n ollamaAvailable = true;\n return;\n }\n\n console.log(chalk.red(`❌ Ollama did not become ready: ${health.detail}`));\n process.exit(1);\n }\n\n if (startResult.reason === 'error') {\n console.log(chalk.red('❌ Unexpected error starting Ollama.'));\n process.exit(1);\n }\n\r\n console.log(chalk.red('❌ Ollama is not installed or not in PATH.'));\r\n console.log(chalk.yellow(`📦 Ollama is required to run local AI models.`));\r\n\r\n const answer = await promptUser(`🌐 Recommended model: ${REQUIRED_MODELS.join(', ')}\\nOpen download page in browser? (y/N): `);\r\n if (answer.toLowerCase() === 'y') openBrowser(OLLAMA_URL);\r\n\r\n await promptUser('⏳ Press Enter once Ollama is installed or to continue without it: ');\r\n\r\n if (await isOllamaRunning()) {\r\n console.log(chalk.green('✅ Ollama detected. Continuing...'));\r\n ollamaAvailable = true;\r\n } else {\r\n console.log(chalk.yellow('⚠️ Ollama not running. Models will not be available until installed.'));\r\n ollamaAvailable = false;\r\n }\r\n}\r\n\r\n// 🧰 List installed models\r\nasync function getInstalledModels(): Promise<string[]> {\n try {\n const result = execSync('ollama list', { encoding: 'utf-8' });\n return result\n .split('\\n')\n // Keep the full Ollama tag so exact names like \"granite4.1:30b\" still match.\n .map((line) => line.split(/\\s+/)[0])\n .filter((model) => REQUIRED_MODELS.includes(model));\n } catch {\n return [];\n }\n}\n\r\n// 📥 Suggest required models but don’t block\r\nasync function ensureModelsDownloaded(): Promise<void> {\r\n if (!ollamaAvailable) return;\r\n\r\n const installed = await getInstalledModels();\r\n const missing = REQUIRED_MODELS.filter((m) => !installed.includes(m));\r\n\r\n if (!missing.length) {\r\n console.log(chalk.green('✅ All required models are installed.'));\r\n return;\r\n }\r\n\r\n console.log(chalk.yellow(`📦 Suggested models: ${missing.join(', ')}`));\r\n const answer = await promptUser('⬇️ Download them now? (y/N, continue anyway): ');\r\n\r\n if (answer.toLowerCase() !== 'y') {\r\n console.log(chalk.yellow('⚠️ Continuing without installing models. You can install later via config.'));\r\n return;\r\n }\r\n\r\n for (const model of missing) {\r\n try {\r\n console.log(`⬇️ Pulling ${model}...`);\r\n execSync(`ollama pull ${model}`, { stdio: 'inherit' });\r\n console.log(chalk.green(`✅ Pulled ${model}`));\r\n } catch {\r\n console.log(chalk.red(`❌ Failed to pull ${model}, continuing...`));\r\n }\r\n }\r\n}\r\n\r\n// 🏁 Main bootstrap logic\nexport async function bootstrap(): Promise<void> {\n await ensureOllamaRunning();\n await ensureModelsDownloaded();\n}\n"]}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Turns a git diff into short user-facing changelog bullets.
|
|
3
|
+
*/
|
|
2
4
|
import { Config } from '../../config.js';
|
|
3
5
|
import { generate } from '../../lib/generate.js';
|
|
4
6
|
export const changelogModule = {
|
|
@@ -23,6 +25,12 @@ ${diffContent}
|
|
|
23
25
|
const response = await generate({
|
|
24
26
|
query: input.query,
|
|
25
27
|
content: prompt,
|
|
28
|
+
}, {
|
|
29
|
+
caller: "changeLogModule",
|
|
30
|
+
inputContext: {
|
|
31
|
+
query: input.query,
|
|
32
|
+
diffContent,
|
|
33
|
+
},
|
|
26
34
|
});
|
|
27
35
|
const rawContent = typeof response?.data === 'string' ? response.data.trim() : '';
|
|
28
36
|
if (!rawContent || rawContent === 'NO UPDATE') {
|
|
@@ -42,3 +50,4 @@ ${diffContent}
|
|
|
42
50
|
};
|
|
43
51
|
}
|
|
44
52
|
};
|
|
53
|
+
//# sourceMappingURL=changeLogModule.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"changeLogModule.js","sourceRoot":"","sources":["../../../src/pipeline/modules/changeLogModule.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAGjD,MAAM,CAAC,MAAM,eAAe,GAAW;IACrC,IAAI,EAAE,iBAAiB;IACvB,WAAW,EAAE,+CAA+C;IAC5D,KAAK,CAAC,GAAG,CAAC,KAAe;QACvB,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;QAEhC,MAAM,WAAW,GACf,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QAEzD,MAAM,MAAM,GAAG;;;;;;;;;;EAUjB,WAAW;;CAEZ,CAAC,IAAI,EAAE,CAAC;QAEL,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC;YAC9B,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,OAAO,EAAE,MAAM;SAChB,EAAE;YACD,MAAM,EAAE,iBAAiB;YACzB,YAAY,EAAE;gBACZ,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,WAAW;aACZ;SACF,CAAC,CAAC;QAEH,MAAM,UAAU,GAAG,OAAO,QAAQ,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAElF,IAAI,CAAC,UAAU,IAAI,UAAU,KAAK,WAAW,EAAE,CAAC;YAC9C,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;YACtE,OAAO;gBACL,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,IAAI,EAAE,WAAW;aAClB,CAAC;QACJ,CAAC;QAED,+CAA+C;QAC/C,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAC9D,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CACtC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAC/B,CAAC;QAEF,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAExC,OAAO;YACL,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,IAAI,EAAE,QAAQ,IAAI,WAAW;SAC9B,CAAC;IACJ,CAAC;CACF,CAAC","sourcesContent":["/**\n * Turns a git diff into short user-facing changelog bullets.\n */\nimport { Config } from '../../config.js';\nimport { generate } from '../../lib/generate.js';\r\nimport type { Module, ModuleIO } from '../../types.js';\r\n\r\nexport const changelogModule: Module = {\r\n name: 'changelogModule',\r\n description: 'Generates a changelog entry based on Git diff',\r\n async run(input: ModuleIO): Promise<ModuleIO> {\r\n const model = Config.getModel();\r\n\r\n const diffContent =\r\n typeof input.content === 'string' ? input.content : '';\r\n\r\n const prompt = `\r\nUsing the Git diff below, return **only meaningful user-facing changes** as clean markdown bullet points.\r\n\r\nAnalyze the intent of each change and summarize it in plain English — do not copy code or include explanations.\r\n\r\nONLY return the bullet points!\r\n\r\nIf no meaningful changes are present, return the text: \"NO UPDATE\".\r\n\r\n--- DIFF START ---\r\n${diffContent}\r\n--- DIFF END ---\r\n`.trim();\r\n\r\n const response = await generate({\n query: input.query,\n content: prompt,\n }, {\n caller: \"changeLogModule\",\n inputContext: {\n query: input.query,\n diffContent,\n },\n });\n\r\n const rawContent = typeof response?.data === 'string' ? response.data.trim() : '';\r\n\r\n if (!rawContent || rawContent === 'NO UPDATE') {\r\n console.log(\"⚠️ No meaningful updates found. Returning 'NO UPDATE'.\");\r\n return {\r\n query: input.query,\r\n data: 'NO UPDATE',\r\n };\r\n }\r\n\r\n // Split into lines and keep only bullet points\r\n const lines = rawContent.split('\\n').map(line => line.trim());\r\n const bulletLines = lines.filter(line =>\r\n /^([*-+•]|\\d+\\.)\\s/.test(line)\r\n );\r\n\r\n const filtered = bulletLines.join('\\n');\r\n\r\n return {\r\n query: input.query,\r\n data: filtered || 'NO UPDATE',\r\n };\r\n }\r\n};\r\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cleanupModule.js","sourceRoot":"","sources":["../../../src/pipeline/modules/cleanupModule.ts"],"names":[],"mappings":"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","sourcesContent":["// File: src/modules/cleanupModule.ts\r\nimport chalk from \"chalk\";\r\nimport type { Module, ModuleIO } from \"../../types.js\";\r\n\r\n/** --- Helper: detect top/bottom fluff/noise --- */\r\nfunction isTopOrBottomNoise(line: string): boolean {\r\n const trimmed = line.trim();\r\n if (!trimmed) return true;\r\n\r\n if (/^```(?:\\w+)?$/.test(trimmed)) return true;\r\n if (/^<!--.*-->$/.test(trimmed)) return true;\r\n\r\n const lower = trimmed.toLowerCase();\r\n return [\r\n /^i\\s/i,\r\n /^here/iu,\r\n /^this/iu,\r\n /^the following/iu,\r\n /^below/iu,\r\n /^in this/iu,\r\n /^we have/iu,\r\n /the code above/iu,\r\n /ensures that/iu,\r\n /it handles/iu,\r\n /used to/iu,\r\n /note that/iu,\r\n /example/iu,\r\n /summary/iu,\r\n /added comments/iu,\r\n ].some((pattern) => pattern.test(lower));\r\n}\r\n\r\n/** --- Extract first JSON object or array slice --- */\r\nfunction extractJsonSlice(text: string): string | null {\r\n const objStart = text.indexOf(\"{\");\r\n const objEnd = text.lastIndexOf(\"}\");\r\n if (objStart !== -1 && objEnd > objStart) return text.slice(objStart, objEnd + 1);\r\n\r\n const arrStart = text.indexOf(\"[\");\r\n const arrEnd = text.lastIndexOf(\"]\");\r\n if (arrStart !== -1 && arrEnd > arrStart) return text.slice(arrStart, arrEnd + 1);\r\n\r\n return null;\r\n}\r\n\r\n/** --- Escape raw newlines inside JSON string literals --- */\r\nfunction escapeNewlinesInJsonStrings(input: string): string {\r\n let output = \"\";\r\n let inString = false;\r\n let escaped = false;\r\n\r\n for (let i = 0; i < input.length; i++) {\r\n const ch = input[i];\r\n\r\n if (escaped) {\r\n escaped = false;\r\n output += ch;\r\n continue;\r\n }\r\n\r\n if (ch === \"\\\\\") {\r\n escaped = true;\r\n output += ch;\r\n continue;\r\n }\r\n\r\n if (ch === '\"') {\r\n inString = !inString;\r\n output += ch;\r\n continue;\r\n }\r\n\r\n if (inString && ch === \"\\n\") {\r\n output += \"\\\\n\";\r\n continue;\r\n }\r\n\r\n output += ch;\r\n }\r\n\r\n return output;\r\n}\r\n\r\n/** --- Try parsing JSON with multiple fallbacks --- */\r\nfunction parseJsonWithFallback(content: string): any | null {\r\n try {\r\n return JSON.parse(content);\r\n } catch { }\r\n\r\n const slice = extractJsonSlice(content);\r\n if (slice) {\r\n try {\r\n return JSON.parse(slice);\r\n } catch { }\r\n }\r\n\r\n // Fallback: escape raw newlines inside string literals (markdown/text in JSON)\r\n try {\r\n const escaped = escapeNewlinesInJsonStrings(content);\r\n return JSON.parse(escaped);\r\n } catch { }\r\n\r\n return null;\r\n}\r\n\r\n/** --- Module --- */\r\nexport const cleanupModule: Module = {\r\n name: \"cleanup\",\r\n description: \"Cleans up AI output, removes noise, and extracts valid JSON if possible.\",\r\n groups: [\"transform\"],\r\n async run(input: ModuleIO): Promise<ModuleIO> {\r\n // --- Normalize input ---\r\n let content =\r\n typeof input.content === \"string\"\r\n ? input.content\r\n : JSON.stringify(input.content ?? \"\");\r\n content = content.replace(/\\r\\n/g, \"\\n\");\r\n\r\n // --- Trim top/bottom noise ---\r\n let lines = content.split(\"\\n\");\r\n while (lines.length && isTopOrBottomNoise(lines[0])) lines.shift();\r\n while (lines.length && isTopOrBottomNoise(lines[lines.length - 1])) lines.pop();\r\n content = lines.join(\"\\n\").trim();\r\n\r\n // --- Remove fences, HTML comments, thinking tags ---\r\n content = content\r\n .replace(/```(?:json)?/gi, \"\")\r\n .replace(/```/g, \"\")\r\n .replace(/<!--.*?-->/gs, \"\")\r\n .replace(/<think>[\\s\\S]*?<\\/think>/gi, \"\")\r\n .trim();\r\n\r\n // --- Attempt parsing ---\r\n let parsed: any = null;\r\n if (content.includes(\"{\") || content.includes(\"[\")) {\r\n parsed = parseJsonWithFallback(content);\r\n }\r\n\r\n if (parsed !== null) {\r\n return { query: input.query, content, data: parsed };\r\n }\r\n\r\n // --- Fallback: return raw cleaned text ---\r\n // Use console.debug instead of warn so logs are quieter\r\n process.stdout.write(\"\\r\\x1b[K\");\r\n console.debug(chalk.yellow(` - [cleanupModule] Could not parse JSON, returning raw content.`));\r\n\r\n return { query: input.query, content, data: content };\r\n },\r\n};\r\n"]}
|
|
@@ -1,6 +1,13 @@
|
|
|
1
1
|
import { generate } from "../../lib/generate.js";
|
|
2
2
|
import { logInputOutput } from "../../utils/promptLogHelper.js";
|
|
3
3
|
import { extractTaggedContent } from "../../utils/parseTaggedContent.js";
|
|
4
|
+
let generateFn = generate;
|
|
5
|
+
export function setCodeTransformGenerateForTests(fn) {
|
|
6
|
+
generateFn = fn;
|
|
7
|
+
}
|
|
8
|
+
export function resetCodeTransformGenerateForTests() {
|
|
9
|
+
generateFn = generate;
|
|
10
|
+
}
|
|
4
11
|
function previewContent(content, lines = 5) {
|
|
5
12
|
const all = content.split("\n");
|
|
6
13
|
return {
|
|
@@ -46,9 +53,6 @@ export const codeTransformModule = {
|
|
|
46
53
|
},
|
|
47
54
|
};
|
|
48
55
|
}
|
|
49
|
-
// ------------------------------------------------------------------
|
|
50
|
-
// Execution state
|
|
51
|
-
// ------------------------------------------------------------------
|
|
52
56
|
context.execution || (context.execution = {});
|
|
53
57
|
(_a = context.execution).codeTransformArtifacts || (_a.codeTransformArtifacts = { files: [] });
|
|
54
58
|
let currentContent = file.code;
|
|
@@ -66,9 +70,6 @@ export const codeTransformModule = {
|
|
|
66
70
|
preview: previewContent(currentContent),
|
|
67
71
|
});
|
|
68
72
|
}
|
|
69
|
-
// ------------------------------------------------------------------
|
|
70
|
-
// Ordered steps for this file (single-pass)
|
|
71
|
-
// ------------------------------------------------------------------
|
|
72
73
|
const allSteps = context.analysis?.planSuggestion?.plan?.steps ?? [];
|
|
73
74
|
const fileSteps = allSteps.filter(s => s.targetFile === targetFile);
|
|
74
75
|
logInputOutput("[codeTransformModule] ordered steps for file", "input", fileSteps.map(s => s.id));
|
|
@@ -82,15 +83,9 @@ export const codeTransformModule = {
|
|
|
82
83
|
},
|
|
83
84
|
};
|
|
84
85
|
}
|
|
85
|
-
// ------------------------------------------------------------------
|
|
86
|
-
// Outline-based steps instead of ordered numbered steps
|
|
87
|
-
// ------------------------------------------------------------------
|
|
88
86
|
const stepsOutline = fileSteps
|
|
89
87
|
.map((s) => `- Action: ${s.action}\n Description: ${typeof s.description === "string" ? s.description : "No description provided"}\n Metadata: ${s.metadata ? JSON.stringify(s.metadata, null, 2) : "none"}`)
|
|
90
88
|
.join("\n\n");
|
|
91
|
-
// ------------------------------------------------------------------
|
|
92
|
-
// Prompt
|
|
93
|
-
// ------------------------------------------------------------------
|
|
94
89
|
const prompt = `
|
|
95
90
|
You are a precise code transformation assistant.
|
|
96
91
|
|
|
@@ -131,9 +126,8 @@ Expected Output Format:
|
|
|
131
126
|
const outputs = [];
|
|
132
127
|
const perFileErrors = [];
|
|
133
128
|
try {
|
|
134
|
-
const llmResponse = await
|
|
129
|
+
const llmResponse = await generateFn({ content: prompt, query });
|
|
135
130
|
const rawText = typeof llmResponse.data === "string" ? llmResponse.data : "";
|
|
136
|
-
// 🔑 Use the helper method for extraction
|
|
137
131
|
const { content: extractedContent, notes } = extractTaggedContent(rawText, "FILE_CONTENT");
|
|
138
132
|
let finalContent = currentContent;
|
|
139
133
|
if (extractedContent && extractedContent.length > 10) {
|
|
@@ -148,11 +142,10 @@ Expected Output Format:
|
|
|
148
142
|
const out = {
|
|
149
143
|
filePath: file.path,
|
|
150
144
|
content: finalContent,
|
|
151
|
-
notes: notes ?? undefined
|
|
145
|
+
notes: notes ?? undefined,
|
|
152
146
|
};
|
|
153
147
|
logInputOutput("[codeTransformModule] extracted final content preview", "output", previewContent(out.content));
|
|
154
148
|
outputs.push(out);
|
|
155
|
-
// Update context artifacts
|
|
156
149
|
context.execution.codeTransformArtifacts.files =
|
|
157
150
|
context.execution.codeTransformArtifacts.files.filter(f => f.filePath !== file.path);
|
|
158
151
|
context.execution.codeTransformArtifacts.files.push(out);
|
|
@@ -174,3 +167,4 @@ Expected Output Format:
|
|
|
174
167
|
};
|
|
175
168
|
},
|
|
176
169
|
};
|
|
170
|
+
//# sourceMappingURL=codeTransformModule.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codeTransformModule.js","sourceRoot":"","sources":["../../../src/pipeline/modules/codeTransformModule.ts"],"names":[],"mappings":"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","sourcesContent":["// File: src/modules/codeTransformModule.ts\nimport { Module, ModuleIO } from \"../../types.js\";\nimport { generate } from \"../../lib/generate.js\";\nimport { logInputOutput } from \"../../utils/promptLogHelper.js\";\nimport type { StructuredContext, AgentPlanStep } from \"../../types.js\";\nimport { extractTaggedContent } from \"../../utils/parseTaggedContent.js\";\n\ntype CodeTransformResult = {\n filePath: string;\n content: string;\n notes?: string;\n};\n\nlet generateFn = generate;\n\nexport function setCodeTransformGenerateForTests(\n fn: (input: ModuleIO) => Promise<ModuleIO>\n): void {\n generateFn = fn;\n}\n\nexport function resetCodeTransformGenerateForTests(): void {\n generateFn = generate;\n}\n\nfunction previewContent(content: string, lines = 5) {\n const all = content.split(\"\\n\");\n return {\n totalLines: all.length,\n head: all.slice(0, lines),\n tail: all.slice(-lines),\n };\n}\n\nexport const codeTransformModule: Module = {\n name: \"codeTransform\",\n description:\n \"Transforms a single file according to an ordered plan of steps, in a single pass.\",\n groups: [\"transform\"],\n\n run: async (input: ModuleIO): Promise<ModuleIO> => {\n const query =\n typeof input.query === \"string\" ? input.query : String(input.query ?? \"\");\n const context = input.context as StructuredContext | undefined;\n\n if (!context) {\n logInputOutput(\"[codeTransformModule] No context provided\", \"input\", {});\n return { query, data: { files: [], errors: [\"No context provided\"] } };\n }\n\n const workingFiles = context.workingFiles ?? [];\n const currentStep = context.currentStep as AgentPlanStep | undefined;\n\n logInputOutput(\n \"[codeTransformModule] full generated plan steps\",\n \"input\",\n context.analysis?.planSuggestion?.plan?.steps?.map(s => s.id)\n );\n\n if (!currentStep) {\n logInputOutput(\"[codeTransformModule] No current step set\", \"input\", {});\n return {\n query,\n data: {\n files: [],\n errors: [\"No current step set in context for code transformation\"],\n },\n };\n }\n\n const targetFile = currentStep.targetFile;\n const file = workingFiles.find(f => f.path === targetFile);\n\n if (!file || typeof file.code !== \"string\") {\n logInputOutput(\n `[codeTransformModule] Target file not found or missing code: ${targetFile}`,\n \"input\",\n {}\n );\n return {\n query,\n data: {\n files: [],\n errors: [`Target file not found or missing code: ${targetFile}`],\n },\n };\n }\n\n context.execution ||= {};\n context.execution.codeTransformArtifacts ||= { files: [] };\n\n let currentContent = file.code;\n const previousArtifact =\n context.execution.codeTransformArtifacts.files.find(\n f => f.filePath === targetFile\n );\n\n if (previousArtifact?.content) {\n currentContent = previousArtifact.content;\n logInputOutput(\"[codeTransformModule] previous artifact\", \"input\", {\n source: \"previousArtifact\",\n preview: previewContent(currentContent),\n });\n } else {\n logInputOutput(\"[codeTransformModule] original file content\", \"input\", {\n source: \"originalFile\",\n preview: previewContent(currentContent),\n });\n }\n\n const allSteps = context.analysis?.planSuggestion?.plan?.steps ?? [];\n const fileSteps = allSteps.filter(s => s.targetFile === targetFile);\n\n logInputOutput(\n \"[codeTransformModule] ordered steps for file\",\n \"input\",\n fileSteps.map(s => s.id)\n );\n\n if (!fileSteps.length) {\n logInputOutput(\n \"[codeTransformModule] No plan steps found for target file\",\n \"input\",\n {}\n );\n return {\n query,\n data: {\n files: [],\n errors: [`No plan steps found for target file ${targetFile}`],\n },\n };\n }\n\n const stepsOutline = fileSteps\n .map((s: AgentPlanStep) =>\n `- Action: ${s.action}\\n Description: ${\n typeof s.description === \"string\" ? s.description : \"No description provided\"\n }\\n Metadata: ${s.metadata ? JSON.stringify(s.metadata, null, 2) : \"none\"}`\n )\n .join(\"\\n\\n\");\n\n const prompt = `\nYou are a precise code transformation assistant.\n\nYou are given:\n- An authoritative file\n- An outline of requested changes\n\nUse the outline to update the file as appropriate. Focus on applying the requested changes.\n\n==================== TRANSFORMATION OUTLINE ====================\n\n${stepsOutline}\n\n==================== FILE (AUTHORITATIVE INPUT) ====================\n\nFILE: ${file.path}\n--------------------------------------------------\n${currentContent}\n\n==================== RULES ====================\n\n- Apply all requested changes where appropriate.\n- You MUST return the FULL rewritten file content inside <FILE_CONTENT> tags.\n- You may provide optional notes or explanations inside <NOTES> tags.\n- Do NOT return JSON.\n- Do NOT return diffs or partial snippets.\n- If the outline results in no net change, return the original file content.\n\nExpected Output Format:\n<FILE_CONTENT>\n(The complete updated code goes here)\n</FILE_CONTENT>\n<NOTES>\n(Optional notes)\n</NOTES>\n`.trim();\n\n logInputOutput(\"[codeTransformModule] final prompt to LLM\", \"output\", prompt);\n\n const outputs: CodeTransformResult[] = [];\n const perFileErrors: string[] = [];\n\n try {\n const llmResponse = await generateFn({ content: prompt, query });\n const rawText = typeof llmResponse.data === \"string\" ? llmResponse.data : \"\";\n\n const { content: extractedContent, notes } = extractTaggedContent(rawText, \"FILE_CONTENT\");\n\n let finalContent = currentContent;\n if (extractedContent && extractedContent.length > 10) {\n finalContent = extractedContent;\n } else if (rawText) {\n perFileErrors.push(\"Could not find valid <FILE_CONTENT> tags or content was too short in LLM response.\");\n } else {\n perFileErrors.push(\"LLM response data is empty or invalid.\");\n }\n\n const out: CodeTransformResult = {\n filePath: file.path,\n content: finalContent,\n notes: notes ?? undefined,\n };\n\n logInputOutput(\n \"[codeTransformModule] extracted final content preview\",\n \"output\",\n previewContent(out.content)\n );\n\n outputs.push(out);\n\n context.execution.codeTransformArtifacts.files =\n context.execution.codeTransformArtifacts.files.filter(\n f => f.filePath !== file.path\n );\n context.execution.codeTransformArtifacts.files.push(out);\n\n context.plan ||= {};\n context.plan.touchedFiles ||= [];\n if (!context.plan.touchedFiles.includes(file.path)) {\n context.plan.touchedFiles.push(file.path);\n }\n } catch (err) {\n perFileErrors.push(`Transformation failed: ${(err as Error).message}`);\n }\n\n return {\n query,\n data: {\n files: outputs,\n errors: perFileErrors.length > 0 ? perFileErrors : undefined,\n },\n };\n },\n};\n"]}
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Asks the model to add comments to one file chunk using file-type-aware comment syntax.
|
|
3
|
+
*/
|
|
1
4
|
import { Config } from '../../config.js';
|
|
2
5
|
import { generate } from '../../lib/generate.js';
|
|
3
6
|
import { detectFileType } from '../../fileRules/detectFileType.js';
|
|
@@ -58,6 +61,14 @@ ${content}
|
|
|
58
61
|
const response = await generate({
|
|
59
62
|
query: filepath,
|
|
60
63
|
content: prompt,
|
|
64
|
+
}, {
|
|
65
|
+
caller: "commentModule",
|
|
66
|
+
inputContext: {
|
|
67
|
+
filepath,
|
|
68
|
+
fileType,
|
|
69
|
+
commentSyntax,
|
|
70
|
+
content,
|
|
71
|
+
},
|
|
61
72
|
});
|
|
62
73
|
// ✅ The result is now in `data`
|
|
63
74
|
const commentedContent = typeof response.data === 'string' && response.data !== 'NO UPDATE'
|
|
@@ -70,3 +81,4 @@ ${content}
|
|
|
70
81
|
};
|
|
71
82
|
},
|
|
72
83
|
};
|
|
84
|
+
//# sourceMappingURL=commentModule.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commentModule.js","sourceRoot":"","sources":["../../../src/pipeline/modules/commentModule.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAGnE,MAAM,CAAC,MAAM,iBAAiB,GAAW;IACvC,IAAI,EAAE,UAAU;IAChB,WAAW,EAAE,mEAAmE;IAChF,MAAM,EAAE,CAAC,WAAW,CAAC;IACrB,GAAG,EAAE,KAAK,EAAE,KAAe,EAAqB,EAAE;QAChD,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;QAEhC,MAAM,QAAQ,GAAG,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QACpE,MAAM,OAAO,GAAG,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QAEvE,MAAM,QAAQ,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;QAE1C,MAAM,UAAU,GAA2B;YACzC,UAAU,EAAE,IAAI;YAChB,UAAU,EAAE,IAAI;YAChB,IAAI,EAAE,IAAI;YACV,IAAI,EAAE,IAAI;YACV,CAAC,EAAE,IAAI;YACP,GAAG,EAAE,IAAI;YACT,MAAM,EAAE,IAAI;YACZ,EAAE,EAAE,IAAI;YACR,KAAK,EAAE,IAAI;YACX,MAAM,EAAE,IAAI;YACZ,KAAK,EAAE,IAAI;YACX,MAAM,EAAE,GAAG;YACX,IAAI,EAAE,GAAG;YACT,GAAG,EAAE,IAAI;YACT,KAAK,EAAE,GAAG;YACV,IAAI,EAAE,GAAG;YACT,MAAM,EAAE,GAAG;YACX,IAAI,EAAE,GAAG;YACT,QAAQ,EAAE,UAAU;YACpB,IAAI,EAAE,UAAU;YAChB,GAAG,EAAE,UAAU;YACf,IAAI,EAAE,OAAO;YACb,GAAG,EAAE,IAAI;YACT,GAAG,EAAE,GAAG;YACR,GAAG,EAAE,GAAG;YACR,IAAI,EAAE,GAAG;SACV,CAAC;QAEF,MAAM,aAAa,GAAG,UAAU,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC;QAEnD,MAAM,MAAM,GAAG;wCACqB,QAAQ;;;;;;SAMvC,aAAa,2CAA2C,QAAQ;;;;;;EAMvE,OAAO;KACJ,CAAC,IAAI,EAAE,CAAC;QAET,iDAAiD;QACjD,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC;YAC9B,KAAK,EAAE,QAAQ;YACf,OAAO,EAAE,MAAM;SAChB,EAAE;YACD,MAAM,EAAE,eAAe;YACvB,YAAY,EAAE;gBACZ,QAAQ;gBACR,QAAQ;gBACR,aAAa;gBACb,OAAO;aACR;SACF,CAAC,CAAC;QAEH,gCAAgC;QAChC,MAAM,gBAAgB,GACpB,OAAO,QAAQ,CAAC,IAAI,KAAK,QAAQ,IAAI,QAAQ,CAAC,IAAI,KAAK,WAAW;YAChE,CAAC,CAAC,QAAQ,CAAC,IAAI;YACf,CAAC,CAAC,OAAO,CAAC;QAEd,iDAAiD;QACjD,OAAO;YACL,KAAK,EAAE,QAAQ;YACf,IAAI,EAAE,gBAAgB;SACvB,CAAC;IACJ,CAAC;CACF,CAAC","sourcesContent":["/**\n * Asks the model to add comments to one file chunk using file-type-aware comment syntax.\n */\nimport { Config } from '../../config.js';\nimport { generate } from '../../lib/generate.js';\r\nimport { detectFileType } from '../../fileRules/detectFileType.js';\r\nimport type { Module, ModuleIO } from '../../types.js';\r\n\r\nexport const addCommentsModule: Module = {\r\n name: 'comments',\r\n description: 'Adds meaningful comments to any file type (code, config, or data)',\r\n groups: [\"transform\"],\r\n run: async (input: ModuleIO): Promise<ModuleIO> => {\r\n const model = Config.getModel();\r\n\r\n const filepath = typeof input.query === 'string' ? input.query : '';\r\n const content = typeof input.content === 'string' ? input.content : '';\r\n\r\n const fileType = detectFileType(filepath);\r\n\r\n const commentMap: Record<string, string> = {\r\n javascript: '//',\r\n typescript: '//',\r\n java: '//',\r\n rust: '//',\r\n c: '//',\r\n cpp: '//',\r\n csharp: '//',\r\n go: '//',\r\n swift: '//',\r\n kotlin: '//',\r\n scala: '//',\r\n python: '#',\r\n ruby: '#',\r\n php: '//',\r\n shell: '#',\r\n bash: '#',\r\n config: '#',\r\n yaml: '#',\r\n markdown: '<!-- -->',\r\n html: '<!-- -->',\r\n xml: '<!-- -->',\r\n json: '/* */',\r\n sql: '--',\r\n csv: '#',\r\n tsv: '#',\r\n text: '#',\r\n };\r\n\r\n const commentSyntax = commentMap[fileType] || '//';\r\n\r\n const prompt = `\r\nYou are a senior engineer reviewing a ${fileType} file.\r\n\r\nPlease:\r\n\r\n- Add summary comments (2–3 lines) at relevant points for greater class insights.\r\n- Add clear, helpful inline-comments to explain non-obvious logic inside functions. \r\n- Use \"${commentSyntax}\" as the comment syntax appropriate for ${fileType}.\r\n\r\nRules:\r\n- Return the full original chunk of code with added comments.\r\n- Inline comments should clarify complex or tricky parts.\r\n\r\n${content}\r\n `.trim();\r\n\r\n // ✅ Generate now uses ModuleIO (query + content)\r\n const response = await generate({\n query: filepath,\n content: prompt,\n }, {\n caller: \"commentModule\",\n inputContext: {\n filepath,\n fileType,\n commentSyntax,\n content,\n },\n });\n\r\n // ✅ The result is now in `data`\r\n const commentedContent =\r\n typeof response.data === 'string' && response.data !== 'NO UPDATE'\r\n ? response.data\r\n : content;\r\n\r\n // ✅ Return proper ModuleIO shape (output → data)\r\n return {\r\n query: filepath,\r\n data: commentedContent,\r\n };\r\n },\r\n};\r\n"]}
|
|
@@ -1,19 +1,69 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Suggests a few conventional commit messages for the standalone commit command.
|
|
3
|
+
*
|
|
4
|
+
* Why this file exists:
|
|
5
|
+
* - commit suggestion should be reusable as a small prompt module without entering the agent runtime
|
|
6
|
+
* - large commits need a compact staged summary instead of dumping the full diff into the model
|
|
7
|
+
* - the output contract stays simple: exactly 3 conventional commit suggestions
|
|
8
|
+
*/
|
|
3
9
|
import { generate } from '../../lib/generate.js';
|
|
10
|
+
import { logInputOutput } from '../../utils/promptLogHelper.js';
|
|
11
|
+
function isCommitSummaryPayload(content) {
|
|
12
|
+
return Boolean(content &&
|
|
13
|
+
typeof content === 'object' &&
|
|
14
|
+
content.mode === 'staged-summary' &&
|
|
15
|
+
Array.isArray(content.topFiles));
|
|
16
|
+
}
|
|
17
|
+
function renderCommitSummary(summary) {
|
|
18
|
+
const categories = Object.entries(summary.categoryCounts)
|
|
19
|
+
.filter(([, count]) => Number(count) > 0)
|
|
20
|
+
.map(([category, count]) => `${category}=${count}`)
|
|
21
|
+
.join(', ');
|
|
22
|
+
const topFiles = summary.topFiles
|
|
23
|
+
.map((file, index) => {
|
|
24
|
+
const sample = file.sample?.trim()
|
|
25
|
+
? `\nSample:\n${file.sample.trim()}`
|
|
26
|
+
: '';
|
|
27
|
+
return `${index + 1}. ${file.path} [${file.category}] status=${file.status} +${file.added} -${file.deleted}${sample}`;
|
|
28
|
+
})
|
|
29
|
+
.join('\n\n');
|
|
30
|
+
const omitted = summary.omittedFileCount > 0
|
|
31
|
+
? `\nOmitted lower-priority files: ${summary.omittedFileCount}`
|
|
32
|
+
: '';
|
|
33
|
+
return [
|
|
34
|
+
'Staged commit summary:',
|
|
35
|
+
`- staged only: ${summary.stagedOnly ? 'yes' : 'no'}`,
|
|
36
|
+
`- total files: ${summary.totalFiles}`,
|
|
37
|
+
`- lines added: ${summary.totalAdded}`,
|
|
38
|
+
`- lines deleted: ${summary.totalDeleted}`,
|
|
39
|
+
`- dominant categories: ${summary.dominantCategories.join(', ') || 'none'}`,
|
|
40
|
+
`- category counts: ${categories || 'none'}`,
|
|
41
|
+
'',
|
|
42
|
+
'Highest-priority files:',
|
|
43
|
+
topFiles,
|
|
44
|
+
omitted,
|
|
45
|
+
].join('\n').trim();
|
|
46
|
+
}
|
|
4
47
|
export const commitSuggesterModule = {
|
|
5
48
|
name: 'commitSuggester',
|
|
6
|
-
description: 'Suggests conventional commit messages from
|
|
49
|
+
description: 'Suggests conventional commit messages from a staged change summary',
|
|
7
50
|
run: async (input) => {
|
|
8
|
-
const
|
|
9
|
-
const
|
|
51
|
+
const content = input.content;
|
|
52
|
+
const renderedInput = isCommitSummaryPayload(content)
|
|
53
|
+
? renderCommitSummary(content)
|
|
54
|
+
: typeof content === 'string'
|
|
55
|
+
? content
|
|
56
|
+
: '';
|
|
10
57
|
const prompt = `
|
|
11
|
-
Suggest ALWAYS 3 concise, conventional Git commit messages
|
|
58
|
+
Suggest ALWAYS 3 concise, conventional Git commit messages for a standalone git command.
|
|
12
59
|
|
|
13
60
|
- Follow the Conventional Commits specification for prefixes (e.g., feat:, fix:, refactor:, docs:, style:, test:, chore:).
|
|
14
|
-
- Choose the most appropriate prefix for each message based on the changes
|
|
61
|
+
- Choose the most appropriate prefix for each message based on the staged changes.
|
|
15
62
|
- Do NOT repeat the same prefix unless it is clearly the most appropriate.
|
|
16
63
|
- Keep each message short, clear, and action-oriented.
|
|
64
|
+
- Prefer the overall staged summary first.
|
|
65
|
+
- Use file samples only as supporting evidence.
|
|
66
|
+
- Do not mention that the input was summarized or truncated.
|
|
17
67
|
|
|
18
68
|
Format your response exactly as:
|
|
19
69
|
|
|
@@ -21,16 +71,26 @@ Format your response exactly as:
|
|
|
21
71
|
2. <type>: <message>
|
|
22
72
|
3. <type>: <message>
|
|
23
73
|
|
|
24
|
-
Here is the
|
|
25
|
-
${
|
|
74
|
+
Here is the staged change context:
|
|
75
|
+
${renderedInput}
|
|
26
76
|
`.trim();
|
|
77
|
+
logInputOutput('commitSuggesterModule', 'input', {
|
|
78
|
+
query: input.query,
|
|
79
|
+
renderedInput,
|
|
80
|
+
});
|
|
27
81
|
try {
|
|
28
82
|
// === INTERACTION #1: generate.ts (via ModuleIO) ===
|
|
29
83
|
const genInput = {
|
|
30
84
|
query: 'Suggest 3 conventional commit messages',
|
|
31
85
|
content: prompt
|
|
32
86
|
};
|
|
33
|
-
const genOutput = await generate(genInput
|
|
87
|
+
const genOutput = await generate(genInput, {
|
|
88
|
+
caller: "commitSuggesterModule",
|
|
89
|
+
inputContext: {
|
|
90
|
+
query: input.query,
|
|
91
|
+
commitInput: renderedInput,
|
|
92
|
+
},
|
|
93
|
+
});
|
|
34
94
|
const rawText = typeof genOutput.data === 'string' ? genOutput.data : '';
|
|
35
95
|
// === Parse lines ===
|
|
36
96
|
const lines = rawText
|
|
@@ -38,21 +98,31 @@ ${diffContent}
|
|
|
38
98
|
.map(line => line.trim())
|
|
39
99
|
.filter(line => /^[1-3][.)]\s+/.test(line));
|
|
40
100
|
const suggestions = lines.map(line => line.replace(/^[1-3][.)]\s+/, '').replace(/^"(.*)"$/, '$1').trim());
|
|
101
|
+
logInputOutput('commitSuggesterModule', 'output', {
|
|
102
|
+
status: 'ok',
|
|
103
|
+
suggestionCount: suggestions.length,
|
|
104
|
+
suggestions,
|
|
105
|
+
});
|
|
41
106
|
return {
|
|
42
107
|
query: input.query,
|
|
43
|
-
content:
|
|
108
|
+
content: renderedInput,
|
|
44
109
|
data: genOutput.data,
|
|
45
110
|
suggestions
|
|
46
111
|
};
|
|
47
112
|
}
|
|
48
113
|
catch (err) {
|
|
49
114
|
console.warn('⚠️ commitSuggesterModule failed:', err);
|
|
115
|
+
logInputOutput('commitSuggesterModule', 'output', {
|
|
116
|
+
status: 'error',
|
|
117
|
+
error: err instanceof Error ? err.message : String(err),
|
|
118
|
+
});
|
|
50
119
|
return {
|
|
51
120
|
query: input.query,
|
|
52
|
-
content:
|
|
121
|
+
content: renderedInput,
|
|
53
122
|
data: {},
|
|
54
123
|
suggestions: []
|
|
55
124
|
};
|
|
56
125
|
}
|
|
57
126
|
}
|
|
58
127
|
};
|
|
128
|
+
//# sourceMappingURL=commitSuggesterModule.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commitSuggesterModule.js","sourceRoot":"","sources":["../../../src/pipeline/modules/commitSuggesterModule.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAGjD,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAMhE,SAAS,sBAAsB,CAAC,OAAgB;IAC9C,OAAO,OAAO,CACZ,OAAO;QACP,OAAO,OAAO,KAAK,QAAQ;QAC1B,OAAgC,CAAC,IAAI,KAAK,gBAAgB;QAC3D,KAAK,CAAC,OAAO,CAAE,OAAgC,CAAC,QAAQ,CAAC,CAC1D,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAAC,OAA6B;IACxD,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC;SACtD,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;SACxC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,QAAQ,IAAI,KAAK,EAAE,CAAC;SAClD,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ;SAC9B,GAAG,CAAC,CAAC,IAA8C,EAAE,KAAa,EAAE,EAAE;QACrE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE;YAChC,CAAC,CAAC,cAAc,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE;YACpC,CAAC,CAAC,EAAE,CAAC;QACP,OAAO,GAAG,KAAK,GAAG,CAAC,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,QAAQ,YAAY,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,OAAO,GAAG,MAAM,EAAE,CAAC;IACxH,CAAC,CAAC;SACD,IAAI,CAAC,MAAM,CAAC,CAAC;IAEhB,MAAM,OAAO,GAAG,OAAO,CAAC,gBAAgB,GAAG,CAAC;QAC1C,CAAC,CAAC,mCAAmC,OAAO,CAAC,gBAAgB,EAAE;QAC/D,CAAC,CAAC,EAAE,CAAC;IAEP,OAAO;QACL,wBAAwB;QACxB,kBAAkB,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE;QACrD,kBAAkB,OAAO,CAAC,UAAU,EAAE;QACtC,kBAAkB,OAAO,CAAC,UAAU,EAAE;QACtC,oBAAoB,OAAO,CAAC,YAAY,EAAE;QAC1C,0BAA0B,OAAO,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,EAAE;QAC3E,sBAAsB,UAAU,IAAI,MAAM,EAAE;QAC5C,EAAE;QACF,yBAAyB;QACzB,QAAQ;QACR,OAAO;KACR,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;AACtB,CAAC;AAED,MAAM,CAAC,MAAM,qBAAqB,GAAW;IAC3C,IAAI,EAAE,iBAAiB;IACvB,WAAW,EAAE,oEAAoE;IAEjF,GAAG,EAAE,KAAK,EAAE,KAAe,EAAkC,EAAE;QAC7D,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;QAC9B,MAAM,aAAa,GAAG,sBAAsB,CAAC,OAAO,CAAC;YACnD,CAAC,CAAC,mBAAmB,CAAC,OAAO,CAAC;YAC9B,CAAC,CAAC,OAAO,OAAO,KAAK,QAAQ;gBAC3B,CAAC,CAAC,OAAO;gBACT,CAAC,CAAC,EAAE,CAAC;QAET,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;EAkBjB,aAAa;KACV,CAAC,IAAI,EAAE,CAAC;QAET,cAAc,CAAC,uBAAuB,EAAE,OAAO,EAAE;YAC/C,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,aAAa;SACd,CAAC,CAAC;QAEH,IAAI,CAAC;YACH,qDAAqD;YACrD,MAAM,QAAQ,GAAa;gBACzB,KAAK,EAAE,wCAAwC;gBAC/C,OAAO,EAAE,MAAM;aAChB,CAAC;YACF,MAAM,SAAS,GAAa,MAAM,QAAQ,CAAC,QAAQ,EAAE;gBACnD,MAAM,EAAE,uBAAuB;gBAC/B,YAAY,EAAE;oBACZ,KAAK,EAAE,KAAK,CAAC,KAAK;oBAClB,WAAW,EAAE,aAAa;iBAC3B;aACF,CAAC,CAAC;YAEH,MAAM,OAAO,GAAG,OAAO,SAAS,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YAEzE,sBAAsB;YACtB,MAAM,KAAK,GAAG,OAAO;iBAClB,KAAK,CAAC,IAAI,CAAC;iBACX,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;iBACxB,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YAE9C,MAAM,WAAW,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CACnC,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,CACnE,CAAC;YAEF,cAAc,CAAC,uBAAuB,EAAE,QAAQ,EAAE;gBAChD,MAAM,EAAE,IAAI;gBACZ,eAAe,EAAE,WAAW,CAAC,MAAM;gBACnC,WAAW;aACZ,CAAC,CAAC;YAGH,OAAO;gBACL,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,OAAO,EAAE,aAAa;gBACtB,IAAI,EAAE,SAAS,CAAC,IAAI;gBACpB,WAAW;aACZ,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,kCAAkC,EAAE,GAAG,CAAC,CAAC;YACtD,cAAc,CAAC,uBAAuB,EAAE,QAAQ,EAAE;gBAChD,MAAM,EAAE,OAAO;gBACf,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;aACxD,CAAC,CAAC;YACH,OAAO;gBACL,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,OAAO,EAAE,aAAa;gBACtB,IAAI,EAAE,EAAE;gBACR,WAAW,EAAE,EAAE;aAChB,CAAC;QACJ,CAAC;IACH,CAAC;CACF,CAAC","sourcesContent":["/**\n * Suggests a few conventional commit messages for the standalone commit command.\n *\n * Why this file exists:\n * - commit suggestion should be reusable as a small prompt module without entering the agent runtime\n * - large commits need a compact staged summary instead of dumping the full diff into the model\n * - the output contract stays simple: exactly 3 conventional commit suggestions\n */\nimport { generate } from '../../lib/generate.js';\r\nimport type { ModuleIO, Module } from '../../types.js';\r\nimport type { CommitSummaryPayload } from '../../git/commitSummary.js';\r\nimport { logInputOutput } from '../../utils/promptLogHelper.js';\r\n\r\nexport interface CommitSuggesterOutput extends ModuleIO {\r\n suggestions: string[];\r\n}\r\n\r\nfunction isCommitSummaryPayload(content: unknown): content is CommitSummaryPayload {\r\n return Boolean(\r\n content &&\r\n typeof content === 'object' &&\r\n (content as CommitSummaryPayload).mode === 'staged-summary' &&\r\n Array.isArray((content as CommitSummaryPayload).topFiles)\r\n );\r\n}\r\n\r\nfunction renderCommitSummary(summary: CommitSummaryPayload): string {\r\n const categories = Object.entries(summary.categoryCounts)\r\n .filter(([, count]) => Number(count) > 0)\r\n .map(([category, count]) => `${category}=${count}`)\r\n .join(', ');\r\n\r\n const topFiles = summary.topFiles\r\n .map((file: CommitSummaryPayload['topFiles'][number], index: number) => {\r\n const sample = file.sample?.trim()\r\n ? `\\nSample:\\n${file.sample.trim()}`\r\n : '';\r\n return `${index + 1}. ${file.path} [${file.category}] status=${file.status} +${file.added} -${file.deleted}${sample}`;\r\n })\r\n .join('\\n\\n');\r\n\r\n const omitted = summary.omittedFileCount > 0\r\n ? `\\nOmitted lower-priority files: ${summary.omittedFileCount}`\r\n : '';\r\n\r\n return [\r\n 'Staged commit summary:',\r\n `- staged only: ${summary.stagedOnly ? 'yes' : 'no'}`,\r\n `- total files: ${summary.totalFiles}`,\r\n `- lines added: ${summary.totalAdded}`,\r\n `- lines deleted: ${summary.totalDeleted}`,\r\n `- dominant categories: ${summary.dominantCategories.join(', ') || 'none'}`,\r\n `- category counts: ${categories || 'none'}`,\r\n '',\r\n 'Highest-priority files:',\r\n topFiles,\r\n omitted,\r\n ].join('\\n').trim();\r\n}\r\n\r\nexport const commitSuggesterModule: Module = {\r\n name: 'commitSuggester',\r\n description: 'Suggests conventional commit messages from a staged change summary',\r\n\r\n run: async (input: ModuleIO): Promise<CommitSuggesterOutput> => {\r\n const content = input.content;\r\n const renderedInput = isCommitSummaryPayload(content)\r\n ? renderCommitSummary(content)\r\n : typeof content === 'string'\r\n ? content\r\n : '';\r\n\r\n const prompt = `\r\nSuggest ALWAYS 3 concise, conventional Git commit messages for a standalone git command.\r\n\r\n- Follow the Conventional Commits specification for prefixes (e.g., feat:, fix:, refactor:, docs:, style:, test:, chore:).\r\n- Choose the most appropriate prefix for each message based on the staged changes.\r\n- Do NOT repeat the same prefix unless it is clearly the most appropriate.\r\n- Keep each message short, clear, and action-oriented.\r\n- Prefer the overall staged summary first.\r\n- Use file samples only as supporting evidence.\r\n- Do not mention that the input was summarized or truncated.\r\n\r\nFormat your response exactly as:\r\n\r\n1. <type>: <message>\r\n2. <type>: <message>\r\n3. <type>: <message>\r\n\r\nHere is the staged change context:\r\n${renderedInput}\r\n `.trim();\r\n\r\n logInputOutput('commitSuggesterModule', 'input', {\r\n query: input.query,\r\n renderedInput,\r\n });\r\n\r\n try {\r\n // === INTERACTION #1: generate.ts (via ModuleIO) ===\r\n const genInput: ModuleIO = {\r\n query: 'Suggest 3 conventional commit messages',\r\n content: prompt\r\n };\r\n const genOutput: ModuleIO = await generate(genInput, {\r\n caller: \"commitSuggesterModule\",\r\n inputContext: {\r\n query: input.query,\r\n commitInput: renderedInput,\r\n },\r\n });\r\n\r\n const rawText = typeof genOutput.data === 'string' ? genOutput.data : '';\r\n\r\n // === Parse lines ===\r\n const lines = rawText\r\n .split('\\n')\r\n .map(line => line.trim())\r\n .filter(line => /^[1-3][.)]\\s+/.test(line));\r\n\r\n const suggestions = lines.map(line =>\r\n line.replace(/^[1-3][.)]\\s+/, '').replace(/^\"(.*)\"$/, '$1').trim()\r\n );\r\n\r\n logInputOutput('commitSuggesterModule', 'output', {\r\n status: 'ok',\r\n suggestionCount: suggestions.length,\r\n suggestions,\r\n });\r\n\r\n\r\n return {\r\n query: input.query,\r\n content: renderedInput,\r\n data: genOutput.data,\r\n suggestions\r\n };\r\n } catch (err) {\r\n console.warn('⚠️ commitSuggesterModule failed:', err);\r\n logInputOutput('commitSuggesterModule', 'output', {\r\n status: 'error',\r\n error: err instanceof Error ? err.message : String(err),\r\n });\r\n return {\r\n query: input.query,\r\n content: renderedInput,\r\n data: {},\r\n suggestions: []\r\n };\r\n }\r\n }\r\n};\r\n"]}
|
|
@@ -29,6 +29,12 @@ Respond concisely but analytically.
|
|
|
29
29
|
const aiResponse = await generate({
|
|
30
30
|
query,
|
|
31
31
|
content: promptText,
|
|
32
|
+
}, {
|
|
33
|
+
caller: "contextReviewModule",
|
|
34
|
+
inputContext: {
|
|
35
|
+
query,
|
|
36
|
+
contextText,
|
|
37
|
+
},
|
|
32
38
|
});
|
|
33
39
|
// ✅ Model output is in aiResponse.data
|
|
34
40
|
const modelText = typeof aiResponse.data === "string"
|
|
@@ -46,7 +52,12 @@ Respond concisely but analytically.
|
|
|
46
52
|
understanding: modelText,
|
|
47
53
|
},
|
|
48
54
|
};
|
|
49
|
-
logInputOutput("contextReview", "output",
|
|
55
|
+
logInputOutput("contextReview", "output", {
|
|
56
|
+
callId: aiResponse.trace?.callId,
|
|
57
|
+
decision,
|
|
58
|
+
understanding: modelText,
|
|
59
|
+
});
|
|
50
60
|
return output;
|
|
51
61
|
},
|
|
52
62
|
};
|
|
63
|
+
//# sourceMappingURL=contextReviewModule.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contextReviewModule.js","sourceRoot":"","sources":["../../../src/pipeline/modules/contextReviewModule.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAOhE,MAAM,CAAC,MAAM,mBAAmB,GAAW;IACvC,IAAI,EAAE,eAAe;IACrB,WAAW,EACP,mGAAmG;IACvG,MAAM,EAAE,CAAC,UAAU,CAAC;IACpB,GAAG,EAAE,KAAK,EAAE,KAAe,EAAqB,EAAE;QAC9C,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;QAE1B,+CAA+C;QAC/C,MAAM,WAAW,GACb,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ;YAC7B,CAAC,CAAC,KAAK,CAAC,OAAO;YACf,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAEvD,MAAM,UAAU,GAAG;;;;EAIzB,KAAK;;;EAGL,WAAW;;;;;;;CAOZ,CAAC,IAAI,EAAE,CAAC;QAED,kDAAkD;QAClD,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC;YAC9B,KAAK;YACL,OAAO,EAAE,UAAU;SACtB,EAAE;YACC,MAAM,EAAE,qBAAqB;YAC7B,YAAY,EAAE;gBACV,KAAK;gBACL,WAAW;aACd;SACJ,CAAC,CAAC;QAEH,uCAAuC;QACvC,MAAM,SAAS,GACX,OAAO,UAAU,CAAC,IAAI,KAAK,QAAQ;YAC/B,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE;YACxB,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAE1C,MAAM,KAAK,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC;QACtC,MAAM,QAAQ,GACV,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC;YACzD,CAAC,CAAC,cAAc;YAChB,CAAC,CAAC,iBAAiB,CAAC;QAE5B,2CAA2C;QAC3C,MAAM,MAAM,GAAa;YACrB,KAAK;YACL,IAAI,EAAE;gBACF,QAAQ;gBACR,aAAa,EAAE,SAAS;aAC3B;SACJ,CAAC;QAEF,cAAc,CAAC,eAAe,EAAE,QAAQ,EAAE;YACtC,MAAM,EAAE,UAAU,CAAC,KAAK,EAAE,MAAM;YAChC,QAAQ;YACR,aAAa,EAAE,SAAS;SAC3B,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAClB,CAAC;CACJ,CAAC","sourcesContent":["/**\n * Reviews summary-level context to decide if the agent should read deeper before answering.\n */\nimport { Module, ModuleIO } from \"../../types.js\";\nimport { generate } from \"../../lib/generate.js\";\nimport { logInputOutput } from \"../../utils/promptLogHelper.js\";\n\nexport interface ContextReviewData {\n decision: \"needFullRead\" | \"enoughForAnswer\";\n understanding: string;\n}\n\nexport const contextReviewModule: Module = {\n name: \"contextReview\",\n description:\n \"Analyzes summaries and global context to decide if reading full files is needed before answering.\",\n groups: [\"analysis\"],\n run: async (input: ModuleIO): Promise<ModuleIO> => {\n const query = input.query;\n\n // Convert content to a text blob for the model\n const contextText =\n typeof input.content === \"string\"\n ? input.content\n : JSON.stringify(input.content ?? \"\", null, 2);\n\n const promptText = `\nYou are an AI reasoning agent reviewing file summaries and contextual notes for a software repository.\n\nUser query:\n${query}\n\nContext:\n${contextText}\n\nYour task:\n1. Summarize what this context reveals about the codebase.\n2. Identify what is still missing or unclear.\n3. Decide if reading full file contents is required (\"needFullRead\") or if current summaries are enough (\"enoughForAnswer\").\nRespond concisely but analytically.\n`.trim();\n\n // ✅ Call generate() with ModuleIO-compliant input\n const aiResponse = await generate({\n query,\n content: promptText,\n }, {\n caller: \"contextReviewModule\",\n inputContext: {\n query,\n contextText,\n },\n });\n\n // ✅ Model output is in aiResponse.data\n const modelText =\n typeof aiResponse.data === \"string\"\n ? aiResponse.data.trim()\n : JSON.stringify(aiResponse.data);\n\n const lower = modelText.toLowerCase();\n const decision: ContextReviewData[\"decision\"] =\n lower.includes(\"needfullread\") || lower.includes(\"read full\")\n ? \"needFullRead\"\n : \"enoughForAnswer\";\n\n // ✅ Return fully ModuleIO-compliant output\n const output: ModuleIO = {\n query,\n data: {\n decision,\n understanding: modelText,\n },\n };\n\n logInputOutput(\"contextReview\", \"output\", {\n callId: aiResponse.trace?.callId,\n decision,\n understanding: modelText,\n });\n return output;\n },\n};\n"]}
|