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,134 @@
|
|
|
1
|
+
// Verifies routing stays aligned with scope and write capability instead of drifting into the wrong lane.
|
|
2
|
+
// It uses deterministic context snapshots and asserts only the routing output.
|
|
3
|
+
import { describe, expect, it } from "vitest";
|
|
4
|
+
import { routingDecisionStep } from "../../agents/routingDecisionStep.js";
|
|
5
|
+
// Pass example: explicit two-file comments work routes to bounded execution, and repo-wide explanation work routes to research.
|
|
6
|
+
// Fail example: a bounded edit request drifting into repo research or a read-only repo question allowing transforms.
|
|
7
|
+
describe("routingDecisionStep", () => {
|
|
8
|
+
it("routes explicit multi-file docs work to bounded execution", async () => {
|
|
9
|
+
const context = {
|
|
10
|
+
initContext: {
|
|
11
|
+
userQuery: "Add comments to semanticAnalysisModule.ts and finalAnswerModule.ts",
|
|
12
|
+
},
|
|
13
|
+
analysis: {
|
|
14
|
+
scopeType: "multi-file",
|
|
15
|
+
intent: {
|
|
16
|
+
intentCategory: "docsAndComments",
|
|
17
|
+
confidence: 0.92,
|
|
18
|
+
targetFiles: ["semanticAnalysisModule.ts", "finalAnswerModule.ts"],
|
|
19
|
+
resolvedTargetFiles: ["/repo/semanticAnalysisModule.ts", "/repo/finalAnswerModule.ts"],
|
|
20
|
+
},
|
|
21
|
+
},
|
|
22
|
+
executionControl: {
|
|
23
|
+
constraints: {
|
|
24
|
+
allowFileWrites: true,
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
const decision = await routingDecisionStep.run(context);
|
|
29
|
+
expect(decision.decision).toBe("has-info");
|
|
30
|
+
expect(decision.allowResearch).toBe(false);
|
|
31
|
+
expect(decision.allowSearch).toBe(false);
|
|
32
|
+
expect(decision.allowTransform).toBe(true);
|
|
33
|
+
expect(decision.scopeLocked).toBe(true);
|
|
34
|
+
expect(decision.rationale).toContain("scope=multi-file");
|
|
35
|
+
});
|
|
36
|
+
it("enables research for repo-wide explanation requests without allowing transforms", async () => {
|
|
37
|
+
const context = {
|
|
38
|
+
initContext: {
|
|
39
|
+
userQuery: "Explain the architecture and compare the trade-offs across the repo?",
|
|
40
|
+
},
|
|
41
|
+
analysis: {
|
|
42
|
+
scopeType: "repo-wide",
|
|
43
|
+
intent: {
|
|
44
|
+
intentCategory: "explanation",
|
|
45
|
+
confidence: 0.8,
|
|
46
|
+
targetFiles: [],
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
executionControl: {
|
|
50
|
+
constraints: {
|
|
51
|
+
allowFileWrites: false,
|
|
52
|
+
},
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
const decision = await routingDecisionStep.run(context);
|
|
56
|
+
expect(decision.decision).toBe("needs-info");
|
|
57
|
+
expect(decision.allowResearch).toBe(true);
|
|
58
|
+
expect(decision.allowTransform).toBe(false);
|
|
59
|
+
expect(decision.rationale).toContain("route=repo-research");
|
|
60
|
+
expect(decision.rationale).not.toContain("; ;");
|
|
61
|
+
});
|
|
62
|
+
it("fast-tracks resumed continuity summary queries without search", async () => {
|
|
63
|
+
const context = {
|
|
64
|
+
initContext: {
|
|
65
|
+
userQuery: "where were we?",
|
|
66
|
+
},
|
|
67
|
+
analysis: {
|
|
68
|
+
scopeType: "multi-file",
|
|
69
|
+
intent: {
|
|
70
|
+
intentCategory: "question",
|
|
71
|
+
confidence: 0.8,
|
|
72
|
+
targetFiles: [],
|
|
73
|
+
},
|
|
74
|
+
resumeIntent: {
|
|
75
|
+
kind: "continuity-summary",
|
|
76
|
+
fastTrackEligible: true,
|
|
77
|
+
answerFromResumeOnly: true,
|
|
78
|
+
relevantResumeFiles: ["/repo/cli/src/agents/MainAgent.ts"],
|
|
79
|
+
rationale: "Resumed continuity query.",
|
|
80
|
+
},
|
|
81
|
+
continuityDecision: {
|
|
82
|
+
kind: "direct-resume-answer",
|
|
83
|
+
answerNow: true,
|
|
84
|
+
fallbackRequired: false,
|
|
85
|
+
rationale: "Resumed state is sufficient for a direct answer.",
|
|
86
|
+
},
|
|
87
|
+
},
|
|
88
|
+
executionControl: {
|
|
89
|
+
constraints: {
|
|
90
|
+
allowFileWrites: true,
|
|
91
|
+
},
|
|
92
|
+
},
|
|
93
|
+
};
|
|
94
|
+
const decision = await routingDecisionStep.run(context);
|
|
95
|
+
expect(decision.decision).toBe("has-info");
|
|
96
|
+
expect(decision.allowSearch).toBe(false);
|
|
97
|
+
expect(decision.allowResearch).toBe(false);
|
|
98
|
+
expect(decision.allowTransform).toBe(false);
|
|
99
|
+
expect(decision.scopeLocked).toBe(true);
|
|
100
|
+
expect(decision.rationale).toContain("resumeIntent=continuity-summary");
|
|
101
|
+
expect(decision.rationale).toContain("continuityDecision=direct-resume-answer");
|
|
102
|
+
});
|
|
103
|
+
it("keeps explicit folder targets on the explicit-target lane while still allowing search", async () => {
|
|
104
|
+
const context = {
|
|
105
|
+
initContext: {
|
|
106
|
+
userQuery: "Trace cli/src/agents",
|
|
107
|
+
},
|
|
108
|
+
analysis: {
|
|
109
|
+
scopeType: "multi-file",
|
|
110
|
+
focus: {
|
|
111
|
+
resolvedTargetFiles: [],
|
|
112
|
+
resolvedTargetFolders: ["/repo/cli/src/agents"],
|
|
113
|
+
},
|
|
114
|
+
intent: {
|
|
115
|
+
intentCategory: "explanation",
|
|
116
|
+
confidence: 0.88,
|
|
117
|
+
targetFiles: ["cli/src/agents"],
|
|
118
|
+
},
|
|
119
|
+
},
|
|
120
|
+
executionControl: {
|
|
121
|
+
constraints: {
|
|
122
|
+
allowFileWrites: false,
|
|
123
|
+
},
|
|
124
|
+
},
|
|
125
|
+
};
|
|
126
|
+
const decision = await routingDecisionStep.run(context);
|
|
127
|
+
expect(decision.decision).toBe("needs-info");
|
|
128
|
+
expect(decision.allowSearch).toBe(true);
|
|
129
|
+
expect(decision.scopeLocked).toBe(true);
|
|
130
|
+
expect(decision.rationale).toContain("route=explicit-target");
|
|
131
|
+
expect(decision.rationale).toContain("resolvedFolders=1");
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
//# sourceMappingURL=routingDecisionStep.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routingDecisionStep.test.js","sourceRoot":"","sources":["../../../src/__tests__/agents/routingDecisionStep.test.ts"],"names":[],"mappings":"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","sourcesContent":["// Verifies routing stays aligned with scope and write capability instead of drifting into the wrong lane.\n// It uses deterministic context snapshots and asserts only the routing output.\nimport { describe, expect, it } from \"vitest\";\nimport { routingDecisionStep } from \"../../agents/routingDecisionStep.js\";\n\n// Pass example: explicit two-file comments work routes to bounded execution, and repo-wide explanation work routes to research.\n// Fail example: a bounded edit request drifting into repo research or a read-only repo question allowing transforms.\ndescribe(\"routingDecisionStep\", () => {\n it(\"routes explicit multi-file docs work to bounded execution\", async () => {\n const context = {\n initContext: {\n userQuery: \"Add comments to semanticAnalysisModule.ts and finalAnswerModule.ts\",\n },\n analysis: {\n scopeType: \"multi-file\",\n intent: {\n intentCategory: \"docsAndComments\",\n confidence: 0.92,\n targetFiles: [\"semanticAnalysisModule.ts\", \"finalAnswerModule.ts\"],\n resolvedTargetFiles: [\"/repo/semanticAnalysisModule.ts\", \"/repo/finalAnswerModule.ts\"],\n },\n },\n executionControl: {\n constraints: {\n allowFileWrites: true,\n },\n },\n } as any;\n\n const decision = await routingDecisionStep.run(context);\n\n expect(decision.decision).toBe(\"has-info\");\n expect(decision.allowResearch).toBe(false);\n expect(decision.allowSearch).toBe(false);\n expect(decision.allowTransform).toBe(true);\n expect(decision.scopeLocked).toBe(true);\n expect(decision.rationale).toContain(\"scope=multi-file\");\n });\n\n it(\"enables research for repo-wide explanation requests without allowing transforms\", async () => {\n const context = {\n initContext: {\n userQuery: \"Explain the architecture and compare the trade-offs across the repo?\",\n },\n analysis: {\n scopeType: \"repo-wide\",\n intent: {\n intentCategory: \"explanation\",\n confidence: 0.8,\n targetFiles: [],\n },\n },\n executionControl: {\n constraints: {\n allowFileWrites: false,\n },\n },\n } as any;\n\n const decision = await routingDecisionStep.run(context);\n\n expect(decision.decision).toBe(\"needs-info\");\n expect(decision.allowResearch).toBe(true);\n expect(decision.allowTransform).toBe(false);\n expect(decision.rationale).toContain(\"route=repo-research\");\n expect(decision.rationale).not.toContain(\"; ;\");\n });\n\n it(\"fast-tracks resumed continuity summary queries without search\", async () => {\n const context = {\n initContext: {\n userQuery: \"where were we?\",\n },\n analysis: {\n scopeType: \"multi-file\",\n intent: {\n intentCategory: \"question\",\n confidence: 0.8,\n targetFiles: [],\n },\n resumeIntent: {\n kind: \"continuity-summary\",\n fastTrackEligible: true,\n answerFromResumeOnly: true,\n relevantResumeFiles: [\"/repo/cli/src/agents/MainAgent.ts\"],\n rationale: \"Resumed continuity query.\",\n },\n continuityDecision: {\n kind: \"direct-resume-answer\",\n answerNow: true,\n fallbackRequired: false,\n rationale: \"Resumed state is sufficient for a direct answer.\",\n },\n },\n executionControl: {\n constraints: {\n allowFileWrites: true,\n },\n },\n } as any;\n\n const decision = await routingDecisionStep.run(context);\n\n expect(decision.decision).toBe(\"has-info\");\n expect(decision.allowSearch).toBe(false);\n expect(decision.allowResearch).toBe(false);\n expect(decision.allowTransform).toBe(false);\n expect(decision.scopeLocked).toBe(true);\n expect(decision.rationale).toContain(\"resumeIntent=continuity-summary\");\n expect(decision.rationale).toContain(\"continuityDecision=direct-resume-answer\");\n });\n\n it(\"keeps explicit folder targets on the explicit-target lane while still allowing search\", async () => {\n const context = {\n initContext: {\n userQuery: \"Trace cli/src/agents\",\n },\n analysis: {\n scopeType: \"multi-file\",\n focus: {\n resolvedTargetFiles: [],\n resolvedTargetFolders: [\"/repo/cli/src/agents\"],\n },\n intent: {\n intentCategory: \"explanation\",\n confidence: 0.88,\n targetFiles: [\"cli/src/agents\"],\n },\n },\n executionControl: {\n constraints: {\n allowFileWrites: false,\n },\n },\n } as any;\n\n const decision = await routingDecisionStep.run(context);\n\n expect(decision.decision).toBe(\"needs-info\");\n expect(decision.allowSearch).toBe(true);\n expect(decision.scopeLocked).toBe(true);\n expect(decision.rationale).toContain(\"route=explicit-target\");\n expect(decision.rationale).toContain(\"resolvedFolders=1\");\n });\n});\n"]}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
// Verifies explicit two-file requests stay multi-file even if the model says single-file.
|
|
2
|
+
// It mocks the scope classifier response and checks that deterministic normalization corrects the result.
|
|
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 { scopeClassificationStep } from "../../agents/scopeClassificationStep.js";
|
|
9
|
+
// Pass example: "edit a.ts and b.ts" resolves to multi-file, while "edit a.ts" stays single-file.
|
|
10
|
+
// Fail example: two explicit files collapsing to single-file or repo-wide.
|
|
11
|
+
describe("scopeClassificationStep", () => {
|
|
12
|
+
beforeEach(() => {
|
|
13
|
+
vi.mocked(generate).mockReset();
|
|
14
|
+
});
|
|
15
|
+
// Guards the reported bug where explicit two-file edits were collapsed into single-file scope.
|
|
16
|
+
it("normalizes obvious multi-file requests when the LLM returns single-file", async () => {
|
|
17
|
+
vi.mocked(generate).mockResolvedValue({
|
|
18
|
+
query: "",
|
|
19
|
+
data: '{"scopeType":"single-file"}',
|
|
20
|
+
});
|
|
21
|
+
const context = {
|
|
22
|
+
initContext: {
|
|
23
|
+
userQuery: "Add concise comments to semanticAnalysisModule.ts and finalAnswerModule.ts describing phase boundaries",
|
|
24
|
+
},
|
|
25
|
+
analysis: {
|
|
26
|
+
intent: {
|
|
27
|
+
targetFiles: ["semanticAnalysisModule.ts", "finalAnswerModule.ts"],
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
const result = await scopeClassificationStep.run(context);
|
|
32
|
+
expect(result.scopeType).toBe("multi-file");
|
|
33
|
+
expect(context.analysis.scopeType).toBe("multi-file");
|
|
34
|
+
});
|
|
35
|
+
it("preserves a clear single-file request", async () => {
|
|
36
|
+
vi.mocked(generate).mockResolvedValue({
|
|
37
|
+
query: "",
|
|
38
|
+
data: '{"scopeType":"single-file"}',
|
|
39
|
+
});
|
|
40
|
+
const context = {
|
|
41
|
+
initContext: {
|
|
42
|
+
userQuery: "Add a short comment to finalAnswerModule.ts",
|
|
43
|
+
},
|
|
44
|
+
analysis: {
|
|
45
|
+
intent: {
|
|
46
|
+
targetFiles: ["finalAnswerModule.ts"],
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
const result = await scopeClassificationStep.run(context);
|
|
51
|
+
expect(result.scopeType).toBe("single-file");
|
|
52
|
+
});
|
|
53
|
+
it("preserves a repo-wide architecture query", async () => {
|
|
54
|
+
vi.mocked(generate).mockResolvedValue({
|
|
55
|
+
query: "",
|
|
56
|
+
data: '{"scopeType":"repo-wide"}',
|
|
57
|
+
});
|
|
58
|
+
const context = {
|
|
59
|
+
initContext: {
|
|
60
|
+
userQuery: "Summarize the architecture of the whole repo and identify weak coupling points",
|
|
61
|
+
},
|
|
62
|
+
analysis: {
|
|
63
|
+
intent: {
|
|
64
|
+
targetFiles: [],
|
|
65
|
+
},
|
|
66
|
+
},
|
|
67
|
+
};
|
|
68
|
+
const result = await scopeClassificationStep.run(context);
|
|
69
|
+
expect(result.scopeType).toBe("repo-wide");
|
|
70
|
+
});
|
|
71
|
+
it("normalizes multi-question requests away from single-file scope", async () => {
|
|
72
|
+
vi.mocked(generate).mockResolvedValue({
|
|
73
|
+
query: "",
|
|
74
|
+
data: '{"scopeType":"single-file"}',
|
|
75
|
+
});
|
|
76
|
+
const context = {
|
|
77
|
+
initContext: {
|
|
78
|
+
userQuery: "Where is search routed? How is verify triggered?",
|
|
79
|
+
},
|
|
80
|
+
analysis: {
|
|
81
|
+
intent: {
|
|
82
|
+
questions: [
|
|
83
|
+
{ id: "q1", order: 0, text: "Where is search routed?" },
|
|
84
|
+
{ id: "q2", order: 1, text: "How is verify triggered?" },
|
|
85
|
+
],
|
|
86
|
+
targetFiles: [],
|
|
87
|
+
},
|
|
88
|
+
},
|
|
89
|
+
};
|
|
90
|
+
const result = await scopeClassificationStep.run(context);
|
|
91
|
+
const options = vi.mocked(generate).mock.calls[0]?.[1];
|
|
92
|
+
expect(result.scopeType).toBe("multi-file");
|
|
93
|
+
expect(options?.inputContext?.orderedQuestions).toHaveLength(2);
|
|
94
|
+
});
|
|
95
|
+
it("keeps multi-question repo-wide asks at repo-wide scope", async () => {
|
|
96
|
+
vi.mocked(generate).mockResolvedValue({
|
|
97
|
+
query: "",
|
|
98
|
+
data: '{"scopeType":"single-file"}',
|
|
99
|
+
});
|
|
100
|
+
const context = {
|
|
101
|
+
initContext: {
|
|
102
|
+
userQuery: "Is error handling consistent across the codebase and how do I run the test suite?",
|
|
103
|
+
},
|
|
104
|
+
analysis: {
|
|
105
|
+
intent: {
|
|
106
|
+
questions: [
|
|
107
|
+
{ id: "q1", order: 0, text: "Is error handling consistent across the codebase?" },
|
|
108
|
+
{ id: "q2", order: 1, text: "How do I run the test suite?" },
|
|
109
|
+
],
|
|
110
|
+
targetFiles: [],
|
|
111
|
+
},
|
|
112
|
+
},
|
|
113
|
+
};
|
|
114
|
+
const result = await scopeClassificationStep.run(context);
|
|
115
|
+
expect(result.scopeType).toBe("repo-wide");
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
//# sourceMappingURL=scopeClassificationStep.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scopeClassificationStep.test.js","sourceRoot":"","sources":["../../../src/__tests__/agents/scopeClassificationStep.test.ts"],"names":[],"mappings":"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","sourcesContent":["// Verifies explicit two-file requests stay multi-file even if the model says single-file.\n// It mocks the scope classifier response and checks that deterministic normalization corrects the result.\nimport { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nvi.mock(\"../../lib/generate.js\", () => ({\n generate: vi.fn(),\n}));\n\nimport { generate } from \"../../lib/generate.js\";\nimport { scopeClassificationStep } from \"../../agents/scopeClassificationStep.js\";\n\n// Pass example: \"edit a.ts and b.ts\" resolves to multi-file, while \"edit a.ts\" stays single-file.\n// Fail example: two explicit files collapsing to single-file or repo-wide.\ndescribe(\"scopeClassificationStep\", () => {\n beforeEach(() => {\n vi.mocked(generate).mockReset();\n });\n\n // Guards the reported bug where explicit two-file edits were collapsed into single-file scope.\n it(\"normalizes obvious multi-file requests when the LLM returns single-file\", async () => {\n vi.mocked(generate).mockResolvedValue({\n query: \"\",\n data: '{\"scopeType\":\"single-file\"}',\n });\n\n const context = {\n initContext: {\n userQuery: \"Add concise comments to semanticAnalysisModule.ts and finalAnswerModule.ts describing phase boundaries\",\n },\n analysis: {\n intent: {\n targetFiles: [\"semanticAnalysisModule.ts\", \"finalAnswerModule.ts\"],\n },\n },\n } as any;\n\n const result = await scopeClassificationStep.run(context);\n\n expect(result.scopeType).toBe(\"multi-file\");\n expect(context.analysis.scopeType).toBe(\"multi-file\");\n });\n\n it(\"preserves a clear single-file request\", async () => {\n vi.mocked(generate).mockResolvedValue({\n query: \"\",\n data: '{\"scopeType\":\"single-file\"}',\n });\n\n const context = {\n initContext: {\n userQuery: \"Add a short comment to finalAnswerModule.ts\",\n },\n analysis: {\n intent: {\n targetFiles: [\"finalAnswerModule.ts\"],\n },\n },\n } as any;\n\n const result = await scopeClassificationStep.run(context);\n\n expect(result.scopeType).toBe(\"single-file\");\n });\n\n it(\"preserves a repo-wide architecture query\", async () => {\n vi.mocked(generate).mockResolvedValue({\n query: \"\",\n data: '{\"scopeType\":\"repo-wide\"}',\n });\n\n const context = {\n initContext: {\n userQuery: \"Summarize the architecture of the whole repo and identify weak coupling points\",\n },\n analysis: {\n intent: {\n targetFiles: [],\n },\n },\n } as any;\n\n const result = await scopeClassificationStep.run(context);\n\n expect(result.scopeType).toBe(\"repo-wide\");\n });\n\n it(\"normalizes multi-question requests away from single-file scope\", async () => {\n vi.mocked(generate).mockResolvedValue({\n query: \"\",\n data: '{\"scopeType\":\"single-file\"}',\n } as any);\n\n const context = {\n initContext: {\n userQuery: \"Where is search routed? How is verify triggered?\",\n },\n analysis: {\n intent: {\n questions: [\n { id: \"q1\", order: 0, text: \"Where is search routed?\" },\n { id: \"q2\", order: 1, text: \"How is verify triggered?\" },\n ],\n targetFiles: [],\n },\n },\n } as any;\n\n const result = await scopeClassificationStep.run(context);\n const options = vi.mocked(generate).mock.calls[0]?.[1] as { inputContext?: Record<string, unknown> } | undefined;\n\n expect(result.scopeType).toBe(\"multi-file\");\n expect(options?.inputContext?.orderedQuestions).toHaveLength(2);\n });\n\n it(\"keeps multi-question repo-wide asks at repo-wide scope\", async () => {\n vi.mocked(generate).mockResolvedValue({\n query: \"\",\n data: '{\"scopeType\":\"single-file\"}',\n } as any);\n\n const context = {\n initContext: {\n userQuery: \"Is error handling consistent across the codebase and how do I run the test suite?\",\n },\n analysis: {\n intent: {\n questions: [\n { id: \"q1\", order: 0, text: \"Is error handling consistent across the codebase?\" },\n { id: \"q2\", order: 1, text: \"How do I run the test suite?\" },\n ],\n targetFiles: [],\n },\n },\n } as any;\n\n const result = await scopeClassificationStep.run(context);\n\n expect(result.scopeType).toBe(\"repo-wide\");\n });\n});\n"]}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Covers the shared pre-search context packet.
|
|
3
|
+
*
|
|
4
|
+
* Why this file exists:
|
|
5
|
+
* - Stage 2 moves search facts behind one derived packet
|
|
6
|
+
* - later lane work should consume this packet instead of raw task state
|
|
7
|
+
* - direct tests keep this structural refactor from quietly changing routing inputs
|
|
8
|
+
*/
|
|
9
|
+
import fs from "fs";
|
|
10
|
+
import os from "os";
|
|
11
|
+
import path from "path";
|
|
12
|
+
import { afterEach, describe, expect, it } from "vitest";
|
|
13
|
+
import { createAgentMemory } from "../../agents/agentMemory.js";
|
|
14
|
+
import { buildSearchContext } from "../../agent/search/searchContext.js";
|
|
15
|
+
const tempDirs = [];
|
|
16
|
+
afterEach(() => {
|
|
17
|
+
while (tempDirs.length > 0) {
|
|
18
|
+
const dir = tempDirs.pop();
|
|
19
|
+
if (dir) {
|
|
20
|
+
fs.rmSync(dir, { recursive: true, force: true });
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
describe("buildSearchContext", () => {
|
|
25
|
+
it("marks explicit file paths as targeted", () => {
|
|
26
|
+
const repoRoot = fs.mkdtempSync(path.join(os.tmpdir(), "scai-search-context-file-"));
|
|
27
|
+
tempDirs.push(repoRoot);
|
|
28
|
+
const targetFile = path.join(repoRoot, "cli", "src", "sample.ts");
|
|
29
|
+
fs.mkdirSync(path.dirname(targetFile), { recursive: true });
|
|
30
|
+
fs.writeFileSync(targetFile, "export const sample = true;\n", "utf8");
|
|
31
|
+
const memory = createAgentMemory(targetFile, repoRoot, repoRoot);
|
|
32
|
+
memory.task.queryScope = "targeted";
|
|
33
|
+
memory.task.explicitTargets = [targetFile];
|
|
34
|
+
const context = buildSearchContext(memory, targetFile);
|
|
35
|
+
expect(context.scopeKind).toBe("targeted");
|
|
36
|
+
expect(context.resolvedTargets).toEqual(expect.arrayContaining([
|
|
37
|
+
expect.objectContaining({
|
|
38
|
+
kind: "resolved-file",
|
|
39
|
+
filePath: targetFile,
|
|
40
|
+
}),
|
|
41
|
+
]));
|
|
42
|
+
});
|
|
43
|
+
it("marks explicit folder paths as targeted with resolved folder targets", () => {
|
|
44
|
+
const repoRoot = fs.mkdtempSync(path.join(os.tmpdir(), "scai-search-context-folder-"));
|
|
45
|
+
tempDirs.push(repoRoot);
|
|
46
|
+
const guardsDir = path.join(repoRoot, "cli", "src", "agents", "guards");
|
|
47
|
+
fs.mkdirSync(guardsDir, { recursive: true });
|
|
48
|
+
fs.writeFileSync(path.join(guardsDir, "guardState.ts"), "export const guard = true;\n", "utf8");
|
|
49
|
+
const memory = createAgentMemory(guardsDir, repoRoot, repoRoot);
|
|
50
|
+
memory.task.queryScope = "targeted";
|
|
51
|
+
memory.task.explicitTargets = [guardsDir];
|
|
52
|
+
const context = buildSearchContext(memory, guardsDir);
|
|
53
|
+
expect(context.scopeKind).toBe("targeted");
|
|
54
|
+
expect(context.resolvedTargets).toEqual(expect.arrayContaining([
|
|
55
|
+
expect.objectContaining({
|
|
56
|
+
kind: "resolved-folder",
|
|
57
|
+
folderPath: guardsDir,
|
|
58
|
+
}),
|
|
59
|
+
]));
|
|
60
|
+
});
|
|
61
|
+
it("marks basename folder asks as folder-shaped", () => {
|
|
62
|
+
const memory = createAgentMemory("check guards", "/repo", "/repo");
|
|
63
|
+
memory.task.queryScope = "general";
|
|
64
|
+
memory.task.explicitTargets = ["guards"];
|
|
65
|
+
const context = buildSearchContext(memory, "check guards");
|
|
66
|
+
expect(context.folderShaped).toBe(true);
|
|
67
|
+
});
|
|
68
|
+
it("consumes the stored scope directly without folder upgrades", () => {
|
|
69
|
+
const memory = createAgentMemory("check guards", "/repo", "/repo");
|
|
70
|
+
memory.task.queryScope = "general";
|
|
71
|
+
memory.task.explicitTargets = ["guards"];
|
|
72
|
+
const context = buildSearchContext(memory, "check guards");
|
|
73
|
+
expect(context.scopeKind).toBe("general");
|
|
74
|
+
expect(context.folderShaped).toBe(true);
|
|
75
|
+
});
|
|
76
|
+
it("extracts quoted fragments from the query", () => {
|
|
77
|
+
const memory = createAgentMemory('Find "currentQuestionId = task.currentQuestionId"', "/repo", "/repo");
|
|
78
|
+
memory.task.queryScope = "targeted";
|
|
79
|
+
const context = buildSearchContext(memory, 'Find "currentQuestionId = task.currentQuestionId"');
|
|
80
|
+
expect(context.quotedFragments).toEqual(["currentQuestionId = task.currentQuestionId"]);
|
|
81
|
+
});
|
|
82
|
+
it("marks regex-like queries", () => {
|
|
83
|
+
const memory = createAgentMemory("runSearch|semanticSearchFiles", "/repo", "/repo");
|
|
84
|
+
memory.task.queryScope = "general";
|
|
85
|
+
const context = buildSearchContext(memory, "runSearch|semanticSearchFiles", {
|
|
86
|
+
allowRegexLane: true,
|
|
87
|
+
});
|
|
88
|
+
expect(context.regexLike).toBe(true);
|
|
89
|
+
});
|
|
90
|
+
it("marks broad repo asks as broad-repo scope", () => {
|
|
91
|
+
const memory = createAgentMemory("Explain the repo structure", "/repo", "/repo");
|
|
92
|
+
memory.task.queryScope = "broad-repo";
|
|
93
|
+
const context = buildSearchContext(memory, "Explain the repo structure");
|
|
94
|
+
expect(context.scopeKind).toBe("broad-repo");
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
//# sourceMappingURL=searchContext.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"searchContext.test.js","sourceRoot":"","sources":["../../../src/__tests__/agents/searchContext.test.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Covers the shared pre-search context packet.\n *\n * Why this file exists:\n * - Stage 2 moves search facts behind one derived packet\n * - later lane work should consume this packet instead of raw task state\n * - direct tests keep this structural refactor from quietly changing routing inputs\n */\nimport fs from \"fs\";\nimport os from \"os\";\nimport path from \"path\";\nimport { afterEach, describe, expect, it } from \"vitest\";\nimport { createAgentMemory } from \"../../agents/agentMemory.js\";\nimport { buildSearchContext } from \"../../agent/search/searchContext.js\";\n\nconst tempDirs: string[] = [];\n\nafterEach(() => {\n while (tempDirs.length > 0) {\n const dir = tempDirs.pop();\n if (dir) {\n fs.rmSync(dir, { recursive: true, force: true });\n }\n }\n});\n\ndescribe(\"buildSearchContext\", () => {\n it(\"marks explicit file paths as targeted\", () => {\n const repoRoot = fs.mkdtempSync(path.join(os.tmpdir(), \"scai-search-context-file-\"));\n tempDirs.push(repoRoot);\n const targetFile = path.join(repoRoot, \"cli\", \"src\", \"sample.ts\");\n fs.mkdirSync(path.dirname(targetFile), { recursive: true });\n fs.writeFileSync(targetFile, \"export const sample = true;\\n\", \"utf8\");\n const memory = createAgentMemory(targetFile, repoRoot, repoRoot);\n memory.task.queryScope = \"targeted\";\n memory.task.explicitTargets = [targetFile];\n\n const context = buildSearchContext(memory, targetFile);\n\n expect(context.scopeKind).toBe(\"targeted\");\n expect(context.resolvedTargets).toEqual(expect.arrayContaining([\n expect.objectContaining({\n kind: \"resolved-file\",\n filePath: targetFile,\n }),\n ]));\n });\n\n it(\"marks explicit folder paths as targeted with resolved folder targets\", () => {\n const repoRoot = fs.mkdtempSync(path.join(os.tmpdir(), \"scai-search-context-folder-\"));\n tempDirs.push(repoRoot);\n const guardsDir = path.join(repoRoot, \"cli\", \"src\", \"agents\", \"guards\");\n fs.mkdirSync(guardsDir, { recursive: true });\n fs.writeFileSync(path.join(guardsDir, \"guardState.ts\"), \"export const guard = true;\\n\", \"utf8\");\n const memory = createAgentMemory(guardsDir, repoRoot, repoRoot);\n memory.task.queryScope = \"targeted\";\n memory.task.explicitTargets = [guardsDir];\n\n const context = buildSearchContext(memory, guardsDir);\n\n expect(context.scopeKind).toBe(\"targeted\");\n expect(context.resolvedTargets).toEqual(expect.arrayContaining([\n expect.objectContaining({\n kind: \"resolved-folder\",\n folderPath: guardsDir,\n }),\n ]));\n });\n\n it(\"marks basename folder asks as folder-shaped\", () => {\n const memory = createAgentMemory(\"check guards\", \"/repo\", \"/repo\");\n memory.task.queryScope = \"general\";\n memory.task.explicitTargets = [\"guards\"];\n\n const context = buildSearchContext(memory, \"check guards\");\n\n expect(context.folderShaped).toBe(true);\n });\n\n it(\"consumes the stored scope directly without folder upgrades\", () => {\n const memory = createAgentMemory(\"check guards\", \"/repo\", \"/repo\");\n memory.task.queryScope = \"general\";\n memory.task.explicitTargets = [\"guards\"];\n\n const context = buildSearchContext(memory, \"check guards\");\n\n expect(context.scopeKind).toBe(\"general\");\n expect(context.folderShaped).toBe(true);\n });\n\n it(\"extracts quoted fragments from the query\", () => {\n const memory = createAgentMemory('Find \"currentQuestionId = task.currentQuestionId\"', \"/repo\", \"/repo\");\n memory.task.queryScope = \"targeted\";\n\n const context = buildSearchContext(memory, 'Find \"currentQuestionId = task.currentQuestionId\"');\n\n expect(context.quotedFragments).toEqual([\"currentQuestionId = task.currentQuestionId\"]);\n });\n\n it(\"marks regex-like queries\", () => {\n const memory = createAgentMemory(\"runSearch|semanticSearchFiles\", \"/repo\", \"/repo\");\n memory.task.queryScope = \"general\";\n\n const context = buildSearchContext(memory, \"runSearch|semanticSearchFiles\", {\n allowRegexLane: true,\n });\n\n expect(context.regexLike).toBe(true);\n });\n\n it(\"marks broad repo asks as broad-repo scope\", () => {\n const memory = createAgentMemory(\"Explain the repo structure\", \"/repo\", \"/repo\");\n memory.task.queryScope = \"broad-repo\";\n\n const context = buildSearchContext(memory, \"Explain the repo structure\");\n\n expect(context.scopeKind).toBe(\"broad-repo\");\n });\n});\n"]}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
// Verifies selected execution files become working files while candidates remain untouched.
|
|
2
|
+
// It creates real temp files so the module reads source content through the normal file path flow.
|
|
3
|
+
import fs from "fs";
|
|
4
|
+
import os from "os";
|
|
5
|
+
import path from "path";
|
|
6
|
+
import { afterEach, describe, expect, it } from "vitest";
|
|
7
|
+
import { selectRelevantSourcesStep } from "../../agents/selectRelevantSourcesStep.js";
|
|
8
|
+
const tempDirs = [];
|
|
9
|
+
afterEach(() => {
|
|
10
|
+
for (const dir of tempDirs.splice(0)) {
|
|
11
|
+
fs.rmSync(dir, { recursive: true, force: true });
|
|
12
|
+
}
|
|
13
|
+
});
|
|
14
|
+
// Pass example: execution-required files become working files and candidate-only files stay candidates.
|
|
15
|
+
// Fail example: candidate files being promoted into working files without entering the execution lane.
|
|
16
|
+
describe("selectRelevantSourcesStep", () => {
|
|
17
|
+
it("mirrors execution files into working files without promoting candidates", async () => {
|
|
18
|
+
const dir = fs.mkdtempSync(path.join(os.tmpdir(), "scai-select-"));
|
|
19
|
+
tempDirs.push(dir);
|
|
20
|
+
const selectedFile = path.join(dir, "selected.ts");
|
|
21
|
+
const candidateFile = path.join(dir, "candidate.ts");
|
|
22
|
+
fs.writeFileSync(selectedFile, "export const selected = true;\n", "utf-8");
|
|
23
|
+
fs.writeFileSync(candidateFile, "export const candidate = true;\n", "utf-8");
|
|
24
|
+
const context = {
|
|
25
|
+
analysis: {
|
|
26
|
+
focus: {
|
|
27
|
+
selectedFiles: [selectedFile],
|
|
28
|
+
candidateFiles: [candidateFile],
|
|
29
|
+
rationale: "preselected",
|
|
30
|
+
},
|
|
31
|
+
executionPolicy: {
|
|
32
|
+
phaseAllowed: { transform: true },
|
|
33
|
+
routeAllowed: { transform: true },
|
|
34
|
+
executionRequired: [selectedFile],
|
|
35
|
+
executionLock: null,
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
const out = await selectRelevantSourcesStep.run({ query: "q", context });
|
|
40
|
+
const data = out.data;
|
|
41
|
+
expect(context.workingFiles.map((file) => file.path)).toEqual([selectedFile]);
|
|
42
|
+
expect(data.selectedFiles).toEqual([selectedFile]);
|
|
43
|
+
expect(data.candidateFiles).toEqual([candidateFile]);
|
|
44
|
+
});
|
|
45
|
+
it("keeps verify-focused selected files when transform is not allowed", async () => {
|
|
46
|
+
const dir = fs.mkdtempSync(path.join(os.tmpdir(), "scai-select-"));
|
|
47
|
+
tempDirs.push(dir);
|
|
48
|
+
const verifyFile = path.join(dir, "mainAgentVerify.ts");
|
|
49
|
+
const executionFile = path.join(dir, "analysisPlanGenStep.ts");
|
|
50
|
+
fs.writeFileSync(verifyFile, "export function getGroundingWaveBudget() { return 4; }\n", "utf-8");
|
|
51
|
+
fs.writeFileSync(executionFile, "export const analysisPlanGenStep = {};\n", "utf-8");
|
|
52
|
+
const context = {
|
|
53
|
+
analysis: {
|
|
54
|
+
focus: {
|
|
55
|
+
selectedFiles: [verifyFile],
|
|
56
|
+
candidateFiles: [],
|
|
57
|
+
rationale: "verify-focused",
|
|
58
|
+
},
|
|
59
|
+
executionPolicy: {
|
|
60
|
+
phaseAllowed: { transform: false },
|
|
61
|
+
routeAllowed: { transform: false },
|
|
62
|
+
executionRequired: [executionFile],
|
|
63
|
+
executionLock: null,
|
|
64
|
+
},
|
|
65
|
+
},
|
|
66
|
+
};
|
|
67
|
+
const out = await selectRelevantSourcesStep.run({ query: "q", context });
|
|
68
|
+
const data = out.data;
|
|
69
|
+
expect(context.workingFiles.map((file) => file.path)).toEqual([verifyFile]);
|
|
70
|
+
expect(data.selectedFiles).toEqual([verifyFile]);
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
//# sourceMappingURL=selectRelevantSourcesStep.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selectRelevantSourcesStep.test.js","sourceRoot":"","sources":["../../../src/__tests__/agents/selectRelevantSourcesStep.test.ts"],"names":[],"mappings":"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","sourcesContent":["// Verifies selected execution files become working files while candidates remain untouched.\n// It creates real temp files so the module reads source content through the normal file path flow.\nimport fs from \"fs\";\nimport os from \"os\";\nimport path from \"path\";\nimport { afterEach, describe, expect, it } from \"vitest\";\nimport { selectRelevantSourcesStep } from \"../../agents/selectRelevantSourcesStep.js\";\n\nconst tempDirs: string[] = [];\n\nafterEach(() => {\n for (const dir of tempDirs.splice(0)) {\n fs.rmSync(dir, { recursive: true, force: true });\n }\n});\n\n// Pass example: execution-required files become working files and candidate-only files stay candidates.\n// Fail example: candidate files being promoted into working files without entering the execution lane.\ndescribe(\"selectRelevantSourcesStep\", () => {\n it(\"mirrors execution files into working files without promoting candidates\", async () => {\n const dir = fs.mkdtempSync(path.join(os.tmpdir(), \"scai-select-\"));\n tempDirs.push(dir);\n\n const selectedFile = path.join(dir, \"selected.ts\");\n const candidateFile = path.join(dir, \"candidate.ts\");\n fs.writeFileSync(selectedFile, \"export const selected = true;\\n\", \"utf-8\");\n fs.writeFileSync(candidateFile, \"export const candidate = true;\\n\", \"utf-8\");\n\n const context = {\n analysis: {\n focus: {\n selectedFiles: [selectedFile],\n candidateFiles: [candidateFile],\n rationale: \"preselected\",\n },\n executionPolicy: {\n phaseAllowed: { transform: true },\n routeAllowed: { transform: true },\n executionRequired: [selectedFile],\n executionLock: null,\n },\n },\n } as any;\n\n const out = await selectRelevantSourcesStep.run({ query: \"q\", context });\n const data = out.data as { selectedFiles: string[]; candidateFiles: string[] };\n\n expect(context.workingFiles.map((file: { path: string }) => file.path)).toEqual([selectedFile]);\n expect(data.selectedFiles).toEqual([selectedFile]);\n expect(data.candidateFiles).toEqual([candidateFile]);\n });\n\n it(\"keeps verify-focused selected files when transform is not allowed\", async () => {\n const dir = fs.mkdtempSync(path.join(os.tmpdir(), \"scai-select-\"));\n tempDirs.push(dir);\n\n const verifyFile = path.join(dir, \"mainAgentVerify.ts\");\n const executionFile = path.join(dir, \"analysisPlanGenStep.ts\");\n fs.writeFileSync(verifyFile, \"export function getGroundingWaveBudget() { return 4; }\\n\", \"utf-8\");\n fs.writeFileSync(executionFile, \"export const analysisPlanGenStep = {};\\n\", \"utf-8\");\n\n const context = {\n analysis: {\n focus: {\n selectedFiles: [verifyFile],\n candidateFiles: [],\n rationale: \"verify-focused\",\n },\n executionPolicy: {\n phaseAllowed: { transform: false },\n routeAllowed: { transform: false },\n executionRequired: [executionFile],\n executionLock: null,\n },\n },\n } as any;\n\n const out = await selectRelevantSourcesStep.run({ query: \"q\", context });\n const data = out.data as { selectedFiles: string[] };\n\n expect(context.workingFiles.map((file: { path: string }) => file.path)).toEqual([verifyFile]);\n expect(data.selectedFiles).toEqual([verifyFile]);\n });\n});\n"]}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Covers shared structured output parsing for new-agent model calls.
|
|
3
|
+
*
|
|
4
|
+
* Why this file exists:
|
|
5
|
+
* - stage 1 moves JSON parsing under one owned module
|
|
6
|
+
* - fenced JSON and fallback parsing are easy to regress in small refactors
|
|
7
|
+
* - direct tests make it safe to delete the old prompt parser entrypoint
|
|
8
|
+
*/
|
|
9
|
+
import { describe, expect, it } from "vitest";
|
|
10
|
+
import { parseStructuredJson, parseStructuredJsonResult } from "../../agent/structuredOutput/index.js";
|
|
11
|
+
describe("structured output parsing", () => {
|
|
12
|
+
it("parses plain JSON", () => {
|
|
13
|
+
expect(parseStructuredJson('{"ok":true,"count":2}', { fallback: { ok: false, count: 0 } })).toEqual({
|
|
14
|
+
ok: true,
|
|
15
|
+
count: 2,
|
|
16
|
+
});
|
|
17
|
+
});
|
|
18
|
+
it("parses fenced JSON", () => {
|
|
19
|
+
expect(parseStructuredJson('```json\n{"status":"valid"}\n```', { fallback: { status: "invalid" } })).toEqual({
|
|
20
|
+
status: "valid",
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
it("returns the fallback on bad JSON", () => {
|
|
24
|
+
expect(parseStructuredJson("not json", { fallback: { status: "fallback" } })).toEqual({
|
|
25
|
+
status: "fallback",
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
it("returns parse metadata for fenced JSON", () => {
|
|
29
|
+
expect(parseStructuredJsonResult('```json\n{"status":"valid"}\n```', { fallback: { status: "invalid" } })).toEqual({
|
|
30
|
+
value: { status: "valid" },
|
|
31
|
+
meta: {
|
|
32
|
+
usedFallback: false,
|
|
33
|
+
candidateSource: "fenced",
|
|
34
|
+
},
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
it("returns parse metadata when fallback is used", () => {
|
|
38
|
+
const result = parseStructuredJsonResult("not json", { fallback: { status: "fallback" } });
|
|
39
|
+
expect(result.value).toEqual({ status: "fallback" });
|
|
40
|
+
expect(result.meta.usedFallback).toBe(true);
|
|
41
|
+
expect(result.meta.candidateSource).toBe("plain");
|
|
42
|
+
expect(result.meta.parseError).toContain("Unexpected token");
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
//# sourceMappingURL=structuredOutput.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"structuredOutput.test.js","sourceRoot":"","sources":["../../../src/__tests__/agents/structuredOutput.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,MAAM,uCAAuC,CAAC;AAEvG,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;IACzC,EAAE,CAAC,mBAAmB,EAAE,GAAG,EAAE;QAC3B,MAAM,CAAC,mBAAmB,CAAC,uBAAuB,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;YAClG,EAAE,EAAE,IAAI;YACR,KAAK,EAAE,CAAC;SACT,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAC5B,MAAM,CAAC,mBAAmB,CAAC,kCAAkC,EAAE,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;YAC3G,MAAM,EAAE,OAAO;SAChB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,CAAC,mBAAmB,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;YACpF,MAAM,EAAE,UAAU;SACnB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,CAAC,yBAAyB,CAAC,kCAAkC,EAAE,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;YACjH,KAAK,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE;YAC1B,IAAI,EAAE;gBACJ,YAAY,EAAE,KAAK;gBACnB,eAAe,EAAE,QAAQ;aAC1B;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,MAAM,GAAG,yBAAyB,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;QAC3F,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;QACrD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAClD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["/**\n * Covers shared structured output parsing for new-agent model calls.\n *\n * Why this file exists:\n * - stage 1 moves JSON parsing under one owned module\n * - fenced JSON and fallback parsing are easy to regress in small refactors\n * - direct tests make it safe to delete the old prompt parser entrypoint\n */\nimport { describe, expect, it } from \"vitest\";\nimport { parseStructuredJson, parseStructuredJsonResult } from \"../../agent/structuredOutput/index.js\";\n\ndescribe(\"structured output parsing\", () => {\n it(\"parses plain JSON\", () => {\n expect(parseStructuredJson('{\"ok\":true,\"count\":2}', { fallback: { ok: false, count: 0 } })).toEqual({\n ok: true,\n count: 2,\n });\n });\n\n it(\"parses fenced JSON\", () => {\n expect(parseStructuredJson('```json\\n{\"status\":\"valid\"}\\n```', { fallback: { status: \"invalid\" } })).toEqual({\n status: \"valid\",\n });\n });\n\n it(\"returns the fallback on bad JSON\", () => {\n expect(parseStructuredJson(\"not json\", { fallback: { status: \"fallback\" } })).toEqual({\n status: \"fallback\",\n });\n });\n\n it(\"returns parse metadata for fenced JSON\", () => {\n expect(parseStructuredJsonResult('```json\\n{\"status\":\"valid\"}\\n```', { fallback: { status: \"invalid\" } })).toEqual({\n value: { status: \"valid\" },\n meta: {\n usedFallback: false,\n candidateSource: \"fenced\",\n },\n });\n });\n\n it(\"returns parse metadata when fallback is used\", () => {\n const result = parseStructuredJsonResult(\"not json\", { fallback: { status: \"fallback\" } });\n expect(result.value).toEqual({ status: \"fallback\" });\n expect(result.meta.usedFallback).toBe(true);\n expect(result.meta.candidateSource).toBe(\"plain\");\n expect(result.meta.parseError).toContain(\"Unexpected token\");\n });\n});\n"]}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
// Verifies transform planning falls back to semantic analysis when the planner reply is not valid JSON.
|
|
2
|
+
// It covers the loop where shouldModify was true but transformPlanGen returned no steps and nothing was written.
|
|
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 { transformPlanGenStep } from "../../agents/transformPlanGenStep.js";
|
|
9
|
+
describe("transformPlanGenStep fallback", () => {
|
|
10
|
+
beforeEach(() => {
|
|
11
|
+
vi.mocked(generate).mockReset();
|
|
12
|
+
});
|
|
13
|
+
it("builds a codeTransform fallback step when the planner reply is not parseable", async () => {
|
|
14
|
+
vi.mocked(generate).mockResolvedValue({
|
|
15
|
+
query: "",
|
|
16
|
+
data: "I would add a small hello world comment near the top of the file.",
|
|
17
|
+
});
|
|
18
|
+
const context = {
|
|
19
|
+
task: {
|
|
20
|
+
currentStep: {
|
|
21
|
+
filePath: "/repo/actionRegistry.ts",
|
|
22
|
+
},
|
|
23
|
+
},
|
|
24
|
+
analysis: {
|
|
25
|
+
intent: {
|
|
26
|
+
normalizedQuery: "add a hello world statement to the actionRegistry file",
|
|
27
|
+
intentCategory: "code_change",
|
|
28
|
+
},
|
|
29
|
+
fileAnalysis: {
|
|
30
|
+
"/repo/actionRegistry.ts": {
|
|
31
|
+
action: {
|
|
32
|
+
shouldModify: true,
|
|
33
|
+
},
|
|
34
|
+
proposedChanges: {
|
|
35
|
+
summary: "Add a hello world comment near the imports.",
|
|
36
|
+
rationale: "Keep the change small and non-functional.",
|
|
37
|
+
},
|
|
38
|
+
excerpts: [],
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
routingDecision: {
|
|
42
|
+
confidence: 0.91,
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
execution: {},
|
|
46
|
+
};
|
|
47
|
+
await transformPlanGenStep.run(context);
|
|
48
|
+
const steps = context.analysis.planSuggestion?.plan?.steps ?? [];
|
|
49
|
+
expect(steps).toHaveLength(1);
|
|
50
|
+
expect(steps[0]).toMatchObject({
|
|
51
|
+
action: "codeTransform",
|
|
52
|
+
actionId: "codeTransform",
|
|
53
|
+
targetFile: "/repo/actionRegistry.ts",
|
|
54
|
+
groups: ["transform"],
|
|
55
|
+
});
|
|
56
|
+
expect(steps[0].description).toContain("hello world");
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
//# sourceMappingURL=transformPlanGenStep.fallback.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transformPlanGenStep.fallback.test.js","sourceRoot":"","sources":["../../../src/__tests__/agents/transformPlanGenStep.fallback.test.ts"],"names":[],"mappings":"AAAA,wGAAwG;AACxG,iHAAiH;AACjH,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9D,EAAE,CAAC,IAAI,CAAC,uBAAuB,EAAE,GAAG,EAAE,CAAC,CAAC;IACpC,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE;CACpB,CAAC,CAAC,CAAC;AAEJ,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AAE5E,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;IAC3C,UAAU,CAAC,GAAG,EAAE;QACZ,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,EAAE,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8EAA8E,EAAE,KAAK,IAAI,EAAE;QAC1F,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,iBAAiB,CAAC;YAClC,KAAK,EAAE,EAAE;YACT,IAAI,EAAE,mEAAmE;SAC5E,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG;YACZ,IAAI,EAAE;gBACF,WAAW,EAAE;oBACT,QAAQ,EAAE,yBAAyB;iBACtC;aACJ;YACD,QAAQ,EAAE;gBACN,MAAM,EAAE;oBACJ,eAAe,EAAE,wDAAwD;oBACzE,cAAc,EAAE,aAAa;iBAChC;gBACD,YAAY,EAAE;oBACV,yBAAyB,EAAE;wBACvB,MAAM,EAAE;4BACJ,YAAY,EAAE,IAAI;yBACrB;wBACD,eAAe,EAAE;4BACb,OAAO,EAAE,6CAA6C;4BACtD,SAAS,EAAE,2CAA2C;yBACzD;wBACD,QAAQ,EAAE,EAAE;qBACf;iBACJ;gBACD,eAAe,EAAE;oBACb,UAAU,EAAE,IAAI;iBACnB;aACJ;YACD,SAAS,EAAE,EAAE;SACT,CAAC;QAET,MAAM,oBAAoB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAExC,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,CAAC,cAAc,EAAE,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;QACjE,MAAM,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;YAC3B,MAAM,EAAE,eAAe;YACvB,QAAQ,EAAE,eAAe;YACzB,UAAU,EAAE,yBAAyB;YACrC,MAAM,EAAE,CAAC,WAAW,CAAC;SACxB,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC","sourcesContent":["// Verifies transform planning falls back to semantic analysis when the planner reply is not valid JSON.\n// It covers the loop where shouldModify was true but transformPlanGen returned no steps and nothing was written.\nimport { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nvi.mock(\"../../lib/generate.js\", () => ({\n generate: vi.fn(),\n}));\n\nimport { generate } from \"../../lib/generate.js\";\nimport { transformPlanGenStep } from \"../../agents/transformPlanGenStep.js\";\n\ndescribe(\"transformPlanGenStep fallback\", () => {\n beforeEach(() => {\n vi.mocked(generate).mockReset();\n });\n\n it(\"builds a codeTransform fallback step when the planner reply is not parseable\", async () => {\n vi.mocked(generate).mockResolvedValue({\n query: \"\",\n data: \"I would add a small hello world comment near the top of the file.\",\n });\n\n const context = {\n task: {\n currentStep: {\n filePath: \"/repo/actionRegistry.ts\",\n },\n },\n analysis: {\n intent: {\n normalizedQuery: \"add a hello world statement to the actionRegistry file\",\n intentCategory: \"code_change\",\n },\n fileAnalysis: {\n \"/repo/actionRegistry.ts\": {\n action: {\n shouldModify: true,\n },\n proposedChanges: {\n summary: \"Add a hello world comment near the imports.\",\n rationale: \"Keep the change small and non-functional.\",\n },\n excerpts: [],\n },\n },\n routingDecision: {\n confidence: 0.91,\n },\n },\n execution: {},\n } as any;\n\n await transformPlanGenStep.run(context);\n\n const steps = context.analysis.planSuggestion?.plan?.steps ?? [];\n expect(steps).toHaveLength(1);\n expect(steps[0]).toMatchObject({\n action: \"codeTransform\",\n actionId: \"codeTransform\",\n targetFile: \"/repo/actionRegistry.ts\",\n groups: [\"transform\"],\n });\n expect(steps[0].description).toContain(\"hello world\");\n });\n});\n"]}
|