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,514 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Audits saved LLM trace inputs against run artifacts to catch weak grounding and prompt waste.
|
|
3
|
+
*
|
|
4
|
+
* Why this exists:
|
|
5
|
+
* - flow eval says whether the run shape looks valid, but not whether prompts got the right context
|
|
6
|
+
* - saved `llm_calls` traces let us compare model input against the stronger evidence already present in the run
|
|
7
|
+
* - reports should flag missing high-value context and repeated low-signal prompt patterns early
|
|
8
|
+
*/
|
|
9
|
+
import fs from "fs";
|
|
10
|
+
import path from "path";
|
|
11
|
+
import { createHash } from "crypto";
|
|
12
|
+
import { resolveCanonicalRepoIdentity } from "../utils/repoIdentity.js";
|
|
13
|
+
function readJsonFile(filePath) {
|
|
14
|
+
try {
|
|
15
|
+
return JSON.parse(fs.readFileSync(filePath, "utf-8"));
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
function listDirs(rootDir) {
|
|
22
|
+
if (!fs.existsSync(rootDir))
|
|
23
|
+
return [];
|
|
24
|
+
return fs
|
|
25
|
+
.readdirSync(rootDir, { withFileTypes: true })
|
|
26
|
+
.filter((entry) => entry.isDirectory())
|
|
27
|
+
.map((entry) => path.join(rootDir, entry.name))
|
|
28
|
+
.sort()
|
|
29
|
+
.reverse();
|
|
30
|
+
}
|
|
31
|
+
function findArtifactDirForTask(taskId) {
|
|
32
|
+
const repoIdentity = resolveCanonicalRepoIdentity();
|
|
33
|
+
const roots = [
|
|
34
|
+
path.join(repoIdentity.repoRootPath, "artifacts", "evals"),
|
|
35
|
+
path.join(repoIdentity.repoRootPath, "artifacts", "integration"),
|
|
36
|
+
];
|
|
37
|
+
for (const root of roots) {
|
|
38
|
+
for (const artifactDir of listDirs(root)) {
|
|
39
|
+
const task = readJsonFile(path.join(artifactDir, "task.json"));
|
|
40
|
+
if (task?.id === taskId) {
|
|
41
|
+
return artifactDir;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return undefined;
|
|
46
|
+
}
|
|
47
|
+
function loadTraces(artifactDir) {
|
|
48
|
+
if (!artifactDir)
|
|
49
|
+
return [];
|
|
50
|
+
const llmDir = path.join(artifactDir, "llm_calls");
|
|
51
|
+
if (!fs.existsSync(llmDir))
|
|
52
|
+
return [];
|
|
53
|
+
return fs
|
|
54
|
+
.readdirSync(llmDir)
|
|
55
|
+
.filter((name) => name.endsWith(".json"))
|
|
56
|
+
.sort()
|
|
57
|
+
.map((name) => {
|
|
58
|
+
const filePath = path.join(llmDir, name);
|
|
59
|
+
return {
|
|
60
|
+
filePath,
|
|
61
|
+
record: readJsonFile(filePath) ?? {},
|
|
62
|
+
};
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
function findFirstTraceByCaller(traces, caller) {
|
|
66
|
+
return traces.find((entry) => entry.record.caller === caller);
|
|
67
|
+
}
|
|
68
|
+
function findLatestTraceByCaller(traces, caller) {
|
|
69
|
+
return [...traces].reverse().find((entry) => entry.record.caller === caller);
|
|
70
|
+
}
|
|
71
|
+
function getStringInputContext(trace, key) {
|
|
72
|
+
return String(trace.record.inputContext?.[key] ?? "");
|
|
73
|
+
}
|
|
74
|
+
function getArrayInputContext(trace, key) {
|
|
75
|
+
return Array.isArray(trace.record.inputContext?.[key])
|
|
76
|
+
? trace.record.inputContext?.[key]
|
|
77
|
+
: [];
|
|
78
|
+
}
|
|
79
|
+
function getPlannerPromptHash(trace) {
|
|
80
|
+
return createHash("sha256").update(trace.record.promptText ?? "").digest("hex");
|
|
81
|
+
}
|
|
82
|
+
function normalizeActionCatalog(trace) {
|
|
83
|
+
const allowedActions = getArrayInputContext(trace, "allowedActions")
|
|
84
|
+
.map((item) => {
|
|
85
|
+
if (!item || typeof item !== "object")
|
|
86
|
+
return "";
|
|
87
|
+
const record = item;
|
|
88
|
+
return String(record.actionId ?? record.action ?? "").trim();
|
|
89
|
+
})
|
|
90
|
+
.filter(Boolean)
|
|
91
|
+
.sort();
|
|
92
|
+
return allowedActions.join(",");
|
|
93
|
+
}
|
|
94
|
+
function getSupportingExcerptStats(trace) {
|
|
95
|
+
const supportingExcerpts = getArrayInputContext(trace, "supportingExcerpts");
|
|
96
|
+
let totalChars = 0;
|
|
97
|
+
let maxChars = 0;
|
|
98
|
+
let fileCount = 0;
|
|
99
|
+
for (const item of supportingExcerpts) {
|
|
100
|
+
if (!item || typeof item !== "object")
|
|
101
|
+
continue;
|
|
102
|
+
const record = item;
|
|
103
|
+
const excerpts = Array.isArray(record.excerpts) ? record.excerpts : [];
|
|
104
|
+
if (excerpts.length === 0)
|
|
105
|
+
continue;
|
|
106
|
+
fileCount += 1;
|
|
107
|
+
for (const excerpt of excerpts) {
|
|
108
|
+
const value = String(excerpt ?? "");
|
|
109
|
+
totalChars += value.length;
|
|
110
|
+
maxChars = Math.max(maxChars, value.length);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return { totalChars, maxChars, fileCount };
|
|
114
|
+
}
|
|
115
|
+
function isMultiQuestionQuery(query) {
|
|
116
|
+
const trimmed = query.trim();
|
|
117
|
+
if (!trimmed)
|
|
118
|
+
return false;
|
|
119
|
+
const questionMarks = (trimmed.match(/\?/g) ?? []).length;
|
|
120
|
+
if (questionMarks >= 2)
|
|
121
|
+
return true;
|
|
122
|
+
const interrogatives = trimmed.match(/\b(how|what|where|why|which|who|is|are|do|does|can|should)\b/gi) ?? [];
|
|
123
|
+
return interrogatives.length >= 2 && /\band\b/i.test(trimmed);
|
|
124
|
+
}
|
|
125
|
+
function extractJsonBlocks(runLog, marker) {
|
|
126
|
+
if (!runLog)
|
|
127
|
+
return [];
|
|
128
|
+
const pattern = new RegExp(`📂 OUTPUT \\| ${marker}[\\s\\S]*?\\n={68}\\n([\\s\\S]*?)\\n={68}\\n`, "g");
|
|
129
|
+
const outputs = [];
|
|
130
|
+
let match = null;
|
|
131
|
+
while ((match = pattern.exec(runLog)) !== null) {
|
|
132
|
+
try {
|
|
133
|
+
const parsed = JSON.parse((match[1] ?? "").trim());
|
|
134
|
+
outputs.push(parsed);
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
// Ignore malformed log blocks. The report should degrade quietly.
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return outputs;
|
|
141
|
+
}
|
|
142
|
+
function buildMissingHighValueContextFinding(source) {
|
|
143
|
+
const finalTrace = findLatestTraceByCaller(source.traces, "finalAnswerModule");
|
|
144
|
+
if (!finalTrace)
|
|
145
|
+
return undefined;
|
|
146
|
+
const researchOutputs = extractJsonBlocks(source.runLog, "runResearch");
|
|
147
|
+
const architectureOutput = researchOutputs.find((entry) => {
|
|
148
|
+
const stepReasoning = entry.stepReasoning;
|
|
149
|
+
return typeof stepReasoning?.rationale === "string" && stepReasoning.rationale.includes("Architecture synthesis");
|
|
150
|
+
});
|
|
151
|
+
const architectureResult = architectureOutput?.result;
|
|
152
|
+
const priorResearchSummaries = Array.isArray(architectureResult?.priorResearchSummaries)
|
|
153
|
+
? architectureResult?.priorResearchSummaries
|
|
154
|
+
: [];
|
|
155
|
+
const architectureInputFiles = Array.isArray(architectureResult?.architectureInputFiles)
|
|
156
|
+
? architectureResult?.architectureInputFiles
|
|
157
|
+
: [];
|
|
158
|
+
const combinedSection = getStringInputContext(finalTrace, "combinedSection");
|
|
159
|
+
const researchSummary = getStringInputContext(finalTrace, "researchSummary");
|
|
160
|
+
const mode = getStringInputContext(finalTrace, "mode");
|
|
161
|
+
const analyzedFiles = getArrayInputContext(finalTrace, "analyzedFiles");
|
|
162
|
+
if (priorResearchSummaries.length === 0 && architectureInputFiles.length === 0) {
|
|
163
|
+
return undefined;
|
|
164
|
+
}
|
|
165
|
+
const hasRepoWidePacket = mode === "repo-wide" && researchSummary.trim().length > 0;
|
|
166
|
+
const hasOldCombined = !combinedSection.includes("[No combined analysis available]");
|
|
167
|
+
if (hasRepoWidePacket) {
|
|
168
|
+
return undefined;
|
|
169
|
+
}
|
|
170
|
+
if (hasOldCombined && analyzedFiles.length >= architectureInputFiles.length) {
|
|
171
|
+
return undefined;
|
|
172
|
+
}
|
|
173
|
+
return {
|
|
174
|
+
name: "missing-high-value-context",
|
|
175
|
+
severity: "warn",
|
|
176
|
+
callId: finalTrace.record.callId,
|
|
177
|
+
artifactPath: finalTrace.filePath,
|
|
178
|
+
details: "Final grounding skipped stronger research context that was already present in the run.",
|
|
179
|
+
expectedContext: `research summaries=${priorResearchSummaries.length}, architecture input files=${architectureInputFiles.length}`,
|
|
180
|
+
actualContext: `mode=${mode || "[unknown]"}, researchSummary=${researchSummary ? "[present]" : "[empty]"}, combinedSection=${combinedSection || "[empty]"}, analyzed files=${analyzedFiles.length}`,
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
function buildRedundantLowSignalFinding(source) {
|
|
184
|
+
const weakTokenPattern = /Symbol reference found: "(?:module|pattern|repo|src|points|explain|cli|weak|summarize)"/g;
|
|
185
|
+
const duplicateQueryTrace = source.traces.find((entry) => {
|
|
186
|
+
const prompt = entry.record.promptText ?? "";
|
|
187
|
+
return (prompt.match(/User query:/g) ?? []).length > 1;
|
|
188
|
+
});
|
|
189
|
+
const weakEvidenceTrace = source.traces.find((entry) => {
|
|
190
|
+
const prompt = entry.record.promptText ?? "";
|
|
191
|
+
return entry.record.caller === "fileCheckStep" && (prompt.match(weakTokenPattern) ?? []).length >= 4;
|
|
192
|
+
});
|
|
193
|
+
const match = weakEvidenceTrace ?? duplicateQueryTrace;
|
|
194
|
+
if (!match)
|
|
195
|
+
return undefined;
|
|
196
|
+
return {
|
|
197
|
+
name: "redundant-low-signal-context",
|
|
198
|
+
severity: "warn",
|
|
199
|
+
callId: match.record.callId,
|
|
200
|
+
artifactPath: match.filePath,
|
|
201
|
+
details: "Prompt includes repeated low-signal context that is likely to add noise instead of better grounding.",
|
|
202
|
+
expectedContext: "short rationale plus only the strongest, task-relevant evidence",
|
|
203
|
+
actualContext: match.record.caller === "fileCheckStep"
|
|
204
|
+
? "fileCheck prompt is packed with generic token matches"
|
|
205
|
+
: "same user query appears more than once in one prompt",
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
function buildPromptStageMismatchFinding(source) {
|
|
209
|
+
const mismatch = source.traces.find((entry) => {
|
|
210
|
+
if (entry.record.caller !== "finalAnswerModule")
|
|
211
|
+
return false;
|
|
212
|
+
const prompt = entry.record.promptText ?? "";
|
|
213
|
+
const query = (entry.record.query ?? "").toLowerCase();
|
|
214
|
+
const isQuestionLike = query.includes("explain") || query.includes("summarize") || query.includes("where were we");
|
|
215
|
+
return isQuestionLike && prompt.includes("==================== PROPOSED CHANGES ====================");
|
|
216
|
+
});
|
|
217
|
+
if (!mismatch)
|
|
218
|
+
return undefined;
|
|
219
|
+
return {
|
|
220
|
+
name: "prompt-stage-mismatch",
|
|
221
|
+
severity: "warn",
|
|
222
|
+
callId: mismatch.record.callId,
|
|
223
|
+
artifactPath: mismatch.filePath,
|
|
224
|
+
details: "Final answer grounding mixed answer-focused context with change-planning scaffolding.",
|
|
225
|
+
expectedContext: "distilled behavioral analysis and grounded answer inputs",
|
|
226
|
+
actualContext: "finalAnswerModule prompt still includes PROPOSED CHANGES",
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
function buildDuplicateReplanFinding(source) {
|
|
230
|
+
const planTraces = source.traces.filter((entry) => entry.record.caller === "analysisPlanGenStep");
|
|
231
|
+
const seen = new Map();
|
|
232
|
+
for (const trace of planTraces) {
|
|
233
|
+
const hash = createHash("sha256").update(trace.record.promptText ?? "").digest("hex");
|
|
234
|
+
const matches = seen.get(hash) ?? [];
|
|
235
|
+
matches.push(trace);
|
|
236
|
+
seen.set(hash, matches);
|
|
237
|
+
}
|
|
238
|
+
const duplicateGroup = Array.from(seen.values()).find((group) => group.length > 1);
|
|
239
|
+
if (!duplicateGroup)
|
|
240
|
+
return undefined;
|
|
241
|
+
return {
|
|
242
|
+
name: "duplicate-replan-calls",
|
|
243
|
+
severity: "warn",
|
|
244
|
+
callId: duplicateGroup[0]?.record.callId,
|
|
245
|
+
artifactPath: duplicateGroup[0]?.filePath,
|
|
246
|
+
details: "Planner retried with the same prompt content instead of materially new context.",
|
|
247
|
+
expectedContext: "new evidence or narrowed intent between planner retries",
|
|
248
|
+
actualContext: `${duplicateGroup.length} identical analysisPlanGenStep prompts`,
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
function buildStalledPlannerProgressFinding(source) {
|
|
252
|
+
const progressOutputs = extractJsonBlocks(source.runLog, "progressState");
|
|
253
|
+
const stalled = progressOutputs.find((entry) => {
|
|
254
|
+
const research = entry.research;
|
|
255
|
+
const plannerRetry = research?.plannerRetry;
|
|
256
|
+
return plannerRetry?.stalled === true;
|
|
257
|
+
});
|
|
258
|
+
if (!stalled)
|
|
259
|
+
return undefined;
|
|
260
|
+
const research = stalled.research;
|
|
261
|
+
const plannerRetry = research?.plannerRetry;
|
|
262
|
+
const targetFile = String(plannerRetry?.targetFile ?? "[unknown]");
|
|
263
|
+
const count = Number(plannerRetry?.count ?? 0);
|
|
264
|
+
const reason = String(plannerRetry?.reason ?? "stalled planner retry detected");
|
|
265
|
+
return {
|
|
266
|
+
name: "stalled-planner-progress",
|
|
267
|
+
severity: "warn",
|
|
268
|
+
details: "Progress state recorded stalled planner retries on one target without meaningful frontier change.",
|
|
269
|
+
expectedContext: "progressState.research.plannerRetry should stay unstalled unless the same target repeats with no frontier growth",
|
|
270
|
+
actualContext: `target=${targetFile}, count=${count}, reason=${reason}`,
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
function buildContinuityOverpromptingFinding(source) {
|
|
274
|
+
const continuityTrace = source.traces.find((entry) => {
|
|
275
|
+
const query = (entry.record.query ?? "").trim().toLowerCase();
|
|
276
|
+
const capsule = getStringInputContext(entry, "resumedContextCapsule");
|
|
277
|
+
return ((entry.record.caller === "scopeClassificationStep" || entry.record.caller === "understandIntentStep") &&
|
|
278
|
+
(query === "where were we?" || query === "what should we do next?") &&
|
|
279
|
+
capsule.length > 250);
|
|
280
|
+
});
|
|
281
|
+
if (!continuityTrace)
|
|
282
|
+
return undefined;
|
|
283
|
+
return {
|
|
284
|
+
name: "continuity-overprompting",
|
|
285
|
+
severity: "warn",
|
|
286
|
+
callId: continuityTrace.record.callId,
|
|
287
|
+
artifactPath: continuityTrace.filePath,
|
|
288
|
+
details: "A short continuity query carried a large resumed capsule into a narrow classifier step.",
|
|
289
|
+
expectedContext: "small continuity summary or direct resume answer without full routing capsule",
|
|
290
|
+
actualContext: `${continuityTrace.record.caller} received resumed capsule length ${getStringInputContext(continuityTrace, "resumedContextCapsule").length}`,
|
|
291
|
+
};
|
|
292
|
+
}
|
|
293
|
+
function buildFocusEvidenceMismatchFinding(source) {
|
|
294
|
+
const planTrace = findFirstTraceByCaller(source.traces, "analysisPlanGenStep");
|
|
295
|
+
const finalTrace = findLatestTraceByCaller(source.traces, "finalAnswerModule");
|
|
296
|
+
if (!planTrace || !finalTrace)
|
|
297
|
+
return undefined;
|
|
298
|
+
const targetFile = getStringInputContext(planTrace, "targetFile");
|
|
299
|
+
const rationaleText = getStringInputContext(planTrace, "rationaleText");
|
|
300
|
+
const answerFiles = getArrayInputContext(finalTrace, "answerFiles").map((item) => String(item));
|
|
301
|
+
if (!targetFile || answerFiles.length === 0)
|
|
302
|
+
return undefined;
|
|
303
|
+
const rationalePaths = rationaleText.match(/(?:\/[^\s`'"]+\.(?:ts|js|tsx|jsx|md|json)|\b[\w./-]+\.(?:ts|js|tsx|jsx|md|json)\b)/g) ?? [];
|
|
304
|
+
const mentionsDifferentFile = rationalePaths.length > 0 && !rationalePaths.includes(targetFile);
|
|
305
|
+
const answerDroppedTarget = !answerFiles.includes(targetFile);
|
|
306
|
+
if (!mentionsDifferentFile && !answerDroppedTarget)
|
|
307
|
+
return undefined;
|
|
308
|
+
return {
|
|
309
|
+
name: "focus-evidence-mismatch",
|
|
310
|
+
severity: "warn",
|
|
311
|
+
callId: finalTrace.record.callId ?? planTrace.record.callId,
|
|
312
|
+
artifactPath: finalTrace.filePath,
|
|
313
|
+
details: "Planner focus, rationale, and final grounding disagree about the main evidence file.",
|
|
314
|
+
expectedContext: `targetFile=${targetFile} should stay aligned through planning and final grounding`,
|
|
315
|
+
actualContext: `rationalePaths=${rationalePaths.join(", ") || "[none]"}, answerFiles=${answerFiles.join(", ")}`,
|
|
316
|
+
};
|
|
317
|
+
}
|
|
318
|
+
function buildOversizedFinalGroundingFinding(source) {
|
|
319
|
+
const finalTrace = findLatestTraceByCaller(source.traces, "finalAnswerModule");
|
|
320
|
+
if (!finalTrace)
|
|
321
|
+
return undefined;
|
|
322
|
+
const stats = getSupportingExcerptStats(finalTrace);
|
|
323
|
+
if (stats.fileCount === 0)
|
|
324
|
+
return undefined;
|
|
325
|
+
if (stats.totalChars <= 2000 && stats.maxChars <= 1200) {
|
|
326
|
+
return undefined;
|
|
327
|
+
}
|
|
328
|
+
return {
|
|
329
|
+
name: "oversized-final-grounding-context",
|
|
330
|
+
severity: "warn",
|
|
331
|
+
callId: finalTrace.record.callId,
|
|
332
|
+
artifactPath: finalTrace.filePath,
|
|
333
|
+
details: "Final grounding carries oversized supporting excerpts instead of short identifier-local evidence.",
|
|
334
|
+
expectedContext: "small supporting excerpts that keep total evidence compact",
|
|
335
|
+
actualContext: `supporting excerpts chars=${stats.totalChars}, max excerpt chars=${stats.maxChars}, files=${stats.fileCount}`,
|
|
336
|
+
};
|
|
337
|
+
}
|
|
338
|
+
function buildStalePlannerRationaleFinding(source) {
|
|
339
|
+
const planTraces = source.traces.filter((entry) => entry.record.caller === "analysisPlanGenStep");
|
|
340
|
+
for (let index = 1; index < planTraces.length; index += 1) {
|
|
341
|
+
const previous = planTraces[index - 1];
|
|
342
|
+
const current = planTraces[index];
|
|
343
|
+
const previousRationale = getStringInputContext(previous, "rationaleText").trim();
|
|
344
|
+
const currentRationale = getStringInputContext(current, "rationaleText").trim();
|
|
345
|
+
const previousTarget = getStringInputContext(previous, "targetFile");
|
|
346
|
+
const currentTarget = getStringInputContext(current, "targetFile");
|
|
347
|
+
if (!previousRationale || previousRationale !== currentRationale)
|
|
348
|
+
continue;
|
|
349
|
+
if (!previousTarget || previousTarget !== currentTarget)
|
|
350
|
+
continue;
|
|
351
|
+
if (getPlannerPromptHash(previous) === getPlannerPromptHash(current))
|
|
352
|
+
continue;
|
|
353
|
+
return {
|
|
354
|
+
name: "stale-planner-rationale",
|
|
355
|
+
severity: "warn",
|
|
356
|
+
callId: current.record.callId,
|
|
357
|
+
artifactPath: current.filePath,
|
|
358
|
+
details: "Adjacent planner retries reused the same focus rationale instead of sending a smaller delta.",
|
|
359
|
+
expectedContext: "planner retries should carry only materially new evidence or a narrowed rationale",
|
|
360
|
+
actualContext: `target=${currentTarget}, rationale length=${currentRationale.length}`,
|
|
361
|
+
};
|
|
362
|
+
}
|
|
363
|
+
return undefined;
|
|
364
|
+
}
|
|
365
|
+
function buildRepeatedPlannerActionCatalogFinding(source) {
|
|
366
|
+
const planTraces = source.traces.filter((entry) => entry.record.caller === "analysisPlanGenStep");
|
|
367
|
+
for (let index = 1; index < planTraces.length; index += 1) {
|
|
368
|
+
const previous = planTraces[index - 1];
|
|
369
|
+
const current = planTraces[index];
|
|
370
|
+
const previousCatalog = normalizeActionCatalog(previous);
|
|
371
|
+
const currentCatalog = normalizeActionCatalog(current);
|
|
372
|
+
if (!previousCatalog || previousCatalog !== currentCatalog)
|
|
373
|
+
continue;
|
|
374
|
+
const actionCount = previousCatalog.split(",").filter(Boolean).length;
|
|
375
|
+
if (actionCount < 5)
|
|
376
|
+
continue;
|
|
377
|
+
return {
|
|
378
|
+
name: "repeated-planner-action-catalog",
|
|
379
|
+
severity: "warn",
|
|
380
|
+
callId: current.record.callId,
|
|
381
|
+
artifactPath: current.filePath,
|
|
382
|
+
details: "Planner retries kept resending the same large allowed-actions catalog.",
|
|
383
|
+
expectedContext: "stable action guidance should be shared or reduced instead of repeated per retry",
|
|
384
|
+
actualContext: `${actionCount} actions repeated across adjacent planner prompts`,
|
|
385
|
+
};
|
|
386
|
+
}
|
|
387
|
+
return undefined;
|
|
388
|
+
}
|
|
389
|
+
function buildMissingQuestionDecompositionFinding(source) {
|
|
390
|
+
const multiQuestionTrace = source.traces.find((entry) => (entry.record.caller === "understandIntentStep" || entry.record.caller === "scopeClassificationStep") &&
|
|
391
|
+
isMultiQuestionQuery(entry.record.query ?? ""));
|
|
392
|
+
if (!multiQuestionTrace)
|
|
393
|
+
return undefined;
|
|
394
|
+
const orderedQuestionCount = source.traces.reduce((max, entry) => {
|
|
395
|
+
const count = getArrayInputContext(entry, "orderedQuestions").length;
|
|
396
|
+
return Math.max(max, count);
|
|
397
|
+
}, 0);
|
|
398
|
+
if (orderedQuestionCount > 1) {
|
|
399
|
+
return undefined;
|
|
400
|
+
}
|
|
401
|
+
return {
|
|
402
|
+
name: "missing-question-decomposition",
|
|
403
|
+
severity: "warn",
|
|
404
|
+
callId: multiQuestionTrace.record.callId,
|
|
405
|
+
artifactPath: multiQuestionTrace.filePath,
|
|
406
|
+
details: "A clearly multi-part user query did not survive into ordered question decomposition.",
|
|
407
|
+
expectedContext: "ordered question parts should preserve each direct ask in user order",
|
|
408
|
+
actualContext: `query=${JSON.stringify(multiQuestionTrace.record.query ?? "")}, max orderedQuestions=${orderedQuestionCount}`,
|
|
409
|
+
};
|
|
410
|
+
}
|
|
411
|
+
const CONTEXT_CHECKS = [
|
|
412
|
+
{
|
|
413
|
+
name: "missing-high-value-context",
|
|
414
|
+
passDetails: "High-value run context was carried into final grounding when available.",
|
|
415
|
+
find: buildMissingHighValueContextFinding,
|
|
416
|
+
},
|
|
417
|
+
{
|
|
418
|
+
name: "redundant-low-signal-context",
|
|
419
|
+
passDetails: "Prompts stay mostly free of repeated low-signal evidence.",
|
|
420
|
+
find: buildRedundantLowSignalFinding,
|
|
421
|
+
},
|
|
422
|
+
{
|
|
423
|
+
name: "prompt-stage-mismatch",
|
|
424
|
+
passDetails: "Each stage prompt is shaped for its own job.",
|
|
425
|
+
find: buildPromptStageMismatchFinding,
|
|
426
|
+
},
|
|
427
|
+
{
|
|
428
|
+
name: "duplicate-replan-calls",
|
|
429
|
+
passDetails: "Planner retries add new context before repeating.",
|
|
430
|
+
find: buildDuplicateReplanFinding,
|
|
431
|
+
},
|
|
432
|
+
{
|
|
433
|
+
name: "stalled-planner-progress",
|
|
434
|
+
passDetails: "Progress state surfaces stalled planner churn before the loop burns budget.",
|
|
435
|
+
find: buildStalledPlannerProgressFinding,
|
|
436
|
+
},
|
|
437
|
+
{
|
|
438
|
+
name: "continuity-overprompting",
|
|
439
|
+
passDetails: "Continuity prompts stay concise for narrow resume questions.",
|
|
440
|
+
find: buildContinuityOverpromptingFinding,
|
|
441
|
+
},
|
|
442
|
+
{
|
|
443
|
+
name: "focus-evidence-mismatch",
|
|
444
|
+
passDetails: "Planner target, rationale, and final grounding stay aligned.",
|
|
445
|
+
find: buildFocusEvidenceMismatchFinding,
|
|
446
|
+
},
|
|
447
|
+
{
|
|
448
|
+
name: "oversized-final-grounding-context",
|
|
449
|
+
passDetails: "Final grounding keeps supporting excerpts compact.",
|
|
450
|
+
find: buildOversizedFinalGroundingFinding,
|
|
451
|
+
},
|
|
452
|
+
{
|
|
453
|
+
name: "stale-planner-rationale",
|
|
454
|
+
passDetails: "Planner retries shrink rationale payloads when nothing material changed.",
|
|
455
|
+
find: buildStalePlannerRationaleFinding,
|
|
456
|
+
},
|
|
457
|
+
{
|
|
458
|
+
name: "repeated-planner-action-catalog",
|
|
459
|
+
passDetails: "Planner retries avoid repeating a large action catalog when guidance is unchanged.",
|
|
460
|
+
find: buildRepeatedPlannerActionCatalogFinding,
|
|
461
|
+
},
|
|
462
|
+
{
|
|
463
|
+
name: "missing-question-decomposition",
|
|
464
|
+
passDetails: "Multi-part queries preserve ordered question decomposition through later stages.",
|
|
465
|
+
find: buildMissingQuestionDecompositionFinding,
|
|
466
|
+
},
|
|
467
|
+
];
|
|
468
|
+
function toCheck(name, finding, fallbackDetails) {
|
|
469
|
+
if (!finding) {
|
|
470
|
+
return {
|
|
471
|
+
name,
|
|
472
|
+
ok: true,
|
|
473
|
+
details: fallbackDetails,
|
|
474
|
+
};
|
|
475
|
+
}
|
|
476
|
+
return {
|
|
477
|
+
name,
|
|
478
|
+
ok: false,
|
|
479
|
+
details: finding.details,
|
|
480
|
+
finding,
|
|
481
|
+
};
|
|
482
|
+
}
|
|
483
|
+
export function buildContextEval(input) {
|
|
484
|
+
const artifactDir = input.artifactDir ?? findArtifactDirForTask(input.taskId);
|
|
485
|
+
const traces = loadTraces(artifactDir);
|
|
486
|
+
const source = {
|
|
487
|
+
traces,
|
|
488
|
+
runLog: input.runLog,
|
|
489
|
+
};
|
|
490
|
+
if (traces.length === 0) {
|
|
491
|
+
return {
|
|
492
|
+
artifactDir,
|
|
493
|
+
checks: CONTEXT_CHECKS.map((check) => ({
|
|
494
|
+
name: check.name,
|
|
495
|
+
ok: true,
|
|
496
|
+
details: "No llm_calls traces available for context audit.",
|
|
497
|
+
})),
|
|
498
|
+
};
|
|
499
|
+
}
|
|
500
|
+
return {
|
|
501
|
+
artifactDir,
|
|
502
|
+
checks: CONTEXT_CHECKS.map((check) => toCheck(check.name, check.find(source), check.passDetails)),
|
|
503
|
+
};
|
|
504
|
+
}
|
|
505
|
+
export function formatContextEvalFinding(finding) {
|
|
506
|
+
const extras = [
|
|
507
|
+
finding.callId ? `call=${finding.callId}` : "",
|
|
508
|
+
finding.expectedContext ? `expected=${finding.expectedContext}` : "",
|
|
509
|
+
finding.actualContext ? `actual=${finding.actualContext}` : "",
|
|
510
|
+
finding.artifactPath ? `artifact=${finding.artifactPath}` : "",
|
|
511
|
+
].filter(Boolean);
|
|
512
|
+
return `${finding.details}${extras.length > 0 ? ` (${extras.join("; ")})` : ""}`;
|
|
513
|
+
}
|
|
514
|
+
//# sourceMappingURL=contextEval.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contextEval.js","sourceRoot":"","sources":["../../src/testing/contextEval.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Audits saved LLM trace inputs against run artifacts to catch weak grounding and prompt waste.\n *\n * Why this exists:\n * - flow eval says whether the run shape looks valid, but not whether prompts got the right context\n * - saved `llm_calls` traces let us compare model input against the stronger evidence already present in the run\n * - reports should flag missing high-value context and repeated low-signal prompt patterns early\n */\nimport fs from \"fs\";\nimport path from \"path\";\nimport { createHash } from \"crypto\";\nimport { resolveCanonicalRepoIdentity } from \"../utils/repoIdentity.js\";\n\nexport type ContextEvalFinding = {\n name:\n | \"missing-high-value-context\"\n | \"redundant-low-signal-context\"\n | \"prompt-stage-mismatch\"\n | \"duplicate-replan-calls\"\n | \"stalled-planner-progress\"\n | \"continuity-overprompting\"\n | \"focus-evidence-mismatch\"\n | \"oversized-final-grounding-context\"\n | \"stale-planner-rationale\"\n | \"repeated-planner-action-catalog\"\n | \"missing-question-decomposition\";\n severity: \"warn\";\n details: string;\n callId?: string;\n artifactPath?: string;\n expectedContext?: string;\n actualContext?: string;\n};\n\nexport type ContextEvalCheck = {\n name: ContextEvalFinding[\"name\"];\n ok: boolean;\n details: string;\n finding?: ContextEvalFinding;\n};\n\ntype LlmTraceRecord = {\n callId?: string;\n caller?: string;\n query?: string;\n promptText?: string;\n inputContext?: Record<string, unknown>;\n};\n\ntype ContextEvalInput = {\n taskId: number;\n artifactDir?: string;\n runLog?: string;\n};\n\ntype LocatedTrace = {\n filePath: string;\n record: LlmTraceRecord;\n};\n\ntype ContextEvalSource = {\n traces: LocatedTrace[];\n runLog?: string;\n};\n\ntype ContextEvalDefinition = {\n name: ContextEvalFinding[\"name\"];\n passDetails: string;\n find: (source: ContextEvalSource) => ContextEvalFinding | undefined;\n};\n\nfunction readJsonFile<T>(filePath: string): T | null {\n try {\n return JSON.parse(fs.readFileSync(filePath, \"utf-8\")) as T;\n } catch {\n return null;\n }\n}\n\nfunction listDirs(rootDir: string): string[] {\n if (!fs.existsSync(rootDir)) return [];\n return fs\n .readdirSync(rootDir, { withFileTypes: true })\n .filter((entry) => entry.isDirectory())\n .map((entry) => path.join(rootDir, entry.name))\n .sort()\n .reverse();\n}\n\nfunction findArtifactDirForTask(taskId: number): string | undefined {\n const repoIdentity = resolveCanonicalRepoIdentity();\n const roots = [\n path.join(repoIdentity.repoRootPath, \"artifacts\", \"evals\"),\n path.join(repoIdentity.repoRootPath, \"artifacts\", \"integration\"),\n ];\n\n for (const root of roots) {\n for (const artifactDir of listDirs(root)) {\n const task = readJsonFile<Record<string, unknown> | null>(path.join(artifactDir, \"task.json\"));\n if ((task?.id as number | undefined) === taskId) {\n return artifactDir;\n }\n }\n }\n\n return undefined;\n}\n\nfunction loadTraces(artifactDir: string | undefined): LocatedTrace[] {\n if (!artifactDir) return [];\n const llmDir = path.join(artifactDir, \"llm_calls\");\n if (!fs.existsSync(llmDir)) return [];\n\n return fs\n .readdirSync(llmDir)\n .filter((name) => name.endsWith(\".json\"))\n .sort()\n .map((name) => {\n const filePath = path.join(llmDir, name);\n return {\n filePath,\n record: readJsonFile<LlmTraceRecord>(filePath) ?? {},\n };\n });\n}\n\nfunction findFirstTraceByCaller(\n traces: LocatedTrace[],\n caller: string\n): LocatedTrace | undefined {\n return traces.find((entry) => entry.record.caller === caller);\n}\n\nfunction findLatestTraceByCaller(\n traces: LocatedTrace[],\n caller: string\n): LocatedTrace | undefined {\n return [...traces].reverse().find((entry) => entry.record.caller === caller);\n}\n\nfunction getStringInputContext(\n trace: LocatedTrace,\n key: string\n): string {\n return String((trace.record.inputContext?.[key] as string | undefined) ?? \"\");\n}\n\nfunction getArrayInputContext(\n trace: LocatedTrace,\n key: string\n): unknown[] {\n return Array.isArray(trace.record.inputContext?.[key])\n ? (trace.record.inputContext?.[key] as unknown[])\n : [];\n}\n\nfunction getPlannerPromptHash(trace: LocatedTrace): string {\n return createHash(\"sha256\").update(trace.record.promptText ?? \"\").digest(\"hex\");\n}\n\nfunction normalizeActionCatalog(trace: LocatedTrace): string {\n const allowedActions = getArrayInputContext(trace, \"allowedActions\")\n .map((item) => {\n if (!item || typeof item !== \"object\") return \"\";\n const record = item as Record<string, unknown>;\n return String(record.actionId ?? record.action ?? \"\").trim();\n })\n .filter(Boolean)\n .sort();\n return allowedActions.join(\",\");\n}\n\nfunction getSupportingExcerptStats(trace: LocatedTrace): { totalChars: number; maxChars: number; fileCount: number } {\n const supportingExcerpts = getArrayInputContext(trace, \"supportingExcerpts\");\n let totalChars = 0;\n let maxChars = 0;\n let fileCount = 0;\n\n for (const item of supportingExcerpts) {\n if (!item || typeof item !== \"object\") continue;\n const record = item as Record<string, unknown>;\n const excerpts = Array.isArray(record.excerpts) ? record.excerpts : [];\n if (excerpts.length === 0) continue;\n fileCount += 1;\n for (const excerpt of excerpts) {\n const value = String(excerpt ?? \"\");\n totalChars += value.length;\n maxChars = Math.max(maxChars, value.length);\n }\n }\n\n return { totalChars, maxChars, fileCount };\n}\n\nfunction isMultiQuestionQuery(query: string): boolean {\n const trimmed = query.trim();\n if (!trimmed) return false;\n\n const questionMarks = (trimmed.match(/\\?/g) ?? []).length;\n if (questionMarks >= 2) return true;\n\n const interrogatives = trimmed.match(/\\b(how|what|where|why|which|who|is|are|do|does|can|should)\\b/gi) ?? [];\n return interrogatives.length >= 2 && /\\band\\b/i.test(trimmed);\n}\n\nfunction extractJsonBlocks(runLog: string | undefined, marker: string): Array<Record<string, unknown>> {\n if (!runLog) return [];\n const pattern = new RegExp(\n `📂 OUTPUT \\\\| ${marker}[\\\\s\\\\S]*?\\\\n={68}\\\\n([\\\\s\\\\S]*?)\\\\n={68}\\\\n`,\n \"g\"\n );\n const outputs: Array<Record<string, unknown>> = [];\n let match: RegExpExecArray | null = null;\n while ((match = pattern.exec(runLog)) !== null) {\n try {\n const parsed = JSON.parse((match[1] ?? \"\").trim()) as Record<string, unknown>;\n outputs.push(parsed);\n } catch {\n // Ignore malformed log blocks. The report should degrade quietly.\n }\n }\n return outputs;\n}\n\nfunction buildMissingHighValueContextFinding(\n source: ContextEvalSource\n): ContextEvalFinding | undefined {\n const finalTrace = findLatestTraceByCaller(source.traces, \"finalAnswerModule\");\n if (!finalTrace) return undefined;\n\n const researchOutputs = extractJsonBlocks(source.runLog, \"runResearch\");\n const architectureOutput = researchOutputs.find((entry) => {\n const stepReasoning = entry.stepReasoning as Record<string, unknown> | undefined;\n return typeof stepReasoning?.rationale === \"string\" && stepReasoning.rationale.includes(\"Architecture synthesis\");\n });\n const architectureResult = architectureOutput?.result as Record<string, unknown> | undefined;\n const priorResearchSummaries = Array.isArray(architectureResult?.priorResearchSummaries)\n ? architectureResult?.priorResearchSummaries\n : [];\n const architectureInputFiles = Array.isArray(architectureResult?.architectureInputFiles)\n ? architectureResult?.architectureInputFiles\n : [];\n const combinedSection = getStringInputContext(finalTrace, \"combinedSection\");\n const researchSummary = getStringInputContext(finalTrace, \"researchSummary\");\n const mode = getStringInputContext(finalTrace, \"mode\");\n const analyzedFiles = getArrayInputContext(finalTrace, \"analyzedFiles\");\n\n if (priorResearchSummaries.length === 0 && architectureInputFiles.length === 0) {\n return undefined;\n }\n const hasRepoWidePacket = mode === \"repo-wide\" && researchSummary.trim().length > 0;\n const hasOldCombined = !combinedSection.includes(\"[No combined analysis available]\");\n if (hasRepoWidePacket) {\n return undefined;\n }\n if (hasOldCombined && analyzedFiles.length >= architectureInputFiles.length) {\n return undefined;\n }\n\n return {\n name: \"missing-high-value-context\",\n severity: \"warn\",\n callId: finalTrace.record.callId,\n artifactPath: finalTrace.filePath,\n details: \"Final grounding skipped stronger research context that was already present in the run.\",\n expectedContext: `research summaries=${priorResearchSummaries.length}, architecture input files=${architectureInputFiles.length}`,\n actualContext: `mode=${mode || \"[unknown]\"}, researchSummary=${researchSummary ? \"[present]\" : \"[empty]\"}, combinedSection=${combinedSection || \"[empty]\"}, analyzed files=${analyzedFiles.length}`,\n };\n}\n\nfunction buildRedundantLowSignalFinding(\n source: ContextEvalSource\n): ContextEvalFinding | undefined {\n const weakTokenPattern =\n /Symbol reference found: \"(?:module|pattern|repo|src|points|explain|cli|weak|summarize)\"/g;\n const duplicateQueryTrace = source.traces.find((entry) => {\n const prompt = entry.record.promptText ?? \"\";\n return (prompt.match(/User query:/g) ?? []).length > 1;\n });\n const weakEvidenceTrace = source.traces.find((entry) => {\n const prompt = entry.record.promptText ?? \"\";\n return entry.record.caller === \"fileCheckStep\" && (prompt.match(weakTokenPattern) ?? []).length >= 4;\n });\n const match = weakEvidenceTrace ?? duplicateQueryTrace;\n if (!match) return undefined;\n\n return {\n name: \"redundant-low-signal-context\",\n severity: \"warn\",\n callId: match.record.callId,\n artifactPath: match.filePath,\n details: \"Prompt includes repeated low-signal context that is likely to add noise instead of better grounding.\",\n expectedContext: \"short rationale plus only the strongest, task-relevant evidence\",\n actualContext:\n match.record.caller === \"fileCheckStep\"\n ? \"fileCheck prompt is packed with generic token matches\"\n : \"same user query appears more than once in one prompt\",\n };\n}\n\nfunction buildPromptStageMismatchFinding(\n source: ContextEvalSource\n): ContextEvalFinding | undefined {\n const mismatch = source.traces.find((entry) => {\n if (entry.record.caller !== \"finalAnswerModule\") return false;\n const prompt = entry.record.promptText ?? \"\";\n const query = (entry.record.query ?? \"\").toLowerCase();\n const isQuestionLike =\n query.includes(\"explain\") || query.includes(\"summarize\") || query.includes(\"where were we\");\n return isQuestionLike && prompt.includes(\"==================== PROPOSED CHANGES ====================\");\n });\n if (!mismatch) return undefined;\n\n return {\n name: \"prompt-stage-mismatch\",\n severity: \"warn\",\n callId: mismatch.record.callId,\n artifactPath: mismatch.filePath,\n details: \"Final answer grounding mixed answer-focused context with change-planning scaffolding.\",\n expectedContext: \"distilled behavioral analysis and grounded answer inputs\",\n actualContext: \"finalAnswerModule prompt still includes PROPOSED CHANGES\",\n };\n}\n\nfunction buildDuplicateReplanFinding(\n source: ContextEvalSource\n): ContextEvalFinding | undefined {\n const planTraces = source.traces.filter((entry) => entry.record.caller === \"analysisPlanGenStep\");\n const seen = new Map<string, LocatedTrace[]>();\n for (const trace of planTraces) {\n const hash = createHash(\"sha256\").update(trace.record.promptText ?? \"\").digest(\"hex\");\n const matches = seen.get(hash) ?? [];\n matches.push(trace);\n seen.set(hash, matches);\n }\n const duplicateGroup = Array.from(seen.values()).find((group) => group.length > 1);\n if (!duplicateGroup) return undefined;\n\n return {\n name: \"duplicate-replan-calls\",\n severity: \"warn\",\n callId: duplicateGroup[0]?.record.callId,\n artifactPath: duplicateGroup[0]?.filePath,\n details: \"Planner retried with the same prompt content instead of materially new context.\",\n expectedContext: \"new evidence or narrowed intent between planner retries\",\n actualContext: `${duplicateGroup.length} identical analysisPlanGenStep prompts`,\n };\n}\n\nfunction buildStalledPlannerProgressFinding(\n source: ContextEvalSource\n): ContextEvalFinding | undefined {\n const progressOutputs = extractJsonBlocks(source.runLog, \"progressState\");\n const stalled = progressOutputs.find((entry) => {\n const research = entry.research as Record<string, unknown> | undefined;\n const plannerRetry = research?.plannerRetry as Record<string, unknown> | undefined;\n return plannerRetry?.stalled === true;\n });\n if (!stalled) return undefined;\n\n const research = stalled.research as Record<string, unknown> | undefined;\n const plannerRetry = research?.plannerRetry as Record<string, unknown> | undefined;\n const targetFile = String(plannerRetry?.targetFile ?? \"[unknown]\");\n const count = Number(plannerRetry?.count ?? 0);\n const reason = String(plannerRetry?.reason ?? \"stalled planner retry detected\");\n\n return {\n name: \"stalled-planner-progress\",\n severity: \"warn\",\n details: \"Progress state recorded stalled planner retries on one target without meaningful frontier change.\",\n expectedContext: \"progressState.research.plannerRetry should stay unstalled unless the same target repeats with no frontier growth\",\n actualContext: `target=${targetFile}, count=${count}, reason=${reason}`,\n };\n}\n\nfunction buildContinuityOverpromptingFinding(\n source: ContextEvalSource\n): ContextEvalFinding | undefined {\n const continuityTrace = source.traces.find((entry) => {\n const query = (entry.record.query ?? \"\").trim().toLowerCase();\n const capsule = getStringInputContext(entry, \"resumedContextCapsule\");\n return (\n (entry.record.caller === \"scopeClassificationStep\" || entry.record.caller === \"understandIntentStep\") &&\n (query === \"where were we?\" || query === \"what should we do next?\") &&\n capsule.length > 250\n );\n });\n if (!continuityTrace) return undefined;\n\n return {\n name: \"continuity-overprompting\",\n severity: \"warn\",\n callId: continuityTrace.record.callId,\n artifactPath: continuityTrace.filePath,\n details: \"A short continuity query carried a large resumed capsule into a narrow classifier step.\",\n expectedContext: \"small continuity summary or direct resume answer without full routing capsule\",\n actualContext: `${continuityTrace.record.caller} received resumed capsule length ${getStringInputContext(\n continuityTrace,\n \"resumedContextCapsule\"\n ).length}`,\n };\n}\n\nfunction buildFocusEvidenceMismatchFinding(\n source: ContextEvalSource\n): ContextEvalFinding | undefined {\n const planTrace = findFirstTraceByCaller(source.traces, \"analysisPlanGenStep\");\n const finalTrace = findLatestTraceByCaller(source.traces, \"finalAnswerModule\");\n if (!planTrace || !finalTrace) return undefined;\n\n const targetFile = getStringInputContext(planTrace, \"targetFile\");\n const rationaleText = getStringInputContext(planTrace, \"rationaleText\");\n const answerFiles = getArrayInputContext(finalTrace, \"answerFiles\").map((item) => String(item));\n if (!targetFile || answerFiles.length === 0) return undefined;\n\n const rationalePaths: string[] =\n rationaleText.match(/(?:\\/[^\\s`'\"]+\\.(?:ts|js|tsx|jsx|md|json)|\\b[\\w./-]+\\.(?:ts|js|tsx|jsx|md|json)\\b)/g) ?? [];\n const mentionsDifferentFile = rationalePaths.length > 0 && !rationalePaths.includes(targetFile);\n const answerDroppedTarget = !answerFiles.includes(targetFile);\n if (!mentionsDifferentFile && !answerDroppedTarget) return undefined;\n\n return {\n name: \"focus-evidence-mismatch\",\n severity: \"warn\",\n callId: finalTrace.record.callId ?? planTrace.record.callId,\n artifactPath: finalTrace.filePath,\n details: \"Planner focus, rationale, and final grounding disagree about the main evidence file.\",\n expectedContext: `targetFile=${targetFile} should stay aligned through planning and final grounding`,\n actualContext: `rationalePaths=${rationalePaths.join(\", \") || \"[none]\"}, answerFiles=${answerFiles.join(\", \")}`,\n };\n}\n\nfunction buildOversizedFinalGroundingFinding(\n source: ContextEvalSource\n): ContextEvalFinding | undefined {\n const finalTrace = findLatestTraceByCaller(source.traces, \"finalAnswerModule\");\n if (!finalTrace) return undefined;\n\n const stats = getSupportingExcerptStats(finalTrace);\n if (stats.fileCount === 0) return undefined;\n if (stats.totalChars <= 2000 && stats.maxChars <= 1200) {\n return undefined;\n }\n\n return {\n name: \"oversized-final-grounding-context\",\n severity: \"warn\",\n callId: finalTrace.record.callId,\n artifactPath: finalTrace.filePath,\n details: \"Final grounding carries oversized supporting excerpts instead of short identifier-local evidence.\",\n expectedContext: \"small supporting excerpts that keep total evidence compact\",\n actualContext: `supporting excerpts chars=${stats.totalChars}, max excerpt chars=${stats.maxChars}, files=${stats.fileCount}`,\n };\n}\n\nfunction buildStalePlannerRationaleFinding(\n source: ContextEvalSource\n): ContextEvalFinding | undefined {\n const planTraces = source.traces.filter((entry) => entry.record.caller === \"analysisPlanGenStep\");\n for (let index = 1; index < planTraces.length; index += 1) {\n const previous = planTraces[index - 1];\n const current = planTraces[index];\n const previousRationale = getStringInputContext(previous, \"rationaleText\").trim();\n const currentRationale = getStringInputContext(current, \"rationaleText\").trim();\n const previousTarget = getStringInputContext(previous, \"targetFile\");\n const currentTarget = getStringInputContext(current, \"targetFile\");\n if (!previousRationale || previousRationale !== currentRationale) continue;\n if (!previousTarget || previousTarget !== currentTarget) continue;\n if (getPlannerPromptHash(previous) === getPlannerPromptHash(current)) continue;\n\n return {\n name: \"stale-planner-rationale\",\n severity: \"warn\",\n callId: current.record.callId,\n artifactPath: current.filePath,\n details: \"Adjacent planner retries reused the same focus rationale instead of sending a smaller delta.\",\n expectedContext: \"planner retries should carry only materially new evidence or a narrowed rationale\",\n actualContext: `target=${currentTarget}, rationale length=${currentRationale.length}`,\n };\n }\n\n return undefined;\n}\n\nfunction buildRepeatedPlannerActionCatalogFinding(\n source: ContextEvalSource\n): ContextEvalFinding | undefined {\n const planTraces = source.traces.filter((entry) => entry.record.caller === \"analysisPlanGenStep\");\n for (let index = 1; index < planTraces.length; index += 1) {\n const previous = planTraces[index - 1];\n const current = planTraces[index];\n const previousCatalog = normalizeActionCatalog(previous);\n const currentCatalog = normalizeActionCatalog(current);\n if (!previousCatalog || previousCatalog !== currentCatalog) continue;\n const actionCount = previousCatalog.split(\",\").filter(Boolean).length;\n if (actionCount < 5) continue;\n\n return {\n name: \"repeated-planner-action-catalog\",\n severity: \"warn\",\n callId: current.record.callId,\n artifactPath: current.filePath,\n details: \"Planner retries kept resending the same large allowed-actions catalog.\",\n expectedContext: \"stable action guidance should be shared or reduced instead of repeated per retry\",\n actualContext: `${actionCount} actions repeated across adjacent planner prompts`,\n };\n }\n\n return undefined;\n}\n\nfunction buildMissingQuestionDecompositionFinding(\n source: ContextEvalSource\n): ContextEvalFinding | undefined {\n const multiQuestionTrace = source.traces.find((entry) =>\n (entry.record.caller === \"understandIntentStep\" || entry.record.caller === \"scopeClassificationStep\") &&\n isMultiQuestionQuery(entry.record.query ?? \"\")\n );\n if (!multiQuestionTrace) return undefined;\n\n const orderedQuestionCount = source.traces.reduce((max, entry) => {\n const count = getArrayInputContext(entry, \"orderedQuestions\").length;\n return Math.max(max, count);\n }, 0);\n if (orderedQuestionCount > 1) {\n return undefined;\n }\n\n return {\n name: \"missing-question-decomposition\",\n severity: \"warn\",\n callId: multiQuestionTrace.record.callId,\n artifactPath: multiQuestionTrace.filePath,\n details: \"A clearly multi-part user query did not survive into ordered question decomposition.\",\n expectedContext: \"ordered question parts should preserve each direct ask in user order\",\n actualContext: `query=${JSON.stringify(multiQuestionTrace.record.query ?? \"\")}, max orderedQuestions=${orderedQuestionCount}`,\n };\n}\n\nconst CONTEXT_CHECKS: ContextEvalDefinition[] = [\n {\n name: \"missing-high-value-context\",\n passDetails: \"High-value run context was carried into final grounding when available.\",\n find: buildMissingHighValueContextFinding,\n },\n {\n name: \"redundant-low-signal-context\",\n passDetails: \"Prompts stay mostly free of repeated low-signal evidence.\",\n find: buildRedundantLowSignalFinding,\n },\n {\n name: \"prompt-stage-mismatch\",\n passDetails: \"Each stage prompt is shaped for its own job.\",\n find: buildPromptStageMismatchFinding,\n },\n {\n name: \"duplicate-replan-calls\",\n passDetails: \"Planner retries add new context before repeating.\",\n find: buildDuplicateReplanFinding,\n },\n {\n name: \"stalled-planner-progress\",\n passDetails: \"Progress state surfaces stalled planner churn before the loop burns budget.\",\n find: buildStalledPlannerProgressFinding,\n },\n {\n name: \"continuity-overprompting\",\n passDetails: \"Continuity prompts stay concise for narrow resume questions.\",\n find: buildContinuityOverpromptingFinding,\n },\n {\n name: \"focus-evidence-mismatch\",\n passDetails: \"Planner target, rationale, and final grounding stay aligned.\",\n find: buildFocusEvidenceMismatchFinding,\n },\n {\n name: \"oversized-final-grounding-context\",\n passDetails: \"Final grounding keeps supporting excerpts compact.\",\n find: buildOversizedFinalGroundingFinding,\n },\n {\n name: \"stale-planner-rationale\",\n passDetails: \"Planner retries shrink rationale payloads when nothing material changed.\",\n find: buildStalePlannerRationaleFinding,\n },\n {\n name: \"repeated-planner-action-catalog\",\n passDetails: \"Planner retries avoid repeating a large action catalog when guidance is unchanged.\",\n find: buildRepeatedPlannerActionCatalogFinding,\n },\n {\n name: \"missing-question-decomposition\",\n passDetails: \"Multi-part queries preserve ordered question decomposition through later stages.\",\n find: buildMissingQuestionDecompositionFinding,\n },\n];\n\nfunction toCheck(\n name: ContextEvalFinding[\"name\"],\n finding: ContextEvalFinding | undefined,\n fallbackDetails: string\n): ContextEvalCheck {\n if (!finding) {\n return {\n name,\n ok: true,\n details: fallbackDetails,\n };\n }\n return {\n name,\n ok: false,\n details: finding.details,\n finding,\n };\n}\n\nexport function buildContextEval(input: ContextEvalInput): { artifactDir?: string; checks: ContextEvalCheck[] } {\n const artifactDir = input.artifactDir ?? findArtifactDirForTask(input.taskId);\n const traces = loadTraces(artifactDir);\n const source: ContextEvalSource = {\n traces,\n runLog: input.runLog,\n };\n\n if (traces.length === 0) {\n return {\n artifactDir,\n checks: CONTEXT_CHECKS.map((check) => ({\n name: check.name,\n ok: true,\n details: \"No llm_calls traces available for context audit.\",\n })),\n };\n }\n\n return {\n artifactDir,\n checks: CONTEXT_CHECKS.map((check) =>\n toCheck(check.name, check.find(source), check.passDetails)\n ),\n };\n}\n\nexport function formatContextEvalFinding(finding: ContextEvalFinding): string {\n const extras = [\n finding.callId ? `call=${finding.callId}` : \"\",\n finding.expectedContext ? `expected=${finding.expectedContext}` : \"\",\n finding.actualContext ? `actual=${finding.actualContext}` : \"\",\n finding.artifactPath ? `artifact=${finding.artifactPath}` : \"\",\n ].filter(Boolean);\n\n return `${finding.details}${extras.length > 0 ? ` (${extras.join(\"; \")})` : \"\"}`;\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"small-file.input.js","sourceRoot":"","sources":["../../../../src/testing/fixtures/transform/small-file.input.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gBAAgB,GAAG;;;CAG/B,CAAC","sourcesContent":["export const SMALL_FILE_INPUT = `export function add(a: number, b: number): number {\n return a + b;\n}\n`;\n"]}
|