scai 0.1.178 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +162 -267
- package/dist/__tests__/CommitSuggesterCmd.test.js +112 -0
- package/dist/__tests__/CommitSuggesterCmd.test.js.map +1 -0
- package/dist/__tests__/EvalReportCmd.test.js +645 -0
- package/dist/__tests__/EvalReportCmd.test.js.map +1 -0
- package/dist/__tests__/ModelCmd.test.js +64 -0
- package/dist/__tests__/ModelCmd.test.js.map +1 -0
- package/dist/__tests__/agents/agentActions.test.js +345 -0
- package/dist/__tests__/agents/agentActions.test.js.map +1 -0
- package/dist/__tests__/agents/agentFeedback.test.js +118 -0
- package/dist/__tests__/agents/agentFeedback.test.js.map +1 -0
- package/dist/__tests__/agents/agentGeneralScope.test.js +74 -0
- package/dist/__tests__/agents/agentGeneralScope.test.js.map +1 -0
- package/dist/__tests__/agents/agentLoop.test.js +1723 -0
- package/dist/__tests__/agents/agentLoop.test.js.map +1 -0
- package/dist/__tests__/agents/agentPolicyState.test.js +948 -0
- package/dist/__tests__/agents/agentPolicyState.test.js.map +1 -0
- package/dist/__tests__/agents/agentReadEvidence.test.js +170 -0
- package/dist/__tests__/agents/agentReadEvidence.test.js.map +1 -0
- package/dist/__tests__/agents/agentReadPersistence.test.js +129 -0
- package/dist/__tests__/agents/agentReadPersistence.test.js.map +1 -0
- package/dist/__tests__/agents/agentResumeCheckpoint.test.js +90 -0
- package/dist/__tests__/agents/agentResumeCheckpoint.test.js.map +1 -0
- package/dist/__tests__/agents/agentSearchBatchPlanner.test.js +289 -0
- package/dist/__tests__/agents/agentSearchBatchPlanner.test.js.map +1 -0
- package/dist/__tests__/agents/agentSearchOwnership.test.js +166 -0
- package/dist/__tests__/agents/agentSearchOwnership.test.js.map +1 -0
- package/dist/__tests__/agents/agentSearchRanking.test.js +139 -0
- package/dist/__tests__/agents/agentSearchRanking.test.js.map +1 -0
- package/dist/__tests__/agents/agentSearchRouting.test.js +584 -0
- package/dist/__tests__/agents/agentSearchRouting.test.js.map +1 -0
- package/dist/__tests__/agents/agentSearchScoring.test.js +23 -0
- package/dist/__tests__/agents/agentSearchScoring.test.js.map +1 -0
- package/dist/__tests__/agents/agentSearchShared.test.js +78 -0
- package/dist/__tests__/agents/agentSearchShared.test.js.map +1 -0
- package/dist/__tests__/agents/agentStateMachine.test.js +58 -0
- package/dist/__tests__/agents/agentStateMachine.test.js.map +1 -0
- package/dist/__tests__/agents/agentTaskPersistence.test.js +156 -0
- package/dist/__tests__/agents/agentTaskPersistence.test.js.map +1 -0
- package/dist/__tests__/agents/agentTools.test.js +69 -0
- package/dist/__tests__/agents/agentTools.test.js.map +1 -0
- package/dist/__tests__/agents/agentTransform.test.js +779 -0
- package/dist/__tests__/agents/agentTransform.test.js.map +1 -0
- package/dist/__tests__/agents/analysisPlanGenStep.test.js +157 -0
- package/dist/__tests__/agents/analysisPlanGenStep.test.js.map +1 -0
- package/dist/__tests__/agents/answerOnlyCompletion.test.js +75 -0
- package/dist/__tests__/agents/answerOnlyCompletion.test.js.map +1 -0
- package/dist/__tests__/agents/decideNextAction.test.js +1662 -0
- package/dist/__tests__/agents/decideNextAction.test.js.map +1 -0
- package/dist/__tests__/agents/deriveFocusFromSearchStep.test.js +258 -0
- package/dist/__tests__/agents/deriveFocusFromSearchStep.test.js.map +1 -0
- package/dist/__tests__/agents/evidenceVerifierStep.test.js +113 -0
- package/dist/__tests__/agents/evidenceVerifierStep.test.js.map +1 -0
- package/dist/__tests__/agents/executionPolicyResolver.test.js +208 -0
- package/dist/__tests__/agents/executionPolicyResolver.test.js.map +1 -0
- package/dist/__tests__/agents/fileCheckStep.test.js +299 -0
- package/dist/__tests__/agents/fileCheckStep.test.js.map +1 -0
- package/dist/__tests__/agents/giveUpEvaluatorStep.test.js +35 -0
- package/dist/__tests__/agents/giveUpEvaluatorStep.test.js.map +1 -0
- package/dist/__tests__/agents/guardState.test.js +297 -0
- package/dist/__tests__/agents/guardState.test.js.map +1 -0
- package/dist/__tests__/agents/mainAgentHeuristics.test.js +72 -0
- package/dist/__tests__/agents/mainAgentHeuristics.test.js.map +1 -0
- package/dist/__tests__/agents/objectiveEvaluatorStep.test.js +60 -0
- package/dist/__tests__/agents/objectiveEvaluatorStep.test.js.map +1 -0
- package/dist/__tests__/agents/outerLoopRecoveryEvaluator.test.js +207 -0
- package/dist/__tests__/agents/outerLoopRecoveryEvaluator.test.js.map +1 -0
- package/dist/__tests__/agents/prompting.test.js +363 -0
- package/dist/__tests__/agents/prompting.test.js.map +1 -0
- package/dist/__tests__/agents/readinessGateStep.test.js +180 -0
- package/dist/__tests__/agents/readinessGateStep.test.js.map +1 -0
- package/dist/__tests__/agents/reasonNextStep.test.js +56 -0
- package/dist/__tests__/agents/reasonNextStep.test.js.map +1 -0
- package/dist/__tests__/agents/reasonNextTaskStep.test.js +284 -0
- package/dist/__tests__/agents/reasonNextTaskStep.test.js.map +1 -0
- package/dist/__tests__/agents/resolveAgentTargetClassification.test.js +170 -0
- package/dist/__tests__/agents/resolveAgentTargetClassification.test.js.map +1 -0
- package/dist/__tests__/agents/resolveProgressState.test.js +526 -0
- package/dist/__tests__/agents/resolveProgressState.test.js.map +1 -0
- package/dist/__tests__/agents/resumeCheckpoint.test.js +50 -0
- package/dist/__tests__/agents/resumeCheckpoint.test.js.map +1 -0
- package/dist/__tests__/agents/routingDecisionStep.test.js +134 -0
- package/dist/__tests__/agents/routingDecisionStep.test.js.map +1 -0
- package/dist/__tests__/agents/scopeClassificationStep.test.js +118 -0
- package/dist/__tests__/agents/scopeClassificationStep.test.js.map +1 -0
- package/dist/__tests__/agents/searchContext.test.js +97 -0
- package/dist/__tests__/agents/searchContext.test.js.map +1 -0
- package/dist/__tests__/agents/selectRelevantSourcesStep.test.js +73 -0
- package/dist/__tests__/agents/selectRelevantSourcesStep.test.js.map +1 -0
- package/dist/__tests__/agents/structuredOutput.test.js +45 -0
- package/dist/__tests__/agents/structuredOutput.test.js.map +1 -0
- package/dist/__tests__/agents/transformPlanGenStep.fallback.test.js +59 -0
- package/dist/__tests__/agents/transformPlanGenStep.fallback.test.js.map +1 -0
- package/dist/__tests__/agents/transformPlanGenStep.test.js +92 -0
- package/dist/__tests__/agents/transformPlanGenStep.test.js.map +1 -0
- package/dist/__tests__/agents/understandIntentStep.test.js +237 -0
- package/dist/__tests__/agents/understandIntentStep.test.js.map +1 -0
- package/dist/__tests__/agents/understandResumeContext.test.js +65 -0
- package/dist/__tests__/agents/understandResumeContext.test.js.map +1 -0
- package/dist/__tests__/agents/understandScope.test.js +227 -0
- package/dist/__tests__/agents/understandScope.test.js.map +1 -0
- package/dist/__tests__/agents/validateChangesStep.test.js +52 -0
- package/dist/__tests__/agents/validateChangesStep.test.js.map +1 -0
- package/dist/__tests__/askCommandTaskBinding.test.js +176 -0
- package/dist/__tests__/askCommandTaskBinding.test.js.map +1 -0
- package/dist/__tests__/commandVisibility.test.js +25 -0
- package/dist/__tests__/commandVisibility.test.js.map +1 -0
- package/dist/__tests__/config.devOutput.test.js +82 -0
- package/dist/__tests__/config.devOutput.test.js.map +1 -0
- package/dist/__tests__/currentContext.test.js +43 -0
- package/dist/__tests__/currentContext.test.js.map +1 -0
- package/dist/__tests__/daemonWorker.test.js +51 -0
- package/dist/__tests__/daemonWorker.test.js.map +1 -0
- package/dist/__tests__/dialogState.test.js +113 -0
- package/dist/__tests__/dialogState.test.js.map +1 -0
- package/dist/__tests__/evalCommands.test.js +506 -0
- package/dist/__tests__/evalCommands.test.js.map +1 -0
- package/dist/__tests__/evalCommandsSummary.test.js +68 -0
- package/dist/__tests__/evalCommandsSummary.test.js.map +1 -0
- package/dist/__tests__/example.test.js +1 -0
- package/dist/__tests__/example.test.js.map +1 -0
- package/dist/__tests__/factory.commitCommand.test.js +45 -0
- package/dist/__tests__/factory.commitCommand.test.js.map +1 -0
- package/dist/__tests__/factory.devOutputCommand.test.js +122 -0
- package/dist/__tests__/factory.devOutputCommand.test.js.map +1 -0
- package/dist/__tests__/factory.evalCommands.test.js +38 -0
- package/dist/__tests__/factory.evalCommands.test.js.map +1 -0
- package/dist/__tests__/factory.planCommand.test.js +35 -0
- package/dist/__tests__/factory.planCommand.test.js.map +1 -0
- package/dist/__tests__/factory.setupCommand.test.js +34 -0
- package/dist/__tests__/factory.setupCommand.test.js.map +1 -0
- package/dist/__tests__/factory.statusCommand.test.js +54 -0
- package/dist/__tests__/factory.statusCommand.test.js.map +1 -0
- package/dist/__tests__/fileRules/queryTokenRules.test.js +35 -0
- package/dist/__tests__/fileRules/queryTokenRules.test.js.map +1 -0
- package/dist/__tests__/fileRules/searchPathClassification.test.js +57 -0
- package/dist/__tests__/fileRules/searchPathClassification.test.js.map +1 -0
- package/dist/__tests__/generate.ollamaRecovery.test.js +344 -0
- package/dist/__tests__/generate.ollamaRecovery.test.js.map +1 -0
- package/dist/__tests__/index.modelStartup.test.js +24 -0
- package/dist/__tests__/index.modelStartup.test.js.map +1 -0
- package/dist/__tests__/indexCmd.test.js +85 -0
- package/dist/__tests__/indexCmd.test.js.map +1 -0
- package/dist/__tests__/indexSlashCommand.test.js +50 -0
- package/dist/__tests__/indexSlashCommand.test.js.map +1 -0
- package/dist/__tests__/ollamaService.test.js +103 -0
- package/dist/__tests__/ollamaService.test.js.map +1 -0
- package/dist/__tests__/pipeline/modules/codeTransformModule.small-file.test.js +68 -0
- package/dist/__tests__/pipeline/modules/codeTransformModule.small-file.test.js.map +1 -0
- package/dist/__tests__/pipeline/modules/commitSuggesterModule.test.js +68 -0
- package/dist/__tests__/pipeline/modules/commitSuggesterModule.test.js.map +1 -0
- package/dist/__tests__/pipeline/modules/fileSearchModule.test.js +284 -0
- package/dist/__tests__/pipeline/modules/fileSearchModule.test.js.map +1 -0
- package/dist/__tests__/pipeline/modules/finalAnswerModule.test.js +1139 -0
- package/dist/__tests__/pipeline/modules/finalAnswerModule.test.js.map +1 -0
- package/dist/__tests__/pipeline/modules/readFileModule.test.js +146 -0
- package/dist/__tests__/pipeline/modules/readFileModule.test.js.map +1 -0
- package/dist/__tests__/pipeline/modules/semanticAnalysisModule.test.js +192 -0
- package/dist/__tests__/pipeline/modules/semanticAnalysisModule.test.js.map +1 -0
- package/dist/__tests__/repoIdentity.test.js +31 -0
- package/dist/__tests__/repoIdentity.test.js.map +1 -0
- package/dist/__tests__/resumeContext.test.js +87 -0
- package/dist/__tests__/resumeContext.test.js.map +1 -0
- package/dist/__tests__/resumeState.test.js +239 -0
- package/dist/__tests__/resumeState.test.js.map +1 -0
- package/dist/__tests__/search/SearchOrchestrator.test.js +836 -0
- package/dist/__tests__/search/SearchOrchestrator.test.js.map +1 -0
- package/dist/__tests__/shellDialogUi.test.js +52 -0
- package/dist/__tests__/shellDialogUi.test.js.map +1 -0
- package/dist/__tests__/shellSession.test.js +102 -0
- package/dist/__tests__/shellSession.test.js.map +1 -0
- package/dist/__tests__/statusOwner.test.js +215 -0
- package/dist/__tests__/statusOwner.test.js.map +1 -0
- package/dist/__tests__/testing/contextEval.test.js +244 -0
- package/dist/__tests__/testing/contextEval.test.js.map +1 -0
- package/dist/__tests__/testing/harnessArtifacts.test.js +124 -0
- package/dist/__tests__/testing/harnessArtifacts.test.js.map +1 -0
- package/dist/__tests__/testing/llmTraceSession.test.js +67 -0
- package/dist/__tests__/testing/llmTraceSession.test.js.map +1 -0
- package/dist/__tests__/testing/registerDevCliCommands.test.js +35 -0
- package/dist/__tests__/testing/registerDevCliCommands.test.js.map +1 -0
- package/dist/__tests__/testing/runDiagnosis.test.js +159 -0
- package/dist/__tests__/testing/runDiagnosis.test.js.map +1 -0
- package/dist/__tests__/testing/runtimeLogReader.test.js +66 -0
- package/dist/__tests__/testing/runtimeLogReader.test.js.map +1 -0
- package/dist/__tests__/testing/testCommands.test.js +53 -0
- package/dist/__tests__/testing/testCommands.test.js.map +1 -0
- package/dist/__tests__/utils/compileSearchQuery.test.js +38 -0
- package/dist/__tests__/utils/compileSearchQuery.test.js.map +1 -0
- package/dist/__tests__/utils/consolePresentation.test.js +105 -0
- package/dist/__tests__/utils/consolePresentation.test.js.map +1 -0
- package/dist/__tests__/utils/extractFileReferences.test.js +41 -0
- package/dist/__tests__/utils/extractFileReferences.test.js.map +1 -0
- package/dist/__tests__/utils/log.test.js +34 -0
- package/dist/__tests__/utils/log.test.js.map +1 -0
- package/dist/__tests__/utils/runtimeLogger.test.js +200 -0
- package/dist/__tests__/utils/runtimeLogger.test.js.map +1 -0
- package/dist/__tests__/utils/spinner.test.js +31 -0
- package/dist/__tests__/utils/spinner.test.js.map +1 -0
- package/dist/__tests__/utils/verifyFocusPreference.test.js +41 -0
- package/dist/__tests__/utils/verifyFocusPreference.test.js.map +1 -0
- package/dist/agent/actions/index.js +301 -0
- package/dist/agent/actions/index.js.map +1 -0
- package/dist/agent/actions/normalize.js +360 -0
- package/dist/agent/actions/normalize.js.map +1 -0
- package/dist/agent/actions/schemas.js +129 -0
- package/dist/agent/actions/schemas.js.map +1 -0
- package/dist/agent/evidence/index.js +320 -0
- package/dist/agent/evidence/index.js.map +1 -0
- package/dist/agent/feedback/index.js +187 -0
- package/dist/agent/feedback/index.js.map +1 -0
- package/dist/agent/finalization/index.js +35 -0
- package/dist/agent/finalization/index.js.map +1 -0
- package/dist/agent/index.js +126 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/agent/logging/index.js +350 -0
- package/dist/agent/logging/index.js.map +1 -0
- package/dist/agent/persistence/boot.js +58 -0
- package/dist/agent/persistence/boot.js.map +1 -0
- package/dist/agent/persistence/currentTask.js +36 -0
- package/dist/agent/persistence/currentTask.js.map +1 -0
- package/dist/agent/persistence/hydrate.js +42 -0
- package/dist/agent/persistence/hydrate.js.map +1 -0
- package/dist/agent/persistence/index.js +15 -0
- package/dist/agent/persistence/index.js.map +1 -0
- package/dist/agent/persistence/snapshots.js +97 -0
- package/dist/agent/persistence/snapshots.js.map +1 -0
- package/dist/agent/persistence/steps.js +95 -0
- package/dist/agent/persistence/steps.js.map +1 -0
- package/dist/agent/persistence/tasks.js +195 -0
- package/dist/agent/persistence/tasks.js.map +1 -0
- package/dist/agent/persistence/turns.js +92 -0
- package/dist/agent/persistence/turns.js.map +1 -0
- package/dist/agent/policy/ambiguityResolution.js +226 -0
- package/dist/agent/policy/ambiguityResolution.js.map +1 -0
- package/dist/agent/policy/contracts.js +2 -0
- package/dist/agent/policy/contracts.js.map +1 -0
- package/dist/agent/policy/coveragePolicy.js +309 -0
- package/dist/agent/policy/coveragePolicy.js.map +1 -0
- package/dist/agent/policy/endDecisionPolicy.js +31 -0
- package/dist/agent/policy/endDecisionPolicy.js.map +1 -0
- package/dist/agent/policy/index.js +344 -0
- package/dist/agent/policy/index.js.map +1 -0
- package/dist/agent/policy/loopReview.js +778 -0
- package/dist/agent/policy/loopReview.js.map +1 -0
- package/dist/agent/policy/readinessPolicy.js +108 -0
- package/dist/agent/policy/readinessPolicy.js.map +1 -0
- package/dist/agent/policy/resolutionPipeline.js +356 -0
- package/dist/agent/policy/resolutionPipeline.js.map +1 -0
- package/dist/agent/policy/targetClassification.js +33 -0
- package/dist/agent/policy/targetClassification.js.map +1 -0
- package/dist/agent/prompting/actionChoice.js +90 -0
- package/dist/agent/prompting/actionChoice.js.map +1 -0
- package/dist/agent/prompting/finalAnswer.js +38 -0
- package/dist/agent/prompting/finalAnswer.js.map +1 -0
- package/dist/agent/prompting/index.js +14 -0
- package/dist/agent/prompting/index.js.map +1 -0
- package/dist/agent/prompting/plan.js +59 -0
- package/dist/agent/prompting/plan.js.map +1 -0
- package/dist/agent/prompting/transform.js +175 -0
- package/dist/agent/prompting/transform.js.map +1 -0
- package/dist/agent/prompting/understand.js +70 -0
- package/dist/agent/prompting/understand.js.map +1 -0
- package/dist/agent/read/freshness.js +29 -0
- package/dist/agent/read/freshness.js.map +1 -0
- package/dist/agent/read/fullReadPrompt.js +43 -0
- package/dist/agent/read/fullReadPrompt.js.map +1 -0
- package/dist/agent/read/index.js +140 -0
- package/dist/agent/read/index.js.map +1 -0
- package/dist/agent/read/persistence.js +88 -0
- package/dist/agent/read/persistence.js.map +1 -0
- package/dist/agent/read/summarizeReadEvidence.js +733 -0
- package/dist/agent/read/summarizeReadEvidence.js.map +1 -0
- package/dist/agent/read/targetResolution.js +126 -0
- package/dist/agent/read/targetResolution.js.map +1 -0
- package/dist/agent/resume/checkpoint.js +41 -0
- package/dist/agent/resume/checkpoint.js.map +1 -0
- package/dist/agent/runtime/lifecycle.js +67 -0
- package/dist/agent/runtime/lifecycle.js.map +1 -0
- package/dist/agent/runtime/progress.js +178 -0
- package/dist/agent/runtime/progress.js.map +1 -0
- package/dist/agent/runtime/runAgentLoop.js +402 -0
- package/dist/agent/runtime/runAgentLoop.js.map +1 -0
- package/dist/agent/runtime/runAgentPlanOnly.js +127 -0
- package/dist/agent/runtime/runAgentPlanOnly.js.map +1 -0
- package/dist/agent/runtime/understand.js +336 -0
- package/dist/agent/runtime/understand.js.map +1 -0
- package/dist/agent/search/batchPlanner.js +274 -0
- package/dist/agent/search/batchPlanner.js.map +1 -0
- package/dist/agent/search/candidateRetentionPolicy.js +184 -0
- package/dist/agent/search/candidateRetentionPolicy.js.map +1 -0
- package/dist/agent/search/directory.js +51 -0
- package/dist/agent/search/directory.js.map +1 -0
- package/dist/agent/search/exactTarget.js +151 -0
- package/dist/agent/search/exactTarget.js.map +1 -0
- package/dist/agent/search/fragment.js +110 -0
- package/dist/agent/search/fragment.js.map +1 -0
- package/dist/agent/search/index.js +166 -0
- package/dist/agent/search/index.js.map +1 -0
- package/dist/agent/search/laneClassifier.js +119 -0
- package/dist/agent/search/laneClassifier.js.map +1 -0
- package/dist/agent/search/limits.js +10 -0
- package/dist/agent/search/limits.js.map +1 -0
- package/dist/agent/search/ranking.js +22 -0
- package/dist/agent/search/ranking.js.map +1 -0
- package/dist/agent/search/regex.js +83 -0
- package/dist/agent/search/regex.js.map +1 -0
- package/dist/agent/search/routePolicy.js +11 -0
- package/dist/agent/search/routePolicy.js.map +1 -0
- package/dist/agent/search/searchContext.js +128 -0
- package/dist/agent/search/searchContext.js.map +1 -0
- package/dist/agent/search/semantic.js +113 -0
- package/dist/agent/search/semantic.js.map +1 -0
- package/dist/agent/search/semanticIndexSearch.js +202 -0
- package/dist/agent/search/semanticIndexSearch.js.map +1 -0
- package/dist/agent/search/shared.js +283 -0
- package/dist/agent/search/shared.js.map +1 -0
- package/dist/agent/search/shell.js +202 -0
- package/dist/agent/search/shell.js.map +1 -0
- package/dist/agent/search/snippetEvidence.js +57 -0
- package/dist/agent/search/snippetEvidence.js.map +1 -0
- package/dist/agent/search/types.js +2 -0
- package/dist/agent/search/types.js.map +1 -0
- package/dist/agent/state/index.js +99 -0
- package/dist/agent/state/index.js.map +1 -0
- package/dist/agent/state/memory.js +56 -0
- package/dist/agent/state/memory.js.map +1 -0
- package/dist/agent/structuredOutput/index.js +28 -0
- package/dist/agent/structuredOutput/index.js.map +1 -0
- package/dist/agent/tools/index.js +199 -0
- package/dist/agent/tools/index.js.map +1 -0
- package/dist/agent/transform/index.js +519 -0
- package/dist/agent/transform/index.js.map +1 -0
- package/dist/agent/transform/syntax.js +49 -0
- package/dist/agent/transform/syntax.js.map +1 -0
- package/dist/agent/types.js +20 -0
- package/dist/agent/types.js.map +1 -0
- package/dist/agents/actionRegistry.js +114 -0
- package/dist/agents/actionRegistry.js.map +1 -0
- package/dist/agents/agent.js +5 -0
- package/dist/agents/agent.js.map +1 -0
- package/dist/agents/agentActions.js +5 -0
- package/dist/agents/agentActions.js.map +1 -0
- package/dist/agents/agentEvidence.js +5 -0
- package/dist/agents/agentEvidence.js.map +1 -0
- package/dist/agents/agentFeedback.js +5 -0
- package/dist/agents/agentFeedback.js.map +1 -0
- package/dist/agents/agentLogging.js +5 -0
- package/dist/agents/agentLogging.js.map +1 -0
- package/dist/agents/agentLoop.js +5 -0
- package/dist/agents/agentLoop.js.map +1 -0
- package/dist/agents/agentMemory.js +5 -0
- package/dist/agents/agentMemory.js.map +1 -0
- package/dist/agents/agentPlanMode.js +5 -0
- package/dist/agents/agentPlanMode.js.map +1 -0
- package/dist/agents/agentPolicyState.js +5 -0
- package/dist/agents/agentPolicyState.js.map +1 -0
- package/dist/agents/agentProgress.js +93 -0
- package/dist/agents/agentProgress.js.map +1 -0
- package/dist/agents/agentSchemas.js +5 -0
- package/dist/agents/agentSchemas.js.map +1 -0
- package/dist/agents/agentSearchScoring.js +5 -0
- package/dist/agents/agentSearchScoring.js.map +1 -0
- package/dist/agents/agentStateMachine.js +5 -0
- package/dist/agents/agentStateMachine.js.map +1 -0
- package/dist/agents/agentTools.js +5 -0
- package/dist/agents/agentTools.js.map +1 -0
- package/dist/agents/agentTypes.js +5 -0
- package/dist/agents/agentTypes.js.map +1 -0
- package/dist/agents/agentUnderstand.js +5 -0
- package/dist/agents/agentUnderstand.js.map +1 -0
- package/dist/agents/analysisPlanGenStep.js +194 -17
- package/dist/agents/analysisPlanGenStep.js.map +1 -0
- package/dist/agents/answerOnlyCompletion.js +32 -0
- package/dist/agents/answerOnlyCompletion.js.map +1 -0
- package/dist/agents/collaboratorStep.js +1 -0
- package/dist/agents/collaboratorStep.js.map +1 -0
- package/dist/agents/decideNextAction.js +444 -0
- package/dist/agents/decideNextAction.js.map +1 -0
- package/dist/agents/deriveFocusFromSearchStep.js +83 -0
- package/dist/agents/deriveFocusFromSearchStep.js.map +1 -0
- package/dist/agents/evidenceVerifierStep.js +104 -13
- package/dist/agents/evidenceVerifierStep.js.map +1 -0
- package/dist/agents/fileCheckStep.js +381 -12
- package/dist/agents/fileCheckStep.js.map +1 -0
- package/dist/agents/giveUpEvaluatorStep.js +63 -0
- package/dist/agents/giveUpEvaluatorStep.js.map +1 -0
- package/dist/agents/guardPolicy.js +20 -0
- package/dist/agents/guardPolicy.js.map +1 -0
- package/dist/agents/guards/executionPolicyResolver.js +165 -0
- package/dist/agents/guards/executionPolicyResolver.js.map +1 -0
- package/dist/agents/guards/guardState.js +195 -0
- package/dist/agents/guards/guardState.js.map +1 -0
- package/dist/agents/guards/resolveProgressState.js +403 -0
- package/dist/agents/guards/resolveProgressState.js.map +1 -0
- package/dist/agents/infoPlanGenStep.js +66 -8
- package/dist/agents/infoPlanGenStep.js.map +1 -0
- package/dist/agents/integrateFeedbackStep.js +1 -0
- package/dist/agents/integrateFeedbackStep.js.map +1 -0
- package/dist/agents/iterationFileSelector.js +8 -7
- package/dist/agents/iterationFileSelector.js.map +1 -0
- package/dist/agents/mainAgentActivityLog.js +85 -0
- package/dist/agents/mainAgentActivityLog.js.map +1 -0
- package/dist/agents/mainAgentHeuristics.js +173 -0
- package/dist/agents/mainAgentHeuristics.js.map +1 -0
- package/dist/agents/mainAgentVerify.js +159 -0
- package/dist/agents/mainAgentVerify.js.map +1 -0
- package/dist/agents/objectiveEvaluatorStep.js +103 -0
- package/dist/agents/objectiveEvaluatorStep.js.map +1 -0
- package/dist/agents/outerLoopRecoveryEvaluator.js +108 -0
- package/dist/agents/outerLoopRecoveryEvaluator.js.map +1 -0
- package/dist/agents/readinessGateStep.js +95 -9
- package/dist/agents/readinessGateStep.js.map +1 -0
- package/dist/agents/reasonNextStep.js +9 -8
- package/dist/agents/reasonNextStep.js.map +1 -0
- package/dist/agents/reasonNextTaskStep.js +267 -144
- package/dist/agents/reasonNextTaskStep.js.map +1 -0
- package/dist/agents/researchPlanGenStep.js +61 -25
- package/dist/agents/researchPlanGenStep.js.map +1 -0
- package/dist/agents/resolveAgentTargetClassification.js +5 -0
- package/dist/agents/resolveAgentTargetClassification.js.map +1 -0
- package/dist/agents/resolveExecutionModeStep.js +1 -0
- package/dist/agents/resolveExecutionModeStep.js.map +1 -0
- package/dist/agents/resolveExplicitTargetsStep.js +74 -0
- package/dist/agents/resolveExplicitTargetsStep.js.map +1 -0
- package/dist/agents/routingDecisionStep.js +58 -11
- package/dist/agents/routingDecisionStep.js.map +1 -0
- package/dist/agents/scopeClassificationStep.js +66 -3
- package/dist/agents/scopeClassificationStep.js.map +1 -0
- package/dist/agents/selectRelevantSourcesStep.js +13 -5
- package/dist/agents/selectRelevantSourcesStep.js.map +1 -0
- package/dist/agents/structuralPreloadStep.js +3 -4
- package/dist/agents/structuralPreloadStep.js.map +1 -0
- package/dist/agents/transformPlanGenStep.js +105 -18
- package/dist/agents/transformPlanGenStep.js.map +1 -0
- package/dist/agents/understandIntentStep.js +237 -17
- package/dist/agents/understandIntentStep.js.map +1 -0
- package/dist/agents/validateChangesStep.js +16 -2
- package/dist/agents/validateChangesStep.js.map +1 -0
- package/dist/agents/writeFileStep.js +1 -0
- package/dist/agents/writeFileStep.js.map +1 -0
- package/dist/commands/AskCmd.js +139 -44
- package/dist/commands/AskCmd.js.map +1 -0
- package/dist/commands/BackupCmd.js +1 -0
- package/dist/commands/BackupCmd.js.map +1 -0
- package/dist/commands/ChangeLogUpdateCmd.js +1 -0
- package/dist/commands/ChangeLogUpdateCmd.js.map +1 -0
- package/dist/commands/CommitSuggesterCmd.js +55 -13
- package/dist/commands/CommitSuggesterCmd.js.map +1 -0
- package/dist/commands/DaemonCmd.js +52 -14
- package/dist/commands/DaemonCmd.js.map +1 -0
- package/dist/commands/DeleteIndex.js +1 -0
- package/dist/commands/DeleteIndex.js.map +1 -0
- package/dist/commands/EvalReportCmd.js +374 -0
- package/dist/commands/EvalReportCmd.js.map +1 -0
- package/dist/commands/FindCmd.js +1 -0
- package/dist/commands/FindCmd.js.map +1 -0
- package/dist/commands/GitCmd.js +1 -0
- package/dist/commands/GitCmd.js.map +1 -0
- package/dist/commands/IndexCmd.js +11 -79
- package/dist/commands/IndexCmd.js.map +1 -0
- package/dist/commands/InspectCmd.js +1 -0
- package/dist/commands/InspectCmd.js.map +1 -0
- package/dist/commands/ModelCmd.js +24 -0
- package/dist/commands/ModelCmd.js.map +1 -0
- package/dist/commands/ReadlineSingleton.js +1 -0
- package/dist/commands/ReadlineSingleton.js.map +1 -0
- package/dist/commands/ResetDbCmd.js +18 -1
- package/dist/commands/ResetDbCmd.js.map +1 -0
- package/dist/commands/ReviewCmd.js +1 -0
- package/dist/commands/ReviewCmd.js.map +1 -0
- package/dist/commands/StatusCmd.js +22 -0
- package/dist/commands/StatusCmd.js.map +1 -0
- package/dist/commands/StopDaemonCmd.js +1 -0
- package/dist/commands/StopDaemonCmd.js.map +1 -0
- package/dist/commands/SummaryCmd.js +1 -0
- package/dist/commands/SummaryCmd.js.map +1 -0
- package/dist/commands/SwitchCmd.js +9 -15
- package/dist/commands/SwitchCmd.js.map +1 -0
- package/dist/commands/TasksCmd.js +142 -57
- package/dist/commands/TasksCmd.js.map +1 -0
- package/dist/commands/TestCmd.js +66 -0
- package/dist/commands/TestCmd.js.map +1 -0
- package/dist/commands/WorkflowCmd.js +1 -0
- package/dist/commands/WorkflowCmd.js.map +1 -0
- package/dist/commands/commandVisibility.js +27 -0
- package/dist/commands/commandVisibility.js.map +1 -0
- package/dist/commands/evalCommands.js +1337 -0
- package/dist/commands/evalCommands.js.map +1 -0
- package/dist/commands/factory.js +206 -38
- package/dist/commands/factory.js.map +1 -0
- package/dist/config.js +62 -11
- package/dist/config.js.map +1 -0
- package/dist/constants.js +21 -3
- package/dist/constants.js.map +1 -0
- package/dist/context.js +33 -32
- package/dist/context.js.map +1 -0
- package/dist/daemon/daemonQueues.js +1 -20
- package/dist/daemon/daemonQueues.js.map +1 -0
- package/dist/daemon/daemonWorker.js +26 -37
- package/dist/daemon/daemonWorker.js.map +1 -0
- package/dist/daemon/generateSummaries.js +1 -0
- package/dist/daemon/generateSummaries.js.map +1 -0
- package/dist/daemon/runFolderCapsuleBatch.js +1 -0
- package/dist/daemon/runFolderCapsuleBatch.js.map +1 -0
- package/dist/daemon/runIndexingBatch.js +1 -0
- package/dist/daemon/runIndexingBatch.js.map +1 -0
- package/dist/daemon/runKgBatch.js +9 -1
- package/dist/daemon/runKgBatch.js.map +1 -0
- package/dist/db/backup.js +1 -0
- package/dist/db/backup.js.map +1 -0
- package/dist/db/client.js +18 -3
- package/dist/db/client.js.map +1 -0
- package/dist/db/fileIndex.js +110 -152
- package/dist/db/fileIndex.js.map +1 -0
- package/dist/db/functionExtractors/extractFromJava.js +1 -0
- package/dist/db/functionExtractors/extractFromJava.js.map +1 -0
- package/dist/db/functionExtractors/extractFromJs.js +1 -0
- package/dist/db/functionExtractors/extractFromJs.js.map +1 -0
- package/dist/db/functionExtractors/extractFromTs.js +1 -0
- package/dist/db/functionExtractors/extractFromTs.js.map +1 -0
- package/dist/db/functionExtractors/extractFromXML.js +1 -0
- package/dist/db/functionExtractors/extractFromXML.js.map +1 -0
- package/dist/db/functionExtractors/index.js +1 -0
- package/dist/db/functionExtractors/index.js.map +1 -0
- package/dist/db/functionIndex.js +9 -0
- package/dist/db/functionIndex.js.map +1 -0
- package/dist/db/schema.js +314 -99
- package/dist/db/schema.js.map +1 -0
- package/dist/db/sqlTemplates.js +1 -0
- package/dist/db/sqlTemplates.js.map +1 -0
- package/dist/fileRules/builtins.js +1 -0
- package/dist/fileRules/builtins.js.map +1 -0
- package/dist/fileRules/classifyFile.js +1 -0
- package/dist/fileRules/classifyFile.js.map +1 -0
- package/dist/fileRules/codeAllowedExtensions.js +1 -0
- package/dist/fileRules/codeAllowedExtensions.js.map +1 -0
- package/dist/fileRules/detectFileType.js +1 -0
- package/dist/fileRules/detectFileType.js.map +1 -0
- package/dist/fileRules/fileClassifier.js +1 -0
- package/dist/fileRules/fileClassifier.js.map +1 -0
- package/dist/fileRules/fileExceptions.js +1 -0
- package/dist/fileRules/fileExceptions.js.map +1 -0
- package/dist/fileRules/ignoredExtensions.js +1 -0
- package/dist/fileRules/ignoredExtensions.js.map +1 -0
- package/dist/fileRules/ignoredPaths.js +48 -5
- package/dist/fileRules/ignoredPaths.js.map +1 -0
- package/dist/fileRules/queryTokenRules.js +176 -0
- package/dist/fileRules/queryTokenRules.js.map +1 -0
- package/dist/fileRules/searchPathClassification.js +58 -0
- package/dist/fileRules/searchPathClassification.js.map +1 -0
- package/dist/fileRules/shouldIgnoreFiles.js +1 -0
- package/dist/fileRules/shouldIgnoreFiles.js.map +1 -0
- package/dist/fileRules/stopWords.js +9 -0
- package/dist/fileRules/stopWords.js.map +1 -0
- package/dist/fileRules/wellKnownRepoFiles.js +1 -0
- package/dist/fileRules/wellKnownRepoFiles.js.map +1 -0
- package/dist/git/commitSummary.js +227 -0
- package/dist/git/commitSummary.js.map +1 -0
- package/dist/github/api.js +1 -0
- package/dist/github/api.js.map +1 -0
- package/dist/github/auth.js +1 -0
- package/dist/github/auth.js.map +1 -0
- package/dist/github/github.js +1 -0
- package/dist/github/github.js.map +1 -0
- package/dist/github/githubAuthCheck.js +1 -0
- package/dist/github/githubAuthCheck.js.map +1 -0
- package/dist/github/postComments.js +1 -0
- package/dist/github/postComments.js.map +1 -0
- package/dist/github/repo.js +15 -24
- package/dist/github/repo.js.map +1 -0
- package/dist/github/token.js +1 -0
- package/dist/github/token.js.map +1 -0
- package/dist/github/types.js +1 -0
- package/dist/github/types.js.map +1 -0
- package/dist/index.js +318 -37
- package/dist/index.js.map +1 -0
- package/dist/lib/generate.js +264 -20
- package/dist/lib/generate.js.map +1 -0
- package/dist/lib/generateFolderCapsules.js +1 -0
- package/dist/lib/generateFolderCapsules.js.map +1 -0
- package/dist/lib/ollamaModelPolicy.js +59 -0
- package/dist/lib/ollamaModelPolicy.js.map +1 -0
- package/dist/lib/spinner.js +29 -9
- package/dist/lib/spinner.js.map +1 -0
- package/dist/modelSetup.js +25 -78
- package/dist/modelSetup.js.map +1 -0
- package/dist/pipeline/modules/changeLogModule.js +10 -1
- package/dist/pipeline/modules/changeLogModule.js.map +1 -0
- package/dist/pipeline/modules/cleanupModule.js +1 -0
- package/dist/pipeline/modules/cleanupModule.js.map +1 -0
- package/dist/pipeline/modules/codeTransformModule.js +10 -16
- package/dist/pipeline/modules/codeTransformModule.js.map +1 -0
- package/dist/pipeline/modules/commentModule.js +12 -0
- package/dist/pipeline/modules/commentModule.js.map +1 -0
- package/dist/pipeline/modules/commitSuggesterModule.js +82 -12
- package/dist/pipeline/modules/commitSuggesterModule.js.map +1 -0
- package/dist/pipeline/modules/contextReviewModule.js +12 -1
- package/dist/pipeline/modules/contextReviewModule.js.map +1 -0
- package/dist/pipeline/modules/dialogAnswerModule.js +58 -0
- package/dist/pipeline/modules/dialogAnswerModule.js.map +1 -0
- package/dist/pipeline/modules/fileSearchModule.js +5 -143
- package/dist/pipeline/modules/fileSearchModule.js.map +1 -0
- package/dist/pipeline/modules/finalAnswerModule.js +1176 -151
- package/dist/pipeline/modules/finalAnswerModule.js.map +1 -0
- package/dist/pipeline/modules/kgModule.js +18 -1
- package/dist/pipeline/modules/kgModule.js.map +1 -0
- package/dist/pipeline/modules/planAnswerModule.js +99 -0
- package/dist/pipeline/modules/planAnswerModule.js.map +1 -0
- package/dist/pipeline/modules/readFileModule.js +300 -0
- package/dist/pipeline/modules/readFileModule.js.map +1 -0
- package/dist/pipeline/modules/reviewModule.js +10 -1
- package/dist/pipeline/modules/reviewModule.js.map +1 -0
- package/dist/pipeline/modules/searchDbModule.js +159 -0
- package/dist/pipeline/modules/searchDbModule.js.map +1 -0
- package/dist/pipeline/modules/searchListDirectoryModule.js +62 -0
- package/dist/pipeline/modules/searchListDirectoryModule.js.map +1 -0
- package/dist/pipeline/modules/searchModuleShared.js +71 -0
- package/dist/pipeline/modules/searchModuleShared.js.map +1 -0
- package/dist/pipeline/modules/searchRegexModule.js +59 -0
- package/dist/pipeline/modules/searchRegexModule.js.map +1 -0
- package/dist/pipeline/modules/semanticAnalysisModule.js +185 -28
- package/dist/pipeline/modules/semanticAnalysisModule.js.map +1 -0
- package/dist/pipeline/modules/summaryModule.js +11 -1
- package/dist/pipeline/modules/summaryModule.js.map +1 -0
- package/dist/pipeline/registry/moduleRegistry.js +9 -0
- package/dist/pipeline/registry/moduleRegistry.js.map +1 -0
- package/dist/pipeline/runModulePipeline.js +1 -0
- package/dist/pipeline/runModulePipeline.js.map +1 -0
- package/dist/scripts/dbScriptSupport.js +172 -0
- package/dist/scripts/dbScriptSupport.js.map +1 -0
- package/dist/scripts/dbcheck.js +173 -267
- package/dist/scripts/dbcheck.js.map +1 -0
- package/dist/scripts/dboverview.js +161 -0
- package/dist/scripts/dboverview.js.map +1 -0
- package/dist/scripts/migrateDb.js +1 -0
- package/dist/scripts/migrateDb.js.map +1 -0
- package/dist/search/SearchOrchestrator.js +928 -0
- package/dist/search/SearchOrchestrator.js.map +1 -0
- package/dist/search/sharedRankingPolicy.js +283 -0
- package/dist/search/sharedRankingPolicy.js.map +1 -0
- package/dist/setup/reindexOwner.js +97 -0
- package/dist/setup/reindexOwner.js.map +1 -0
- package/dist/setup/setupOwner.js +100 -0
- package/dist/setup/setupOwner.js.map +1 -0
- package/dist/shell/dialogUi.js +81 -0
- package/dist/shell/dialogUi.js.map +1 -0
- package/dist/shellSession.js +126 -0
- package/dist/shellSession.js.map +1 -0
- package/dist/status/statusOwner.js +239 -0
- package/dist/status/statusOwner.js.map +1 -0
- package/dist/testing/contextEval.js +514 -0
- package/dist/testing/contextEval.js.map +1 -0
- package/dist/testing/fixtures/transform/small-file.input.js +5 -0
- package/dist/testing/fixtures/transform/small-file.input.js.map +1 -0
- package/dist/testing/harnessArtifacts.js +112 -0
- package/dist/testing/harnessArtifacts.js.map +1 -0
- package/dist/testing/llmTraceSession.js +67 -0
- package/dist/testing/llmTraceSession.js.map +1 -0
- package/dist/testing/registerDevCliCommands.js +43 -0
- package/dist/testing/registerDevCliCommands.js.map +1 -0
- package/dist/testing/runDiagnosis.js +248 -0
- package/dist/testing/runDiagnosis.js.map +1 -0
- package/dist/testing/runtimeLogReader.js +144 -0
- package/dist/testing/runtimeLogReader.js.map +1 -0
- package/dist/testing/testCommands.js +35 -303
- package/dist/testing/testCommands.js.map +1 -0
- package/dist/testing/testRegistry.js +233 -0
- package/dist/testing/testRegistry.js.map +1 -0
- package/dist/types.js +1 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/buildContextualPrompt.js +26 -75
- package/dist/utils/buildContextualPrompt.js.map +1 -0
- package/dist/utils/changeLogPrompt.js +1 -0
- package/dist/utils/changeLogPrompt.js.map +1 -0
- package/dist/utils/checkModel.js +17 -92
- package/dist/utils/checkModel.js.map +1 -0
- package/dist/utils/commentMap.js +1 -0
- package/dist/utils/commentMap.js.map +1 -0
- package/dist/utils/compileSearchQuery.js +23 -9
- package/dist/utils/compileSearchQuery.js.map +1 -0
- package/dist/utils/consolePresentation.js +208 -0
- package/dist/utils/consolePresentation.js.map +1 -0
- package/dist/utils/contentUtils.js +17 -2
- package/dist/utils/contentUtils.js.map +1 -0
- package/dist/utils/debugContext.js +1 -0
- package/dist/utils/debugContext.js.map +1 -0
- package/dist/utils/dialogState.js +201 -0
- package/dist/utils/dialogState.js.map +1 -0
- package/dist/utils/editor.js +1 -0
- package/dist/utils/editor.js.map +1 -0
- package/dist/utils/executionEvidence.js +50 -0
- package/dist/utils/executionEvidence.js.map +1 -0
- package/dist/utils/extractFileReferences.js +140 -6
- package/dist/utils/extractFileReferences.js.map +1 -0
- package/dist/utils/fileEvidenceCache.js +50 -0
- package/dist/utils/fileEvidenceCache.js.map +1 -0
- package/dist/utils/fileTree.js +1 -0
- package/dist/utils/fileTree.js.map +1 -0
- package/dist/utils/loadRelevantFolderCapsules.js +35 -5
- package/dist/utils/loadRelevantFolderCapsules.js.map +1 -0
- package/dist/utils/log.js +10 -1
- package/dist/utils/log.js.map +1 -0
- package/dist/utils/normalizeData.js +1 -0
- package/dist/utils/normalizeData.js.map +1 -0
- package/dist/utils/ollamaModelStatus.js +28 -0
- package/dist/utils/ollamaModelStatus.js.map +1 -0
- package/dist/utils/ollamaService.js +294 -0
- package/dist/utils/ollamaService.js.map +1 -0
- package/dist/utils/outputFormatter.js +1 -0
- package/dist/utils/outputFormatter.js.map +1 -0
- package/dist/utils/parseTaggedContent.js +1 -0
- package/dist/utils/parseTaggedContent.js.map +1 -0
- package/dist/utils/planActions.js +27 -46
- package/dist/utils/planActions.js.map +1 -0
- package/dist/utils/promptBuilderHelper.js +1 -0
- package/dist/utils/promptBuilderHelper.js.map +1 -0
- package/dist/utils/promptLogHelper.js +29 -13
- package/dist/utils/promptLogHelper.js.map +1 -0
- package/dist/utils/queryAnchors.js +71 -0
- package/dist/utils/queryAnchors.js.map +1 -0
- package/dist/utils/repoIdentity.js +82 -0
- package/dist/utils/repoIdentity.js.map +1 -0
- package/dist/utils/repoKey.js +1 -0
- package/dist/utils/repoKey.js.map +1 -0
- package/dist/utils/resolveTargetsToFiles.js +1 -0
- package/dist/utils/resolveTargetsToFiles.js.map +1 -0
- package/dist/utils/resumeContext.js +219 -0
- package/dist/utils/resumeContext.js.map +1 -0
- package/dist/utils/resumeState.js +310 -0
- package/dist/utils/resumeState.js.map +1 -0
- package/dist/utils/rollingPlan.js +118 -0
- package/dist/utils/rollingPlan.js.map +1 -0
- package/dist/utils/runQueryWithDaemonControl.js +11 -3
- package/dist/utils/runQueryWithDaemonControl.js.map +1 -0
- package/dist/utils/runtimeLogger.js +252 -0
- package/dist/utils/runtimeLogger.js.map +1 -0
- package/dist/utils/sanitizeQuery.js +1 -0
- package/dist/utils/sanitizeQuery.js.map +1 -0
- package/dist/utils/sharedUtils.js +1 -0
- package/dist/utils/sharedUtils.js.map +1 -0
- package/dist/utils/sleep.js +1 -0
- package/dist/utils/sleep.js.map +1 -0
- package/dist/utils/splitCodeIntoChunk.js +1 -0
- package/dist/utils/splitCodeIntoChunk.js.map +1 -0
- package/dist/utils/time.js +66 -0
- package/dist/utils/time.js.map +1 -0
- package/dist/utils/verifyFocusPreference.js +107 -0
- package/dist/utils/verifyFocusPreference.js.map +1 -0
- package/dist/utils/vscode.js +1 -0
- package/dist/utils/vscode.js.map +1 -0
- package/dist/workflow/workflowResolver.js +1 -0
- package/dist/workflow/workflowResolver.js.map +1 -0
- package/dist/workflow/workflowRunner.js +1 -0
- package/dist/workflow/workflowRunner.js.map +1 -0
- package/package.json +3 -3
- package/dist/agents/MainAgent.js +0 -1886
- package/dist/agents/contextReviewStep.js +0 -101
- package/dist/agents/finalPlanGenStep.js +0 -107
- package/dist/agents/structuralAnalysisStep.js +0 -46
- package/dist/agents/validationAnalysisStep.js +0 -87
- package/dist/pipeline/modules/chunkManagerModule.js +0 -24
- package/dist/pipeline/modules/cleanGeneratedTestsModule.js +0 -33
- package/dist/pipeline/modules/fileReaderModule.js +0 -72
- package/dist/pipeline/modules/gatherInfoModule.js +0 -181
- package/dist/pipeline/modules/generateTestsModule.js +0 -68
- package/dist/pipeline/modules/preserveCodeModule.js +0 -195
- package/dist/pipeline/modules/refactorModule.js +0 -40
- package/dist/pipeline/modules/repairTestsModule.js +0 -48
- package/dist/pipeline/modules/runTestsModule.js +0 -37
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
import { dedupePaths, looksLikeDirectoryTarget, nowIso, summarizeFileRead, uniqueStrings, } from "../read/summarizeReadEvidence.js";
|
|
2
|
+
export { dedupePaths, looksLikeDirectoryTarget, nowIso, summarizeFileRead, uniqueStrings };
|
|
3
|
+
const MAX_PRIMARY_GROUNDED_FILES = 4;
|
|
4
|
+
const MAX_SUPPORTING_GROUNDED_FILES = 2;
|
|
5
|
+
const MAX_FILE_FACTS = 3;
|
|
6
|
+
const MAX_MUST_MENTION_SYMBOLS = 8;
|
|
7
|
+
const MAX_MUST_MENTION_FACTS = 6;
|
|
8
|
+
const FILTERED_SYMBOL_PATTERN = /^(?:repo:path|package:basename|json:filename|[a-z0-9_-]+:(?:path|basename|filename))$/i;
|
|
9
|
+
const FILTERED_FACT_PATTERNS = [
|
|
10
|
+
/^relevant block near the strongest query match\.?$/i,
|
|
11
|
+
/^relevant code block near the strongest query match\.?$/i,
|
|
12
|
+
/^matches query terms:/i,
|
|
13
|
+
/^defines exported symbols:/i,
|
|
14
|
+
];
|
|
15
|
+
function looksLikeWeakGroundedSnippet(snippet) {
|
|
16
|
+
const trimmed = String(snippet ?? "").trim();
|
|
17
|
+
return (trimmed.length === 0 ||
|
|
18
|
+
/^(\d+: )?(?:\/\*\*|\*\/|\*\s*)/.test(trimmed) ||
|
|
19
|
+
/^(\d+: )?\/\/\s*File:/.test(trimmed) ||
|
|
20
|
+
/^(\d+: )?import\s+/.test(trimmed) ||
|
|
21
|
+
/^(\d+: )?export\s+(?:\*|\{[\s\S]+?\})\s+from\s+["'][^"']+["'];?$/.test(trimmed));
|
|
22
|
+
}
|
|
23
|
+
function excerptStrength(read) {
|
|
24
|
+
const excerpts = read.excerpts ?? [];
|
|
25
|
+
const snippetCount = (read.snippets ?? []).filter((snippet) => !looksLikeWeakGroundedSnippet(snippet)).length;
|
|
26
|
+
const commandExcerpt = excerpts.some((excerpt) => /\.command\(/.test(String(excerpt.code ?? "")));
|
|
27
|
+
const queryExcerpt = excerpts.some((excerpt) => /\.prepare\(|\bprepare\([^)]+\)\s*\.\s*(?:all|get|run)\(/.test(String(excerpt.code ?? "")));
|
|
28
|
+
const bridgeOnly = excerpts.length > 0 && excerpts.every((excerpt) => /^Legacy bridge re-export to /i.test(excerpt.description));
|
|
29
|
+
const weakSnippetOnly = (read.snippets ?? []).length > 0 && (read.snippets ?? []).every((snippet) => looksLikeWeakGroundedSnippet(snippet));
|
|
30
|
+
return ((commandExcerpt ? 60 : 0) +
|
|
31
|
+
(queryExcerpt ? 45 : 0) +
|
|
32
|
+
excerpts.length * 15 +
|
|
33
|
+
snippetCount * 6 -
|
|
34
|
+
(bridgeOnly ? 45 : 0) -
|
|
35
|
+
(weakSnippetOnly ? 40 : 0));
|
|
36
|
+
}
|
|
37
|
+
function collectCommandLiteralFacts(read) {
|
|
38
|
+
const facts = new Set();
|
|
39
|
+
for (const excerpt of read.excerpts ?? []) {
|
|
40
|
+
const code = String(excerpt.code ?? "");
|
|
41
|
+
const commandPattern = /\.command\(\s*["'`]([^"'`]+)["'`]\s*\)(?:[\s\S]{0,240}?)\.description\(\s*["'`]([^"'`]+)["'`]\s*\)/g;
|
|
42
|
+
let describedMatch;
|
|
43
|
+
while ((describedMatch = commandPattern.exec(code)) !== null) {
|
|
44
|
+
facts.add(`CLI command: ${describedMatch[1]}`);
|
|
45
|
+
facts.add(`The CLI registers "${describedMatch[1]}" to ${describedMatch[2].replace(/\.$/, "").toLowerCase()}.`);
|
|
46
|
+
}
|
|
47
|
+
const bareCommandPattern = /\.command\(\s*["'`]([^"'`]+)["'`]\s*\)/g;
|
|
48
|
+
let bareMatch;
|
|
49
|
+
while ((bareMatch = bareCommandPattern.exec(code)) !== null) {
|
|
50
|
+
facts.add(`CLI command: ${bareMatch[1]}`);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return Array.from(facts).slice(0, 6);
|
|
54
|
+
}
|
|
55
|
+
function collectExactTargetFacts(read) {
|
|
56
|
+
return (read.strengthSignals?.exactTargetPhrases ?? []).map((phrase) => `Exact target phrase: ${phrase}`);
|
|
57
|
+
}
|
|
58
|
+
function collectCommandLiteralSymbols(read) {
|
|
59
|
+
const symbols = new Set();
|
|
60
|
+
for (const excerpt of read.excerpts ?? []) {
|
|
61
|
+
const code = String(excerpt.code ?? "");
|
|
62
|
+
const bareCommandPattern = /\.command\(\s*["'`]([^"'`]+)["'`]\s*\)/g;
|
|
63
|
+
let match;
|
|
64
|
+
while ((match = bareCommandPattern.exec(code)) !== null) {
|
|
65
|
+
symbols.add(match[1]);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return Array.from(symbols).slice(0, 6);
|
|
69
|
+
}
|
|
70
|
+
function extractCliBinaryNames(read) {
|
|
71
|
+
const names = new Set();
|
|
72
|
+
const codeBlocks = [
|
|
73
|
+
...(read.excerpts ?? []).map((excerpt) => String(excerpt.code ?? "")),
|
|
74
|
+
...(read.snippets ?? []),
|
|
75
|
+
];
|
|
76
|
+
for (const block of codeBlocks) {
|
|
77
|
+
const match = block.match(/["']([A-Za-z0-9_-]+)["']\s*:\s*["']\.\/dist\/index\.js["']/);
|
|
78
|
+
if (match?.[1]) {
|
|
79
|
+
names.add(match[1]);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return Array.from(names).slice(0, 3);
|
|
83
|
+
}
|
|
84
|
+
function isAnswerSymbolCandidate(symbol) {
|
|
85
|
+
const trimmed = String(symbol ?? "").trim();
|
|
86
|
+
if (!trimmed) {
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
return !FILTERED_SYMBOL_PATTERN.test(trimmed);
|
|
90
|
+
}
|
|
91
|
+
function isAnswerFactCandidate(fact) {
|
|
92
|
+
const trimmed = String(fact ?? "").trim();
|
|
93
|
+
if (!trimmed) {
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
return !FILTERED_FACT_PATTERNS.some((pattern) => pattern.test(trimmed));
|
|
97
|
+
}
|
|
98
|
+
function collectExcerptSymbols(read) {
|
|
99
|
+
return uniqueStrings((read.excerpts ?? []).flatMap((excerpt) => excerpt.symbols ?? [])).slice(0, 6);
|
|
100
|
+
}
|
|
101
|
+
function collectSearchFactHints(read, candidateReasons) {
|
|
102
|
+
const hints = new Set();
|
|
103
|
+
for (const symbol of [...(read.keySymbols ?? []), ...collectExcerptSymbols(read)]) {
|
|
104
|
+
const trimmed = String(symbol ?? "").trim();
|
|
105
|
+
if (isAnswerSymbolCandidate(trimmed)) {
|
|
106
|
+
hints.add(trimmed);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
for (const reason of candidateReasons) {
|
|
110
|
+
const detail = String(reason ?? "").match(/^(?:symbol|match-confirmation):(.+)$/i)?.[1];
|
|
111
|
+
if (!detail) {
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
for (const token of detail.split(",")) {
|
|
115
|
+
const trimmed = token.trim();
|
|
116
|
+
if (isAnswerSymbolCandidate(trimmed)) {
|
|
117
|
+
hints.add(trimmed);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return Array.from(hints).slice(0, 8);
|
|
122
|
+
}
|
|
123
|
+
function collectCrossFileCommandFacts(reads) {
|
|
124
|
+
const binaries = uniqueStrings(reads.flatMap((read) => extractCliBinaryNames(read))).slice(0, 3);
|
|
125
|
+
if (binaries.length === 0) {
|
|
126
|
+
return [];
|
|
127
|
+
}
|
|
128
|
+
const commandFacts = new Set();
|
|
129
|
+
for (const read of reads) {
|
|
130
|
+
for (const fact of read.strengthSignals?.directAnswerFacts ?? collectCommandLiteralFacts(read)) {
|
|
131
|
+
const commandMatch = fact.match(/^CLI command:\s+(.+)$/i);
|
|
132
|
+
if (!commandMatch?.[1]) {
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
for (const binary of binaries) {
|
|
136
|
+
commandFacts.add(`CLI command: ${binary} ${commandMatch[1]}`);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return Array.from(commandFacts).slice(0, 6);
|
|
141
|
+
}
|
|
142
|
+
function normalizeFactKey(text) {
|
|
143
|
+
return String(text ?? "").trim().toLowerCase().replace(/\s+/g, " ");
|
|
144
|
+
}
|
|
145
|
+
function collectAnswerFacts(read) {
|
|
146
|
+
return uniqueStrings([
|
|
147
|
+
...collectExactTargetFacts(read),
|
|
148
|
+
...(read.strengthSignals?.directAnswerFacts ?? []),
|
|
149
|
+
...collectCommandLiteralFacts(read),
|
|
150
|
+
...(read.relevantContext ?? []).map((context) => context.text),
|
|
151
|
+
...(read.excerpts ?? []).map((excerpt) => excerpt.description),
|
|
152
|
+
read.relevanceExplanation ?? "",
|
|
153
|
+
read.summary,
|
|
154
|
+
]).filter(isAnswerFactCandidate).slice(0, MAX_FILE_FACTS);
|
|
155
|
+
}
|
|
156
|
+
function collectGroundedSymbols(read, candidateReasons) {
|
|
157
|
+
const commandLiteralSymbols = collectCommandLiteralSymbols(read);
|
|
158
|
+
const genericCommandNoise = new Set(["test", "tests", "command", "commands"]);
|
|
159
|
+
const symbols = uniqueStrings([
|
|
160
|
+
...(read.strengthSignals?.implementationSymbols ?? []),
|
|
161
|
+
...commandLiteralSymbols,
|
|
162
|
+
...(read.keySymbols ?? []),
|
|
163
|
+
...collectExcerptSymbols(read),
|
|
164
|
+
...collectSearchFactHints(read, candidateReasons),
|
|
165
|
+
]).filter(isAnswerSymbolCandidate);
|
|
166
|
+
const filteredSymbols = commandLiteralSymbols.length > 0
|
|
167
|
+
? symbols.filter((symbol) => !genericCommandNoise.has(symbol.toLowerCase()))
|
|
168
|
+
: symbols;
|
|
169
|
+
return filteredSymbols.slice(0, MAX_MUST_MENTION_SYMBOLS);
|
|
170
|
+
}
|
|
171
|
+
function hasDirectGroundedAnswerSignal(read, candidateReasons) {
|
|
172
|
+
return collectGroundedSymbols(read, candidateReasons).length > 0
|
|
173
|
+
|| collectAnswerFacts(read).length >= 2
|
|
174
|
+
|| (read.matchedTerms ?? []).length >= 2
|
|
175
|
+
|| (read.excerpts ?? []).length > 0;
|
|
176
|
+
}
|
|
177
|
+
function carriesExactTargetFact(candidate) {
|
|
178
|
+
return candidate.answerFacts.some((fact) => /^Exact target phrase:/i.test(fact));
|
|
179
|
+
}
|
|
180
|
+
function carriesDirectAnswerFacts(candidate) {
|
|
181
|
+
return candidate.answerFacts.some((fact) => /^CLI command:/i.test(fact))
|
|
182
|
+
|| candidate.answerFacts.some((fact) => /^The CLI registers /i.test(fact));
|
|
183
|
+
}
|
|
184
|
+
function carriesStrongImplementation(candidate) {
|
|
185
|
+
return candidate.groundedSymbols.length > 0
|
|
186
|
+
&& candidate.answerFacts.some((fact) => /implementation block|query execution|command registration/i.test(fact));
|
|
187
|
+
}
|
|
188
|
+
function buildGroundedFileCandidate(memory, read) {
|
|
189
|
+
const isHardTarget = memory.task.hardFileTargets.includes(read.filePath);
|
|
190
|
+
const isFullRead = (read.readMode ?? "full") === "full";
|
|
191
|
+
const candidateReasons = memory.evidence.candidateMetadata?.[read.filePath]?.searchReasons ?? [];
|
|
192
|
+
const groundedSymbols = collectGroundedSymbols(read, candidateReasons);
|
|
193
|
+
const answerFacts = collectAnswerFacts(read);
|
|
194
|
+
const role = isHardTarget
|
|
195
|
+
|| read.role === "primary"
|
|
196
|
+
|| (isFullRead && read.role !== "contextual" && hasDirectGroundedAnswerSignal(read, candidateReasons))
|
|
197
|
+
? "primary"
|
|
198
|
+
: "supporting";
|
|
199
|
+
const score = ((isHardTarget ? 1000 : 0) +
|
|
200
|
+
(isFullRead ? 100 : 0) +
|
|
201
|
+
(role === "primary" ? 50 : 0) +
|
|
202
|
+
((read.strengthSignals?.exactTargetPhrases.length ?? 0) * 90) +
|
|
203
|
+
((read.strengthSignals?.implementationSymbols.length ?? 0) * 20) +
|
|
204
|
+
((read.strengthSignals?.directAnswerFacts.length ?? 0) * 35) +
|
|
205
|
+
(read.strengthSignals?.strongestImplementationExcerpt ? 40 : 0) +
|
|
206
|
+
(read.strengthSignals?.strongestConceptExcerpt ? 20 : 0) +
|
|
207
|
+
excerptStrength(read) +
|
|
208
|
+
Math.round((memory.evidence.candidateMetadata?.[read.filePath]?.readPriority ?? read.triageScore ?? 0) * 100));
|
|
209
|
+
return {
|
|
210
|
+
filePath: read.filePath,
|
|
211
|
+
role,
|
|
212
|
+
isHardTarget,
|
|
213
|
+
isFullRead,
|
|
214
|
+
score,
|
|
215
|
+
groundedSymbols,
|
|
216
|
+
answerFacts,
|
|
217
|
+
whyItMatters: read.relevanceExplanation?.trim() || read.relevantContext[0]?.text || read.summary,
|
|
218
|
+
relevantContext: (read.relevantContext ?? []).slice(0, 3),
|
|
219
|
+
excerpts: (read.excerpts ?? []).slice(0, 2).map((excerpt) => ({
|
|
220
|
+
description: excerpt.description,
|
|
221
|
+
startLine: excerpt.startLine,
|
|
222
|
+
endLine: excerpt.endLine,
|
|
223
|
+
symbols: excerpt.symbols,
|
|
224
|
+
code: excerpt.code,
|
|
225
|
+
})),
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
function groundedFileToPacketEntry(candidate) {
|
|
229
|
+
return {
|
|
230
|
+
filePath: candidate.filePath,
|
|
231
|
+
role: candidate.role,
|
|
232
|
+
whyItMatters: candidate.whyItMatters,
|
|
233
|
+
keySymbols: candidate.groundedSymbols,
|
|
234
|
+
answerFacts: candidate.answerFacts,
|
|
235
|
+
relevantContext: candidate.relevantContext,
|
|
236
|
+
excerpts: candidate.excerpts,
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
function hasDistinctSupportingValue(candidate, primaryFactKeys) {
|
|
240
|
+
return candidate.answerFacts.some((fact) => !primaryFactKeys.has(normalizeFactKey(fact)));
|
|
241
|
+
}
|
|
242
|
+
export function buildAnswerReadyEvidence(memory) {
|
|
243
|
+
const allReads = Object.values(memory.evidence.fileReads);
|
|
244
|
+
if (memory.task.queryScope === "general" && allReads.length === 0) {
|
|
245
|
+
return {
|
|
246
|
+
normalizedQuery: memory.task.normalizedQuery,
|
|
247
|
+
primaryIntent: memory.task.primaryIntent,
|
|
248
|
+
queryScope: memory.task.queryScope,
|
|
249
|
+
explicitTargets: memory.task.explicitTargets,
|
|
250
|
+
groundedPrimaryFiles: [],
|
|
251
|
+
groundedSupportingFiles: [],
|
|
252
|
+
fileReads: [],
|
|
253
|
+
mustMentionFiles: [],
|
|
254
|
+
mustMentionSymbols: [],
|
|
255
|
+
mustMentionFacts: [],
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
const hardTargets = new Set(memory.task.hardFileTargets);
|
|
259
|
+
const candidates = allReads
|
|
260
|
+
.sort((left, right) => {
|
|
261
|
+
const leftHard = hardTargets.has(left.filePath) ? 1 : 0;
|
|
262
|
+
const rightHard = hardTargets.has(right.filePath) ? 1 : 0;
|
|
263
|
+
if (leftHard !== rightHard) {
|
|
264
|
+
return rightHard - leftHard;
|
|
265
|
+
}
|
|
266
|
+
const leftFull = (left.readMode ?? "full") === "full" ? 1 : 0;
|
|
267
|
+
const rightFull = (right.readMode ?? "full") === "full" ? 1 : 0;
|
|
268
|
+
if (leftFull !== rightFull) {
|
|
269
|
+
return rightFull - leftFull;
|
|
270
|
+
}
|
|
271
|
+
const leftPriority = memory.evidence.candidateMetadata?.[left.filePath]?.readPriority ?? left.triageScore ?? 0;
|
|
272
|
+
const rightPriority = memory.evidence.candidateMetadata?.[right.filePath]?.readPriority ?? right.triageScore ?? 0;
|
|
273
|
+
return rightPriority - leftPriority;
|
|
274
|
+
})
|
|
275
|
+
.map((read) => buildGroundedFileCandidate(memory, read))
|
|
276
|
+
.sort((left, right) => right.score - left.score);
|
|
277
|
+
const primaryCandidates = candidates
|
|
278
|
+
.filter((candidate) => candidate.role === "primary")
|
|
279
|
+
.slice(0, MAX_PRIMARY_GROUNDED_FILES);
|
|
280
|
+
const fallbackPrimary = primaryCandidates.length > 0 ? primaryCandidates : candidates.slice(0, Math.min(1, candidates.length));
|
|
281
|
+
const primaryFactKeys = new Set(fallbackPrimary.flatMap((candidate) => candidate.answerFacts.map(normalizeFactKey)));
|
|
282
|
+
const supportingCandidates = candidates
|
|
283
|
+
.filter((candidate) => !fallbackPrimary.some((primary) => primary.filePath === candidate.filePath))
|
|
284
|
+
.filter((candidate) => hasDistinctSupportingValue(candidate, primaryFactKeys))
|
|
285
|
+
.slice(0, MAX_SUPPORTING_GROUNDED_FILES);
|
|
286
|
+
const groundedPrimaryFiles = fallbackPrimary.map(groundedFileToPacketEntry);
|
|
287
|
+
const groundedSupportingFiles = supportingCandidates.map(groundedFileToPacketEntry);
|
|
288
|
+
const selectedFiles = [...groundedPrimaryFiles, ...groundedSupportingFiles];
|
|
289
|
+
const selectedCandidates = [...fallbackPrimary, ...supportingCandidates];
|
|
290
|
+
const exactTargetFacts = uniqueStrings(selectedCandidates.flatMap((candidate) => candidate.answerFacts.filter((fact) => /^Exact target phrase:/i.test(fact))));
|
|
291
|
+
const directCommandFacts = uniqueStrings([
|
|
292
|
+
...selectedCandidates.flatMap((candidate) => candidate.answerFacts.filter((fact) => /^CLI command:/i.test(fact))),
|
|
293
|
+
...collectCrossFileCommandFacts(allReads),
|
|
294
|
+
]);
|
|
295
|
+
const prioritizedFacts = uniqueStrings([
|
|
296
|
+
...exactTargetFacts,
|
|
297
|
+
...directCommandFacts,
|
|
298
|
+
...selectedCandidates.flatMap((candidate) => candidate.answerFacts),
|
|
299
|
+
]).slice(0, MAX_MUST_MENTION_FACTS);
|
|
300
|
+
const prioritizedSymbols = uniqueStrings([
|
|
301
|
+
...selectedCandidates
|
|
302
|
+
.filter((candidate) => carriesExactTargetFact(candidate) || carriesStrongImplementation(candidate) || carriesDirectAnswerFacts(candidate))
|
|
303
|
+
.flatMap((candidate) => candidate.groundedSymbols),
|
|
304
|
+
...selectedFiles.flatMap((file) => file.keySymbols),
|
|
305
|
+
]).slice(0, MAX_MUST_MENTION_SYMBOLS);
|
|
306
|
+
return {
|
|
307
|
+
normalizedQuery: memory.task.normalizedQuery,
|
|
308
|
+
primaryIntent: memory.task.primaryIntent,
|
|
309
|
+
queryScope: memory.task.queryScope,
|
|
310
|
+
explicitTargets: memory.task.explicitTargets,
|
|
311
|
+
groundedPrimaryFiles,
|
|
312
|
+
groundedSupportingFiles,
|
|
313
|
+
// Keep the older flat alias while callers move to primary/supporting grouping.
|
|
314
|
+
fileReads: selectedFiles,
|
|
315
|
+
mustMentionFiles: uniqueStrings(selectedFiles.map((file) => file.filePath)),
|
|
316
|
+
mustMentionSymbols: prioritizedSymbols,
|
|
317
|
+
mustMentionFacts: prioritizedFacts,
|
|
318
|
+
};
|
|
319
|
+
}
|
|
320
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/agent/evidence/index.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Owns small evidence helpers for the modular agent runtime.\n *\n * Why this file exists:\n * - evidence shaping should stay separate from read execution and loop control\n * - shared string and path helpers should not live inside runtime files\n * - final-answer input should come from one compact evidence view\n */\nimport type { AgentMemory, FinalAnswerPacket, GroundedAnswerFile } from \"../types.js\";\nimport {\n dedupePaths,\n looksLikeDirectoryTarget,\n nowIso,\n summarizeFileRead,\n uniqueStrings,\n} from \"../read/summarizeReadEvidence.js\";\n\nexport { dedupePaths, looksLikeDirectoryTarget, nowIso, summarizeFileRead, uniqueStrings };\n\nconst MAX_PRIMARY_GROUNDED_FILES = 4;\nconst MAX_SUPPORTING_GROUNDED_FILES = 2;\nconst MAX_FILE_FACTS = 3;\nconst MAX_MUST_MENTION_SYMBOLS = 8;\nconst MAX_MUST_MENTION_FACTS = 6;\nconst FILTERED_SYMBOL_PATTERN = /^(?:repo:path|package:basename|json:filename|[a-z0-9_-]+:(?:path|basename|filename))$/i;\nconst FILTERED_FACT_PATTERNS = [\n /^relevant block near the strongest query match\\.?$/i,\n /^relevant code block near the strongest query match\\.?$/i,\n /^matches query terms:/i,\n /^defines exported symbols:/i,\n];\n\nfunction looksLikeWeakGroundedSnippet(snippet: string): boolean {\n const trimmed = String(snippet ?? \"\").trim();\n return (\n trimmed.length === 0 ||\n /^(\\d+: )?(?:\\/\\*\\*|\\*\\/|\\*\\s*)/.test(trimmed) ||\n /^(\\d+: )?\\/\\/\\s*File:/.test(trimmed) ||\n /^(\\d+: )?import\\s+/.test(trimmed) ||\n /^(\\d+: )?export\\s+(?:\\*|\\{[\\s\\S]+?\\})\\s+from\\s+[\"'][^\"']+[\"'];?$/.test(trimmed)\n );\n}\n\nfunction excerptStrength(read: NonNullable<AgentMemory[\"evidence\"][\"fileReads\"][string]>): number {\n const excerpts = read.excerpts ?? [];\n const snippetCount = (read.snippets ?? []).filter((snippet) => !looksLikeWeakGroundedSnippet(snippet)).length;\n const commandExcerpt = excerpts.some((excerpt) => /\\.command\\(/.test(String(excerpt.code ?? \"\")));\n const queryExcerpt = excerpts.some((excerpt) => /\\.prepare\\(|\\bprepare\\([^)]+\\)\\s*\\.\\s*(?:all|get|run)\\(/.test(String(excerpt.code ?? \"\")));\n const bridgeOnly = excerpts.length > 0 && excerpts.every((excerpt) => /^Legacy bridge re-export to /i.test(excerpt.description));\n const weakSnippetOnly = (read.snippets ?? []).length > 0 && (read.snippets ?? []).every((snippet) => looksLikeWeakGroundedSnippet(snippet));\n\n return (\n (commandExcerpt ? 60 : 0) +\n (queryExcerpt ? 45 : 0) +\n excerpts.length * 15 +\n snippetCount * 6 -\n (bridgeOnly ? 45 : 0) -\n (weakSnippetOnly ? 40 : 0)\n );\n}\n\nfunction collectCommandLiteralFacts(\n read: NonNullable<AgentMemory[\"evidence\"][\"fileReads\"][string]>\n): string[] {\n const facts = new Set<string>();\n\n for (const excerpt of read.excerpts ?? []) {\n const code = String(excerpt.code ?? \"\");\n const commandPattern = /\\.command\\(\\s*[\"'`]([^\"'`]+)[\"'`]\\s*\\)(?:[\\s\\S]{0,240}?)\\.description\\(\\s*[\"'`]([^\"'`]+)[\"'`]\\s*\\)/g;\n let describedMatch: RegExpExecArray | null;\n while ((describedMatch = commandPattern.exec(code)) !== null) {\n facts.add(`CLI command: ${describedMatch[1]}`);\n facts.add(`The CLI registers \"${describedMatch[1]}\" to ${describedMatch[2].replace(/\\.$/, \"\").toLowerCase()}.`);\n }\n\n const bareCommandPattern = /\\.command\\(\\s*[\"'`]([^\"'`]+)[\"'`]\\s*\\)/g;\n let bareMatch: RegExpExecArray | null;\n while ((bareMatch = bareCommandPattern.exec(code)) !== null) {\n facts.add(`CLI command: ${bareMatch[1]}`);\n }\n }\n\n return Array.from(facts).slice(0, 6);\n}\n\nfunction collectExactTargetFacts(\n read: NonNullable<AgentMemory[\"evidence\"][\"fileReads\"][string]>\n): string[] {\n return (read.strengthSignals?.exactTargetPhrases ?? []).map((phrase) => `Exact target phrase: ${phrase}`);\n}\n\nfunction collectCommandLiteralSymbols(\n read: NonNullable<AgentMemory[\"evidence\"][\"fileReads\"][string]>\n): string[] {\n const symbols = new Set<string>();\n for (const excerpt of read.excerpts ?? []) {\n const code = String(excerpt.code ?? \"\");\n const bareCommandPattern = /\\.command\\(\\s*[\"'`]([^\"'`]+)[\"'`]\\s*\\)/g;\n let match: RegExpExecArray | null;\n while ((match = bareCommandPattern.exec(code)) !== null) {\n symbols.add(match[1]);\n }\n }\n return Array.from(symbols).slice(0, 6);\n}\n\nfunction extractCliBinaryNames(\n read: NonNullable<AgentMemory[\"evidence\"][\"fileReads\"][string]>\n): string[] {\n const names = new Set<string>();\n const codeBlocks = [\n ...(read.excerpts ?? []).map((excerpt) => String(excerpt.code ?? \"\")),\n ...(read.snippets ?? []),\n ];\n for (const block of codeBlocks) {\n const match = block.match(/[\"']([A-Za-z0-9_-]+)[\"']\\s*:\\s*[\"']\\.\\/dist\\/index\\.js[\"']/);\n if (match?.[1]) {\n names.add(match[1]);\n }\n }\n return Array.from(names).slice(0, 3);\n}\n\nfunction isAnswerSymbolCandidate(symbol: string): boolean {\n const trimmed = String(symbol ?? \"\").trim();\n if (!trimmed) {\n return false;\n }\n return !FILTERED_SYMBOL_PATTERN.test(trimmed);\n}\n\nfunction isAnswerFactCandidate(fact: string): boolean {\n const trimmed = String(fact ?? \"\").trim();\n if (!trimmed) {\n return false;\n }\n return !FILTERED_FACT_PATTERNS.some((pattern) => pattern.test(trimmed));\n}\n\nfunction collectExcerptSymbols(\n read: NonNullable<AgentMemory[\"evidence\"][\"fileReads\"][string]>\n): string[] {\n return uniqueStrings(\n (read.excerpts ?? []).flatMap((excerpt) => excerpt.symbols ?? [])\n ).slice(0, 6);\n}\n\nfunction collectSearchFactHints(\n read: NonNullable<AgentMemory[\"evidence\"][\"fileReads\"][string]>,\n candidateReasons: string[]\n): string[] {\n const hints = new Set<string>();\n for (const symbol of [...(read.keySymbols ?? []), ...collectExcerptSymbols(read)]) {\n const trimmed = String(symbol ?? \"\").trim();\n if (isAnswerSymbolCandidate(trimmed)) {\n hints.add(trimmed);\n }\n }\n for (const reason of candidateReasons) {\n const detail = String(reason ?? \"\").match(/^(?:symbol|match-confirmation):(.+)$/i)?.[1];\n if (!detail) {\n continue;\n }\n for (const token of detail.split(\",\")) {\n const trimmed = token.trim();\n if (isAnswerSymbolCandidate(trimmed)) {\n hints.add(trimmed);\n }\n }\n }\n return Array.from(hints).slice(0, 8);\n}\n\nfunction collectCrossFileCommandFacts(\n reads: Array<NonNullable<AgentMemory[\"evidence\"][\"fileReads\"][string]>>\n): string[] {\n const binaries = uniqueStrings(reads.flatMap((read) => extractCliBinaryNames(read))).slice(0, 3);\n if (binaries.length === 0) {\n return [];\n }\n\n const commandFacts = new Set<string>();\n for (const read of reads) {\n for (const fact of read.strengthSignals?.directAnswerFacts ?? collectCommandLiteralFacts(read)) {\n const commandMatch = fact.match(/^CLI command:\\s+(.+)$/i);\n if (!commandMatch?.[1]) {\n continue;\n }\n for (const binary of binaries) {\n commandFacts.add(`CLI command: ${binary} ${commandMatch[1]}`);\n }\n }\n }\n return Array.from(commandFacts).slice(0, 6);\n}\n\nfunction normalizeFactKey(text: string): string {\n return String(text ?? \"\").trim().toLowerCase().replace(/\\s+/g, \" \");\n}\n\nfunction collectAnswerFacts(\n read: NonNullable<AgentMemory[\"evidence\"][\"fileReads\"][string]>\n): string[] {\n return uniqueStrings([\n ...collectExactTargetFacts(read),\n ...(read.strengthSignals?.directAnswerFacts ?? []),\n ...collectCommandLiteralFacts(read),\n ...(read.relevantContext ?? []).map((context) => context.text),\n ...(read.excerpts ?? []).map((excerpt) => excerpt.description),\n read.relevanceExplanation ?? \"\",\n read.summary,\n ]).filter(isAnswerFactCandidate).slice(0, MAX_FILE_FACTS);\n}\n\nfunction collectGroundedSymbols(\n read: NonNullable<AgentMemory[\"evidence\"][\"fileReads\"][string]>,\n candidateReasons: string[]\n): string[] {\n const commandLiteralSymbols = collectCommandLiteralSymbols(read);\n const genericCommandNoise = new Set([\"test\", \"tests\", \"command\", \"commands\"]);\n const symbols = uniqueStrings([\n ...(read.strengthSignals?.implementationSymbols ?? []),\n ...commandLiteralSymbols,\n ...(read.keySymbols ?? []),\n ...collectExcerptSymbols(read),\n ...collectSearchFactHints(read, candidateReasons),\n ]).filter(isAnswerSymbolCandidate);\n\n const filteredSymbols = commandLiteralSymbols.length > 0\n ? symbols.filter((symbol) => !genericCommandNoise.has(symbol.toLowerCase()))\n : symbols;\n\n return filteredSymbols.slice(0, MAX_MUST_MENTION_SYMBOLS);\n}\n\nfunction hasDirectGroundedAnswerSignal(\n read: NonNullable<AgentMemory[\"evidence\"][\"fileReads\"][string]>,\n candidateReasons: string[]\n): boolean {\n return collectGroundedSymbols(read, candidateReasons).length > 0\n || collectAnswerFacts(read).length >= 2\n || (read.matchedTerms ?? []).length >= 2\n || (read.excerpts ?? []).length > 0;\n}\n\ntype GroundedFileCandidate = {\n filePath: string;\n role: \"primary\" | \"supporting\";\n isHardTarget: boolean;\n isFullRead: boolean;\n score: number;\n groundedSymbols: string[];\n answerFacts: string[];\n whyItMatters: string;\n relevantContext: GroundedAnswerFile[\"relevantContext\"];\n excerpts: GroundedAnswerFile[\"excerpts\"];\n};\n\nfunction carriesExactTargetFact(candidate: GroundedFileCandidate): boolean {\n return candidate.answerFacts.some((fact) => /^Exact target phrase:/i.test(fact));\n}\n\nfunction carriesDirectAnswerFacts(candidate: GroundedFileCandidate): boolean {\n return candidate.answerFacts.some((fact) => /^CLI command:/i.test(fact))\n || candidate.answerFacts.some((fact) => /^The CLI registers /i.test(fact));\n}\n\nfunction carriesStrongImplementation(candidate: GroundedFileCandidate): boolean {\n return candidate.groundedSymbols.length > 0\n && candidate.answerFacts.some((fact) => /implementation block|query execution|command registration/i.test(fact));\n}\n\nfunction buildGroundedFileCandidate(\n memory: AgentMemory,\n read: NonNullable<AgentMemory[\"evidence\"][\"fileReads\"][string]>\n): GroundedFileCandidate {\n const isHardTarget = memory.task.hardFileTargets.includes(read.filePath);\n const isFullRead = (read.readMode ?? \"full\") === \"full\";\n const candidateReasons = memory.evidence.candidateMetadata?.[read.filePath]?.searchReasons ?? [];\n const groundedSymbols = collectGroundedSymbols(read, candidateReasons);\n const answerFacts = collectAnswerFacts(read);\n const role = isHardTarget\n || read.role === \"primary\"\n || (isFullRead && read.role !== \"contextual\" && hasDirectGroundedAnswerSignal(read, candidateReasons))\n ? \"primary\"\n : \"supporting\";\n const score = (\n (isHardTarget ? 1000 : 0) +\n (isFullRead ? 100 : 0) +\n (role === \"primary\" ? 50 : 0) +\n ((read.strengthSignals?.exactTargetPhrases.length ?? 0) * 90) +\n ((read.strengthSignals?.implementationSymbols.length ?? 0) * 20) +\n ((read.strengthSignals?.directAnswerFacts.length ?? 0) * 35) +\n (read.strengthSignals?.strongestImplementationExcerpt ? 40 : 0) +\n (read.strengthSignals?.strongestConceptExcerpt ? 20 : 0) +\n excerptStrength(read) +\n Math.round((memory.evidence.candidateMetadata?.[read.filePath]?.readPriority ?? read.triageScore ?? 0) * 100)\n );\n\n return {\n filePath: read.filePath,\n role,\n isHardTarget,\n isFullRead,\n score,\n groundedSymbols,\n answerFacts,\n whyItMatters: read.relevanceExplanation?.trim() || read.relevantContext[0]?.text || read.summary,\n relevantContext: (read.relevantContext ?? []).slice(0, 3),\n excerpts: (read.excerpts ?? []).slice(0, 2).map((excerpt) => ({\n description: excerpt.description,\n startLine: excerpt.startLine,\n endLine: excerpt.endLine,\n symbols: excerpt.symbols,\n code: excerpt.code,\n })),\n };\n}\n\nfunction groundedFileToPacketEntry(candidate: GroundedFileCandidate): GroundedAnswerFile {\n return {\n filePath: candidate.filePath,\n role: candidate.role,\n whyItMatters: candidate.whyItMatters,\n keySymbols: candidate.groundedSymbols,\n answerFacts: candidate.answerFacts,\n relevantContext: candidate.relevantContext,\n excerpts: candidate.excerpts,\n };\n}\n\nfunction hasDistinctSupportingValue(\n candidate: GroundedFileCandidate,\n primaryFactKeys: Set<string>\n): boolean {\n return candidate.answerFacts.some((fact) => !primaryFactKeys.has(normalizeFactKey(fact)));\n}\n\nexport function buildAnswerReadyEvidence(memory: AgentMemory): FinalAnswerPacket {\n const allReads = Object.values(memory.evidence.fileReads);\n if (memory.task.queryScope === \"general\" && allReads.length === 0) {\n return {\n normalizedQuery: memory.task.normalizedQuery,\n primaryIntent: memory.task.primaryIntent,\n queryScope: memory.task.queryScope,\n explicitTargets: memory.task.explicitTargets,\n groundedPrimaryFiles: [],\n groundedSupportingFiles: [],\n fileReads: [],\n mustMentionFiles: [],\n mustMentionSymbols: [],\n mustMentionFacts: [],\n };\n }\n const hardTargets = new Set(memory.task.hardFileTargets);\n const candidates = allReads\n .sort((left, right) => {\n const leftHard = hardTargets.has(left.filePath) ? 1 : 0;\n const rightHard = hardTargets.has(right.filePath) ? 1 : 0;\n if (leftHard !== rightHard) {\n return rightHard - leftHard;\n }\n const leftFull = (left.readMode ?? \"full\") === \"full\" ? 1 : 0;\n const rightFull = (right.readMode ?? \"full\") === \"full\" ? 1 : 0;\n if (leftFull !== rightFull) {\n return rightFull - leftFull;\n }\n const leftPriority = memory.evidence.candidateMetadata?.[left.filePath]?.readPriority ?? left.triageScore ?? 0;\n const rightPriority = memory.evidence.candidateMetadata?.[right.filePath]?.readPriority ?? right.triageScore ?? 0;\n return rightPriority - leftPriority;\n })\n .map((read) => buildGroundedFileCandidate(memory, read))\n .sort((left, right) => right.score - left.score);\n\n const primaryCandidates = candidates\n .filter((candidate) => candidate.role === \"primary\")\n .slice(0, MAX_PRIMARY_GROUNDED_FILES);\n const fallbackPrimary = primaryCandidates.length > 0 ? primaryCandidates : candidates.slice(0, Math.min(1, candidates.length));\n const primaryFactKeys = new Set(\n fallbackPrimary.flatMap((candidate) => candidate.answerFacts.map(normalizeFactKey))\n );\n const supportingCandidates = candidates\n .filter((candidate) => !fallbackPrimary.some((primary) => primary.filePath === candidate.filePath))\n .filter((candidate) => hasDistinctSupportingValue(candidate, primaryFactKeys))\n .slice(0, MAX_SUPPORTING_GROUNDED_FILES);\n\n const groundedPrimaryFiles = fallbackPrimary.map(groundedFileToPacketEntry);\n const groundedSupportingFiles = supportingCandidates.map(groundedFileToPacketEntry);\n const selectedFiles = [...groundedPrimaryFiles, ...groundedSupportingFiles];\n const selectedCandidates = [...fallbackPrimary, ...supportingCandidates];\n const exactTargetFacts = uniqueStrings(selectedCandidates.flatMap((candidate) =>\n candidate.answerFacts.filter((fact) => /^Exact target phrase:/i.test(fact))\n ));\n const directCommandFacts = uniqueStrings([\n ...selectedCandidates.flatMap((candidate) => candidate.answerFacts.filter((fact) => /^CLI command:/i.test(fact))),\n ...collectCrossFileCommandFacts(allReads),\n ]);\n const prioritizedFacts = uniqueStrings([\n ...exactTargetFacts,\n ...directCommandFacts,\n ...selectedCandidates.flatMap((candidate) => candidate.answerFacts),\n ]).slice(0, MAX_MUST_MENTION_FACTS);\n const prioritizedSymbols = uniqueStrings([\n ...selectedCandidates\n .filter((candidate) => carriesExactTargetFact(candidate) || carriesStrongImplementation(candidate) || carriesDirectAnswerFacts(candidate))\n .flatMap((candidate) => candidate.groundedSymbols),\n ...selectedFiles.flatMap((file) => file.keySymbols),\n ]).slice(0, MAX_MUST_MENTION_SYMBOLS);\n\n return {\n normalizedQuery: memory.task.normalizedQuery,\n primaryIntent: memory.task.primaryIntent,\n queryScope: memory.task.queryScope,\n explicitTargets: memory.task.explicitTargets,\n groundedPrimaryFiles,\n groundedSupportingFiles,\n // Keep the older flat alias while callers move to primary/supporting grouping.\n fileReads: selectedFiles,\n mustMentionFiles: uniqueStrings(selectedFiles.map((file) => file.filePath)),\n mustMentionSymbols: prioritizedSymbols,\n mustMentionFacts: prioritizedFacts,\n };\n}\n"]}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Owns simple-agent waiting state and follow-up reply handling.
|
|
3
|
+
*
|
|
4
|
+
* Why this file exists:
|
|
5
|
+
* - feedback should stay out of `agentLoop.ts` and shell glue
|
|
6
|
+
* - one task-scoped dialog shape should drive waiting, replies, and later persistence
|
|
7
|
+
* - follow-up replies should become explicit runtime facts instead of ad hoc prompt text
|
|
8
|
+
*/
|
|
9
|
+
import { nowIso } from "../evidence/index.js";
|
|
10
|
+
import { resolveAgentTargetClassification } from "../policy/targetClassification.js";
|
|
11
|
+
import { resumeTask } from "../state/index.js";
|
|
12
|
+
function normalizeOptionId(value) {
|
|
13
|
+
return value.trim().toLowerCase().replace(/\s+/g, "-");
|
|
14
|
+
}
|
|
15
|
+
function looksLikeConcretePath(value) {
|
|
16
|
+
return value.includes("/") || /\.[A-Za-z0-9_]{1,10}$/.test(value);
|
|
17
|
+
}
|
|
18
|
+
function buildClarificationPrompt(memory) {
|
|
19
|
+
const classification = resolveAgentTargetClassification(memory);
|
|
20
|
+
const ambiguous = classification.ambiguousTargets[0];
|
|
21
|
+
if (ambiguous) {
|
|
22
|
+
return `Which in-repo file path did you mean for "${ambiguous.target}"?`;
|
|
23
|
+
}
|
|
24
|
+
if (memory.task.explicitTargets.length > 0) {
|
|
25
|
+
return "Reply with the exact in-repo file path or symbol name I should inspect next.";
|
|
26
|
+
}
|
|
27
|
+
return "Reply with one concrete file path, folder, symbol name, or a narrower scope so I can continue.";
|
|
28
|
+
}
|
|
29
|
+
export function createAgentClarificationDialog(memory) {
|
|
30
|
+
const classification = resolveAgentTargetClassification(memory);
|
|
31
|
+
const ambiguous = classification.ambiguousTargets[0];
|
|
32
|
+
return {
|
|
33
|
+
status: "awaiting-user",
|
|
34
|
+
kind: "clarification",
|
|
35
|
+
prompt: buildClarificationPrompt(memory),
|
|
36
|
+
options: ambiguous?.candidates ?? [],
|
|
37
|
+
target: ambiguous?.target,
|
|
38
|
+
allowFreeText: true,
|
|
39
|
+
createdAt: nowIso(),
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
export function buildRequestUserInputMessage(memory, dialog) {
|
|
43
|
+
const lines = [
|
|
44
|
+
"I could not answer yet.",
|
|
45
|
+
"I tried:",
|
|
46
|
+
...buildAttemptLines(memory),
|
|
47
|
+
"",
|
|
48
|
+
"I need one thing from you:",
|
|
49
|
+
`- ${dialog.prompt}`,
|
|
50
|
+
];
|
|
51
|
+
if (dialog.options.length > 0) {
|
|
52
|
+
lines.push(...dialog.options.map((option, index) => `${index + 1}. ${option}`));
|
|
53
|
+
lines.push(dialog.allowFreeText
|
|
54
|
+
? `- Choose [1-${dialog.options.length}] or paste a path.`
|
|
55
|
+
: `- Choose [1-${dialog.options.length}].`);
|
|
56
|
+
}
|
|
57
|
+
return lines.join("\n");
|
|
58
|
+
}
|
|
59
|
+
export function hasAwaitingAgentDialog(memory) {
|
|
60
|
+
return memory.task.dialogState?.status === "awaiting-user";
|
|
61
|
+
}
|
|
62
|
+
export function prepareAgentWaitingState(memory) {
|
|
63
|
+
const existing = memory.task.dialogState;
|
|
64
|
+
if (existing?.status === "awaiting-user") {
|
|
65
|
+
return existing;
|
|
66
|
+
}
|
|
67
|
+
const dialog = createAgentClarificationDialog(memory);
|
|
68
|
+
memory.task.dialogState = dialog;
|
|
69
|
+
return dialog;
|
|
70
|
+
}
|
|
71
|
+
function parseAgentDialogReply(dialog, rawResponse) {
|
|
72
|
+
const response = rawResponse.trim();
|
|
73
|
+
if (!response) {
|
|
74
|
+
return { response: "" };
|
|
75
|
+
}
|
|
76
|
+
const lines = response
|
|
77
|
+
.split(/\r?\n/)
|
|
78
|
+
.map((line) => line.trim())
|
|
79
|
+
.filter(Boolean);
|
|
80
|
+
const firstLine = lines[0] ?? response;
|
|
81
|
+
const separatorMatch = firstLine.match(/^([^:|-]+)\s*[:|-]\s*(.+)$/);
|
|
82
|
+
const knownOptions = new Map(dialog.options.map((option) => [normalizeOptionId(option), option]));
|
|
83
|
+
const numericSelection = firstLine.match(/^(\d+)(?:\s*[:|-]\s*(.+))?$/);
|
|
84
|
+
if (separatorMatch) {
|
|
85
|
+
const option = knownOptions.get(normalizeOptionId(separatorMatch[1] ?? ""));
|
|
86
|
+
if (option) {
|
|
87
|
+
const tail = [separatorMatch[2], ...lines.slice(1)].filter(Boolean).join(" ").trim();
|
|
88
|
+
return { response, selectedOption: option, comment: tail || undefined };
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
if (numericSelection) {
|
|
92
|
+
const optionIndex = Number.parseInt(numericSelection[1] ?? "", 10) - 1;
|
|
93
|
+
const option = dialog.options[optionIndex];
|
|
94
|
+
if (option) {
|
|
95
|
+
const tail = [numericSelection[2], ...lines.slice(1)].filter(Boolean).join(" ").trim();
|
|
96
|
+
return { response, selectedOption: option, comment: tail || undefined };
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
const exactOption = knownOptions.get(normalizeOptionId(firstLine));
|
|
100
|
+
if (exactOption) {
|
|
101
|
+
const tail = lines.slice(1).join(" ").trim();
|
|
102
|
+
return { response, selectedOption: exactOption, comment: tail || undefined };
|
|
103
|
+
}
|
|
104
|
+
return {
|
|
105
|
+
response,
|
|
106
|
+
comment: response,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
function applyAgentDialogReply(memory, parsed) {
|
|
110
|
+
if (!memory.task.dialogState) {
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
const chosenValue = parsed.selectedOption ?? parsed.comment?.trim() ?? parsed.response.trim();
|
|
114
|
+
if (memory.task.dialogState.target && chosenValue && looksLikeConcretePath(chosenValue)) {
|
|
115
|
+
memory.task.explicitTargetOverrides[memory.task.dialogState.target] = chosenValue;
|
|
116
|
+
}
|
|
117
|
+
memory.task.dialogState = {
|
|
118
|
+
...memory.task.dialogState,
|
|
119
|
+
status: "answered",
|
|
120
|
+
selectedOption: parsed.selectedOption,
|
|
121
|
+
response: parsed.response,
|
|
122
|
+
comment: parsed.comment,
|
|
123
|
+
answeredAt: nowIso(),
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
function buildContinuedTaskQuery(memory, parsed) {
|
|
127
|
+
const prompt = memory.task.dialogState?.prompt?.trim();
|
|
128
|
+
const reply = parsed.comment?.trim() || parsed.response.trim();
|
|
129
|
+
if (!reply) {
|
|
130
|
+
return memory.task.initialQuery;
|
|
131
|
+
}
|
|
132
|
+
return [
|
|
133
|
+
memory.task.initialQuery,
|
|
134
|
+
prompt ? `Clarification request: ${prompt}` : null,
|
|
135
|
+
`User clarification: ${reply}`,
|
|
136
|
+
].filter((line) => !!line && line.trim().length > 0).join("\n\n");
|
|
137
|
+
}
|
|
138
|
+
export function continueAgentTaskFromFeedback(memory, rawReply) {
|
|
139
|
+
if (!hasAwaitingAgentDialog(memory)) {
|
|
140
|
+
return false;
|
|
141
|
+
}
|
|
142
|
+
const dialog = memory.task.dialogState;
|
|
143
|
+
const parsed = parseAgentDialogReply(dialog, rawReply);
|
|
144
|
+
if (!parsed.response.trim()) {
|
|
145
|
+
return false;
|
|
146
|
+
}
|
|
147
|
+
applyAgentDialogReply(memory, parsed);
|
|
148
|
+
memory.evidence.notes.push(`User clarification: ${parsed.comment?.trim() || parsed.response.trim()}`);
|
|
149
|
+
memory.task.initialQuery = buildContinuedTaskQuery(memory, parsed);
|
|
150
|
+
memory.task.normalizedQuery = memory.task.initialQuery;
|
|
151
|
+
resumeTask(memory);
|
|
152
|
+
return true;
|
|
153
|
+
}
|
|
154
|
+
function buildAttemptLines(memory) {
|
|
155
|
+
const completedSteps = memory.steps.filter((step) => step.status === "done" || step.status === "failed" || step.status === "blocked");
|
|
156
|
+
const actionCounts = new Map();
|
|
157
|
+
for (const step of completedSteps) {
|
|
158
|
+
if (step.action === "final-answer" || step.action === "cannot-answer" || step.action === "request-user-input") {
|
|
159
|
+
continue;
|
|
160
|
+
}
|
|
161
|
+
actionCounts.set(step.action, (actionCounts.get(step.action) ?? 0) + 1);
|
|
162
|
+
}
|
|
163
|
+
const actionLines = Array.from(actionCounts.entries()).map(([action, count]) => {
|
|
164
|
+
switch (action) {
|
|
165
|
+
case "plan":
|
|
166
|
+
return `- replanned ${count} ${count === 1 ? "time" : "times"}`;
|
|
167
|
+
case "search-db":
|
|
168
|
+
return `- searched indexed files ${count} ${count === 1 ? "time" : "times"}`;
|
|
169
|
+
case "search-regex":
|
|
170
|
+
return `- ran regex search ${count} ${count === 1 ? "time" : "times"}`;
|
|
171
|
+
case "search-list-directory":
|
|
172
|
+
return `- listed directories ${count} ${count === 1 ? "time" : "times"}`;
|
|
173
|
+
case "triage-file":
|
|
174
|
+
return `- triaged files ${count} ${count === 1 ? "time" : "times"}`;
|
|
175
|
+
case "read-file":
|
|
176
|
+
return `- read files ${count} ${count === 1 ? "time" : "times"}`;
|
|
177
|
+
default:
|
|
178
|
+
return null;
|
|
179
|
+
}
|
|
180
|
+
}).filter((line) => !!line);
|
|
181
|
+
return [
|
|
182
|
+
...actionLines,
|
|
183
|
+
`- searched ${memory.evidence.searches.length} ${memory.evidence.searches.length === 1 ? "time" : "times"}`,
|
|
184
|
+
`- read ${Object.keys(memory.evidence.fileReads).length} ${Object.keys(memory.evidence.fileReads).length === 1 ? "file" : "files"}`,
|
|
185
|
+
];
|
|
186
|
+
}
|
|
187
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/agent/feedback/index.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Owns simple-agent waiting state and follow-up reply handling.\n *\n * Why this file exists:\n * - feedback should stay out of `agentLoop.ts` and shell glue\n * - one task-scoped dialog shape should drive waiting, replies, and later persistence\n * - follow-up replies should become explicit runtime facts instead of ad hoc prompt text\n */\nimport { nowIso } from \"../evidence/index.js\";\nimport { resolveAgentTargetClassification } from \"../policy/targetClassification.js\";\nimport { resumeTask } from \"../state/index.js\";\nimport type { AgentDialogState, AgentMemory } from \"../types.js\";\n\ninterface ParsedAgentDialogReply {\n response: string;\n selectedOption?: string;\n comment?: string;\n}\n\nfunction normalizeOptionId(value: string): string {\n return value.trim().toLowerCase().replace(/\\s+/g, \"-\");\n}\n\nfunction looksLikeConcretePath(value: string): boolean {\n return value.includes(\"/\") || /\\.[A-Za-z0-9_]{1,10}$/.test(value);\n}\n\nfunction buildClarificationPrompt(memory: AgentMemory): string {\n const classification = resolveAgentTargetClassification(memory);\n const ambiguous = classification.ambiguousTargets[0];\n if (ambiguous) {\n return `Which in-repo file path did you mean for \"${ambiguous.target}\"?`;\n }\n if (memory.task.explicitTargets.length > 0) {\n return \"Reply with the exact in-repo file path or symbol name I should inspect next.\";\n }\n return \"Reply with one concrete file path, folder, symbol name, or a narrower scope so I can continue.\";\n}\n\nexport function createAgentClarificationDialog(memory: AgentMemory): AgentDialogState {\n const classification = resolveAgentTargetClassification(memory);\n const ambiguous = classification.ambiguousTargets[0];\n return {\n status: \"awaiting-user\",\n kind: \"clarification\",\n prompt: buildClarificationPrompt(memory),\n options: ambiguous?.candidates ?? [],\n target: ambiguous?.target,\n allowFreeText: true,\n createdAt: nowIso(),\n };\n}\n\nexport function buildRequestUserInputMessage(memory: AgentMemory, dialog: AgentDialogState): string {\n const lines = [\n \"I could not answer yet.\",\n \"I tried:\",\n ...buildAttemptLines(memory),\n \"\",\n \"I need one thing from you:\",\n `- ${dialog.prompt}`,\n ];\n\n if (dialog.options.length > 0) {\n lines.push(...dialog.options.map((option, index) => `${index + 1}. ${option}`));\n lines.push(dialog.allowFreeText\n ? `- Choose [1-${dialog.options.length}] or paste a path.`\n : `- Choose [1-${dialog.options.length}].`);\n }\n\n return lines.join(\"\\n\");\n}\n\nexport function hasAwaitingAgentDialog(memory: AgentMemory): boolean {\n return memory.task.dialogState?.status === \"awaiting-user\";\n}\n\nexport function prepareAgentWaitingState(memory: AgentMemory): AgentDialogState {\n const existing = memory.task.dialogState;\n if (existing?.status === \"awaiting-user\") {\n return existing;\n }\n const dialog = createAgentClarificationDialog(memory);\n memory.task.dialogState = dialog;\n return dialog;\n}\n\nfunction parseAgentDialogReply(dialog: AgentDialogState, rawResponse: string): ParsedAgentDialogReply {\n const response = rawResponse.trim();\n if (!response) {\n return { response: \"\" };\n }\n\n const lines = response\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean);\n const firstLine = lines[0] ?? response;\n const separatorMatch = firstLine.match(/^([^:|-]+)\\s*[:|-]\\s*(.+)$/);\n const knownOptions = new Map(\n dialog.options.map((option) => [normalizeOptionId(option), option])\n );\n const numericSelection = firstLine.match(/^(\\d+)(?:\\s*[:|-]\\s*(.+))?$/);\n\n if (separatorMatch) {\n const option = knownOptions.get(normalizeOptionId(separatorMatch[1] ?? \"\"));\n if (option) {\n const tail = [separatorMatch[2], ...lines.slice(1)].filter(Boolean).join(\" \").trim();\n return { response, selectedOption: option, comment: tail || undefined };\n }\n }\n\n if (numericSelection) {\n const optionIndex = Number.parseInt(numericSelection[1] ?? \"\", 10) - 1;\n const option = dialog.options[optionIndex];\n if (option) {\n const tail = [numericSelection[2], ...lines.slice(1)].filter(Boolean).join(\" \").trim();\n return { response, selectedOption: option, comment: tail || undefined };\n }\n }\n\n const exactOption = knownOptions.get(normalizeOptionId(firstLine));\n if (exactOption) {\n const tail = lines.slice(1).join(\" \").trim();\n return { response, selectedOption: exactOption, comment: tail || undefined };\n }\n\n return {\n response,\n comment: response,\n };\n}\n\nfunction applyAgentDialogReply(memory: AgentMemory, parsed: ParsedAgentDialogReply): void {\n if (!memory.task.dialogState) {\n return;\n }\n const chosenValue = parsed.selectedOption ?? parsed.comment?.trim() ?? parsed.response.trim();\n if (memory.task.dialogState.target && chosenValue && looksLikeConcretePath(chosenValue)) {\n memory.task.explicitTargetOverrides[memory.task.dialogState.target] = chosenValue;\n }\n memory.task.dialogState = {\n ...memory.task.dialogState,\n status: \"answered\",\n selectedOption: parsed.selectedOption,\n response: parsed.response,\n comment: parsed.comment,\n answeredAt: nowIso(),\n };\n}\n\nfunction buildContinuedTaskQuery(memory: AgentMemory, parsed: ParsedAgentDialogReply): string {\n const prompt = memory.task.dialogState?.prompt?.trim();\n const reply = parsed.comment?.trim() || parsed.response.trim();\n if (!reply) {\n return memory.task.initialQuery;\n }\n return [\n memory.task.initialQuery,\n prompt ? `Clarification request: ${prompt}` : null,\n `User clarification: ${reply}`,\n ].filter((line): line is string => !!line && line.trim().length > 0).join(\"\\n\\n\");\n}\n\nexport function continueAgentTaskFromFeedback(memory: AgentMemory, rawReply: string): boolean {\n if (!hasAwaitingAgentDialog(memory)) {\n return false;\n }\n const dialog = memory.task.dialogState!;\n const parsed = parseAgentDialogReply(dialog, rawReply);\n if (!parsed.response.trim()) {\n return false;\n }\n\n applyAgentDialogReply(memory, parsed);\n memory.evidence.notes.push(`User clarification: ${parsed.comment?.trim() || parsed.response.trim()}`);\n memory.task.initialQuery = buildContinuedTaskQuery(memory, parsed);\n memory.task.normalizedQuery = memory.task.initialQuery;\n resumeTask(memory);\n return true;\n}\n\nfunction buildAttemptLines(memory: AgentMemory): string[] {\n const completedSteps = memory.steps.filter((step) => step.status === \"done\" || step.status === \"failed\" || step.status === \"blocked\");\n const actionCounts = new Map<string, number>();\n for (const step of completedSteps) {\n if (step.action === \"final-answer\" || step.action === \"cannot-answer\" || step.action === \"request-user-input\") {\n continue;\n }\n actionCounts.set(step.action, (actionCounts.get(step.action) ?? 0) + 1);\n }\n\n const actionLines = Array.from(actionCounts.entries()).map(([action, count]) => {\n switch (action) {\n case \"plan\":\n return `- replanned ${count} ${count === 1 ? \"time\" : \"times\"}`;\n case \"search-db\":\n return `- searched indexed files ${count} ${count === 1 ? \"time\" : \"times\"}`;\n case \"search-regex\":\n return `- ran regex search ${count} ${count === 1 ? \"time\" : \"times\"}`;\n case \"search-list-directory\":\n return `- listed directories ${count} ${count === 1 ? \"time\" : \"times\"}`;\n case \"triage-file\":\n return `- triaged files ${count} ${count === 1 ? \"time\" : \"times\"}`;\n case \"read-file\":\n return `- read files ${count} ${count === 1 ? \"time\" : \"times\"}`;\n default:\n return null;\n }\n }).filter((line): line is string => !!line);\n\n return [\n ...actionLines,\n `- searched ${memory.evidence.searches.length} ${memory.evidence.searches.length === 1 ? \"time\" : \"times\"}`,\n `- read ${Object.keys(memory.evidence.fileReads).length} ${Object.keys(memory.evidence.fileReads).length === 1 ? \"file\" : \"files\"}`,\n ];\n}\n"]}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { resolvePolicyState } from "../policy/index.js";
|
|
2
|
+
import { finalizeTask, setWaitingTask } from "../state/index.js";
|
|
3
|
+
export function resolveForcedEndDecision(memory) {
|
|
4
|
+
const decision = resolvePolicyState(memory, { forcedEnd: true }).endDecision;
|
|
5
|
+
if (!decision) {
|
|
6
|
+
return {
|
|
7
|
+
kind: "finalize",
|
|
8
|
+
taskStatus: "blocked",
|
|
9
|
+
stopReason: "missing-end-decision",
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
return {
|
|
13
|
+
kind: "run-action",
|
|
14
|
+
action: decision.action,
|
|
15
|
+
taskStatus: decision.taskStatus,
|
|
16
|
+
stopReason: decision.stopReason,
|
|
17
|
+
purpose: decision.purpose,
|
|
18
|
+
expectedEvidence: decision.expectedEvidence,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
export function applyFinalTaskStatus(memory, result, decision) {
|
|
22
|
+
if (decision.kind !== "run-action") {
|
|
23
|
+
throw new Error("applyFinalTaskStatus only supports run-action decisions.");
|
|
24
|
+
}
|
|
25
|
+
const policy = resolvePolicyState(memory);
|
|
26
|
+
const finalStatus = decision.action === "final-answer"
|
|
27
|
+
? ((result.ok || policy.hasGroundedEvidence) ? "done" : decision.taskStatus)
|
|
28
|
+
: decision.taskStatus;
|
|
29
|
+
if (finalStatus === "waiting") {
|
|
30
|
+
setWaitingTask(memory, decision.stopReason);
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
finalizeTask(memory, finalStatus, finalStatus === "done" ? "completed" : decision.stopReason);
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=index.js.map
|