scai 0.1.178 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +171 -260
- package/dist/__tests__/CommitSuggesterCmd.test.js +112 -0
- package/dist/__tests__/CommitSuggesterCmd.test.js.map +1 -0
- package/dist/__tests__/EvalReportCmd.test.js +645 -0
- package/dist/__tests__/EvalReportCmd.test.js.map +1 -0
- package/dist/__tests__/ModelCmd.test.js +64 -0
- package/dist/__tests__/ModelCmd.test.js.map +1 -0
- package/dist/__tests__/agents/agentActions.test.js +345 -0
- package/dist/__tests__/agents/agentActions.test.js.map +1 -0
- package/dist/__tests__/agents/agentFeedback.test.js +118 -0
- package/dist/__tests__/agents/agentFeedback.test.js.map +1 -0
- package/dist/__tests__/agents/agentGeneralScope.test.js +74 -0
- package/dist/__tests__/agents/agentGeneralScope.test.js.map +1 -0
- package/dist/__tests__/agents/agentLoop.test.js +1723 -0
- package/dist/__tests__/agents/agentLoop.test.js.map +1 -0
- package/dist/__tests__/agents/agentPolicyState.test.js +948 -0
- package/dist/__tests__/agents/agentPolicyState.test.js.map +1 -0
- package/dist/__tests__/agents/agentReadEvidence.test.js +170 -0
- package/dist/__tests__/agents/agentReadEvidence.test.js.map +1 -0
- package/dist/__tests__/agents/agentReadPersistence.test.js +129 -0
- package/dist/__tests__/agents/agentReadPersistence.test.js.map +1 -0
- package/dist/__tests__/agents/agentResumeCheckpoint.test.js +90 -0
- package/dist/__tests__/agents/agentResumeCheckpoint.test.js.map +1 -0
- package/dist/__tests__/agents/agentSearchBatchPlanner.test.js +289 -0
- package/dist/__tests__/agents/agentSearchBatchPlanner.test.js.map +1 -0
- package/dist/__tests__/agents/agentSearchOwnership.test.js +166 -0
- package/dist/__tests__/agents/agentSearchOwnership.test.js.map +1 -0
- package/dist/__tests__/agents/agentSearchRanking.test.js +139 -0
- package/dist/__tests__/agents/agentSearchRanking.test.js.map +1 -0
- package/dist/__tests__/agents/agentSearchRouting.test.js +584 -0
- package/dist/__tests__/agents/agentSearchRouting.test.js.map +1 -0
- package/dist/__tests__/agents/agentSearchScoring.test.js +23 -0
- package/dist/__tests__/agents/agentSearchScoring.test.js.map +1 -0
- package/dist/__tests__/agents/agentSearchShared.test.js +78 -0
- package/dist/__tests__/agents/agentSearchShared.test.js.map +1 -0
- package/dist/__tests__/agents/agentStateMachine.test.js +58 -0
- package/dist/__tests__/agents/agentStateMachine.test.js.map +1 -0
- package/dist/__tests__/agents/agentTaskPersistence.test.js +156 -0
- package/dist/__tests__/agents/agentTaskPersistence.test.js.map +1 -0
- package/dist/__tests__/agents/agentTools.test.js +69 -0
- package/dist/__tests__/agents/agentTools.test.js.map +1 -0
- package/dist/__tests__/agents/agentTransform.test.js +779 -0
- package/dist/__tests__/agents/agentTransform.test.js.map +1 -0
- package/dist/__tests__/agents/analysisPlanGenStep.test.js +157 -0
- package/dist/__tests__/agents/analysisPlanGenStep.test.js.map +1 -0
- package/dist/__tests__/agents/answerOnlyCompletion.test.js +75 -0
- package/dist/__tests__/agents/answerOnlyCompletion.test.js.map +1 -0
- package/dist/__tests__/agents/decideNextAction.test.js +1662 -0
- package/dist/__tests__/agents/decideNextAction.test.js.map +1 -0
- package/dist/__tests__/agents/deriveFocusFromSearchStep.test.js +258 -0
- package/dist/__tests__/agents/deriveFocusFromSearchStep.test.js.map +1 -0
- package/dist/__tests__/agents/evidenceVerifierStep.test.js +113 -0
- package/dist/__tests__/agents/evidenceVerifierStep.test.js.map +1 -0
- package/dist/__tests__/agents/executionPolicyResolver.test.js +208 -0
- package/dist/__tests__/agents/executionPolicyResolver.test.js.map +1 -0
- package/dist/__tests__/agents/fileCheckStep.test.js +299 -0
- package/dist/__tests__/agents/fileCheckStep.test.js.map +1 -0
- package/dist/__tests__/agents/giveUpEvaluatorStep.test.js +35 -0
- package/dist/__tests__/agents/giveUpEvaluatorStep.test.js.map +1 -0
- package/dist/__tests__/agents/guardState.test.js +297 -0
- package/dist/__tests__/agents/guardState.test.js.map +1 -0
- package/dist/__tests__/agents/mainAgentHeuristics.test.js +72 -0
- package/dist/__tests__/agents/mainAgentHeuristics.test.js.map +1 -0
- package/dist/__tests__/agents/objectiveEvaluatorStep.test.js +60 -0
- package/dist/__tests__/agents/objectiveEvaluatorStep.test.js.map +1 -0
- package/dist/__tests__/agents/outerLoopRecoveryEvaluator.test.js +207 -0
- package/dist/__tests__/agents/outerLoopRecoveryEvaluator.test.js.map +1 -0
- package/dist/__tests__/agents/prompting.test.js +363 -0
- package/dist/__tests__/agents/prompting.test.js.map +1 -0
- package/dist/__tests__/agents/readinessGateStep.test.js +180 -0
- package/dist/__tests__/agents/readinessGateStep.test.js.map +1 -0
- package/dist/__tests__/agents/reasonNextStep.test.js +56 -0
- package/dist/__tests__/agents/reasonNextStep.test.js.map +1 -0
- package/dist/__tests__/agents/reasonNextTaskStep.test.js +284 -0
- package/dist/__tests__/agents/reasonNextTaskStep.test.js.map +1 -0
- package/dist/__tests__/agents/resolveAgentTargetClassification.test.js +170 -0
- package/dist/__tests__/agents/resolveAgentTargetClassification.test.js.map +1 -0
- package/dist/__tests__/agents/resolveProgressState.test.js +526 -0
- package/dist/__tests__/agents/resolveProgressState.test.js.map +1 -0
- package/dist/__tests__/agents/resumeCheckpoint.test.js +50 -0
- package/dist/__tests__/agents/resumeCheckpoint.test.js.map +1 -0
- package/dist/__tests__/agents/routingDecisionStep.test.js +134 -0
- package/dist/__tests__/agents/routingDecisionStep.test.js.map +1 -0
- package/dist/__tests__/agents/scopeClassificationStep.test.js +118 -0
- package/dist/__tests__/agents/scopeClassificationStep.test.js.map +1 -0
- package/dist/__tests__/agents/searchContext.test.js +97 -0
- package/dist/__tests__/agents/searchContext.test.js.map +1 -0
- package/dist/__tests__/agents/selectRelevantSourcesStep.test.js +73 -0
- package/dist/__tests__/agents/selectRelevantSourcesStep.test.js.map +1 -0
- package/dist/__tests__/agents/structuredOutput.test.js +45 -0
- package/dist/__tests__/agents/structuredOutput.test.js.map +1 -0
- package/dist/__tests__/agents/transformPlanGenStep.fallback.test.js +59 -0
- package/dist/__tests__/agents/transformPlanGenStep.fallback.test.js.map +1 -0
- package/dist/__tests__/agents/transformPlanGenStep.test.js +92 -0
- package/dist/__tests__/agents/transformPlanGenStep.test.js.map +1 -0
- package/dist/__tests__/agents/understandIntentStep.test.js +237 -0
- package/dist/__tests__/agents/understandIntentStep.test.js.map +1 -0
- package/dist/__tests__/agents/understandResumeContext.test.js +65 -0
- package/dist/__tests__/agents/understandResumeContext.test.js.map +1 -0
- package/dist/__tests__/agents/understandScope.test.js +227 -0
- package/dist/__tests__/agents/understandScope.test.js.map +1 -0
- package/dist/__tests__/agents/validateChangesStep.test.js +52 -0
- package/dist/__tests__/agents/validateChangesStep.test.js.map +1 -0
- package/dist/__tests__/askCommandTaskBinding.test.js +176 -0
- package/dist/__tests__/askCommandTaskBinding.test.js.map +1 -0
- package/dist/__tests__/commandVisibility.test.js +25 -0
- package/dist/__tests__/commandVisibility.test.js.map +1 -0
- package/dist/__tests__/config.devOutput.test.js +82 -0
- package/dist/__tests__/config.devOutput.test.js.map +1 -0
- package/dist/__tests__/currentContext.test.js +43 -0
- package/dist/__tests__/currentContext.test.js.map +1 -0
- package/dist/__tests__/daemonWorker.test.js +51 -0
- package/dist/__tests__/daemonWorker.test.js.map +1 -0
- package/dist/__tests__/dialogState.test.js +113 -0
- package/dist/__tests__/dialogState.test.js.map +1 -0
- package/dist/__tests__/evalCommands.test.js +506 -0
- package/dist/__tests__/evalCommands.test.js.map +1 -0
- package/dist/__tests__/evalCommandsSummary.test.js +68 -0
- package/dist/__tests__/evalCommandsSummary.test.js.map +1 -0
- package/dist/__tests__/example.test.js +1 -0
- package/dist/__tests__/example.test.js.map +1 -0
- package/dist/__tests__/factory.commitCommand.test.js +45 -0
- package/dist/__tests__/factory.commitCommand.test.js.map +1 -0
- package/dist/__tests__/factory.devOutputCommand.test.js +122 -0
- package/dist/__tests__/factory.devOutputCommand.test.js.map +1 -0
- package/dist/__tests__/factory.evalCommands.test.js +38 -0
- package/dist/__tests__/factory.evalCommands.test.js.map +1 -0
- package/dist/__tests__/factory.planCommand.test.js +35 -0
- package/dist/__tests__/factory.planCommand.test.js.map +1 -0
- package/dist/__tests__/factory.setupCommand.test.js +34 -0
- package/dist/__tests__/factory.setupCommand.test.js.map +1 -0
- package/dist/__tests__/factory.statusCommand.test.js +54 -0
- package/dist/__tests__/factory.statusCommand.test.js.map +1 -0
- package/dist/__tests__/fileRules/queryTokenRules.test.js +35 -0
- package/dist/__tests__/fileRules/queryTokenRules.test.js.map +1 -0
- package/dist/__tests__/fileRules/searchPathClassification.test.js +57 -0
- package/dist/__tests__/fileRules/searchPathClassification.test.js.map +1 -0
- package/dist/__tests__/generate.ollamaRecovery.test.js +344 -0
- package/dist/__tests__/generate.ollamaRecovery.test.js.map +1 -0
- package/dist/__tests__/index.modelStartup.test.js +24 -0
- package/dist/__tests__/index.modelStartup.test.js.map +1 -0
- package/dist/__tests__/indexCmd.test.js +85 -0
- package/dist/__tests__/indexCmd.test.js.map +1 -0
- package/dist/__tests__/indexSlashCommand.test.js +50 -0
- package/dist/__tests__/indexSlashCommand.test.js.map +1 -0
- package/dist/__tests__/ollamaService.test.js +103 -0
- package/dist/__tests__/ollamaService.test.js.map +1 -0
- package/dist/__tests__/pipeline/modules/codeTransformModule.small-file.test.js +68 -0
- package/dist/__tests__/pipeline/modules/codeTransformModule.small-file.test.js.map +1 -0
- package/dist/__tests__/pipeline/modules/commitSuggesterModule.test.js +68 -0
- package/dist/__tests__/pipeline/modules/commitSuggesterModule.test.js.map +1 -0
- package/dist/__tests__/pipeline/modules/fileSearchModule.test.js +284 -0
- package/dist/__tests__/pipeline/modules/fileSearchModule.test.js.map +1 -0
- package/dist/__tests__/pipeline/modules/finalAnswerModule.test.js +1139 -0
- package/dist/__tests__/pipeline/modules/finalAnswerModule.test.js.map +1 -0
- package/dist/__tests__/pipeline/modules/readFileModule.test.js +146 -0
- package/dist/__tests__/pipeline/modules/readFileModule.test.js.map +1 -0
- package/dist/__tests__/pipeline/modules/semanticAnalysisModule.test.js +192 -0
- package/dist/__tests__/pipeline/modules/semanticAnalysisModule.test.js.map +1 -0
- package/dist/__tests__/repoIdentity.test.js +31 -0
- package/dist/__tests__/repoIdentity.test.js.map +1 -0
- package/dist/__tests__/resumeContext.test.js +87 -0
- package/dist/__tests__/resumeContext.test.js.map +1 -0
- package/dist/__tests__/resumeState.test.js +239 -0
- package/dist/__tests__/resumeState.test.js.map +1 -0
- package/dist/__tests__/search/SearchOrchestrator.test.js +836 -0
- package/dist/__tests__/search/SearchOrchestrator.test.js.map +1 -0
- package/dist/__tests__/shellDialogUi.test.js +52 -0
- package/dist/__tests__/shellDialogUi.test.js.map +1 -0
- package/dist/__tests__/shellSession.test.js +102 -0
- package/dist/__tests__/shellSession.test.js.map +1 -0
- package/dist/__tests__/statusOwner.test.js +215 -0
- package/dist/__tests__/statusOwner.test.js.map +1 -0
- package/dist/__tests__/testing/contextEval.test.js +244 -0
- package/dist/__tests__/testing/contextEval.test.js.map +1 -0
- package/dist/__tests__/testing/harnessArtifacts.test.js +124 -0
- package/dist/__tests__/testing/harnessArtifacts.test.js.map +1 -0
- package/dist/__tests__/testing/llmTraceSession.test.js +67 -0
- package/dist/__tests__/testing/llmTraceSession.test.js.map +1 -0
- package/dist/__tests__/testing/registerDevCliCommands.test.js +35 -0
- package/dist/__tests__/testing/registerDevCliCommands.test.js.map +1 -0
- package/dist/__tests__/testing/runDiagnosis.test.js +159 -0
- package/dist/__tests__/testing/runDiagnosis.test.js.map +1 -0
- package/dist/__tests__/testing/runtimeLogReader.test.js +66 -0
- package/dist/__tests__/testing/runtimeLogReader.test.js.map +1 -0
- package/dist/__tests__/testing/testCommands.test.js +53 -0
- package/dist/__tests__/testing/testCommands.test.js.map +1 -0
- package/dist/__tests__/utils/compileSearchQuery.test.js +38 -0
- package/dist/__tests__/utils/compileSearchQuery.test.js.map +1 -0
- package/dist/__tests__/utils/consolePresentation.test.js +105 -0
- package/dist/__tests__/utils/consolePresentation.test.js.map +1 -0
- package/dist/__tests__/utils/extractFileReferences.test.js +41 -0
- package/dist/__tests__/utils/extractFileReferences.test.js.map +1 -0
- package/dist/__tests__/utils/log.test.js +34 -0
- package/dist/__tests__/utils/log.test.js.map +1 -0
- package/dist/__tests__/utils/runtimeLogger.test.js +200 -0
- package/dist/__tests__/utils/runtimeLogger.test.js.map +1 -0
- package/dist/__tests__/utils/spinner.test.js +31 -0
- package/dist/__tests__/utils/spinner.test.js.map +1 -0
- package/dist/__tests__/utils/verifyFocusPreference.test.js +41 -0
- package/dist/__tests__/utils/verifyFocusPreference.test.js.map +1 -0
- package/dist/agent/actions/index.js +301 -0
- package/dist/agent/actions/index.js.map +1 -0
- package/dist/agent/actions/normalize.js +360 -0
- package/dist/agent/actions/normalize.js.map +1 -0
- package/dist/agent/actions/schemas.js +129 -0
- package/dist/agent/actions/schemas.js.map +1 -0
- package/dist/agent/evidence/index.js +320 -0
- package/dist/agent/evidence/index.js.map +1 -0
- package/dist/agent/feedback/index.js +187 -0
- package/dist/agent/feedback/index.js.map +1 -0
- package/dist/agent/finalization/index.js +35 -0
- package/dist/agent/finalization/index.js.map +1 -0
- package/dist/agent/index.js +126 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/agent/logging/index.js +350 -0
- package/dist/agent/logging/index.js.map +1 -0
- package/dist/agent/persistence/boot.js +58 -0
- package/dist/agent/persistence/boot.js.map +1 -0
- package/dist/agent/persistence/currentTask.js +36 -0
- package/dist/agent/persistence/currentTask.js.map +1 -0
- package/dist/agent/persistence/hydrate.js +42 -0
- package/dist/agent/persistence/hydrate.js.map +1 -0
- package/dist/agent/persistence/index.js +15 -0
- package/dist/agent/persistence/index.js.map +1 -0
- package/dist/agent/persistence/snapshots.js +97 -0
- package/dist/agent/persistence/snapshots.js.map +1 -0
- package/dist/agent/persistence/steps.js +95 -0
- package/dist/agent/persistence/steps.js.map +1 -0
- package/dist/agent/persistence/tasks.js +195 -0
- package/dist/agent/persistence/tasks.js.map +1 -0
- package/dist/agent/persistence/turns.js +92 -0
- package/dist/agent/persistence/turns.js.map +1 -0
- package/dist/agent/policy/ambiguityResolution.js +226 -0
- package/dist/agent/policy/ambiguityResolution.js.map +1 -0
- package/dist/agent/policy/contracts.js +2 -0
- package/dist/agent/policy/contracts.js.map +1 -0
- package/dist/agent/policy/coveragePolicy.js +309 -0
- package/dist/agent/policy/coveragePolicy.js.map +1 -0
- package/dist/agent/policy/endDecisionPolicy.js +31 -0
- package/dist/agent/policy/endDecisionPolicy.js.map +1 -0
- package/dist/agent/policy/index.js +344 -0
- package/dist/agent/policy/index.js.map +1 -0
- package/dist/agent/policy/loopReview.js +778 -0
- package/dist/agent/policy/loopReview.js.map +1 -0
- package/dist/agent/policy/readinessPolicy.js +108 -0
- package/dist/agent/policy/readinessPolicy.js.map +1 -0
- package/dist/agent/policy/resolutionPipeline.js +356 -0
- package/dist/agent/policy/resolutionPipeline.js.map +1 -0
- package/dist/agent/policy/targetClassification.js +33 -0
- package/dist/agent/policy/targetClassification.js.map +1 -0
- package/dist/agent/prompting/actionChoice.js +90 -0
- package/dist/agent/prompting/actionChoice.js.map +1 -0
- package/dist/agent/prompting/finalAnswer.js +38 -0
- package/dist/agent/prompting/finalAnswer.js.map +1 -0
- package/dist/agent/prompting/index.js +14 -0
- package/dist/agent/prompting/index.js.map +1 -0
- package/dist/agent/prompting/plan.js +59 -0
- package/dist/agent/prompting/plan.js.map +1 -0
- package/dist/agent/prompting/transform.js +175 -0
- package/dist/agent/prompting/transform.js.map +1 -0
- package/dist/agent/prompting/understand.js +70 -0
- package/dist/agent/prompting/understand.js.map +1 -0
- package/dist/agent/read/freshness.js +29 -0
- package/dist/agent/read/freshness.js.map +1 -0
- package/dist/agent/read/fullReadPrompt.js +43 -0
- package/dist/agent/read/fullReadPrompt.js.map +1 -0
- package/dist/agent/read/index.js +140 -0
- package/dist/agent/read/index.js.map +1 -0
- package/dist/agent/read/persistence.js +88 -0
- package/dist/agent/read/persistence.js.map +1 -0
- package/dist/agent/read/summarizeReadEvidence.js +733 -0
- package/dist/agent/read/summarizeReadEvidence.js.map +1 -0
- package/dist/agent/read/targetResolution.js +126 -0
- package/dist/agent/read/targetResolution.js.map +1 -0
- package/dist/agent/resume/checkpoint.js +41 -0
- package/dist/agent/resume/checkpoint.js.map +1 -0
- package/dist/agent/runtime/lifecycle.js +67 -0
- package/dist/agent/runtime/lifecycle.js.map +1 -0
- package/dist/agent/runtime/progress.js +178 -0
- package/dist/agent/runtime/progress.js.map +1 -0
- package/dist/agent/runtime/runAgentLoop.js +402 -0
- package/dist/agent/runtime/runAgentLoop.js.map +1 -0
- package/dist/agent/runtime/runAgentPlanOnly.js +127 -0
- package/dist/agent/runtime/runAgentPlanOnly.js.map +1 -0
- package/dist/agent/runtime/understand.js +336 -0
- package/dist/agent/runtime/understand.js.map +1 -0
- package/dist/agent/search/batchPlanner.js +274 -0
- package/dist/agent/search/batchPlanner.js.map +1 -0
- package/dist/agent/search/candidateRetentionPolicy.js +184 -0
- package/dist/agent/search/candidateRetentionPolicy.js.map +1 -0
- package/dist/agent/search/directory.js +51 -0
- package/dist/agent/search/directory.js.map +1 -0
- package/dist/agent/search/exactTarget.js +151 -0
- package/dist/agent/search/exactTarget.js.map +1 -0
- package/dist/agent/search/fragment.js +110 -0
- package/dist/agent/search/fragment.js.map +1 -0
- package/dist/agent/search/index.js +166 -0
- package/dist/agent/search/index.js.map +1 -0
- package/dist/agent/search/laneClassifier.js +119 -0
- package/dist/agent/search/laneClassifier.js.map +1 -0
- package/dist/agent/search/limits.js +10 -0
- package/dist/agent/search/limits.js.map +1 -0
- package/dist/agent/search/ranking.js +22 -0
- package/dist/agent/search/ranking.js.map +1 -0
- package/dist/agent/search/regex.js +83 -0
- package/dist/agent/search/regex.js.map +1 -0
- package/dist/agent/search/routePolicy.js +11 -0
- package/dist/agent/search/routePolicy.js.map +1 -0
- package/dist/agent/search/searchContext.js +128 -0
- package/dist/agent/search/searchContext.js.map +1 -0
- package/dist/agent/search/semantic.js +113 -0
- package/dist/agent/search/semantic.js.map +1 -0
- package/dist/agent/search/semanticIndexSearch.js +202 -0
- package/dist/agent/search/semanticIndexSearch.js.map +1 -0
- package/dist/agent/search/shared.js +283 -0
- package/dist/agent/search/shared.js.map +1 -0
- package/dist/agent/search/shell.js +202 -0
- package/dist/agent/search/shell.js.map +1 -0
- package/dist/agent/search/snippetEvidence.js +57 -0
- package/dist/agent/search/snippetEvidence.js.map +1 -0
- package/dist/agent/search/types.js +2 -0
- package/dist/agent/search/types.js.map +1 -0
- package/dist/agent/state/index.js +99 -0
- package/dist/agent/state/index.js.map +1 -0
- package/dist/agent/state/memory.js +56 -0
- package/dist/agent/state/memory.js.map +1 -0
- package/dist/agent/structuredOutput/index.js +28 -0
- package/dist/agent/structuredOutput/index.js.map +1 -0
- package/dist/agent/tools/index.js +199 -0
- package/dist/agent/tools/index.js.map +1 -0
- package/dist/agent/transform/index.js +519 -0
- package/dist/agent/transform/index.js.map +1 -0
- package/dist/agent/transform/syntax.js +49 -0
- package/dist/agent/transform/syntax.js.map +1 -0
- package/dist/agent/types.js +20 -0
- package/dist/agent/types.js.map +1 -0
- package/dist/agents/actionRegistry.js +114 -0
- package/dist/agents/actionRegistry.js.map +1 -0
- package/dist/agents/agent.js +5 -0
- package/dist/agents/agent.js.map +1 -0
- package/dist/agents/agentActions.js +5 -0
- package/dist/agents/agentActions.js.map +1 -0
- package/dist/agents/agentEvidence.js +5 -0
- package/dist/agents/agentEvidence.js.map +1 -0
- package/dist/agents/agentFeedback.js +5 -0
- package/dist/agents/agentFeedback.js.map +1 -0
- package/dist/agents/agentLogging.js +5 -0
- package/dist/agents/agentLogging.js.map +1 -0
- package/dist/agents/agentLoop.js +5 -0
- package/dist/agents/agentLoop.js.map +1 -0
- package/dist/agents/agentMemory.js +5 -0
- package/dist/agents/agentMemory.js.map +1 -0
- package/dist/agents/agentPlanMode.js +5 -0
- package/dist/agents/agentPlanMode.js.map +1 -0
- package/dist/agents/agentPolicyState.js +5 -0
- package/dist/agents/agentPolicyState.js.map +1 -0
- package/dist/agents/agentProgress.js +93 -0
- package/dist/agents/agentProgress.js.map +1 -0
- package/dist/agents/agentSchemas.js +5 -0
- package/dist/agents/agentSchemas.js.map +1 -0
- package/dist/agents/agentSearchScoring.js +5 -0
- package/dist/agents/agentSearchScoring.js.map +1 -0
- package/dist/agents/agentStateMachine.js +5 -0
- package/dist/agents/agentStateMachine.js.map +1 -0
- package/dist/agents/agentTools.js +5 -0
- package/dist/agents/agentTools.js.map +1 -0
- package/dist/agents/agentTypes.js +5 -0
- package/dist/agents/agentTypes.js.map +1 -0
- package/dist/agents/agentUnderstand.js +5 -0
- package/dist/agents/agentUnderstand.js.map +1 -0
- package/dist/agents/analysisPlanGenStep.js +194 -17
- package/dist/agents/analysisPlanGenStep.js.map +1 -0
- package/dist/agents/answerOnlyCompletion.js +32 -0
- package/dist/agents/answerOnlyCompletion.js.map +1 -0
- package/dist/agents/collaboratorStep.js +1 -0
- package/dist/agents/collaboratorStep.js.map +1 -0
- package/dist/agents/decideNextAction.js +444 -0
- package/dist/agents/decideNextAction.js.map +1 -0
- package/dist/agents/deriveFocusFromSearchStep.js +83 -0
- package/dist/agents/deriveFocusFromSearchStep.js.map +1 -0
- package/dist/agents/evidenceVerifierStep.js +104 -13
- package/dist/agents/evidenceVerifierStep.js.map +1 -0
- package/dist/agents/fileCheckStep.js +381 -12
- package/dist/agents/fileCheckStep.js.map +1 -0
- package/dist/agents/giveUpEvaluatorStep.js +63 -0
- package/dist/agents/giveUpEvaluatorStep.js.map +1 -0
- package/dist/agents/guardPolicy.js +20 -0
- package/dist/agents/guardPolicy.js.map +1 -0
- package/dist/agents/guards/executionPolicyResolver.js +165 -0
- package/dist/agents/guards/executionPolicyResolver.js.map +1 -0
- package/dist/agents/guards/guardState.js +195 -0
- package/dist/agents/guards/guardState.js.map +1 -0
- package/dist/agents/guards/resolveProgressState.js +403 -0
- package/dist/agents/guards/resolveProgressState.js.map +1 -0
- package/dist/agents/infoPlanGenStep.js +66 -8
- package/dist/agents/infoPlanGenStep.js.map +1 -0
- package/dist/agents/integrateFeedbackStep.js +1 -0
- package/dist/agents/integrateFeedbackStep.js.map +1 -0
- package/dist/agents/iterationFileSelector.js +8 -7
- package/dist/agents/iterationFileSelector.js.map +1 -0
- package/dist/agents/mainAgentActivityLog.js +85 -0
- package/dist/agents/mainAgentActivityLog.js.map +1 -0
- package/dist/agents/mainAgentHeuristics.js +173 -0
- package/dist/agents/mainAgentHeuristics.js.map +1 -0
- package/dist/agents/mainAgentVerify.js +159 -0
- package/dist/agents/mainAgentVerify.js.map +1 -0
- package/dist/agents/objectiveEvaluatorStep.js +103 -0
- package/dist/agents/objectiveEvaluatorStep.js.map +1 -0
- package/dist/agents/outerLoopRecoveryEvaluator.js +108 -0
- package/dist/agents/outerLoopRecoveryEvaluator.js.map +1 -0
- package/dist/agents/readinessGateStep.js +95 -9
- package/dist/agents/readinessGateStep.js.map +1 -0
- package/dist/agents/reasonNextStep.js +9 -8
- package/dist/agents/reasonNextStep.js.map +1 -0
- package/dist/agents/reasonNextTaskStep.js +267 -144
- package/dist/agents/reasonNextTaskStep.js.map +1 -0
- package/dist/agents/researchPlanGenStep.js +61 -25
- package/dist/agents/researchPlanGenStep.js.map +1 -0
- package/dist/agents/resolveAgentTargetClassification.js +5 -0
- package/dist/agents/resolveAgentTargetClassification.js.map +1 -0
- package/dist/agents/resolveExecutionModeStep.js +1 -0
- package/dist/agents/resolveExecutionModeStep.js.map +1 -0
- package/dist/agents/resolveExplicitTargetsStep.js +74 -0
- package/dist/agents/resolveExplicitTargetsStep.js.map +1 -0
- package/dist/agents/routingDecisionStep.js +58 -11
- package/dist/agents/routingDecisionStep.js.map +1 -0
- package/dist/agents/scopeClassificationStep.js +66 -3
- package/dist/agents/scopeClassificationStep.js.map +1 -0
- package/dist/agents/selectRelevantSourcesStep.js +13 -5
- package/dist/agents/selectRelevantSourcesStep.js.map +1 -0
- package/dist/agents/structuralPreloadStep.js +3 -4
- package/dist/agents/structuralPreloadStep.js.map +1 -0
- package/dist/agents/transformPlanGenStep.js +105 -18
- package/dist/agents/transformPlanGenStep.js.map +1 -0
- package/dist/agents/understandIntentStep.js +237 -17
- package/dist/agents/understandIntentStep.js.map +1 -0
- package/dist/agents/validateChangesStep.js +16 -2
- package/dist/agents/validateChangesStep.js.map +1 -0
- package/dist/agents/writeFileStep.js +1 -0
- package/dist/agents/writeFileStep.js.map +1 -0
- package/dist/commands/AskCmd.js +139 -44
- package/dist/commands/AskCmd.js.map +1 -0
- package/dist/commands/BackupCmd.js +1 -0
- package/dist/commands/BackupCmd.js.map +1 -0
- package/dist/commands/ChangeLogUpdateCmd.js +1 -0
- package/dist/commands/ChangeLogUpdateCmd.js.map +1 -0
- package/dist/commands/CommitSuggesterCmd.js +55 -13
- package/dist/commands/CommitSuggesterCmd.js.map +1 -0
- package/dist/commands/DaemonCmd.js +52 -14
- package/dist/commands/DaemonCmd.js.map +1 -0
- package/dist/commands/DeleteIndex.js +1 -0
- package/dist/commands/DeleteIndex.js.map +1 -0
- package/dist/commands/EvalReportCmd.js +374 -0
- package/dist/commands/EvalReportCmd.js.map +1 -0
- package/dist/commands/FindCmd.js +1 -0
- package/dist/commands/FindCmd.js.map +1 -0
- package/dist/commands/GitCmd.js +1 -0
- package/dist/commands/GitCmd.js.map +1 -0
- package/dist/commands/IndexCmd.js +11 -79
- package/dist/commands/IndexCmd.js.map +1 -0
- package/dist/commands/InspectCmd.js +1 -0
- package/dist/commands/InspectCmd.js.map +1 -0
- package/dist/commands/ModelCmd.js +24 -0
- package/dist/commands/ModelCmd.js.map +1 -0
- package/dist/commands/ReadlineSingleton.js +1 -0
- package/dist/commands/ReadlineSingleton.js.map +1 -0
- package/dist/commands/ResetDbCmd.js +18 -1
- package/dist/commands/ResetDbCmd.js.map +1 -0
- package/dist/commands/ReviewCmd.js +1 -0
- package/dist/commands/ReviewCmd.js.map +1 -0
- package/dist/commands/StatusCmd.js +22 -0
- package/dist/commands/StatusCmd.js.map +1 -0
- package/dist/commands/StopDaemonCmd.js +1 -0
- package/dist/commands/StopDaemonCmd.js.map +1 -0
- package/dist/commands/SummaryCmd.js +1 -0
- package/dist/commands/SummaryCmd.js.map +1 -0
- package/dist/commands/SwitchCmd.js +9 -15
- package/dist/commands/SwitchCmd.js.map +1 -0
- package/dist/commands/TasksCmd.js +142 -57
- package/dist/commands/TasksCmd.js.map +1 -0
- package/dist/commands/TestCmd.js +66 -0
- package/dist/commands/TestCmd.js.map +1 -0
- package/dist/commands/WorkflowCmd.js +1 -0
- package/dist/commands/WorkflowCmd.js.map +1 -0
- package/dist/commands/commandVisibility.js +27 -0
- package/dist/commands/commandVisibility.js.map +1 -0
- package/dist/commands/evalCommands.js +1337 -0
- package/dist/commands/evalCommands.js.map +1 -0
- package/dist/commands/factory.js +206 -38
- package/dist/commands/factory.js.map +1 -0
- package/dist/config.js +62 -11
- package/dist/config.js.map +1 -0
- package/dist/constants.js +21 -3
- package/dist/constants.js.map +1 -0
- package/dist/context.js +33 -32
- package/dist/context.js.map +1 -0
- package/dist/daemon/daemonQueues.js +1 -20
- package/dist/daemon/daemonQueues.js.map +1 -0
- package/dist/daemon/daemonWorker.js +26 -37
- package/dist/daemon/daemonWorker.js.map +1 -0
- package/dist/daemon/generateSummaries.js +1 -0
- package/dist/daemon/generateSummaries.js.map +1 -0
- package/dist/daemon/runFolderCapsuleBatch.js +1 -0
- package/dist/daemon/runFolderCapsuleBatch.js.map +1 -0
- package/dist/daemon/runIndexingBatch.js +1 -0
- package/dist/daemon/runIndexingBatch.js.map +1 -0
- package/dist/daemon/runKgBatch.js +9 -1
- package/dist/daemon/runKgBatch.js.map +1 -0
- package/dist/db/backup.js +1 -0
- package/dist/db/backup.js.map +1 -0
- package/dist/db/client.js +18 -3
- package/dist/db/client.js.map +1 -0
- package/dist/db/fileIndex.js +110 -152
- package/dist/db/fileIndex.js.map +1 -0
- package/dist/db/functionExtractors/extractFromJava.js +1 -0
- package/dist/db/functionExtractors/extractFromJava.js.map +1 -0
- package/dist/db/functionExtractors/extractFromJs.js +1 -0
- package/dist/db/functionExtractors/extractFromJs.js.map +1 -0
- package/dist/db/functionExtractors/extractFromTs.js +1 -0
- package/dist/db/functionExtractors/extractFromTs.js.map +1 -0
- package/dist/db/functionExtractors/extractFromXML.js +1 -0
- package/dist/db/functionExtractors/extractFromXML.js.map +1 -0
- package/dist/db/functionExtractors/index.js +1 -0
- package/dist/db/functionExtractors/index.js.map +1 -0
- package/dist/db/functionIndex.js +9 -0
- package/dist/db/functionIndex.js.map +1 -0
- package/dist/db/schema.js +314 -99
- package/dist/db/schema.js.map +1 -0
- package/dist/db/sqlTemplates.js +1 -0
- package/dist/db/sqlTemplates.js.map +1 -0
- package/dist/fileRules/builtins.js +1 -0
- package/dist/fileRules/builtins.js.map +1 -0
- package/dist/fileRules/classifyFile.js +1 -0
- package/dist/fileRules/classifyFile.js.map +1 -0
- package/dist/fileRules/codeAllowedExtensions.js +1 -0
- package/dist/fileRules/codeAllowedExtensions.js.map +1 -0
- package/dist/fileRules/detectFileType.js +1 -0
- package/dist/fileRules/detectFileType.js.map +1 -0
- package/dist/fileRules/fileClassifier.js +1 -0
- package/dist/fileRules/fileClassifier.js.map +1 -0
- package/dist/fileRules/fileExceptions.js +1 -0
- package/dist/fileRules/fileExceptions.js.map +1 -0
- package/dist/fileRules/ignoredExtensions.js +1 -0
- package/dist/fileRules/ignoredExtensions.js.map +1 -0
- package/dist/fileRules/ignoredPaths.js +48 -5
- package/dist/fileRules/ignoredPaths.js.map +1 -0
- package/dist/fileRules/queryTokenRules.js +176 -0
- package/dist/fileRules/queryTokenRules.js.map +1 -0
- package/dist/fileRules/searchPathClassification.js +58 -0
- package/dist/fileRules/searchPathClassification.js.map +1 -0
- package/dist/fileRules/shouldIgnoreFiles.js +1 -0
- package/dist/fileRules/shouldIgnoreFiles.js.map +1 -0
- package/dist/fileRules/stopWords.js +9 -0
- package/dist/fileRules/stopWords.js.map +1 -0
- package/dist/fileRules/wellKnownRepoFiles.js +1 -0
- package/dist/fileRules/wellKnownRepoFiles.js.map +1 -0
- package/dist/git/commitSummary.js +227 -0
- package/dist/git/commitSummary.js.map +1 -0
- package/dist/github/api.js +1 -0
- package/dist/github/api.js.map +1 -0
- package/dist/github/auth.js +1 -0
- package/dist/github/auth.js.map +1 -0
- package/dist/github/github.js +1 -0
- package/dist/github/github.js.map +1 -0
- package/dist/github/githubAuthCheck.js +1 -0
- package/dist/github/githubAuthCheck.js.map +1 -0
- package/dist/github/postComments.js +1 -0
- package/dist/github/postComments.js.map +1 -0
- package/dist/github/repo.js +15 -24
- package/dist/github/repo.js.map +1 -0
- package/dist/github/token.js +1 -0
- package/dist/github/token.js.map +1 -0
- package/dist/github/types.js +1 -0
- package/dist/github/types.js.map +1 -0
- package/dist/index.js +318 -37
- package/dist/index.js.map +1 -0
- package/dist/lib/generate.js +264 -20
- package/dist/lib/generate.js.map +1 -0
- package/dist/lib/generateFolderCapsules.js +1 -0
- package/dist/lib/generateFolderCapsules.js.map +1 -0
- package/dist/lib/ollamaModelPolicy.js +59 -0
- package/dist/lib/ollamaModelPolicy.js.map +1 -0
- package/dist/lib/spinner.js +29 -9
- package/dist/lib/spinner.js.map +1 -0
- package/dist/modelSetup.js +25 -78
- package/dist/modelSetup.js.map +1 -0
- package/dist/pipeline/modules/changeLogModule.js +10 -1
- package/dist/pipeline/modules/changeLogModule.js.map +1 -0
- package/dist/pipeline/modules/cleanupModule.js +1 -0
- package/dist/pipeline/modules/cleanupModule.js.map +1 -0
- package/dist/pipeline/modules/codeTransformModule.js +10 -16
- package/dist/pipeline/modules/codeTransformModule.js.map +1 -0
- package/dist/pipeline/modules/commentModule.js +12 -0
- package/dist/pipeline/modules/commentModule.js.map +1 -0
- package/dist/pipeline/modules/commitSuggesterModule.js +82 -12
- package/dist/pipeline/modules/commitSuggesterModule.js.map +1 -0
- package/dist/pipeline/modules/contextReviewModule.js +12 -1
- package/dist/pipeline/modules/contextReviewModule.js.map +1 -0
- package/dist/pipeline/modules/dialogAnswerModule.js +58 -0
- package/dist/pipeline/modules/dialogAnswerModule.js.map +1 -0
- package/dist/pipeline/modules/fileSearchModule.js +5 -143
- package/dist/pipeline/modules/fileSearchModule.js.map +1 -0
- package/dist/pipeline/modules/finalAnswerModule.js +1176 -151
- package/dist/pipeline/modules/finalAnswerModule.js.map +1 -0
- package/dist/pipeline/modules/kgModule.js +18 -1
- package/dist/pipeline/modules/kgModule.js.map +1 -0
- package/dist/pipeline/modules/planAnswerModule.js +99 -0
- package/dist/pipeline/modules/planAnswerModule.js.map +1 -0
- package/dist/pipeline/modules/readFileModule.js +300 -0
- package/dist/pipeline/modules/readFileModule.js.map +1 -0
- package/dist/pipeline/modules/reviewModule.js +10 -1
- package/dist/pipeline/modules/reviewModule.js.map +1 -0
- package/dist/pipeline/modules/searchDbModule.js +159 -0
- package/dist/pipeline/modules/searchDbModule.js.map +1 -0
- package/dist/pipeline/modules/searchListDirectoryModule.js +62 -0
- package/dist/pipeline/modules/searchListDirectoryModule.js.map +1 -0
- package/dist/pipeline/modules/searchModuleShared.js +71 -0
- package/dist/pipeline/modules/searchModuleShared.js.map +1 -0
- package/dist/pipeline/modules/searchRegexModule.js +59 -0
- package/dist/pipeline/modules/searchRegexModule.js.map +1 -0
- package/dist/pipeline/modules/semanticAnalysisModule.js +185 -28
- package/dist/pipeline/modules/semanticAnalysisModule.js.map +1 -0
- package/dist/pipeline/modules/summaryModule.js +11 -1
- package/dist/pipeline/modules/summaryModule.js.map +1 -0
- package/dist/pipeline/registry/moduleRegistry.js +9 -0
- package/dist/pipeline/registry/moduleRegistry.js.map +1 -0
- package/dist/pipeline/runModulePipeline.js +1 -0
- package/dist/pipeline/runModulePipeline.js.map +1 -0
- package/dist/scripts/dbScriptSupport.js +172 -0
- package/dist/scripts/dbScriptSupport.js.map +1 -0
- package/dist/scripts/dbcheck.js +173 -267
- package/dist/scripts/dbcheck.js.map +1 -0
- package/dist/scripts/dboverview.js +161 -0
- package/dist/scripts/dboverview.js.map +1 -0
- package/dist/scripts/migrateDb.js +1 -0
- package/dist/scripts/migrateDb.js.map +1 -0
- package/dist/search/SearchOrchestrator.js +928 -0
- package/dist/search/SearchOrchestrator.js.map +1 -0
- package/dist/search/sharedRankingPolicy.js +283 -0
- package/dist/search/sharedRankingPolicy.js.map +1 -0
- package/dist/setup/reindexOwner.js +97 -0
- package/dist/setup/reindexOwner.js.map +1 -0
- package/dist/setup/setupOwner.js +100 -0
- package/dist/setup/setupOwner.js.map +1 -0
- package/dist/shell/dialogUi.js +81 -0
- package/dist/shell/dialogUi.js.map +1 -0
- package/dist/shellSession.js +126 -0
- package/dist/shellSession.js.map +1 -0
- package/dist/status/statusOwner.js +239 -0
- package/dist/status/statusOwner.js.map +1 -0
- package/dist/testing/contextEval.js +514 -0
- package/dist/testing/contextEval.js.map +1 -0
- package/dist/testing/fixtures/transform/small-file.input.js +5 -0
- package/dist/testing/fixtures/transform/small-file.input.js.map +1 -0
- package/dist/testing/harnessArtifacts.js +112 -0
- package/dist/testing/harnessArtifacts.js.map +1 -0
- package/dist/testing/llmTraceSession.js +67 -0
- package/dist/testing/llmTraceSession.js.map +1 -0
- package/dist/testing/registerDevCliCommands.js +43 -0
- package/dist/testing/registerDevCliCommands.js.map +1 -0
- package/dist/testing/runDiagnosis.js +248 -0
- package/dist/testing/runDiagnosis.js.map +1 -0
- package/dist/testing/runtimeLogReader.js +144 -0
- package/dist/testing/runtimeLogReader.js.map +1 -0
- package/dist/testing/testCommands.js +35 -303
- package/dist/testing/testCommands.js.map +1 -0
- package/dist/testing/testRegistry.js +233 -0
- package/dist/testing/testRegistry.js.map +1 -0
- package/dist/types.js +1 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/buildContextualPrompt.js +26 -75
- package/dist/utils/buildContextualPrompt.js.map +1 -0
- package/dist/utils/changeLogPrompt.js +1 -0
- package/dist/utils/changeLogPrompt.js.map +1 -0
- package/dist/utils/checkModel.js +17 -92
- package/dist/utils/checkModel.js.map +1 -0
- package/dist/utils/commentMap.js +1 -0
- package/dist/utils/commentMap.js.map +1 -0
- package/dist/utils/compileSearchQuery.js +23 -9
- package/dist/utils/compileSearchQuery.js.map +1 -0
- package/dist/utils/consolePresentation.js +208 -0
- package/dist/utils/consolePresentation.js.map +1 -0
- package/dist/utils/contentUtils.js +17 -2
- package/dist/utils/contentUtils.js.map +1 -0
- package/dist/utils/debugContext.js +1 -0
- package/dist/utils/debugContext.js.map +1 -0
- package/dist/utils/dialogState.js +201 -0
- package/dist/utils/dialogState.js.map +1 -0
- package/dist/utils/editor.js +1 -0
- package/dist/utils/editor.js.map +1 -0
- package/dist/utils/executionEvidence.js +50 -0
- package/dist/utils/executionEvidence.js.map +1 -0
- package/dist/utils/extractFileReferences.js +140 -6
- package/dist/utils/extractFileReferences.js.map +1 -0
- package/dist/utils/fileEvidenceCache.js +50 -0
- package/dist/utils/fileEvidenceCache.js.map +1 -0
- package/dist/utils/fileTree.js +1 -0
- package/dist/utils/fileTree.js.map +1 -0
- package/dist/utils/loadRelevantFolderCapsules.js +35 -5
- package/dist/utils/loadRelevantFolderCapsules.js.map +1 -0
- package/dist/utils/log.js +10 -1
- package/dist/utils/log.js.map +1 -0
- package/dist/utils/normalizeData.js +1 -0
- package/dist/utils/normalizeData.js.map +1 -0
- package/dist/utils/ollamaModelStatus.js +28 -0
- package/dist/utils/ollamaModelStatus.js.map +1 -0
- package/dist/utils/ollamaService.js +294 -0
- package/dist/utils/ollamaService.js.map +1 -0
- package/dist/utils/outputFormatter.js +1 -0
- package/dist/utils/outputFormatter.js.map +1 -0
- package/dist/utils/parseTaggedContent.js +1 -0
- package/dist/utils/parseTaggedContent.js.map +1 -0
- package/dist/utils/planActions.js +27 -46
- package/dist/utils/planActions.js.map +1 -0
- package/dist/utils/promptBuilderHelper.js +1 -0
- package/dist/utils/promptBuilderHelper.js.map +1 -0
- package/dist/utils/promptLogHelper.js +29 -13
- package/dist/utils/promptLogHelper.js.map +1 -0
- package/dist/utils/queryAnchors.js +71 -0
- package/dist/utils/queryAnchors.js.map +1 -0
- package/dist/utils/repoIdentity.js +82 -0
- package/dist/utils/repoIdentity.js.map +1 -0
- package/dist/utils/repoKey.js +1 -0
- package/dist/utils/repoKey.js.map +1 -0
- package/dist/utils/resolveTargetsToFiles.js +1 -0
- package/dist/utils/resolveTargetsToFiles.js.map +1 -0
- package/dist/utils/resumeContext.js +219 -0
- package/dist/utils/resumeContext.js.map +1 -0
- package/dist/utils/resumeState.js +310 -0
- package/dist/utils/resumeState.js.map +1 -0
- package/dist/utils/rollingPlan.js +118 -0
- package/dist/utils/rollingPlan.js.map +1 -0
- package/dist/utils/runQueryWithDaemonControl.js +11 -3
- package/dist/utils/runQueryWithDaemonControl.js.map +1 -0
- package/dist/utils/runtimeLogger.js +252 -0
- package/dist/utils/runtimeLogger.js.map +1 -0
- package/dist/utils/sanitizeQuery.js +1 -0
- package/dist/utils/sanitizeQuery.js.map +1 -0
- package/dist/utils/sharedUtils.js +1 -0
- package/dist/utils/sharedUtils.js.map +1 -0
- package/dist/utils/sleep.js +1 -0
- package/dist/utils/sleep.js.map +1 -0
- package/dist/utils/splitCodeIntoChunk.js +1 -0
- package/dist/utils/splitCodeIntoChunk.js.map +1 -0
- package/dist/utils/time.js +66 -0
- package/dist/utils/time.js.map +1 -0
- package/dist/utils/verifyFocusPreference.js +107 -0
- package/dist/utils/verifyFocusPreference.js.map +1 -0
- package/dist/utils/vscode.js +1 -0
- package/dist/utils/vscode.js.map +1 -0
- package/dist/workflow/workflowResolver.js +1 -0
- package/dist/workflow/workflowResolver.js.map +1 -0
- package/dist/workflow/workflowRunner.js +1 -0
- package/dist/workflow/workflowRunner.js.map +1 -0
- package/package.json +3 -3
- package/dist/agents/MainAgent.js +0 -1886
- package/dist/agents/contextReviewStep.js +0 -101
- package/dist/agents/finalPlanGenStep.js +0 -107
- package/dist/agents/structuralAnalysisStep.js +0 -46
- package/dist/agents/validationAnalysisStep.js +0 -87
- package/dist/pipeline/modules/chunkManagerModule.js +0 -24
- package/dist/pipeline/modules/cleanGeneratedTestsModule.js +0 -33
- package/dist/pipeline/modules/fileReaderModule.js +0 -72
- package/dist/pipeline/modules/gatherInfoModule.js +0 -181
- package/dist/pipeline/modules/generateTestsModule.js +0 -68
- package/dist/pipeline/modules/preserveCodeModule.js +0 -195
- package/dist/pipeline/modules/refactorModule.js +0 -40
- package/dist/pipeline/modules/repairTestsModule.js +0 -48
- package/dist/pipeline/modules/runTestsModule.js +0 -37
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import fs from "fs";
|
|
2
|
+
/**
|
|
3
|
+
* Refactor note:
|
|
4
|
+
* - Deterministic completion evaluator (regex/exact-value criteria).
|
|
5
|
+
* - Runs after transform to decide "done" without relying on file coverage.
|
|
6
|
+
* - Why it exists: stop as soon as objective is satisfied.
|
|
7
|
+
*/
|
|
8
|
+
function evaluateRegexCriterion(criterion) {
|
|
9
|
+
let source = "";
|
|
10
|
+
try {
|
|
11
|
+
source = fs.readFileSync(criterion.filePath, "utf-8");
|
|
12
|
+
}
|
|
13
|
+
catch (err) {
|
|
14
|
+
return {
|
|
15
|
+
filePath: criterion.filePath,
|
|
16
|
+
pattern: criterion.pattern,
|
|
17
|
+
flags: criterion.flags,
|
|
18
|
+
matches: 0,
|
|
19
|
+
error: `failed to read file: ${err.message}`,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
try {
|
|
23
|
+
// Always enforce "g" so we can count every match deterministically.
|
|
24
|
+
// Example: /\"version\"\\s*:\\s*\"1\\.2\\.5\"/m.
|
|
25
|
+
const baseFlags = criterion.flags ?? "";
|
|
26
|
+
const flags = baseFlags.includes("g") ? baseFlags : `${baseFlags}g`;
|
|
27
|
+
const re = new RegExp(criterion.pattern, flags);
|
|
28
|
+
const scopedSource = criterion.scope === "line" ? source.split("\n").join("\n") : source;
|
|
29
|
+
const matches = Array.from(scopedSource.matchAll(re));
|
|
30
|
+
return {
|
|
31
|
+
filePath: criterion.filePath,
|
|
32
|
+
pattern: criterion.pattern,
|
|
33
|
+
flags,
|
|
34
|
+
matches: matches.length,
|
|
35
|
+
captures: matches
|
|
36
|
+
.flatMap((match) => match.slice(1))
|
|
37
|
+
.filter((capture) => typeof capture === "string")
|
|
38
|
+
.slice(0, 12),
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
catch (err) {
|
|
42
|
+
return {
|
|
43
|
+
filePath: criterion.filePath,
|
|
44
|
+
pattern: criterion.pattern,
|
|
45
|
+
flags: criterion.flags,
|
|
46
|
+
matches: 0,
|
|
47
|
+
error: `invalid regex: ${err.message}`,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
function evaluateExactValueCriterion(criterion) {
|
|
52
|
+
try {
|
|
53
|
+
const source = fs.readFileSync(criterion.filePath, "utf-8");
|
|
54
|
+
const mustContain = criterion.mustContain !== false;
|
|
55
|
+
const hasValue = source.includes(criterion.value);
|
|
56
|
+
return {
|
|
57
|
+
filePath: criterion.filePath,
|
|
58
|
+
pattern: criterion.value,
|
|
59
|
+
matches: mustContain ? (hasValue ? 1 : 0) : (hasValue ? 0 : 1),
|
|
60
|
+
captures: [],
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
catch (err) {
|
|
64
|
+
return {
|
|
65
|
+
filePath: criterion.filePath,
|
|
66
|
+
pattern: criterion.value,
|
|
67
|
+
matches: 0,
|
|
68
|
+
error: `failed to read file: ${err.message}`,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
export function runObjectiveEvaluator(context) {
|
|
73
|
+
const objective = context.analysis?.objective;
|
|
74
|
+
const criteria = objective?.successCriteria ?? [];
|
|
75
|
+
if (criteria.length === 0) {
|
|
76
|
+
return {
|
|
77
|
+
status: "inconclusive",
|
|
78
|
+
rationale: "No success criteria configured",
|
|
79
|
+
evidence: [],
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
const evidence = criteria.map((criterion) => criterion.type === "regex"
|
|
83
|
+
? evaluateRegexCriterion(criterion)
|
|
84
|
+
: evaluateExactValueCriterion(criterion));
|
|
85
|
+
const failed = criteria.filter((criterion, index) => {
|
|
86
|
+
const ev = evidence[index];
|
|
87
|
+
if (ev.error)
|
|
88
|
+
return true;
|
|
89
|
+
if (criterion.type === "regex") {
|
|
90
|
+
const mustMatch = criterion.mustMatch !== false;
|
|
91
|
+
return mustMatch ? ev.matches <= 0 : ev.matches > 0;
|
|
92
|
+
}
|
|
93
|
+
const mustContain = criterion.mustContain !== false;
|
|
94
|
+
return mustContain ? ev.matches <= 0 : ev.matches > 0;
|
|
95
|
+
});
|
|
96
|
+
const status = failed.length === 0 ? "satisfied" : "unsatisfied";
|
|
97
|
+
// Example: 1 failed criterion out of 3 => unsatisfied.
|
|
98
|
+
const rationale = status === "satisfied"
|
|
99
|
+
? "All objective criteria satisfied deterministically"
|
|
100
|
+
: `${failed.length}/${criteria.length} objective criteria are unresolved`;
|
|
101
|
+
return { status, rationale, evidence };
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=objectiveEvaluatorStep.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"objectiveEvaluatorStep.js","sourceRoot":"","sources":["../../src/agents/objectiveEvaluatorStep.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from \"fs\";\nimport type {\n ObjectiveEvaluationResult,\n RegexEvidence,\n StructuredContext,\n SuccessCriterion,\n} from \"../types.js\";\n\n/**\n * Refactor note:\n * - Deterministic completion evaluator (regex/exact-value criteria).\n * - Runs after transform to decide \"done\" without relying on file coverage.\n * - Why it exists: stop as soon as objective is satisfied.\n */\nfunction evaluateRegexCriterion(criterion: Extract<SuccessCriterion, { type: \"regex\" }>): RegexEvidence {\n let source = \"\";\n try {\n source = fs.readFileSync(criterion.filePath, \"utf-8\");\n } catch (err) {\n return {\n filePath: criterion.filePath,\n pattern: criterion.pattern,\n flags: criterion.flags,\n matches: 0,\n error: `failed to read file: ${(err as Error).message}`,\n };\n }\n\n try {\n // Always enforce \"g\" so we can count every match deterministically.\n // Example: /\\\"version\\\"\\\\s*:\\\\s*\\\"1\\\\.2\\\\.5\\\"/m.\n const baseFlags = criterion.flags ?? \"\";\n const flags = baseFlags.includes(\"g\") ? baseFlags : `${baseFlags}g`;\n const re = new RegExp(criterion.pattern, flags);\n const scopedSource =\n criterion.scope === \"line\" ? source.split(\"\\n\").join(\"\\n\") : source;\n const matches = Array.from(scopedSource.matchAll(re));\n return {\n filePath: criterion.filePath,\n pattern: criterion.pattern,\n flags,\n matches: matches.length,\n captures: matches\n .flatMap((match) => match.slice(1))\n .filter((capture): capture is string => typeof capture === \"string\")\n .slice(0, 12),\n };\n } catch (err) {\n return {\n filePath: criterion.filePath,\n pattern: criterion.pattern,\n flags: criterion.flags,\n matches: 0,\n error: `invalid regex: ${(err as Error).message}`,\n };\n }\n}\n\nfunction evaluateExactValueCriterion(criterion: Extract<SuccessCriterion, { type: \"exact-value\" }>): RegexEvidence {\n try {\n const source = fs.readFileSync(criterion.filePath, \"utf-8\");\n const mustContain = criterion.mustContain !== false;\n const hasValue = source.includes(criterion.value);\n return {\n filePath: criterion.filePath,\n pattern: criterion.value,\n matches: mustContain ? (hasValue ? 1 : 0) : (hasValue ? 0 : 1),\n captures: [],\n };\n } catch (err) {\n return {\n filePath: criterion.filePath,\n pattern: criterion.value,\n matches: 0,\n error: `failed to read file: ${(err as Error).message}`,\n };\n }\n}\n\nexport function runObjectiveEvaluator(context: StructuredContext): ObjectiveEvaluationResult {\n const objective = context.analysis?.objective;\n const criteria = objective?.successCriteria ?? [];\n if (criteria.length === 0) {\n return {\n status: \"inconclusive\",\n rationale: \"No success criteria configured\",\n evidence: [],\n };\n }\n\n const evidence: RegexEvidence[] = criteria.map((criterion) =>\n criterion.type === \"regex\"\n ? evaluateRegexCriterion(criterion)\n : evaluateExactValueCriterion(criterion)\n );\n\n const failed = criteria.filter((criterion, index) => {\n const ev = evidence[index];\n if (ev.error) return true;\n if (criterion.type === \"regex\") {\n const mustMatch = criterion.mustMatch !== false;\n return mustMatch ? ev.matches <= 0 : ev.matches > 0;\n }\n const mustContain = criterion.mustContain !== false;\n return mustContain ? ev.matches <= 0 : ev.matches > 0;\n });\n\n const status = failed.length === 0 ? \"satisfied\" : \"unsatisfied\";\n // Example: 1 failed criterion out of 3 => unsatisfied.\n const rationale =\n status === \"satisfied\"\n ? \"All objective criteria satisfied deterministically\"\n : `${failed.length}/${criteria.length} objective criteria are unresolved`;\n\n return { status, rationale, evidence };\n}\n"]}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Evaluates the latest small-action result against the active objective.
|
|
3
|
+
*
|
|
4
|
+
* Why this file exists:
|
|
5
|
+
* - the inner loop should only execute local work and return facts
|
|
6
|
+
* - the outer loop should own target truth, scope recovery, and completion decisions
|
|
7
|
+
* - quick reads, validation, verify, and progress all need one shared recovery decision
|
|
8
|
+
*/
|
|
9
|
+
import path from "path";
|
|
10
|
+
export function evaluateOuterLoopRecovery(args) {
|
|
11
|
+
const { context, sourceAction } = args;
|
|
12
|
+
const evaluatedAt = new Date().toISOString();
|
|
13
|
+
const progress = context.analysis?.progressState;
|
|
14
|
+
const targetFile = normalizeRecoveryTargetFile(args.targetFile ?? getCurrentTargetFile(context));
|
|
15
|
+
const validation = targetFile ? getValidationForFile(context, targetFile) : undefined;
|
|
16
|
+
const readResult = targetFile ? context.analysis?.readResults?.byFile?.[targetFile] : undefined;
|
|
17
|
+
const completeDecision = buildDecision("complete", "Objective and completion facts already say the task is done.", sourceAction, evaluatedAt, targetFile);
|
|
18
|
+
if (isObjectiveSatisfied(context, progress)) {
|
|
19
|
+
return completeDecision;
|
|
20
|
+
}
|
|
21
|
+
if (targetFile && hasFollowUpRetargetedAway(context, targetFile)) {
|
|
22
|
+
return buildDecision("rework-scope", `The active objective no longer points at ${path.basename(targetFile)}.`, sourceAction, evaluatedAt, targetFile);
|
|
23
|
+
}
|
|
24
|
+
if (targetFile && validation?.status === "invalid" && validation.requiresRedo !== true) {
|
|
25
|
+
return buildDecision("rework-scope", `Validation shows ${path.basename(targetFile)} is not a usable target anymore.`, sourceAction, evaluatedAt, targetFile);
|
|
26
|
+
}
|
|
27
|
+
if (targetFile && readResult) {
|
|
28
|
+
if (readResult.status === "missing-working-file" || readResult.status === "error") {
|
|
29
|
+
return buildDecision("redo-step", `The quick read for ${path.basename(targetFile)} could not run locally yet.`, sourceAction, evaluatedAt, targetFile);
|
|
30
|
+
}
|
|
31
|
+
if (readResult.missingFacts.length > 0) {
|
|
32
|
+
const foundFacts = readResult.facts.filter((fact) => fact.found).length;
|
|
33
|
+
if (readResult.queryFit.judgment === "wrong-shape") {
|
|
34
|
+
return buildDecision("rework-scope", `Quick read shows ${path.basename(targetFile)} is the wrong file shape for the active objective.`, sourceAction, evaluatedAt, targetFile);
|
|
35
|
+
}
|
|
36
|
+
if (foundFacts === 0 && readResult.queryFit.judgment !== "strong" && readResult.queryFit.judgment !== "partial") {
|
|
37
|
+
return buildDecision("rework-scope", `Quick read found none of the required facts in ${path.basename(targetFile)}.`, sourceAction, evaluatedAt, targetFile);
|
|
38
|
+
}
|
|
39
|
+
return buildDecision("expand-scope", `Quick read found some useful signals in ${path.basename(targetFile)}, but nearby evidence is still needed.`, sourceAction, evaluatedAt, targetFile);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
if (validation?.requiresRedo) {
|
|
43
|
+
return buildDecision("redo-step", `Validation still needs another pass on ${path.basename(targetFile ?? "current target")}.`, sourceAction, evaluatedAt, targetFile);
|
|
44
|
+
}
|
|
45
|
+
if (targetFile && shouldReworkFromStall(context, targetFile)) {
|
|
46
|
+
return buildDecision("rework-scope", `Recent work on ${path.basename(targetFile)} is stalled without useful progress.`, sourceAction, evaluatedAt, targetFile);
|
|
47
|
+
}
|
|
48
|
+
if (targetFile && shouldExpandAroundCurrentTarget(context, targetFile, progress)) {
|
|
49
|
+
return buildDecision("expand-scope", `The current target still fits, but more nearby evidence is needed before the next move.`, sourceAction, evaluatedAt, targetFile);
|
|
50
|
+
}
|
|
51
|
+
return buildDecision("continue", "The current target still fits the active objective.", sourceAction, evaluatedAt, targetFile);
|
|
52
|
+
}
|
|
53
|
+
function buildDecision(decision, reason, sourceAction, evaluatedAt, targetFile) {
|
|
54
|
+
return {
|
|
55
|
+
decision,
|
|
56
|
+
reason,
|
|
57
|
+
targetFile,
|
|
58
|
+
evaluatedAt,
|
|
59
|
+
sourceAction,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
function isObjectiveSatisfied(context, progress) {
|
|
63
|
+
return (context.analysis?.objectiveEvaluation?.status === "satisfied" ||
|
|
64
|
+
context.analysis?.objective?.completionStatus === "satisfied" ||
|
|
65
|
+
progress?.completion.eligible === true);
|
|
66
|
+
}
|
|
67
|
+
function getCurrentTargetFile(context) {
|
|
68
|
+
const lockFiles = context.analysis?.focus?.executionLock?.files ?? [];
|
|
69
|
+
if (lockFiles.length === 1)
|
|
70
|
+
return normalizeRecoveryTargetFile(lockFiles[0]);
|
|
71
|
+
return normalizeRecoveryTargetFile(context.task?.currentStep?.filePath ?? context.currentStep?.targetFile);
|
|
72
|
+
}
|
|
73
|
+
function normalizeRecoveryTargetFile(targetFile) {
|
|
74
|
+
if (!targetFile || targetFile.startsWith("__research__/")) {
|
|
75
|
+
return undefined;
|
|
76
|
+
}
|
|
77
|
+
return targetFile;
|
|
78
|
+
}
|
|
79
|
+
function getValidationForFile(context, filePath) {
|
|
80
|
+
return (context.analysis?.executionOutcome?.validations ?? []).find((entry) => entry.filePath === filePath);
|
|
81
|
+
}
|
|
82
|
+
function hasFollowUpRetargetedAway(context, targetFile) {
|
|
83
|
+
const resolvedTargets = context.analysis?.focus?.resolvedTargetFiles ??
|
|
84
|
+
context.analysis?.intent?.resolvedTargetFiles ??
|
|
85
|
+
[];
|
|
86
|
+
return resolvedTargets.length > 0 && !resolvedTargets.includes(targetFile);
|
|
87
|
+
}
|
|
88
|
+
function shouldReworkFromStall(context, targetFile) {
|
|
89
|
+
const lock = context.analysis?.focus?.executionLock;
|
|
90
|
+
if (!lock?.enabled || !lock.files.includes(targetFile)) {
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
const recentEntries = context.analysis?.recentActionWindow?.entries ?? [];
|
|
94
|
+
const targetEntries = recentEntries.filter((entry) => entry.target === targetFile || entry.touchedFiles?.includes(targetFile));
|
|
95
|
+
const stalledEntries = targetEntries.filter((entry) => entry.outcome === "empty" || entry.outcome === "failed");
|
|
96
|
+
return stalledEntries.length >= 2;
|
|
97
|
+
}
|
|
98
|
+
function shouldExpandAroundCurrentTarget(context, targetFile, progress) {
|
|
99
|
+
if (!progress)
|
|
100
|
+
return false;
|
|
101
|
+
if (progress.optionalTargets.length > 0) {
|
|
102
|
+
return true;
|
|
103
|
+
}
|
|
104
|
+
const verify = context.analysis?.verify?.byFile?.[targetFile];
|
|
105
|
+
const fileConfidence = verify?.fileConfidence ?? 0;
|
|
106
|
+
return fileConfidence > 0 && fileConfidence < 0.55 && progress.completion.eligible === false;
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=outerLoopRecoveryEvaluator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outerLoopRecoveryEvaluator.js","sourceRoot":"","sources":["../../src/agents/outerLoopRecoveryEvaluator.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Evaluates the latest small-action result against the active objective.\n *\n * Why this file exists:\n * - the inner loop should only execute local work and return facts\n * - the outer loop should own target truth, scope recovery, and completion decisions\n * - quick reads, validation, verify, and progress all need one shared recovery decision\n */\nimport path from \"path\";\nimport type {\n ChangeValidation,\n OuterLoopRecoveryDecision,\n ProgressState,\n RecoveryEvaluationState,\n StructuredContext,\n} from \"../types.js\";\n\nexport interface OuterLoopRecoveryEvaluatorArgs {\n context: StructuredContext;\n sourceAction: string;\n targetFile?: string;\n}\n\nexport function evaluateOuterLoopRecovery(\n args: OuterLoopRecoveryEvaluatorArgs\n): RecoveryEvaluationState {\n const { context, sourceAction } = args;\n const evaluatedAt = new Date().toISOString();\n const progress = context.analysis?.progressState;\n const targetFile = normalizeRecoveryTargetFile(args.targetFile ?? getCurrentTargetFile(context));\n const validation = targetFile ? getValidationForFile(context, targetFile) : undefined;\n const readResult = targetFile ? context.analysis?.readResults?.byFile?.[targetFile] : undefined;\n\n const completeDecision = buildDecision(\n \"complete\",\n \"Objective and completion facts already say the task is done.\",\n sourceAction,\n evaluatedAt,\n targetFile\n );\n if (isObjectiveSatisfied(context, progress)) {\n return completeDecision;\n }\n\n if (targetFile && hasFollowUpRetargetedAway(context, targetFile)) {\n return buildDecision(\n \"rework-scope\",\n `The active objective no longer points at ${path.basename(targetFile)}.`,\n sourceAction,\n evaluatedAt,\n targetFile\n );\n }\n\n if (targetFile && validation?.status === \"invalid\" && validation.requiresRedo !== true) {\n return buildDecision(\n \"rework-scope\",\n `Validation shows ${path.basename(targetFile)} is not a usable target anymore.`,\n sourceAction,\n evaluatedAt,\n targetFile\n );\n }\n\n if (targetFile && readResult) {\n if (readResult.status === \"missing-working-file\" || readResult.status === \"error\") {\n return buildDecision(\n \"redo-step\",\n `The quick read for ${path.basename(targetFile)} could not run locally yet.`,\n sourceAction,\n evaluatedAt,\n targetFile\n );\n }\n\n if (readResult.missingFacts.length > 0) {\n const foundFacts = readResult.facts.filter((fact) => fact.found).length;\n if (readResult.queryFit.judgment === \"wrong-shape\") {\n return buildDecision(\n \"rework-scope\",\n `Quick read shows ${path.basename(targetFile)} is the wrong file shape for the active objective.`,\n sourceAction,\n evaluatedAt,\n targetFile\n );\n }\n\n if (foundFacts === 0 && readResult.queryFit.judgment !== \"strong\" && readResult.queryFit.judgment !== \"partial\") {\n return buildDecision(\n \"rework-scope\",\n `Quick read found none of the required facts in ${path.basename(targetFile)}.`,\n sourceAction,\n evaluatedAt,\n targetFile\n );\n }\n\n return buildDecision(\n \"expand-scope\",\n `Quick read found some useful signals in ${path.basename(targetFile)}, but nearby evidence is still needed.`,\n sourceAction,\n evaluatedAt,\n targetFile\n );\n }\n }\n\n if (validation?.requiresRedo) {\n return buildDecision(\n \"redo-step\",\n `Validation still needs another pass on ${path.basename(targetFile ?? \"current target\")}.`,\n sourceAction,\n evaluatedAt,\n targetFile\n );\n }\n\n if (targetFile && shouldReworkFromStall(context, targetFile)) {\n return buildDecision(\n \"rework-scope\",\n `Recent work on ${path.basename(targetFile)} is stalled without useful progress.`,\n sourceAction,\n evaluatedAt,\n targetFile\n );\n }\n\n if (targetFile && shouldExpandAroundCurrentTarget(context, targetFile, progress)) {\n return buildDecision(\n \"expand-scope\",\n `The current target still fits, but more nearby evidence is needed before the next move.`,\n sourceAction,\n evaluatedAt,\n targetFile\n );\n }\n\n return buildDecision(\n \"continue\",\n \"The current target still fits the active objective.\",\n sourceAction,\n evaluatedAt,\n targetFile\n );\n}\n\nfunction buildDecision(\n decision: OuterLoopRecoveryDecision,\n reason: string,\n sourceAction: string,\n evaluatedAt: string,\n targetFile?: string\n): RecoveryEvaluationState {\n return {\n decision,\n reason,\n targetFile,\n evaluatedAt,\n sourceAction,\n };\n}\n\nfunction isObjectiveSatisfied(context: StructuredContext, progress?: ProgressState): boolean {\n return (\n context.analysis?.objectiveEvaluation?.status === \"satisfied\" ||\n context.analysis?.objective?.completionStatus === \"satisfied\" ||\n progress?.completion.eligible === true\n );\n}\n\nfunction getCurrentTargetFile(context: StructuredContext): string | undefined {\n const lockFiles = context.analysis?.focus?.executionLock?.files ?? [];\n if (lockFiles.length === 1) return normalizeRecoveryTargetFile(lockFiles[0]);\n return normalizeRecoveryTargetFile(context.task?.currentStep?.filePath ?? context.currentStep?.targetFile);\n}\n\nfunction normalizeRecoveryTargetFile(targetFile: string | undefined): string | undefined {\n if (!targetFile || targetFile.startsWith(\"__research__/\")) {\n return undefined;\n }\n return targetFile;\n}\n\nfunction getValidationForFile(context: StructuredContext, filePath: string): ChangeValidation | undefined {\n return (context.analysis?.executionOutcome?.validations ?? []).find((entry) => entry.filePath === filePath);\n}\n\nfunction hasFollowUpRetargetedAway(context: StructuredContext, targetFile: string): boolean {\n const resolvedTargets =\n context.analysis?.focus?.resolvedTargetFiles ??\n context.analysis?.intent?.resolvedTargetFiles ??\n [];\n return resolvedTargets.length > 0 && !resolvedTargets.includes(targetFile);\n}\n\nfunction shouldReworkFromStall(context: StructuredContext, targetFile: string): boolean {\n const lock = context.analysis?.focus?.executionLock;\n if (!lock?.enabled || !lock.files.includes(targetFile)) {\n return false;\n }\n\n const recentEntries = context.analysis?.recentActionWindow?.entries ?? [];\n const targetEntries = recentEntries.filter((entry) => entry.target === targetFile || entry.touchedFiles?.includes(targetFile));\n const stalledEntries = targetEntries.filter((entry) => entry.outcome === \"empty\" || entry.outcome === \"failed\");\n return stalledEntries.length >= 2;\n}\n\nfunction shouldExpandAroundCurrentTarget(\n context: StructuredContext,\n targetFile: string,\n progress?: ProgressState\n): boolean {\n if (!progress) return false;\n if (progress.optionalTargets.length > 0) {\n return true;\n }\n\n const verify = context.analysis?.verify?.byFile?.[targetFile];\n const fileConfidence = verify?.fileConfidence ?? 0;\n return fileConfidence > 0 && fileConfidence < 0.55 && progress.completion.eligible === false;\n}\n"]}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
import { generate } from '../lib/generate.js';
|
|
3
3
|
import { cleanupModule } from '../pipeline/modules/cleanupModule.js';
|
|
4
4
|
import { logInputOutput } from '../utils/promptLogHelper.js';
|
|
5
|
+
import { countDomainAnchorHits, extractDomainAnchors } from '../utils/queryAnchors.js';
|
|
5
6
|
export const readinessGateStep = {
|
|
6
7
|
name: 'readinessGate',
|
|
7
8
|
description: 'Determines if there is sufficient evidence to safely proceed with analysis or transformation.',
|
|
@@ -9,7 +10,7 @@ export const readinessGateStep = {
|
|
|
9
10
|
requires: ['userQuery', 'intent'],
|
|
10
11
|
produces: ['analysis.readiness'],
|
|
11
12
|
async run(context) {
|
|
12
|
-
var _a, _b, _c, _d;
|
|
13
|
+
var _a, _b, _c, _d, _e;
|
|
13
14
|
context.analysis || (context.analysis = {});
|
|
14
15
|
(_a = context.analysis).focus || (_a.focus = { selectedFiles: [], candidateFiles: [], rationale: '' });
|
|
15
16
|
(_b = context.analysis).fileAnalysis || (_b.fileAnalysis = {});
|
|
@@ -20,9 +21,35 @@ export const readinessGateStep = {
|
|
|
20
21
|
rationale: '',
|
|
21
22
|
});
|
|
22
23
|
const focus = context.analysis.focus;
|
|
24
|
+
let readinessCallId;
|
|
23
25
|
const verifyByFile = context.analysis.verify?.byFile ?? {};
|
|
26
|
+
const executionPolicy = context.analysis.executionPolicy;
|
|
27
|
+
const executionLock = executionPolicy?.executionLock;
|
|
28
|
+
(_d = context.analysis).readinessGuard || (_d.readinessGuard = { weakAlignmentExpansionForced: false });
|
|
24
29
|
// ---------------- EVIDENCE COLLECTION ----------------
|
|
25
|
-
const selectedFiles =
|
|
30
|
+
const selectedFiles = executionPolicy?.executionRequired?.length
|
|
31
|
+
? executionPolicy.executionRequired
|
|
32
|
+
: focus.selectedFiles ?? [];
|
|
33
|
+
const domainAnchors = extractDomainAnchors(context.initContext?.userQuery ?? "");
|
|
34
|
+
const hasHighQualityAnchor = selectedFiles.some((filePath) => fileHasHighQualityAnchor(filePath, verifyByFile[filePath], domainAnchors));
|
|
35
|
+
// Resolver-based lock override: execution lane is ready even if exploration lane is weak.
|
|
36
|
+
if (executionPolicy?.executionReady &&
|
|
37
|
+
executionLock?.enabled &&
|
|
38
|
+
executionLock.files.length > 0) {
|
|
39
|
+
context.analysis.readiness = {
|
|
40
|
+
decision: "ready",
|
|
41
|
+
reason: "sufficient-evidence",
|
|
42
|
+
confidence: 0.97,
|
|
43
|
+
rationale: `Execution lock active for ${executionLock.files.join(", ")}; readiness accepted for execution lane.`,
|
|
44
|
+
};
|
|
45
|
+
logInputOutput("readinessLockOverride", "output", {
|
|
46
|
+
executionLock,
|
|
47
|
+
executionReady: executionPolicy.executionReady,
|
|
48
|
+
explorationReady: executionPolicy.explorationReady,
|
|
49
|
+
});
|
|
50
|
+
logOutput(context, readinessCallId);
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
26
53
|
// Deterministic short-circuit: no selected files
|
|
27
54
|
if (selectedFiles.length === 0) {
|
|
28
55
|
context.analysis.readiness = {
|
|
@@ -31,23 +58,37 @@ export const readinessGateStep = {
|
|
|
31
58
|
confidence: 0.95,
|
|
32
59
|
rationale: 'No files were selected for analysis.',
|
|
33
60
|
};
|
|
34
|
-
logOutput(context);
|
|
61
|
+
logOutput(context, readinessCallId);
|
|
35
62
|
return;
|
|
36
63
|
}
|
|
37
64
|
// ---------------- SUMMARIZE EVIDENCE FOR LLM ----------------
|
|
38
65
|
// Deterministic shortcut: if any primary relevant files exist, skip LLM
|
|
39
66
|
const primaryRelevantFiles = selectedFiles.filter(path => {
|
|
40
67
|
const verify = verifyByFile[path];
|
|
41
|
-
|
|
68
|
+
const confidence = typeof verify?.fileConfidence === "number" ? verify.fileConfidence : 0;
|
|
69
|
+
return verify?.role === 'primary' && verify?.isRelevant === true && confidence >= 0.45;
|
|
42
70
|
});
|
|
43
71
|
if (primaryRelevantFiles.length > 0) {
|
|
72
|
+
if (!hasHighQualityAnchor &&
|
|
73
|
+
!executionLock?.enabled &&
|
|
74
|
+
!context.analysis.readinessGuard.weakAlignmentExpansionForced) {
|
|
75
|
+
context.analysis.readinessGuard.weakAlignmentExpansionForced = true;
|
|
76
|
+
context.analysis.readiness = {
|
|
77
|
+
decision: 'not-ready',
|
|
78
|
+
reason: 'insufficient-evidence',
|
|
79
|
+
confidence: 0.7,
|
|
80
|
+
rationale: 'Selected files are weakly aligned to domain anchors; forcing one expansion wave before readiness.',
|
|
81
|
+
};
|
|
82
|
+
logOutput(context, readinessCallId);
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
44
85
|
context.analysis.readiness = {
|
|
45
86
|
decision: 'ready',
|
|
46
87
|
reason: 'sufficient-evidence',
|
|
47
88
|
confidence: 0.95,
|
|
48
89
|
rationale: `Primary relevant files detected: ${primaryRelevantFiles.join(', ')}. Sufficient evidence to proceed.`,
|
|
49
90
|
};
|
|
50
|
-
logOutput(context);
|
|
91
|
+
logOutput(context, readinessCallId);
|
|
51
92
|
return;
|
|
52
93
|
}
|
|
53
94
|
// Otherwise, build summary for LLM
|
|
@@ -82,7 +123,19 @@ Instruction:
|
|
|
82
123
|
`.trim();
|
|
83
124
|
try {
|
|
84
125
|
const genInput = { query: context.initContext?.userQuery ?? '', content: prompt };
|
|
85
|
-
const genOutput = await generate(genInput
|
|
126
|
+
const genOutput = await generate(genInput, {
|
|
127
|
+
caller: "readinessGateStep",
|
|
128
|
+
inputContext: {
|
|
129
|
+
userQuery: context.initContext?.userQuery ?? '',
|
|
130
|
+
selectedFiles,
|
|
131
|
+
candidateFiles: focus?.candidateFiles ?? [],
|
|
132
|
+
evidenceSummary,
|
|
133
|
+
domainAnchors,
|
|
134
|
+
hasHighQualityAnchor,
|
|
135
|
+
executionLock,
|
|
136
|
+
},
|
|
137
|
+
});
|
|
138
|
+
readinessCallId = genOutput.trace?.callId;
|
|
86
139
|
const raw = String(genOutput.data ?? '').trim();
|
|
87
140
|
// parse with cleanupModule
|
|
88
141
|
const cleaned = await cleanupModule.run({ query: context.initContext?.userQuery ?? '', content: raw });
|
|
@@ -132,11 +185,23 @@ Instruction:
|
|
|
132
185
|
confidence: modelDecision.confidence,
|
|
133
186
|
rationale: combinedRationale,
|
|
134
187
|
};
|
|
188
|
+
if (context.analysis.readiness.decision === 'ready' &&
|
|
189
|
+
!hasHighQualityAnchor &&
|
|
190
|
+
!executionLock?.enabled &&
|
|
191
|
+
!context.analysis.readinessGuard.weakAlignmentExpansionForced) {
|
|
192
|
+
context.analysis.readinessGuard.weakAlignmentExpansionForced = true;
|
|
193
|
+
context.analysis.readiness = {
|
|
194
|
+
decision: 'not-ready',
|
|
195
|
+
reason: 'insufficient-evidence',
|
|
196
|
+
confidence: 0.7,
|
|
197
|
+
rationale: 'Ready decision blocked due to weak domain-anchor alignment; forcing one expansion wave.',
|
|
198
|
+
};
|
|
199
|
+
}
|
|
135
200
|
// ---------------- DOCS-ONLY FILES ----------------
|
|
136
201
|
const docsOnly = context.executionControl?.constraints?.docsOnly ?? false;
|
|
137
202
|
if (docsOnly && context.analysis.readiness.decision === 'ready') {
|
|
138
203
|
for (const path of selectedFiles) {
|
|
139
|
-
(
|
|
204
|
+
(_e = context.analysis.fileAnalysis)[path] || (_e[path] = { action: {}, intent: 'relevant', semanticAnalyzed: false });
|
|
140
205
|
if (!context.analysis.fileAnalysis[path].action) {
|
|
141
206
|
context.analysis.fileAnalysis[path].action = {};
|
|
142
207
|
}
|
|
@@ -145,7 +210,7 @@ Instruction:
|
|
|
145
210
|
}
|
|
146
211
|
}
|
|
147
212
|
}
|
|
148
|
-
logOutput(context);
|
|
213
|
+
logOutput(context, readinessCallId);
|
|
149
214
|
}
|
|
150
215
|
catch (err) {
|
|
151
216
|
console.warn('⚠️ readinessGateStep failed:', err);
|
|
@@ -159,8 +224,29 @@ Instruction:
|
|
|
159
224
|
},
|
|
160
225
|
};
|
|
161
226
|
// ---------------- HELPER ----------------
|
|
162
|
-
function logOutput(context) {
|
|
227
|
+
function logOutput(context, callId) {
|
|
163
228
|
logInputOutput('readinessGateStep', 'output', {
|
|
229
|
+
callId,
|
|
164
230
|
readiness: context.analysis?.readiness
|
|
165
231
|
});
|
|
166
232
|
}
|
|
233
|
+
function fileHasHighQualityAnchor(filePath, verify, domainAnchors) {
|
|
234
|
+
const evidence = verify?.evidence ?? [];
|
|
235
|
+
const fileConfidence = typeof verify?.fileConfidence === "number" ? verify.fileConfidence : 0;
|
|
236
|
+
const hasFilenameEvidence = evidence.some((item) => {
|
|
237
|
+
if (item?.type !== "filename")
|
|
238
|
+
return false;
|
|
239
|
+
const confidence = typeof item?.confidence === "number" ? item.confidence : 0;
|
|
240
|
+
const claim = String(item?.claim ?? "").toLowerCase();
|
|
241
|
+
return confidence >= 0.95 && claim.includes("exactly matches query target");
|
|
242
|
+
});
|
|
243
|
+
const hasExactSymbolEvidence = evidence.some((item) => {
|
|
244
|
+
if (item?.type !== "symbol" && item?.type !== "structural")
|
|
245
|
+
return false;
|
|
246
|
+
const confidence = typeof item?.confidence === "number" ? item.confidence : 0;
|
|
247
|
+
return confidence >= 0.9;
|
|
248
|
+
});
|
|
249
|
+
const domainHitCount = countDomainAnchorHits(`${filePath} ${verify?.rationale ?? ""}`, domainAnchors);
|
|
250
|
+
return fileConfidence >= 0.45 && (hasFilenameEvidence || hasExactSymbolEvidence || domainHitCount >= 2);
|
|
251
|
+
}
|
|
252
|
+
//# sourceMappingURL=readinessGateStep.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"readinessGateStep.js","sourceRoot":"","sources":["../../src/agents/readinessGateStep.ts"],"names":[],"mappings":"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","sourcesContent":["// File: src/modules/readinessGateStep.ts\nimport { generate } from '../lib/generate.js';\nimport { cleanupModule } from '../pipeline/modules/cleanupModule.js';\nimport { ModuleIO, StructuredContext, VerifyFileState } from '../types.js';\nimport { logInputOutput } from '../utils/promptLogHelper.js';\nimport { countDomainAnchorHits, extractDomainAnchors } from '../utils/queryAnchors.js';\n\nexport const readinessGateStep = {\n name: 'readinessGate',\n description: 'Determines if there is sufficient evidence to safely proceed with analysis or transformation.',\n groups: ['analysis'],\n\n requires: ['userQuery', 'intent'],\n produces: ['analysis.readiness'],\n\n async run(context: StructuredContext): Promise<void> {\n context.analysis ||= {};\n context.analysis.focus ||= { selectedFiles: [], candidateFiles: [], rationale: '' };\n context.analysis.fileAnalysis ||= {};\n context.analysis.readiness ||= {\n decision: 'not-ready',\n reason: 'insufficient-evidence',\n confidence: 0,\n rationale: '',\n };\n\n const focus = context.analysis.focus;\n let readinessCallId: string | undefined;\n const verifyByFile = context.analysis.verify?.byFile ?? {};\n const executionPolicy = context.analysis.executionPolicy;\n const executionLock = executionPolicy?.executionLock;\n context.analysis.readinessGuard ||= { weakAlignmentExpansionForced: false };\n\n // ---------------- EVIDENCE COLLECTION ----------------\n const selectedFiles =\n executionPolicy?.executionRequired?.length\n ? executionPolicy.executionRequired\n : focus.selectedFiles ?? [];\n const domainAnchors = extractDomainAnchors(context.initContext?.userQuery ?? \"\");\n const hasHighQualityAnchor = selectedFiles.some((filePath) =>\n fileHasHighQualityAnchor(filePath, verifyByFile[filePath], domainAnchors)\n );\n\n // Resolver-based lock override: execution lane is ready even if exploration lane is weak.\n if (\n executionPolicy?.executionReady &&\n executionLock?.enabled &&\n executionLock.files.length > 0\n ) {\n context.analysis.readiness = {\n decision: \"ready\",\n reason: \"sufficient-evidence\",\n confidence: 0.97,\n rationale: `Execution lock active for ${executionLock.files.join(\", \")}; readiness accepted for execution lane.`,\n };\n logInputOutput(\"readinessLockOverride\", \"output\", {\n executionLock,\n executionReady: executionPolicy.executionReady,\n explorationReady: executionPolicy.explorationReady,\n });\n logOutput(context, readinessCallId);\n return;\n }\n\n // Deterministic short-circuit: no selected files\n if (selectedFiles.length === 0) {\n context.analysis.readiness = {\n decision: 'not-ready',\n reason: 'insufficient-evidence',\n confidence: 0.95,\n rationale: 'No files were selected for analysis.',\n };\n logOutput(context, readinessCallId);\n return;\n }\n\n // ---------------- SUMMARIZE EVIDENCE FOR LLM ----------------\n // Deterministic shortcut: if any primary relevant files exist, skip LLM\n const primaryRelevantFiles = selectedFiles.filter(\n path => {\n const verify = verifyByFile[path];\n const confidence = typeof verify?.fileConfidence === \"number\" ? verify.fileConfidence : 0;\n return verify?.role === 'primary' && verify?.isRelevant === true && confidence >= 0.45;\n }\n );\n\n if (primaryRelevantFiles.length > 0) {\n if (\n !hasHighQualityAnchor &&\n !executionLock?.enabled &&\n !context.analysis.readinessGuard.weakAlignmentExpansionForced\n ) {\n context.analysis.readinessGuard.weakAlignmentExpansionForced = true;\n context.analysis.readiness = {\n decision: 'not-ready',\n reason: 'insufficient-evidence',\n confidence: 0.7,\n rationale: 'Selected files are weakly aligned to domain anchors; forcing one expansion wave before readiness.',\n };\n logOutput(context, readinessCallId);\n return;\n }\n\n context.analysis.readiness = {\n decision: 'ready',\n reason: 'sufficient-evidence',\n confidence: 0.95,\n rationale: `Primary relevant files detected: ${primaryRelevantFiles.join(', ')}. Sufficient evidence to proceed.`,\n };\n logOutput(context, readinessCallId);\n return;\n }\n\n // Otherwise, build summary for LLM\n const evidenceSummary = selectedFiles\n .map(path => {\n const verify = verifyByFile[path];\n if (!verify) return `File: ${path}\\n(No verify evidence available)`;\n\n const claims = verify.evidence?.map(e => `- ${e.claim}`).join('\\n') ?? '(no explicit claims)';\n return `File: ${path}\\nRole: ${verify.role ?? 'unknown'}\\nClaims:\\n${claims}`;\n })\n .join('\\n\\n');\n\n\n const prompt = `\nYou are a focused evidence assessor. Do NOT invent new facts. Only reason about the evidence given.\n\nUser query:\n${context.initContext?.userQuery}\n\nEvidence from analyzed files:\n${evidenceSummary}\n\nInstruction:\n- Decide whether there is sufficient evidence to proceed safely with analysis or transformation.\n- Return a JSON object EXACTLY in this format:\n\n{\n \"decision\": \"ready\" | \"not-ready\",\n \"reason\": \"sufficient-evidence\" | \"insufficient-evidence\" | \"query-repo-mismatch\" | \"internal-error\",\n \"confidence\": 0.0-1.0,\n \"rationale\": \"Concise explanation based only on the evidence provided.\"\n}\n`.trim();\n\n try {\n const genInput: ModuleIO = { query: context.initContext?.userQuery ?? '', content: prompt };\n const genOutput = await generate(genInput, {\n caller: \"readinessGateStep\",\n inputContext: {\n userQuery: context.initContext?.userQuery ?? '',\n selectedFiles,\n candidateFiles: focus?.candidateFiles ?? [],\n evidenceSummary,\n domainAnchors,\n hasHighQualityAnchor,\n executionLock,\n },\n });\n readinessCallId = genOutput.trace?.callId;\n const raw = String(genOutput.data ?? '').trim();\n\n interface ReadinessDecision {\n decision: 'ready' | 'not-ready';\n reason: 'sufficient-evidence' | 'insufficient-evidence' | 'query-repo-mismatch' | 'internal-error';\n confidence: number;\n rationale: string;\n }\n\n // parse with cleanupModule\n const cleaned = await cleanupModule.run({ query: context.initContext?.userQuery ?? '', content: raw });\n\n const parsed = cleaned.data as Partial<ReadinessDecision> | undefined;\n const allowedDecisions = new Set<ReadinessDecision['decision']>([\n 'ready',\n 'not-ready',\n ]);\n const allowedReasons = new Set<ReadinessDecision['reason']>([\n 'sufficient-evidence',\n 'insufficient-evidence',\n 'query-repo-mismatch',\n 'internal-error',\n ]);\n const modelDecision: ReadinessDecision =\n parsed &&\n typeof parsed === 'object' &&\n parsed.decision !== undefined &&\n parsed.confidence !== undefined &&\n parsed.rationale !== undefined &&\n parsed.reason !== undefined &&\n allowedDecisions.has(parsed.decision) &&\n allowedReasons.has(parsed.reason)\n ? {\n decision: parsed.decision,\n reason: parsed.reason,\n confidence: parsed.confidence,\n rationale: parsed.rationale,\n }\n : {\n decision: selectedFiles.length > 0 ? 'ready' : 'not-ready',\n reason: selectedFiles.length > 0 ? 'sufficient-evidence' : 'insufficient-evidence',\n confidence: selectedFiles.length > 0 ? 0.5 : 0.2,\n rationale: selectedFiles.length > 0\n ? 'LLM output invalid; defaulting to ready based on existing evidence'\n : 'Failed to parse model output; no evidence available',\n };\n\n // Merge deterministic info with LLM summary\n const combinedRationale = [\n `Evidence-based: ${selectedFiles.length} selected file(s).`,\n modelDecision.rationale,\n ]\n .filter(Boolean)\n .join(' ');\n\n context.analysis.readiness = {\n decision: modelDecision.decision,\n reason: modelDecision.reason,\n confidence: modelDecision.confidence,\n rationale: combinedRationale,\n };\n\n if (\n context.analysis.readiness.decision === 'ready' &&\n !hasHighQualityAnchor &&\n !executionLock?.enabled &&\n !context.analysis.readinessGuard.weakAlignmentExpansionForced\n ) {\n context.analysis.readinessGuard.weakAlignmentExpansionForced = true;\n context.analysis.readiness = {\n decision: 'not-ready',\n reason: 'insufficient-evidence',\n confidence: 0.7,\n rationale: 'Ready decision blocked due to weak domain-anchor alignment; forcing one expansion wave.',\n };\n }\n\n // ---------------- DOCS-ONLY FILES ----------------\n const docsOnly = context.executionControl?.constraints?.docsOnly ?? false;\n if (docsOnly && context.analysis.readiness.decision === 'ready') {\n for (const path of selectedFiles) {\n context.analysis.fileAnalysis[path] ||= { action: {} as any, intent: 'relevant', semanticAnalyzed: false };\n if (!context.analysis.fileAnalysis[path].action) {\n context.analysis.fileAnalysis[path].action = {} as any;\n }\n if (context.analysis.fileAnalysis[path].action) {\n context.analysis.fileAnalysis[path].action.shouldModify = true;\n }\n }\n }\n\n logOutput(context, readinessCallId);\n } catch (err) {\n console.warn('⚠️ readinessGateStep failed:', err);\n context.analysis.readiness = {\n decision: 'not-ready',\n reason: 'internal-error',\n confidence: 0.2,\n rationale: 'Internal error while determining readiness.',\n };\n }\n },\n};\n\n// ---------------- HELPER ----------------\nfunction logOutput(context: StructuredContext, callId?: string) {\n logInputOutput('readinessGateStep', 'output', {\n callId,\n readiness: context.analysis?.readiness\n });\n}\n\nfunction fileHasHighQualityAnchor(\n filePath: string,\n verify: VerifyFileState | undefined,\n domainAnchors: string[]\n): boolean {\n const evidence = verify?.evidence ?? [];\n const fileConfidence = typeof verify?.fileConfidence === \"number\" ? verify.fileConfidence : 0;\n const hasFilenameEvidence = evidence.some((item) => {\n if (item?.type !== \"filename\") return false;\n const confidence = typeof item?.confidence === \"number\" ? item.confidence : 0;\n const claim = String(item?.claim ?? \"\").toLowerCase();\n return confidence >= 0.95 && claim.includes(\"exactly matches query target\");\n });\n const hasExactSymbolEvidence = evidence.some((item) => {\n if (item?.type !== \"symbol\" && item?.type !== \"structural\") return false;\n const confidence = typeof item?.confidence === \"number\" ? item.confidence : 0;\n return confidence >= 0.9;\n });\n const domainHitCount = countDomainAnchorHits(\n `${filePath} ${verify?.rationale ?? \"\"}`,\n domainAnchors\n );\n\n return fileConfidence >= 0.45 && (hasFilenameEvidence || hasExactSymbolEvidence || domainHitCount >= 2);\n}\n"]}
|
|
@@ -2,10 +2,10 @@ import { logInputOutput } from "../utils/promptLogHelper.js";
|
|
|
2
2
|
/**
|
|
3
3
|
* REASON NEXT STEP
|
|
4
4
|
*
|
|
5
|
-
* Only reasons about the current
|
|
5
|
+
* Only reasons about the current durable Step:
|
|
6
6
|
* - Is it validated / complete?
|
|
7
7
|
* - Does it require redo?
|
|
8
|
-
* - Updates
|
|
8
|
+
* - Updates step.status and stores reasoning in step.result
|
|
9
9
|
*/
|
|
10
10
|
export const reasonNextStep = {
|
|
11
11
|
name: "reasonNextStep",
|
|
@@ -34,7 +34,7 @@ export const reasonNextStep = {
|
|
|
34
34
|
if (isAnalyzeOnly && semanticAnalyzed) {
|
|
35
35
|
taskStep.status = "completed";
|
|
36
36
|
stepReasoning.nextAction = "complete";
|
|
37
|
-
stepReasoning.rationale = `
|
|
37
|
+
stepReasoning.rationale = `Step ${taskStep.filePath} completed in analysis mode (semantic analysis available).`;
|
|
38
38
|
stepReasoning.confidence = 0.98;
|
|
39
39
|
}
|
|
40
40
|
// ✅ Analyze-only fallback for files that do not emit semanticAnalyzed reliably.
|
|
@@ -42,29 +42,29 @@ export const reasonNextStep = {
|
|
|
42
42
|
taskStep.status = "completed";
|
|
43
43
|
stepReasoning.nextAction = "complete";
|
|
44
44
|
stepReasoning.rationale = isLikelyNonSource
|
|
45
|
-
? `
|
|
46
|
-
: `
|
|
45
|
+
? `Step ${taskStep.filePath} completed in analysis mode (non-source file; bounded single-pass analysis).`
|
|
46
|
+
: `Step ${taskStep.filePath} completed after ${analysisAttempts} analysis attempt(s) without semantic marker.`;
|
|
47
47
|
stepReasoning.confidence = 0.85;
|
|
48
48
|
}
|
|
49
49
|
// ✅ Completed by validation
|
|
50
50
|
else if (currentValidation?.status === "valid" && !currentValidation.requiresRedo) {
|
|
51
51
|
taskStep.status = "completed";
|
|
52
52
|
stepReasoning.nextAction = "complete";
|
|
53
|
-
stepReasoning.rationale = `
|
|
53
|
+
stepReasoning.rationale = `Step ${taskStep.filePath} validated successfully.`;
|
|
54
54
|
stepReasoning.confidence = 0.99;
|
|
55
55
|
}
|
|
56
56
|
// 🔁 Requires redo
|
|
57
57
|
else if (currentValidation?.requiresRedo) {
|
|
58
58
|
taskStep.status = "pending"; // keep pending until redo runs
|
|
59
59
|
stepReasoning.nextAction = "redo-step";
|
|
60
|
-
stepReasoning.rationale = `
|
|
60
|
+
stepReasoning.rationale = `Step ${taskStep.filePath} requires redo due to failed validation.`;
|
|
61
61
|
stepReasoning.confidence = 0.7;
|
|
62
62
|
}
|
|
63
63
|
// ⚠️ Not yet validated / in-progress
|
|
64
64
|
else {
|
|
65
65
|
taskStep.status = "pending";
|
|
66
66
|
stepReasoning.nextAction = "continue";
|
|
67
|
-
stepReasoning.rationale = `
|
|
67
|
+
stepReasoning.rationale = `Step ${taskStep.filePath} not yet validated or transformed.`;
|
|
68
68
|
stepReasoning.confidence = 0.5;
|
|
69
69
|
}
|
|
70
70
|
// Store reasoning in taskStep.result for later inspection
|
|
@@ -76,3 +76,4 @@ export const reasonNextStep = {
|
|
|
76
76
|
});
|
|
77
77
|
},
|
|
78
78
|
};
|
|
79
|
+
//# sourceMappingURL=reasonNextStep.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reasonNextStep.js","sourceRoot":"","sources":["../../src/agents/reasonNextStep.ts"],"names":[],"mappings":"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","sourcesContent":["// File: src/agents/reasonNextStep.ts\nimport type { StructuredContext, Step } from \"../types.js\";\nimport { logInputOutput } from \"../utils/promptLogHelper.js\";\n\n/**\n * REASON NEXT STEP\n *\n * Only reasons about the current durable Step:\n * - Is it validated / complete?\n * - Does it require redo?\n * - Updates step.status and stores reasoning in step.result\n */\nexport const reasonNextStep = {\n name: \"reasonNextStep\",\n description: \"Determines completion status for the current task step.\",\n\n async run(context: StructuredContext, taskStep: Step): Promise<void> {\n context.execution ||= {};\n\n const isAnalyzeOnly = context.executionControl?.constraints?.allowFileWrites === false;\n const fileAnalysis = context.analysis?.fileAnalysis?.[taskStep.filePath];\n const semanticAnalyzed = fileAnalysis?.semanticAnalyzed === true;\n const isLikelyNonSource =\n /\\.(json|md|txt|ya?ml|toml|lock)$/i.test(taskStep.filePath);\n\n const validations = context.analysis?.executionOutcome?.validations ?? [];\n const currentValidation = validations.find(\n (v) => v.filePath === taskStep.filePath\n );\n\n taskStep.result ||= {};\n const priorAnalysisAttempts =\n typeof taskStep.result.analysisAttempts === \"number\"\n ? taskStep.result.analysisAttempts\n : 0;\n const analysisAttempts = isAnalyzeOnly ? priorAnalysisAttempts + 1 : priorAnalysisAttempts;\n taskStep.result.analysisAttempts = analysisAttempts;\n\n // Default reasoning object for this step\n const stepReasoning = {\n nextAction: \"continue\" as \"continue\" | \"redo-step\" | \"complete\",\n rationale: \"\",\n confidence: 0.5,\n };\n\n // ✅ Analyze-only workflows complete once semantic analysis exists for the current file.\n if (isAnalyzeOnly && semanticAnalyzed) {\n taskStep.status = \"completed\";\n stepReasoning.nextAction = \"complete\";\n stepReasoning.rationale = `Step ${taskStep.filePath} completed in analysis mode (semantic analysis available).`;\n stepReasoning.confidence = 0.98;\n }\n // ✅ Analyze-only fallback for files that do not emit semanticAnalyzed reliably.\n else if (isAnalyzeOnly && (isLikelyNonSource || analysisAttempts >= 2)) {\n taskStep.status = \"completed\";\n stepReasoning.nextAction = \"complete\";\n stepReasoning.rationale = isLikelyNonSource\n ? `Step ${taskStep.filePath} completed in analysis mode (non-source file; bounded single-pass analysis).`\n : `Step ${taskStep.filePath} completed after ${analysisAttempts} analysis attempt(s) without semantic marker.`;\n stepReasoning.confidence = 0.85;\n }\n // ✅ Completed by validation\n else if (currentValidation?.status === \"valid\" && !currentValidation.requiresRedo) {\n taskStep.status = \"completed\";\n stepReasoning.nextAction = \"complete\";\n stepReasoning.rationale = `Step ${taskStep.filePath} validated successfully.`;\n stepReasoning.confidence = 0.99;\n }\n // 🔁 Requires redo\n else if (currentValidation?.requiresRedo) {\n taskStep.status = \"pending\"; // keep pending until redo runs\n stepReasoning.nextAction = \"redo-step\";\n stepReasoning.rationale = `Step ${taskStep.filePath} requires redo due to failed validation.`;\n stepReasoning.confidence = 0.7;\n }\n // ⚠️ Not yet validated / in-progress\n else {\n taskStep.status = \"pending\";\n stepReasoning.nextAction = \"continue\";\n stepReasoning.rationale = `Step ${taskStep.filePath} not yet validated or transformed.`;\n stepReasoning.confidence = 0.5;\n }\n\n // Store reasoning in taskStep.result for later inspection\n taskStep.result.stepReasoning = stepReasoning;\n\n logInputOutput(\"reasonNextStep\", \"output\", {\n taskStep,\n validation: currentValidation,\n stepReasoning,\n });\n },\n};\n"]}
|