scai 0.1.178 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +171 -260
- package/dist/__tests__/CommitSuggesterCmd.test.js +112 -0
- package/dist/__tests__/CommitSuggesterCmd.test.js.map +1 -0
- package/dist/__tests__/EvalReportCmd.test.js +645 -0
- package/dist/__tests__/EvalReportCmd.test.js.map +1 -0
- package/dist/__tests__/ModelCmd.test.js +64 -0
- package/dist/__tests__/ModelCmd.test.js.map +1 -0
- package/dist/__tests__/agents/agentActions.test.js +345 -0
- package/dist/__tests__/agents/agentActions.test.js.map +1 -0
- package/dist/__tests__/agents/agentFeedback.test.js +118 -0
- package/dist/__tests__/agents/agentFeedback.test.js.map +1 -0
- package/dist/__tests__/agents/agentGeneralScope.test.js +74 -0
- package/dist/__tests__/agents/agentGeneralScope.test.js.map +1 -0
- package/dist/__tests__/agents/agentLoop.test.js +1723 -0
- package/dist/__tests__/agents/agentLoop.test.js.map +1 -0
- package/dist/__tests__/agents/agentPolicyState.test.js +948 -0
- package/dist/__tests__/agents/agentPolicyState.test.js.map +1 -0
- package/dist/__tests__/agents/agentReadEvidence.test.js +170 -0
- package/dist/__tests__/agents/agentReadEvidence.test.js.map +1 -0
- package/dist/__tests__/agents/agentReadPersistence.test.js +129 -0
- package/dist/__tests__/agents/agentReadPersistence.test.js.map +1 -0
- package/dist/__tests__/agents/agentResumeCheckpoint.test.js +90 -0
- package/dist/__tests__/agents/agentResumeCheckpoint.test.js.map +1 -0
- package/dist/__tests__/agents/agentSearchBatchPlanner.test.js +289 -0
- package/dist/__tests__/agents/agentSearchBatchPlanner.test.js.map +1 -0
- package/dist/__tests__/agents/agentSearchOwnership.test.js +166 -0
- package/dist/__tests__/agents/agentSearchOwnership.test.js.map +1 -0
- package/dist/__tests__/agents/agentSearchRanking.test.js +139 -0
- package/dist/__tests__/agents/agentSearchRanking.test.js.map +1 -0
- package/dist/__tests__/agents/agentSearchRouting.test.js +584 -0
- package/dist/__tests__/agents/agentSearchRouting.test.js.map +1 -0
- package/dist/__tests__/agents/agentSearchScoring.test.js +23 -0
- package/dist/__tests__/agents/agentSearchScoring.test.js.map +1 -0
- package/dist/__tests__/agents/agentSearchShared.test.js +78 -0
- package/dist/__tests__/agents/agentSearchShared.test.js.map +1 -0
- package/dist/__tests__/agents/agentStateMachine.test.js +58 -0
- package/dist/__tests__/agents/agentStateMachine.test.js.map +1 -0
- package/dist/__tests__/agents/agentTaskPersistence.test.js +156 -0
- package/dist/__tests__/agents/agentTaskPersistence.test.js.map +1 -0
- package/dist/__tests__/agents/agentTools.test.js +69 -0
- package/dist/__tests__/agents/agentTools.test.js.map +1 -0
- package/dist/__tests__/agents/agentTransform.test.js +779 -0
- package/dist/__tests__/agents/agentTransform.test.js.map +1 -0
- package/dist/__tests__/agents/analysisPlanGenStep.test.js +157 -0
- package/dist/__tests__/agents/analysisPlanGenStep.test.js.map +1 -0
- package/dist/__tests__/agents/answerOnlyCompletion.test.js +75 -0
- package/dist/__tests__/agents/answerOnlyCompletion.test.js.map +1 -0
- package/dist/__tests__/agents/decideNextAction.test.js +1662 -0
- package/dist/__tests__/agents/decideNextAction.test.js.map +1 -0
- package/dist/__tests__/agents/deriveFocusFromSearchStep.test.js +258 -0
- package/dist/__tests__/agents/deriveFocusFromSearchStep.test.js.map +1 -0
- package/dist/__tests__/agents/evidenceVerifierStep.test.js +113 -0
- package/dist/__tests__/agents/evidenceVerifierStep.test.js.map +1 -0
- package/dist/__tests__/agents/executionPolicyResolver.test.js +208 -0
- package/dist/__tests__/agents/executionPolicyResolver.test.js.map +1 -0
- package/dist/__tests__/agents/fileCheckStep.test.js +299 -0
- package/dist/__tests__/agents/fileCheckStep.test.js.map +1 -0
- package/dist/__tests__/agents/giveUpEvaluatorStep.test.js +35 -0
- package/dist/__tests__/agents/giveUpEvaluatorStep.test.js.map +1 -0
- package/dist/__tests__/agents/guardState.test.js +297 -0
- package/dist/__tests__/agents/guardState.test.js.map +1 -0
- package/dist/__tests__/agents/mainAgentHeuristics.test.js +72 -0
- package/dist/__tests__/agents/mainAgentHeuristics.test.js.map +1 -0
- package/dist/__tests__/agents/objectiveEvaluatorStep.test.js +60 -0
- package/dist/__tests__/agents/objectiveEvaluatorStep.test.js.map +1 -0
- package/dist/__tests__/agents/outerLoopRecoveryEvaluator.test.js +207 -0
- package/dist/__tests__/agents/outerLoopRecoveryEvaluator.test.js.map +1 -0
- package/dist/__tests__/agents/prompting.test.js +363 -0
- package/dist/__tests__/agents/prompting.test.js.map +1 -0
- package/dist/__tests__/agents/readinessGateStep.test.js +180 -0
- package/dist/__tests__/agents/readinessGateStep.test.js.map +1 -0
- package/dist/__tests__/agents/reasonNextStep.test.js +56 -0
- package/dist/__tests__/agents/reasonNextStep.test.js.map +1 -0
- package/dist/__tests__/agents/reasonNextTaskStep.test.js +284 -0
- package/dist/__tests__/agents/reasonNextTaskStep.test.js.map +1 -0
- package/dist/__tests__/agents/resolveAgentTargetClassification.test.js +170 -0
- package/dist/__tests__/agents/resolveAgentTargetClassification.test.js.map +1 -0
- package/dist/__tests__/agents/resolveProgressState.test.js +526 -0
- package/dist/__tests__/agents/resolveProgressState.test.js.map +1 -0
- package/dist/__tests__/agents/resumeCheckpoint.test.js +50 -0
- package/dist/__tests__/agents/resumeCheckpoint.test.js.map +1 -0
- package/dist/__tests__/agents/routingDecisionStep.test.js +134 -0
- package/dist/__tests__/agents/routingDecisionStep.test.js.map +1 -0
- package/dist/__tests__/agents/scopeClassificationStep.test.js +118 -0
- package/dist/__tests__/agents/scopeClassificationStep.test.js.map +1 -0
- package/dist/__tests__/agents/searchContext.test.js +97 -0
- package/dist/__tests__/agents/searchContext.test.js.map +1 -0
- package/dist/__tests__/agents/selectRelevantSourcesStep.test.js +73 -0
- package/dist/__tests__/agents/selectRelevantSourcesStep.test.js.map +1 -0
- package/dist/__tests__/agents/structuredOutput.test.js +45 -0
- package/dist/__tests__/agents/structuredOutput.test.js.map +1 -0
- package/dist/__tests__/agents/transformPlanGenStep.fallback.test.js +59 -0
- package/dist/__tests__/agents/transformPlanGenStep.fallback.test.js.map +1 -0
- package/dist/__tests__/agents/transformPlanGenStep.test.js +92 -0
- package/dist/__tests__/agents/transformPlanGenStep.test.js.map +1 -0
- package/dist/__tests__/agents/understandIntentStep.test.js +237 -0
- package/dist/__tests__/agents/understandIntentStep.test.js.map +1 -0
- package/dist/__tests__/agents/understandResumeContext.test.js +65 -0
- package/dist/__tests__/agents/understandResumeContext.test.js.map +1 -0
- package/dist/__tests__/agents/understandScope.test.js +227 -0
- package/dist/__tests__/agents/understandScope.test.js.map +1 -0
- package/dist/__tests__/agents/validateChangesStep.test.js +52 -0
- package/dist/__tests__/agents/validateChangesStep.test.js.map +1 -0
- package/dist/__tests__/askCommandTaskBinding.test.js +176 -0
- package/dist/__tests__/askCommandTaskBinding.test.js.map +1 -0
- package/dist/__tests__/commandVisibility.test.js +25 -0
- package/dist/__tests__/commandVisibility.test.js.map +1 -0
- package/dist/__tests__/config.devOutput.test.js +82 -0
- package/dist/__tests__/config.devOutput.test.js.map +1 -0
- package/dist/__tests__/currentContext.test.js +43 -0
- package/dist/__tests__/currentContext.test.js.map +1 -0
- package/dist/__tests__/daemonWorker.test.js +51 -0
- package/dist/__tests__/daemonWorker.test.js.map +1 -0
- package/dist/__tests__/dialogState.test.js +113 -0
- package/dist/__tests__/dialogState.test.js.map +1 -0
- package/dist/__tests__/evalCommands.test.js +506 -0
- package/dist/__tests__/evalCommands.test.js.map +1 -0
- package/dist/__tests__/evalCommandsSummary.test.js +68 -0
- package/dist/__tests__/evalCommandsSummary.test.js.map +1 -0
- package/dist/__tests__/example.test.js +1 -0
- package/dist/__tests__/example.test.js.map +1 -0
- package/dist/__tests__/factory.commitCommand.test.js +45 -0
- package/dist/__tests__/factory.commitCommand.test.js.map +1 -0
- package/dist/__tests__/factory.devOutputCommand.test.js +122 -0
- package/dist/__tests__/factory.devOutputCommand.test.js.map +1 -0
- package/dist/__tests__/factory.evalCommands.test.js +38 -0
- package/dist/__tests__/factory.evalCommands.test.js.map +1 -0
- package/dist/__tests__/factory.planCommand.test.js +35 -0
- package/dist/__tests__/factory.planCommand.test.js.map +1 -0
- package/dist/__tests__/factory.setupCommand.test.js +34 -0
- package/dist/__tests__/factory.setupCommand.test.js.map +1 -0
- package/dist/__tests__/factory.statusCommand.test.js +54 -0
- package/dist/__tests__/factory.statusCommand.test.js.map +1 -0
- package/dist/__tests__/fileRules/queryTokenRules.test.js +35 -0
- package/dist/__tests__/fileRules/queryTokenRules.test.js.map +1 -0
- package/dist/__tests__/fileRules/searchPathClassification.test.js +57 -0
- package/dist/__tests__/fileRules/searchPathClassification.test.js.map +1 -0
- package/dist/__tests__/generate.ollamaRecovery.test.js +344 -0
- package/dist/__tests__/generate.ollamaRecovery.test.js.map +1 -0
- package/dist/__tests__/index.modelStartup.test.js +24 -0
- package/dist/__tests__/index.modelStartup.test.js.map +1 -0
- package/dist/__tests__/indexCmd.test.js +85 -0
- package/dist/__tests__/indexCmd.test.js.map +1 -0
- package/dist/__tests__/indexSlashCommand.test.js +50 -0
- package/dist/__tests__/indexSlashCommand.test.js.map +1 -0
- package/dist/__tests__/ollamaService.test.js +103 -0
- package/dist/__tests__/ollamaService.test.js.map +1 -0
- package/dist/__tests__/pipeline/modules/codeTransformModule.small-file.test.js +68 -0
- package/dist/__tests__/pipeline/modules/codeTransformModule.small-file.test.js.map +1 -0
- package/dist/__tests__/pipeline/modules/commitSuggesterModule.test.js +68 -0
- package/dist/__tests__/pipeline/modules/commitSuggesterModule.test.js.map +1 -0
- package/dist/__tests__/pipeline/modules/fileSearchModule.test.js +284 -0
- package/dist/__tests__/pipeline/modules/fileSearchModule.test.js.map +1 -0
- package/dist/__tests__/pipeline/modules/finalAnswerModule.test.js +1139 -0
- package/dist/__tests__/pipeline/modules/finalAnswerModule.test.js.map +1 -0
- package/dist/__tests__/pipeline/modules/readFileModule.test.js +146 -0
- package/dist/__tests__/pipeline/modules/readFileModule.test.js.map +1 -0
- package/dist/__tests__/pipeline/modules/semanticAnalysisModule.test.js +192 -0
- package/dist/__tests__/pipeline/modules/semanticAnalysisModule.test.js.map +1 -0
- package/dist/__tests__/repoIdentity.test.js +31 -0
- package/dist/__tests__/repoIdentity.test.js.map +1 -0
- package/dist/__tests__/resumeContext.test.js +87 -0
- package/dist/__tests__/resumeContext.test.js.map +1 -0
- package/dist/__tests__/resumeState.test.js +239 -0
- package/dist/__tests__/resumeState.test.js.map +1 -0
- package/dist/__tests__/search/SearchOrchestrator.test.js +836 -0
- package/dist/__tests__/search/SearchOrchestrator.test.js.map +1 -0
- package/dist/__tests__/shellDialogUi.test.js +52 -0
- package/dist/__tests__/shellDialogUi.test.js.map +1 -0
- package/dist/__tests__/shellSession.test.js +102 -0
- package/dist/__tests__/shellSession.test.js.map +1 -0
- package/dist/__tests__/statusOwner.test.js +215 -0
- package/dist/__tests__/statusOwner.test.js.map +1 -0
- package/dist/__tests__/testing/contextEval.test.js +244 -0
- package/dist/__tests__/testing/contextEval.test.js.map +1 -0
- package/dist/__tests__/testing/harnessArtifacts.test.js +124 -0
- package/dist/__tests__/testing/harnessArtifacts.test.js.map +1 -0
- package/dist/__tests__/testing/llmTraceSession.test.js +67 -0
- package/dist/__tests__/testing/llmTraceSession.test.js.map +1 -0
- package/dist/__tests__/testing/registerDevCliCommands.test.js +35 -0
- package/dist/__tests__/testing/registerDevCliCommands.test.js.map +1 -0
- package/dist/__tests__/testing/runDiagnosis.test.js +159 -0
- package/dist/__tests__/testing/runDiagnosis.test.js.map +1 -0
- package/dist/__tests__/testing/runtimeLogReader.test.js +66 -0
- package/dist/__tests__/testing/runtimeLogReader.test.js.map +1 -0
- package/dist/__tests__/testing/testCommands.test.js +53 -0
- package/dist/__tests__/testing/testCommands.test.js.map +1 -0
- package/dist/__tests__/utils/compileSearchQuery.test.js +38 -0
- package/dist/__tests__/utils/compileSearchQuery.test.js.map +1 -0
- package/dist/__tests__/utils/consolePresentation.test.js +105 -0
- package/dist/__tests__/utils/consolePresentation.test.js.map +1 -0
- package/dist/__tests__/utils/extractFileReferences.test.js +41 -0
- package/dist/__tests__/utils/extractFileReferences.test.js.map +1 -0
- package/dist/__tests__/utils/log.test.js +34 -0
- package/dist/__tests__/utils/log.test.js.map +1 -0
- package/dist/__tests__/utils/runtimeLogger.test.js +200 -0
- package/dist/__tests__/utils/runtimeLogger.test.js.map +1 -0
- package/dist/__tests__/utils/spinner.test.js +31 -0
- package/dist/__tests__/utils/spinner.test.js.map +1 -0
- package/dist/__tests__/utils/verifyFocusPreference.test.js +41 -0
- package/dist/__tests__/utils/verifyFocusPreference.test.js.map +1 -0
- package/dist/agent/actions/index.js +301 -0
- package/dist/agent/actions/index.js.map +1 -0
- package/dist/agent/actions/normalize.js +360 -0
- package/dist/agent/actions/normalize.js.map +1 -0
- package/dist/agent/actions/schemas.js +129 -0
- package/dist/agent/actions/schemas.js.map +1 -0
- package/dist/agent/evidence/index.js +320 -0
- package/dist/agent/evidence/index.js.map +1 -0
- package/dist/agent/feedback/index.js +187 -0
- package/dist/agent/feedback/index.js.map +1 -0
- package/dist/agent/finalization/index.js +35 -0
- package/dist/agent/finalization/index.js.map +1 -0
- package/dist/agent/index.js +126 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/agent/logging/index.js +350 -0
- package/dist/agent/logging/index.js.map +1 -0
- package/dist/agent/persistence/boot.js +58 -0
- package/dist/agent/persistence/boot.js.map +1 -0
- package/dist/agent/persistence/currentTask.js +36 -0
- package/dist/agent/persistence/currentTask.js.map +1 -0
- package/dist/agent/persistence/hydrate.js +42 -0
- package/dist/agent/persistence/hydrate.js.map +1 -0
- package/dist/agent/persistence/index.js +15 -0
- package/dist/agent/persistence/index.js.map +1 -0
- package/dist/agent/persistence/snapshots.js +97 -0
- package/dist/agent/persistence/snapshots.js.map +1 -0
- package/dist/agent/persistence/steps.js +95 -0
- package/dist/agent/persistence/steps.js.map +1 -0
- package/dist/agent/persistence/tasks.js +195 -0
- package/dist/agent/persistence/tasks.js.map +1 -0
- package/dist/agent/persistence/turns.js +92 -0
- package/dist/agent/persistence/turns.js.map +1 -0
- package/dist/agent/policy/ambiguityResolution.js +226 -0
- package/dist/agent/policy/ambiguityResolution.js.map +1 -0
- package/dist/agent/policy/contracts.js +2 -0
- package/dist/agent/policy/contracts.js.map +1 -0
- package/dist/agent/policy/coveragePolicy.js +309 -0
- package/dist/agent/policy/coveragePolicy.js.map +1 -0
- package/dist/agent/policy/endDecisionPolicy.js +31 -0
- package/dist/agent/policy/endDecisionPolicy.js.map +1 -0
- package/dist/agent/policy/index.js +344 -0
- package/dist/agent/policy/index.js.map +1 -0
- package/dist/agent/policy/loopReview.js +778 -0
- package/dist/agent/policy/loopReview.js.map +1 -0
- package/dist/agent/policy/readinessPolicy.js +108 -0
- package/dist/agent/policy/readinessPolicy.js.map +1 -0
- package/dist/agent/policy/resolutionPipeline.js +356 -0
- package/dist/agent/policy/resolutionPipeline.js.map +1 -0
- package/dist/agent/policy/targetClassification.js +33 -0
- package/dist/agent/policy/targetClassification.js.map +1 -0
- package/dist/agent/prompting/actionChoice.js +90 -0
- package/dist/agent/prompting/actionChoice.js.map +1 -0
- package/dist/agent/prompting/finalAnswer.js +38 -0
- package/dist/agent/prompting/finalAnswer.js.map +1 -0
- package/dist/agent/prompting/index.js +14 -0
- package/dist/agent/prompting/index.js.map +1 -0
- package/dist/agent/prompting/plan.js +59 -0
- package/dist/agent/prompting/plan.js.map +1 -0
- package/dist/agent/prompting/transform.js +175 -0
- package/dist/agent/prompting/transform.js.map +1 -0
- package/dist/agent/prompting/understand.js +70 -0
- package/dist/agent/prompting/understand.js.map +1 -0
- package/dist/agent/read/freshness.js +29 -0
- package/dist/agent/read/freshness.js.map +1 -0
- package/dist/agent/read/fullReadPrompt.js +43 -0
- package/dist/agent/read/fullReadPrompt.js.map +1 -0
- package/dist/agent/read/index.js +140 -0
- package/dist/agent/read/index.js.map +1 -0
- package/dist/agent/read/persistence.js +88 -0
- package/dist/agent/read/persistence.js.map +1 -0
- package/dist/agent/read/summarizeReadEvidence.js +733 -0
- package/dist/agent/read/summarizeReadEvidence.js.map +1 -0
- package/dist/agent/read/targetResolution.js +126 -0
- package/dist/agent/read/targetResolution.js.map +1 -0
- package/dist/agent/resume/checkpoint.js +41 -0
- package/dist/agent/resume/checkpoint.js.map +1 -0
- package/dist/agent/runtime/lifecycle.js +67 -0
- package/dist/agent/runtime/lifecycle.js.map +1 -0
- package/dist/agent/runtime/progress.js +178 -0
- package/dist/agent/runtime/progress.js.map +1 -0
- package/dist/agent/runtime/runAgentLoop.js +402 -0
- package/dist/agent/runtime/runAgentLoop.js.map +1 -0
- package/dist/agent/runtime/runAgentPlanOnly.js +127 -0
- package/dist/agent/runtime/runAgentPlanOnly.js.map +1 -0
- package/dist/agent/runtime/understand.js +336 -0
- package/dist/agent/runtime/understand.js.map +1 -0
- package/dist/agent/search/batchPlanner.js +274 -0
- package/dist/agent/search/batchPlanner.js.map +1 -0
- package/dist/agent/search/candidateRetentionPolicy.js +184 -0
- package/dist/agent/search/candidateRetentionPolicy.js.map +1 -0
- package/dist/agent/search/directory.js +51 -0
- package/dist/agent/search/directory.js.map +1 -0
- package/dist/agent/search/exactTarget.js +151 -0
- package/dist/agent/search/exactTarget.js.map +1 -0
- package/dist/agent/search/fragment.js +110 -0
- package/dist/agent/search/fragment.js.map +1 -0
- package/dist/agent/search/index.js +166 -0
- package/dist/agent/search/index.js.map +1 -0
- package/dist/agent/search/laneClassifier.js +119 -0
- package/dist/agent/search/laneClassifier.js.map +1 -0
- package/dist/agent/search/limits.js +10 -0
- package/dist/agent/search/limits.js.map +1 -0
- package/dist/agent/search/ranking.js +22 -0
- package/dist/agent/search/ranking.js.map +1 -0
- package/dist/agent/search/regex.js +83 -0
- package/dist/agent/search/regex.js.map +1 -0
- package/dist/agent/search/routePolicy.js +11 -0
- package/dist/agent/search/routePolicy.js.map +1 -0
- package/dist/agent/search/searchContext.js +128 -0
- package/dist/agent/search/searchContext.js.map +1 -0
- package/dist/agent/search/semantic.js +113 -0
- package/dist/agent/search/semantic.js.map +1 -0
- package/dist/agent/search/semanticIndexSearch.js +202 -0
- package/dist/agent/search/semanticIndexSearch.js.map +1 -0
- package/dist/agent/search/shared.js +283 -0
- package/dist/agent/search/shared.js.map +1 -0
- package/dist/agent/search/shell.js +202 -0
- package/dist/agent/search/shell.js.map +1 -0
- package/dist/agent/search/snippetEvidence.js +57 -0
- package/dist/agent/search/snippetEvidence.js.map +1 -0
- package/dist/agent/search/types.js +2 -0
- package/dist/agent/search/types.js.map +1 -0
- package/dist/agent/state/index.js +99 -0
- package/dist/agent/state/index.js.map +1 -0
- package/dist/agent/state/memory.js +56 -0
- package/dist/agent/state/memory.js.map +1 -0
- package/dist/agent/structuredOutput/index.js +28 -0
- package/dist/agent/structuredOutput/index.js.map +1 -0
- package/dist/agent/tools/index.js +199 -0
- package/dist/agent/tools/index.js.map +1 -0
- package/dist/agent/transform/index.js +519 -0
- package/dist/agent/transform/index.js.map +1 -0
- package/dist/agent/transform/syntax.js +49 -0
- package/dist/agent/transform/syntax.js.map +1 -0
- package/dist/agent/types.js +20 -0
- package/dist/agent/types.js.map +1 -0
- package/dist/agents/actionRegistry.js +114 -0
- package/dist/agents/actionRegistry.js.map +1 -0
- package/dist/agents/agent.js +5 -0
- package/dist/agents/agent.js.map +1 -0
- package/dist/agents/agentActions.js +5 -0
- package/dist/agents/agentActions.js.map +1 -0
- package/dist/agents/agentEvidence.js +5 -0
- package/dist/agents/agentEvidence.js.map +1 -0
- package/dist/agents/agentFeedback.js +5 -0
- package/dist/agents/agentFeedback.js.map +1 -0
- package/dist/agents/agentLogging.js +5 -0
- package/dist/agents/agentLogging.js.map +1 -0
- package/dist/agents/agentLoop.js +5 -0
- package/dist/agents/agentLoop.js.map +1 -0
- package/dist/agents/agentMemory.js +5 -0
- package/dist/agents/agentMemory.js.map +1 -0
- package/dist/agents/agentPlanMode.js +5 -0
- package/dist/agents/agentPlanMode.js.map +1 -0
- package/dist/agents/agentPolicyState.js +5 -0
- package/dist/agents/agentPolicyState.js.map +1 -0
- package/dist/agents/agentProgress.js +93 -0
- package/dist/agents/agentProgress.js.map +1 -0
- package/dist/agents/agentSchemas.js +5 -0
- package/dist/agents/agentSchemas.js.map +1 -0
- package/dist/agents/agentSearchScoring.js +5 -0
- package/dist/agents/agentSearchScoring.js.map +1 -0
- package/dist/agents/agentStateMachine.js +5 -0
- package/dist/agents/agentStateMachine.js.map +1 -0
- package/dist/agents/agentTools.js +5 -0
- package/dist/agents/agentTools.js.map +1 -0
- package/dist/agents/agentTypes.js +5 -0
- package/dist/agents/agentTypes.js.map +1 -0
- package/dist/agents/agentUnderstand.js +5 -0
- package/dist/agents/agentUnderstand.js.map +1 -0
- package/dist/agents/analysisPlanGenStep.js +194 -17
- package/dist/agents/analysisPlanGenStep.js.map +1 -0
- package/dist/agents/answerOnlyCompletion.js +32 -0
- package/dist/agents/answerOnlyCompletion.js.map +1 -0
- package/dist/agents/collaboratorStep.js +1 -0
- package/dist/agents/collaboratorStep.js.map +1 -0
- package/dist/agents/decideNextAction.js +444 -0
- package/dist/agents/decideNextAction.js.map +1 -0
- package/dist/agents/deriveFocusFromSearchStep.js +83 -0
- package/dist/agents/deriveFocusFromSearchStep.js.map +1 -0
- package/dist/agents/evidenceVerifierStep.js +104 -13
- package/dist/agents/evidenceVerifierStep.js.map +1 -0
- package/dist/agents/fileCheckStep.js +381 -12
- package/dist/agents/fileCheckStep.js.map +1 -0
- package/dist/agents/giveUpEvaluatorStep.js +63 -0
- package/dist/agents/giveUpEvaluatorStep.js.map +1 -0
- package/dist/agents/guardPolicy.js +20 -0
- package/dist/agents/guardPolicy.js.map +1 -0
- package/dist/agents/guards/executionPolicyResolver.js +165 -0
- package/dist/agents/guards/executionPolicyResolver.js.map +1 -0
- package/dist/agents/guards/guardState.js +195 -0
- package/dist/agents/guards/guardState.js.map +1 -0
- package/dist/agents/guards/resolveProgressState.js +403 -0
- package/dist/agents/guards/resolveProgressState.js.map +1 -0
- package/dist/agents/infoPlanGenStep.js +66 -8
- package/dist/agents/infoPlanGenStep.js.map +1 -0
- package/dist/agents/integrateFeedbackStep.js +1 -0
- package/dist/agents/integrateFeedbackStep.js.map +1 -0
- package/dist/agents/iterationFileSelector.js +8 -7
- package/dist/agents/iterationFileSelector.js.map +1 -0
- package/dist/agents/mainAgentActivityLog.js +85 -0
- package/dist/agents/mainAgentActivityLog.js.map +1 -0
- package/dist/agents/mainAgentHeuristics.js +173 -0
- package/dist/agents/mainAgentHeuristics.js.map +1 -0
- package/dist/agents/mainAgentVerify.js +159 -0
- package/dist/agents/mainAgentVerify.js.map +1 -0
- package/dist/agents/objectiveEvaluatorStep.js +103 -0
- package/dist/agents/objectiveEvaluatorStep.js.map +1 -0
- package/dist/agents/outerLoopRecoveryEvaluator.js +108 -0
- package/dist/agents/outerLoopRecoveryEvaluator.js.map +1 -0
- package/dist/agents/readinessGateStep.js +95 -9
- package/dist/agents/readinessGateStep.js.map +1 -0
- package/dist/agents/reasonNextStep.js +9 -8
- package/dist/agents/reasonNextStep.js.map +1 -0
- package/dist/agents/reasonNextTaskStep.js +267 -144
- package/dist/agents/reasonNextTaskStep.js.map +1 -0
- package/dist/agents/researchPlanGenStep.js +61 -25
- package/dist/agents/researchPlanGenStep.js.map +1 -0
- package/dist/agents/resolveAgentTargetClassification.js +5 -0
- package/dist/agents/resolveAgentTargetClassification.js.map +1 -0
- package/dist/agents/resolveExecutionModeStep.js +1 -0
- package/dist/agents/resolveExecutionModeStep.js.map +1 -0
- package/dist/agents/resolveExplicitTargetsStep.js +74 -0
- package/dist/agents/resolveExplicitTargetsStep.js.map +1 -0
- package/dist/agents/routingDecisionStep.js +58 -11
- package/dist/agents/routingDecisionStep.js.map +1 -0
- package/dist/agents/scopeClassificationStep.js +66 -3
- package/dist/agents/scopeClassificationStep.js.map +1 -0
- package/dist/agents/selectRelevantSourcesStep.js +13 -5
- package/dist/agents/selectRelevantSourcesStep.js.map +1 -0
- package/dist/agents/structuralPreloadStep.js +3 -4
- package/dist/agents/structuralPreloadStep.js.map +1 -0
- package/dist/agents/transformPlanGenStep.js +105 -18
- package/dist/agents/transformPlanGenStep.js.map +1 -0
- package/dist/agents/understandIntentStep.js +237 -17
- package/dist/agents/understandIntentStep.js.map +1 -0
- package/dist/agents/validateChangesStep.js +16 -2
- package/dist/agents/validateChangesStep.js.map +1 -0
- package/dist/agents/writeFileStep.js +1 -0
- package/dist/agents/writeFileStep.js.map +1 -0
- package/dist/commands/AskCmd.js +139 -44
- package/dist/commands/AskCmd.js.map +1 -0
- package/dist/commands/BackupCmd.js +1 -0
- package/dist/commands/BackupCmd.js.map +1 -0
- package/dist/commands/ChangeLogUpdateCmd.js +1 -0
- package/dist/commands/ChangeLogUpdateCmd.js.map +1 -0
- package/dist/commands/CommitSuggesterCmd.js +55 -13
- package/dist/commands/CommitSuggesterCmd.js.map +1 -0
- package/dist/commands/DaemonCmd.js +52 -14
- package/dist/commands/DaemonCmd.js.map +1 -0
- package/dist/commands/DeleteIndex.js +1 -0
- package/dist/commands/DeleteIndex.js.map +1 -0
- package/dist/commands/EvalReportCmd.js +374 -0
- package/dist/commands/EvalReportCmd.js.map +1 -0
- package/dist/commands/FindCmd.js +1 -0
- package/dist/commands/FindCmd.js.map +1 -0
- package/dist/commands/GitCmd.js +1 -0
- package/dist/commands/GitCmd.js.map +1 -0
- package/dist/commands/IndexCmd.js +11 -79
- package/dist/commands/IndexCmd.js.map +1 -0
- package/dist/commands/InspectCmd.js +1 -0
- package/dist/commands/InspectCmd.js.map +1 -0
- package/dist/commands/ModelCmd.js +24 -0
- package/dist/commands/ModelCmd.js.map +1 -0
- package/dist/commands/ReadlineSingleton.js +1 -0
- package/dist/commands/ReadlineSingleton.js.map +1 -0
- package/dist/commands/ResetDbCmd.js +18 -1
- package/dist/commands/ResetDbCmd.js.map +1 -0
- package/dist/commands/ReviewCmd.js +1 -0
- package/dist/commands/ReviewCmd.js.map +1 -0
- package/dist/commands/StatusCmd.js +22 -0
- package/dist/commands/StatusCmd.js.map +1 -0
- package/dist/commands/StopDaemonCmd.js +1 -0
- package/dist/commands/StopDaemonCmd.js.map +1 -0
- package/dist/commands/SummaryCmd.js +1 -0
- package/dist/commands/SummaryCmd.js.map +1 -0
- package/dist/commands/SwitchCmd.js +9 -15
- package/dist/commands/SwitchCmd.js.map +1 -0
- package/dist/commands/TasksCmd.js +142 -57
- package/dist/commands/TasksCmd.js.map +1 -0
- package/dist/commands/TestCmd.js +66 -0
- package/dist/commands/TestCmd.js.map +1 -0
- package/dist/commands/WorkflowCmd.js +1 -0
- package/dist/commands/WorkflowCmd.js.map +1 -0
- package/dist/commands/commandVisibility.js +27 -0
- package/dist/commands/commandVisibility.js.map +1 -0
- package/dist/commands/evalCommands.js +1337 -0
- package/dist/commands/evalCommands.js.map +1 -0
- package/dist/commands/factory.js +206 -38
- package/dist/commands/factory.js.map +1 -0
- package/dist/config.js +62 -11
- package/dist/config.js.map +1 -0
- package/dist/constants.js +21 -3
- package/dist/constants.js.map +1 -0
- package/dist/context.js +33 -32
- package/dist/context.js.map +1 -0
- package/dist/daemon/daemonQueues.js +1 -20
- package/dist/daemon/daemonQueues.js.map +1 -0
- package/dist/daemon/daemonWorker.js +26 -37
- package/dist/daemon/daemonWorker.js.map +1 -0
- package/dist/daemon/generateSummaries.js +1 -0
- package/dist/daemon/generateSummaries.js.map +1 -0
- package/dist/daemon/runFolderCapsuleBatch.js +1 -0
- package/dist/daemon/runFolderCapsuleBatch.js.map +1 -0
- package/dist/daemon/runIndexingBatch.js +1 -0
- package/dist/daemon/runIndexingBatch.js.map +1 -0
- package/dist/daemon/runKgBatch.js +9 -1
- package/dist/daemon/runKgBatch.js.map +1 -0
- package/dist/db/backup.js +1 -0
- package/dist/db/backup.js.map +1 -0
- package/dist/db/client.js +18 -3
- package/dist/db/client.js.map +1 -0
- package/dist/db/fileIndex.js +110 -152
- package/dist/db/fileIndex.js.map +1 -0
- package/dist/db/functionExtractors/extractFromJava.js +1 -0
- package/dist/db/functionExtractors/extractFromJava.js.map +1 -0
- package/dist/db/functionExtractors/extractFromJs.js +1 -0
- package/dist/db/functionExtractors/extractFromJs.js.map +1 -0
- package/dist/db/functionExtractors/extractFromTs.js +1 -0
- package/dist/db/functionExtractors/extractFromTs.js.map +1 -0
- package/dist/db/functionExtractors/extractFromXML.js +1 -0
- package/dist/db/functionExtractors/extractFromXML.js.map +1 -0
- package/dist/db/functionExtractors/index.js +1 -0
- package/dist/db/functionExtractors/index.js.map +1 -0
- package/dist/db/functionIndex.js +9 -0
- package/dist/db/functionIndex.js.map +1 -0
- package/dist/db/schema.js +314 -99
- package/dist/db/schema.js.map +1 -0
- package/dist/db/sqlTemplates.js +1 -0
- package/dist/db/sqlTemplates.js.map +1 -0
- package/dist/fileRules/builtins.js +1 -0
- package/dist/fileRules/builtins.js.map +1 -0
- package/dist/fileRules/classifyFile.js +1 -0
- package/dist/fileRules/classifyFile.js.map +1 -0
- package/dist/fileRules/codeAllowedExtensions.js +1 -0
- package/dist/fileRules/codeAllowedExtensions.js.map +1 -0
- package/dist/fileRules/detectFileType.js +1 -0
- package/dist/fileRules/detectFileType.js.map +1 -0
- package/dist/fileRules/fileClassifier.js +1 -0
- package/dist/fileRules/fileClassifier.js.map +1 -0
- package/dist/fileRules/fileExceptions.js +1 -0
- package/dist/fileRules/fileExceptions.js.map +1 -0
- package/dist/fileRules/ignoredExtensions.js +1 -0
- package/dist/fileRules/ignoredExtensions.js.map +1 -0
- package/dist/fileRules/ignoredPaths.js +48 -5
- package/dist/fileRules/ignoredPaths.js.map +1 -0
- package/dist/fileRules/queryTokenRules.js +176 -0
- package/dist/fileRules/queryTokenRules.js.map +1 -0
- package/dist/fileRules/searchPathClassification.js +58 -0
- package/dist/fileRules/searchPathClassification.js.map +1 -0
- package/dist/fileRules/shouldIgnoreFiles.js +1 -0
- package/dist/fileRules/shouldIgnoreFiles.js.map +1 -0
- package/dist/fileRules/stopWords.js +9 -0
- package/dist/fileRules/stopWords.js.map +1 -0
- package/dist/fileRules/wellKnownRepoFiles.js +1 -0
- package/dist/fileRules/wellKnownRepoFiles.js.map +1 -0
- package/dist/git/commitSummary.js +227 -0
- package/dist/git/commitSummary.js.map +1 -0
- package/dist/github/api.js +1 -0
- package/dist/github/api.js.map +1 -0
- package/dist/github/auth.js +1 -0
- package/dist/github/auth.js.map +1 -0
- package/dist/github/github.js +1 -0
- package/dist/github/github.js.map +1 -0
- package/dist/github/githubAuthCheck.js +1 -0
- package/dist/github/githubAuthCheck.js.map +1 -0
- package/dist/github/postComments.js +1 -0
- package/dist/github/postComments.js.map +1 -0
- package/dist/github/repo.js +15 -24
- package/dist/github/repo.js.map +1 -0
- package/dist/github/token.js +1 -0
- package/dist/github/token.js.map +1 -0
- package/dist/github/types.js +1 -0
- package/dist/github/types.js.map +1 -0
- package/dist/index.js +318 -37
- package/dist/index.js.map +1 -0
- package/dist/lib/generate.js +264 -20
- package/dist/lib/generate.js.map +1 -0
- package/dist/lib/generateFolderCapsules.js +1 -0
- package/dist/lib/generateFolderCapsules.js.map +1 -0
- package/dist/lib/ollamaModelPolicy.js +59 -0
- package/dist/lib/ollamaModelPolicy.js.map +1 -0
- package/dist/lib/spinner.js +29 -9
- package/dist/lib/spinner.js.map +1 -0
- package/dist/modelSetup.js +25 -78
- package/dist/modelSetup.js.map +1 -0
- package/dist/pipeline/modules/changeLogModule.js +10 -1
- package/dist/pipeline/modules/changeLogModule.js.map +1 -0
- package/dist/pipeline/modules/cleanupModule.js +1 -0
- package/dist/pipeline/modules/cleanupModule.js.map +1 -0
- package/dist/pipeline/modules/codeTransformModule.js +10 -16
- package/dist/pipeline/modules/codeTransformModule.js.map +1 -0
- package/dist/pipeline/modules/commentModule.js +12 -0
- package/dist/pipeline/modules/commentModule.js.map +1 -0
- package/dist/pipeline/modules/commitSuggesterModule.js +82 -12
- package/dist/pipeline/modules/commitSuggesterModule.js.map +1 -0
- package/dist/pipeline/modules/contextReviewModule.js +12 -1
- package/dist/pipeline/modules/contextReviewModule.js.map +1 -0
- package/dist/pipeline/modules/dialogAnswerModule.js +58 -0
- package/dist/pipeline/modules/dialogAnswerModule.js.map +1 -0
- package/dist/pipeline/modules/fileSearchModule.js +5 -143
- package/dist/pipeline/modules/fileSearchModule.js.map +1 -0
- package/dist/pipeline/modules/finalAnswerModule.js +1176 -151
- package/dist/pipeline/modules/finalAnswerModule.js.map +1 -0
- package/dist/pipeline/modules/kgModule.js +18 -1
- package/dist/pipeline/modules/kgModule.js.map +1 -0
- package/dist/pipeline/modules/planAnswerModule.js +99 -0
- package/dist/pipeline/modules/planAnswerModule.js.map +1 -0
- package/dist/pipeline/modules/readFileModule.js +300 -0
- package/dist/pipeline/modules/readFileModule.js.map +1 -0
- package/dist/pipeline/modules/reviewModule.js +10 -1
- package/dist/pipeline/modules/reviewModule.js.map +1 -0
- package/dist/pipeline/modules/searchDbModule.js +159 -0
- package/dist/pipeline/modules/searchDbModule.js.map +1 -0
- package/dist/pipeline/modules/searchListDirectoryModule.js +62 -0
- package/dist/pipeline/modules/searchListDirectoryModule.js.map +1 -0
- package/dist/pipeline/modules/searchModuleShared.js +71 -0
- package/dist/pipeline/modules/searchModuleShared.js.map +1 -0
- package/dist/pipeline/modules/searchRegexModule.js +59 -0
- package/dist/pipeline/modules/searchRegexModule.js.map +1 -0
- package/dist/pipeline/modules/semanticAnalysisModule.js +185 -28
- package/dist/pipeline/modules/semanticAnalysisModule.js.map +1 -0
- package/dist/pipeline/modules/summaryModule.js +11 -1
- package/dist/pipeline/modules/summaryModule.js.map +1 -0
- package/dist/pipeline/registry/moduleRegistry.js +9 -0
- package/dist/pipeline/registry/moduleRegistry.js.map +1 -0
- package/dist/pipeline/runModulePipeline.js +1 -0
- package/dist/pipeline/runModulePipeline.js.map +1 -0
- package/dist/scripts/dbScriptSupport.js +172 -0
- package/dist/scripts/dbScriptSupport.js.map +1 -0
- package/dist/scripts/dbcheck.js +173 -267
- package/dist/scripts/dbcheck.js.map +1 -0
- package/dist/scripts/dboverview.js +161 -0
- package/dist/scripts/dboverview.js.map +1 -0
- package/dist/scripts/migrateDb.js +1 -0
- package/dist/scripts/migrateDb.js.map +1 -0
- package/dist/search/SearchOrchestrator.js +928 -0
- package/dist/search/SearchOrchestrator.js.map +1 -0
- package/dist/search/sharedRankingPolicy.js +283 -0
- package/dist/search/sharedRankingPolicy.js.map +1 -0
- package/dist/setup/reindexOwner.js +97 -0
- package/dist/setup/reindexOwner.js.map +1 -0
- package/dist/setup/setupOwner.js +100 -0
- package/dist/setup/setupOwner.js.map +1 -0
- package/dist/shell/dialogUi.js +81 -0
- package/dist/shell/dialogUi.js.map +1 -0
- package/dist/shellSession.js +126 -0
- package/dist/shellSession.js.map +1 -0
- package/dist/status/statusOwner.js +239 -0
- package/dist/status/statusOwner.js.map +1 -0
- package/dist/testing/contextEval.js +514 -0
- package/dist/testing/contextEval.js.map +1 -0
- package/dist/testing/fixtures/transform/small-file.input.js +5 -0
- package/dist/testing/fixtures/transform/small-file.input.js.map +1 -0
- package/dist/testing/harnessArtifacts.js +112 -0
- package/dist/testing/harnessArtifacts.js.map +1 -0
- package/dist/testing/llmTraceSession.js +67 -0
- package/dist/testing/llmTraceSession.js.map +1 -0
- package/dist/testing/registerDevCliCommands.js +43 -0
- package/dist/testing/registerDevCliCommands.js.map +1 -0
- package/dist/testing/runDiagnosis.js +248 -0
- package/dist/testing/runDiagnosis.js.map +1 -0
- package/dist/testing/runtimeLogReader.js +144 -0
- package/dist/testing/runtimeLogReader.js.map +1 -0
- package/dist/testing/testCommands.js +35 -303
- package/dist/testing/testCommands.js.map +1 -0
- package/dist/testing/testRegistry.js +233 -0
- package/dist/testing/testRegistry.js.map +1 -0
- package/dist/types.js +1 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/buildContextualPrompt.js +26 -75
- package/dist/utils/buildContextualPrompt.js.map +1 -0
- package/dist/utils/changeLogPrompt.js +1 -0
- package/dist/utils/changeLogPrompt.js.map +1 -0
- package/dist/utils/checkModel.js +17 -92
- package/dist/utils/checkModel.js.map +1 -0
- package/dist/utils/commentMap.js +1 -0
- package/dist/utils/commentMap.js.map +1 -0
- package/dist/utils/compileSearchQuery.js +23 -9
- package/dist/utils/compileSearchQuery.js.map +1 -0
- package/dist/utils/consolePresentation.js +208 -0
- package/dist/utils/consolePresentation.js.map +1 -0
- package/dist/utils/contentUtils.js +17 -2
- package/dist/utils/contentUtils.js.map +1 -0
- package/dist/utils/debugContext.js +1 -0
- package/dist/utils/debugContext.js.map +1 -0
- package/dist/utils/dialogState.js +201 -0
- package/dist/utils/dialogState.js.map +1 -0
- package/dist/utils/editor.js +1 -0
- package/dist/utils/editor.js.map +1 -0
- package/dist/utils/executionEvidence.js +50 -0
- package/dist/utils/executionEvidence.js.map +1 -0
- package/dist/utils/extractFileReferences.js +140 -6
- package/dist/utils/extractFileReferences.js.map +1 -0
- package/dist/utils/fileEvidenceCache.js +50 -0
- package/dist/utils/fileEvidenceCache.js.map +1 -0
- package/dist/utils/fileTree.js +1 -0
- package/dist/utils/fileTree.js.map +1 -0
- package/dist/utils/loadRelevantFolderCapsules.js +35 -5
- package/dist/utils/loadRelevantFolderCapsules.js.map +1 -0
- package/dist/utils/log.js +10 -1
- package/dist/utils/log.js.map +1 -0
- package/dist/utils/normalizeData.js +1 -0
- package/dist/utils/normalizeData.js.map +1 -0
- package/dist/utils/ollamaModelStatus.js +28 -0
- package/dist/utils/ollamaModelStatus.js.map +1 -0
- package/dist/utils/ollamaService.js +294 -0
- package/dist/utils/ollamaService.js.map +1 -0
- package/dist/utils/outputFormatter.js +1 -0
- package/dist/utils/outputFormatter.js.map +1 -0
- package/dist/utils/parseTaggedContent.js +1 -0
- package/dist/utils/parseTaggedContent.js.map +1 -0
- package/dist/utils/planActions.js +27 -46
- package/dist/utils/planActions.js.map +1 -0
- package/dist/utils/promptBuilderHelper.js +1 -0
- package/dist/utils/promptBuilderHelper.js.map +1 -0
- package/dist/utils/promptLogHelper.js +29 -13
- package/dist/utils/promptLogHelper.js.map +1 -0
- package/dist/utils/queryAnchors.js +71 -0
- package/dist/utils/queryAnchors.js.map +1 -0
- package/dist/utils/repoIdentity.js +82 -0
- package/dist/utils/repoIdentity.js.map +1 -0
- package/dist/utils/repoKey.js +1 -0
- package/dist/utils/repoKey.js.map +1 -0
- package/dist/utils/resolveTargetsToFiles.js +1 -0
- package/dist/utils/resolveTargetsToFiles.js.map +1 -0
- package/dist/utils/resumeContext.js +219 -0
- package/dist/utils/resumeContext.js.map +1 -0
- package/dist/utils/resumeState.js +310 -0
- package/dist/utils/resumeState.js.map +1 -0
- package/dist/utils/rollingPlan.js +118 -0
- package/dist/utils/rollingPlan.js.map +1 -0
- package/dist/utils/runQueryWithDaemonControl.js +11 -3
- package/dist/utils/runQueryWithDaemonControl.js.map +1 -0
- package/dist/utils/runtimeLogger.js +252 -0
- package/dist/utils/runtimeLogger.js.map +1 -0
- package/dist/utils/sanitizeQuery.js +1 -0
- package/dist/utils/sanitizeQuery.js.map +1 -0
- package/dist/utils/sharedUtils.js +1 -0
- package/dist/utils/sharedUtils.js.map +1 -0
- package/dist/utils/sleep.js +1 -0
- package/dist/utils/sleep.js.map +1 -0
- package/dist/utils/splitCodeIntoChunk.js +1 -0
- package/dist/utils/splitCodeIntoChunk.js.map +1 -0
- package/dist/utils/time.js +66 -0
- package/dist/utils/time.js.map +1 -0
- package/dist/utils/verifyFocusPreference.js +107 -0
- package/dist/utils/verifyFocusPreference.js.map +1 -0
- package/dist/utils/vscode.js +1 -0
- package/dist/utils/vscode.js.map +1 -0
- package/dist/workflow/workflowResolver.js +1 -0
- package/dist/workflow/workflowResolver.js.map +1 -0
- package/dist/workflow/workflowRunner.js +1 -0
- package/dist/workflow/workflowRunner.js.map +1 -0
- package/package.json +3 -3
- package/dist/agents/MainAgent.js +0 -1886
- package/dist/agents/contextReviewStep.js +0 -101
- package/dist/agents/finalPlanGenStep.js +0 -107
- package/dist/agents/structuralAnalysisStep.js +0 -46
- package/dist/agents/validationAnalysisStep.js +0 -87
- package/dist/pipeline/modules/chunkManagerModule.js +0 -24
- package/dist/pipeline/modules/cleanGeneratedTestsModule.js +0 -33
- package/dist/pipeline/modules/fileReaderModule.js +0 -72
- package/dist/pipeline/modules/gatherInfoModule.js +0 -181
- package/dist/pipeline/modules/generateTestsModule.js +0 -68
- package/dist/pipeline/modules/preserveCodeModule.js +0 -195
- package/dist/pipeline/modules/refactorModule.js +0 -40
- package/dist/pipeline/modules/repairTestsModule.js +0 -48
- package/dist/pipeline/modules/runTestsModule.js +0 -37
|
@@ -0,0 +1,1139 @@
|
|
|
1
|
+
// Verifies final grounding uses compact answer packets instead of planning-heavy prompt dumps.
|
|
2
|
+
// It mocks generation so the test only covers source selection and prompt context assembly.
|
|
3
|
+
import { beforeEach, describe, expect, it, vi } from "vitest";
|
|
4
|
+
vi.mock("../../../lib/generate.js", () => ({
|
|
5
|
+
generate: vi.fn(),
|
|
6
|
+
}));
|
|
7
|
+
import { generate } from "../../../lib/generate.js";
|
|
8
|
+
import { finalAnswerModule } from "../../../pipeline/modules/finalAnswerModule.js";
|
|
9
|
+
describe("finalAnswerModule", () => {
|
|
10
|
+
beforeEach(() => {
|
|
11
|
+
vi.mocked(generate).mockReset();
|
|
12
|
+
vi.mocked(generate).mockResolvedValue({
|
|
13
|
+
query: "",
|
|
14
|
+
data: "Grounded answer",
|
|
15
|
+
});
|
|
16
|
+
});
|
|
17
|
+
it("uses verify-relevant selected files when semantic meaningful files are missing", async () => {
|
|
18
|
+
const verifyFile = "/repo/cli/src/agents/mainAgentVerify.ts";
|
|
19
|
+
const readinessFile = "/repo/cli/src/agents/readinessGateStep.ts";
|
|
20
|
+
const context = {
|
|
21
|
+
initContext: {
|
|
22
|
+
userQuery: "Trace how selectedFiles and candidateFiles evolve across verify waves for this query.",
|
|
23
|
+
},
|
|
24
|
+
analysis: {
|
|
25
|
+
focus: {
|
|
26
|
+
selectedFiles: [verifyFile, readinessFile],
|
|
27
|
+
candidateFiles: [],
|
|
28
|
+
rationale: "Verify selected these files.",
|
|
29
|
+
},
|
|
30
|
+
verify: {
|
|
31
|
+
byFile: {
|
|
32
|
+
[verifyFile]: { isRelevant: true, fileConfidence: 0.78 },
|
|
33
|
+
[readinessFile]: { isRelevant: true, fileConfidence: 0.64 },
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
fileAnalysis: {},
|
|
37
|
+
},
|
|
38
|
+
workingFiles: [
|
|
39
|
+
{ path: verifyFile, code: "const selectedFiles = []; const candidateFiles = [];" },
|
|
40
|
+
{ path: readinessFile, code: "const selectedFiles = focus.selectedFiles ?? [];" },
|
|
41
|
+
],
|
|
42
|
+
task: {
|
|
43
|
+
steps: [],
|
|
44
|
+
},
|
|
45
|
+
execution: {},
|
|
46
|
+
};
|
|
47
|
+
const out = await finalAnswerModule.run({ query: context.initContext.userQuery, context });
|
|
48
|
+
expect(String(out.content)).toContain(verifyFile);
|
|
49
|
+
expect(String(out.content)).toContain(readinessFile);
|
|
50
|
+
expect(context.analysis.finalAnswer).toContain("Analyzed files:");
|
|
51
|
+
});
|
|
52
|
+
it("ignores verify-relevant files that were never selected or loaded", async () => {
|
|
53
|
+
const selectedFile = "/repo/cli/src/agents/mainAgentVerify.ts";
|
|
54
|
+
const contextualFile = "/repo/cli/src/agents/structuralPreloadStep.ts";
|
|
55
|
+
const context = {
|
|
56
|
+
initContext: {
|
|
57
|
+
userQuery: "Trace how selectedFiles evolve across verify waves for this query.",
|
|
58
|
+
},
|
|
59
|
+
analysis: {
|
|
60
|
+
focus: {
|
|
61
|
+
selectedFiles: [selectedFile],
|
|
62
|
+
candidateFiles: [],
|
|
63
|
+
rationale: "Verify selected one file.",
|
|
64
|
+
},
|
|
65
|
+
verify: {
|
|
66
|
+
byFile: {
|
|
67
|
+
[selectedFile]: { isRelevant: true, fileConfidence: 0.78 },
|
|
68
|
+
[contextualFile]: { isRelevant: true, fileConfidence: 0.66 },
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
fileAnalysis: {},
|
|
72
|
+
},
|
|
73
|
+
workingFiles: [
|
|
74
|
+
{ path: selectedFile, code: "const selectedFiles = [];" },
|
|
75
|
+
],
|
|
76
|
+
task: {
|
|
77
|
+
steps: [],
|
|
78
|
+
},
|
|
79
|
+
execution: {},
|
|
80
|
+
};
|
|
81
|
+
const out = await finalAnswerModule.run({ query: context.initContext.userQuery, context });
|
|
82
|
+
expect(String(out.content)).toContain(selectedFile);
|
|
83
|
+
expect(String(out.content)).not.toContain(contextualFile);
|
|
84
|
+
});
|
|
85
|
+
it("prefers verify pipeline files ahead of docs when both are verify-relevant", async () => {
|
|
86
|
+
const verifyFile = "/repo/cli/src/agents/mainAgentVerify.ts";
|
|
87
|
+
const readmeFile = "/repo/README.md";
|
|
88
|
+
const context = {
|
|
89
|
+
initContext: {
|
|
90
|
+
userQuery: "Trace how selectedFiles and candidateFiles evolve across verify waves for this query.",
|
|
91
|
+
},
|
|
92
|
+
analysis: {
|
|
93
|
+
focus: {
|
|
94
|
+
selectedFiles: [verifyFile, readmeFile],
|
|
95
|
+
candidateFiles: [],
|
|
96
|
+
rationale: "Verify selected both files.",
|
|
97
|
+
},
|
|
98
|
+
verify: {
|
|
99
|
+
byFile: {
|
|
100
|
+
[verifyFile]: { isRelevant: true, fileConfidence: 0.62 },
|
|
101
|
+
[readmeFile]: { isRelevant: true, fileConfidence: 0.72 },
|
|
102
|
+
},
|
|
103
|
+
},
|
|
104
|
+
fileAnalysis: {},
|
|
105
|
+
},
|
|
106
|
+
workingFiles: [
|
|
107
|
+
{ path: verifyFile, code: "const selectedFiles = []; const candidateFiles = [];" },
|
|
108
|
+
{ path: readmeFile, code: "# verify selectedFiles candidateFiles" },
|
|
109
|
+
],
|
|
110
|
+
task: {
|
|
111
|
+
steps: [],
|
|
112
|
+
},
|
|
113
|
+
execution: {},
|
|
114
|
+
};
|
|
115
|
+
const out = await finalAnswerModule.run({ query: context.initContext.userQuery, context });
|
|
116
|
+
const analyzedFiles = out.data.analyzedFiles;
|
|
117
|
+
expect(analyzedFiles[0]).toBe(verifyFile);
|
|
118
|
+
});
|
|
119
|
+
it("keeps verify-backed implementation files in the answer packet when semantic docs are also relevant", async () => {
|
|
120
|
+
const verifyFile = "/repo/cli/src/agents/mainAgentVerify.ts";
|
|
121
|
+
const fileCheckFile = "/repo/cli/src/agents/fileCheckStep.ts";
|
|
122
|
+
const readmeFile = "/repo/README.md";
|
|
123
|
+
const context = {
|
|
124
|
+
initContext: {
|
|
125
|
+
userQuery: "Trace how selectedFiles and candidateFiles evolve across verify waves for this query.",
|
|
126
|
+
},
|
|
127
|
+
analysis: {
|
|
128
|
+
focus: {
|
|
129
|
+
selectedFiles: [verifyFile, fileCheckFile],
|
|
130
|
+
candidateFiles: [readmeFile],
|
|
131
|
+
rationale: "Verify selected the implementation files, while semantic analysis also saw docs.",
|
|
132
|
+
},
|
|
133
|
+
verify: {
|
|
134
|
+
byFile: {
|
|
135
|
+
[verifyFile]: { isRelevant: true, fileConfidence: 0.81 },
|
|
136
|
+
[fileCheckFile]: { isRelevant: true, fileConfidence: 0.77 },
|
|
137
|
+
},
|
|
138
|
+
},
|
|
139
|
+
fileAnalysis: {
|
|
140
|
+
[readmeFile]: {
|
|
141
|
+
semanticAnalyzed: true,
|
|
142
|
+
intent: "relevant",
|
|
143
|
+
proposedChanges: {
|
|
144
|
+
summary: "Architecture overview mentions selectedFiles and candidateFiles.",
|
|
145
|
+
},
|
|
146
|
+
},
|
|
147
|
+
},
|
|
148
|
+
},
|
|
149
|
+
workingFiles: [
|
|
150
|
+
{ path: verifyFile, code: "export async function runVerify() { const selectedFiles = []; }" },
|
|
151
|
+
{ path: fileCheckFile, code: "export async function fileCheckStep() { const candidateFiles = []; }" },
|
|
152
|
+
{ path: readmeFile, code: "# verify selectedFiles candidateFiles" },
|
|
153
|
+
],
|
|
154
|
+
task: { steps: [] },
|
|
155
|
+
execution: {},
|
|
156
|
+
};
|
|
157
|
+
const out = await finalAnswerModule.run({ query: context.initContext.userQuery, context });
|
|
158
|
+
const analyzedFiles = out.data.analyzedFiles;
|
|
159
|
+
expect(analyzedFiles).toContain(verifyFile);
|
|
160
|
+
expect(analyzedFiles).toContain(fileCheckFile);
|
|
161
|
+
expect(String(out.content)).toContain(verifyFile);
|
|
162
|
+
expect(String(out.content)).toContain(fileCheckFile);
|
|
163
|
+
});
|
|
164
|
+
it("keeps selected working verify files even when verify metadata only grounded docs", async () => {
|
|
165
|
+
const verifyFile = "/repo/cli/src/agents/mainAgentVerify.ts";
|
|
166
|
+
const fileCheckFile = "/repo/cli/src/agents/fileCheckStep.ts";
|
|
167
|
+
const readmeFile = "/repo/README.md";
|
|
168
|
+
const context = {
|
|
169
|
+
initContext: {
|
|
170
|
+
userQuery: "Trace how selectedFiles and candidateFiles evolve across verify waves for this query.",
|
|
171
|
+
},
|
|
172
|
+
analysis: {
|
|
173
|
+
focus: {
|
|
174
|
+
selectedFiles: [verifyFile, fileCheckFile],
|
|
175
|
+
candidateFiles: [readmeFile],
|
|
176
|
+
rationale: "The selectedFiles are directly related to the core logic of verification waves and file handling within the agent system.",
|
|
177
|
+
},
|
|
178
|
+
verify: {
|
|
179
|
+
byFile: {
|
|
180
|
+
[readmeFile]: { isRelevant: true, fileConfidence: 1 },
|
|
181
|
+
},
|
|
182
|
+
},
|
|
183
|
+
fileAnalysis: {
|
|
184
|
+
[readmeFile]: {
|
|
185
|
+
semanticAnalyzed: true,
|
|
186
|
+
intent: "relevant",
|
|
187
|
+
proposedChanges: {
|
|
188
|
+
summary: "Architecture overview mentions selectedFiles and candidateFiles.",
|
|
189
|
+
},
|
|
190
|
+
},
|
|
191
|
+
},
|
|
192
|
+
},
|
|
193
|
+
workingFiles: [
|
|
194
|
+
{ path: verifyFile, code: "export async function runVerify() { const selectedFiles = []; }" },
|
|
195
|
+
{ path: fileCheckFile, code: "export async function fileCheckStep() { const candidateFiles = []; }" },
|
|
196
|
+
{ path: readmeFile, code: "# verify selectedFiles candidateFiles" },
|
|
197
|
+
],
|
|
198
|
+
task: {
|
|
199
|
+
steps: [
|
|
200
|
+
{ filePath: verifyFile, status: "completed", type: "analysis" },
|
|
201
|
+
{ filePath: fileCheckFile, status: "completed", type: "analysis" },
|
|
202
|
+
],
|
|
203
|
+
},
|
|
204
|
+
execution: {},
|
|
205
|
+
};
|
|
206
|
+
const out = await finalAnswerModule.run({ query: context.initContext.userQuery, context });
|
|
207
|
+
const analyzedFiles = out.data.analyzedFiles;
|
|
208
|
+
expect(analyzedFiles).toContain(verifyFile);
|
|
209
|
+
expect(analyzedFiles).toContain(fileCheckFile);
|
|
210
|
+
expect(String(out.content)).toContain(verifyFile);
|
|
211
|
+
expect(String(out.content)).toContain(fileCheckFile);
|
|
212
|
+
});
|
|
213
|
+
it("passes exact verify structural symbols into the final prompt", async () => {
|
|
214
|
+
const verifyFile = "/repo/cli/src/agents/mainAgentVerify.ts";
|
|
215
|
+
vi.mocked(generate).mockResolvedValueOnce({
|
|
216
|
+
query: "",
|
|
217
|
+
data: "Grounded answer",
|
|
218
|
+
});
|
|
219
|
+
const context = {
|
|
220
|
+
initContext: {
|
|
221
|
+
userQuery: "For repo-wide analysis questions, which method decides verify wave budget and why?",
|
|
222
|
+
},
|
|
223
|
+
analysis: {
|
|
224
|
+
focus: {
|
|
225
|
+
selectedFiles: [verifyFile],
|
|
226
|
+
candidateFiles: [],
|
|
227
|
+
rationale: "Verify selected the controller file.",
|
|
228
|
+
},
|
|
229
|
+
verify: {
|
|
230
|
+
byFile: {
|
|
231
|
+
[verifyFile]: {
|
|
232
|
+
isRelevant: true,
|
|
233
|
+
fileConfidence: 0.91,
|
|
234
|
+
evidence: [
|
|
235
|
+
{
|
|
236
|
+
type: "structural",
|
|
237
|
+
excerpt: "getGroundingWaveBudget",
|
|
238
|
+
claim: "Function name matches query intent: \"getGroundingWaveBudget\"",
|
|
239
|
+
confidence: 0.96,
|
|
240
|
+
},
|
|
241
|
+
],
|
|
242
|
+
},
|
|
243
|
+
},
|
|
244
|
+
},
|
|
245
|
+
fileAnalysis: {},
|
|
246
|
+
},
|
|
247
|
+
workingFiles: [
|
|
248
|
+
{ path: verifyFile, code: "export function getGroundingWaveBudget() { return 4; }" },
|
|
249
|
+
],
|
|
250
|
+
task: {
|
|
251
|
+
steps: [],
|
|
252
|
+
},
|
|
253
|
+
execution: {},
|
|
254
|
+
};
|
|
255
|
+
await finalAnswerModule.run({ query: context.initContext.userQuery, context });
|
|
256
|
+
const generateCalls = vi.mocked(generate).mock.calls;
|
|
257
|
+
const lastCall = generateCalls[generateCalls.length - 1];
|
|
258
|
+
const prompt = String(lastCall?.[0]?.content ?? "");
|
|
259
|
+
expect(prompt).toContain("Exact identifiers:");
|
|
260
|
+
expect(prompt).toContain("getGroundingWaveBudget");
|
|
261
|
+
expect(prompt).toContain("Use exact identifiers only when they materially support the answer.");
|
|
262
|
+
expect(prompt).not.toContain("getVerifyWaveBudget");
|
|
263
|
+
expect(prompt).not.toContain("PROPOSED CHANGES");
|
|
264
|
+
});
|
|
265
|
+
it("surfaces module label and query-aligned identifiers for single-file explanations", async () => {
|
|
266
|
+
const filePath = "/repo/cli/src/pipeline/modules/finalAnswerModule.ts";
|
|
267
|
+
const context = {
|
|
268
|
+
initContext: {
|
|
269
|
+
userQuery: "Explain final answer module",
|
|
270
|
+
},
|
|
271
|
+
analysis: {
|
|
272
|
+
focus: {
|
|
273
|
+
selectedFiles: [filePath],
|
|
274
|
+
candidateFiles: [],
|
|
275
|
+
rationale: "The finalAnswerModule.ts file is the direct answer target.",
|
|
276
|
+
},
|
|
277
|
+
fileAnalysis: {
|
|
278
|
+
[filePath]: {
|
|
279
|
+
semanticAnalyzed: true,
|
|
280
|
+
intent: "relevant",
|
|
281
|
+
proposedChanges: {
|
|
282
|
+
summary: "Final answer assembly lives here.",
|
|
283
|
+
},
|
|
284
|
+
},
|
|
285
|
+
},
|
|
286
|
+
},
|
|
287
|
+
workingFiles: [
|
|
288
|
+
{
|
|
289
|
+
path: filePath,
|
|
290
|
+
code: [
|
|
291
|
+
"export const finalAnswerModule = {};",
|
|
292
|
+
"function buildFinalAnswer() { return ''; }",
|
|
293
|
+
"function renderFinalAnswerPrompt() { return ''; }",
|
|
294
|
+
].join("\n"),
|
|
295
|
+
},
|
|
296
|
+
],
|
|
297
|
+
task: { steps: [] },
|
|
298
|
+
execution: {},
|
|
299
|
+
};
|
|
300
|
+
await finalAnswerModule.run({ query: context.initContext.userQuery, context });
|
|
301
|
+
const prompt = String(vi.mocked(generate).mock.calls.slice(-1)[0]?.[0]?.content ?? "");
|
|
302
|
+
expect(prompt).toContain("Final Answer Module");
|
|
303
|
+
expect(prompt).toContain("buildFinalAnswer");
|
|
304
|
+
expect(prompt).toContain("finalAnswerModule");
|
|
305
|
+
});
|
|
306
|
+
it("keeps preferred grounded files from research synthesis for repo-wide answers", async () => {
|
|
307
|
+
const testCmdFile = "/repo/cli/src/commands/TestCmd.ts";
|
|
308
|
+
const testCommandsFile = "/repo/cli/src/testing/testCommands.ts";
|
|
309
|
+
const context = {
|
|
310
|
+
initContext: {
|
|
311
|
+
userQuery: "How does this repo run tests and where are the test entry points configured?",
|
|
312
|
+
},
|
|
313
|
+
analysis: {
|
|
314
|
+
scopeType: "repo-wide",
|
|
315
|
+
intent: {
|
|
316
|
+
questions: [
|
|
317
|
+
{ id: "q1", order: 0, text: "How does this repo run tests?", normalizedQuery: "How does this repo run tests?", intentCategory: "question" },
|
|
318
|
+
{ id: "q2", order: 1, text: "where are the test entry points configured?", normalizedQuery: "where are the test entry points configured?", intentCategory: "question" },
|
|
319
|
+
],
|
|
320
|
+
},
|
|
321
|
+
focus: {
|
|
322
|
+
selectedFiles: [],
|
|
323
|
+
candidateFiles: [testCmdFile, testCommandsFile],
|
|
324
|
+
rationale: `The strongest files are ${testCmdFile} and ${testCommandsFile}.`,
|
|
325
|
+
},
|
|
326
|
+
verify: {
|
|
327
|
+
byFile: {
|
|
328
|
+
[testCommandsFile]: { isRelevant: true, fileConfidence: 0.91 },
|
|
329
|
+
},
|
|
330
|
+
},
|
|
331
|
+
fileAnalysis: {
|
|
332
|
+
[testCommandsFile]: {
|
|
333
|
+
semanticAnalyzed: true,
|
|
334
|
+
intent: "relevant",
|
|
335
|
+
proposedChanges: { summary: "Test command wrappers live here." },
|
|
336
|
+
},
|
|
337
|
+
},
|
|
338
|
+
researchArtifacts: {
|
|
339
|
+
latestByAction: {
|
|
340
|
+
"research-architecture-synthesis": {
|
|
341
|
+
summary: "Architecture synthesis completed from 2 analyzed file(s).",
|
|
342
|
+
collectedData: {
|
|
343
|
+
problemStatement: "Summarize test entry points.",
|
|
344
|
+
architectureInputFiles: [testCmdFile, testCommandsFile],
|
|
345
|
+
},
|
|
346
|
+
},
|
|
347
|
+
},
|
|
348
|
+
},
|
|
349
|
+
},
|
|
350
|
+
workingFiles: [
|
|
351
|
+
{ path: testCmdFile, code: "export class TestCmd {}" },
|
|
352
|
+
{ path: testCommandsFile, code: "export function runAllTestsCommand() {}" },
|
|
353
|
+
],
|
|
354
|
+
task: { steps: [] },
|
|
355
|
+
execution: {},
|
|
356
|
+
};
|
|
357
|
+
const out = await finalAnswerModule.run({ query: context.initContext.userQuery, context });
|
|
358
|
+
const analyzedFiles = out.data.analyzedFiles;
|
|
359
|
+
expect(analyzedFiles).toContain(testCmdFile);
|
|
360
|
+
expect(String(out.content)).toContain(testCmdFile);
|
|
361
|
+
});
|
|
362
|
+
it("prefers rationale-mentioned grounded files for snippet-only explanations", async () => {
|
|
363
|
+
const targetFile = "/repo/cli/src/__tests__/search/SearchOrchestrator.test.ts";
|
|
364
|
+
const fallbackFile = "/repo/cli/src/testing/testRegistry.ts";
|
|
365
|
+
const context = {
|
|
366
|
+
initContext: {
|
|
367
|
+
userQuery: '"returns raw operator-pattern matches without semantic guessing"',
|
|
368
|
+
},
|
|
369
|
+
analysis: {
|
|
370
|
+
focus: {
|
|
371
|
+
selectedFiles: [fallbackFile],
|
|
372
|
+
candidateFiles: [targetFile],
|
|
373
|
+
rationale: `Quoted snippet is grounded in ${targetFile}.`,
|
|
374
|
+
},
|
|
375
|
+
fileAnalysis: {
|
|
376
|
+
[fallbackFile]: {
|
|
377
|
+
semanticAnalyzed: true,
|
|
378
|
+
intent: "relevant",
|
|
379
|
+
proposedChanges: { summary: "Registry references the test target." },
|
|
380
|
+
},
|
|
381
|
+
},
|
|
382
|
+
},
|
|
383
|
+
workingFiles: [
|
|
384
|
+
{ path: targetFile, code: "it('returns raw operator-pattern matches without semantic guessing', () => {});" },
|
|
385
|
+
{ path: fallbackFile, code: "export const REGISTERED_TEST_TARGETS = [];" },
|
|
386
|
+
],
|
|
387
|
+
task: { steps: [] },
|
|
388
|
+
execution: {},
|
|
389
|
+
};
|
|
390
|
+
const out = await finalAnswerModule.run({ query: context.initContext.userQuery, context });
|
|
391
|
+
const analyzedFiles = out.data.analyzedFiles;
|
|
392
|
+
expect(analyzedFiles).toContain(targetFile);
|
|
393
|
+
expect(String(out.content)).toContain(targetFile);
|
|
394
|
+
});
|
|
395
|
+
it("compresses long supporting excerpts around exact identifiers instead of dumping file headers", async () => {
|
|
396
|
+
const filePath = "/repo/cli/src/db/fileIndex.ts";
|
|
397
|
+
const longHeader = [
|
|
398
|
+
"/**",
|
|
399
|
+
" * Owns indexed file discovery and DB-backed search primitives for the CLI.",
|
|
400
|
+
" */",
|
|
401
|
+
"import fg from 'fast-glob';",
|
|
402
|
+
"import path from 'path';",
|
|
403
|
+
"import lockfile from 'proper-lockfile';",
|
|
404
|
+
"import { initSchema } from '../db/schema.js';",
|
|
405
|
+
"import { getDbForRepo } from '../db/client.js';",
|
|
406
|
+
"import { upsertFileTemplate } from '../db/sqlTemplates.js';",
|
|
407
|
+
"",
|
|
408
|
+
"async function expandQueryWithModel(query: string): Promise<string | null> {",
|
|
409
|
+
" const response = await generate({ content: query, query: '' }, { caller: 'x' });",
|
|
410
|
+
" return response.data as string;",
|
|
411
|
+
"}",
|
|
412
|
+
].join("\n");
|
|
413
|
+
const context = {
|
|
414
|
+
initContext: {
|
|
415
|
+
userQuery: "Where are SQLite queries defined in db/fileIndex.ts?",
|
|
416
|
+
},
|
|
417
|
+
analysis: {
|
|
418
|
+
focus: {
|
|
419
|
+
selectedFiles: [filePath],
|
|
420
|
+
candidateFiles: [],
|
|
421
|
+
rationale: "Focused DB query lookup.",
|
|
422
|
+
},
|
|
423
|
+
verify: {
|
|
424
|
+
byFile: {
|
|
425
|
+
[filePath]: {
|
|
426
|
+
isRelevant: true,
|
|
427
|
+
fileConfidence: 0.94,
|
|
428
|
+
evidence: [
|
|
429
|
+
{
|
|
430
|
+
type: "structural",
|
|
431
|
+
excerpt: "import { upsertFileTemplate } from '../db/sqlTemplates.js';",
|
|
432
|
+
claim: "Import identifier",
|
|
433
|
+
confidence: 0.96,
|
|
434
|
+
},
|
|
435
|
+
],
|
|
436
|
+
},
|
|
437
|
+
},
|
|
438
|
+
},
|
|
439
|
+
fileAnalysis: {
|
|
440
|
+
[filePath]: {
|
|
441
|
+
semanticAnalyzed: true,
|
|
442
|
+
intent: "relevant",
|
|
443
|
+
proposedChanges: {
|
|
444
|
+
summary: "SQLite helpers live in fileIndex.ts.",
|
|
445
|
+
},
|
|
446
|
+
excerpts: [
|
|
447
|
+
{
|
|
448
|
+
description: "Large excerpt",
|
|
449
|
+
code: longHeader,
|
|
450
|
+
},
|
|
451
|
+
],
|
|
452
|
+
},
|
|
453
|
+
},
|
|
454
|
+
},
|
|
455
|
+
workingFiles: [
|
|
456
|
+
{ path: filePath, code: longHeader },
|
|
457
|
+
],
|
|
458
|
+
task: { steps: [] },
|
|
459
|
+
execution: {},
|
|
460
|
+
};
|
|
461
|
+
await finalAnswerModule.run({ query: context.initContext.userQuery, context });
|
|
462
|
+
const prompt = String(vi.mocked(generate).mock.calls.slice(-1)[0]?.[0]?.content ?? "");
|
|
463
|
+
expect(prompt).toContain("upsertFileTemplate");
|
|
464
|
+
expect(prompt).not.toContain("import fg from 'fast-glob';");
|
|
465
|
+
expect(prompt).not.toContain("Owns indexed file discovery and DB-backed search primitives");
|
|
466
|
+
});
|
|
467
|
+
it("reduces verbose focus rationale before final grounding", async () => {
|
|
468
|
+
const filePath = "/repo/cli/src/db/fileIndex.ts";
|
|
469
|
+
const context = {
|
|
470
|
+
initContext: {
|
|
471
|
+
userQuery: "Where are SQLite queries defined?",
|
|
472
|
+
},
|
|
473
|
+
analysis: {
|
|
474
|
+
focus: {
|
|
475
|
+
selectedFiles: [filePath],
|
|
476
|
+
candidateFiles: [],
|
|
477
|
+
rationale: [
|
|
478
|
+
"Pre-check: +0 selected / +0 candidate(s); totals 2 selected, 0 candidate(s).",
|
|
479
|
+
"[Post-check] Both files are relevant based on the user's query about where SQLite queries are defined.",
|
|
480
|
+
"[selectRelevantSources] Working files mirrored from execution lane snapshot.",
|
|
481
|
+
"Extra line that should not survive into the final grounding packet because it is too detailed.",
|
|
482
|
+
].join("\n"),
|
|
483
|
+
},
|
|
484
|
+
fileAnalysis: {
|
|
485
|
+
[filePath]: {
|
|
486
|
+
semanticAnalyzed: true,
|
|
487
|
+
intent: "relevant",
|
|
488
|
+
proposedChanges: { summary: "Query helpers live here." },
|
|
489
|
+
},
|
|
490
|
+
},
|
|
491
|
+
},
|
|
492
|
+
workingFiles: [{ path: filePath, code: "export const queryFiles = () => {};" }],
|
|
493
|
+
task: { steps: [] },
|
|
494
|
+
execution: {},
|
|
495
|
+
};
|
|
496
|
+
await finalAnswerModule.run({ query: context.initContext.userQuery, context });
|
|
497
|
+
const prompt = String(vi.mocked(generate).mock.calls.slice(-1)[0]?.[0]?.content ?? "");
|
|
498
|
+
expect(prompt).toContain("Rationale for focus:");
|
|
499
|
+
expect(prompt).toContain("Pre-check: +0 selected / +0 candidate(s); totals 2 selected, 0 candidate(s).");
|
|
500
|
+
expect(prompt).toContain("[Post-check] Both files are relevant based on the user's query about where SQLite queries are defined.");
|
|
501
|
+
expect(prompt).not.toContain("[selectRelevantSources]");
|
|
502
|
+
expect(prompt).not.toContain("Extra line that should not survive into the final grounding packet");
|
|
503
|
+
});
|
|
504
|
+
it("passes ordered question parts into the final prompt for multi-question tasks", async () => {
|
|
505
|
+
const filePath = "/repo/cli/src/agents/MainAgent.ts";
|
|
506
|
+
const context = {
|
|
507
|
+
initContext: {
|
|
508
|
+
userQuery: "Where is search routed? How is verify triggered?",
|
|
509
|
+
},
|
|
510
|
+
analysis: {
|
|
511
|
+
intent: {
|
|
512
|
+
questions: [
|
|
513
|
+
{
|
|
514
|
+
id: "q1",
|
|
515
|
+
order: 0,
|
|
516
|
+
text: "Where is search routed?",
|
|
517
|
+
normalizedQuery: "Where is search routed?",
|
|
518
|
+
intentCategory: "question",
|
|
519
|
+
},
|
|
520
|
+
{
|
|
521
|
+
id: "q2",
|
|
522
|
+
order: 1,
|
|
523
|
+
text: "How is verify triggered?",
|
|
524
|
+
normalizedQuery: "How is verify triggered?",
|
|
525
|
+
intentCategory: "question",
|
|
526
|
+
},
|
|
527
|
+
],
|
|
528
|
+
},
|
|
529
|
+
focus: {
|
|
530
|
+
selectedFiles: [filePath],
|
|
531
|
+
candidateFiles: [],
|
|
532
|
+
rationale: "Main agent file is selected.",
|
|
533
|
+
},
|
|
534
|
+
fileAnalysis: {
|
|
535
|
+
[filePath]: {
|
|
536
|
+
semanticAnalyzed: true,
|
|
537
|
+
intent: "relevant",
|
|
538
|
+
proposedChanges: {
|
|
539
|
+
summary: "Main agent handles routing and verify entry.",
|
|
540
|
+
},
|
|
541
|
+
},
|
|
542
|
+
},
|
|
543
|
+
},
|
|
544
|
+
workingFiles: [
|
|
545
|
+
{ path: filePath, code: "export class MainAgent {}" },
|
|
546
|
+
],
|
|
547
|
+
task: {
|
|
548
|
+
steps: [],
|
|
549
|
+
},
|
|
550
|
+
execution: {},
|
|
551
|
+
};
|
|
552
|
+
await finalAnswerModule.run({ query: context.initContext.userQuery, context });
|
|
553
|
+
const prompt = String(vi.mocked(generate).mock.calls.slice(-1)[0]?.[0]?.content ?? "");
|
|
554
|
+
expect(prompt).toContain("Ordered question parts:");
|
|
555
|
+
expect(prompt).toContain("1. Where is search routed?");
|
|
556
|
+
expect(prompt).toContain("2. How is verify triggered?");
|
|
557
|
+
expect(prompt).toContain("answer in that exact order with numbered sections");
|
|
558
|
+
});
|
|
559
|
+
it("falls back to query-aligned exact identifiers when verify evidence omits them", async () => {
|
|
560
|
+
const filePath = "/repo/cli/src/agents/MainAgent.ts";
|
|
561
|
+
const context = {
|
|
562
|
+
initContext: {
|
|
563
|
+
userQuery: "Where is search routed? How is verify triggered?",
|
|
564
|
+
},
|
|
565
|
+
analysis: {
|
|
566
|
+
focus: {
|
|
567
|
+
selectedFiles: [filePath],
|
|
568
|
+
candidateFiles: [],
|
|
569
|
+
rationale: "MainAgent handles the orchestration path.",
|
|
570
|
+
},
|
|
571
|
+
fileAnalysis: {
|
|
572
|
+
[filePath]: {
|
|
573
|
+
semanticAnalyzed: true,
|
|
574
|
+
intent: "relevant",
|
|
575
|
+
proposedChanges: {
|
|
576
|
+
summary: "MainAgent coordinates routing and verify.",
|
|
577
|
+
},
|
|
578
|
+
},
|
|
579
|
+
},
|
|
580
|
+
},
|
|
581
|
+
workingFiles: [
|
|
582
|
+
{
|
|
583
|
+
path: filePath,
|
|
584
|
+
code: [
|
|
585
|
+
"export class MainAgent {",
|
|
586
|
+
" private async runVerify(): Promise<void> {}",
|
|
587
|
+
" private async runVerifyBridge(): Promise<void> {",
|
|
588
|
+
" await this.runVerify();",
|
|
589
|
+
" }",
|
|
590
|
+
"}",
|
|
591
|
+
].join("\n"),
|
|
592
|
+
},
|
|
593
|
+
],
|
|
594
|
+
task: { steps: [] },
|
|
595
|
+
execution: {},
|
|
596
|
+
};
|
|
597
|
+
await finalAnswerModule.run({ query: context.initContext.userQuery, context });
|
|
598
|
+
const prompt = String(vi.mocked(generate).mock.calls.slice(-1)[0]?.[0]?.content ?? "");
|
|
599
|
+
expect(prompt).toContain("runVerify");
|
|
600
|
+
});
|
|
601
|
+
it("renders structured multi-question answers in deterministic numbered order", async () => {
|
|
602
|
+
const filePath = "/repo/cli/src/agents/MainAgent.ts";
|
|
603
|
+
vi.mocked(generate).mockResolvedValueOnce({
|
|
604
|
+
query: "",
|
|
605
|
+
data: JSON.stringify({
|
|
606
|
+
answers: [
|
|
607
|
+
{ questionId: "q1", answer: "Search is routed through MainAgent.", evidenceStatus: "grounded" },
|
|
608
|
+
{ questionId: "q2", answer: "Verify is triggered after evidence collection.", evidenceStatus: "grounded" },
|
|
609
|
+
],
|
|
610
|
+
}),
|
|
611
|
+
});
|
|
612
|
+
const context = {
|
|
613
|
+
initContext: {
|
|
614
|
+
userQuery: "Where is search routed? How is verify triggered?",
|
|
615
|
+
},
|
|
616
|
+
analysis: {
|
|
617
|
+
intent: {
|
|
618
|
+
questions: [
|
|
619
|
+
{ id: "q1", order: 0, text: "Where is search routed?", normalizedQuery: "Where is search routed?", intentCategory: "question" },
|
|
620
|
+
{ id: "q2", order: 1, text: "How is verify triggered?", normalizedQuery: "How is verify triggered?", intentCategory: "question" },
|
|
621
|
+
],
|
|
622
|
+
},
|
|
623
|
+
focus: {
|
|
624
|
+
selectedFiles: [filePath],
|
|
625
|
+
candidateFiles: [],
|
|
626
|
+
rationale: "MainAgent selected.",
|
|
627
|
+
},
|
|
628
|
+
fileAnalysis: {
|
|
629
|
+
[filePath]: {
|
|
630
|
+
semanticAnalyzed: true,
|
|
631
|
+
intent: "relevant",
|
|
632
|
+
proposedChanges: { summary: "MainAgent owns loop routing and verify entry." },
|
|
633
|
+
},
|
|
634
|
+
},
|
|
635
|
+
},
|
|
636
|
+
workingFiles: [{ path: filePath, code: "export class MainAgent {}" }],
|
|
637
|
+
task: { steps: [] },
|
|
638
|
+
execution: {},
|
|
639
|
+
};
|
|
640
|
+
const out = await finalAnswerModule.run({ query: context.initContext.userQuery, context });
|
|
641
|
+
expect(String(out.content)).toContain("1. Where is search routed?");
|
|
642
|
+
expect(String(out.content)).toContain("Search is routed through MainAgent.");
|
|
643
|
+
expect(String(out.content)).toContain("2. How is verify triggered?");
|
|
644
|
+
expect(String(out.content)).toContain("Verify is triggered after evidence collection.");
|
|
645
|
+
});
|
|
646
|
+
it("keeps plain-text multi-question answers instead of forcing missing placeholders", async () => {
|
|
647
|
+
const filePath = "/repo/cli/src/agents/MainAgent.ts";
|
|
648
|
+
vi.mocked(generate).mockResolvedValueOnce({
|
|
649
|
+
query: "",
|
|
650
|
+
data: "1. Where is search routed?\nSearch is routed through MainAgent.\n\n2. How is verify triggered?\nVerify is triggered after evidence collection.",
|
|
651
|
+
});
|
|
652
|
+
const context = {
|
|
653
|
+
initContext: {
|
|
654
|
+
userQuery: "Where is search routed? How is verify triggered?",
|
|
655
|
+
},
|
|
656
|
+
analysis: {
|
|
657
|
+
intent: {
|
|
658
|
+
questions: [
|
|
659
|
+
{ id: "q1", order: 0, text: "Where is search routed?", normalizedQuery: "Where is search routed?", intentCategory: "question" },
|
|
660
|
+
{ id: "q2", order: 1, text: "How is verify triggered?", normalizedQuery: "How is verify triggered?", intentCategory: "question" },
|
|
661
|
+
],
|
|
662
|
+
},
|
|
663
|
+
focus: {
|
|
664
|
+
selectedFiles: [filePath],
|
|
665
|
+
candidateFiles: [],
|
|
666
|
+
rationale: "MainAgent selected.",
|
|
667
|
+
},
|
|
668
|
+
fileAnalysis: {
|
|
669
|
+
[filePath]: {
|
|
670
|
+
semanticAnalyzed: true,
|
|
671
|
+
intent: "relevant",
|
|
672
|
+
proposedChanges: { summary: "MainAgent owns loop routing and verify entry." },
|
|
673
|
+
},
|
|
674
|
+
},
|
|
675
|
+
},
|
|
676
|
+
workingFiles: [{ path: filePath, code: "export class MainAgent {}" }],
|
|
677
|
+
task: { steps: [] },
|
|
678
|
+
execution: {},
|
|
679
|
+
};
|
|
680
|
+
const out = await finalAnswerModule.run({ query: context.initContext.userQuery, context });
|
|
681
|
+
expect(String(out.content)).toContain("1. Where is search routed?");
|
|
682
|
+
expect(String(out.content)).toContain("2. How is verify triggered?");
|
|
683
|
+
expect(String(out.content)).not.toContain("Not enough grounded evidence");
|
|
684
|
+
});
|
|
685
|
+
it("prefers exact verify symbols over conflicting semantic prose", async () => {
|
|
686
|
+
const verifyFile = "/repo/cli/src/agents/mainAgentVerify.ts";
|
|
687
|
+
const context = {
|
|
688
|
+
initContext: {
|
|
689
|
+
userQuery: "For repo-wide analysis questions, which method decides verify wave budget and why?",
|
|
690
|
+
},
|
|
691
|
+
analysis: {
|
|
692
|
+
focus: {
|
|
693
|
+
selectedFiles: [verifyFile],
|
|
694
|
+
candidateFiles: [],
|
|
695
|
+
rationale: "Verify selected the controller file.",
|
|
696
|
+
},
|
|
697
|
+
verify: {
|
|
698
|
+
byFile: {
|
|
699
|
+
[verifyFile]: {
|
|
700
|
+
isRelevant: true,
|
|
701
|
+
fileConfidence: 0.91,
|
|
702
|
+
evidence: [
|
|
703
|
+
{
|
|
704
|
+
type: "structural",
|
|
705
|
+
excerpt: "getGroundingWaveBudget",
|
|
706
|
+
claim: "Function-like declaration matches query intent: \"getGroundingWaveBudget\"",
|
|
707
|
+
confidence: 0.96,
|
|
708
|
+
},
|
|
709
|
+
],
|
|
710
|
+
},
|
|
711
|
+
},
|
|
712
|
+
},
|
|
713
|
+
fileAnalysis: {
|
|
714
|
+
[verifyFile]: {
|
|
715
|
+
semanticAnalyzed: true,
|
|
716
|
+
intent: "relevant",
|
|
717
|
+
proposedChanges: {
|
|
718
|
+
summary: "This file uses getVerifyWaveBudget to compute the budget.",
|
|
719
|
+
scope: "minor",
|
|
720
|
+
targets: ["getVerifyWaveBudget"],
|
|
721
|
+
rationale: "Conflicting semantic summary",
|
|
722
|
+
},
|
|
723
|
+
},
|
|
724
|
+
},
|
|
725
|
+
},
|
|
726
|
+
workingFiles: [
|
|
727
|
+
{ path: verifyFile, code: "export function getGroundingWaveBudget() { return 4; }" },
|
|
728
|
+
],
|
|
729
|
+
task: {
|
|
730
|
+
steps: [],
|
|
731
|
+
},
|
|
732
|
+
execution: {},
|
|
733
|
+
};
|
|
734
|
+
await finalAnswerModule.run({ query: context.initContext.userQuery, context });
|
|
735
|
+
const generateCalls = vi.mocked(generate).mock.calls;
|
|
736
|
+
const lastCall = generateCalls[generateCalls.length - 1];
|
|
737
|
+
const prompt = String(lastCall?.[0]?.content ?? "");
|
|
738
|
+
expect(prompt).toContain("getGroundingWaveBudget");
|
|
739
|
+
expect(prompt).not.toContain("getVerifyWaveBudget");
|
|
740
|
+
});
|
|
741
|
+
it("does not let low-confidence verify symbols replace semantic analysis", async () => {
|
|
742
|
+
const verifyFile = "/repo/cli/src/agents/mainAgentVerify.ts";
|
|
743
|
+
const context = {
|
|
744
|
+
initContext: {
|
|
745
|
+
userQuery: "For repo-wide analysis questions, which method decides verify wave budget and why?",
|
|
746
|
+
},
|
|
747
|
+
analysis: {
|
|
748
|
+
focus: {
|
|
749
|
+
selectedFiles: [verifyFile],
|
|
750
|
+
candidateFiles: [],
|
|
751
|
+
rationale: "Verify selected the controller file.",
|
|
752
|
+
},
|
|
753
|
+
verify: {
|
|
754
|
+
byFile: {
|
|
755
|
+
[verifyFile]: {
|
|
756
|
+
isRelevant: true,
|
|
757
|
+
fileConfidence: 0.91,
|
|
758
|
+
evidence: [
|
|
759
|
+
{
|
|
760
|
+
type: "structural",
|
|
761
|
+
excerpt: "getGroundingWaveBudget",
|
|
762
|
+
claim: "Import/Export matches query intent: \"getGroundingWaveBudget\"",
|
|
763
|
+
confidence: 0.55,
|
|
764
|
+
},
|
|
765
|
+
],
|
|
766
|
+
},
|
|
767
|
+
},
|
|
768
|
+
},
|
|
769
|
+
fileAnalysis: {
|
|
770
|
+
[verifyFile]: {
|
|
771
|
+
semanticAnalyzed: true,
|
|
772
|
+
intent: "relevant",
|
|
773
|
+
proposedChanges: {
|
|
774
|
+
summary: "Semantic analysis identifies computeVerifyBudget as the deciding method.",
|
|
775
|
+
scope: "minor",
|
|
776
|
+
targets: ["computeVerifyBudget"],
|
|
777
|
+
rationale: "Semantic summary should remain authoritative here.",
|
|
778
|
+
},
|
|
779
|
+
excerpts: [
|
|
780
|
+
{
|
|
781
|
+
description: "Relevant code excerpt",
|
|
782
|
+
code: "export function computeVerifyBudget() { return 4; }",
|
|
783
|
+
},
|
|
784
|
+
],
|
|
785
|
+
},
|
|
786
|
+
},
|
|
787
|
+
},
|
|
788
|
+
workingFiles: [
|
|
789
|
+
{ path: verifyFile, code: "export function computeVerifyBudget() { return 4; }" },
|
|
790
|
+
],
|
|
791
|
+
task: {
|
|
792
|
+
steps: [],
|
|
793
|
+
},
|
|
794
|
+
execution: {},
|
|
795
|
+
};
|
|
796
|
+
await finalAnswerModule.run({ query: context.initContext.userQuery, context });
|
|
797
|
+
const generateCalls = vi.mocked(generate).mock.calls;
|
|
798
|
+
const lastCall = generateCalls[generateCalls.length - 1];
|
|
799
|
+
const prompt = String(lastCall?.[0]?.content ?? "");
|
|
800
|
+
expect(prompt).toContain("Semantic analysis identifies computeVerifyBudget as the deciding method.");
|
|
801
|
+
expect(prompt).toContain("[No exact identifiers needed]");
|
|
802
|
+
expect(prompt).not.toContain("Verify evidence identifies getGroundingWaveBudget as an exact symbol relevant to the answer.");
|
|
803
|
+
});
|
|
804
|
+
it("prefers stored research synthesis for repo-wide grounding", async () => {
|
|
805
|
+
const registryFile = "/repo/cli/src/pipeline/registry/moduleRegistry.ts";
|
|
806
|
+
const finalFile = "/repo/cli/src/pipeline/modules/finalAnswerModule.ts";
|
|
807
|
+
const context = {
|
|
808
|
+
initContext: {
|
|
809
|
+
userQuery: "summarize this repo architecture and identify weak coupling points",
|
|
810
|
+
},
|
|
811
|
+
analysis: {
|
|
812
|
+
scopeType: "repo-wide",
|
|
813
|
+
focus: {
|
|
814
|
+
selectedFiles: [registryFile, finalFile],
|
|
815
|
+
candidateFiles: [],
|
|
816
|
+
rationale: "Repo-wide architecture review.",
|
|
817
|
+
},
|
|
818
|
+
researchArtifacts: {
|
|
819
|
+
latestByAction: {
|
|
820
|
+
"research-architecture-synthesis": {
|
|
821
|
+
action: "research-architecture-synthesis",
|
|
822
|
+
summary: "Architecture synthesis completed from 6 analyzed file(s).",
|
|
823
|
+
completedAt: "2026-04-02T00:00:00.000Z",
|
|
824
|
+
collectedData: {
|
|
825
|
+
problemStatement: "Summarize repository architecture and identify weak coupling points.",
|
|
826
|
+
priorResearchSummaries: [
|
|
827
|
+
{ action: "research-impact-map", summary: "Impact map across files." },
|
|
828
|
+
],
|
|
829
|
+
sharedPatterns: ["Shared Module/ModuleIO contract."],
|
|
830
|
+
hotspots: ["Registry layer is high impact."],
|
|
831
|
+
couplingPoints: ["Central registry point."],
|
|
832
|
+
architectureInputFiles: [registryFile, finalFile],
|
|
833
|
+
},
|
|
834
|
+
},
|
|
835
|
+
},
|
|
836
|
+
touchedFiles: [registryFile, finalFile],
|
|
837
|
+
},
|
|
838
|
+
fileAnalysis: {},
|
|
839
|
+
},
|
|
840
|
+
workingFiles: [
|
|
841
|
+
{ path: registryFile, code: "export const builtInModules = {};" },
|
|
842
|
+
{ path: finalFile, code: "export const finalAnswerModule = {};" },
|
|
843
|
+
],
|
|
844
|
+
task: {
|
|
845
|
+
steps: [],
|
|
846
|
+
},
|
|
847
|
+
execution: {},
|
|
848
|
+
};
|
|
849
|
+
await finalAnswerModule.run({ query: context.initContext.userQuery, context });
|
|
850
|
+
const generateCalls = vi.mocked(generate).mock.calls;
|
|
851
|
+
const lastCall = generateCalls[generateCalls.length - 1];
|
|
852
|
+
const prompt = String(lastCall?.[0]?.content ?? "");
|
|
853
|
+
const options = lastCall?.[1];
|
|
854
|
+
expect(prompt).toContain("Answer mode:\nrepo-wide");
|
|
855
|
+
expect(prompt).toContain("Research synthesis:");
|
|
856
|
+
expect(prompt).toContain("Architecture synthesis completed from 6 analyzed file(s).");
|
|
857
|
+
expect(prompt).not.toContain("[No combined analysis available]");
|
|
858
|
+
expect(options?.inputContext?.researchSummary).toContain("Architecture synthesis completed from 6 analyzed file(s).");
|
|
859
|
+
});
|
|
860
|
+
it("reduces continuity capsules before final grounding", async () => {
|
|
861
|
+
const actionRouterFile = "/repo/cli/src/agents/actionRouter.ts";
|
|
862
|
+
const context = {
|
|
863
|
+
initContext: {
|
|
864
|
+
userQuery: "what should we do next?",
|
|
865
|
+
resumedContextCapsule: [
|
|
866
|
+
"Original task: Explain routing in MainAgent.ts.",
|
|
867
|
+
"Current task status: active",
|
|
868
|
+
"Repo root: /repo",
|
|
869
|
+
"Execution path: /repo",
|
|
870
|
+
"Current intent state:",
|
|
871
|
+
"- Normalized intent: Explain routing in MainAgent.ts",
|
|
872
|
+
"Current routing/focus state:",
|
|
873
|
+
"- Selected files: /repo/cli/src/agents/MainAgent.ts",
|
|
874
|
+
"Known assumptions:",
|
|
875
|
+
"- some assumption",
|
|
876
|
+
"Next plan hints:",
|
|
877
|
+
"- inspect action router",
|
|
878
|
+
"New user query: what should we do next?",
|
|
879
|
+
].join("\n"),
|
|
880
|
+
},
|
|
881
|
+
analysis: {
|
|
882
|
+
resumeIntent: {
|
|
883
|
+
kind: "continuity-next-step",
|
|
884
|
+
},
|
|
885
|
+
focus: {
|
|
886
|
+
selectedFiles: [actionRouterFile],
|
|
887
|
+
candidateFiles: [],
|
|
888
|
+
rationale: "Continuity fallback answer.",
|
|
889
|
+
},
|
|
890
|
+
fileAnalysis: {},
|
|
891
|
+
},
|
|
892
|
+
workingFiles: [
|
|
893
|
+
{ path: actionRouterFile, code: "export async function routeAction() {}" },
|
|
894
|
+
],
|
|
895
|
+
task: {
|
|
896
|
+
steps: [],
|
|
897
|
+
},
|
|
898
|
+
execution: {},
|
|
899
|
+
};
|
|
900
|
+
await finalAnswerModule.run({ query: context.initContext.userQuery, context });
|
|
901
|
+
const generateCalls = vi.mocked(generate).mock.calls;
|
|
902
|
+
const lastCall = generateCalls[generateCalls.length - 1];
|
|
903
|
+
const prompt = String(lastCall?.[0]?.content ?? "");
|
|
904
|
+
expect(prompt).toContain("Reduced resumed context:");
|
|
905
|
+
expect(prompt).toContain("Original task: Explain routing in MainAgent.ts.");
|
|
906
|
+
expect(prompt).toContain("New user query: what should we do next?");
|
|
907
|
+
expect(prompt).not.toContain("Repo root: /repo");
|
|
908
|
+
expect(prompt).not.toContain("Known assumptions:");
|
|
909
|
+
});
|
|
910
|
+
it("filters weak generic verify evidence before final grounding", async () => {
|
|
911
|
+
const filePath = "/repo/cli/src/db/fileIndex.ts";
|
|
912
|
+
const context = {
|
|
913
|
+
initContext: {
|
|
914
|
+
userQuery: "Where are SQLite queries defined in db/fileIndex.ts?",
|
|
915
|
+
},
|
|
916
|
+
analysis: {
|
|
917
|
+
focus: {
|
|
918
|
+
selectedFiles: [filePath],
|
|
919
|
+
candidateFiles: [],
|
|
920
|
+
rationale: "Focused DB query lookup.",
|
|
921
|
+
},
|
|
922
|
+
verify: {
|
|
923
|
+
byFile: {
|
|
924
|
+
[filePath]: {
|
|
925
|
+
isRelevant: true,
|
|
926
|
+
fileConfidence: 0.91,
|
|
927
|
+
evidence: [
|
|
928
|
+
{
|
|
929
|
+
type: "symbol",
|
|
930
|
+
excerpt: "module",
|
|
931
|
+
claim: "Generic token.",
|
|
932
|
+
confidence: 0.96,
|
|
933
|
+
},
|
|
934
|
+
{
|
|
935
|
+
type: "structural",
|
|
936
|
+
excerpt: "export function compileSearchQuery() { return ''; }",
|
|
937
|
+
claim: "Function declaration.",
|
|
938
|
+
confidence: 0.96,
|
|
939
|
+
},
|
|
940
|
+
],
|
|
941
|
+
},
|
|
942
|
+
},
|
|
943
|
+
},
|
|
944
|
+
fileAnalysis: {},
|
|
945
|
+
},
|
|
946
|
+
workingFiles: [
|
|
947
|
+
{ path: filePath, code: "export function compileSearchQuery() { return ''; }" },
|
|
948
|
+
],
|
|
949
|
+
task: {
|
|
950
|
+
steps: [],
|
|
951
|
+
},
|
|
952
|
+
execution: {},
|
|
953
|
+
};
|
|
954
|
+
await finalAnswerModule.run({ query: context.initContext.userQuery, context });
|
|
955
|
+
const generateCalls = vi.mocked(generate).mock.calls;
|
|
956
|
+
const lastCall = generateCalls[generateCalls.length - 1];
|
|
957
|
+
const prompt = String(lastCall?.[0]?.content ?? "");
|
|
958
|
+
expect(prompt).toContain("compileSearchQuery");
|
|
959
|
+
expect(prompt).not.toContain("\n- module");
|
|
960
|
+
});
|
|
961
|
+
it("drops non-canonical candidate paths from final grounding input", async () => {
|
|
962
|
+
const selectedFile = "/repo/cli/src/db/fileIndex.ts";
|
|
963
|
+
const context = {
|
|
964
|
+
initContext: {
|
|
965
|
+
userQuery: "Where are SQLite queries defined?",
|
|
966
|
+
},
|
|
967
|
+
analysis: {
|
|
968
|
+
focus: {
|
|
969
|
+
selectedFiles: [selectedFile],
|
|
970
|
+
candidateFiles: ["db/fileIndex.ts", "__research__/impact-map"],
|
|
971
|
+
rationale: "Focused DB query lookup with stale compatibility candidates.",
|
|
972
|
+
},
|
|
973
|
+
fileAnalysis: {},
|
|
974
|
+
},
|
|
975
|
+
workingFiles: [
|
|
976
|
+
{ path: selectedFile, code: "export const queryFiles = () => {};" },
|
|
977
|
+
],
|
|
978
|
+
task: {
|
|
979
|
+
steps: [],
|
|
980
|
+
},
|
|
981
|
+
execution: {},
|
|
982
|
+
};
|
|
983
|
+
await finalAnswerModule.run({ query: context.initContext.userQuery, context });
|
|
984
|
+
const generateCalls = vi.mocked(generate).mock.calls;
|
|
985
|
+
const lastCall = generateCalls[generateCalls.length - 1];
|
|
986
|
+
const prompt = String(lastCall?.[0]?.content ?? "");
|
|
987
|
+
const options = lastCall?.[1];
|
|
988
|
+
expect(prompt).toContain(selectedFile);
|
|
989
|
+
expect(prompt).not.toContain("__research__/impact-map");
|
|
990
|
+
expect(prompt).toContain("Candidate answer files:");
|
|
991
|
+
expect(options?.inputContext?.answerFiles).toEqual([selectedFile]);
|
|
992
|
+
expect(options?.inputContext?.executedAnswerFiles).toEqual([]);
|
|
993
|
+
expect(options?.inputContext?.candidateAnswerFiles).toEqual([selectedFile]);
|
|
994
|
+
});
|
|
995
|
+
it("does not report analyzed files from candidate-only metadata", async () => {
|
|
996
|
+
const candidateFile = "/repo/cli/src/db/fileIndex.ts";
|
|
997
|
+
const context = {
|
|
998
|
+
initContext: {
|
|
999
|
+
userQuery: "Where are SQLite queries defined?",
|
|
1000
|
+
},
|
|
1001
|
+
analysis: {
|
|
1002
|
+
focus: {
|
|
1003
|
+
selectedFiles: [candidateFile],
|
|
1004
|
+
candidateFiles: [],
|
|
1005
|
+
rationale: "Candidate-only focus.",
|
|
1006
|
+
},
|
|
1007
|
+
verify: {
|
|
1008
|
+
byFile: {
|
|
1009
|
+
[candidateFile]: {
|
|
1010
|
+
isRelevant: true,
|
|
1011
|
+
fileConfidence: 0.22,
|
|
1012
|
+
},
|
|
1013
|
+
},
|
|
1014
|
+
},
|
|
1015
|
+
fileAnalysis: {},
|
|
1016
|
+
},
|
|
1017
|
+
workingFiles: [
|
|
1018
|
+
{ path: candidateFile, code: "export const queryFiles = () => {};" },
|
|
1019
|
+
],
|
|
1020
|
+
task: {
|
|
1021
|
+
steps: [],
|
|
1022
|
+
},
|
|
1023
|
+
execution: {},
|
|
1024
|
+
};
|
|
1025
|
+
const out = await finalAnswerModule.run({ query: context.initContext.userQuery, context });
|
|
1026
|
+
const analyzedFiles = out.data.analyzedFiles;
|
|
1027
|
+
const generateCalls = vi.mocked(generate).mock.calls;
|
|
1028
|
+
const lastCall = generateCalls[generateCalls.length - 1];
|
|
1029
|
+
const options = lastCall?.[1];
|
|
1030
|
+
expect(analyzedFiles).toEqual(["[none]"]);
|
|
1031
|
+
expect(options?.inputContext?.executedAnswerFiles).toEqual([]);
|
|
1032
|
+
expect(options?.inputContext?.candidateAnswerFiles).toEqual([candidateFile]);
|
|
1033
|
+
expect(options?.inputContext?.answerEvidenceLevel).toBe("candidate-only");
|
|
1034
|
+
});
|
|
1035
|
+
it("does not label analysis-only steps as executed answer evidence", async () => {
|
|
1036
|
+
const targetFile = "/repo/cli/src/agents/MainAgent.ts";
|
|
1037
|
+
const context = {
|
|
1038
|
+
initContext: {
|
|
1039
|
+
userQuery: "Explain MainAgent.ts",
|
|
1040
|
+
},
|
|
1041
|
+
analysis: {
|
|
1042
|
+
focus: {
|
|
1043
|
+
selectedFiles: [targetFile],
|
|
1044
|
+
candidateFiles: [],
|
|
1045
|
+
rationale: "Exact target explanation.",
|
|
1046
|
+
},
|
|
1047
|
+
fileAnalysis: {},
|
|
1048
|
+
},
|
|
1049
|
+
workingFiles: [
|
|
1050
|
+
{ path: targetFile, code: "export class MainAgent {}" },
|
|
1051
|
+
],
|
|
1052
|
+
task: {
|
|
1053
|
+
steps: [
|
|
1054
|
+
{ taskId: 1, filePath: targetFile, status: "completed", action: "semanticAnalysis" },
|
|
1055
|
+
],
|
|
1056
|
+
},
|
|
1057
|
+
execution: {},
|
|
1058
|
+
};
|
|
1059
|
+
await finalAnswerModule.run({ query: context.initContext.userQuery, context });
|
|
1060
|
+
const generateCalls = vi.mocked(generate).mock.calls;
|
|
1061
|
+
const lastCall = generateCalls[generateCalls.length - 1];
|
|
1062
|
+
const options = lastCall?.[1];
|
|
1063
|
+
expect(options?.inputContext?.executedAnswerFiles).toEqual([]);
|
|
1064
|
+
expect(options?.inputContext?.candidateAnswerFiles).toEqual([targetFile]);
|
|
1065
|
+
expect(options?.inputContext?.answerEvidenceLevel).toBe("candidate-only");
|
|
1066
|
+
});
|
|
1067
|
+
it("reports execution-grade answer evidence from validation and verify separately", async () => {
|
|
1068
|
+
const validatedFile = "/repo/cli/src/search/SearchOrchestrator.ts";
|
|
1069
|
+
const verifyFile = "/repo/cli/src/agents/mainAgentVerify.ts";
|
|
1070
|
+
const validationContext = {
|
|
1071
|
+
initContext: {
|
|
1072
|
+
userQuery: "Explain SearchOrchestrator.ts",
|
|
1073
|
+
},
|
|
1074
|
+
analysis: {
|
|
1075
|
+
focus: {
|
|
1076
|
+
selectedFiles: [validatedFile],
|
|
1077
|
+
candidateFiles: [],
|
|
1078
|
+
rationale: "Validated execution evidence.",
|
|
1079
|
+
},
|
|
1080
|
+
executionOutcome: {
|
|
1081
|
+
validations: [
|
|
1082
|
+
{
|
|
1083
|
+
filePath: validatedFile,
|
|
1084
|
+
actualChange: "validated",
|
|
1085
|
+
status: "valid",
|
|
1086
|
+
requiresRedo: false,
|
|
1087
|
+
},
|
|
1088
|
+
],
|
|
1089
|
+
},
|
|
1090
|
+
fileAnalysis: {},
|
|
1091
|
+
},
|
|
1092
|
+
workingFiles: [
|
|
1093
|
+
{ path: validatedFile, code: "export class SearchOrchestrator {}" },
|
|
1094
|
+
],
|
|
1095
|
+
task: {
|
|
1096
|
+
steps: [],
|
|
1097
|
+
},
|
|
1098
|
+
execution: {},
|
|
1099
|
+
};
|
|
1100
|
+
await finalAnswerModule.run({ query: validationContext.initContext.userQuery, context: validationContext });
|
|
1101
|
+
let generateCalls = vi.mocked(generate).mock.calls;
|
|
1102
|
+
let lastCall = generateCalls[generateCalls.length - 1];
|
|
1103
|
+
let options = lastCall?.[1];
|
|
1104
|
+
expect(options?.inputContext?.executedAnswerFiles).toEqual([validatedFile]);
|
|
1105
|
+
expect(options?.inputContext?.answerEvidenceLevel).toBe("executed");
|
|
1106
|
+
const verifyContext = {
|
|
1107
|
+
initContext: {
|
|
1108
|
+
userQuery: "Explain mainAgentVerify.ts",
|
|
1109
|
+
},
|
|
1110
|
+
analysis: {
|
|
1111
|
+
focus: {
|
|
1112
|
+
selectedFiles: [verifyFile],
|
|
1113
|
+
candidateFiles: [],
|
|
1114
|
+
rationale: "Verify evidence only.",
|
|
1115
|
+
},
|
|
1116
|
+
verify: {
|
|
1117
|
+
byFile: {
|
|
1118
|
+
[verifyFile]: { isRelevant: true, fileConfidence: 0.8 },
|
|
1119
|
+
},
|
|
1120
|
+
},
|
|
1121
|
+
fileAnalysis: {},
|
|
1122
|
+
},
|
|
1123
|
+
workingFiles: [
|
|
1124
|
+
{ path: verifyFile, code: "export const verify = true;" },
|
|
1125
|
+
],
|
|
1126
|
+
task: {
|
|
1127
|
+
steps: [],
|
|
1128
|
+
},
|
|
1129
|
+
execution: {},
|
|
1130
|
+
};
|
|
1131
|
+
await finalAnswerModule.run({ query: verifyContext.initContext.userQuery, context: verifyContext });
|
|
1132
|
+
generateCalls = vi.mocked(generate).mock.calls;
|
|
1133
|
+
lastCall = generateCalls[generateCalls.length - 1];
|
|
1134
|
+
options = lastCall?.[1];
|
|
1135
|
+
expect(options?.inputContext?.executedAnswerFiles).toEqual([verifyFile]);
|
|
1136
|
+
expect(options?.inputContext?.answerEvidenceLevel).toBe("verify");
|
|
1137
|
+
});
|
|
1138
|
+
});
|
|
1139
|
+
//# sourceMappingURL=finalAnswerModule.test.js.map
|