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
|
@@ -1,25 +1,22 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Generates ordered research steps for repo-wide or multi-question work.
|
|
3
|
+
*
|
|
4
|
+
* Why this file exists:
|
|
5
|
+
* - research planning should stay small and typed even when the task is broad
|
|
6
|
+
* - ordered question parts now give the planner one stable view of user-facing sub-questions
|
|
7
|
+
* - runtime execution still owns when those research steps actually run
|
|
8
|
+
*/
|
|
2
9
|
import { generate } from "../lib/generate.js";
|
|
3
10
|
import { cleanupModule } from "../pipeline/modules/cleanupModule.js";
|
|
4
11
|
import { logInputOutput } from "../utils/promptLogHelper.js";
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
},
|
|
14
|
-
{
|
|
15
|
-
action: "research-risk-check",
|
|
16
|
-
description: "Identify risks, assumptions, and safety constraints.",
|
|
17
|
-
},
|
|
18
|
-
{
|
|
19
|
-
action: "research-architecture-synthesis",
|
|
20
|
-
description: "Synthesize architecture, hotspots, and coupling points from findings.",
|
|
21
|
-
},
|
|
22
|
-
];
|
|
12
|
+
import { getActionsByPhase } from "./actionRegistry.js";
|
|
13
|
+
import { buildResumePacket, renderResumePacket } from "../utils/resumeState.js";
|
|
14
|
+
// Runtime registry is now authoritative for allowed research actions.
|
|
15
|
+
const RESEARCH_ACTIONS = getActionsByPhase("research")
|
|
16
|
+
.map(spec => ({
|
|
17
|
+
action: spec.id,
|
|
18
|
+
description: `${spec.id} (${spec.executorKind}, ${spec.safety})`,
|
|
19
|
+
}));
|
|
23
20
|
/**
|
|
24
21
|
* RESEARCH PLAN GENERATOR
|
|
25
22
|
* Produces ordered research steps tailored to the current query and scope.
|
|
@@ -37,9 +34,19 @@ export const researchPlanGenStep = {
|
|
|
37
34
|
context.initContext?.userQuery ??
|
|
38
35
|
"";
|
|
39
36
|
const intentCategory = context.analysis.intent?.intentCategory ?? "request";
|
|
37
|
+
const orderedQuestions = context.analysis.intent?.questions ?? [];
|
|
40
38
|
const scopeType = context.analysis.scopeType ?? "repo-wide";
|
|
41
|
-
const selectedFiles = context.analysis.
|
|
42
|
-
|
|
39
|
+
const selectedFiles = context.analysis.executionPolicy?.executionRequired ??
|
|
40
|
+
context.analysis.focus?.executionRequired ??
|
|
41
|
+
context.analysis.focus?.selectedFiles ??
|
|
42
|
+
[];
|
|
43
|
+
const candidateFiles = context.analysis.executionPolicy?.explorationCandidates ??
|
|
44
|
+
context.analysis.focus?.explorationCandidates ??
|
|
45
|
+
context.analysis.focus?.candidateFiles ??
|
|
46
|
+
[];
|
|
47
|
+
const resumedContextCapsule = renderResumePacket(buildResumePacket(context.analysis?.resumeState)) ||
|
|
48
|
+
context.initContext?.resumedContextCapsule ||
|
|
49
|
+
"";
|
|
43
50
|
const prompt = `
|
|
44
51
|
You are generating a research-only execution plan for a coding agent.
|
|
45
52
|
|
|
@@ -58,28 +65,47 @@ ${JSON.stringify(selectedFiles.slice(0, 20), null, 2)}
|
|
|
58
65
|
Candidate files (current):
|
|
59
66
|
${JSON.stringify(candidateFiles.slice(0, 30), null, 2)}
|
|
60
67
|
|
|
68
|
+
${resumedContextCapsule ? `Resumed context capsule:\n${resumedContextCapsule}\n` : ""}
|
|
69
|
+
|
|
70
|
+
Ordered question parts:
|
|
71
|
+
${JSON.stringify(orderedQuestions, null, 2)}
|
|
72
|
+
|
|
61
73
|
Allowed research actions (use only these):
|
|
62
74
|
${JSON.stringify(RESEARCH_ACTIONS, null, 2)}
|
|
63
75
|
|
|
64
76
|
Rules:
|
|
65
77
|
- Return 2-4 ordered steps.
|
|
66
78
|
- Every step action must be one of the allowed research actions.
|
|
79
|
+
- Include "questionId" when one question clearly owns the step.
|
|
67
80
|
- Include architecture synthesis as final step when scope is multi-file or repo-wide.
|
|
68
81
|
- Prefer deterministic filePath values:
|
|
69
82
|
- research-impact-map => "__research__/impact-map"
|
|
70
83
|
- research-symbol-trace => "__research__/symbol-trace"
|
|
71
84
|
- research-risk-check => "__research__/risk-check"
|
|
72
85
|
- research-architecture-synthesis => "__research__/architecture-synthesis"
|
|
86
|
+
- research-trail-expand => "__research__/trail-expand"
|
|
73
87
|
- Return strict JSON only:
|
|
74
88
|
{
|
|
75
89
|
"steps": [
|
|
76
|
-
{ "id": "research:1", "action": "research-impact-map", "targetFile": "__research__/impact-map", "description": "..." }
|
|
90
|
+
{ "id": "research:1", "action": "research-impact-map", "actionId": "research-impact-map", "actionArgs": {}, "targetFile": "__research__/impact-map", "description": "..." }
|
|
77
91
|
]
|
|
78
92
|
}
|
|
79
93
|
`.trim();
|
|
80
94
|
try {
|
|
81
95
|
const input = { query: intentText, content: prompt };
|
|
82
|
-
const generated = await generate(input
|
|
96
|
+
const generated = await generate(input, {
|
|
97
|
+
caller: "researchPlanGenStep",
|
|
98
|
+
inputContext: {
|
|
99
|
+
intentText,
|
|
100
|
+
intentCategory,
|
|
101
|
+
orderedQuestions,
|
|
102
|
+
scopeType,
|
|
103
|
+
selectedFiles,
|
|
104
|
+
candidateFiles,
|
|
105
|
+
resumedContextCapsule,
|
|
106
|
+
allowedActions: RESEARCH_ACTIONS,
|
|
107
|
+
},
|
|
108
|
+
});
|
|
83
109
|
const raw = typeof generated.data === "string"
|
|
84
110
|
? generated.data
|
|
85
111
|
: JSON.stringify(generated.data ?? "{}");
|
|
@@ -100,10 +126,16 @@ Rules:
|
|
|
100
126
|
? "__research__/symbol-trace"
|
|
101
127
|
: action === "research-risk-check"
|
|
102
128
|
? "__research__/risk-check"
|
|
103
|
-
: "
|
|
129
|
+
: action === "research-trail-expand"
|
|
130
|
+
? "__research__/trail-expand"
|
|
131
|
+
: "__research__/architecture-synthesis";
|
|
104
132
|
return {
|
|
105
133
|
id: step.id ?? `research:${index + 1}`,
|
|
106
134
|
action,
|
|
135
|
+
// Example: action="research-risk-check" stays identical actionId.
|
|
136
|
+
actionId: step.actionId ?? action,
|
|
137
|
+
actionArgs: step.actionArgs ?? {},
|
|
138
|
+
questionId: typeof step.questionId === "string" ? step.questionId : undefined,
|
|
107
139
|
targetFile: step.targetFile ?? defaultFile,
|
|
108
140
|
description: step.description ?? `Run ${action}`,
|
|
109
141
|
metadata: step.metadata ?? {},
|
|
@@ -112,7 +144,10 @@ Rules:
|
|
|
112
144
|
})
|
|
113
145
|
.slice(0, 4);
|
|
114
146
|
context.analysis.planSuggestion = { plan: { steps: normalized } };
|
|
115
|
-
logInputOutput("researchPlanGen", "output", {
|
|
147
|
+
logInputOutput("researchPlanGen", "output", {
|
|
148
|
+
callId: generated.trace?.callId,
|
|
149
|
+
steps: normalized,
|
|
150
|
+
});
|
|
116
151
|
}
|
|
117
152
|
catch (err) {
|
|
118
153
|
console.warn("[researchPlanGenStep] Failed to generate research plan:", err);
|
|
@@ -121,3 +156,4 @@ Rules:
|
|
|
121
156
|
}
|
|
122
157
|
},
|
|
123
158
|
};
|
|
159
|
+
//# sourceMappingURL=researchPlanGenStep.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"researchPlanGenStep.js","sourceRoot":"","sources":["../../src/agents/researchPlanGenStep.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAE7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAchF,sEAAsE;AACtE,MAAM,gBAAgB,GAA2D,iBAAiB,CAAC,UAAU,CAAC;KACzG,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACV,MAAM,EAAE,IAAI,CAAC,EAAoB;IACjC,WAAW,EAAE,GAAG,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,YAAY,KAAK,IAAI,CAAC,MAAM,GAAG;CACnE,CAAC,CAAC,CAAC;AAER;;;;GAIG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG;IAC/B,IAAI,EAAE,iBAAiB;IACvB,WAAW,EAAE,+DAA+D;IAC5E,QAAQ,EAAE,CAAC,iBAAiB,EAAE,oBAAoB,EAAE,0BAA0B,CAAC;IAC/E,QAAQ,EAAE,CAAC,yBAAyB,CAAC;IAErC,KAAK,CAAC,GAAG,CAAC,OAA0B;QAChC,OAAO,CAAC,QAAQ,KAAhB,OAAO,CAAC,QAAQ,GAAK,EAAE,EAAC;QACxB,OAAO,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC;QAEvC,MAAM,UAAU,GACZ,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,eAAe;YACxC,OAAO,CAAC,WAAW,EAAE,SAAS;YAC9B,EAAE,CAAC;QACP,MAAM,cAAc,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,cAAc,IAAI,SAAS,CAAC;QAC5E,MAAM,gBAAgB,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,IAAI,EAAE,CAAC;QAClE,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC,SAAS,IAAI,WAAW,CAAC;QAC5D,MAAM,aAAa,GACf,OAAO,CAAC,QAAQ,CAAC,eAAe,EAAE,iBAAiB;YACnD,OAAO,CAAC,QAAQ,CAAC,KAAK,EAAE,iBAAiB;YACzC,OAAO,CAAC,QAAQ,CAAC,KAAK,EAAE,aAAa;YACrC,EAAE,CAAC;QACP,MAAM,cAAc,GAChB,OAAO,CAAC,QAAQ,CAAC,eAAe,EAAE,qBAAqB;YACvD,OAAO,CAAC,QAAQ,CAAC,KAAK,EAAE,qBAAqB;YAC7C,OAAO,CAAC,QAAQ,CAAC,KAAK,EAAE,cAAc;YACtC,EAAE,CAAC;QACP,MAAM,qBAAqB,GACvB,kBAAkB,CAAC,iBAAiB,CAAC,OAAO,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;YACpE,OAAO,CAAC,WAAW,EAAE,qBAAqB;YAC1C,EAAE,CAAC;QAEP,MAAM,MAAM,GAAG;;;;EAIrB,UAAU;;;EAGV,cAAc;;;EAGd,SAAS;;;EAGT,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;;;EAGnD,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;;EAEpD,qBAAqB,CAAC,CAAC,CAAC,6BAA6B,qBAAqB,IAAI,CAAC,CAAC,CAAC,EAAE;;;EAGnF,IAAI,CAAC,SAAS,CAAC,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAAC;;;EAGzC,IAAI,CAAC,SAAS,CAAC,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAAC;;;;;;;;;;;;;;;;;;;SAmBlC,CAAC,IAAI,EAAE,CAAC;QAET,IAAI,CAAC;YACD,MAAM,KAAK,GAAa,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;YAC/D,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,KAAK,EAAE;gBACpC,MAAM,EAAE,qBAAqB;gBAC7B,YAAY,EAAE;oBACV,UAAU;oBACV,cAAc;oBACd,gBAAgB;oBAChB,SAAS;oBACT,aAAa;oBACb,cAAc;oBACd,qBAAqB;oBACrB,cAAc,EAAE,gBAAgB;iBACnC;aACJ,CAAC,CAAC;YACH,MAAM,GAAG,GACL,OAAO,SAAS,CAAC,IAAI,KAAK,QAAQ;gBAC9B,CAAC,CAAC,SAAS,CAAC,IAAI;gBAChB,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC;YACjD,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;YAC7E,MAAM,UAAU,GACZ,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ;gBAC/B,CAAC,CAAC,OAAO,CAAC,OAAO;gBACjB,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC;YAElD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAgC,CAAC;YACrE,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YACvE,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;YAEhE,MAAM,UAAU,GAAoB,cAAc;iBAC7C,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,IAAI,EAAE,MAAM,KAAK,QAAQ,IAAI,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,MAAwB,CAAC,CAAC;iBACjG,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;gBACjB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAwB,CAAC;gBAC7C,MAAM,WAAW,GACb,MAAM,KAAK,qBAAqB;oBAC5B,CAAC,CAAC,yBAAyB;oBAC3B,CAAC,CAAC,MAAM,KAAK,uBAAuB;wBAChC,CAAC,CAAC,2BAA2B;wBAC7B,CAAC,CAAC,MAAM,KAAK,qBAAqB;4BAC9B,CAAC,CAAC,yBAAyB;4BAC3B,CAAC,CAAC,MAAM,KAAK,uBAAuB;gCAChC,CAAC,CAAC,2BAA2B;gCAC7B,CAAC,CAAC,qCAAqC,CAAC;gBAE5D,OAAO;oBACH,EAAE,EAAE,IAAI,CAAC,EAAE,IAAI,YAAY,KAAK,GAAG,CAAC,EAAE;oBACtC,MAAM;oBACN,kEAAkE;oBAClE,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,MAAM;oBACjC,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,EAAE;oBACjC,UAAU,EAAE,OAAO,IAAI,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;oBAC7E,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,WAAW;oBAC1C,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,OAAO,MAAM,EAAE;oBAChD,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,EAAE;oBAC7B,MAAM,EAAE,CAAC,UAAU,EAAE,UAAU,CAAC;iBACnC,CAAC;YACN,CAAC,CAAC;iBACD,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAEjB,OAAO,CAAC,QAAQ,CAAC,cAAc,GAAG,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,CAAC;YAClE,cAAc,CAAC,iBAAiB,EAAE,QAAQ,EAAE;gBACxC,MAAM,EAAE,SAAS,CAAC,KAAK,EAAE,MAAM;gBAC/B,KAAK,EAAE,UAAU;aACpB,CAAC,CAAC;QACP,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,OAAO,CAAC,IAAI,CAAC,yDAAyD,EAAE,GAAG,CAAC,CAAC;YAC7E,OAAO,CAAC,QAAQ,CAAC,cAAc,GAAG,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC;YAC1D,cAAc,CAAC,iBAAiB,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;QAC/D,CAAC;IACL,CAAC;CACJ,CAAC","sourcesContent":["/**\n * Generates ordered research steps for repo-wide or multi-question work.\n *\n * Why this file exists:\n * - research planning should stay small and typed even when the task is broad\n * - ordered question parts now give the planner one stable view of user-facing sub-questions\n * - runtime execution still owns when those research steps actually run\n */\nimport { generate } from \"../lib/generate.js\";\nimport { cleanupModule } from \"../pipeline/modules/cleanupModule.js\";\nimport { logInputOutput } from \"../utils/promptLogHelper.js\";\nimport type { StructuredContext, ModuleIO, AgentPlanStep } from \"../types.js\";\nimport { getActionsByPhase } from \"./actionRegistry.js\";\nimport { buildResumePacket, renderResumePacket } from \"../utils/resumeState.js\";\n\n/**\n * Refactor note:\n * - Research allowlist now comes from runtime ActionRegistry.\n * - Why it exists: planners and runtime must share one action contract.\n */\ntype ResearchAction =\n | \"research-impact-map\"\n | \"research-symbol-trace\"\n | \"research-risk-check\"\n | \"research-architecture-synthesis\"\n | \"research-trail-expand\";\n\n// Runtime registry is now authoritative for allowed research actions.\nconst RESEARCH_ACTIONS: Array<{ action: ResearchAction; description: string }> = getActionsByPhase(\"research\")\n .map(spec => ({\n action: spec.id as ResearchAction,\n description: `${spec.id} (${spec.executorKind}, ${spec.safety})`,\n }));\n\n/**\n * RESEARCH PLAN GENERATOR\n * Produces ordered research steps tailored to the current query and scope.\n * Example: for repo-wide architecture questions, prioritize symbol-trace + synthesis.\n */\nexport const researchPlanGenStep = {\n name: \"researchPlanGen\",\n description: \"Generates ordered research steps for repo-wide complex lanes.\",\n requires: [\"analysis.intent\", \"analysis.scopeType\", \"analysis.routingDecision\"],\n produces: [\"analysis.planSuggestion\"],\n\n async run(context: StructuredContext): Promise<void> {\n context.analysis ||= {};\n delete context.analysis.planSuggestion;\n\n const intentText =\n context.analysis.intent?.normalizedQuery ??\n context.initContext?.userQuery ??\n \"\";\n const intentCategory = context.analysis.intent?.intentCategory ?? \"request\";\n const orderedQuestions = context.analysis.intent?.questions ?? [];\n const scopeType = context.analysis.scopeType ?? \"repo-wide\";\n const selectedFiles =\n context.analysis.executionPolicy?.executionRequired ??\n context.analysis.focus?.executionRequired ??\n context.analysis.focus?.selectedFiles ??\n [];\n const candidateFiles =\n context.analysis.executionPolicy?.explorationCandidates ??\n context.analysis.focus?.explorationCandidates ??\n context.analysis.focus?.candidateFiles ??\n [];\n const resumedContextCapsule =\n renderResumePacket(buildResumePacket(context.analysis?.resumeState)) ||\n context.initContext?.resumedContextCapsule ||\n \"\";\n\n const prompt = `\nYou are generating a research-only execution plan for a coding agent.\n\nUser intent:\n${intentText}\n\nIntent category:\n${intentCategory}\n\nScope:\n${scopeType}\n\nSelected files (current):\n${JSON.stringify(selectedFiles.slice(0, 20), null, 2)}\n\nCandidate files (current):\n${JSON.stringify(candidateFiles.slice(0, 30), null, 2)}\n\n${resumedContextCapsule ? `Resumed context capsule:\\n${resumedContextCapsule}\\n` : \"\"}\n\nOrdered question parts:\n${JSON.stringify(orderedQuestions, null, 2)}\n\nAllowed research actions (use only these):\n${JSON.stringify(RESEARCH_ACTIONS, null, 2)}\n\nRules:\n- Return 2-4 ordered steps.\n- Every step action must be one of the allowed research actions.\n- Include \"questionId\" when one question clearly owns the step.\n- Include architecture synthesis as final step when scope is multi-file or repo-wide.\n- Prefer deterministic filePath values:\n - research-impact-map => \"__research__/impact-map\"\n - research-symbol-trace => \"__research__/symbol-trace\"\n - research-risk-check => \"__research__/risk-check\"\n - research-architecture-synthesis => \"__research__/architecture-synthesis\"\n - research-trail-expand => \"__research__/trail-expand\"\n- Return strict JSON only:\n{\n \"steps\": [\n { \"id\": \"research:1\", \"action\": \"research-impact-map\", \"actionId\": \"research-impact-map\", \"actionArgs\": {}, \"targetFile\": \"__research__/impact-map\", \"description\": \"...\" }\n ]\n}\n `.trim();\n\n try {\n const input: ModuleIO = { query: intentText, content: prompt };\n const generated = await generate(input, {\n caller: \"researchPlanGenStep\",\n inputContext: {\n intentText,\n intentCategory,\n orderedQuestions,\n scopeType,\n selectedFiles,\n candidateFiles,\n resumedContextCapsule,\n allowedActions: RESEARCH_ACTIONS,\n },\n });\n const raw =\n typeof generated.data === \"string\"\n ? generated.data\n : JSON.stringify(generated.data ?? \"{}\");\n const cleaned = await cleanupModule.run({ query: intentText, content: raw });\n const jsonString =\n typeof cleaned.content === \"string\"\n ? cleaned.content\n : JSON.stringify(cleaned.content ?? \"{}\");\n\n const parsed = JSON.parse(jsonString) as { steps?: AgentPlanStep[] };\n const candidateSteps = Array.isArray(parsed.steps) ? parsed.steps : [];\n const allowedSet = new Set(RESEARCH_ACTIONS.map(a => a.action));\n\n const normalized: AgentPlanStep[] = candidateSteps\n .filter(step => typeof step?.action === \"string\" && allowedSet.has(step.action as ResearchAction))\n .map((step, index) => {\n const action = step.action as ResearchAction;\n const defaultFile =\n action === \"research-impact-map\"\n ? \"__research__/impact-map\"\n : action === \"research-symbol-trace\"\n ? \"__research__/symbol-trace\"\n : action === \"research-risk-check\"\n ? \"__research__/risk-check\"\n : action === \"research-trail-expand\"\n ? \"__research__/trail-expand\"\n : \"__research__/architecture-synthesis\";\n\n return {\n id: step.id ?? `research:${index + 1}`,\n action,\n // Example: action=\"research-risk-check\" stays identical actionId.\n actionId: step.actionId ?? action,\n actionArgs: step.actionArgs ?? {},\n questionId: typeof step.questionId === \"string\" ? step.questionId : undefined,\n targetFile: step.targetFile ?? defaultFile,\n description: step.description ?? `Run ${action}`,\n metadata: step.metadata ?? {},\n groups: [\"analysis\", \"planning\"],\n };\n })\n .slice(0, 4);\n\n context.analysis.planSuggestion = { plan: { steps: normalized } };\n logInputOutput(\"researchPlanGen\", \"output\", {\n callId: generated.trace?.callId,\n steps: normalized,\n });\n } catch (err) {\n console.warn(\"[researchPlanGenStep] Failed to generate research plan:\", err);\n context.analysis.planSuggestion = { plan: { steps: [] } };\n logInputOutput(\"researchPlanGen\", \"output\", { steps: [] });\n }\n },\n};\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolveAgentTargetClassification.js","sourceRoot":"","sources":["../../src/agents/resolveAgentTargetClassification.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,cAAc,yCAAyC,CAAC","sourcesContent":["/**\n * Re-exports modular target classification helpers from the legacy simple-agent path.\n */\nexport * from \"../agent/policy/targetClassification.js\";\n"]}
|
|
@@ -103,3 +103,4 @@ function hasExplicitWriteIntent(query) {
|
|
|
103
103
|
const q = query.toLowerCase();
|
|
104
104
|
return /\b(add|update|edit|modify|refactor|rewrite|implement|fix|create|remove|delete|replace|rename|write|patch|change|increment|bump|set)\b/.test(q);
|
|
105
105
|
}
|
|
106
|
+
//# sourceMappingURL=resolveExecutionModeStep.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolveExecutionModeStep.js","sourceRoot":"","sources":["../../src/agents/resolveExecutionModeStep.ts"],"names":[],"mappings":"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","sourcesContent":["import { StructuredContext } from \"../types\";\n\nexport const resolveExecutionModeStep = {\n name: \"resolveExecutionMode\",\n\n description:\n \"Derive a hard execution mode from the interpreted user intent. \" +\n \"This decision is authoritative and must not be changed later.\",\n\n run: async (context: StructuredContext): Promise<void> => {\n const intent = context.analysis?.intent;\n if (!intent) {\n throw new Error(\"resolveExecutionMode: missing analysis.intent\");\n }\n const normalizedQuery =\n intent.normalizedQuery?.trim() ??\n context.initContext?.userQuery?.trim() ??\n \"\";\n\n // ───── Defaults: safe, read-only ─────\n let mode: \"analyze\" | \"transform\" = \"analyze\";\n let rationale = \"Defaulted to analysis mode.\";\n let constraints = {\n allowAnalysis: true,\n allowPlanning: true,\n allowFileWrites: false,\n docsOnly: false\n };\n\n switch (intent.intentCategory) {\n // ───── Code-changing intents ─────\n case \"codingTask\":\n case \"refactorTask\":\n mode = \"transform\";\n rationale = \"User intent implies code modification.\";\n constraints = {\n allowAnalysis: true,\n allowPlanning: true,\n allowFileWrites: true,\n docsOnly: false\n };\n break;\n\n // ───── Docs / comments only ─────\n case \"docsAndComments\":\n case \"docsandcomments\":\n case \"docsAndComment\":\n case \"docs\":\n case \"comments\":\n case \"comment\":\n mode = \"transform\";\n rationale = \"User intent requests documentation/comments only.\";\n constraints = {\n allowAnalysis: false,\n allowPlanning: false,\n allowFileWrites: true,\n docsOnly: true\n };\n break;\n\n // ───── Generic requests: promote to transform when edit intent is explicit ─────\n case \"request\":\n if (hasExplicitWriteIntent(normalizedQuery)) {\n mode = \"transform\";\n rationale = \"Request contains explicit edit intent.\";\n constraints = {\n allowAnalysis: true,\n allowPlanning: true,\n allowFileWrites: true,\n docsOnly: false\n };\n }\n break;\n\n // ───── Everything else is analysis ─────\n case \"debugging\":\n case \"planning\":\n case \"question\":\n case \"explanation\":\n case \"writing\":\n // keep defaults\n rationale = \"User intent implies investigation or explanation.\";\n break;\n }\n\n // Safety override: question-form prompts should remain read-only unless\n // they explicitly ask for edits (e.g. \"How do I update README?\").\n if (isQuestionLikeQuery(normalizedQuery) && !hasExplicitWriteIntent(normalizedQuery)) {\n mode = \"analyze\";\n rationale = \"Question-form intent without explicit edit verb — forced analysis mode.\";\n constraints = {\n allowAnalysis: true,\n allowPlanning: true,\n allowFileWrites: false,\n docsOnly: false\n };\n }\n\n context.executionControl = {\n mode,\n rationale,\n confidence: intent.confidence,\n constraints\n };\n }\n};\n\nfunction isQuestionLikeQuery(query: string): boolean {\n const q = query.trim().toLowerCase();\n if (!q) return false;\n if (q.endsWith(\"?\")) return true;\n return /^(what|why|how|which|where|when|who)\\b/.test(q);\n}\n\nfunction hasExplicitWriteIntent(query: string): boolean {\n const q = query.toLowerCase();\n return /\\b(add|update|edit|modify|refactor|rewrite|implement|fix|create|remove|delete|replace|rename|write|patch|change|increment|bump|set)\\b/.test(q);\n}\n"]}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { logInputOutput } from "../utils/promptLogHelper.js";
|
|
2
|
+
import { SearchOrchestrator } from "../search/SearchOrchestrator.js";
|
|
3
|
+
import { deriveFocusFromSearchStep } from "./deriveFocusFromSearchStep.js";
|
|
4
|
+
import path from "path";
|
|
5
|
+
export const resolveExplicitTargetsStep = {
|
|
6
|
+
name: "resolveExplicitTargets",
|
|
7
|
+
async run(context) {
|
|
8
|
+
context.analysis ?? (context.analysis = {});
|
|
9
|
+
const query = context.initContext?.userQuery ?? "";
|
|
10
|
+
const orchestrator = new SearchOrchestrator();
|
|
11
|
+
const search = await orchestrator.run({
|
|
12
|
+
context,
|
|
13
|
+
query,
|
|
14
|
+
mode: "exact-target",
|
|
15
|
+
});
|
|
16
|
+
resetStaleFocusForNewExplicitTargets(context, search);
|
|
17
|
+
deriveFocusFromSearchStep.run(context, search);
|
|
18
|
+
logInputOutput("resolveExplicitTargetsStep", "output", {
|
|
19
|
+
mode: search.mode,
|
|
20
|
+
resolvedTargetFiles: search.resolvedFiles.map(item => item.path),
|
|
21
|
+
resolvedTargetFolders: search.resolvedFolders,
|
|
22
|
+
resolvedTargetSymbols: search.resolvedSymbols,
|
|
23
|
+
unresolvedTargetRefs: search.unresolvedRefs,
|
|
24
|
+
ambiguousTargetRefs: search.ambiguousRefs,
|
|
25
|
+
enteredBroadFallback: search.unresolvedRefs.length > 0 && search.resolvedFiles.length === 0,
|
|
26
|
+
});
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Clears stale per-turn focus when a new explicit target is stronger than resumed task context.
|
|
31
|
+
*
|
|
32
|
+
* Examples:
|
|
33
|
+
* - previous wrong answer left `guardPolicy.ts` selected, new query says `check guards`
|
|
34
|
+
* - resumed currentStep points at one old file, new exact-target resolves a different folder
|
|
35
|
+
*/
|
|
36
|
+
function resetStaleFocusForNewExplicitTargets(context, search) {
|
|
37
|
+
var _a;
|
|
38
|
+
const hasExplicitResolution = search.resolvedFiles.length > 0 ||
|
|
39
|
+
search.resolvedFolders.length > 0 ||
|
|
40
|
+
search.resolvedSymbols.length > 0;
|
|
41
|
+
if (!hasExplicitResolution)
|
|
42
|
+
return;
|
|
43
|
+
context.analysis ?? (context.analysis = {});
|
|
44
|
+
(_a = context.analysis).focus || (_a.focus = { selectedFiles: [], candidateFiles: [] });
|
|
45
|
+
const nextScopeFiles = new Set(search.resolvedFiles.map(item => item.path));
|
|
46
|
+
const nextScopeCandidates = new Set(search.fileCandidates.map(item => item.path));
|
|
47
|
+
const nextScopeFolders = search.resolvedFolders.map(folder => path.normalize(folder));
|
|
48
|
+
const existingSelected = context.analysis.focus.selectedFiles ?? [];
|
|
49
|
+
const existingCandidates = context.analysis.focus.candidateFiles ?? [];
|
|
50
|
+
const currentStepPath = context.task?.currentStep?.filePath;
|
|
51
|
+
const fitsNextScope = (filePath) => {
|
|
52
|
+
const normalized = path.normalize(String(filePath ?? ""));
|
|
53
|
+
if (!normalized)
|
|
54
|
+
return false;
|
|
55
|
+
if (nextScopeFiles.has(normalized) || nextScopeCandidates.has(normalized))
|
|
56
|
+
return true;
|
|
57
|
+
return nextScopeFolders.some(folder => normalized === folder || normalized.startsWith(`${folder}${path.sep}`));
|
|
58
|
+
};
|
|
59
|
+
const staleSelected = existingSelected.some(filePath => !fitsNextScope(filePath));
|
|
60
|
+
const staleCandidates = existingCandidates.some(filePath => !fitsNextScope(filePath));
|
|
61
|
+
const staleCurrentStep = currentStepPath ? !fitsNextScope(currentStepPath) : false;
|
|
62
|
+
if (!staleSelected && !staleCandidates && !staleCurrentStep) {
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
context.analysis.focus.selectedFiles = [];
|
|
66
|
+
context.analysis.focus.candidateFiles = [];
|
|
67
|
+
context.analysis.focus.executionRequired = [];
|
|
68
|
+
context.analysis.focus.explorationCandidates = [];
|
|
69
|
+
context.analysis.focus.executionLock = { enabled: false, files: [], reason: "reset-for-new-explicit-target" };
|
|
70
|
+
if (context.task) {
|
|
71
|
+
context.task.currentStep = undefined;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=resolveExplicitTargetsStep.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolveExplicitTargetsStep.js","sourceRoot":"","sources":["../../src/agents/resolveExplicitTargetsStep.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Resolves explicit file, folder, and symbol references through the shared search orchestrator.\n *\n * Why this exists:\n * - intent extraction only collects possible refs from the query text\n * - search should own discovery before routing decides how narrow to stay\n * - this step keeps the old compatibility fields, but the source of truth is the search packet\n */\nimport type { StructuredContext } from \"../types.js\";\nimport { logInputOutput } from \"../utils/promptLogHelper.js\";\nimport { SearchOrchestrator } from \"../search/SearchOrchestrator.js\";\nimport { deriveFocusFromSearchStep } from \"./deriveFocusFromSearchStep.js\";\nimport path from \"path\";\n\nexport const resolveExplicitTargetsStep = {\n name: \"resolveExplicitTargets\",\n\n async run(context: StructuredContext): Promise<void> {\n context.analysis ??= {};\n const query = context.initContext?.userQuery ?? \"\";\n const orchestrator = new SearchOrchestrator();\n const search = await orchestrator.run({\n context,\n query,\n mode: \"exact-target\",\n });\n resetStaleFocusForNewExplicitTargets(context, search);\n deriveFocusFromSearchStep.run(context, search);\n\n logInputOutput(\"resolveExplicitTargetsStep\", \"output\", {\n mode: search.mode,\n resolvedTargetFiles: search.resolvedFiles.map(item => item.path),\n resolvedTargetFolders: search.resolvedFolders,\n resolvedTargetSymbols: search.resolvedSymbols,\n unresolvedTargetRefs: search.unresolvedRefs,\n ambiguousTargetRefs: search.ambiguousRefs,\n enteredBroadFallback: search.unresolvedRefs.length > 0 && search.resolvedFiles.length === 0,\n });\n },\n};\n\n/**\n * Clears stale per-turn focus when a new explicit target is stronger than resumed task context.\n *\n * Examples:\n * - previous wrong answer left `guardPolicy.ts` selected, new query says `check guards`\n * - resumed currentStep points at one old file, new exact-target resolves a different folder\n */\nfunction resetStaleFocusForNewExplicitTargets(context: StructuredContext, search: Awaited<ReturnType<SearchOrchestrator[\"run\"]>>): void {\n const hasExplicitResolution =\n search.resolvedFiles.length > 0 ||\n search.resolvedFolders.length > 0 ||\n search.resolvedSymbols.length > 0;\n if (!hasExplicitResolution) return;\n\n context.analysis ??= {};\n context.analysis.focus ||= { selectedFiles: [], candidateFiles: [] };\n\n const nextScopeFiles = new Set(search.resolvedFiles.map(item => item.path));\n const nextScopeCandidates = new Set(search.fileCandidates.map(item => item.path));\n const nextScopeFolders = search.resolvedFolders.map(folder => path.normalize(folder));\n\n const existingSelected = context.analysis.focus.selectedFiles ?? [];\n const existingCandidates = context.analysis.focus.candidateFiles ?? [];\n const currentStepPath = context.task?.currentStep?.filePath;\n\n const fitsNextScope = (filePath: string | undefined): boolean => {\n const normalized = path.normalize(String(filePath ?? \"\"));\n if (!normalized) return false;\n if (nextScopeFiles.has(normalized) || nextScopeCandidates.has(normalized)) return true;\n return nextScopeFolders.some(folder => normalized === folder || normalized.startsWith(`${folder}${path.sep}`));\n };\n\n const staleSelected = existingSelected.some(filePath => !fitsNextScope(filePath));\n const staleCandidates = existingCandidates.some(filePath => !fitsNextScope(filePath));\n const staleCurrentStep = currentStepPath ? !fitsNextScope(currentStepPath) : false;\n\n if (!staleSelected && !staleCandidates && !staleCurrentStep) {\n return;\n }\n\n context.analysis.focus.selectedFiles = [];\n context.analysis.focus.candidateFiles = [];\n context.analysis.focus.executionRequired = [];\n context.analysis.focus.explorationCandidates = [];\n context.analysis.focus.executionLock = { enabled: false, files: [], reason: \"reset-for-new-explicit-target\" };\n if (context.task) {\n context.task.currentStep = undefined;\n }\n}\n"]}
|
|
@@ -12,6 +12,14 @@ export const routingDecisionStep = {
|
|
|
12
12
|
const scope = (context.analysis.scopeType ?? "repo-wide");
|
|
13
13
|
const intentCategory = context.analysis.intent?.intentCategory ?? "request";
|
|
14
14
|
const intentConfidence = context.analysis.intent?.confidence ?? 0.5;
|
|
15
|
+
const resolvedExplicitTargets = context.analysis.focus?.resolvedTargetFiles ??
|
|
16
|
+
context.analysis.intent?.resolvedTargetFiles ??
|
|
17
|
+
[];
|
|
18
|
+
const resolvedExplicitFolders = context.analysis.focus?.resolvedTargetFolders ?? [];
|
|
19
|
+
const unresolvedExplicitRefs = context.analysis.search?.unresolvedRefs ?? [];
|
|
20
|
+
const ambiguousExplicitRefs = context.analysis.search?.ambiguousRefs ?? [];
|
|
21
|
+
const resumeIntent = context.analysis.resumeIntent;
|
|
22
|
+
const continuityDecision = context.analysis.continuityDecision;
|
|
15
23
|
const query = context.initContext?.userQuery?.trim() ?? "";
|
|
16
24
|
const canWrite = context.executionControl?.constraints?.allowFileWrites ?? false;
|
|
17
25
|
const complexitySignals = [
|
|
@@ -29,7 +37,29 @@ export const routingDecisionStep = {
|
|
|
29
37
|
let decision = "has-info";
|
|
30
38
|
let allowSearch = true;
|
|
31
39
|
let scopeLocked = false;
|
|
32
|
-
if (
|
|
40
|
+
if (resolvedExplicitTargets.length > 0) {
|
|
41
|
+
allowSearch = false;
|
|
42
|
+
scopeLocked = true;
|
|
43
|
+
decision = "has-info";
|
|
44
|
+
}
|
|
45
|
+
else if (resolvedExplicitFolders.length > 0) {
|
|
46
|
+
// Folder targets are explicit scope, but they still need search to expand into concrete files.
|
|
47
|
+
allowSearch = true;
|
|
48
|
+
scopeLocked = true;
|
|
49
|
+
decision = "needs-info";
|
|
50
|
+
}
|
|
51
|
+
else if (continuityDecision?.answerNow) {
|
|
52
|
+
allowSearch = false;
|
|
53
|
+
scopeLocked = true;
|
|
54
|
+
decision = "has-info";
|
|
55
|
+
}
|
|
56
|
+
else if (resumeIntent?.kind === "continuity-next-step" && !continuityDecision?.answerNow) {
|
|
57
|
+
const hasResumeFiles = resumeIntent.relevantResumeFiles.length > 0;
|
|
58
|
+
allowSearch = !hasResumeFiles;
|
|
59
|
+
scopeLocked = hasResumeFiles;
|
|
60
|
+
decision = hasResumeFiles ? "has-info" : "needs-info";
|
|
61
|
+
}
|
|
62
|
+
else if (scope === "none") {
|
|
33
63
|
allowSearch = false;
|
|
34
64
|
scopeLocked = true;
|
|
35
65
|
}
|
|
@@ -45,22 +75,32 @@ export const routingDecisionStep = {
|
|
|
45
75
|
if (!allowSearch) {
|
|
46
76
|
decision = "has-info";
|
|
47
77
|
}
|
|
48
|
-
const routeLabel =
|
|
49
|
-
? "
|
|
50
|
-
:
|
|
51
|
-
? "
|
|
52
|
-
:
|
|
53
|
-
? "
|
|
54
|
-
:
|
|
55
|
-
|
|
78
|
+
const routeLabel = resolvedExplicitTargets.length > 0 || resolvedExplicitFolders.length > 0
|
|
79
|
+
? "explicit-target"
|
|
80
|
+
: continuityDecision?.answerNow
|
|
81
|
+
? "resume-continuity"
|
|
82
|
+
: !allowSearch
|
|
83
|
+
? "direct-answer"
|
|
84
|
+
: isResearchScope
|
|
85
|
+
? "repo-research"
|
|
86
|
+
: scope === "single-file"
|
|
87
|
+
? "single-file-focused"
|
|
88
|
+
: "bounded-analysis";
|
|
89
|
+
const allowResearch = resolvedExplicitTargets.length === 0 &&
|
|
90
|
+
resolvedExplicitFolders.length === 0 &&
|
|
91
|
+
!continuityDecision?.answerNow &&
|
|
92
|
+
scope !== "none" &&
|
|
56
93
|
((isAnalysisLike && isResearchScope && (decision === "needs-info" || complexitySignals >= 2)) ||
|
|
57
94
|
(isRefactorLike && complexitySignals >= 1));
|
|
58
95
|
const confidence = Math.max(0, Math.min(1, 0.55 + intentConfidence * 0.35 - (ambiguousIntent ? 0.2 : 0)));
|
|
96
|
+
const allowTransform = continuityDecision?.answerNow || resumeIntent?.fastTrackEligible
|
|
97
|
+
? false
|
|
98
|
+
: canWrite && scope !== "none";
|
|
59
99
|
const routingDecision = {
|
|
60
100
|
decision,
|
|
61
101
|
allowSearch,
|
|
62
102
|
allowResearch,
|
|
63
|
-
allowTransform
|
|
103
|
+
allowTransform,
|
|
64
104
|
scopeLocked,
|
|
65
105
|
confidence: Number(confidence.toFixed(2)),
|
|
66
106
|
rationale: [
|
|
@@ -69,10 +109,17 @@ export const routingDecisionStep = {
|
|
|
69
109
|
`intent=${intentCategory}`,
|
|
70
110
|
`complexitySignals=${complexitySignals}`,
|
|
71
111
|
`hasTargets=${hasExplicitTargets}`,
|
|
72
|
-
|
|
112
|
+
`resolvedTargets=${resolvedExplicitTargets.length}`,
|
|
113
|
+
`resolvedFolders=${resolvedExplicitFolders.length}`,
|
|
114
|
+
`unresolvedTargets=${unresolvedExplicitRefs.length}`,
|
|
115
|
+
`ambiguousTargets=${ambiguousExplicitRefs.length}`,
|
|
116
|
+
resumeIntent ? `resumeIntent=${resumeIntent.kind}` : "",
|
|
117
|
+
continuityDecision ? `continuityDecision=${continuityDecision.kind}` : "",
|
|
118
|
+
].filter(Boolean).join("; "),
|
|
73
119
|
};
|
|
74
120
|
context.analysis.routingDecision = routingDecision;
|
|
75
121
|
logInputOutput("routingDecisionStep", "output", routingDecision);
|
|
76
122
|
return routingDecision;
|
|
77
123
|
},
|
|
78
124
|
};
|
|
125
|
+
//# sourceMappingURL=routingDecisionStep.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routingDecisionStep.js","sourceRoot":"","sources":["../../src/agents/routingDecisionStep.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Shapes the initial route from already-known analysis signals.\n *\n * Priority order:\n * 1. resolved explicit targets\n * 2. continuity decisions for resumed tasks\n * 3. generic scope/intent heuristics\n *\n * Example:\n * - resolved `index.ts` target -> stay narrow, no broad search\n * - resolved folder `cli/src/agents` -> keep the explicit-target lane, but still allow search to expand inside that folder\n * - continuity summary with enough resumed state -> direct-answer lane\n * - repo-wide explanation -> needs-info, allow evidence and research\n */\nimport type { StructuredContext, RoutingDecision, ScopeType } from \"../types.js\";\nimport { logInputOutput } from \"../utils/promptLogHelper.js\";\n\n/**\n * Computes an initial routing decision from existing analysis signals.\n * This step is intentionally deterministic and non-invasive:\n * it only writes analysis.routingDecision for observability.\n */\nexport const routingDecisionStep = {\n name: \"routingDecision\",\n description: \"Derive a lightweight routing decision for logging and downstream planning context.\",\n\n run: async (context: StructuredContext): Promise<RoutingDecision> => {\n context.analysis ||= {};\n\n const scope = (context.analysis.scopeType ?? \"repo-wide\") as ScopeType;\n const intentCategory = context.analysis.intent?.intentCategory ?? \"request\";\n const intentConfidence = context.analysis.intent?.confidence ?? 0.5;\n const resolvedExplicitTargets =\n context.analysis.focus?.resolvedTargetFiles ??\n context.analysis.intent?.resolvedTargetFiles ??\n [];\n const resolvedExplicitFolders = context.analysis.focus?.resolvedTargetFolders ?? [];\n const unresolvedExplicitRefs = context.analysis.search?.unresolvedRefs ?? [];\n const ambiguousExplicitRefs = context.analysis.search?.ambiguousRefs ?? [];\n const resumeIntent = context.analysis.resumeIntent;\n const continuityDecision = context.analysis.continuityDecision;\n const query = context.initContext?.userQuery?.trim() ?? \"\";\n const canWrite = context.executionControl?.constraints?.allowFileWrites ?? false;\n\n const complexitySignals = [\n /\\b(and|also|plus|as well as|in addition)\\b/gi,\n /\\b(compare|trade[\\s-]?off|pros and cons|strategy|architecture)\\b/gi,\n /\\?/g,\n ].reduce((sum, rx) => sum + ((query.match(rx) ?? []).length > 0 ? 1 : 0), 0);\n\n const isResearchScope = scope === \"repo-wide\";\n const hasExplicitTargets = (context.analysis.intent?.targetFiles?.length ?? 0) > 0;\n const ambiguousIntent = intentConfidence < 0.45;\n const isRefactorLike = intentCategory === \"refactorTask\" || intentCategory === \"codingTask\";\n const isAnalysisLike =\n intentCategory === \"question\" ||\n intentCategory === \"analysis\" ||\n intentCategory === \"explanation\";\n\n let decision: RoutingDecision[\"decision\"] = \"has-info\";\n let allowSearch = true;\n let scopeLocked = false;\n\n if (resolvedExplicitTargets.length > 0) {\n allowSearch = false;\n scopeLocked = true;\n decision = \"has-info\";\n } else if (resolvedExplicitFolders.length > 0) {\n // Folder targets are explicit scope, but they still need search to expand into concrete files.\n allowSearch = true;\n scopeLocked = true;\n decision = \"needs-info\";\n } else if (continuityDecision?.answerNow) {\n allowSearch = false;\n scopeLocked = true;\n decision = \"has-info\";\n } else if (resumeIntent?.kind === \"continuity-next-step\" && !continuityDecision?.answerNow) {\n const hasResumeFiles = resumeIntent.relevantResumeFiles.length > 0;\n allowSearch = !hasResumeFiles;\n scopeLocked = hasResumeFiles;\n decision = hasResumeFiles ? \"has-info\" : \"needs-info\";\n } else if (scope === \"none\") {\n allowSearch = false;\n scopeLocked = true;\n } else if (scope === \"single-file\" && hasExplicitTargets) {\n scopeLocked = true;\n } else if (scope === \"repo-wide\") {\n scopeLocked = false;\n }\n\n if (isResearchScope || ambiguousIntent || complexitySignals >= 2) {\n decision = \"needs-info\";\n }\n\n if (!allowSearch) {\n decision = \"has-info\";\n }\n\n const routeLabel = resolvedExplicitTargets.length > 0 || resolvedExplicitFolders.length > 0\n ? \"explicit-target\"\n : continuityDecision?.answerNow\n ? \"resume-continuity\"\n : !allowSearch\n ? \"direct-answer\"\n : isResearchScope\n ? \"repo-research\"\n : scope === \"single-file\"\n ? \"single-file-focused\"\n : \"bounded-analysis\";\n\n const allowResearch =\n resolvedExplicitTargets.length === 0 &&\n resolvedExplicitFolders.length === 0 &&\n !continuityDecision?.answerNow &&\n scope !== \"none\" &&\n (\n (isAnalysisLike && isResearchScope && (decision === \"needs-info\" || complexitySignals >= 2)) ||\n (isRefactorLike && complexitySignals >= 1)\n );\n\n const confidence = Math.max(0, Math.min(1, 0.55 + intentConfidence * 0.35 - (ambiguousIntent ? 0.2 : 0)));\n\n const allowTransform =\n continuityDecision?.answerNow || resumeIntent?.fastTrackEligible\n ? false\n : canWrite && scope !== \"none\";\n\n const routingDecision: RoutingDecision = {\n decision,\n allowSearch,\n allowResearch,\n allowTransform,\n scopeLocked,\n confidence: Number(confidence.toFixed(2)),\n rationale: [\n `route=${routeLabel}`,\n `scope=${scope}`,\n `intent=${intentCategory}`,\n `complexitySignals=${complexitySignals}`,\n `hasTargets=${hasExplicitTargets}`,\n `resolvedTargets=${resolvedExplicitTargets.length}`,\n `resolvedFolders=${resolvedExplicitFolders.length}`,\n `unresolvedTargets=${unresolvedExplicitRefs.length}`,\n `ambiguousTargets=${ambiguousExplicitRefs.length}`,\n resumeIntent ? `resumeIntent=${resumeIntent.kind}` : \"\",\n continuityDecision ? `continuityDecision=${continuityDecision.kind}` : \"\",\n ].filter(Boolean).join(\"; \"),\n };\n\n context.analysis.routingDecision = routingDecision;\n\n logInputOutput(\"routingDecisionStep\", \"output\", routingDecision);\n return routingDecision;\n },\n};\n"]}
|
|
@@ -1,9 +1,32 @@
|
|
|
1
1
|
import { generate } from "../lib/generate.js";
|
|
2
2
|
import { cleanupModule } from "../pipeline/modules/cleanupModule.js";
|
|
3
3
|
import { logInputOutput } from "../utils/promptLogHelper.js";
|
|
4
|
+
import { buildResumePacket, renderResumePacket } from "../utils/resumeState.js";
|
|
5
|
+
function reduceScopeClassificationCapsule(value) {
|
|
6
|
+
if (!value.trim())
|
|
7
|
+
return "";
|
|
8
|
+
const lines = value
|
|
9
|
+
.split("\n")
|
|
10
|
+
.map(line => line.trim())
|
|
11
|
+
.filter(Boolean);
|
|
12
|
+
const keepPrefixes = [
|
|
13
|
+
"Original task:",
|
|
14
|
+
"Current task status:",
|
|
15
|
+
"- Normalized intent:",
|
|
16
|
+
"- Selected files:",
|
|
17
|
+
"New user query:",
|
|
18
|
+
];
|
|
19
|
+
const reduced = lines.filter(line => keepPrefixes.some(prefix => line.startsWith(prefix)));
|
|
20
|
+
return (reduced.length > 0 ? reduced : lines.slice(0, 5)).join("\n");
|
|
21
|
+
}
|
|
4
22
|
export const scopeClassificationStep = {
|
|
5
23
|
run: async (context) => {
|
|
6
24
|
const query = context.initContext?.userQuery?.trim() ?? "";
|
|
25
|
+
const resumedContextCapsule = reduceScopeClassificationCapsule((renderResumePacket(buildResumePacket(context.analysis?.resumeState)) ||
|
|
26
|
+
context.initContext?.resumedContextCapsule?.trim() ||
|
|
27
|
+
""));
|
|
28
|
+
const explicitTargetFiles = context.analysis?.intent?.targetFiles ?? [];
|
|
29
|
+
const orderedQuestions = context.analysis?.intent?.questions ?? [];
|
|
7
30
|
context.analysis ?? (context.analysis = {});
|
|
8
31
|
// ------------------------------------------------------------
|
|
9
32
|
// 1️⃣ Prepare deterministic hints for the LLM
|
|
@@ -23,9 +46,15 @@ export const scopeClassificationStep = {
|
|
|
23
46
|
/\b(class|function|method|module)\s+\w+/i.test(lower)) {
|
|
24
47
|
hints.push("The query references a specific file, class, function, or module; possibly single-file scope.");
|
|
25
48
|
}
|
|
49
|
+
if (orderedQuestions.length > 1) {
|
|
50
|
+
hints.push(`The query contains ${orderedQuestions.length} ordered question parts; do not collapse it to a narrow single-file scope unless all parts point to one file.`);
|
|
51
|
+
}
|
|
26
52
|
// ------------------------------------------------------------
|
|
27
53
|
// 2️⃣ LLM classification
|
|
28
54
|
// ------------------------------------------------------------
|
|
55
|
+
const explicitTargetHints = explicitTargetFiles.length > 0
|
|
56
|
+
? `Explicit targets:\n- ${explicitTargetFiles.join("\n- ")}\n`
|
|
57
|
+
: "";
|
|
29
58
|
const prompt = `
|
|
30
59
|
You classify the scope of a user's request in a software repository.
|
|
31
60
|
|
|
@@ -39,18 +68,35 @@ Definitions:
|
|
|
39
68
|
- "multi-file": involves several related files/modules.
|
|
40
69
|
- "repo-wide": broad/systemic across the repository.
|
|
41
70
|
|
|
42
|
-
|
|
43
|
-
|
|
71
|
+
Current query:
|
|
72
|
+
${query}
|
|
73
|
+
|
|
74
|
+
${explicitTargetHints}
|
|
75
|
+
|
|
76
|
+
${orderedQuestions.length > 1 ? `Ordered question parts:\n${orderedQuestions.map((question, index) => `${index + 1}. ${question.text}`).join("\n")}\n` : ""}
|
|
77
|
+
|
|
78
|
+
${resumedContextCapsule ? `Resumed context capsule:\n${resumedContextCapsule}\n` : ""}
|
|
44
79
|
|
|
45
80
|
Hints for classification:
|
|
46
81
|
${hints.length ? "- " + hints.join("\n- ") : "None"}
|
|
47
82
|
`.trim();
|
|
48
83
|
let llmScope = null;
|
|
84
|
+
let callId;
|
|
49
85
|
let fallbackApplied = false;
|
|
50
86
|
let normalizationApplied = false;
|
|
51
87
|
try {
|
|
52
88
|
const genInput = { query, content: prompt };
|
|
53
|
-
const genOutput = await generate(genInput
|
|
89
|
+
const genOutput = await generate(genInput, {
|
|
90
|
+
caller: "scopeClassificationStep",
|
|
91
|
+
inputContext: {
|
|
92
|
+
query,
|
|
93
|
+
resumedContextCapsule,
|
|
94
|
+
explicitTargetFiles,
|
|
95
|
+
orderedQuestions,
|
|
96
|
+
hints,
|
|
97
|
+
},
|
|
98
|
+
});
|
|
99
|
+
callId = genOutput.trace?.callId;
|
|
54
100
|
const raw = typeof genOutput.data === "string"
|
|
55
101
|
? genOutput.data
|
|
56
102
|
: JSON.stringify(genOutput.data ?? "{}");
|
|
@@ -74,8 +120,24 @@ ${hints.length ? "- " + hints.join("\n- ") : "None"}
|
|
|
74
120
|
llmScope = "repo-wide";
|
|
75
121
|
fallbackApplied = true;
|
|
76
122
|
}
|
|
123
|
+
const explicitFilenameMatches = query.match(/\b[\w-]+\.(ts|js|tsx|jsx|py|java|go|rs|cpp|c|cs)\b/gi) ?? [];
|
|
124
|
+
const explicitFileCount = new Set([
|
|
125
|
+
...explicitTargetFiles.map(file => file.toLowerCase()),
|
|
126
|
+
...explicitFilenameMatches.map(file => file.toLowerCase()),
|
|
127
|
+
]).size;
|
|
128
|
+
if (explicitFileCount >= 2 && llmScope === "single-file") {
|
|
129
|
+
llmScope = "multi-file";
|
|
130
|
+
normalizationApplied = true;
|
|
131
|
+
}
|
|
132
|
+
if (orderedQuestions.length > 1 && llmScope === "single-file") {
|
|
133
|
+
llmScope = orderedQuestions.some((question) => /\b(codebase|repo|repository|whole repo|entire repo|system)\b/i.test(question.text))
|
|
134
|
+
? "repo-wide"
|
|
135
|
+
: "multi-file";
|
|
136
|
+
normalizationApplied = true;
|
|
137
|
+
}
|
|
77
138
|
context.analysis.scopeType = llmScope;
|
|
78
139
|
logInputOutput("scopeClassificationStep", "output", {
|
|
140
|
+
callId,
|
|
79
141
|
llmScope,
|
|
80
142
|
fallbackScope: "repo-wide",
|
|
81
143
|
finalScope: llmScope,
|
|
@@ -90,3 +152,4 @@ ${hints.length ? "- " + hints.join("\n- ") : "None"}
|
|
|
90
152
|
return { scopeType: llmScope };
|
|
91
153
|
},
|
|
92
154
|
};
|
|
155
|
+
//# sourceMappingURL=scopeClassificationStep.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scopeClassificationStep.js","sourceRoot":"","sources":["../../src/agents/scopeClassificationStep.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Classifies query scope with a small prompt so early routing is cheap and stable.\n *\n * Why this file exists:\n * - scope is one of the first routing signals, so noise here spreads through the run\n * - continuity follow-ups need only a tiny reminder, not the whole resumed state\n * - explicit target hints should help classification without repeating the user query\n */\nimport type { StructuredContext, ScopeType } from \"../types.js\";\nimport { generate } from \"../lib/generate.js\";\nimport { cleanupModule } from \"../pipeline/modules/cleanupModule.js\";\nimport { logInputOutput } from \"../utils/promptLogHelper.js\";\nimport { buildResumePacket, renderResumePacket } from \"../utils/resumeState.js\";\n\nfunction reduceScopeClassificationCapsule(value: string): string {\n if (!value.trim()) return \"\";\n const lines = value\n .split(\"\\n\")\n .map(line => line.trim())\n .filter(Boolean);\n const keepPrefixes = [\n \"Original task:\",\n \"Current task status:\",\n \"- Normalized intent:\",\n \"- Selected files:\",\n \"New user query:\",\n ];\n const reduced = lines.filter(line => keepPrefixes.some(prefix => line.startsWith(prefix)));\n return (reduced.length > 0 ? reduced : lines.slice(0, 5)).join(\"\\n\");\n}\n\nexport const scopeClassificationStep = {\n run: async (context: StructuredContext) => {\n const query = context.initContext?.userQuery?.trim() ?? \"\";\n const resumedContextCapsule = reduceScopeClassificationCapsule(\n (renderResumePacket(buildResumePacket(context.analysis?.resumeState)) ||\n context.initContext?.resumedContextCapsule?.trim() ||\n \"\")\n );\n const explicitTargetFiles = context.analysis?.intent?.targetFiles ?? [];\n const orderedQuestions = context.analysis?.intent?.questions ?? [];\n\n context.analysis ??= {};\n\n // ------------------------------------------------------------\n // 1️⃣ Prepare deterministic hints for the LLM\n // ------------------------------------------------------------\n const lower = query.toLowerCase();\n\n const hints: string[] = [];\n\n // Systemic/repo-wide hints\n if (/\\b(codebase|entire repo|whole repo|entire project|whole project|application|system)\\b/i.test(lower)) {\n hints.push(\"The query mentions the entire codebase or system; likely repo-wide scope.\");\n }\n\n // Debugging or error hints\n if (/\\b(debug|issue|bug|memory leak|performance|error|crash|failure)\\b/i.test(lower)) {\n hints.push(\"The query mentions debugging, errors, or memory/performance issues; consider broad impact.\");\n }\n\n // Explicit artifact references\n if (/\\b[\\w-]+\\.(ts|js|tsx|jsx|py|java|go|rs|cpp|c|cs)\\b/i.test(lower) ||\n /\\b(class|function|method|module)\\s+\\w+/i.test(lower)) {\n hints.push(\"The query references a specific file, class, function, or module; possibly single-file scope.\");\n }\n\n if (orderedQuestions.length > 1) {\n hints.push(`The query contains ${orderedQuestions.length} ordered question parts; do not collapse it to a narrow single-file scope unless all parts point to one file.`);\n }\n\n // ------------------------------------------------------------\n // 2️⃣ LLM classification\n // ------------------------------------------------------------\n const explicitTargetHints = explicitTargetFiles.length > 0\n ? `Explicit targets:\\n- ${explicitTargetFiles.join(\"\\n- \")}\\n`\n : \"\";\n const prompt = `\nYou classify the scope of a user's request in a software repository.\n\nReturn STRICT JSON:\n{\n \"scopeType\": \"single-file\" | \"multi-file\" | \"repo-wide\"\n}\n\nDefinitions:\n- \"single-file\": clearly limited to one specific file or artifact.\n- \"multi-file\": involves several related files/modules.\n- \"repo-wide\": broad/systemic across the repository.\n\nCurrent query:\n${query}\n\n${explicitTargetHints}\n\n${orderedQuestions.length > 1 ? `Ordered question parts:\\n${orderedQuestions.map((question, index) => `${index + 1}. ${question.text}`).join(\"\\n\")}\\n` : \"\"}\n\n${resumedContextCapsule ? `Resumed context capsule:\\n${resumedContextCapsule}\\n` : \"\"}\n\nHints for classification:\n${hints.length ? \"- \" + hints.join(\"\\n- \") : \"None\"}\n `.trim();\n\n let llmScope: ScopeType | null = null;\n let callId: string | undefined;\n let fallbackApplied = false;\n let normalizationApplied = false;\n\n try {\n const genInput = { query, content: prompt };\n const genOutput = await generate(genInput, {\n caller: \"scopeClassificationStep\",\n inputContext: {\n query,\n resumedContextCapsule,\n explicitTargetFiles,\n orderedQuestions,\n hints,\n },\n });\n callId = genOutput.trace?.callId;\n\n const raw =\n typeof genOutput.data === \"string\"\n ? genOutput.data\n : JSON.stringify(genOutput.data ?? \"{}\");\n\n const cleaned = await cleanupModule.run({ query, content: raw });\n\n const jsonString =\n typeof cleaned.content === \"string\"\n ? cleaned.content\n : JSON.stringify(cleaned.content ?? \"{}\");\n\n const parsed = JSON.parse(jsonString);\n\n if (\n parsed &&\n [\"none\", \"single-file\", \"multi-file\", \"repo-wide\"].includes(parsed.scopeType)\n ) {\n llmScope = parsed.scopeType as ScopeType;\n }\n } catch (err) {\n console.warn(\"⚠️ LLM scope classification failed, falling back:\", err);\n }\n\n // ------------------------------------------------------------\n // 3️⃣ Safe fallback if LLM fails\n // ------------------------------------------------------------\n if (!llmScope) {\n llmScope = \"repo-wide\";\n fallbackApplied = true;\n }\n\n const explicitFilenameMatches = query.match(/\\b[\\w-]+\\.(ts|js|tsx|jsx|py|java|go|rs|cpp|c|cs)\\b/gi) ?? [];\n const explicitFileCount = new Set([\n ...explicitTargetFiles.map(file => file.toLowerCase()),\n ...explicitFilenameMatches.map(file => file.toLowerCase()),\n ]).size;\n\n if (explicitFileCount >= 2 && llmScope === \"single-file\") {\n llmScope = \"multi-file\";\n normalizationApplied = true;\n }\n\n if (orderedQuestions.length > 1 && llmScope === \"single-file\") {\n llmScope = orderedQuestions.some((question) => /\\b(codebase|repo|repository|whole repo|entire repo|system)\\b/i.test(question.text))\n ? \"repo-wide\"\n : \"multi-file\";\n normalizationApplied = true;\n }\n\n context.analysis.scopeType = llmScope;\n\n logInputOutput(\"scopeClassificationStep\", \"output\", {\n callId,\n llmScope,\n fallbackScope: \"repo-wide\",\n finalScope: llmScope,\n fallbackApplied,\n normalizationApplied,\n reasoning: fallbackApplied\n ? \"fallback-default\"\n : normalizationApplied\n ? \"normalized-none-to-repo-wide\"\n : \"llm\",\n });\n\n return { scopeType: llmScope };\n },\n};\n"]}
|