scai 0.1.178 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +162 -267
- package/dist/__tests__/CommitSuggesterCmd.test.js +112 -0
- package/dist/__tests__/CommitSuggesterCmd.test.js.map +1 -0
- package/dist/__tests__/EvalReportCmd.test.js +645 -0
- package/dist/__tests__/EvalReportCmd.test.js.map +1 -0
- package/dist/__tests__/ModelCmd.test.js +64 -0
- package/dist/__tests__/ModelCmd.test.js.map +1 -0
- package/dist/__tests__/agents/agentActions.test.js +345 -0
- package/dist/__tests__/agents/agentActions.test.js.map +1 -0
- package/dist/__tests__/agents/agentFeedback.test.js +118 -0
- package/dist/__tests__/agents/agentFeedback.test.js.map +1 -0
- package/dist/__tests__/agents/agentGeneralScope.test.js +74 -0
- package/dist/__tests__/agents/agentGeneralScope.test.js.map +1 -0
- package/dist/__tests__/agents/agentLoop.test.js +1723 -0
- package/dist/__tests__/agents/agentLoop.test.js.map +1 -0
- package/dist/__tests__/agents/agentPolicyState.test.js +948 -0
- package/dist/__tests__/agents/agentPolicyState.test.js.map +1 -0
- package/dist/__tests__/agents/agentReadEvidence.test.js +170 -0
- package/dist/__tests__/agents/agentReadEvidence.test.js.map +1 -0
- package/dist/__tests__/agents/agentReadPersistence.test.js +129 -0
- package/dist/__tests__/agents/agentReadPersistence.test.js.map +1 -0
- package/dist/__tests__/agents/agentResumeCheckpoint.test.js +90 -0
- package/dist/__tests__/agents/agentResumeCheckpoint.test.js.map +1 -0
- package/dist/__tests__/agents/agentSearchBatchPlanner.test.js +289 -0
- package/dist/__tests__/agents/agentSearchBatchPlanner.test.js.map +1 -0
- package/dist/__tests__/agents/agentSearchOwnership.test.js +166 -0
- package/dist/__tests__/agents/agentSearchOwnership.test.js.map +1 -0
- package/dist/__tests__/agents/agentSearchRanking.test.js +139 -0
- package/dist/__tests__/agents/agentSearchRanking.test.js.map +1 -0
- package/dist/__tests__/agents/agentSearchRouting.test.js +584 -0
- package/dist/__tests__/agents/agentSearchRouting.test.js.map +1 -0
- package/dist/__tests__/agents/agentSearchScoring.test.js +23 -0
- package/dist/__tests__/agents/agentSearchScoring.test.js.map +1 -0
- package/dist/__tests__/agents/agentSearchShared.test.js +78 -0
- package/dist/__tests__/agents/agentSearchShared.test.js.map +1 -0
- package/dist/__tests__/agents/agentStateMachine.test.js +58 -0
- package/dist/__tests__/agents/agentStateMachine.test.js.map +1 -0
- package/dist/__tests__/agents/agentTaskPersistence.test.js +156 -0
- package/dist/__tests__/agents/agentTaskPersistence.test.js.map +1 -0
- package/dist/__tests__/agents/agentTools.test.js +69 -0
- package/dist/__tests__/agents/agentTools.test.js.map +1 -0
- package/dist/__tests__/agents/agentTransform.test.js +779 -0
- package/dist/__tests__/agents/agentTransform.test.js.map +1 -0
- package/dist/__tests__/agents/analysisPlanGenStep.test.js +157 -0
- package/dist/__tests__/agents/analysisPlanGenStep.test.js.map +1 -0
- package/dist/__tests__/agents/answerOnlyCompletion.test.js +75 -0
- package/dist/__tests__/agents/answerOnlyCompletion.test.js.map +1 -0
- package/dist/__tests__/agents/decideNextAction.test.js +1662 -0
- package/dist/__tests__/agents/decideNextAction.test.js.map +1 -0
- package/dist/__tests__/agents/deriveFocusFromSearchStep.test.js +258 -0
- package/dist/__tests__/agents/deriveFocusFromSearchStep.test.js.map +1 -0
- package/dist/__tests__/agents/evidenceVerifierStep.test.js +113 -0
- package/dist/__tests__/agents/evidenceVerifierStep.test.js.map +1 -0
- package/dist/__tests__/agents/executionPolicyResolver.test.js +208 -0
- package/dist/__tests__/agents/executionPolicyResolver.test.js.map +1 -0
- package/dist/__tests__/agents/fileCheckStep.test.js +299 -0
- package/dist/__tests__/agents/fileCheckStep.test.js.map +1 -0
- package/dist/__tests__/agents/giveUpEvaluatorStep.test.js +35 -0
- package/dist/__tests__/agents/giveUpEvaluatorStep.test.js.map +1 -0
- package/dist/__tests__/agents/guardState.test.js +297 -0
- package/dist/__tests__/agents/guardState.test.js.map +1 -0
- package/dist/__tests__/agents/mainAgentHeuristics.test.js +72 -0
- package/dist/__tests__/agents/mainAgentHeuristics.test.js.map +1 -0
- package/dist/__tests__/agents/objectiveEvaluatorStep.test.js +60 -0
- package/dist/__tests__/agents/objectiveEvaluatorStep.test.js.map +1 -0
- package/dist/__tests__/agents/outerLoopRecoveryEvaluator.test.js +207 -0
- package/dist/__tests__/agents/outerLoopRecoveryEvaluator.test.js.map +1 -0
- package/dist/__tests__/agents/prompting.test.js +363 -0
- package/dist/__tests__/agents/prompting.test.js.map +1 -0
- package/dist/__tests__/agents/readinessGateStep.test.js +180 -0
- package/dist/__tests__/agents/readinessGateStep.test.js.map +1 -0
- package/dist/__tests__/agents/reasonNextStep.test.js +56 -0
- package/dist/__tests__/agents/reasonNextStep.test.js.map +1 -0
- package/dist/__tests__/agents/reasonNextTaskStep.test.js +284 -0
- package/dist/__tests__/agents/reasonNextTaskStep.test.js.map +1 -0
- package/dist/__tests__/agents/resolveAgentTargetClassification.test.js +170 -0
- package/dist/__tests__/agents/resolveAgentTargetClassification.test.js.map +1 -0
- package/dist/__tests__/agents/resolveProgressState.test.js +526 -0
- package/dist/__tests__/agents/resolveProgressState.test.js.map +1 -0
- package/dist/__tests__/agents/resumeCheckpoint.test.js +50 -0
- package/dist/__tests__/agents/resumeCheckpoint.test.js.map +1 -0
- package/dist/__tests__/agents/routingDecisionStep.test.js +134 -0
- package/dist/__tests__/agents/routingDecisionStep.test.js.map +1 -0
- package/dist/__tests__/agents/scopeClassificationStep.test.js +118 -0
- package/dist/__tests__/agents/scopeClassificationStep.test.js.map +1 -0
- package/dist/__tests__/agents/searchContext.test.js +97 -0
- package/dist/__tests__/agents/searchContext.test.js.map +1 -0
- package/dist/__tests__/agents/selectRelevantSourcesStep.test.js +73 -0
- package/dist/__tests__/agents/selectRelevantSourcesStep.test.js.map +1 -0
- package/dist/__tests__/agents/structuredOutput.test.js +45 -0
- package/dist/__tests__/agents/structuredOutput.test.js.map +1 -0
- package/dist/__tests__/agents/transformPlanGenStep.fallback.test.js +59 -0
- package/dist/__tests__/agents/transformPlanGenStep.fallback.test.js.map +1 -0
- package/dist/__tests__/agents/transformPlanGenStep.test.js +92 -0
- package/dist/__tests__/agents/transformPlanGenStep.test.js.map +1 -0
- package/dist/__tests__/agents/understandIntentStep.test.js +237 -0
- package/dist/__tests__/agents/understandIntentStep.test.js.map +1 -0
- package/dist/__tests__/agents/understandResumeContext.test.js +65 -0
- package/dist/__tests__/agents/understandResumeContext.test.js.map +1 -0
- package/dist/__tests__/agents/understandScope.test.js +227 -0
- package/dist/__tests__/agents/understandScope.test.js.map +1 -0
- package/dist/__tests__/agents/validateChangesStep.test.js +52 -0
- package/dist/__tests__/agents/validateChangesStep.test.js.map +1 -0
- package/dist/__tests__/askCommandTaskBinding.test.js +176 -0
- package/dist/__tests__/askCommandTaskBinding.test.js.map +1 -0
- package/dist/__tests__/commandVisibility.test.js +25 -0
- package/dist/__tests__/commandVisibility.test.js.map +1 -0
- package/dist/__tests__/config.devOutput.test.js +82 -0
- package/dist/__tests__/config.devOutput.test.js.map +1 -0
- package/dist/__tests__/currentContext.test.js +43 -0
- package/dist/__tests__/currentContext.test.js.map +1 -0
- package/dist/__tests__/daemonWorker.test.js +51 -0
- package/dist/__tests__/daemonWorker.test.js.map +1 -0
- package/dist/__tests__/dialogState.test.js +113 -0
- package/dist/__tests__/dialogState.test.js.map +1 -0
- package/dist/__tests__/evalCommands.test.js +506 -0
- package/dist/__tests__/evalCommands.test.js.map +1 -0
- package/dist/__tests__/evalCommandsSummary.test.js +68 -0
- package/dist/__tests__/evalCommandsSummary.test.js.map +1 -0
- package/dist/__tests__/example.test.js +1 -0
- package/dist/__tests__/example.test.js.map +1 -0
- package/dist/__tests__/factory.commitCommand.test.js +45 -0
- package/dist/__tests__/factory.commitCommand.test.js.map +1 -0
- package/dist/__tests__/factory.devOutputCommand.test.js +122 -0
- package/dist/__tests__/factory.devOutputCommand.test.js.map +1 -0
- package/dist/__tests__/factory.evalCommands.test.js +38 -0
- package/dist/__tests__/factory.evalCommands.test.js.map +1 -0
- package/dist/__tests__/factory.planCommand.test.js +35 -0
- package/dist/__tests__/factory.planCommand.test.js.map +1 -0
- package/dist/__tests__/factory.setupCommand.test.js +34 -0
- package/dist/__tests__/factory.setupCommand.test.js.map +1 -0
- package/dist/__tests__/factory.statusCommand.test.js +54 -0
- package/dist/__tests__/factory.statusCommand.test.js.map +1 -0
- package/dist/__tests__/fileRules/queryTokenRules.test.js +35 -0
- package/dist/__tests__/fileRules/queryTokenRules.test.js.map +1 -0
- package/dist/__tests__/fileRules/searchPathClassification.test.js +57 -0
- package/dist/__tests__/fileRules/searchPathClassification.test.js.map +1 -0
- package/dist/__tests__/generate.ollamaRecovery.test.js +344 -0
- package/dist/__tests__/generate.ollamaRecovery.test.js.map +1 -0
- package/dist/__tests__/index.modelStartup.test.js +24 -0
- package/dist/__tests__/index.modelStartup.test.js.map +1 -0
- package/dist/__tests__/indexCmd.test.js +85 -0
- package/dist/__tests__/indexCmd.test.js.map +1 -0
- package/dist/__tests__/indexSlashCommand.test.js +50 -0
- package/dist/__tests__/indexSlashCommand.test.js.map +1 -0
- package/dist/__tests__/ollamaService.test.js +103 -0
- package/dist/__tests__/ollamaService.test.js.map +1 -0
- package/dist/__tests__/pipeline/modules/codeTransformModule.small-file.test.js +68 -0
- package/dist/__tests__/pipeline/modules/codeTransformModule.small-file.test.js.map +1 -0
- package/dist/__tests__/pipeline/modules/commitSuggesterModule.test.js +68 -0
- package/dist/__tests__/pipeline/modules/commitSuggesterModule.test.js.map +1 -0
- package/dist/__tests__/pipeline/modules/fileSearchModule.test.js +284 -0
- package/dist/__tests__/pipeline/modules/fileSearchModule.test.js.map +1 -0
- package/dist/__tests__/pipeline/modules/finalAnswerModule.test.js +1139 -0
- package/dist/__tests__/pipeline/modules/finalAnswerModule.test.js.map +1 -0
- package/dist/__tests__/pipeline/modules/readFileModule.test.js +146 -0
- package/dist/__tests__/pipeline/modules/readFileModule.test.js.map +1 -0
- package/dist/__tests__/pipeline/modules/semanticAnalysisModule.test.js +192 -0
- package/dist/__tests__/pipeline/modules/semanticAnalysisModule.test.js.map +1 -0
- package/dist/__tests__/repoIdentity.test.js +31 -0
- package/dist/__tests__/repoIdentity.test.js.map +1 -0
- package/dist/__tests__/resumeContext.test.js +87 -0
- package/dist/__tests__/resumeContext.test.js.map +1 -0
- package/dist/__tests__/resumeState.test.js +239 -0
- package/dist/__tests__/resumeState.test.js.map +1 -0
- package/dist/__tests__/search/SearchOrchestrator.test.js +836 -0
- package/dist/__tests__/search/SearchOrchestrator.test.js.map +1 -0
- package/dist/__tests__/shellDialogUi.test.js +52 -0
- package/dist/__tests__/shellDialogUi.test.js.map +1 -0
- package/dist/__tests__/shellSession.test.js +102 -0
- package/dist/__tests__/shellSession.test.js.map +1 -0
- package/dist/__tests__/statusOwner.test.js +215 -0
- package/dist/__tests__/statusOwner.test.js.map +1 -0
- package/dist/__tests__/testing/contextEval.test.js +244 -0
- package/dist/__tests__/testing/contextEval.test.js.map +1 -0
- package/dist/__tests__/testing/harnessArtifacts.test.js +124 -0
- package/dist/__tests__/testing/harnessArtifacts.test.js.map +1 -0
- package/dist/__tests__/testing/llmTraceSession.test.js +67 -0
- package/dist/__tests__/testing/llmTraceSession.test.js.map +1 -0
- package/dist/__tests__/testing/registerDevCliCommands.test.js +35 -0
- package/dist/__tests__/testing/registerDevCliCommands.test.js.map +1 -0
- package/dist/__tests__/testing/runDiagnosis.test.js +159 -0
- package/dist/__tests__/testing/runDiagnosis.test.js.map +1 -0
- package/dist/__tests__/testing/runtimeLogReader.test.js +66 -0
- package/dist/__tests__/testing/runtimeLogReader.test.js.map +1 -0
- package/dist/__tests__/testing/testCommands.test.js +53 -0
- package/dist/__tests__/testing/testCommands.test.js.map +1 -0
- package/dist/__tests__/utils/compileSearchQuery.test.js +38 -0
- package/dist/__tests__/utils/compileSearchQuery.test.js.map +1 -0
- package/dist/__tests__/utils/consolePresentation.test.js +105 -0
- package/dist/__tests__/utils/consolePresentation.test.js.map +1 -0
- package/dist/__tests__/utils/extractFileReferences.test.js +41 -0
- package/dist/__tests__/utils/extractFileReferences.test.js.map +1 -0
- package/dist/__tests__/utils/log.test.js +34 -0
- package/dist/__tests__/utils/log.test.js.map +1 -0
- package/dist/__tests__/utils/runtimeLogger.test.js +200 -0
- package/dist/__tests__/utils/runtimeLogger.test.js.map +1 -0
- package/dist/__tests__/utils/spinner.test.js +31 -0
- package/dist/__tests__/utils/spinner.test.js.map +1 -0
- package/dist/__tests__/utils/verifyFocusPreference.test.js +41 -0
- package/dist/__tests__/utils/verifyFocusPreference.test.js.map +1 -0
- package/dist/agent/actions/index.js +301 -0
- package/dist/agent/actions/index.js.map +1 -0
- package/dist/agent/actions/normalize.js +360 -0
- package/dist/agent/actions/normalize.js.map +1 -0
- package/dist/agent/actions/schemas.js +129 -0
- package/dist/agent/actions/schemas.js.map +1 -0
- package/dist/agent/evidence/index.js +320 -0
- package/dist/agent/evidence/index.js.map +1 -0
- package/dist/agent/feedback/index.js +187 -0
- package/dist/agent/feedback/index.js.map +1 -0
- package/dist/agent/finalization/index.js +35 -0
- package/dist/agent/finalization/index.js.map +1 -0
- package/dist/agent/index.js +126 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/agent/logging/index.js +350 -0
- package/dist/agent/logging/index.js.map +1 -0
- package/dist/agent/persistence/boot.js +58 -0
- package/dist/agent/persistence/boot.js.map +1 -0
- package/dist/agent/persistence/currentTask.js +36 -0
- package/dist/agent/persistence/currentTask.js.map +1 -0
- package/dist/agent/persistence/hydrate.js +42 -0
- package/dist/agent/persistence/hydrate.js.map +1 -0
- package/dist/agent/persistence/index.js +15 -0
- package/dist/agent/persistence/index.js.map +1 -0
- package/dist/agent/persistence/snapshots.js +97 -0
- package/dist/agent/persistence/snapshots.js.map +1 -0
- package/dist/agent/persistence/steps.js +95 -0
- package/dist/agent/persistence/steps.js.map +1 -0
- package/dist/agent/persistence/tasks.js +195 -0
- package/dist/agent/persistence/tasks.js.map +1 -0
- package/dist/agent/persistence/turns.js +92 -0
- package/dist/agent/persistence/turns.js.map +1 -0
- package/dist/agent/policy/ambiguityResolution.js +226 -0
- package/dist/agent/policy/ambiguityResolution.js.map +1 -0
- package/dist/agent/policy/contracts.js +2 -0
- package/dist/agent/policy/contracts.js.map +1 -0
- package/dist/agent/policy/coveragePolicy.js +309 -0
- package/dist/agent/policy/coveragePolicy.js.map +1 -0
- package/dist/agent/policy/endDecisionPolicy.js +31 -0
- package/dist/agent/policy/endDecisionPolicy.js.map +1 -0
- package/dist/agent/policy/index.js +344 -0
- package/dist/agent/policy/index.js.map +1 -0
- package/dist/agent/policy/loopReview.js +778 -0
- package/dist/agent/policy/loopReview.js.map +1 -0
- package/dist/agent/policy/readinessPolicy.js +108 -0
- package/dist/agent/policy/readinessPolicy.js.map +1 -0
- package/dist/agent/policy/resolutionPipeline.js +356 -0
- package/dist/agent/policy/resolutionPipeline.js.map +1 -0
- package/dist/agent/policy/targetClassification.js +33 -0
- package/dist/agent/policy/targetClassification.js.map +1 -0
- package/dist/agent/prompting/actionChoice.js +90 -0
- package/dist/agent/prompting/actionChoice.js.map +1 -0
- package/dist/agent/prompting/finalAnswer.js +38 -0
- package/dist/agent/prompting/finalAnswer.js.map +1 -0
- package/dist/agent/prompting/index.js +14 -0
- package/dist/agent/prompting/index.js.map +1 -0
- package/dist/agent/prompting/plan.js +59 -0
- package/dist/agent/prompting/plan.js.map +1 -0
- package/dist/agent/prompting/transform.js +175 -0
- package/dist/agent/prompting/transform.js.map +1 -0
- package/dist/agent/prompting/understand.js +70 -0
- package/dist/agent/prompting/understand.js.map +1 -0
- package/dist/agent/read/freshness.js +29 -0
- package/dist/agent/read/freshness.js.map +1 -0
- package/dist/agent/read/fullReadPrompt.js +43 -0
- package/dist/agent/read/fullReadPrompt.js.map +1 -0
- package/dist/agent/read/index.js +140 -0
- package/dist/agent/read/index.js.map +1 -0
- package/dist/agent/read/persistence.js +88 -0
- package/dist/agent/read/persistence.js.map +1 -0
- package/dist/agent/read/summarizeReadEvidence.js +733 -0
- package/dist/agent/read/summarizeReadEvidence.js.map +1 -0
- package/dist/agent/read/targetResolution.js +126 -0
- package/dist/agent/read/targetResolution.js.map +1 -0
- package/dist/agent/resume/checkpoint.js +41 -0
- package/dist/agent/resume/checkpoint.js.map +1 -0
- package/dist/agent/runtime/lifecycle.js +67 -0
- package/dist/agent/runtime/lifecycle.js.map +1 -0
- package/dist/agent/runtime/progress.js +178 -0
- package/dist/agent/runtime/progress.js.map +1 -0
- package/dist/agent/runtime/runAgentLoop.js +402 -0
- package/dist/agent/runtime/runAgentLoop.js.map +1 -0
- package/dist/agent/runtime/runAgentPlanOnly.js +127 -0
- package/dist/agent/runtime/runAgentPlanOnly.js.map +1 -0
- package/dist/agent/runtime/understand.js +336 -0
- package/dist/agent/runtime/understand.js.map +1 -0
- package/dist/agent/search/batchPlanner.js +274 -0
- package/dist/agent/search/batchPlanner.js.map +1 -0
- package/dist/agent/search/candidateRetentionPolicy.js +184 -0
- package/dist/agent/search/candidateRetentionPolicy.js.map +1 -0
- package/dist/agent/search/directory.js +51 -0
- package/dist/agent/search/directory.js.map +1 -0
- package/dist/agent/search/exactTarget.js +151 -0
- package/dist/agent/search/exactTarget.js.map +1 -0
- package/dist/agent/search/fragment.js +110 -0
- package/dist/agent/search/fragment.js.map +1 -0
- package/dist/agent/search/index.js +166 -0
- package/dist/agent/search/index.js.map +1 -0
- package/dist/agent/search/laneClassifier.js +119 -0
- package/dist/agent/search/laneClassifier.js.map +1 -0
- package/dist/agent/search/limits.js +10 -0
- package/dist/agent/search/limits.js.map +1 -0
- package/dist/agent/search/ranking.js +22 -0
- package/dist/agent/search/ranking.js.map +1 -0
- package/dist/agent/search/regex.js +83 -0
- package/dist/agent/search/regex.js.map +1 -0
- package/dist/agent/search/routePolicy.js +11 -0
- package/dist/agent/search/routePolicy.js.map +1 -0
- package/dist/agent/search/searchContext.js +128 -0
- package/dist/agent/search/searchContext.js.map +1 -0
- package/dist/agent/search/semantic.js +113 -0
- package/dist/agent/search/semantic.js.map +1 -0
- package/dist/agent/search/semanticIndexSearch.js +202 -0
- package/dist/agent/search/semanticIndexSearch.js.map +1 -0
- package/dist/agent/search/shared.js +283 -0
- package/dist/agent/search/shared.js.map +1 -0
- package/dist/agent/search/shell.js +202 -0
- package/dist/agent/search/shell.js.map +1 -0
- package/dist/agent/search/snippetEvidence.js +57 -0
- package/dist/agent/search/snippetEvidence.js.map +1 -0
- package/dist/agent/search/types.js +2 -0
- package/dist/agent/search/types.js.map +1 -0
- package/dist/agent/state/index.js +99 -0
- package/dist/agent/state/index.js.map +1 -0
- package/dist/agent/state/memory.js +56 -0
- package/dist/agent/state/memory.js.map +1 -0
- package/dist/agent/structuredOutput/index.js +28 -0
- package/dist/agent/structuredOutput/index.js.map +1 -0
- package/dist/agent/tools/index.js +199 -0
- package/dist/agent/tools/index.js.map +1 -0
- package/dist/agent/transform/index.js +519 -0
- package/dist/agent/transform/index.js.map +1 -0
- package/dist/agent/transform/syntax.js +49 -0
- package/dist/agent/transform/syntax.js.map +1 -0
- package/dist/agent/types.js +20 -0
- package/dist/agent/types.js.map +1 -0
- package/dist/agents/actionRegistry.js +114 -0
- package/dist/agents/actionRegistry.js.map +1 -0
- package/dist/agents/agent.js +5 -0
- package/dist/agents/agent.js.map +1 -0
- package/dist/agents/agentActions.js +5 -0
- package/dist/agents/agentActions.js.map +1 -0
- package/dist/agents/agentEvidence.js +5 -0
- package/dist/agents/agentEvidence.js.map +1 -0
- package/dist/agents/agentFeedback.js +5 -0
- package/dist/agents/agentFeedback.js.map +1 -0
- package/dist/agents/agentLogging.js +5 -0
- package/dist/agents/agentLogging.js.map +1 -0
- package/dist/agents/agentLoop.js +5 -0
- package/dist/agents/agentLoop.js.map +1 -0
- package/dist/agents/agentMemory.js +5 -0
- package/dist/agents/agentMemory.js.map +1 -0
- package/dist/agents/agentPlanMode.js +5 -0
- package/dist/agents/agentPlanMode.js.map +1 -0
- package/dist/agents/agentPolicyState.js +5 -0
- package/dist/agents/agentPolicyState.js.map +1 -0
- package/dist/agents/agentProgress.js +93 -0
- package/dist/agents/agentProgress.js.map +1 -0
- package/dist/agents/agentSchemas.js +5 -0
- package/dist/agents/agentSchemas.js.map +1 -0
- package/dist/agents/agentSearchScoring.js +5 -0
- package/dist/agents/agentSearchScoring.js.map +1 -0
- package/dist/agents/agentStateMachine.js +5 -0
- package/dist/agents/agentStateMachine.js.map +1 -0
- package/dist/agents/agentTools.js +5 -0
- package/dist/agents/agentTools.js.map +1 -0
- package/dist/agents/agentTypes.js +5 -0
- package/dist/agents/agentTypes.js.map +1 -0
- package/dist/agents/agentUnderstand.js +5 -0
- package/dist/agents/agentUnderstand.js.map +1 -0
- package/dist/agents/analysisPlanGenStep.js +194 -17
- package/dist/agents/analysisPlanGenStep.js.map +1 -0
- package/dist/agents/answerOnlyCompletion.js +32 -0
- package/dist/agents/answerOnlyCompletion.js.map +1 -0
- package/dist/agents/collaboratorStep.js +1 -0
- package/dist/agents/collaboratorStep.js.map +1 -0
- package/dist/agents/decideNextAction.js +444 -0
- package/dist/agents/decideNextAction.js.map +1 -0
- package/dist/agents/deriveFocusFromSearchStep.js +83 -0
- package/dist/agents/deriveFocusFromSearchStep.js.map +1 -0
- package/dist/agents/evidenceVerifierStep.js +104 -13
- package/dist/agents/evidenceVerifierStep.js.map +1 -0
- package/dist/agents/fileCheckStep.js +381 -12
- package/dist/agents/fileCheckStep.js.map +1 -0
- package/dist/agents/giveUpEvaluatorStep.js +63 -0
- package/dist/agents/giveUpEvaluatorStep.js.map +1 -0
- package/dist/agents/guardPolicy.js +20 -0
- package/dist/agents/guardPolicy.js.map +1 -0
- package/dist/agents/guards/executionPolicyResolver.js +165 -0
- package/dist/agents/guards/executionPolicyResolver.js.map +1 -0
- package/dist/agents/guards/guardState.js +195 -0
- package/dist/agents/guards/guardState.js.map +1 -0
- package/dist/agents/guards/resolveProgressState.js +403 -0
- package/dist/agents/guards/resolveProgressState.js.map +1 -0
- package/dist/agents/infoPlanGenStep.js +66 -8
- package/dist/agents/infoPlanGenStep.js.map +1 -0
- package/dist/agents/integrateFeedbackStep.js +1 -0
- package/dist/agents/integrateFeedbackStep.js.map +1 -0
- package/dist/agents/iterationFileSelector.js +8 -7
- package/dist/agents/iterationFileSelector.js.map +1 -0
- package/dist/agents/mainAgentActivityLog.js +85 -0
- package/dist/agents/mainAgentActivityLog.js.map +1 -0
- package/dist/agents/mainAgentHeuristics.js +173 -0
- package/dist/agents/mainAgentHeuristics.js.map +1 -0
- package/dist/agents/mainAgentVerify.js +159 -0
- package/dist/agents/mainAgentVerify.js.map +1 -0
- package/dist/agents/objectiveEvaluatorStep.js +103 -0
- package/dist/agents/objectiveEvaluatorStep.js.map +1 -0
- package/dist/agents/outerLoopRecoveryEvaluator.js +108 -0
- package/dist/agents/outerLoopRecoveryEvaluator.js.map +1 -0
- package/dist/agents/readinessGateStep.js +95 -9
- package/dist/agents/readinessGateStep.js.map +1 -0
- package/dist/agents/reasonNextStep.js +9 -8
- package/dist/agents/reasonNextStep.js.map +1 -0
- package/dist/agents/reasonNextTaskStep.js +267 -144
- package/dist/agents/reasonNextTaskStep.js.map +1 -0
- package/dist/agents/researchPlanGenStep.js +61 -25
- package/dist/agents/researchPlanGenStep.js.map +1 -0
- package/dist/agents/resolveAgentTargetClassification.js +5 -0
- package/dist/agents/resolveAgentTargetClassification.js.map +1 -0
- package/dist/agents/resolveExecutionModeStep.js +1 -0
- package/dist/agents/resolveExecutionModeStep.js.map +1 -0
- package/dist/agents/resolveExplicitTargetsStep.js +74 -0
- package/dist/agents/resolveExplicitTargetsStep.js.map +1 -0
- package/dist/agents/routingDecisionStep.js +58 -11
- package/dist/agents/routingDecisionStep.js.map +1 -0
- package/dist/agents/scopeClassificationStep.js +66 -3
- package/dist/agents/scopeClassificationStep.js.map +1 -0
- package/dist/agents/selectRelevantSourcesStep.js +13 -5
- package/dist/agents/selectRelevantSourcesStep.js.map +1 -0
- package/dist/agents/structuralPreloadStep.js +3 -4
- package/dist/agents/structuralPreloadStep.js.map +1 -0
- package/dist/agents/transformPlanGenStep.js +105 -18
- package/dist/agents/transformPlanGenStep.js.map +1 -0
- package/dist/agents/understandIntentStep.js +237 -17
- package/dist/agents/understandIntentStep.js.map +1 -0
- package/dist/agents/validateChangesStep.js +16 -2
- package/dist/agents/validateChangesStep.js.map +1 -0
- package/dist/agents/writeFileStep.js +1 -0
- package/dist/agents/writeFileStep.js.map +1 -0
- package/dist/commands/AskCmd.js +139 -44
- package/dist/commands/AskCmd.js.map +1 -0
- package/dist/commands/BackupCmd.js +1 -0
- package/dist/commands/BackupCmd.js.map +1 -0
- package/dist/commands/ChangeLogUpdateCmd.js +1 -0
- package/dist/commands/ChangeLogUpdateCmd.js.map +1 -0
- package/dist/commands/CommitSuggesterCmd.js +55 -13
- package/dist/commands/CommitSuggesterCmd.js.map +1 -0
- package/dist/commands/DaemonCmd.js +52 -14
- package/dist/commands/DaemonCmd.js.map +1 -0
- package/dist/commands/DeleteIndex.js +1 -0
- package/dist/commands/DeleteIndex.js.map +1 -0
- package/dist/commands/EvalReportCmd.js +374 -0
- package/dist/commands/EvalReportCmd.js.map +1 -0
- package/dist/commands/FindCmd.js +1 -0
- package/dist/commands/FindCmd.js.map +1 -0
- package/dist/commands/GitCmd.js +1 -0
- package/dist/commands/GitCmd.js.map +1 -0
- package/dist/commands/IndexCmd.js +11 -79
- package/dist/commands/IndexCmd.js.map +1 -0
- package/dist/commands/InspectCmd.js +1 -0
- package/dist/commands/InspectCmd.js.map +1 -0
- package/dist/commands/ModelCmd.js +24 -0
- package/dist/commands/ModelCmd.js.map +1 -0
- package/dist/commands/ReadlineSingleton.js +1 -0
- package/dist/commands/ReadlineSingleton.js.map +1 -0
- package/dist/commands/ResetDbCmd.js +18 -1
- package/dist/commands/ResetDbCmd.js.map +1 -0
- package/dist/commands/ReviewCmd.js +1 -0
- package/dist/commands/ReviewCmd.js.map +1 -0
- package/dist/commands/StatusCmd.js +22 -0
- package/dist/commands/StatusCmd.js.map +1 -0
- package/dist/commands/StopDaemonCmd.js +1 -0
- package/dist/commands/StopDaemonCmd.js.map +1 -0
- package/dist/commands/SummaryCmd.js +1 -0
- package/dist/commands/SummaryCmd.js.map +1 -0
- package/dist/commands/SwitchCmd.js +9 -15
- package/dist/commands/SwitchCmd.js.map +1 -0
- package/dist/commands/TasksCmd.js +142 -57
- package/dist/commands/TasksCmd.js.map +1 -0
- package/dist/commands/TestCmd.js +66 -0
- package/dist/commands/TestCmd.js.map +1 -0
- package/dist/commands/WorkflowCmd.js +1 -0
- package/dist/commands/WorkflowCmd.js.map +1 -0
- package/dist/commands/commandVisibility.js +27 -0
- package/dist/commands/commandVisibility.js.map +1 -0
- package/dist/commands/evalCommands.js +1337 -0
- package/dist/commands/evalCommands.js.map +1 -0
- package/dist/commands/factory.js +206 -38
- package/dist/commands/factory.js.map +1 -0
- package/dist/config.js +62 -11
- package/dist/config.js.map +1 -0
- package/dist/constants.js +21 -3
- package/dist/constants.js.map +1 -0
- package/dist/context.js +33 -32
- package/dist/context.js.map +1 -0
- package/dist/daemon/daemonQueues.js +1 -20
- package/dist/daemon/daemonQueues.js.map +1 -0
- package/dist/daemon/daemonWorker.js +26 -37
- package/dist/daemon/daemonWorker.js.map +1 -0
- package/dist/daemon/generateSummaries.js +1 -0
- package/dist/daemon/generateSummaries.js.map +1 -0
- package/dist/daemon/runFolderCapsuleBatch.js +1 -0
- package/dist/daemon/runFolderCapsuleBatch.js.map +1 -0
- package/dist/daemon/runIndexingBatch.js +1 -0
- package/dist/daemon/runIndexingBatch.js.map +1 -0
- package/dist/daemon/runKgBatch.js +9 -1
- package/dist/daemon/runKgBatch.js.map +1 -0
- package/dist/db/backup.js +1 -0
- package/dist/db/backup.js.map +1 -0
- package/dist/db/client.js +18 -3
- package/dist/db/client.js.map +1 -0
- package/dist/db/fileIndex.js +110 -152
- package/dist/db/fileIndex.js.map +1 -0
- package/dist/db/functionExtractors/extractFromJava.js +1 -0
- package/dist/db/functionExtractors/extractFromJava.js.map +1 -0
- package/dist/db/functionExtractors/extractFromJs.js +1 -0
- package/dist/db/functionExtractors/extractFromJs.js.map +1 -0
- package/dist/db/functionExtractors/extractFromTs.js +1 -0
- package/dist/db/functionExtractors/extractFromTs.js.map +1 -0
- package/dist/db/functionExtractors/extractFromXML.js +1 -0
- package/dist/db/functionExtractors/extractFromXML.js.map +1 -0
- package/dist/db/functionExtractors/index.js +1 -0
- package/dist/db/functionExtractors/index.js.map +1 -0
- package/dist/db/functionIndex.js +9 -0
- package/dist/db/functionIndex.js.map +1 -0
- package/dist/db/schema.js +314 -99
- package/dist/db/schema.js.map +1 -0
- package/dist/db/sqlTemplates.js +1 -0
- package/dist/db/sqlTemplates.js.map +1 -0
- package/dist/fileRules/builtins.js +1 -0
- package/dist/fileRules/builtins.js.map +1 -0
- package/dist/fileRules/classifyFile.js +1 -0
- package/dist/fileRules/classifyFile.js.map +1 -0
- package/dist/fileRules/codeAllowedExtensions.js +1 -0
- package/dist/fileRules/codeAllowedExtensions.js.map +1 -0
- package/dist/fileRules/detectFileType.js +1 -0
- package/dist/fileRules/detectFileType.js.map +1 -0
- package/dist/fileRules/fileClassifier.js +1 -0
- package/dist/fileRules/fileClassifier.js.map +1 -0
- package/dist/fileRules/fileExceptions.js +1 -0
- package/dist/fileRules/fileExceptions.js.map +1 -0
- package/dist/fileRules/ignoredExtensions.js +1 -0
- package/dist/fileRules/ignoredExtensions.js.map +1 -0
- package/dist/fileRules/ignoredPaths.js +48 -5
- package/dist/fileRules/ignoredPaths.js.map +1 -0
- package/dist/fileRules/queryTokenRules.js +176 -0
- package/dist/fileRules/queryTokenRules.js.map +1 -0
- package/dist/fileRules/searchPathClassification.js +58 -0
- package/dist/fileRules/searchPathClassification.js.map +1 -0
- package/dist/fileRules/shouldIgnoreFiles.js +1 -0
- package/dist/fileRules/shouldIgnoreFiles.js.map +1 -0
- package/dist/fileRules/stopWords.js +9 -0
- package/dist/fileRules/stopWords.js.map +1 -0
- package/dist/fileRules/wellKnownRepoFiles.js +1 -0
- package/dist/fileRules/wellKnownRepoFiles.js.map +1 -0
- package/dist/git/commitSummary.js +227 -0
- package/dist/git/commitSummary.js.map +1 -0
- package/dist/github/api.js +1 -0
- package/dist/github/api.js.map +1 -0
- package/dist/github/auth.js +1 -0
- package/dist/github/auth.js.map +1 -0
- package/dist/github/github.js +1 -0
- package/dist/github/github.js.map +1 -0
- package/dist/github/githubAuthCheck.js +1 -0
- package/dist/github/githubAuthCheck.js.map +1 -0
- package/dist/github/postComments.js +1 -0
- package/dist/github/postComments.js.map +1 -0
- package/dist/github/repo.js +15 -24
- package/dist/github/repo.js.map +1 -0
- package/dist/github/token.js +1 -0
- package/dist/github/token.js.map +1 -0
- package/dist/github/types.js +1 -0
- package/dist/github/types.js.map +1 -0
- package/dist/index.js +318 -37
- package/dist/index.js.map +1 -0
- package/dist/lib/generate.js +264 -20
- package/dist/lib/generate.js.map +1 -0
- package/dist/lib/generateFolderCapsules.js +1 -0
- package/dist/lib/generateFolderCapsules.js.map +1 -0
- package/dist/lib/ollamaModelPolicy.js +59 -0
- package/dist/lib/ollamaModelPolicy.js.map +1 -0
- package/dist/lib/spinner.js +29 -9
- package/dist/lib/spinner.js.map +1 -0
- package/dist/modelSetup.js +25 -78
- package/dist/modelSetup.js.map +1 -0
- package/dist/pipeline/modules/changeLogModule.js +10 -1
- package/dist/pipeline/modules/changeLogModule.js.map +1 -0
- package/dist/pipeline/modules/cleanupModule.js +1 -0
- package/dist/pipeline/modules/cleanupModule.js.map +1 -0
- package/dist/pipeline/modules/codeTransformModule.js +10 -16
- package/dist/pipeline/modules/codeTransformModule.js.map +1 -0
- package/dist/pipeline/modules/commentModule.js +12 -0
- package/dist/pipeline/modules/commentModule.js.map +1 -0
- package/dist/pipeline/modules/commitSuggesterModule.js +82 -12
- package/dist/pipeline/modules/commitSuggesterModule.js.map +1 -0
- package/dist/pipeline/modules/contextReviewModule.js +12 -1
- package/dist/pipeline/modules/contextReviewModule.js.map +1 -0
- package/dist/pipeline/modules/dialogAnswerModule.js +58 -0
- package/dist/pipeline/modules/dialogAnswerModule.js.map +1 -0
- package/dist/pipeline/modules/fileSearchModule.js +5 -143
- package/dist/pipeline/modules/fileSearchModule.js.map +1 -0
- package/dist/pipeline/modules/finalAnswerModule.js +1176 -151
- package/dist/pipeline/modules/finalAnswerModule.js.map +1 -0
- package/dist/pipeline/modules/kgModule.js +18 -1
- package/dist/pipeline/modules/kgModule.js.map +1 -0
- package/dist/pipeline/modules/planAnswerModule.js +99 -0
- package/dist/pipeline/modules/planAnswerModule.js.map +1 -0
- package/dist/pipeline/modules/readFileModule.js +300 -0
- package/dist/pipeline/modules/readFileModule.js.map +1 -0
- package/dist/pipeline/modules/reviewModule.js +10 -1
- package/dist/pipeline/modules/reviewModule.js.map +1 -0
- package/dist/pipeline/modules/searchDbModule.js +159 -0
- package/dist/pipeline/modules/searchDbModule.js.map +1 -0
- package/dist/pipeline/modules/searchListDirectoryModule.js +62 -0
- package/dist/pipeline/modules/searchListDirectoryModule.js.map +1 -0
- package/dist/pipeline/modules/searchModuleShared.js +71 -0
- package/dist/pipeline/modules/searchModuleShared.js.map +1 -0
- package/dist/pipeline/modules/searchRegexModule.js +59 -0
- package/dist/pipeline/modules/searchRegexModule.js.map +1 -0
- package/dist/pipeline/modules/semanticAnalysisModule.js +185 -28
- package/dist/pipeline/modules/semanticAnalysisModule.js.map +1 -0
- package/dist/pipeline/modules/summaryModule.js +11 -1
- package/dist/pipeline/modules/summaryModule.js.map +1 -0
- package/dist/pipeline/registry/moduleRegistry.js +9 -0
- package/dist/pipeline/registry/moduleRegistry.js.map +1 -0
- package/dist/pipeline/runModulePipeline.js +1 -0
- package/dist/pipeline/runModulePipeline.js.map +1 -0
- package/dist/scripts/dbScriptSupport.js +172 -0
- package/dist/scripts/dbScriptSupport.js.map +1 -0
- package/dist/scripts/dbcheck.js +173 -267
- package/dist/scripts/dbcheck.js.map +1 -0
- package/dist/scripts/dboverview.js +161 -0
- package/dist/scripts/dboverview.js.map +1 -0
- package/dist/scripts/migrateDb.js +1 -0
- package/dist/scripts/migrateDb.js.map +1 -0
- package/dist/search/SearchOrchestrator.js +928 -0
- package/dist/search/SearchOrchestrator.js.map +1 -0
- package/dist/search/sharedRankingPolicy.js +283 -0
- package/dist/search/sharedRankingPolicy.js.map +1 -0
- package/dist/setup/reindexOwner.js +97 -0
- package/dist/setup/reindexOwner.js.map +1 -0
- package/dist/setup/setupOwner.js +100 -0
- package/dist/setup/setupOwner.js.map +1 -0
- package/dist/shell/dialogUi.js +81 -0
- package/dist/shell/dialogUi.js.map +1 -0
- package/dist/shellSession.js +126 -0
- package/dist/shellSession.js.map +1 -0
- package/dist/status/statusOwner.js +239 -0
- package/dist/status/statusOwner.js.map +1 -0
- package/dist/testing/contextEval.js +514 -0
- package/dist/testing/contextEval.js.map +1 -0
- package/dist/testing/fixtures/transform/small-file.input.js +5 -0
- package/dist/testing/fixtures/transform/small-file.input.js.map +1 -0
- package/dist/testing/harnessArtifacts.js +112 -0
- package/dist/testing/harnessArtifacts.js.map +1 -0
- package/dist/testing/llmTraceSession.js +67 -0
- package/dist/testing/llmTraceSession.js.map +1 -0
- package/dist/testing/registerDevCliCommands.js +43 -0
- package/dist/testing/registerDevCliCommands.js.map +1 -0
- package/dist/testing/runDiagnosis.js +248 -0
- package/dist/testing/runDiagnosis.js.map +1 -0
- package/dist/testing/runtimeLogReader.js +144 -0
- package/dist/testing/runtimeLogReader.js.map +1 -0
- package/dist/testing/testCommands.js +35 -303
- package/dist/testing/testCommands.js.map +1 -0
- package/dist/testing/testRegistry.js +233 -0
- package/dist/testing/testRegistry.js.map +1 -0
- package/dist/types.js +1 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/buildContextualPrompt.js +26 -75
- package/dist/utils/buildContextualPrompt.js.map +1 -0
- package/dist/utils/changeLogPrompt.js +1 -0
- package/dist/utils/changeLogPrompt.js.map +1 -0
- package/dist/utils/checkModel.js +17 -92
- package/dist/utils/checkModel.js.map +1 -0
- package/dist/utils/commentMap.js +1 -0
- package/dist/utils/commentMap.js.map +1 -0
- package/dist/utils/compileSearchQuery.js +23 -9
- package/dist/utils/compileSearchQuery.js.map +1 -0
- package/dist/utils/consolePresentation.js +208 -0
- package/dist/utils/consolePresentation.js.map +1 -0
- package/dist/utils/contentUtils.js +17 -2
- package/dist/utils/contentUtils.js.map +1 -0
- package/dist/utils/debugContext.js +1 -0
- package/dist/utils/debugContext.js.map +1 -0
- package/dist/utils/dialogState.js +201 -0
- package/dist/utils/dialogState.js.map +1 -0
- package/dist/utils/editor.js +1 -0
- package/dist/utils/editor.js.map +1 -0
- package/dist/utils/executionEvidence.js +50 -0
- package/dist/utils/executionEvidence.js.map +1 -0
- package/dist/utils/extractFileReferences.js +140 -6
- package/dist/utils/extractFileReferences.js.map +1 -0
- package/dist/utils/fileEvidenceCache.js +50 -0
- package/dist/utils/fileEvidenceCache.js.map +1 -0
- package/dist/utils/fileTree.js +1 -0
- package/dist/utils/fileTree.js.map +1 -0
- package/dist/utils/loadRelevantFolderCapsules.js +35 -5
- package/dist/utils/loadRelevantFolderCapsules.js.map +1 -0
- package/dist/utils/log.js +10 -1
- package/dist/utils/log.js.map +1 -0
- package/dist/utils/normalizeData.js +1 -0
- package/dist/utils/normalizeData.js.map +1 -0
- package/dist/utils/ollamaModelStatus.js +28 -0
- package/dist/utils/ollamaModelStatus.js.map +1 -0
- package/dist/utils/ollamaService.js +294 -0
- package/dist/utils/ollamaService.js.map +1 -0
- package/dist/utils/outputFormatter.js +1 -0
- package/dist/utils/outputFormatter.js.map +1 -0
- package/dist/utils/parseTaggedContent.js +1 -0
- package/dist/utils/parseTaggedContent.js.map +1 -0
- package/dist/utils/planActions.js +27 -46
- package/dist/utils/planActions.js.map +1 -0
- package/dist/utils/promptBuilderHelper.js +1 -0
- package/dist/utils/promptBuilderHelper.js.map +1 -0
- package/dist/utils/promptLogHelper.js +29 -13
- package/dist/utils/promptLogHelper.js.map +1 -0
- package/dist/utils/queryAnchors.js +71 -0
- package/dist/utils/queryAnchors.js.map +1 -0
- package/dist/utils/repoIdentity.js +82 -0
- package/dist/utils/repoIdentity.js.map +1 -0
- package/dist/utils/repoKey.js +1 -0
- package/dist/utils/repoKey.js.map +1 -0
- package/dist/utils/resolveTargetsToFiles.js +1 -0
- package/dist/utils/resolveTargetsToFiles.js.map +1 -0
- package/dist/utils/resumeContext.js +219 -0
- package/dist/utils/resumeContext.js.map +1 -0
- package/dist/utils/resumeState.js +310 -0
- package/dist/utils/resumeState.js.map +1 -0
- package/dist/utils/rollingPlan.js +118 -0
- package/dist/utils/rollingPlan.js.map +1 -0
- package/dist/utils/runQueryWithDaemonControl.js +11 -3
- package/dist/utils/runQueryWithDaemonControl.js.map +1 -0
- package/dist/utils/runtimeLogger.js +252 -0
- package/dist/utils/runtimeLogger.js.map +1 -0
- package/dist/utils/sanitizeQuery.js +1 -0
- package/dist/utils/sanitizeQuery.js.map +1 -0
- package/dist/utils/sharedUtils.js +1 -0
- package/dist/utils/sharedUtils.js.map +1 -0
- package/dist/utils/sleep.js +1 -0
- package/dist/utils/sleep.js.map +1 -0
- package/dist/utils/splitCodeIntoChunk.js +1 -0
- package/dist/utils/splitCodeIntoChunk.js.map +1 -0
- package/dist/utils/time.js +66 -0
- package/dist/utils/time.js.map +1 -0
- package/dist/utils/verifyFocusPreference.js +107 -0
- package/dist/utils/verifyFocusPreference.js.map +1 -0
- package/dist/utils/vscode.js +1 -0
- package/dist/utils/vscode.js.map +1 -0
- package/dist/workflow/workflowResolver.js +1 -0
- package/dist/workflow/workflowResolver.js.map +1 -0
- package/dist/workflow/workflowRunner.js +1 -0
- package/dist/workflow/workflowRunner.js.map +1 -0
- package/package.json +3 -3
- package/dist/agents/MainAgent.js +0 -1886
- package/dist/agents/contextReviewStep.js +0 -101
- package/dist/agents/finalPlanGenStep.js +0 -107
- package/dist/agents/structuralAnalysisStep.js +0 -46
- package/dist/agents/validationAnalysisStep.js +0 -87
- package/dist/pipeline/modules/chunkManagerModule.js +0 -24
- package/dist/pipeline/modules/cleanGeneratedTestsModule.js +0 -33
- package/dist/pipeline/modules/fileReaderModule.js +0 -72
- package/dist/pipeline/modules/gatherInfoModule.js +0 -181
- package/dist/pipeline/modules/generateTestsModule.js +0 -68
- package/dist/pipeline/modules/preserveCodeModule.js +0 -195
- package/dist/pipeline/modules/refactorModule.js +0 -40
- package/dist/pipeline/modules/repairTestsModule.js +0 -48
- package/dist/pipeline/modules/runTestsModule.js +0 -37
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared helpers for loop-level search actions.
|
|
3
|
+
*
|
|
4
|
+
* Why this file exists:
|
|
5
|
+
* - search execution should stay in `SearchOrchestrator`
|
|
6
|
+
* - loop modules still need one place for history, summaries, and related-file persistence
|
|
7
|
+
* - directory listing must not reuse file-candidate persistence by accident
|
|
8
|
+
*/
|
|
9
|
+
import { getDbForRepo } from "../../db/client.js";
|
|
10
|
+
import { mapCanonicalPathToExecutionPath, mapExecutionPathToCanonicalPath, } from "../../utils/repoIdentity.js";
|
|
11
|
+
export async function fetchSummariesForPaths(paths) {
|
|
12
|
+
if (paths.length === 0)
|
|
13
|
+
return {};
|
|
14
|
+
const db = getDbForRepo();
|
|
15
|
+
const canonicalPaths = paths.map(filePath => mapExecutionPathToCanonicalPath(filePath));
|
|
16
|
+
const placeholders = canonicalPaths.map(() => "?").join(", ");
|
|
17
|
+
const rows = db.prepare(`SELECT path, summary FROM summaries
|
|
18
|
+
WHERE path IN (${placeholders}) AND summary IS NOT NULL;`).all(...canonicalPaths);
|
|
19
|
+
const map = {};
|
|
20
|
+
for (const row of rows) {
|
|
21
|
+
map[mapCanonicalPathToExecutionPath(row.path)] = row.summary;
|
|
22
|
+
}
|
|
23
|
+
return map;
|
|
24
|
+
}
|
|
25
|
+
export async function enrichMissingSummaries(results, context) {
|
|
26
|
+
const missingPaths = results.filter(result => !result.summary).map(result => result.path);
|
|
27
|
+
if (missingPaths.length === 0)
|
|
28
|
+
return results;
|
|
29
|
+
const summaryMap = await fetchSummariesForPaths(missingPaths);
|
|
30
|
+
return results.map(result => {
|
|
31
|
+
const executionPath = mapCanonicalPathToExecutionPath(result.path, context);
|
|
32
|
+
return result.summary || !summaryMap[executionPath]
|
|
33
|
+
? result
|
|
34
|
+
: { ...result, summary: summaryMap[executionPath] };
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
export function persistDiscoveredFiles(context, results) {
|
|
38
|
+
context.initContext ?? (context.initContext = { userQuery: "" });
|
|
39
|
+
const existing = new Set(context.initContext.relatedFiles ?? []);
|
|
40
|
+
const discovered = results.map(result => mapCanonicalPathToExecutionPath(result.path, context));
|
|
41
|
+
context.initContext.relatedFiles = [
|
|
42
|
+
...(context.initContext.relatedFiles ?? []),
|
|
43
|
+
...discovered.filter(filePath => !existing.has(filePath)),
|
|
44
|
+
];
|
|
45
|
+
}
|
|
46
|
+
export function recordSearchAttempt(args) {
|
|
47
|
+
var _a;
|
|
48
|
+
const { context, actionId, query, search, failureClass } = args;
|
|
49
|
+
context.analysis || (context.analysis = {});
|
|
50
|
+
(_a = context.analysis).searchAttempts || (_a.searchAttempts = []);
|
|
51
|
+
context.analysis.searchAttempts.push({
|
|
52
|
+
actionId,
|
|
53
|
+
searchType: actionId,
|
|
54
|
+
query,
|
|
55
|
+
regexSpec: search.regexSpec,
|
|
56
|
+
scope: search.regexSpec?.scope,
|
|
57
|
+
resultCount: search.fileCandidates.length + search.directoryEntries.length,
|
|
58
|
+
failureClass: failureClass ?? search.failure?.failureClass,
|
|
59
|
+
recordedAt: new Date().toISOString(),
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
export function buildInvalidRegexOutput(input, search) {
|
|
63
|
+
return {
|
|
64
|
+
query: input.query,
|
|
65
|
+
data: {
|
|
66
|
+
files: [],
|
|
67
|
+
failure: search.failure,
|
|
68
|
+
},
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=searchModuleShared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"searchModuleShared.js","sourceRoot":"","sources":["../../../src/pipeline/modules/searchModuleShared.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Shared helpers for loop-level search actions.\n *\n * Why this file exists:\n * - search execution should stay in `SearchOrchestrator`\n * - loop modules still need one place for history, summaries, and related-file persistence\n * - directory listing must not reuse file-candidate persistence by accident\n */\nimport { getDbForRepo } from \"../../db/client.js\";\nimport {\n mapCanonicalPathToExecutionPath,\n mapExecutionPathToCanonicalPath,\n} from \"../../utils/repoIdentity.js\";\nimport type {\n ModuleIO,\n SearchAttemptRecord,\n SearchFailureClass,\n SearchOrchestratorResult,\n SearchResult,\n StructuredContext,\n} from \"../../types.js\";\n\nexport async function fetchSummariesForPaths(paths: string[]): Promise<Record<string, string>> {\n if (paths.length === 0) return {};\n\n const db = getDbForRepo();\n const canonicalPaths = paths.map(filePath => mapExecutionPathToCanonicalPath(filePath));\n const placeholders = canonicalPaths.map(() => \"?\").join(\", \");\n const rows = db.prepare(\n `SELECT path, summary FROM summaries\n WHERE path IN (${placeholders}) AND summary IS NOT NULL;`\n ).all(...canonicalPaths) as { path: string; summary: string }[];\n\n const map: Record<string, string> = {};\n for (const row of rows) {\n map[mapCanonicalPathToExecutionPath(row.path)] = row.summary;\n }\n return map;\n}\n\nexport async function enrichMissingSummaries(\n results: SearchResult[],\n context: StructuredContext\n): Promise<SearchResult[]> {\n const missingPaths = results.filter(result => !result.summary).map(result => result.path);\n if (missingPaths.length === 0) return results;\n\n const summaryMap = await fetchSummariesForPaths(missingPaths);\n return results.map(result => {\n const executionPath = mapCanonicalPathToExecutionPath(result.path, context);\n return result.summary || !summaryMap[executionPath]\n ? result\n : { ...result, summary: summaryMap[executionPath] };\n });\n}\n\nexport function persistDiscoveredFiles(context: StructuredContext, results: SearchResult[]): void {\n context.initContext ??= { userQuery: \"\" };\n const existing = new Set(context.initContext.relatedFiles ?? []);\n const discovered = results.map(result => mapCanonicalPathToExecutionPath(result.path, context));\n context.initContext.relatedFiles = [\n ...(context.initContext.relatedFiles ?? []),\n ...discovered.filter(filePath => !existing.has(filePath)),\n ];\n}\n\nexport function recordSearchAttempt(args: {\n context: StructuredContext;\n actionId: SearchAttemptRecord[\"actionId\"];\n query?: string;\n search: SearchOrchestratorResult;\n failureClass?: SearchFailureClass;\n}): void {\n const { context, actionId, query, search, failureClass } = args;\n context.analysis ||= {};\n context.analysis.searchAttempts ||= [];\n context.analysis.searchAttempts.push({\n actionId,\n searchType: actionId as SearchAttemptRecord[\"searchType\"],\n query,\n regexSpec: search.regexSpec,\n scope: search.regexSpec?.scope,\n resultCount: search.fileCandidates.length + search.directoryEntries.length,\n failureClass: failureClass ?? search.failure?.failureClass,\n recordedAt: new Date().toISOString(),\n });\n}\n\nexport function buildInvalidRegexOutput(input: ModuleIO, search: SearchOrchestratorResult): ModuleIO {\n return {\n query: input.query,\n data: {\n files: [],\n failure: search.failure,\n },\n };\n}\n"]}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runs model-authored regex search through the shared search executor.
|
|
3
|
+
*
|
|
4
|
+
* Why this file exists:
|
|
5
|
+
* - regex search is a real loop action now, not a hidden fallback
|
|
6
|
+
* - the model provides a typed regex spec
|
|
7
|
+
* - runtime validation and execution still stay deterministic
|
|
8
|
+
*/
|
|
9
|
+
import { logInputOutput } from "../../utils/promptLogHelper.js";
|
|
10
|
+
import { SearchOrchestrator } from "../../search/SearchOrchestrator.js";
|
|
11
|
+
import { deriveFocusFromSearchResult } from "../../agents/deriveFocusFromSearchStep.js";
|
|
12
|
+
import { buildInvalidRegexOutput, enrichMissingSummaries, persistDiscoveredFiles, recordSearchAttempt, } from "./searchModuleShared.js";
|
|
13
|
+
export const searchRegexModule = {
|
|
14
|
+
name: "search-regex",
|
|
15
|
+
description: "Runs a validated regex against file paths, file contents, or both.",
|
|
16
|
+
groups: ["analysis"],
|
|
17
|
+
run: async (input) => {
|
|
18
|
+
const ctx = input.context;
|
|
19
|
+
if (!ctx) {
|
|
20
|
+
throw new Error("[search-regex] StructuredContext is required.");
|
|
21
|
+
}
|
|
22
|
+
const spec = (input.data ?? {});
|
|
23
|
+
const orchestrator = new SearchOrchestrator();
|
|
24
|
+
const search = await orchestrator.runRegexSearch({
|
|
25
|
+
context: ctx,
|
|
26
|
+
spec,
|
|
27
|
+
limit: 5,
|
|
28
|
+
});
|
|
29
|
+
recordSearchAttempt({
|
|
30
|
+
context: ctx,
|
|
31
|
+
actionId: "search-regex",
|
|
32
|
+
query: input.query,
|
|
33
|
+
search,
|
|
34
|
+
});
|
|
35
|
+
if (search.failure?.failureClass === "invalid-regex" || search.failure?.failureClass === "scope-missing") {
|
|
36
|
+
const output = buildInvalidRegexOutput(input, search);
|
|
37
|
+
logInputOutput("search-regex", "output", output);
|
|
38
|
+
return output;
|
|
39
|
+
}
|
|
40
|
+
deriveFocusFromSearchResult(ctx, search, {
|
|
41
|
+
appendCandidates: true,
|
|
42
|
+
promoteOperatorMatchesToCandidates: true,
|
|
43
|
+
});
|
|
44
|
+
const files = await enrichMissingSummaries(search.fileCandidates, ctx);
|
|
45
|
+
persistDiscoveredFiles(ctx, files);
|
|
46
|
+
const output = {
|
|
47
|
+
query: input.query,
|
|
48
|
+
data: {
|
|
49
|
+
files,
|
|
50
|
+
regexSpec: search.regexSpec,
|
|
51
|
+
matches: search.patternMatches,
|
|
52
|
+
failure: search.failure,
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
logInputOutput("search-regex", "output", output);
|
|
56
|
+
return output;
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
//# sourceMappingURL=searchRegexModule.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"searchRegexModule.js","sourceRoot":"","sources":["../../../src/pipeline/modules/searchRegexModule.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,EAAE,2BAA2B,EAAE,MAAM,2CAA2C,CAAC;AAExF,OAAO,EACL,uBAAuB,EACvB,sBAAsB,EACtB,sBAAsB,EACtB,mBAAmB,GACpB,MAAM,yBAAyB,CAAC;AAEjC,MAAM,CAAC,MAAM,iBAAiB,GAAW;IACvC,IAAI,EAAE,cAAc;IACpB,WAAW,EAAE,oEAAoE;IACjF,MAAM,EAAE,CAAC,UAAU,CAAC;IAEpB,GAAG,EAAE,KAAK,EAAE,KAAe,EAAqB,EAAE;QAChD,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC;QAC1B,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACnE,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAoB,CAAC;QACnD,MAAM,YAAY,GAAG,IAAI,kBAAkB,EAAE,CAAC;QAC9C,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,cAAc,CAAC;YAC/C,OAAO,EAAE,GAAG;YACZ,IAAI;YACJ,KAAK,EAAE,CAAC;SACT,CAAC,CAAC;QAEH,mBAAmB,CAAC;YAClB,OAAO,EAAE,GAAG;YACZ,QAAQ,EAAE,cAAc;YACxB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,MAAM;SACP,CAAC,CAAC;QAEH,IAAI,MAAM,CAAC,OAAO,EAAE,YAAY,KAAK,eAAe,IAAI,MAAM,CAAC,OAAO,EAAE,YAAY,KAAK,eAAe,EAAE,CAAC;YACzG,MAAM,MAAM,GAAG,uBAAuB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YACtD,cAAc,CAAC,cAAc,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;YACjD,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,2BAA2B,CAAC,GAAG,EAAE,MAAM,EAAE;YACvC,gBAAgB,EAAE,IAAI;YACtB,kCAAkC,EAAE,IAAI;SACzC,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG,MAAM,sBAAsB,CAAC,MAAM,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;QACvE,sBAAsB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAEnC,MAAM,MAAM,GAAa;YACvB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,IAAI,EAAE;gBACJ,KAAK;gBACL,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,OAAO,EAAE,MAAM,CAAC,cAAc;gBAC9B,OAAO,EAAE,MAAM,CAAC,OAAO;aACxB;SACF,CAAC;QACF,cAAc,CAAC,cAAc,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;QACjD,OAAO,MAAM,CAAC;IAChB,CAAC;CACF,CAAC","sourcesContent":["/**\n * Runs model-authored regex search through the shared search executor.\n *\n * Why this file exists:\n * - regex search is a real loop action now, not a hidden fallback\n * - the model provides a typed regex spec\n * - runtime validation and execution still stay deterministic\n */\nimport { logInputOutput } from \"../../utils/promptLogHelper.js\";\nimport { SearchOrchestrator } from \"../../search/SearchOrchestrator.js\";\nimport { deriveFocusFromSearchResult } from \"../../agents/deriveFocusFromSearchStep.js\";\nimport type { Module, ModuleIO, RegexSearchSpec } from \"../../types.js\";\nimport {\n buildInvalidRegexOutput,\n enrichMissingSummaries,\n persistDiscoveredFiles,\n recordSearchAttempt,\n} from \"./searchModuleShared.js\";\n\nexport const searchRegexModule: Module = {\n name: \"search-regex\",\n description: \"Runs a validated regex against file paths, file contents, or both.\",\n groups: [\"analysis\"],\n\n run: async (input: ModuleIO): Promise<ModuleIO> => {\n const ctx = input.context;\n if (!ctx) {\n throw new Error(\"[search-regex] StructuredContext is required.\");\n }\n\n const spec = (input.data ?? {}) as RegexSearchSpec;\n const orchestrator = new SearchOrchestrator();\n const search = await orchestrator.runRegexSearch({\n context: ctx,\n spec,\n limit: 5,\n });\n\n recordSearchAttempt({\n context: ctx,\n actionId: \"search-regex\",\n query: input.query,\n search,\n });\n\n if (search.failure?.failureClass === \"invalid-regex\" || search.failure?.failureClass === \"scope-missing\") {\n const output = buildInvalidRegexOutput(input, search);\n logInputOutput(\"search-regex\", \"output\", output);\n return output;\n }\n\n deriveFocusFromSearchResult(ctx, search, {\n appendCandidates: true,\n promoteOperatorMatchesToCandidates: true,\n });\n\n const files = await enrichMissingSummaries(search.fileCandidates, ctx);\n persistDiscoveredFiles(ctx, files);\n\n const output: ModuleIO = {\n query: input.query,\n data: {\n files,\n regexSpec: search.regexSpec,\n matches: search.patternMatches,\n failure: search.failure,\n },\n };\n logInputOutput(\"search-regex\", \"output\", output);\n return output;\n },\n};\n"]}
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
import { logInputOutput } from "../../utils/promptLogHelper.js";
|
|
2
2
|
import { cleanupModule } from "./cleanupModule.js";
|
|
3
3
|
import { generate } from "../../lib/generate.js";
|
|
4
|
+
import { isMethodSelectionRetrievalQuery } from "../../agents/mainAgentHeuristics.js";
|
|
5
|
+
import { computeContentFingerprint, computeQueryFingerprint, hasFreshSemanticAnalysis, } from "../../utils/fileEvidenceCache.js";
|
|
4
6
|
const MAX_CODE_CHARS = 6000; // conservative prompt-safe limit
|
|
7
|
+
const MIN_EXACT_VERIFY_CONFIDENCE = 0.85;
|
|
8
|
+
const MAX_CONTEXT_LINE_CHARS = 220;
|
|
5
9
|
export const semanticAnalysisModule = {
|
|
6
10
|
name: "semanticAnalysis",
|
|
7
11
|
description: "Performs semantic analysis for a single target file defined by the current execution step.",
|
|
@@ -36,6 +40,22 @@ export const semanticAnalysisModule = {
|
|
|
36
40
|
(_a = context.analysis).fileAnalysis || (_a.fileAnalysis = {});
|
|
37
41
|
const filePath = file.path;
|
|
38
42
|
const prevAnalysis = context.analysis.fileAnalysis[filePath];
|
|
43
|
+
if (hasFreshSemanticAnalysis({
|
|
44
|
+
analysis: prevAnalysis,
|
|
45
|
+
file,
|
|
46
|
+
query: input.query,
|
|
47
|
+
})) {
|
|
48
|
+
logInputOutput("semanticAnalysisStep - per-file", "output", {
|
|
49
|
+
file: filePath,
|
|
50
|
+
reusedFromCache: true,
|
|
51
|
+
analysis: prevAnalysis,
|
|
52
|
+
});
|
|
53
|
+
return {
|
|
54
|
+
query: input.query,
|
|
55
|
+
data: { notes: "Semantic analysis reused cached result" },
|
|
56
|
+
context,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
39
59
|
// -----------------------------
|
|
40
60
|
// Semantic analysis (LLM)
|
|
41
61
|
// -----------------------------
|
|
@@ -47,6 +67,8 @@ export const semanticAnalysisModule = {
|
|
|
47
67
|
...prevAnalysis,
|
|
48
68
|
...semanticResult,
|
|
49
69
|
semanticAnalyzed: true,
|
|
70
|
+
contentFingerprint: computeContentFingerprint(file.code),
|
|
71
|
+
queryFingerprint: computeQueryFingerprint(input.query),
|
|
50
72
|
};
|
|
51
73
|
logInputOutput("semanticAnalysisStep - per-file", "output", {
|
|
52
74
|
file: filePath,
|
|
@@ -59,33 +81,69 @@ export const semanticAnalysisModule = {
|
|
|
59
81
|
};
|
|
60
82
|
},
|
|
61
83
|
};
|
|
84
|
+
/**
|
|
85
|
+
* Builds a short, high-signal context block for semantic prompts.
|
|
86
|
+
*
|
|
87
|
+
* Examples:
|
|
88
|
+
* - long rationale -> trimmed to one line
|
|
89
|
+
* - many assumptions -> keep the first few concrete items
|
|
90
|
+
* - no useful context -> "[none]"
|
|
91
|
+
*/
|
|
92
|
+
function buildSemanticContextSnippet(rationale, understanding) {
|
|
93
|
+
const lines = [
|
|
94
|
+
formatSemanticContextLine("Rationale", rationale),
|
|
95
|
+
formatSemanticList("Assumptions", understanding?.assumptions),
|
|
96
|
+
formatSemanticList("Constraints", understanding?.constraints),
|
|
97
|
+
formatSemanticList("Known risks", understanding?.risks),
|
|
98
|
+
].filter(Boolean);
|
|
99
|
+
return lines.length > 0 ? lines.join("\n") : "[none]";
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Formats one short context line and trims noisy whitespace.
|
|
103
|
+
* Example: "a long\nreason" -> "a long reason".
|
|
104
|
+
*/
|
|
105
|
+
function formatSemanticContextLine(label, value) {
|
|
106
|
+
const compact = String(value ?? "").replace(/\s+/g, " ").trim();
|
|
107
|
+
if (!compact)
|
|
108
|
+
return "";
|
|
109
|
+
const trimmed = compact.length > MAX_CONTEXT_LINE_CHARS
|
|
110
|
+
? `${compact.slice(0, MAX_CONTEXT_LINE_CHARS - 1).trimEnd()}...`
|
|
111
|
+
: compact;
|
|
112
|
+
return `${label}: ${trimmed}`;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Formats a small list section for semantic prompts.
|
|
116
|
+
* Example: ["a", "b", "c", "d"] -> "Assumptions: a; b; c".
|
|
117
|
+
*/
|
|
118
|
+
function formatSemanticList(label, values) {
|
|
119
|
+
const compactValues = (values ?? [])
|
|
120
|
+
.map((value) => String(value ?? "").replace(/\s+/g, " ").trim())
|
|
121
|
+
.filter(Boolean)
|
|
122
|
+
.slice(0, 3);
|
|
123
|
+
if (compactValues.length === 0)
|
|
124
|
+
return "";
|
|
125
|
+
return `${label}: ${compactValues.join("; ")}`;
|
|
126
|
+
}
|
|
62
127
|
/* -------------------------
|
|
63
128
|
Analyze single file
|
|
64
129
|
---------------------------- */
|
|
65
|
-
async function analyzeFile(file,
|
|
130
|
+
async function analyzeFile(file, taskQuery, context) {
|
|
131
|
+
const deterministicFallback = buildDeterministicSemanticFallback(file, taskQuery, context);
|
|
132
|
+
if (shouldUseDeterministicSemanticFallback(taskQuery, context, file.path, deterministicFallback)) {
|
|
133
|
+
return deterministicFallback;
|
|
134
|
+
}
|
|
66
135
|
const slicedCode = sliceCodeForAnalysis(file.code);
|
|
67
136
|
const focus = context?.analysis?.focus;
|
|
68
137
|
const understanding = context?.analysis?.understanding;
|
|
69
|
-
const contextSnippet =
|
|
70
|
-
focus?.rationale ? `Rationale: ${focus.rationale}` : "",
|
|
71
|
-
understanding?.assumptions
|
|
72
|
-
? `Assumptions: ${understanding.assumptions.join("; ")}`
|
|
73
|
-
: "",
|
|
74
|
-
understanding?.constraints
|
|
75
|
-
? `Constraints: ${understanding.constraints.join("; ")}`
|
|
76
|
-
: "",
|
|
77
|
-
understanding?.risks ? `Known risks: ${understanding.risks.join("; ")}` : "",
|
|
78
|
-
]
|
|
79
|
-
.filter(Boolean)
|
|
80
|
-
.join("\n");
|
|
138
|
+
const contextSnippet = buildSemanticContextSnippet(focus?.rationale, understanding);
|
|
81
139
|
const prompt = `
|
|
82
140
|
You are performing semantic analysis on a file that has already been determined
|
|
83
|
-
to be relevant to the
|
|
141
|
+
to be relevant to the current task.
|
|
84
142
|
|
|
85
|
-
|
|
86
|
-
"${
|
|
143
|
+
Task query:
|
|
144
|
+
"${taskQuery}"
|
|
87
145
|
|
|
88
|
-
|
|
146
|
+
Relevant prior context:
|
|
89
147
|
${contextSnippet}
|
|
90
148
|
|
|
91
149
|
File path: ${file.path}
|
|
@@ -125,8 +183,17 @@ Return STRICT JSON:
|
|
|
125
183
|
}
|
|
126
184
|
`.trim();
|
|
127
185
|
try {
|
|
128
|
-
const ai = await generate({ query:
|
|
129
|
-
|
|
186
|
+
const ai = await generate({ query: "", content: prompt }, {
|
|
187
|
+
caller: "semanticAnalysisModule",
|
|
188
|
+
inputContext: {
|
|
189
|
+
query: taskQuery,
|
|
190
|
+
filePath: file.path,
|
|
191
|
+
slicedCode,
|
|
192
|
+
focus,
|
|
193
|
+
understanding,
|
|
194
|
+
},
|
|
195
|
+
});
|
|
196
|
+
const cleaned = await cleanupModule.run({ query: taskQuery, content: ai.data });
|
|
130
197
|
let data;
|
|
131
198
|
if (typeof cleaned.data === "object" && cleaned.data) {
|
|
132
199
|
data = cleaned.data;
|
|
@@ -146,7 +213,7 @@ Return STRICT JSON:
|
|
|
146
213
|
role: ["primary", "supporting", "contextual"].includes(data.role)
|
|
147
214
|
? data.role
|
|
148
215
|
: undefined,
|
|
149
|
-
proposedChanges: data.proposedChanges
|
|
216
|
+
proposedChanges: data.proposedChanges && typeof data.proposedChanges === "object"
|
|
150
217
|
? {
|
|
151
218
|
summary: String(data.proposedChanges.summary ?? ""),
|
|
152
219
|
scope: data.proposedChanges.scope ?? "none",
|
|
@@ -157,10 +224,7 @@ Return STRICT JSON:
|
|
|
157
224
|
? data.proposedChanges.rationale
|
|
158
225
|
: undefined,
|
|
159
226
|
}
|
|
160
|
-
:
|
|
161
|
-
summary: "No changes required for this file.",
|
|
162
|
-
scope: "none",
|
|
163
|
-
},
|
|
227
|
+
: undefined,
|
|
164
228
|
excerpts: Array.isArray(data.excerpts)
|
|
165
229
|
? data.excerpts
|
|
166
230
|
.filter((e) => typeof e?.code === "string" && e.code.trim())
|
|
@@ -190,14 +254,16 @@ Return STRICT JSON:
|
|
|
190
254
|
codeLength: e.code.length,
|
|
191
255
|
})) ?? [],
|
|
192
256
|
});
|
|
257
|
+
logInputOutput("semanticAnalysisStep - model", "output", {
|
|
258
|
+
callId: ai.trace?.callId,
|
|
259
|
+
filePath: file.path,
|
|
260
|
+
parsedRole: result.role,
|
|
261
|
+
});
|
|
193
262
|
return result;
|
|
194
263
|
}
|
|
195
264
|
catch (err) {
|
|
196
265
|
console.warn(`[semanticAnalysisStep] Failed to analyze file ${file.path}:`, err);
|
|
197
|
-
return
|
|
198
|
-
relevanceExplanation: "This file could not be analyzed due to an error.",
|
|
199
|
-
risks: [],
|
|
200
|
-
};
|
|
266
|
+
return deterministicFallback;
|
|
201
267
|
}
|
|
202
268
|
}
|
|
203
269
|
/* -------------------------
|
|
@@ -212,3 +278,94 @@ function sliceCodeForAnalysis(code) {
|
|
|
212
278
|
const tail = code.slice(-Math.floor(MAX_CODE_CHARS * 0.4));
|
|
213
279
|
return [head, "\n/* … file truncated for semantic analysis … */\n", tail].join("");
|
|
214
280
|
}
|
|
281
|
+
function shouldUseDeterministicSemanticFallback(query, context, filePath, fallback) {
|
|
282
|
+
const isAnalyzeOnly = context?.executionControl?.constraints?.allowFileWrites === false;
|
|
283
|
+
const exactSymbol = getStrongExactVerifySymbol(context, filePath);
|
|
284
|
+
return isAnalyzeOnly && isMethodSelectionRetrievalQuery(query) && !!exactSymbol && !!fallback.proposedChanges?.targets?.length;
|
|
285
|
+
}
|
|
286
|
+
function buildDeterministicSemanticFallback(file, query, context) {
|
|
287
|
+
const exactSymbol = getStrongExactVerifySymbol(context, file.path);
|
|
288
|
+
const verifyRationale = context?.analysis?.verify?.byFile?.[file.path]?.rationale ??
|
|
289
|
+
"Verify evidence identified this file as the strongest answer source.";
|
|
290
|
+
const excerpt = exactSymbol
|
|
291
|
+
? extractDeclarationExcerpt(file.code, exactSymbol.evidence)
|
|
292
|
+
: sliceCodeForAnalysis(file.code);
|
|
293
|
+
const declarationTarget = exactSymbol
|
|
294
|
+
? extractDeclarationTarget(file.code, exactSymbol.evidence)
|
|
295
|
+
: undefined;
|
|
296
|
+
if (exactSymbol) {
|
|
297
|
+
return {
|
|
298
|
+
intent: "relevant",
|
|
299
|
+
role: "primary",
|
|
300
|
+
relevanceExplanation: `Exact verify evidence already identifies ${exactSymbol.name} in this file as the deciding method for the query. ${verifyRationale}`,
|
|
301
|
+
proposedChanges: {
|
|
302
|
+
summary: `${exactSymbol.name} is the exact verified method that answers this query.`,
|
|
303
|
+
scope: "minor",
|
|
304
|
+
targets: declarationTarget ? [declarationTarget] : [exactSymbol.name],
|
|
305
|
+
rationale: "Deterministic semantic fallback from exact verify evidence.",
|
|
306
|
+
},
|
|
307
|
+
excerpts: excerpt
|
|
308
|
+
? [
|
|
309
|
+
{
|
|
310
|
+
description: `Exact verify-backed declaration for ${exactSymbol.name}.`,
|
|
311
|
+
startLine: exactSymbol.evidence.span?.startLine,
|
|
312
|
+
endLine: exactSymbol.evidence.span?.endLine,
|
|
313
|
+
symbols: [exactSymbol.name],
|
|
314
|
+
code: excerpt,
|
|
315
|
+
},
|
|
316
|
+
]
|
|
317
|
+
: undefined,
|
|
318
|
+
risks: [],
|
|
319
|
+
};
|
|
320
|
+
}
|
|
321
|
+
return {
|
|
322
|
+
intent: "relevant",
|
|
323
|
+
role: "primary",
|
|
324
|
+
relevanceExplanation: `Semantic generation was unavailable, so this file is being carried forward with bounded deterministic analysis. ${verifyRationale}`,
|
|
325
|
+
proposedChanges: {
|
|
326
|
+
summary: "Deterministic semantic fallback preserved this file as a grounded analysis source.",
|
|
327
|
+
scope: "minor",
|
|
328
|
+
targets: [`FILE: ${file.path}`],
|
|
329
|
+
rationale: "Fallback used because semantic generation failed or was intentionally skipped.",
|
|
330
|
+
},
|
|
331
|
+
excerpts: excerpt
|
|
332
|
+
? [
|
|
333
|
+
{
|
|
334
|
+
description: "Bounded fallback code excerpt.",
|
|
335
|
+
code: excerpt,
|
|
336
|
+
},
|
|
337
|
+
]
|
|
338
|
+
: undefined,
|
|
339
|
+
risks: [],
|
|
340
|
+
};
|
|
341
|
+
}
|
|
342
|
+
function getStrongExactVerifySymbol(context, filePath) {
|
|
343
|
+
const evidence = context?.analysis?.verify?.byFile?.[filePath]?.evidence ?? [];
|
|
344
|
+
const ranked = evidence
|
|
345
|
+
.filter(item => (item.type === "symbol" || item.type === "structural") &&
|
|
346
|
+
typeof item.excerpt === "string" &&
|
|
347
|
+
item.excerpt.trim().length > 0 &&
|
|
348
|
+
(item.confidence ?? 0) >= MIN_EXACT_VERIFY_CONFIDENCE)
|
|
349
|
+
.sort((a, b) => (b.confidence ?? 0) - (a.confidence ?? 0));
|
|
350
|
+
const winner = ranked[0];
|
|
351
|
+
if (!winner?.excerpt)
|
|
352
|
+
return undefined;
|
|
353
|
+
return { name: winner.excerpt.trim(), evidence: winner };
|
|
354
|
+
}
|
|
355
|
+
function extractDeclarationExcerpt(code, evidence) {
|
|
356
|
+
if (!code)
|
|
357
|
+
return undefined;
|
|
358
|
+
const lines = code.split("\n");
|
|
359
|
+
const start = Math.max(0, (evidence.span?.startLine ?? 1) - 1);
|
|
360
|
+
const end = Math.min(lines.length, evidence.span?.endLine ?? start + 1);
|
|
361
|
+
const snippet = lines.slice(start, Math.max(start + 1, end)).join("\n").trim();
|
|
362
|
+
return snippet || sliceCodeForAnalysis(code);
|
|
363
|
+
}
|
|
364
|
+
function extractDeclarationTarget(code, evidence) {
|
|
365
|
+
if (!code)
|
|
366
|
+
return evidence.excerpt?.trim();
|
|
367
|
+
const lines = code.split("\n");
|
|
368
|
+
const line = lines[(evidence.span?.startLine ?? 1) - 1]?.trim();
|
|
369
|
+
return line || evidence.excerpt?.trim();
|
|
370
|
+
}
|
|
371
|
+
//# sourceMappingURL=semanticAnalysisModule.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"semanticAnalysisModule.js","sourceRoot":"","sources":["../../../src/pipeline/modules/semanticAnalysisModule.ts"],"names":[],"mappings":"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","sourcesContent":["// File: src/modules/semanticAnalysisStep.ts\n/**\n * Performs per-file semantic analysis, but falls back to deterministic analysis\n * when exact verify evidence already answers a narrow method-selection question.\n *\n * Why this file exists:\n * - keep normal semantic summaries for broad analysis flows\n * - avoid blocking analysis-only answers on a long LLM pass when verify already\n * surfaced the exact deciding symbol\n */\nimport {\n AnalysisState,\n ModuleIO,\n StructuredContext,\n StructuredFileCapsule,\n FileAnalysis,\n Module,\n FileEvidence,\n} from \"../../types.js\";\nimport { logInputOutput } from \"../../utils/promptLogHelper.js\";\nimport { cleanupModule } from \"./cleanupModule.js\";\nimport { generate } from \"../../lib/generate.js\";\nimport { isMethodSelectionRetrievalQuery } from \"../../agents/mainAgentHeuristics.js\";\nimport {\n computeContentFingerprint,\n computeQueryFingerprint,\n hasFreshSemanticAnalysis,\n} from \"../../utils/fileEvidenceCache.js\";\n\nconst MAX_CODE_CHARS = 6000; // conservative prompt-safe limit\nconst MIN_EXACT_VERIFY_CONFIDENCE = 0.85;\nconst MAX_CONTEXT_LINE_CHARS = 220;\n\nexport const semanticAnalysisModule: Module = {\n name: \"semanticAnalysis\",\n description: \"Performs semantic analysis for a single target file defined by the current execution step.\",\n groups: [\"analysis\"],\n\n run: async (input: ModuleIO): Promise<ModuleIO> => {\n const context = input.context as StructuredContext;\n if (!context) throw new Error(\"[semanticAnalysisStep] No context provided\");\n\n const step = context.currentStep;\n if (!step || step.action !== \"semanticAnalysis\") {\n const notes = \"[semanticAnalysisStep] Invoked without semanticAnalysis step\";\n logInputOutput(\"semanticAnalysisStep\", \"output\", { notes });\n return { query: input.query, data: { notes }, context };\n }\n\n if (!step.targetFile) {\n const notes = \"[semanticAnalysisStep] semanticAnalysis step missing targetFile\";\n logInputOutput(\"semanticAnalysisStep\", \"output\", { notes });\n return { query: input.query, data: { notes }, context };\n }\n\n const workingFiles: StructuredFileCapsule[] = context.workingFiles ?? [];\n const file = workingFiles.find(f => f.path === step.targetFile);\n\n if (!file) {\n const notes = `[semanticAnalysisStep] targetFile not found: ${step.targetFile}`;\n logInputOutput(\"semanticAnalysisStep\", \"output\", { notes });\n return { query: input.query, data: { notes }, context };\n }\n\n // -----------------------------\n // Ensure analysis containers\n // -----------------------------\n context.analysis ||= {};\n context.analysis.fileAnalysis ||= {};\n\n const filePath = file.path;\n const prevAnalysis = context.analysis.fileAnalysis[filePath];\n if (hasFreshSemanticAnalysis({\n analysis: prevAnalysis,\n file,\n query: input.query,\n })) {\n logInputOutput(\"semanticAnalysisStep - per-file\", \"output\", {\n file: filePath,\n reusedFromCache: true,\n analysis: prevAnalysis,\n });\n return {\n query: input.query,\n data: { notes: \"Semantic analysis reused cached result\" },\n context,\n };\n }\n\n // -----------------------------\n // Semantic analysis (LLM)\n // -----------------------------\n const semanticResult = await analyzeFile(file, input.query, context);\n\n // -----------------------------\n // Write-once merge to context\n // -----------------------------\n context.analysis.fileAnalysis[filePath] = {\n ...prevAnalysis,\n ...semanticResult,\n semanticAnalyzed: true,\n contentFingerprint: computeContentFingerprint(file.code),\n queryFingerprint: computeQueryFingerprint(input.query),\n };\n\n logInputOutput(\"semanticAnalysisStep - per-file\", \"output\", {\n file: filePath,\n analysis: context.analysis.fileAnalysis[filePath],\n });\n\n return {\n query: input.query,\n data: { notes: \"Semantic analysis completed\" },\n context,\n };\n },\n};\n\n/**\n * Builds a short, high-signal context block for semantic prompts.\n *\n * Examples:\n * - long rationale -> trimmed to one line\n * - many assumptions -> keep the first few concrete items\n * - no useful context -> \"[none]\"\n */\nfunction buildSemanticContextSnippet(\n rationale: string | undefined,\n understanding: AnalysisState[\"understanding\"] | undefined\n): string {\n const lines = [\n formatSemanticContextLine(\"Rationale\", rationale),\n formatSemanticList(\"Assumptions\", understanding?.assumptions),\n formatSemanticList(\"Constraints\", understanding?.constraints),\n formatSemanticList(\"Known risks\", understanding?.risks),\n ].filter(Boolean);\n\n return lines.length > 0 ? lines.join(\"\\n\") : \"[none]\";\n}\n\n/**\n * Formats one short context line and trims noisy whitespace.\n * Example: \"a long\\nreason\" -> \"a long reason\".\n */\nfunction formatSemanticContextLine(label: string, value: string | undefined): string {\n const compact = String(value ?? \"\").replace(/\\s+/g, \" \").trim();\n if (!compact) return \"\";\n const trimmed =\n compact.length > MAX_CONTEXT_LINE_CHARS\n ? `${compact.slice(0, MAX_CONTEXT_LINE_CHARS - 1).trimEnd()}...`\n : compact;\n return `${label}: ${trimmed}`;\n}\n\n/**\n * Formats a small list section for semantic prompts.\n * Example: [\"a\", \"b\", \"c\", \"d\"] -> \"Assumptions: a; b; c\".\n */\nfunction formatSemanticList(label: string, values: string[] | undefined): string {\n const compactValues = (values ?? [])\n .map((value) => String(value ?? \"\").replace(/\\s+/g, \" \").trim())\n .filter(Boolean)\n .slice(0, 3);\n if (compactValues.length === 0) return \"\";\n return `${label}: ${compactValues.join(\"; \")}`;\n}\n\n/* -------------------------\n Analyze single file\n---------------------------- */\nasync function analyzeFile(\n file: StructuredFileCapsule,\n taskQuery: string,\n context?: StructuredContext\n): Promise<FileAnalysis> {\n const deterministicFallback = buildDeterministicSemanticFallback(file, taskQuery, context);\n if (shouldUseDeterministicSemanticFallback(taskQuery, context, file.path, deterministicFallback)) {\n return deterministicFallback;\n }\n\n const slicedCode = sliceCodeForAnalysis(file.code);\n\n const focus = context?.analysis?.focus;\n const understanding = context?.analysis?.understanding;\n const contextSnippet = buildSemanticContextSnippet(focus?.rationale, understanding);\n\n const prompt = `\nYou are performing semantic analysis on a file that has already been determined\nto be relevant to the current task.\n\nTask query:\n\"${taskQuery}\"\n\nRelevant prior context:\n${contextSnippet}\n\nFile path: ${file.path}\n\nTask:\n- Explain *why* this file is relevant to the query in concrete, technical terms.\n- Assign a semantic role if applicable.\n- Identify risks, constraints, or noteworthy design considerations.\n\nAdditionally:\n- Extract the most relevant code excerpts that justify your analysis.\n- Prefer complete functions, configuration blocks, or object literals.\n- Do NOT summarize the code — include the actual code text.\n- Only include excerpts that directly support your analysis.\n\nCode excerpt:\n${slicedCode ?? \"[no code]\"}\n\nReturn STRICT JSON:\n{\n \"role\"?: \"primary\" | \"supporting\" | \"contextual\",\n \"relevanceExplanation\": string,\n \"proposedChanges\"?: {\n \"summary\": string,\n \"scope\": \"none\" | \"minor\" | \"moderate\" | \"major\",\n \"targets\"?: string[],\n \"rationale\"?: string\n },\n \"excerpts\"?: Array<{\n \"description\": string,\n \"startLine\"?: number,\n \"endLine\"?: number,\n \"symbols\"?: string[],\n \"code\": string\n }>,\n \"risks\"?: string[]\n}\n`.trim();\n\n try {\n const ai = await generate({ query: \"\", content: prompt }, {\n caller: \"semanticAnalysisModule\",\n inputContext: {\n query: taskQuery,\n filePath: file.path,\n slicedCode,\n focus,\n understanding,\n },\n });\n const cleaned = await cleanupModule.run({ query: taskQuery, content: ai.data });\n\n let data: any;\n if (typeof cleaned.data === \"object\" && cleaned.data) {\n data = cleaned.data;\n } else {\n try {\n data = JSON.parse(String(cleaned.content ?? \"{}\"));\n } catch {\n data = {};\n }\n }\n\n const result: FileAnalysis = {\n relevanceExplanation:\n typeof data.relevanceExplanation === \"string\" && data.relevanceExplanation.trim()\n ? data.relevanceExplanation\n : \"This file contributes to the query but did not provide a detailed explanation.\",\n role:\n [\"primary\", \"supporting\", \"contextual\"].includes(data.role)\n ? data.role\n : undefined,\n proposedChanges:\n data.proposedChanges && typeof data.proposedChanges === \"object\"\n ? {\n summary: String(data.proposedChanges.summary ?? \"\"),\n scope: data.proposedChanges.scope ?? \"none\",\n targets: Array.isArray(data.proposedChanges.targets)\n ? data.proposedChanges.targets\n : undefined,\n rationale:\n typeof data.proposedChanges.rationale === \"string\"\n ? data.proposedChanges.rationale\n : undefined,\n }\n : undefined,\n excerpts: Array.isArray(data.excerpts)\n ? data.excerpts\n .filter((e: { code: string }) => typeof e?.code === \"string\" && e.code.trim())\n .map((e: any) => ({\n description: String(e.description ?? \"Relevant code excerpt\"),\n startLine: typeof e.startLine === \"number\" ? e.startLine : undefined,\n endLine: typeof e.endLine === \"number\" ? e.endLine : undefined,\n symbols: Array.isArray(e.symbols) ? e.symbols : undefined,\n code: String(e.code),\n }))\n : undefined,\n risks: Array.isArray(data.risks) ? data.risks : [],\n };\n\n // 🔹 Log proposed changes (decision-level signal)\n logInputOutput(\"semanticAnalysisStep - proposedChanges\", \"output\", {\n file: file.path,\n proposedChanges: result.proposedChanges ?? null,\n });\n\n // 🔹 Log excerpts (grounding signal, compact)\n logInputOutput(\"semanticAnalysisStep - excerpts\", \"output\", {\n file: file.path,\n excerpts:\n result.excerpts?.map(e => ({\n description: e.description,\n startLine: e.startLine,\n endLine: e.endLine,\n symbols: e.symbols,\n codeLength: e.code.length,\n })) ?? [],\n });\n\n logInputOutput(\"semanticAnalysisStep - model\", \"output\", {\n callId: ai.trace?.callId,\n filePath: file.path,\n parsedRole: result.role,\n });\n\n return result;\n } catch (err) {\n console.warn(\n `[semanticAnalysisStep] Failed to analyze file ${file.path}:`,\n err\n );\n return deterministicFallback;\n }\n}\n\n/* -------------------------\n Slice large code for prompts\n---------------------------- */\nfunction sliceCodeForAnalysis(code?: string): string | undefined {\n if (!code) return undefined;\n if (code.length <= MAX_CODE_CHARS) return code;\n\n const head = code.slice(0, Math.floor(MAX_CODE_CHARS * 0.6));\n const tail = code.slice(-Math.floor(MAX_CODE_CHARS * 0.4));\n return [head, \"\\n/* … file truncated for semantic analysis … */\\n\", tail].join(\"\");\n}\n\nfunction shouldUseDeterministicSemanticFallback(\n query: string,\n context: StructuredContext | undefined,\n filePath: string,\n fallback: FileAnalysis\n): boolean {\n const isAnalyzeOnly = context?.executionControl?.constraints?.allowFileWrites === false;\n const exactSymbol = getStrongExactVerifySymbol(context, filePath);\n return isAnalyzeOnly && isMethodSelectionRetrievalQuery(query) && !!exactSymbol && !!fallback.proposedChanges?.targets?.length;\n}\n\nfunction buildDeterministicSemanticFallback(\n file: StructuredFileCapsule,\n query: string,\n context?: StructuredContext\n): FileAnalysis {\n const exactSymbol = getStrongExactVerifySymbol(context, file.path);\n const verifyRationale =\n context?.analysis?.verify?.byFile?.[file.path]?.rationale ??\n \"Verify evidence identified this file as the strongest answer source.\";\n const excerpt = exactSymbol\n ? extractDeclarationExcerpt(file.code, exactSymbol.evidence)\n : sliceCodeForAnalysis(file.code);\n const declarationTarget = exactSymbol\n ? extractDeclarationTarget(file.code, exactSymbol.evidence)\n : undefined;\n\n if (exactSymbol) {\n return {\n intent: \"relevant\",\n role: \"primary\",\n relevanceExplanation: `Exact verify evidence already identifies ${exactSymbol.name} in this file as the deciding method for the query. ${verifyRationale}`,\n proposedChanges: {\n summary: `${exactSymbol.name} is the exact verified method that answers this query.`,\n scope: \"minor\",\n targets: declarationTarget ? [declarationTarget] : [exactSymbol.name],\n rationale: \"Deterministic semantic fallback from exact verify evidence.\",\n },\n excerpts: excerpt\n ? [\n {\n description: `Exact verify-backed declaration for ${exactSymbol.name}.`,\n startLine: exactSymbol.evidence.span?.startLine,\n endLine: exactSymbol.evidence.span?.endLine,\n symbols: [exactSymbol.name],\n code: excerpt,\n },\n ]\n : undefined,\n risks: [],\n };\n }\n\n return {\n intent: \"relevant\",\n role: \"primary\",\n relevanceExplanation: `Semantic generation was unavailable, so this file is being carried forward with bounded deterministic analysis. ${verifyRationale}`,\n proposedChanges: {\n summary: \"Deterministic semantic fallback preserved this file as a grounded analysis source.\",\n scope: \"minor\",\n targets: [`FILE: ${file.path}`],\n rationale: \"Fallback used because semantic generation failed or was intentionally skipped.\",\n },\n excerpts: excerpt\n ? [\n {\n description: \"Bounded fallback code excerpt.\",\n code: excerpt,\n },\n ]\n : undefined,\n risks: [],\n };\n}\n\nfunction getStrongExactVerifySymbol(\n context: StructuredContext | undefined,\n filePath: string\n): { name: string; evidence: FileEvidence } | undefined {\n const evidence = context?.analysis?.verify?.byFile?.[filePath]?.evidence ?? [];\n const ranked = evidence\n .filter(item =>\n (item.type === \"symbol\" || item.type === \"structural\") &&\n typeof item.excerpt === \"string\" &&\n item.excerpt.trim().length > 0 &&\n (item.confidence ?? 0) >= MIN_EXACT_VERIFY_CONFIDENCE\n )\n .sort((a, b) => (b.confidence ?? 0) - (a.confidence ?? 0));\n\n const winner = ranked[0];\n if (!winner?.excerpt) return undefined;\n return { name: winner.excerpt.trim(), evidence: winner };\n}\n\nfunction extractDeclarationExcerpt(\n code: string | undefined,\n evidence: FileEvidence\n): string | undefined {\n if (!code) return undefined;\n const lines = code.split(\"\\n\");\n const start = Math.max(0, (evidence.span?.startLine ?? 1) - 1);\n const end = Math.min(lines.length, evidence.span?.endLine ?? start + 1);\n const snippet = lines.slice(start, Math.max(start + 1, end)).join(\"\\n\").trim();\n return snippet || sliceCodeForAnalysis(code);\n}\n\nfunction extractDeclarationTarget(\n code: string | undefined,\n evidence: FileEvidence\n): string | undefined {\n if (!code) return evidence.excerpt?.trim();\n const lines = code.split(\"\\n\");\n const line = lines[(evidence.span?.startLine ?? 1) - 1]?.trim();\n return line || evidence.excerpt?.trim();\n}\n"]}
|
|
@@ -20,6 +20,12 @@ ${contentStr}
|
|
|
20
20
|
const response = await generate({
|
|
21
21
|
content: prompt,
|
|
22
22
|
query: ""
|
|
23
|
+
}, {
|
|
24
|
+
caller: "summaryModule",
|
|
25
|
+
inputContext: {
|
|
26
|
+
query: input.query,
|
|
27
|
+
content: contentStr,
|
|
28
|
+
},
|
|
23
29
|
});
|
|
24
30
|
const summary = response.data ?? "⚠️ No summary generated.";
|
|
25
31
|
const output = {
|
|
@@ -27,7 +33,11 @@ ${contentStr}
|
|
|
27
33
|
content: '',
|
|
28
34
|
data: { summary }, // ❌ no filepath
|
|
29
35
|
};
|
|
30
|
-
logInputOutput("summary", "output",
|
|
36
|
+
logInputOutput("summary", "output", {
|
|
37
|
+
callId: response.trace?.callId,
|
|
38
|
+
summary,
|
|
39
|
+
});
|
|
31
40
|
return output;
|
|
32
41
|
},
|
|
33
42
|
};
|
|
43
|
+
//# sourceMappingURL=summaryModule.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"summaryModule.js","sourceRoot":"","sources":["../../../src/pipeline/modules/summaryModule.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAQhE,MAAM,CAAC,MAAM,aAAa,GAAW;IACnC,IAAI,EAAE,SAAS;IACf,WAAW,EAAE,kDAAkD;IAC/D,MAAM,EAAE,CAAC,UAAU,CAAC;IACpB,GAAG,EAAE,KAAK,EAAE,KAAe,EAAqB,EAAE;QAChD,gCAAgC;QAChC,MAAM,UAAU,GACd,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ;YAC/B,CAAC,CAAC,KAAK,CAAC,OAAO;YACf,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAEnD,6CAA6C;QAE7C,MAAM,MAAM,GAAG;;;;;EAKjB,UAAU;CACX,CAAC,IAAI,EAAE,CAAC;QAEL,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC;YAC9B,OAAO,EAAE,MAAM;YACf,KAAK,EAAE,EAAE;SACV,EAAE;YACD,MAAM,EAAE,eAAe;YACvB,YAAY,EAAE;gBACZ,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,OAAO,EAAE,UAAU;aACpB;SACF,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,IAAI,0BAA0B,CAAC;QAE5D,MAAM,MAAM,GAAa;YACvB,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,yBAAyB;YAC7C,OAAO,EAAE,EAAE;YACX,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE,gBAAgB;SACpC,CAAC;QAEF,cAAc,CAAC,SAAS,EAAE,QAAQ,EAAE;YAClC,MAAM,EAAE,QAAQ,CAAC,KAAK,EAAE,MAAM;YAC9B,OAAO;SACR,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAChB,CAAC;CACF,CAAC","sourcesContent":["/**\n * Summarizes arbitrary file content into one short text result for later pipeline steps.\n */\nimport { Module, ModuleIO } from \"../../types.js\";\nimport { generate } from \"../../lib/generate.js\";\r\nimport { logInputOutput } from \"../../utils/promptLogHelper.js\";\r\n\r\nexport interface SummaryData {\r\n summary: string;\r\n // ❌ Removed filepath here because module no longer needs it\r\n // filepath?: string;\r\n}\r\n\r\nexport const summaryModule: Module = {\r\n name: \"summary\",\r\n description: \"Generates a general summary of any file content.\",\r\n groups: [\"analysis\"],\r\n run: async (input: ModuleIO): Promise<ModuleIO> => {\r\n // ✅ Only care about content now\r\n const contentStr =\r\n typeof input.content === \"string\"\r\n ? input.content\r\n : JSON.stringify(input.content ?? \"\", null, 2);\r\n\r\n // ❌ Removed filepath/ext/filename extraction\r\n\r\n const prompt = `\r\nYou are an assistant specialized in summarizing files.\r\n\r\nYour task is to summarize the following content as clearly and concisely as possible:\r\n\r\n${contentStr}\r\n`.trim();\r\n\r\n const response = await generate({\n content: prompt,\n query: \"\"\n }, {\n caller: \"summaryModule\",\n inputContext: {\n query: input.query,\n content: contentStr,\n },\n });\n const summary = response.data ?? \"⚠️ No summary generated.\";\r\n\r\n const output: ModuleIO = {\r\n query: input.query, // keep query for context\r\n content: '',\r\n data: { summary }, // ❌ no filepath\r\n };\r\n\r\n logInputOutput(\"summary\", \"output\", {\n callId: response.trace?.callId,\n summary,\n });\n return output;\n },\n};\n"]}
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
import { contextReviewModule } from "../modules/contextReviewModule.js";
|
|
2
2
|
import { finalAnswerModule } from "../modules/finalAnswerModule.js";
|
|
3
3
|
import { fileSearchModule } from "../modules/fileSearchModule.js";
|
|
4
|
+
import { readFileModule } from "../modules/readFileModule.js";
|
|
5
|
+
import { searchDbModule } from "../modules/searchDbModule.js";
|
|
6
|
+
import { searchRegexModule } from "../modules/searchRegexModule.js";
|
|
7
|
+
import { searchListDirectoryModule } from "../modules/searchListDirectoryModule.js";
|
|
4
8
|
import { cleanupModule } from "../modules/cleanupModule.js";
|
|
5
9
|
import { summaryModule } from "../modules/summaryModule.js";
|
|
6
10
|
import { addCommentsModule } from "../modules/commentModule.js";
|
|
@@ -13,11 +17,15 @@ export const builtInModules = {
|
|
|
13
17
|
// =====================================================
|
|
14
18
|
// INFORMATION
|
|
15
19
|
// =====================================================
|
|
20
|
+
"search-db": searchDbModule,
|
|
21
|
+
"search-regex": searchRegexModule,
|
|
22
|
+
"search-list-directory": searchListDirectoryModule,
|
|
16
23
|
fileSearch: fileSearchModule,
|
|
17
24
|
summary: summaryModule,
|
|
18
25
|
// =====================================================
|
|
19
26
|
// ANALYSIS
|
|
20
27
|
// =====================================================
|
|
28
|
+
"read-file": readFileModule,
|
|
21
29
|
semanticAnalysis: semanticAnalysisModule,
|
|
22
30
|
contextReview: contextReviewModule,
|
|
23
31
|
// =====================================================
|
|
@@ -64,3 +72,4 @@ export function resolveModulesByNames(names) {
|
|
|
64
72
|
}
|
|
65
73
|
return resolved;
|
|
66
74
|
}
|
|
75
|
+
//# sourceMappingURL=moduleRegistry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"moduleRegistry.js","sourceRoot":"","sources":["../../../src/pipeline/registry/moduleRegistry.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAE,yBAAyB,EAAE,MAAM,yCAAyC,CAAC;AACpF,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AACxE,OAAO,EAAE,sBAAsB,EAAE,MAAM,sCAAsC,CAAC;AAE9E;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAA2B;IACpD,wDAAwD;IACxD,cAAc;IACd,wDAAwD;IACxD,WAAW,EAAE,cAAc;IAC3B,cAAc,EAAE,iBAAiB;IACjC,uBAAuB,EAAE,yBAAyB;IAClD,UAAU,EAAE,gBAAgB;IAC5B,OAAO,EAAE,aAAa;IAEtB,wDAAwD;IACxD,WAAW;IACX,wDAAwD;IACxD,WAAW,EAAE,cAAc;IAC3B,gBAAgB,EAAE,sBAAsB;IACxC,aAAa,EAAE,mBAAmB;IAElC,wDAAwD;IACxD,4BAA4B;IAC5B,wDAAwD;IACxD,aAAa,EAAE,mBAAmB;IAClC,OAAO,EAAE,aAAa;IACtB,QAAQ,EAAE,iBAAiB;IAE3B,wDAAwD;IACxD,WAAW;IACX,wDAAwD;IACxD,WAAW,EAAE,iBAAiB;CAC/B,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC;AAC9B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB;IAClC,OAAO,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;QAC1D,IAAI;QACJ,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,0BAA0B;KAC3D,CAAC,CAAC,CAAC;AACN,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,KAAe;IACnD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,SAAS;QAC7B,MAAM,GAAG,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,GAAG,EAAE,CAAC;YACR,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACnB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC","sourcesContent":["/**\n * Registers the built-in runtime modules the action router may execute.\n *\n * Why this file exists:\n * - keep runtime module wiring in one place\n * - make typed action ids resolve to one concrete module implementation\n */\nimport { Module } from \"../../types.js\";\nimport { contextReviewModule } from \"../modules/contextReviewModule.js\";\nimport { finalAnswerModule } from \"../modules/finalAnswerModule.js\";\nimport { fileSearchModule } from \"../modules/fileSearchModule.js\";\nimport { readFileModule } from \"../modules/readFileModule.js\";\nimport { searchDbModule } from \"../modules/searchDbModule.js\";\nimport { searchRegexModule } from \"../modules/searchRegexModule.js\";\nimport { searchListDirectoryModule } from \"../modules/searchListDirectoryModule.js\";\nimport { cleanupModule } from \"../modules/cleanupModule.js\";\nimport { summaryModule } from \"../modules/summaryModule.js\";\nimport { addCommentsModule } from \"../modules/commentModule.js\";\nimport { codeTransformModule } from \"../modules/codeTransformModule.js\";\nimport { semanticAnalysisModule } from \"../modules/semanticAnalysisModule.js\";\n\r\n/**\r\n * Active built-in modules — all use ModuleIO for input/output.\r\n */\r\nexport const builtInModules: Record<string, Module> = {\r\n // =====================================================\r\n // INFORMATION\n // =====================================================\n \"search-db\": searchDbModule,\n \"search-regex\": searchRegexModule,\n \"search-list-directory\": searchListDirectoryModule,\n fileSearch: fileSearchModule,\n summary: summaryModule,\n\r\n // =====================================================\r\n // ANALYSIS\n // =====================================================\n \"read-file\": readFileModule,\n semanticAnalysis: semanticAnalysisModule,\n contextReview: contextReviewModule,\n\r\n // =====================================================\r\n // TRANSFORM / WRITE SUPPORT\r\n // =====================================================\r\n codeTransform: codeTransformModule,\r\n cleanup: cleanupModule,\r\n comments: addCommentsModule,\r\n\r\n // =====================================================\r\n // FINALIZE\r\n // =====================================================\r\n finalAnswer: finalAnswerModule,\r\n};\r\n\r\n/**\r\n * Get module by name.\r\n */\r\nexport function getModuleByName(name: string): Module | undefined {\r\n return builtInModules[name];\r\n}\r\n\r\n/**\r\n * List available modules for CLI or UI display.\r\n */\r\nexport function listAvailableModules(): { name: string; description: string }[] {\r\n return Object.entries(builtInModules).map(([name, mod]) => ({\r\n name,\r\n description: mod.description ?? \"No description available\",\r\n }));\r\n}\r\n\r\n/**\r\n * Resolve modules from a list of names.\r\n * Returns a unique ordered array of modules.\r\n */\r\nexport function resolveModulesByNames(names: string[]): Module[] {\r\n const seen = new Set<string>();\r\n const resolved: Module[] = [];\r\n\r\n for (const name of names) {\r\n if (seen.has(name)) continue;\r\n const mod = getModuleByName(name);\r\n if (mod) {\r\n resolved.push(mod);\r\n seen.add(name);\r\n }\r\n }\r\n\r\n return resolved;\r\n}\r\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runModulePipeline.js","sourceRoot":"","sources":["../../src/pipeline/runModulePipeline.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,OAAiB,EACjB,YAAsB;IAEtB,MAAM,SAAS,GAAG,qBAAqB,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,GAAG,SAAS,8BAA8B,OAAO,CAAC,MAAM,YAAY,CAAC,CAAC;IAElF,qBAAqB;IACrB,IAAI,SAAS,GAAa,EAAE,GAAG,YAAY,EAAE,CAAC;IAE9C,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,IAAI,CAAC;YACH,MAAM,MAAM,GAAa,MAAM,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAElD,iBAAiB;YACjB,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,IAAI,KAAK,CAAC,WAAW,GAAG,CAAC,IAAI,yBAAyB,CAAC,CAAC;YAChE,CAAC;YAED,kCAAkC;YAClC,wBAAwB;YACxB,eAAe;YACf,qCAAqC;YACrC,wDAAwD;YACxD,SAAS,GAAG;gBACV,KAAK,EAAE,SAAS,CAAC,KAAK;gBACtB,OAAO,EAAE,MAAM,CAAC,IAAI,EAAE,0BAA0B;gBAChD,IAAI,EAAE,EAAE;aACT,CAAC;YAEF,OAAO,CAAC,GAAG,CAAC,GAAG,SAAS,QAAQ,GAAG,CAAC,IAAI,gCAAgC,CAAC,CAAC;QAC5E,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CACX,GAAG,SAAS,cAAc,GAAG,CAAC,IAAI,WAAW,EAC7C,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CACzC,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC","sourcesContent":["// File: src/pipeline/runModulePipeline.ts\r\nimport { Module, ModuleIO } from \"../types\";\r\n\r\nexport async function runModulePipeline(\r\n modules: Module[],\r\n initialInput: ModuleIO\r\n): Promise<ModuleIO> {\r\n const logPrefix = `[runModulePipeline]`;\r\n console.log(`${logPrefix} 🚀 Starting pipeline with ${modules.length} module(s)`);\r\n\r\n // Copy initial input\r\n let currentIO: ModuleIO = { ...initialInput };\r\n\r\n for (const mod of modules) {\r\n try {\r\n const output: ModuleIO = await mod.run(currentIO);\r\n\r\n // Validate shape\r\n if (!output) {\r\n throw new Error(`Module '${mod.name}' returned empty output`);\r\n }\r\n\r\n // --- FIX: Pipeline semantics ---\r\n // Next module receives:\r\n // - same query\r\n // - content = previous module's data\r\n // - (data is the last produced data only, never merged)\r\n currentIO = {\r\n query: currentIO.query,\r\n content: output.data, // data -> content handoff\r\n data: '',\r\n };\r\n\r\n console.log(`${logPrefix} 🔁 '${mod.name}' → content replaced with data`);\r\n } catch (err) {\r\n console.error(\r\n `${logPrefix} ❌ Module '${mod.name}' failed:`,\r\n err instanceof Error ? err.message : err\r\n );\r\n }\r\n }\r\n\r\n return currentIO;\r\n}\r\n"]}
|