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,227 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Covers understand-owned coarse scope validation for the new agent.
|
|
3
|
+
*
|
|
4
|
+
* Why this file exists:
|
|
5
|
+
* - the understand model should return coarse scope once
|
|
6
|
+
* - runtime should only validate that scope, not classify it from scratch
|
|
7
|
+
* - direct tests keep scope validation changes separate from later lane behavior
|
|
8
|
+
*/
|
|
9
|
+
import { describe, expect, it } from "vitest";
|
|
10
|
+
import { normalizeUnderstandResult } from "../../agent/runtime/understand.js";
|
|
11
|
+
describe("normalizeUnderstandResult queryScope validation", () => {
|
|
12
|
+
it("keeps a valid model-provided scope", () => {
|
|
13
|
+
const result = normalizeUnderstandResult("Explain cli/src/agent/search/index.ts", {
|
|
14
|
+
normalizedQuery: "Explain cli/src/agent/search/index.ts",
|
|
15
|
+
queryScope: "broad-repo",
|
|
16
|
+
explicitTargets: ["cli/src/agent/search/index.ts"],
|
|
17
|
+
constraints: [],
|
|
18
|
+
primaryIntent: "Explain one file.",
|
|
19
|
+
alternativeIntents: [],
|
|
20
|
+
ambiguityFlags: [],
|
|
21
|
+
});
|
|
22
|
+
expect(result.queryScope).toBe("broad-repo");
|
|
23
|
+
});
|
|
24
|
+
it("falls back safely on an invalid scope", () => {
|
|
25
|
+
const result = normalizeUnderstandResult("what is recursion", {
|
|
26
|
+
normalizedQuery: "what is recursion",
|
|
27
|
+
queryScope: "wide",
|
|
28
|
+
explicitTargets: [],
|
|
29
|
+
constraints: [],
|
|
30
|
+
primaryIntent: "Answer a general knowledge question.",
|
|
31
|
+
alternativeIntents: [],
|
|
32
|
+
ambiguityFlags: [],
|
|
33
|
+
});
|
|
34
|
+
expect(result.queryScope).toBe("general");
|
|
35
|
+
});
|
|
36
|
+
it("downgrades a generic tool-usage miss from targeted to general", () => {
|
|
37
|
+
const result = normalizeUnderstandResult("how do I use git bash to save a diff?", {
|
|
38
|
+
normalizedQuery: "how do I use git bash to save a diff",
|
|
39
|
+
queryScope: "targeted",
|
|
40
|
+
explicitTargets: [],
|
|
41
|
+
constraints: [],
|
|
42
|
+
primaryIntent: "Learn how to save a git diff output to a file using Git Bash.",
|
|
43
|
+
alternativeIntents: [],
|
|
44
|
+
ambiguityFlags: [],
|
|
45
|
+
});
|
|
46
|
+
expect(result.queryScope).toBe("general");
|
|
47
|
+
});
|
|
48
|
+
it("keeps a pure concept question general even when the model over-targets it", () => {
|
|
49
|
+
const result = normalizeUnderstandResult("what is recursion?", {
|
|
50
|
+
normalizedQuery: "what is recursion",
|
|
51
|
+
queryScope: "targeted",
|
|
52
|
+
explicitTargets: [],
|
|
53
|
+
constraints: [],
|
|
54
|
+
primaryIntent: "Answer a general programming concept question.",
|
|
55
|
+
alternativeIntents: [],
|
|
56
|
+
ambiguityFlags: [],
|
|
57
|
+
});
|
|
58
|
+
expect(result.queryScope).toBe("general");
|
|
59
|
+
});
|
|
60
|
+
it("keeps repo wording out of the general fallback", () => {
|
|
61
|
+
const result = normalizeUnderstandResult("how does this repo run tests?", {
|
|
62
|
+
normalizedQuery: "how does this repo run tests",
|
|
63
|
+
queryScope: "broad-repo",
|
|
64
|
+
explicitTargets: [],
|
|
65
|
+
constraints: [],
|
|
66
|
+
primaryIntent: "Explain how this repo runs tests.",
|
|
67
|
+
alternativeIntents: [],
|
|
68
|
+
ambiguityFlags: [],
|
|
69
|
+
});
|
|
70
|
+
expect(result.queryScope).not.toBe("general");
|
|
71
|
+
});
|
|
72
|
+
it("keeps explicit file questions targeted", () => {
|
|
73
|
+
const result = normalizeUnderstandResult("explain cli/src/agent/index.ts", {
|
|
74
|
+
normalizedQuery: "explain cli/src/agent/index.ts",
|
|
75
|
+
queryScope: "general",
|
|
76
|
+
explicitTargets: ["cli/src/agent/index.ts"],
|
|
77
|
+
constraints: [],
|
|
78
|
+
primaryIntent: "Explain the file.",
|
|
79
|
+
alternativeIntents: [],
|
|
80
|
+
ambiguityFlags: [],
|
|
81
|
+
});
|
|
82
|
+
expect(result.queryScope).toBe("targeted");
|
|
83
|
+
});
|
|
84
|
+
it("upgrades general plus one explicit target to targeted", () => {
|
|
85
|
+
const result = normalizeUnderstandResult("Explain cli/src/agent/search/index.ts", {
|
|
86
|
+
normalizedQuery: "Explain cli/src/agent/search/index.ts",
|
|
87
|
+
queryScope: "general",
|
|
88
|
+
explicitTargets: ["cli/src/agent/search/index.ts"],
|
|
89
|
+
constraints: [],
|
|
90
|
+
primaryIntent: "Explain one file.",
|
|
91
|
+
alternativeIntents: [],
|
|
92
|
+
ambiguityFlags: [],
|
|
93
|
+
});
|
|
94
|
+
expect(result.queryScope).toBe("targeted");
|
|
95
|
+
});
|
|
96
|
+
it("upgrades general plus many explicit targets to multi-file", () => {
|
|
97
|
+
const result = normalizeUnderstandResult("Explain how agentMemory and agentLoop divide responsibilities", {
|
|
98
|
+
normalizedQuery: "Explain how agentMemory and agentLoop divide responsibilities",
|
|
99
|
+
queryScope: "general",
|
|
100
|
+
explicitTargets: ["agentMemory.ts", "agentLoop.ts"],
|
|
101
|
+
constraints: [],
|
|
102
|
+
primaryIntent: "Explain how agentMemory and agentLoop divide responsibilities.",
|
|
103
|
+
alternativeIntents: [],
|
|
104
|
+
ambiguityFlags: [],
|
|
105
|
+
});
|
|
106
|
+
expect(result.queryScope).toBe("multi-file");
|
|
107
|
+
});
|
|
108
|
+
it("upgrades targeted plus many explicit targets to multi-file", () => {
|
|
109
|
+
const result = normalizeUnderstandResult("Compare agentMemory.ts and agentLoop.ts", {
|
|
110
|
+
normalizedQuery: "Compare agentMemory.ts and agentLoop.ts",
|
|
111
|
+
queryScope: "targeted",
|
|
112
|
+
explicitTargets: ["agentMemory.ts", "agentLoop.ts"],
|
|
113
|
+
constraints: [],
|
|
114
|
+
primaryIntent: "Compare the two files.",
|
|
115
|
+
alternativeIntents: [],
|
|
116
|
+
ambiguityFlags: [],
|
|
117
|
+
});
|
|
118
|
+
expect(result.queryScope).toBe("multi-file");
|
|
119
|
+
});
|
|
120
|
+
it("drops non-target pronouns from explicit targets", () => {
|
|
121
|
+
const result = normalizeUnderstandResult("summarize this repo architecture and identify weak coupling points", {
|
|
122
|
+
normalizedQuery: "summarize repo architecture and identify weak coupling points",
|
|
123
|
+
queryScope: "broad-repo",
|
|
124
|
+
explicitTargets: ["this"],
|
|
125
|
+
constraints: [],
|
|
126
|
+
primaryIntent: "understand repo architecture",
|
|
127
|
+
alternativeIntents: [],
|
|
128
|
+
ambiguityFlags: [],
|
|
129
|
+
});
|
|
130
|
+
expect(result.explicitTargets).toEqual([]);
|
|
131
|
+
expect(result.queryScope).toBe("broad-repo");
|
|
132
|
+
});
|
|
133
|
+
it("drops discourse words like Also from explicit targets in resumed follow-ups", () => {
|
|
134
|
+
const result = normalizeUnderstandResult("did you check the memory.ts file? Also outline what you already checked", {
|
|
135
|
+
normalizedQuery: "did you check the memory.ts file? Also outline what you already checked",
|
|
136
|
+
queryScope: "general",
|
|
137
|
+
explicitTargets: ["memory.ts", "Also"],
|
|
138
|
+
constraints: [],
|
|
139
|
+
primaryIntent: "Verify if memory.ts was checked and summarize prior checks.",
|
|
140
|
+
alternativeIntents: [],
|
|
141
|
+
ambiguityFlags: [],
|
|
142
|
+
});
|
|
143
|
+
expect(result.explicitTargets).toEqual(["memory.ts"]);
|
|
144
|
+
expect(result.queryScope).toBe("targeted");
|
|
145
|
+
});
|
|
146
|
+
it("normalizes bounded search term groups", () => {
|
|
147
|
+
const result = normalizeUnderstandResult("where is max turns set", {
|
|
148
|
+
normalizedQuery: "where is max turns set",
|
|
149
|
+
queryScope: "general",
|
|
150
|
+
explicitTargets: [],
|
|
151
|
+
constraints: [],
|
|
152
|
+
primaryIntent: "Find the owner for the turn limit.",
|
|
153
|
+
alternativeIntents: [],
|
|
154
|
+
searchTermGroups: [
|
|
155
|
+
{ kind: "repo-anchor", terms: [" maxTurns ", "turnCount", "maxTurns", "count", "loop", "limit", "extra"] },
|
|
156
|
+
{ kind: "command-path", terms: ["memory.ts", "iteration", "constraint", "iteration", "limit"] },
|
|
157
|
+
{ kind: "generic", terms: ["configuration", "setting", "configured"] },
|
|
158
|
+
{ kind: "generic", terms: ["owner", "control"] },
|
|
159
|
+
{ kind: "generic", terms: ["ignored", "group"] },
|
|
160
|
+
],
|
|
161
|
+
ambiguityFlags: [],
|
|
162
|
+
});
|
|
163
|
+
expect(result.searchTermGroups).toEqual([
|
|
164
|
+
{ kind: "repo-anchor", terms: ["maxTurns", "turnCount", "count", "loop", "limit", "extra"] },
|
|
165
|
+
{ kind: "command-path", terms: ["memory.ts", "iteration", "constraint", "limit"] },
|
|
166
|
+
{ kind: "generic", terms: ["configuration", "setting", "configured"] },
|
|
167
|
+
{ kind: "generic", terms: ["owner", "control"] },
|
|
168
|
+
]);
|
|
169
|
+
});
|
|
170
|
+
it("keeps anchor-like search terms and drops repeated generic filler across groups", () => {
|
|
171
|
+
const result = normalizeUnderstandResult("how do tests run", {
|
|
172
|
+
normalizedQuery: "how do tests run",
|
|
173
|
+
queryScope: "broad-repo",
|
|
174
|
+
explicitTargets: [],
|
|
175
|
+
constraints: [],
|
|
176
|
+
primaryIntent: "Understand test execution.",
|
|
177
|
+
alternativeIntents: [],
|
|
178
|
+
searchTermGroups: [
|
|
179
|
+
{ kind: "repo-anchor", terms: ["registerDevCliCommands", "test", "command", "/test-run", "package.json"] },
|
|
180
|
+
{ kind: "generic", terms: ["test", "command", "config", "run"] },
|
|
181
|
+
{ kind: "repo-anchor", terms: ["testCommands", "config", "entrypoint"] },
|
|
182
|
+
],
|
|
183
|
+
ambiguityFlags: [],
|
|
184
|
+
});
|
|
185
|
+
expect(result.searchTermGroups).toEqual([
|
|
186
|
+
{ kind: "repo-anchor", terms: ["registerDevCliCommands", "test", "command", "/test-run", "package.json"] },
|
|
187
|
+
{ kind: "repo-anchor", terms: ["testCommands", "config", "entrypoint"] },
|
|
188
|
+
]);
|
|
189
|
+
});
|
|
190
|
+
it("drops all-generic typed groups when config-style queries need a repo-anchor group", () => {
|
|
191
|
+
const result = normalizeUnderstandResult("where are test entry points configured", {
|
|
192
|
+
normalizedQuery: "where are test entry points configured",
|
|
193
|
+
queryScope: "general",
|
|
194
|
+
explicitTargets: [],
|
|
195
|
+
constraints: [],
|
|
196
|
+
primaryIntent: "Find test entrypoint configuration.",
|
|
197
|
+
alternativeIntents: [],
|
|
198
|
+
searchTermGroups: [
|
|
199
|
+
{ kind: "generic", terms: ["test", "config", "entrypoint"] },
|
|
200
|
+
{ kind: "command-path", terms: ["package.json", "test-run"] },
|
|
201
|
+
],
|
|
202
|
+
ambiguityFlags: [],
|
|
203
|
+
});
|
|
204
|
+
expect(result.searchTermGroups).toEqual([]);
|
|
205
|
+
});
|
|
206
|
+
it("drops weak command-path groups that have no path, file, or command-like terms", () => {
|
|
207
|
+
const result = normalizeUnderstandResult("where are test entry points configured", {
|
|
208
|
+
normalizedQuery: "where are test entry points configured",
|
|
209
|
+
queryScope: "general",
|
|
210
|
+
explicitTargets: [],
|
|
211
|
+
constraints: [],
|
|
212
|
+
primaryIntent: "Find test entrypoint configuration.",
|
|
213
|
+
alternativeIntents: [],
|
|
214
|
+
searchTermGroups: [
|
|
215
|
+
{ kind: "repo-anchor", terms: ["registerDevCliCommands", "testCommands"] },
|
|
216
|
+
{ kind: "command-path", terms: ["config", "entrypoint", "route"] },
|
|
217
|
+
{ kind: "command-path", terms: ["package.json", "/test-run", "vitest.config.ts"] },
|
|
218
|
+
],
|
|
219
|
+
ambiguityFlags: [],
|
|
220
|
+
});
|
|
221
|
+
expect(result.searchTermGroups).toEqual([
|
|
222
|
+
{ kind: "repo-anchor", terms: ["registerDevCliCommands", "testCommands"] },
|
|
223
|
+
{ kind: "command-path", terms: ["package.json", "/test-run", "vitest.config.ts"] },
|
|
224
|
+
]);
|
|
225
|
+
});
|
|
226
|
+
});
|
|
227
|
+
//# sourceMappingURL=understandScope.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"understandScope.test.js","sourceRoot":"","sources":["../../../src/__tests__/agents/understandScope.test.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Covers understand-owned coarse scope validation for the new agent.\n *\n * Why this file exists:\n * - the understand model should return coarse scope once\n * - runtime should only validate that scope, not classify it from scratch\n * - direct tests keep scope validation changes separate from later lane behavior\n */\nimport { describe, expect, it } from \"vitest\";\nimport { normalizeUnderstandResult } from \"../../agent/runtime/understand.js\";\n\ndescribe(\"normalizeUnderstandResult queryScope validation\", () => {\n it(\"keeps a valid model-provided scope\", () => {\n const result = normalizeUnderstandResult(\"Explain cli/src/agent/search/index.ts\", {\n normalizedQuery: \"Explain cli/src/agent/search/index.ts\",\n queryScope: \"broad-repo\",\n explicitTargets: [\"cli/src/agent/search/index.ts\"],\n constraints: [],\n primaryIntent: \"Explain one file.\",\n alternativeIntents: [],\n ambiguityFlags: [],\n });\n\n expect(result.queryScope).toBe(\"broad-repo\");\n });\n\n it(\"falls back safely on an invalid scope\", () => {\n const result = normalizeUnderstandResult(\"what is recursion\", {\n normalizedQuery: \"what is recursion\",\n queryScope: \"wide\" as never,\n explicitTargets: [],\n constraints: [],\n primaryIntent: \"Answer a general knowledge question.\",\n alternativeIntents: [],\n ambiguityFlags: [],\n });\n\n expect(result.queryScope).toBe(\"general\");\n });\n\n it(\"downgrades a generic tool-usage miss from targeted to general\", () => {\n const result = normalizeUnderstandResult(\"how do I use git bash to save a diff?\", {\n normalizedQuery: \"how do I use git bash to save a diff\",\n queryScope: \"targeted\",\n explicitTargets: [],\n constraints: [],\n primaryIntent: \"Learn how to save a git diff output to a file using Git Bash.\",\n alternativeIntents: [],\n ambiguityFlags: [],\n });\n\n expect(result.queryScope).toBe(\"general\");\n });\n\n it(\"keeps a pure concept question general even when the model over-targets it\", () => {\n const result = normalizeUnderstandResult(\"what is recursion?\", {\n normalizedQuery: \"what is recursion\",\n queryScope: \"targeted\",\n explicitTargets: [],\n constraints: [],\n primaryIntent: \"Answer a general programming concept question.\",\n alternativeIntents: [],\n ambiguityFlags: [],\n });\n\n expect(result.queryScope).toBe(\"general\");\n });\n\n it(\"keeps repo wording out of the general fallback\", () => {\n const result = normalizeUnderstandResult(\"how does this repo run tests?\", {\n normalizedQuery: \"how does this repo run tests\",\n queryScope: \"broad-repo\",\n explicitTargets: [],\n constraints: [],\n primaryIntent: \"Explain how this repo runs tests.\",\n alternativeIntents: [],\n ambiguityFlags: [],\n });\n\n expect(result.queryScope).not.toBe(\"general\");\n });\n\n it(\"keeps explicit file questions targeted\", () => {\n const result = normalizeUnderstandResult(\"explain cli/src/agent/index.ts\", {\n normalizedQuery: \"explain cli/src/agent/index.ts\",\n queryScope: \"general\",\n explicitTargets: [\"cli/src/agent/index.ts\"],\n constraints: [],\n primaryIntent: \"Explain the file.\",\n alternativeIntents: [],\n ambiguityFlags: [],\n });\n\n expect(result.queryScope).toBe(\"targeted\");\n });\n\n it(\"upgrades general plus one explicit target to targeted\", () => {\n const result = normalizeUnderstandResult(\"Explain cli/src/agent/search/index.ts\", {\n normalizedQuery: \"Explain cli/src/agent/search/index.ts\",\n queryScope: \"general\",\n explicitTargets: [\"cli/src/agent/search/index.ts\"],\n constraints: [],\n primaryIntent: \"Explain one file.\",\n alternativeIntents: [],\n ambiguityFlags: [],\n });\n\n expect(result.queryScope).toBe(\"targeted\");\n });\n\n it(\"upgrades general plus many explicit targets to multi-file\", () => {\n const result = normalizeUnderstandResult(\n \"Explain how agentMemory and agentLoop divide responsibilities\",\n {\n normalizedQuery: \"Explain how agentMemory and agentLoop divide responsibilities\",\n queryScope: \"general\",\n explicitTargets: [\"agentMemory.ts\", \"agentLoop.ts\"],\n constraints: [],\n primaryIntent: \"Explain how agentMemory and agentLoop divide responsibilities.\",\n alternativeIntents: [],\n ambiguityFlags: [],\n }\n );\n\n expect(result.queryScope).toBe(\"multi-file\");\n });\n\n it(\"upgrades targeted plus many explicit targets to multi-file\", () => {\n const result = normalizeUnderstandResult(\n \"Compare agentMemory.ts and agentLoop.ts\",\n {\n normalizedQuery: \"Compare agentMemory.ts and agentLoop.ts\",\n queryScope: \"targeted\",\n explicitTargets: [\"agentMemory.ts\", \"agentLoop.ts\"],\n constraints: [],\n primaryIntent: \"Compare the two files.\",\n alternativeIntents: [],\n ambiguityFlags: [],\n }\n );\n\n expect(result.queryScope).toBe(\"multi-file\");\n });\n\n it(\"drops non-target pronouns from explicit targets\", () => {\n const result = normalizeUnderstandResult(\n \"summarize this repo architecture and identify weak coupling points\",\n {\n normalizedQuery: \"summarize repo architecture and identify weak coupling points\",\n queryScope: \"broad-repo\",\n explicitTargets: [\"this\"],\n constraints: [],\n primaryIntent: \"understand repo architecture\",\n alternativeIntents: [],\n ambiguityFlags: [],\n }\n );\n\n expect(result.explicitTargets).toEqual([]);\n expect(result.queryScope).toBe(\"broad-repo\");\n });\n\n it(\"drops discourse words like Also from explicit targets in resumed follow-ups\", () => {\n const result = normalizeUnderstandResult(\n \"did you check the memory.ts file? Also outline what you already checked\",\n {\n normalizedQuery: \"did you check the memory.ts file? Also outline what you already checked\",\n queryScope: \"general\",\n explicitTargets: [\"memory.ts\", \"Also\"],\n constraints: [],\n primaryIntent: \"Verify if memory.ts was checked and summarize prior checks.\",\n alternativeIntents: [],\n ambiguityFlags: [],\n }\n );\n\n expect(result.explicitTargets).toEqual([\"memory.ts\"]);\n expect(result.queryScope).toBe(\"targeted\");\n });\n\n it(\"normalizes bounded search term groups\", () => {\n const result = normalizeUnderstandResult(\"where is max turns set\", {\n normalizedQuery: \"where is max turns set\",\n queryScope: \"general\",\n explicitTargets: [],\n constraints: [],\n primaryIntent: \"Find the owner for the turn limit.\",\n alternativeIntents: [],\n searchTermGroups: [\n { kind: \"repo-anchor\", terms: [\" maxTurns \", \"turnCount\", \"maxTurns\", \"count\", \"loop\", \"limit\", \"extra\"] },\n { kind: \"command-path\", terms: [\"memory.ts\", \"iteration\", \"constraint\", \"iteration\", \"limit\"] },\n { kind: \"generic\", terms: [\"configuration\", \"setting\", \"configured\"] },\n { kind: \"generic\", terms: [\"owner\", \"control\"] },\n { kind: \"generic\", terms: [\"ignored\", \"group\"] },\n ],\n ambiguityFlags: [],\n });\n\n expect(result.searchTermGroups).toEqual([\n { kind: \"repo-anchor\", terms: [\"maxTurns\", \"turnCount\", \"count\", \"loop\", \"limit\", \"extra\"] },\n { kind: \"command-path\", terms: [\"memory.ts\", \"iteration\", \"constraint\", \"limit\"] },\n { kind: \"generic\", terms: [\"configuration\", \"setting\", \"configured\"] },\n { kind: \"generic\", terms: [\"owner\", \"control\"] },\n ]);\n });\n\n it(\"keeps anchor-like search terms and drops repeated generic filler across groups\", () => {\n const result = normalizeUnderstandResult(\"how do tests run\", {\n normalizedQuery: \"how do tests run\",\n queryScope: \"broad-repo\",\n explicitTargets: [],\n constraints: [],\n primaryIntent: \"Understand test execution.\",\n alternativeIntents: [],\n searchTermGroups: [\n { kind: \"repo-anchor\", terms: [\"registerDevCliCommands\", \"test\", \"command\", \"/test-run\", \"package.json\"] },\n { kind: \"generic\", terms: [\"test\", \"command\", \"config\", \"run\"] },\n { kind: \"repo-anchor\", terms: [\"testCommands\", \"config\", \"entrypoint\"] },\n ],\n ambiguityFlags: [],\n });\n\n expect(result.searchTermGroups).toEqual([\n { kind: \"repo-anchor\", terms: [\"registerDevCliCommands\", \"test\", \"command\", \"/test-run\", \"package.json\"] },\n { kind: \"repo-anchor\", terms: [\"testCommands\", \"config\", \"entrypoint\"] },\n ]);\n });\n\n it(\"drops all-generic typed groups when config-style queries need a repo-anchor group\", () => {\n const result = normalizeUnderstandResult(\"where are test entry points configured\", {\n normalizedQuery: \"where are test entry points configured\",\n queryScope: \"general\",\n explicitTargets: [],\n constraints: [],\n primaryIntent: \"Find test entrypoint configuration.\",\n alternativeIntents: [],\n searchTermGroups: [\n { kind: \"generic\", terms: [\"test\", \"config\", \"entrypoint\"] },\n { kind: \"command-path\", terms: [\"package.json\", \"test-run\"] },\n ],\n ambiguityFlags: [],\n });\n\n expect(result.searchTermGroups).toEqual([]);\n });\n\n it(\"drops weak command-path groups that have no path, file, or command-like terms\", () => {\n const result = normalizeUnderstandResult(\"where are test entry points configured\", {\n normalizedQuery: \"where are test entry points configured\",\n queryScope: \"general\",\n explicitTargets: [],\n constraints: [],\n primaryIntent: \"Find test entrypoint configuration.\",\n alternativeIntents: [],\n searchTermGroups: [\n { kind: \"repo-anchor\", terms: [\"registerDevCliCommands\", \"testCommands\"] },\n { kind: \"command-path\", terms: [\"config\", \"entrypoint\", \"route\"] },\n { kind: \"command-path\", terms: [\"package.json\", \"/test-run\", \"vitest.config.ts\"] },\n ],\n ambiguityFlags: [],\n });\n\n expect(result.searchTermGroups).toEqual([\n { kind: \"repo-anchor\", terms: [\"registerDevCliCommands\", \"testCommands\"] },\n { kind: \"command-path\", terms: [\"package.json\", \"/test-run\", \"vitest.config.ts\"] },\n ]);\n });\n});\n"]}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
// Verifies per-file validation results accumulate instead of replacing earlier files.
|
|
2
|
+
// It uses deterministic artifacts so the step can validate without depending on model output.
|
|
3
|
+
import { describe, expect, it } from "vitest";
|
|
4
|
+
import { validateChangesStep } from "../../agents/validateChangesStep.js";
|
|
5
|
+
// Pass example: validating "/repo/b.ts" keeps the earlier result for "/repo/a.ts" and appends the new one.
|
|
6
|
+
// Fail example: each new validation replacing the previous file history.
|
|
7
|
+
describe("validateChangesStep", () => {
|
|
8
|
+
it("preserves earlier validations when adding a new file result", async () => {
|
|
9
|
+
const context = {
|
|
10
|
+
task: {
|
|
11
|
+
currentStep: {
|
|
12
|
+
filePath: "/repo/b.ts",
|
|
13
|
+
},
|
|
14
|
+
},
|
|
15
|
+
analysis: {
|
|
16
|
+
fileAnalysis: {
|
|
17
|
+
"/repo/b.ts": {},
|
|
18
|
+
},
|
|
19
|
+
executionOutcome: {
|
|
20
|
+
executedStepIds: [],
|
|
21
|
+
validations: [
|
|
22
|
+
{
|
|
23
|
+
filePath: "/repo/a.ts",
|
|
24
|
+
expectedChange: "change a",
|
|
25
|
+
actualChange: "changed",
|
|
26
|
+
status: "valid",
|
|
27
|
+
rationale: "ok",
|
|
28
|
+
requiresRedo: false,
|
|
29
|
+
},
|
|
30
|
+
],
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
execution: {
|
|
34
|
+
codeTransformArtifacts: {
|
|
35
|
+
files: [
|
|
36
|
+
{
|
|
37
|
+
filePath: "/repo/b.ts",
|
|
38
|
+
content: "updated",
|
|
39
|
+
},
|
|
40
|
+
],
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
await validateChangesStep.run(context);
|
|
45
|
+
expect(context.analysis.executionOutcome.validations).toHaveLength(2);
|
|
46
|
+
expect(context.analysis.executionOutcome.validations.map((v) => v.filePath)).toEqual([
|
|
47
|
+
"/repo/a.ts",
|
|
48
|
+
"/repo/b.ts",
|
|
49
|
+
]);
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
//# sourceMappingURL=validateChangesStep.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validateChangesStep.test.js","sourceRoot":"","sources":["../../../src/__tests__/agents/validateChangesStep.test.ts"],"names":[],"mappings":"AAAA,sFAAsF;AACtF,8FAA8F;AAC9F,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAE1E,2GAA2G;AAC3G,yEAAyE;AACzE,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;QACzE,MAAM,OAAO,GAAG;YACZ,IAAI,EAAE;gBACF,WAAW,EAAE;oBACT,QAAQ,EAAE,YAAY;iBACzB;aACJ;YACD,QAAQ,EAAE;gBACN,YAAY,EAAE;oBACV,YAAY,EAAE,EAAE;iBACnB;gBACD,gBAAgB,EAAE;oBACd,eAAe,EAAE,EAAE;oBACnB,WAAW,EAAE;wBACT;4BACI,QAAQ,EAAE,YAAY;4BACtB,cAAc,EAAE,UAAU;4BAC1B,YAAY,EAAE,SAAS;4BACvB,MAAM,EAAE,OAAO;4BACf,SAAS,EAAE,IAAI;4BACf,YAAY,EAAE,KAAK;yBACtB;qBACJ;iBACJ;aACJ;YACD,SAAS,EAAE;gBACP,sBAAsB,EAAE;oBACpB,KAAK,EAAE;wBACH;4BACI,QAAQ,EAAE,YAAY;4BACtB,OAAO,EAAE,SAAS;yBACrB;qBACJ;iBACJ;aACJ;SACG,CAAC;QAET,MAAM,mBAAmB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAEvC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACtE,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAuB,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC;YACvG,YAAY;YACZ,YAAY;SACf,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC","sourcesContent":["// Verifies per-file validation results accumulate instead of replacing earlier files.\n// It uses deterministic artifacts so the step can validate without depending on model output.\nimport { describe, expect, it } from \"vitest\";\nimport { validateChangesStep } from \"../../agents/validateChangesStep.js\";\n\n// Pass example: validating \"/repo/b.ts\" keeps the earlier result for \"/repo/a.ts\" and appends the new one.\n// Fail example: each new validation replacing the previous file history.\ndescribe(\"validateChangesStep\", () => {\n it(\"preserves earlier validations when adding a new file result\", async () => {\n const context = {\n task: {\n currentStep: {\n filePath: \"/repo/b.ts\",\n },\n },\n analysis: {\n fileAnalysis: {\n \"/repo/b.ts\": {},\n },\n executionOutcome: {\n executedStepIds: [],\n validations: [\n {\n filePath: \"/repo/a.ts\",\n expectedChange: \"change a\",\n actualChange: \"changed\",\n status: \"valid\",\n rationale: \"ok\",\n requiresRedo: false,\n },\n ],\n },\n },\n execution: {\n codeTransformArtifacts: {\n files: [\n {\n filePath: \"/repo/b.ts\",\n content: \"updated\",\n },\n ],\n },\n },\n } as any;\n\n await validateChangesStep.run(context);\n\n expect(context.analysis.executionOutcome.validations).toHaveLength(2);\n expect(context.analysis.executionOutcome.validations.map((v: { filePath: string }) => v.filePath)).toEqual([\n \"/repo/a.ts\",\n \"/repo/b.ts\",\n ]);\n });\n});\n"]}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Covers ask-command task binding defaults for the modular agent runtime.
|
|
3
|
+
*
|
|
4
|
+
* Why this file exists:
|
|
5
|
+
* - the shared ask entry should stay new-agent only
|
|
6
|
+
* - task binding rules should stay explicit for one-shot and plan-only runs
|
|
7
|
+
*/
|
|
8
|
+
import { describe, expect, it, vi, beforeEach } from "vitest";
|
|
9
|
+
import { AgentRuntimeError } from "../agent/types.js";
|
|
10
|
+
function stripAnsi(text) {
|
|
11
|
+
return text.replace(/\x1B\[[0-9;]*m/g, "");
|
|
12
|
+
}
|
|
13
|
+
vi.mock("../utils/checkModel.js", () => ({}));
|
|
14
|
+
vi.mock(import("../constants.js"), async (importOriginal) => {
|
|
15
|
+
const actual = await importOriginal();
|
|
16
|
+
return {
|
|
17
|
+
...actual,
|
|
18
|
+
getIndexDir: () => "/repo",
|
|
19
|
+
RELATED_FILES_LIMIT: 50,
|
|
20
|
+
};
|
|
21
|
+
});
|
|
22
|
+
vi.mock("../utils/promptLogHelper.js", () => ({
|
|
23
|
+
clearRunLog: vi.fn(),
|
|
24
|
+
}));
|
|
25
|
+
const logRuntimeRecord = vi.fn();
|
|
26
|
+
const logRunStart = vi.fn();
|
|
27
|
+
vi.mock("../utils/runtimeLogger.js", () => ({
|
|
28
|
+
logRunStart,
|
|
29
|
+
logRuntimeRecord,
|
|
30
|
+
}));
|
|
31
|
+
vi.mock("../db/schema.js", () => ({
|
|
32
|
+
initSchema: vi.fn(),
|
|
33
|
+
}));
|
|
34
|
+
vi.mock("../db/client.js", () => ({
|
|
35
|
+
getDbForRepo: vi.fn(() => ({})),
|
|
36
|
+
}));
|
|
37
|
+
vi.mock("../agent/persistence/index.js", () => ({
|
|
38
|
+
resolveAgentResumeTaskId: vi.fn((resumeTaskId, continueCurrentTask) => {
|
|
39
|
+
if (typeof resumeTaskId === "number") {
|
|
40
|
+
return resumeTaskId;
|
|
41
|
+
}
|
|
42
|
+
return continueCurrentTask === false ? undefined : 99;
|
|
43
|
+
}),
|
|
44
|
+
}));
|
|
45
|
+
const agentRunSpy = vi.fn();
|
|
46
|
+
const agentCtor = vi.fn().mockImplementation((query, _ui, _memory, options) => ({
|
|
47
|
+
query,
|
|
48
|
+
options,
|
|
49
|
+
run: agentRunSpy,
|
|
50
|
+
}));
|
|
51
|
+
vi.mock("../agent/index.js", () => ({
|
|
52
|
+
Agent: agentCtor,
|
|
53
|
+
}));
|
|
54
|
+
describe("runAskCommand task binding", () => {
|
|
55
|
+
beforeEach(() => {
|
|
56
|
+
agentRunSpy.mockReset();
|
|
57
|
+
agentCtor.mockClear();
|
|
58
|
+
logRuntimeRecord.mockReset();
|
|
59
|
+
logRunStart.mockReset();
|
|
60
|
+
});
|
|
61
|
+
it("defaults normal ask runs to the new agent runtime", async () => {
|
|
62
|
+
const { runAskCommand } = await import("../commands/AskCmd.js");
|
|
63
|
+
agentRunSpy.mockResolvedValueOnce({
|
|
64
|
+
task: { id: "task-default" },
|
|
65
|
+
artifacts: { finalAnswer: "Default answer." },
|
|
66
|
+
});
|
|
67
|
+
await runAskCommand("fresh default", { continueCurrentTask: false });
|
|
68
|
+
expect(agentCtor).toHaveBeenCalledWith("fresh default", expect.any(Object), undefined, {
|
|
69
|
+
planOnly: false,
|
|
70
|
+
resumeTaskId: undefined,
|
|
71
|
+
bindAsCurrentTask: false,
|
|
72
|
+
});
|
|
73
|
+
expect(agentCtor).toHaveBeenCalledTimes(1);
|
|
74
|
+
});
|
|
75
|
+
it("uses the new agent runtime for one-shot agent runs", async () => {
|
|
76
|
+
const { runAskCommand } = await import("../commands/AskCmd.js");
|
|
77
|
+
const logSpy = vi.spyOn(console, "log").mockImplementation(() => { });
|
|
78
|
+
agentRunSpy.mockResolvedValueOnce({
|
|
79
|
+
task: { id: "task-1" },
|
|
80
|
+
artifacts: { finalAnswer: "Simple answer." },
|
|
81
|
+
});
|
|
82
|
+
await runAskCommand("fresh agent", { runtime: "agent", continueCurrentTask: false });
|
|
83
|
+
expect(agentCtor).toHaveBeenCalledWith("fresh agent", expect.any(Object), undefined, {
|
|
84
|
+
planOnly: false,
|
|
85
|
+
resumeTaskId: undefined,
|
|
86
|
+
bindAsCurrentTask: false,
|
|
87
|
+
});
|
|
88
|
+
expect(agentRunSpy).toHaveBeenCalledTimes(1);
|
|
89
|
+
expect(logSpy).toHaveBeenCalledWith("Using index root: /repo");
|
|
90
|
+
expect(logSpy).toHaveBeenCalledWith("Launching simple agent...");
|
|
91
|
+
expect(logSpy.mock.calls.some(([value]) => typeof value === "string" && stripAnsi(value).includes("[FINAL ANSWER]\nSimple answer."))).toBe(true);
|
|
92
|
+
expect(logRuntimeRecord).toHaveBeenCalledWith(expect.objectContaining({
|
|
93
|
+
runtime: "agent",
|
|
94
|
+
kind: "task",
|
|
95
|
+
phase: "finalized",
|
|
96
|
+
status: "done",
|
|
97
|
+
}));
|
|
98
|
+
logSpy.mockRestore();
|
|
99
|
+
});
|
|
100
|
+
it("passes explicit plan-only runs through the new agent", async () => {
|
|
101
|
+
const { runAskCommand } = await import("../commands/AskCmd.js");
|
|
102
|
+
agentRunSpy.mockResolvedValueOnce({
|
|
103
|
+
task: { id: "task-plan" },
|
|
104
|
+
artifacts: { finalAnswer: "Plan goal: map routing\n\nSteps:\n1. Read index.ts (read-file)" },
|
|
105
|
+
});
|
|
106
|
+
await runAskCommand("map routing", {
|
|
107
|
+
planOnly: true,
|
|
108
|
+
continueCurrentTask: false,
|
|
109
|
+
});
|
|
110
|
+
expect(agentCtor).toHaveBeenCalledWith("map routing", expect.any(Object), undefined, {
|
|
111
|
+
planOnly: true,
|
|
112
|
+
resumeTaskId: undefined,
|
|
113
|
+
bindAsCurrentTask: false,
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
it("prints an honest blocked-agent message when the simple agent cannot answer", async () => {
|
|
117
|
+
const { runAskCommand } = await import("../commands/AskCmd.js");
|
|
118
|
+
const logSpy = vi.spyOn(console, "log").mockImplementation(() => { });
|
|
119
|
+
agentRunSpy.mockResolvedValueOnce({
|
|
120
|
+
task: { id: "task-2", status: "blocked", stopReason: "max-turns" },
|
|
121
|
+
artifacts: {
|
|
122
|
+
stopMessage: "I could not answer from grounded repo evidence.",
|
|
123
|
+
},
|
|
124
|
+
});
|
|
125
|
+
await runAskCommand("fresh agent", { continueCurrentTask: false });
|
|
126
|
+
expect(logSpy).toHaveBeenCalledWith("I could not answer from grounded repo evidence.");
|
|
127
|
+
logSpy.mockRestore();
|
|
128
|
+
});
|
|
129
|
+
it("prints a waiting-for-input message when the simple agent needs one concrete follow-up", async () => {
|
|
130
|
+
const { runAskCommand } = await import("../commands/AskCmd.js");
|
|
131
|
+
const logSpy = vi.spyOn(console, "log").mockImplementation(() => { });
|
|
132
|
+
agentRunSpy.mockResolvedValueOnce({
|
|
133
|
+
task: { id: "task-3", status: "waiting", stopReason: "need-user-input" },
|
|
134
|
+
artifacts: {
|
|
135
|
+
stopMessage: "I need one thing from you:\n- the exact file path to inspect next",
|
|
136
|
+
},
|
|
137
|
+
});
|
|
138
|
+
await runAskCommand("fresh agent", { continueCurrentTask: false });
|
|
139
|
+
expect(logSpy).toHaveBeenCalledWith("I need one thing from you:\n- the exact file path to inspect next");
|
|
140
|
+
logSpy.mockRestore();
|
|
141
|
+
});
|
|
142
|
+
it("prints structured simple-agent failures through the shared UI path", async () => {
|
|
143
|
+
const logSpy = vi.spyOn(console, "log").mockImplementation(() => { });
|
|
144
|
+
agentRunSpy.mockRejectedValueOnce(new AgentRuntimeError({
|
|
145
|
+
stage: "validation",
|
|
146
|
+
message: "Invalid args for read-file: target is required",
|
|
147
|
+
stepId: "step-001",
|
|
148
|
+
action: "read-file",
|
|
149
|
+
}));
|
|
150
|
+
const { runAskCommand } = await import("../commands/AskCmd.js");
|
|
151
|
+
await runAskCommand("fresh agent", { continueCurrentTask: false });
|
|
152
|
+
expect(logSpy).toHaveBeenCalledWith([
|
|
153
|
+
"❌ Simple agent failed at validation.",
|
|
154
|
+
"Step: step-001",
|
|
155
|
+
"Action: read-file",
|
|
156
|
+
"Reason: Invalid args for read-file: target is required",
|
|
157
|
+
"Use /context to inspect the task, or check runtime.log for details.",
|
|
158
|
+
].join("\n"));
|
|
159
|
+
expect(logRuntimeRecord).toHaveBeenCalled();
|
|
160
|
+
logSpy.mockRestore();
|
|
161
|
+
});
|
|
162
|
+
it("prints top-level agent failures through the shared UI path", async () => {
|
|
163
|
+
const logSpy = vi.spyOn(console, "log").mockImplementation(() => { });
|
|
164
|
+
agentRunSpy.mockRejectedValueOnce(new Error("boom"));
|
|
165
|
+
const { runAskCommand } = await import("../commands/AskCmd.js");
|
|
166
|
+
await runAskCommand("fresh agent", { continueCurrentTask: false });
|
|
167
|
+
expect(logSpy).toHaveBeenCalledWith("simple agent run failed: boom");
|
|
168
|
+
expect(logRuntimeRecord).toHaveBeenCalledWith(expect.objectContaining({
|
|
169
|
+
runtime: "agent",
|
|
170
|
+
kind: "error",
|
|
171
|
+
phase: "failed",
|
|
172
|
+
}));
|
|
173
|
+
logSpy.mockRestore();
|
|
174
|
+
});
|
|
175
|
+
});
|
|
176
|
+
//# sourceMappingURL=askCommandTaskBinding.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"askCommandTaskBinding.test.js","sourceRoot":"","sources":["../../src/__tests__/askCommandTaskBinding.test.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Covers ask-command task binding defaults for the modular agent runtime.\n *\n * Why this file exists:\n * - the shared ask entry should stay new-agent only\n * - task binding rules should stay explicit for one-shot and plan-only runs\n */\nimport { describe, expect, it, vi, beforeEach } from \"vitest\";\nimport { AgentRuntimeError } from \"../agent/types.js\";\n\nfunction stripAnsi(text: string): string {\n return text.replace(/\\x1B\\[[0-9;]*m/g, \"\");\n}\n\nvi.mock(\"../utils/checkModel.js\", () => ({}));\nvi.mock(import(\"../constants.js\"), async (importOriginal) => {\n const actual = await importOriginal();\n return {\n ...actual,\n getIndexDir: () => \"/repo\",\n RELATED_FILES_LIMIT: 50 as const,\n };\n});\nvi.mock(\"../utils/promptLogHelper.js\", () => ({\n clearRunLog: vi.fn(),\n}));\nconst logRuntimeRecord = vi.fn();\nconst logRunStart = vi.fn();\nvi.mock(\"../utils/runtimeLogger.js\", () => ({\n logRunStart,\n logRuntimeRecord,\n}));\nvi.mock(\"../db/schema.js\", () => ({\n initSchema: vi.fn(),\n}));\nvi.mock(\"../db/client.js\", () => ({\n getDbForRepo: vi.fn(() => ({})),\n}));\nvi.mock(\"../agent/persistence/index.js\", () => ({\n resolveAgentResumeTaskId: vi.fn((resumeTaskId?: number, continueCurrentTask?: boolean) => {\n if (typeof resumeTaskId === \"number\") {\n return resumeTaskId;\n }\n return continueCurrentTask === false ? undefined : 99;\n }),\n}));\n\nconst agentRunSpy = vi.fn();\nconst agentCtor = vi.fn().mockImplementation((query, _ui, _memory, options) => ({\n query,\n options,\n run: agentRunSpy,\n}));\nvi.mock(\"../agent/index.js\", () => ({\n Agent: agentCtor,\n}));\n\ndescribe(\"runAskCommand task binding\", () => {\n beforeEach(() => {\n agentRunSpy.mockReset();\n agentCtor.mockClear();\n logRuntimeRecord.mockReset();\n logRunStart.mockReset();\n });\n\n it(\"defaults normal ask runs to the new agent runtime\", async () => {\n const { runAskCommand } = await import(\"../commands/AskCmd.js\");\n agentRunSpy.mockResolvedValueOnce({\n task: { id: \"task-default\" },\n artifacts: { finalAnswer: \"Default answer.\" },\n });\n\n await runAskCommand(\"fresh default\", { continueCurrentTask: false });\n\n expect(agentCtor).toHaveBeenCalledWith(\"fresh default\", expect.any(Object), undefined, {\n planOnly: false,\n resumeTaskId: undefined,\n bindAsCurrentTask: false,\n });\n expect(agentCtor).toHaveBeenCalledTimes(1);\n });\n\n it(\"uses the new agent runtime for one-shot agent runs\", async () => {\n const { runAskCommand } = await import(\"../commands/AskCmd.js\");\n const logSpy = vi.spyOn(console, \"log\").mockImplementation(() => {});\n agentRunSpy.mockResolvedValueOnce({\n task: { id: \"task-1\" },\n artifacts: { finalAnswer: \"Simple answer.\" },\n });\n\n await runAskCommand(\"fresh agent\", { runtime: \"agent\", continueCurrentTask: false });\n\n expect(agentCtor).toHaveBeenCalledWith(\"fresh agent\", expect.any(Object), undefined, {\n planOnly: false,\n resumeTaskId: undefined,\n bindAsCurrentTask: false,\n });\n expect(agentRunSpy).toHaveBeenCalledTimes(1);\n expect(logSpy).toHaveBeenCalledWith(\"Using index root: /repo\");\n expect(logSpy).toHaveBeenCalledWith(\"Launching simple agent...\");\n expect(logSpy.mock.calls.some(\n ([value]) => typeof value === \"string\" && stripAnsi(value).includes(\"[FINAL ANSWER]\\nSimple answer.\")\n )).toBe(true);\n expect(logRuntimeRecord).toHaveBeenCalledWith(expect.objectContaining({\n runtime: \"agent\",\n kind: \"task\",\n phase: \"finalized\",\n status: \"done\",\n }));\n logSpy.mockRestore();\n });\n\n it(\"passes explicit plan-only runs through the new agent\", async () => {\n const { runAskCommand } = await import(\"../commands/AskCmd.js\");\n agentRunSpy.mockResolvedValueOnce({\n task: { id: \"task-plan\" },\n artifacts: { finalAnswer: \"Plan goal: map routing\\n\\nSteps:\\n1. Read index.ts (read-file)\" },\n });\n\n await runAskCommand(\"map routing\", {\n planOnly: true,\n continueCurrentTask: false,\n });\n\n expect(agentCtor).toHaveBeenCalledWith(\"map routing\", expect.any(Object), undefined, {\n planOnly: true,\n resumeTaskId: undefined,\n bindAsCurrentTask: false,\n });\n });\n\n it(\"prints an honest blocked-agent message when the simple agent cannot answer\", async () => {\n const { runAskCommand } = await import(\"../commands/AskCmd.js\");\n const logSpy = vi.spyOn(console, \"log\").mockImplementation(() => {});\n agentRunSpy.mockResolvedValueOnce({\n task: { id: \"task-2\", status: \"blocked\", stopReason: \"max-turns\" },\n artifacts: {\n stopMessage: \"I could not answer from grounded repo evidence.\",\n },\n });\n\n await runAskCommand(\"fresh agent\", { continueCurrentTask: false });\n\n expect(logSpy).toHaveBeenCalledWith(\"I could not answer from grounded repo evidence.\");\n logSpy.mockRestore();\n });\n\n it(\"prints a waiting-for-input message when the simple agent needs one concrete follow-up\", async () => {\n const { runAskCommand } = await import(\"../commands/AskCmd.js\");\n const logSpy = vi.spyOn(console, \"log\").mockImplementation(() => {});\n agentRunSpy.mockResolvedValueOnce({\n task: { id: \"task-3\", status: \"waiting\", stopReason: \"need-user-input\" },\n artifacts: {\n stopMessage: \"I need one thing from you:\\n- the exact file path to inspect next\",\n },\n });\n\n await runAskCommand(\"fresh agent\", { continueCurrentTask: false });\n\n expect(logSpy).toHaveBeenCalledWith(\"I need one thing from you:\\n- the exact file path to inspect next\");\n logSpy.mockRestore();\n });\n\n it(\"prints structured simple-agent failures through the shared UI path\", async () => {\n const logSpy = vi.spyOn(console, \"log\").mockImplementation(() => {});\n agentRunSpy.mockRejectedValueOnce(new AgentRuntimeError({\n stage: \"validation\",\n message: \"Invalid args for read-file: target is required\",\n stepId: \"step-001\",\n action: \"read-file\",\n }));\n const { runAskCommand } = await import(\"../commands/AskCmd.js\");\n\n await runAskCommand(\"fresh agent\", { continueCurrentTask: false });\n\n expect(logSpy).toHaveBeenCalledWith([\n \"❌ Simple agent failed at validation.\",\n \"Step: step-001\",\n \"Action: read-file\",\n \"Reason: Invalid args for read-file: target is required\",\n \"Use /context to inspect the task, or check runtime.log for details.\",\n ].join(\"\\n\"));\n expect(logRuntimeRecord).toHaveBeenCalled();\n logSpy.mockRestore();\n });\n\n it(\"prints top-level agent failures through the shared UI path\", async () => {\n const logSpy = vi.spyOn(console, \"log\").mockImplementation(() => {});\n agentRunSpy.mockRejectedValueOnce(new Error(\"boom\"));\n const { runAskCommand } = await import(\"../commands/AskCmd.js\");\n\n await runAskCommand(\"fresh agent\", { continueCurrentTask: false });\n\n expect(logSpy).toHaveBeenCalledWith(\"simple agent run failed: boom\");\n expect(logRuntimeRecord).toHaveBeenCalledWith(expect.objectContaining({\n runtime: \"agent\",\n kind: \"error\",\n phase: \"failed\",\n }));\n logSpy.mockRestore();\n });\n});\n"]}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Verifies that dev-only commands require the explicit env flag.
|
|
3
|
+
*
|
|
4
|
+
* Why this file exists:
|
|
5
|
+
* - the public command surface should stay small by default
|
|
6
|
+
* - maintainers still need an explicit opt-in for eval and test helpers
|
|
7
|
+
*/
|
|
8
|
+
import { afterEach, describe, expect, it } from "vitest";
|
|
9
|
+
const ORIGINAL_ENV = { ...process.env };
|
|
10
|
+
afterEach(() => {
|
|
11
|
+
process.env = { ...ORIGINAL_ENV };
|
|
12
|
+
});
|
|
13
|
+
describe("isDevCommandsEnabled", () => {
|
|
14
|
+
it("is disabled by default", async () => {
|
|
15
|
+
delete process.env.SCAI_ENABLE_DEV_COMMANDS;
|
|
16
|
+
const { isDevCommandsEnabled } = await import("../commands/commandVisibility.js");
|
|
17
|
+
expect(isDevCommandsEnabled()).toBe(false);
|
|
18
|
+
});
|
|
19
|
+
it("only enables when the explicit env flag is set", async () => {
|
|
20
|
+
process.env.SCAI_ENABLE_DEV_COMMANDS = "1";
|
|
21
|
+
const { isDevCommandsEnabled } = await import("../commands/commandVisibility.js");
|
|
22
|
+
expect(isDevCommandsEnabled()).toBe(true);
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
//# sourceMappingURL=commandVisibility.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commandVisibility.test.js","sourceRoot":"","sources":["../../src/__tests__/commandVisibility.test.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAEzD,MAAM,YAAY,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;AAExC,SAAS,CAAC,GAAG,EAAE;IACb,OAAO,CAAC,GAAG,GAAG,EAAE,GAAG,YAAY,EAAE,CAAC;AACpC,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,wBAAwB,EAAE,KAAK,IAAI,EAAE;QACtC,OAAO,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC;QAC5C,MAAM,EAAE,oBAAoB,EAAE,GAAG,MAAM,MAAM,CAAC,kCAAkC,CAAC,CAAC;QAClF,MAAM,CAAC,oBAAoB,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAC9D,OAAO,CAAC,GAAG,CAAC,wBAAwB,GAAG,GAAG,CAAC;QAC3C,MAAM,EAAE,oBAAoB,EAAE,GAAG,MAAM,MAAM,CAAC,kCAAkC,CAAC,CAAC;QAClF,MAAM,CAAC,oBAAoB,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["/**\n * Verifies that dev-only commands require the explicit env flag.\n *\n * Why this file exists:\n * - the public command surface should stay small by default\n * - maintainers still need an explicit opt-in for eval and test helpers\n */\nimport { afterEach, describe, expect, it } from \"vitest\";\n\nconst ORIGINAL_ENV = { ...process.env };\n\nafterEach(() => {\n process.env = { ...ORIGINAL_ENV };\n});\n\ndescribe(\"isDevCommandsEnabled\", () => {\n it(\"is disabled by default\", async () => {\n delete process.env.SCAI_ENABLE_DEV_COMMANDS;\n const { isDevCommandsEnabled } = await import(\"../commands/commandVisibility.js\");\n expect(isDevCommandsEnabled()).toBe(false);\n });\n\n it(\"only enables when the explicit env flag is set\", async () => {\n process.env.SCAI_ENABLE_DEV_COMMANDS = \"1\";\n const { isDevCommandsEnabled } = await import(\"../commands/commandVisibility.js\");\n expect(isDevCommandsEnabled()).toBe(true);\n });\n});\n"]}
|