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,201 @@
|
|
|
1
|
+
function normalizeOptionId(value) {
|
|
2
|
+
return value.trim().toLowerCase().replace(/\s+/g, "-");
|
|
3
|
+
}
|
|
4
|
+
function buildDialogPromptFromIntent(intent) {
|
|
5
|
+
if (intent.promptHint?.trim())
|
|
6
|
+
return intent.promptHint.trim();
|
|
7
|
+
return intent.reason.trim() || "I need your input before continuing.";
|
|
8
|
+
}
|
|
9
|
+
export function createTaskDialogFromIntent(context, intent) {
|
|
10
|
+
return {
|
|
11
|
+
status: "awaiting-user",
|
|
12
|
+
kind: intent.kind,
|
|
13
|
+
prompt: buildDialogPromptFromIntent(intent),
|
|
14
|
+
options: intent.suggestedOptions?.length
|
|
15
|
+
? intent.suggestedOptions
|
|
16
|
+
: ["continue", "revise", "cancel"],
|
|
17
|
+
relatedQuestionId: intent.relatedQuestionId,
|
|
18
|
+
relatedStepId: intent.relatedStepId,
|
|
19
|
+
createdAt: new Date().toISOString(),
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
export function createPlanFollowUpDialog(context) {
|
|
23
|
+
const objective = context.analysis?.intent?.normalizedQuery ??
|
|
24
|
+
context.task?.initialQuery ??
|
|
25
|
+
context.initContext?.userQuery ??
|
|
26
|
+
"current task";
|
|
27
|
+
return {
|
|
28
|
+
status: "awaiting-user",
|
|
29
|
+
kind: "plan-followup",
|
|
30
|
+
prompt: `I saved a plan for: ${objective}`,
|
|
31
|
+
options: ["execute", "revise", "add-info", "cancel"],
|
|
32
|
+
createdAt: new Date().toISOString(),
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
export function parseDialogResponse(dialog, rawResponse) {
|
|
36
|
+
const response = rawResponse.trim();
|
|
37
|
+
if (!response)
|
|
38
|
+
return { response: "" };
|
|
39
|
+
const lines = response
|
|
40
|
+
.split(/\r?\n/)
|
|
41
|
+
.map((line) => line.trim())
|
|
42
|
+
.filter(Boolean);
|
|
43
|
+
const firstLine = lines[0] ?? response;
|
|
44
|
+
const separatorMatch = firstLine.match(/^([^:|-]+)\s*[:|-]\s*(.+)$/);
|
|
45
|
+
const knownOptions = new Map((dialog.options ?? []).map((option) => [normalizeOptionId(option), option]));
|
|
46
|
+
if (separatorMatch) {
|
|
47
|
+
const option = knownOptions.get(normalizeOptionId(separatorMatch[1] ?? ""));
|
|
48
|
+
if (option) {
|
|
49
|
+
const tail = [separatorMatch[2], ...lines.slice(1)].filter(Boolean).join(" ").trim();
|
|
50
|
+
return {
|
|
51
|
+
selectedOption: option,
|
|
52
|
+
comment: tail || undefined,
|
|
53
|
+
response,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
const exactOption = knownOptions.get(normalizeOptionId(firstLine));
|
|
58
|
+
if (exactOption) {
|
|
59
|
+
const tail = lines.slice(1).join(" ").trim();
|
|
60
|
+
return {
|
|
61
|
+
selectedOption: exactOption,
|
|
62
|
+
comment: tail || undefined,
|
|
63
|
+
response,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
const firstToken = normalizeOptionId(firstLine.split(/\s+/)[0] ?? "");
|
|
67
|
+
const tokenOption = knownOptions.get(firstToken);
|
|
68
|
+
if (tokenOption) {
|
|
69
|
+
const remainder = firstLine.slice(firstLine.split(/\s+/)[0]?.length ?? 0).trim();
|
|
70
|
+
const tail = [remainder, ...lines.slice(1)].filter(Boolean).join(" ").trim();
|
|
71
|
+
return {
|
|
72
|
+
selectedOption: tokenOption,
|
|
73
|
+
comment: tail || undefined,
|
|
74
|
+
response,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
return {
|
|
78
|
+
response,
|
|
79
|
+
comment: response,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
function pushUniqueNextAction(context, label) {
|
|
83
|
+
var _a;
|
|
84
|
+
context.analysis || (context.analysis = {});
|
|
85
|
+
(_a = context.analysis).rollingPlan || (_a.rollingPlan = {
|
|
86
|
+
mode: "rolling",
|
|
87
|
+
summary: "Rolling plan updated from dialog feedback.",
|
|
88
|
+
subgoals: [],
|
|
89
|
+
nextActions: [],
|
|
90
|
+
lastUpdatedAt: new Date().toISOString(),
|
|
91
|
+
});
|
|
92
|
+
const nextActions = context.analysis.rollingPlan.nextActions ?? [];
|
|
93
|
+
if (!nextActions.includes(label)) {
|
|
94
|
+
context.analysis.rollingPlan.nextActions = [label, ...nextActions].slice(0, 6);
|
|
95
|
+
}
|
|
96
|
+
context.analysis.rollingPlan.lastUpdatedAt = new Date().toISOString();
|
|
97
|
+
}
|
|
98
|
+
function applyDialogComment(context, comment) {
|
|
99
|
+
var _a;
|
|
100
|
+
const normalized = comment?.trim();
|
|
101
|
+
if (!normalized)
|
|
102
|
+
return;
|
|
103
|
+
context.analysis || (context.analysis = {});
|
|
104
|
+
(_a = context.analysis).rollingPlan || (_a.rollingPlan = {
|
|
105
|
+
mode: "rolling",
|
|
106
|
+
summary: "Rolling plan updated from dialog feedback.",
|
|
107
|
+
subgoals: [],
|
|
108
|
+
nextActions: [],
|
|
109
|
+
lastUpdatedAt: new Date().toISOString(),
|
|
110
|
+
});
|
|
111
|
+
context.analysis.rollingPlan.summary =
|
|
112
|
+
`${context.analysis.rollingPlan.summary} User note: ${normalized}`.trim();
|
|
113
|
+
pushUniqueNextAction(context, `Apply user note: ${normalized}`);
|
|
114
|
+
}
|
|
115
|
+
function clearAwaitingDialog(context, parsed) {
|
|
116
|
+
if (!context.task.dialogState)
|
|
117
|
+
return;
|
|
118
|
+
context.task.dialogState = {
|
|
119
|
+
...context.task.dialogState,
|
|
120
|
+
status: "answered",
|
|
121
|
+
selectedOption: parsed.selectedOption,
|
|
122
|
+
comment: parsed.comment,
|
|
123
|
+
response: parsed.response,
|
|
124
|
+
answeredAt: new Date().toISOString(),
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
export function applyDialogResponseFromFollowUp(context) {
|
|
128
|
+
var _a;
|
|
129
|
+
const dialog = context.task?.dialogState;
|
|
130
|
+
const rawResponse = context.initContext?.followUpQuery?.trim();
|
|
131
|
+
if (!dialog || dialog.status !== "awaiting-user" || !rawResponse)
|
|
132
|
+
return false;
|
|
133
|
+
const parsed = parseDialogResponse(dialog, rawResponse);
|
|
134
|
+
const canonicalTaskQuery = context.initContext?.canonicalTaskQuery?.trim() ||
|
|
135
|
+
context.task?.initialQuery?.trim() ||
|
|
136
|
+
context.initContext?.userQuery?.trim() ||
|
|
137
|
+
"";
|
|
138
|
+
clearAwaitingDialog(context, parsed);
|
|
139
|
+
applyDialogComment(context, parsed.comment);
|
|
140
|
+
context.analysis || (context.analysis = {});
|
|
141
|
+
context.analysis.dialogIntent = undefined;
|
|
142
|
+
if (context.initContext) {
|
|
143
|
+
context.initContext.followUpQuery = undefined;
|
|
144
|
+
}
|
|
145
|
+
if (dialog.kind === "plan-followup") {
|
|
146
|
+
(_a = context.analysis).planMode || (_a.planMode = {
|
|
147
|
+
enabled: true,
|
|
148
|
+
source: "explicit",
|
|
149
|
+
executionMode: "plan-only",
|
|
150
|
+
rationale: "User explicitly asked for planning mode.",
|
|
151
|
+
});
|
|
152
|
+
if (parsed.selectedOption === "execute") {
|
|
153
|
+
context.analysis.planMode.executionMode = "execute";
|
|
154
|
+
context.task.status = "active";
|
|
155
|
+
context.task.reason = undefined;
|
|
156
|
+
if (context.initContext) {
|
|
157
|
+
context.initContext.userQuery = canonicalTaskQuery;
|
|
158
|
+
}
|
|
159
|
+
pushUniqueNextAction(context, "Execute the saved plan.");
|
|
160
|
+
return true;
|
|
161
|
+
}
|
|
162
|
+
if (parsed.selectedOption === "cancel") {
|
|
163
|
+
context.analysis.planMode.executionMode = "plan-only";
|
|
164
|
+
context.task.status = "deferred";
|
|
165
|
+
context.task.reason = "User canceled after reviewing the saved plan.";
|
|
166
|
+
pushUniqueNextAction(context, "Wait for a new user query before executing.");
|
|
167
|
+
return true;
|
|
168
|
+
}
|
|
169
|
+
context.analysis.planMode.executionMode = "plan-only";
|
|
170
|
+
context.task.status = "active";
|
|
171
|
+
if (context.initContext && canonicalTaskQuery) {
|
|
172
|
+
const commentSuffix = parsed.comment?.trim() ? `\n\nUser note: ${parsed.comment.trim()}` : "";
|
|
173
|
+
context.initContext.userQuery = `${canonicalTaskQuery}${commentSuffix}`.trim();
|
|
174
|
+
}
|
|
175
|
+
if (parsed.selectedOption === "revise") {
|
|
176
|
+
pushUniqueNextAction(context, "Revise the saved plan with the latest user note.");
|
|
177
|
+
}
|
|
178
|
+
else if (parsed.selectedOption === "add-info") {
|
|
179
|
+
pushUniqueNextAction(context, "Extend the saved plan with the extra user detail.");
|
|
180
|
+
}
|
|
181
|
+
return true;
|
|
182
|
+
}
|
|
183
|
+
if (parsed.selectedOption === "cancel") {
|
|
184
|
+
context.task.status = "paused";
|
|
185
|
+
context.task.reason = "Waiting after user canceled the current dialog.";
|
|
186
|
+
return true;
|
|
187
|
+
}
|
|
188
|
+
context.task.status = "active";
|
|
189
|
+
context.task.reason = undefined;
|
|
190
|
+
if (context.initContext && canonicalTaskQuery) {
|
|
191
|
+
const commentSuffix = parsed.comment?.trim() ? `\n\nUser note: ${parsed.comment.trim()}` : "";
|
|
192
|
+
context.initContext.userQuery = parsed.selectedOption === "continue"
|
|
193
|
+
? canonicalTaskQuery
|
|
194
|
+
: `${canonicalTaskQuery}${commentSuffix}`.trim();
|
|
195
|
+
}
|
|
196
|
+
if (parsed.selectedOption) {
|
|
197
|
+
pushUniqueNextAction(context, `Continue with user choice: ${parsed.selectedOption}.`);
|
|
198
|
+
}
|
|
199
|
+
return true;
|
|
200
|
+
}
|
|
201
|
+
//# sourceMappingURL=dialogState.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dialogState.js","sourceRoot":"","sources":["../../src/utils/dialogState.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Builds and applies the task-level dialog state for collaborative runs.\n *\n * Why this file exists:\n * - all user interaction should flow through one task-scoped dialog model\n * - shell input, outer-loop pauses, and plan follow-up should share one parser\n * - comments should refine the rolling plan without inventing a second feedback store\n */\nimport type {\n DialogIntent,\n DialogOption,\n DialogState,\n StructuredContext,\n} from \"../types.js\";\n\nexport interface ParsedDialogResponse {\n selectedOption?: DialogOption;\n comment?: string;\n response: string;\n}\n\nfunction normalizeOptionId(value: string): string {\n return value.trim().toLowerCase().replace(/\\s+/g, \"-\");\n}\n\nfunction buildDialogPromptFromIntent(intent: DialogIntent): string {\n if (intent.promptHint?.trim()) return intent.promptHint.trim();\n return intent.reason.trim() || \"I need your input before continuing.\";\n}\n\nexport function createTaskDialogFromIntent(\n context: StructuredContext,\n intent: DialogIntent\n): DialogState {\n return {\n status: \"awaiting-user\",\n kind: intent.kind,\n prompt: buildDialogPromptFromIntent(intent),\n options: intent.suggestedOptions?.length\n ? intent.suggestedOptions\n : [\"continue\", \"revise\", \"cancel\"],\n relatedQuestionId: intent.relatedQuestionId,\n relatedStepId: intent.relatedStepId,\n createdAt: new Date().toISOString(),\n };\n}\n\nexport function createPlanFollowUpDialog(context: StructuredContext): DialogState {\n const objective =\n context.analysis?.intent?.normalizedQuery ??\n context.task?.initialQuery ??\n context.initContext?.userQuery ??\n \"current task\";\n return {\n status: \"awaiting-user\",\n kind: \"plan-followup\",\n prompt: `I saved a plan for: ${objective}`,\n options: [\"execute\", \"revise\", \"add-info\", \"cancel\"],\n createdAt: new Date().toISOString(),\n };\n}\n\nexport function parseDialogResponse(\n dialog: DialogState,\n rawResponse: string\n): ParsedDialogResponse {\n const response = rawResponse.trim();\n if (!response) return { response: \"\" };\n\n const lines = response\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean);\n const firstLine = lines[0] ?? response;\n const separatorMatch = firstLine.match(/^([^:|-]+)\\s*[:|-]\\s*(.+)$/);\n const knownOptions = new Map(\n (dialog.options ?? []).map((option) => [normalizeOptionId(option), option])\n );\n\n if (separatorMatch) {\n const option = knownOptions.get(normalizeOptionId(separatorMatch[1] ?? \"\"));\n if (option) {\n const tail = [separatorMatch[2], ...lines.slice(1)].filter(Boolean).join(\" \").trim();\n return {\n selectedOption: option,\n comment: tail || undefined,\n response,\n };\n }\n }\n\n const exactOption = knownOptions.get(normalizeOptionId(firstLine));\n if (exactOption) {\n const tail = lines.slice(1).join(\" \").trim();\n return {\n selectedOption: exactOption,\n comment: tail || undefined,\n response,\n };\n }\n\n const firstToken = normalizeOptionId(firstLine.split(/\\s+/)[0] ?? \"\");\n const tokenOption = knownOptions.get(firstToken);\n if (tokenOption) {\n const remainder = firstLine.slice(firstLine.split(/\\s+/)[0]?.length ?? 0).trim();\n const tail = [remainder, ...lines.slice(1)].filter(Boolean).join(\" \").trim();\n return {\n selectedOption: tokenOption,\n comment: tail || undefined,\n response,\n };\n }\n\n return {\n response,\n comment: response,\n };\n}\n\nfunction pushUniqueNextAction(context: StructuredContext, label: string): void {\n context.analysis ||= {};\n context.analysis.rollingPlan ||= {\n mode: \"rolling\",\n summary: \"Rolling plan updated from dialog feedback.\",\n subgoals: [],\n nextActions: [],\n lastUpdatedAt: new Date().toISOString(),\n };\n const nextActions = context.analysis.rollingPlan.nextActions ?? [];\n if (!nextActions.includes(label)) {\n context.analysis.rollingPlan.nextActions = [label, ...nextActions].slice(0, 6);\n }\n context.analysis.rollingPlan.lastUpdatedAt = new Date().toISOString();\n}\n\nfunction applyDialogComment(context: StructuredContext, comment?: string): void {\n const normalized = comment?.trim();\n if (!normalized) return;\n context.analysis ||= {};\n context.analysis.rollingPlan ||= {\n mode: \"rolling\",\n summary: \"Rolling plan updated from dialog feedback.\",\n subgoals: [],\n nextActions: [],\n lastUpdatedAt: new Date().toISOString(),\n };\n context.analysis.rollingPlan.summary =\n `${context.analysis.rollingPlan.summary} User note: ${normalized}`.trim();\n pushUniqueNextAction(context, `Apply user note: ${normalized}`);\n}\n\nfunction clearAwaitingDialog(context: StructuredContext, parsed: ParsedDialogResponse): void {\n if (!context.task.dialogState) return;\n context.task.dialogState = {\n ...context.task.dialogState,\n status: \"answered\",\n selectedOption: parsed.selectedOption,\n comment: parsed.comment,\n response: parsed.response,\n answeredAt: new Date().toISOString(),\n };\n}\n\nexport function applyDialogResponseFromFollowUp(context: StructuredContext): boolean {\n const dialog = context.task?.dialogState;\n const rawResponse = context.initContext?.followUpQuery?.trim();\n if (!dialog || dialog.status !== \"awaiting-user\" || !rawResponse) return false;\n\n const parsed = parseDialogResponse(dialog, rawResponse);\n const canonicalTaskQuery =\n context.initContext?.canonicalTaskQuery?.trim() ||\n context.task?.initialQuery?.trim() ||\n context.initContext?.userQuery?.trim() ||\n \"\";\n clearAwaitingDialog(context, parsed);\n applyDialogComment(context, parsed.comment);\n context.analysis ||= {};\n context.analysis.dialogIntent = undefined;\n if (context.initContext) {\n context.initContext.followUpQuery = undefined;\n }\n\n if (dialog.kind === \"plan-followup\") {\n context.analysis.planMode ||= {\n enabled: true,\n source: \"explicit\",\n executionMode: \"plan-only\",\n rationale: \"User explicitly asked for planning mode.\",\n };\n\n if (parsed.selectedOption === \"execute\") {\n context.analysis.planMode.executionMode = \"execute\";\n context.task.status = \"active\";\n context.task.reason = undefined;\n if (context.initContext) {\n context.initContext.userQuery = canonicalTaskQuery;\n }\n pushUniqueNextAction(context, \"Execute the saved plan.\");\n return true;\n }\n\n if (parsed.selectedOption === \"cancel\") {\n context.analysis.planMode.executionMode = \"plan-only\";\n context.task.status = \"deferred\";\n context.task.reason = \"User canceled after reviewing the saved plan.\";\n pushUniqueNextAction(context, \"Wait for a new user query before executing.\");\n return true;\n }\n\n context.analysis.planMode.executionMode = \"plan-only\";\n context.task.status = \"active\";\n if (context.initContext && canonicalTaskQuery) {\n const commentSuffix = parsed.comment?.trim() ? `\\n\\nUser note: ${parsed.comment.trim()}` : \"\";\n context.initContext.userQuery = `${canonicalTaskQuery}${commentSuffix}`.trim();\n }\n if (parsed.selectedOption === \"revise\") {\n pushUniqueNextAction(context, \"Revise the saved plan with the latest user note.\");\n } else if (parsed.selectedOption === \"add-info\") {\n pushUniqueNextAction(context, \"Extend the saved plan with the extra user detail.\");\n }\n return true;\n }\n\n if (parsed.selectedOption === \"cancel\") {\n context.task.status = \"paused\";\n context.task.reason = \"Waiting after user canceled the current dialog.\";\n return true;\n }\n\n context.task.status = \"active\";\n context.task.reason = undefined;\n if (context.initContext && canonicalTaskQuery) {\n const commentSuffix = parsed.comment?.trim() ? `\\n\\nUser note: ${parsed.comment.trim()}` : \"\";\n context.initContext.userQuery = parsed.selectedOption === \"continue\"\n ? canonicalTaskQuery\n : `${canonicalTaskQuery}${commentSuffix}`.trim();\n }\n if (parsed.selectedOption) {\n pushUniqueNextAction(context, `Continue with user choice: ${parsed.selectedOption}.`);\n }\n return true;\n}\n"]}
|
package/dist/utils/editor.js
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"editor.js","sourceRoot":"","sources":["../../src/utils/editor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE1C,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,cAAsB,EAAE,QAAgB;IAC3E,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,QAAQ,CAAC,CAAC;IACrD,EAAE,CAAC,aAAa,CAAC,WAAW,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC;IAEvD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACvF,SAAS,CAAC,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IAEvD,MAAM,aAAa,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAC5D,OAAO,aAAa;SACjB,KAAK,CAAC,IAAI,CAAC;SACX,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;SAC5C,IAAI,CAAC,IAAI,CAAC;SACV,IAAI,EAAE,CAAC;AACZ,CAAC","sourcesContent":["import os from 'os';\r\nimport fs from 'fs';\r\nimport path from 'path';\r\nimport { spawnSync } from 'child_process';\r\n\r\nexport async function openTextEditor(initialContent: string, filename: string): Promise<string> {\r\n const tmpFilePath = path.join(os.tmpdir(), filename);\r\n fs.writeFileSync(tmpFilePath, initialContent, 'utf-8');\r\n\r\n const editor = process.env.EDITOR || (process.platform === 'win32' ? 'notepad' : 'vi');\r\n spawnSync(editor, [tmpFilePath], { stdio: 'inherit' });\r\n\r\n const editedContent = fs.readFileSync(tmpFilePath, 'utf-8');\r\n return editedContent\r\n .split('\\n')\r\n .filter(line => !line.trim().startsWith('#'))\r\n .join('\\n')\r\n .trim();\r\n}\r\n"]}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Classifies which completed task steps count as execution-grade grounding.
|
|
3
|
+
*
|
|
4
|
+
* Why this file exists:
|
|
5
|
+
* - progress gating and final grounding both need the same answer
|
|
6
|
+
* - read-only steps like search, semantic analysis, and final answer must not count as executed evidence
|
|
7
|
+
* - older saved steps may still use generic names like `work`, so this helper keeps that compatibility narrow
|
|
8
|
+
*
|
|
9
|
+
* Examples:
|
|
10
|
+
* - `codeTransform` -> true
|
|
11
|
+
* - `semanticAnalysis` -> false
|
|
12
|
+
* - `research-impact-map` -> false
|
|
13
|
+
* - legacy `work` step on a real file -> true
|
|
14
|
+
*/
|
|
15
|
+
import { getActionSpec } from "../agents/actionRegistry.js";
|
|
16
|
+
const READ_ONLY_STEP_NAMES = new Set([
|
|
17
|
+
"fileSearch",
|
|
18
|
+
"semanticAnalysis",
|
|
19
|
+
"finalAnswer",
|
|
20
|
+
"run-search",
|
|
21
|
+
"run-verify",
|
|
22
|
+
"seed-research",
|
|
23
|
+
"seed-plan",
|
|
24
|
+
]);
|
|
25
|
+
/**
|
|
26
|
+
* Returns true only for completed, non-research steps that represent execution-grade work.
|
|
27
|
+
* Example: `{ status: "completed", action: "codeTransform", filePath: "/repo/a.ts" }` -> true.
|
|
28
|
+
*/
|
|
29
|
+
export function isExecutionGroundedStep(step) {
|
|
30
|
+
if (!step || step.status !== "completed") {
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
const filePath = String(step.filePath ?? "").trim();
|
|
34
|
+
if (!filePath || filePath.startsWith("__research__/")) {
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
const actionId = String(step.actionId ?? step.action ?? "").trim();
|
|
38
|
+
if (!actionId) {
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
41
|
+
if (actionId.startsWith("research-") || READ_ONLY_STEP_NAMES.has(actionId)) {
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
const spec = getActionSpec(actionId);
|
|
45
|
+
if (!spec) {
|
|
46
|
+
return actionId === "work";
|
|
47
|
+
}
|
|
48
|
+
return spec.phase === "transform" || spec.safety === "repo-write" || spec.safety === "shell";
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=executionEvidence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executionEvidence.js","sourceRoot":"","sources":["../../src/utils/executionEvidence.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAS5D,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAC;IACnC,YAAY;IACZ,kBAAkB;IAClB,aAAa;IACb,YAAY;IACZ,YAAY;IACZ,eAAe;IACf,WAAW;CACZ,CAAC,CAAC;AAEH;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CAAC,IAA0B;IAChE,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;QACzC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACpD,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QACtD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACnE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,QAAQ,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,oBAAoB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC3E,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,IAAI,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;IACrC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,QAAQ,KAAK,MAAM,CAAC;IAC7B,CAAC;IAED,OAAO,IAAI,CAAC,KAAK,KAAK,WAAW,IAAI,IAAI,CAAC,MAAM,KAAK,YAAY,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO,CAAC;AAC/F,CAAC","sourcesContent":["/**\n * Classifies which completed task steps count as execution-grade grounding.\n *\n * Why this file exists:\n * - progress gating and final grounding both need the same answer\n * - read-only steps like search, semantic analysis, and final answer must not count as executed evidence\n * - older saved steps may still use generic names like `work`, so this helper keeps that compatibility narrow\n *\n * Examples:\n * - `codeTransform` -> true\n * - `semanticAnalysis` -> false\n * - `research-impact-map` -> false\n * - legacy `work` step on a real file -> true\n */\nimport { getActionSpec } from \"../agents/actionRegistry.js\";\n\ntype StepLike = {\n filePath?: string;\n action?: string;\n actionId?: string;\n status?: string;\n};\n\nconst READ_ONLY_STEP_NAMES = new Set([\n \"fileSearch\",\n \"semanticAnalysis\",\n \"finalAnswer\",\n \"run-search\",\n \"run-verify\",\n \"seed-research\",\n \"seed-plan\",\n]);\n\n/**\n * Returns true only for completed, non-research steps that represent execution-grade work.\n * Example: `{ status: \"completed\", action: \"codeTransform\", filePath: \"/repo/a.ts\" }` -> true.\n */\nexport function isExecutionGroundedStep(step: StepLike | undefined): boolean {\n if (!step || step.status !== \"completed\") {\n return false;\n }\n\n const filePath = String(step.filePath ?? \"\").trim();\n if (!filePath || filePath.startsWith(\"__research__/\")) {\n return false;\n }\n\n const actionId = String(step.actionId ?? step.action ?? \"\").trim();\n if (!actionId) {\n return true;\n }\n if (actionId.startsWith(\"research-\") || READ_ONLY_STEP_NAMES.has(actionId)) {\n return false;\n }\n\n const spec = getActionSpec(actionId);\n if (!spec) {\n return actionId === \"work\";\n }\n\n return spec.phase === \"transform\" || spec.safety === \"repo-write\" || spec.safety === \"shell\";\n}\n"]}
|
|
@@ -1,13 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extracts explicit repo refs from a user query.
|
|
3
|
+
*
|
|
4
|
+
* Why this exists:
|
|
5
|
+
* - users often name files and folders without full paths or extensions
|
|
6
|
+
* - search needs one shared ref extractor so intent and mode selection stay aligned
|
|
7
|
+
* - this should stay conservative about member expressions like `task.id`
|
|
8
|
+
*
|
|
9
|
+
* Examples:
|
|
10
|
+
* - `check agents/guards` -> `["agents/guards"]`
|
|
11
|
+
* - `what do the three files in the guards folder do` -> `["guards"]`
|
|
12
|
+
* - `Explain EvalReportCmd` -> `["EvalReportCmd"]`
|
|
13
|
+
* - `task.id` -> `[]`
|
|
14
|
+
*/
|
|
15
|
+
import path from "path";
|
|
16
|
+
import { isExplicitRefCandidate, normalizeQueryToken, } from "../fileRules/queryTokenRules.js";
|
|
1
17
|
export function extractFileReferences(query, options) {
|
|
2
18
|
const text = String(query ?? "");
|
|
3
|
-
const fileRegex = /(?:[A-Za-z0-9_.\-]+\/)*[A-Za-z0-9_.\-]+\.[A-Za-z0-9_]{1,10}/g;
|
|
4
|
-
const matches = text.match(fileRegex) ?? [];
|
|
5
19
|
const out = new Set();
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
20
|
+
addMatches(out, extractPathLikeRefs(text), options);
|
|
21
|
+
addMatches(out, extractFolderCueRefs(text), options);
|
|
22
|
+
addMatches(out, extractVerbScopedRefs(text), options);
|
|
23
|
+
return filterShadowedRefs(Array.from(out));
|
|
24
|
+
}
|
|
25
|
+
function addMatches(out, refs, options) {
|
|
26
|
+
for (const ref of refs) {
|
|
27
|
+
const cleaned = normalizeQueryToken(ref);
|
|
28
|
+
if (!cleaned || !shouldKeepExplicitRef(cleaned))
|
|
9
29
|
continue;
|
|
10
30
|
out.add(options?.lowercase ? cleaned.toLowerCase() : cleaned);
|
|
11
31
|
}
|
|
12
|
-
return Array.from(out);
|
|
13
32
|
}
|
|
33
|
+
function extractFolderCueRefs(query) {
|
|
34
|
+
const matches = [];
|
|
35
|
+
const patterns = [
|
|
36
|
+
/\b(?:in|inside|under|from|check|inspect|open|show|list|trace|explain)\s+([A-Za-z0-9_.\-/]+)\s+(?:folder|directory)\b/gi,
|
|
37
|
+
/\bfiles?\s+in\s+([A-Za-z0-9_.\-/]+)\b/gi,
|
|
38
|
+
/\bthe\s+([A-Za-z0-9_.\-/]+)\s+(?:folder|directory)\b/gi,
|
|
39
|
+
];
|
|
40
|
+
for (const pattern of patterns) {
|
|
41
|
+
let match = null;
|
|
42
|
+
while ((match = pattern.exec(query)) !== null) {
|
|
43
|
+
matches.push(String(match[1] ?? ""));
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return matches;
|
|
47
|
+
}
|
|
48
|
+
function extractPathLikeRefs(query) {
|
|
49
|
+
const matches = [];
|
|
50
|
+
const patterns = [
|
|
51
|
+
/(?:^|\s)((?:\/|\.{1,2}\/|[A-Za-z]:[\\/])[A-Za-z0-9_.\-\/]+)/g,
|
|
52
|
+
/\b([A-Za-z0-9_.-]+\/[A-Za-z0-9_.\-\/]+)\b/g,
|
|
53
|
+
/\b([A-Za-z0-9_-]+\.[A-Za-z0-9_]{1,10})\b/g,
|
|
54
|
+
/\b([A-Z][A-Za-z0-9_-]{2,})\b/g,
|
|
55
|
+
];
|
|
56
|
+
for (const pattern of patterns) {
|
|
57
|
+
let match = null;
|
|
58
|
+
while ((match = pattern.exec(query)) !== null) {
|
|
59
|
+
matches.push(match[1] ?? match[0] ?? "");
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return matches;
|
|
63
|
+
}
|
|
64
|
+
function extractVerbScopedRefs(query) {
|
|
65
|
+
const matches = [];
|
|
66
|
+
// Accept short natural-language fillers before the real target token.
|
|
67
|
+
// Example: "check the readme" -> "readme", "show me the install file" -> "install".
|
|
68
|
+
const pattern = /\b(?:check|inspect|open|show|trace|explain|read|summarize|review)\s+(?:me\s+)?(?:the\s+|a\s+|an\s+)?([A-Za-z0-9_.\-/]+)(?:\s+(?:file|doc|docs))?(?:\b|$)/gi;
|
|
69
|
+
let match = null;
|
|
70
|
+
while ((match = pattern.exec(query)) !== null) {
|
|
71
|
+
const candidate = String(match[1] ?? "");
|
|
72
|
+
if (candidate && !isCommonVerbLeadToken(candidate)) {
|
|
73
|
+
matches.push(candidate);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return matches;
|
|
77
|
+
}
|
|
78
|
+
function filterShadowedRefs(refs) {
|
|
79
|
+
const slashRefs = refs.filter(ref => ref.includes("/"));
|
|
80
|
+
return refs.filter(ref => {
|
|
81
|
+
if (ref.includes("/")) {
|
|
82
|
+
return !slashRefs.some((otherRef) => otherRef !== ref && pathRefShadowsPathRef(otherRef, ref));
|
|
83
|
+
}
|
|
84
|
+
return !slashRefs.some((pathRef) => pathRefShadowsBareRef(pathRef, ref));
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Treats one bare token as shadowed when it already appears inside a slash path.
|
|
89
|
+
* Example: "/tmp/scai-agent-loop-ABC/file.ts" shadows "ABC".
|
|
90
|
+
*/
|
|
91
|
+
function pathRefShadowsBareRef(pathRef, ref) {
|
|
92
|
+
if (pathRef.endsWith(`/${ref}`) || pathRef.startsWith(`${ref}/`) || pathRef.includes(`/${ref}/`)) {
|
|
93
|
+
return true;
|
|
94
|
+
}
|
|
95
|
+
return pathRef.split("/").some((segment) => {
|
|
96
|
+
const stem = segment.replace(/\.[^.]+$/, "");
|
|
97
|
+
return stem === ref || stem.endsWith(`-${ref}`) || stem.startsWith(`${ref}-`);
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Treats one slash path as shadowed when a stronger absolute path already contains it.
|
|
102
|
+
* Example: "/Users/me/repo/src/file.ts" shadows "Users/me/repo/src/file.ts".
|
|
103
|
+
*/
|
|
104
|
+
function pathRefShadowsPathRef(pathRef, ref) {
|
|
105
|
+
if (!path.isAbsolute(pathRef) || path.isAbsolute(ref)) {
|
|
106
|
+
return false;
|
|
107
|
+
}
|
|
108
|
+
const normalizedPathRef = pathRef.replace(/\\/g, "/").replace(/\/+$/, "");
|
|
109
|
+
const normalizedRef = ref.replace(/\\/g, "/").replace(/\/+$/, "");
|
|
110
|
+
return normalizedPathRef === `/${normalizedRef}`;
|
|
111
|
+
}
|
|
112
|
+
function shouldKeepExplicitRef(ref) {
|
|
113
|
+
if (!ref.includes("/") && isCommonVerbLeadToken(ref))
|
|
114
|
+
return false;
|
|
115
|
+
return isExplicitRefCandidate(ref);
|
|
116
|
+
}
|
|
117
|
+
function isCommonVerbLeadToken(ref) {
|
|
118
|
+
return [
|
|
119
|
+
"trace",
|
|
120
|
+
"explain",
|
|
121
|
+
"show",
|
|
122
|
+
"where",
|
|
123
|
+
"when",
|
|
124
|
+
"why",
|
|
125
|
+
"which",
|
|
126
|
+
"who",
|
|
127
|
+
"how",
|
|
128
|
+
"is",
|
|
129
|
+
"are",
|
|
130
|
+
"do",
|
|
131
|
+
"does",
|
|
132
|
+
"can",
|
|
133
|
+
"should",
|
|
134
|
+
"could",
|
|
135
|
+
"would",
|
|
136
|
+
"check",
|
|
137
|
+
"inspect",
|
|
138
|
+
"open",
|
|
139
|
+
"read",
|
|
140
|
+
"summarize",
|
|
141
|
+
"review",
|
|
142
|
+
"please",
|
|
143
|
+
"tell",
|
|
144
|
+
"what",
|
|
145
|
+
].includes(ref.toLowerCase());
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=extractFileReferences.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extractFileReferences.js","sourceRoot":"","sources":["../../src/utils/extractFileReferences.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Extracts explicit repo refs from a user query.\n *\n * Why this exists:\n * - users often name files and folders without full paths or extensions\n * - search needs one shared ref extractor so intent and mode selection stay aligned\n * - this should stay conservative about member expressions like `task.id`\n *\n * Examples:\n * - `check agents/guards` -> `[\"agents/guards\"]`\n * - `what do the three files in the guards folder do` -> `[\"guards\"]`\n * - `Explain EvalReportCmd` -> `[\"EvalReportCmd\"]`\n * - `task.id` -> `[]`\n */\nimport path from \"path\";\nimport {\n isExplicitRefCandidate,\n normalizeQueryToken,\n} from \"../fileRules/queryTokenRules.js\";\n\nexport function extractFileReferences(\n query: string,\n options?: { lowercase?: boolean }\n): string[] {\n const text = String(query ?? \"\");\n const out = new Set<string>();\n\n addMatches(out, extractPathLikeRefs(text), options);\n addMatches(out, extractFolderCueRefs(text), options);\n addMatches(out, extractVerbScopedRefs(text), options);\n\n return filterShadowedRefs(Array.from(out));\n}\n\nfunction addMatches(out: Set<string>, refs: string[], options?: { lowercase?: boolean }): void {\n for (const ref of refs) {\n const cleaned = normalizeQueryToken(ref);\n if (!cleaned || !shouldKeepExplicitRef(cleaned)) continue;\n out.add(options?.lowercase ? cleaned.toLowerCase() : cleaned);\n }\n}\n\nfunction extractFolderCueRefs(query: string): string[] {\n const matches: string[] = [];\n const patterns = [\n /\\b(?:in|inside|under|from|check|inspect|open|show|list|trace|explain)\\s+([A-Za-z0-9_.\\-/]+)\\s+(?:folder|directory)\\b/gi,\n /\\bfiles?\\s+in\\s+([A-Za-z0-9_.\\-/]+)\\b/gi,\n /\\bthe\\s+([A-Za-z0-9_.\\-/]+)\\s+(?:folder|directory)\\b/gi,\n ];\n\n for (const pattern of patterns) {\n let match: RegExpExecArray | null = null;\n while ((match = pattern.exec(query)) !== null) {\n matches.push(String(match[1] ?? \"\"));\n }\n }\n\n return matches;\n}\n\nfunction extractPathLikeRefs(query: string): string[] {\n const matches: string[] = [];\n const patterns = [\n /(?:^|\\s)((?:\\/|\\.{1,2}\\/|[A-Za-z]:[\\\\/])[A-Za-z0-9_.\\-\\/]+)/g,\n /\\b([A-Za-z0-9_.-]+\\/[A-Za-z0-9_.\\-\\/]+)\\b/g,\n /\\b([A-Za-z0-9_-]+\\.[A-Za-z0-9_]{1,10})\\b/g,\n /\\b([A-Z][A-Za-z0-9_-]{2,})\\b/g,\n ];\n\n for (const pattern of patterns) {\n let match: RegExpExecArray | null = null;\n while ((match = pattern.exec(query)) !== null) {\n matches.push(match[1] ?? match[0] ?? \"\");\n }\n }\n\n return matches;\n}\n\nfunction extractVerbScopedRefs(query: string): string[] {\n const matches: string[] = [];\n // Accept short natural-language fillers before the real target token.\n // Example: \"check the readme\" -> \"readme\", \"show me the install file\" -> \"install\".\n const pattern = /\\b(?:check|inspect|open|show|trace|explain|read|summarize|review)\\s+(?:me\\s+)?(?:the\\s+|a\\s+|an\\s+)?([A-Za-z0-9_.\\-/]+)(?:\\s+(?:file|doc|docs))?(?:\\b|$)/gi;\n let match: RegExpExecArray | null = null;\n while ((match = pattern.exec(query)) !== null) {\n const candidate = String(match[1] ?? \"\");\n if (candidate && !isCommonVerbLeadToken(candidate)) {\n matches.push(candidate);\n }\n }\n return matches;\n}\n\nfunction filterShadowedRefs(refs: string[]): string[] {\n const slashRefs = refs.filter(ref => ref.includes(\"/\"));\n return refs.filter(ref => {\n if (ref.includes(\"/\")) {\n return !slashRefs.some((otherRef) => otherRef !== ref && pathRefShadowsPathRef(otherRef, ref));\n }\n return !slashRefs.some((pathRef) => pathRefShadowsBareRef(pathRef, ref));\n });\n}\n\n/**\n * Treats one bare token as shadowed when it already appears inside a slash path.\n * Example: \"/tmp/scai-agent-loop-ABC/file.ts\" shadows \"ABC\".\n */\nfunction pathRefShadowsBareRef(pathRef: string, ref: string): boolean {\n if (pathRef.endsWith(`/${ref}`) || pathRef.startsWith(`${ref}/`) || pathRef.includes(`/${ref}/`)) {\n return true;\n }\n\n return pathRef.split(\"/\").some((segment) => {\n const stem = segment.replace(/\\.[^.]+$/, \"\");\n return stem === ref || stem.endsWith(`-${ref}`) || stem.startsWith(`${ref}-`);\n });\n}\n\n/**\n * Treats one slash path as shadowed when a stronger absolute path already contains it.\n * Example: \"/Users/me/repo/src/file.ts\" shadows \"Users/me/repo/src/file.ts\".\n */\nfunction pathRefShadowsPathRef(pathRef: string, ref: string): boolean {\n if (!path.isAbsolute(pathRef) || path.isAbsolute(ref)) {\n return false;\n }\n\n const normalizedPathRef = pathRef.replace(/\\\\/g, \"/\").replace(/\\/+$/, \"\");\n const normalizedRef = ref.replace(/\\\\/g, \"/\").replace(/\\/+$/, \"\");\n return normalizedPathRef === `/${normalizedRef}`;\n}\n\nfunction shouldKeepExplicitRef(ref: string): boolean {\n if (!ref.includes(\"/\") && isCommonVerbLeadToken(ref)) return false;\n return isExplicitRefCandidate(ref);\n}\n\nfunction isCommonVerbLeadToken(ref: string): boolean {\n return [\n \"trace\",\n \"explain\",\n \"show\",\n \"where\",\n \"when\",\n \"why\",\n \"which\",\n \"who\",\n \"how\",\n \"is\",\n \"are\",\n \"do\",\n \"does\",\n \"can\",\n \"should\",\n \"could\",\n \"would\",\n \"check\",\n \"inspect\",\n \"open\",\n \"read\",\n \"summarize\",\n \"review\",\n \"please\",\n \"tell\",\n \"what\",\n ].includes(ref.toLowerCase());\n}\n"]}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Computes small cache fingerprints for simple-agent reads and semantic analysis.
|
|
3
|
+
*
|
|
4
|
+
* Why this file exists:
|
|
5
|
+
* - stop re-reading and re-analyzing the same file content in the same task flow
|
|
6
|
+
* - keep cache checks tied to both file bytes and the active query
|
|
7
|
+
* - let callers reuse prior evidence only when the cached result still matches
|
|
8
|
+
*/
|
|
9
|
+
import { createHash } from "crypto";
|
|
10
|
+
function computeFingerprint(value) {
|
|
11
|
+
const text = String(value ?? "");
|
|
12
|
+
if (!text.trim()) {
|
|
13
|
+
return undefined;
|
|
14
|
+
}
|
|
15
|
+
return createHash("sha1").update(text).digest("hex").slice(0, 12);
|
|
16
|
+
}
|
|
17
|
+
export function computeContentFingerprint(code) {
|
|
18
|
+
return computeFingerprint(code);
|
|
19
|
+
}
|
|
20
|
+
export function computeQueryFingerprint(query) {
|
|
21
|
+
return computeFingerprint(String(query ?? "").trim());
|
|
22
|
+
}
|
|
23
|
+
export function hasFreshReadResult(args) {
|
|
24
|
+
const { result, file, query, expectedFacts, mode } = args;
|
|
25
|
+
if (!result || !file?.code?.trim()) {
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
const cachedFacts = new Set(result.requestedFacts ?? result.facts.map((fact) => fact.key));
|
|
29
|
+
return result.mode === mode &&
|
|
30
|
+
result.contentFingerprint === computeContentFingerprint(file.code) &&
|
|
31
|
+
result.queryFingerprint === computeQueryFingerprint(query) &&
|
|
32
|
+
expectedFacts.every((fact) => cachedFacts.has(fact));
|
|
33
|
+
}
|
|
34
|
+
export function hasFreshSemanticAnalysis(args) {
|
|
35
|
+
const { analysis, file, query } = args;
|
|
36
|
+
if (!analysis?.semanticAnalyzed || !file?.code?.trim()) {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
return analysis.contentFingerprint === computeContentFingerprint(file.code) &&
|
|
40
|
+
analysis.queryFingerprint === computeQueryFingerprint(query);
|
|
41
|
+
}
|
|
42
|
+
export function hasFreshAgentReadEvidence(args) {
|
|
43
|
+
const { evidence, code, query } = args;
|
|
44
|
+
if (!evidence || !String(code ?? "").trim()) {
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
return evidence.contentFingerprint === computeContentFingerprint(code) &&
|
|
48
|
+
evidence.queryFingerprint === computeQueryFingerprint(query);
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=fileEvidenceCache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fileEvidenceCache.js","sourceRoot":"","sources":["../../src/utils/fileEvidenceCache.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAIpC,SAAS,kBAAkB,CAAC,KAAyB;IACjD,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IACjC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;QACf,OAAO,SAAS,CAAC;IACrB,CAAC;IACD,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACtE,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,IAAwB;IAC9D,OAAO,kBAAkB,CAAC,IAAI,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,KAAyB;IAC7D,OAAO,kBAAkB,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAMlC;IACG,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;IAC1D,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC;QACjC,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,cAAc,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3F,OAAO,MAAM,CAAC,IAAI,KAAK,IAAI;QACvB,MAAM,CAAC,kBAAkB,KAAK,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC;QAClE,MAAM,CAAC,gBAAgB,KAAK,uBAAuB,CAAC,KAAK,CAAC;QAC1D,aAAa,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,IAIxC;IACG,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;IACvC,IAAI,CAAC,QAAQ,EAAE,gBAAgB,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC;QACrD,OAAO,KAAK,CAAC;IACjB,CAAC;IAEH,OAAO,QAAQ,CAAC,kBAAkB,KAAK,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC;QACzE,QAAQ,CAAC,gBAAgB,KAAK,uBAAuB,CAAC,KAAK,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,IAIzC;IACC,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;IACvC,IAAI,CAAC,QAAQ,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QAC5C,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,QAAQ,CAAC,kBAAkB,KAAK,yBAAyB,CAAC,IAAI,CAAC;QACpE,QAAQ,CAAC,gBAAgB,KAAK,uBAAuB,CAAC,KAAK,CAAC,CAAC;AACjE,CAAC","sourcesContent":["/**\n * Computes small cache fingerprints for simple-agent reads and semantic analysis.\n *\n * Why this file exists:\n * - stop re-reading and re-analyzing the same file content in the same task flow\n * - keep cache checks tied to both file bytes and the active query\n * - let callers reuse prior evidence only when the cached result still matches\n */\nimport { createHash } from \"crypto\";\nimport type { FileAnalysis, ReadFileResult, StructuredFileCapsule } from \"../types.js\";\nimport type { AgentReadEvidence } from \"../agent/types.js\";\n\nfunction computeFingerprint(value: string | undefined): string | undefined {\n const text = String(value ?? \"\");\n if (!text.trim()) {\n return undefined;\n }\n return createHash(\"sha1\").update(text).digest(\"hex\").slice(0, 12);\n}\n\nexport function computeContentFingerprint(code: string | undefined): string | undefined {\n return computeFingerprint(code);\n}\n\nexport function computeQueryFingerprint(query: string | undefined): string | undefined {\n return computeFingerprint(String(query ?? \"\").trim());\n}\n\nexport function hasFreshReadResult(args: {\n result: ReadFileResult | undefined;\n file: StructuredFileCapsule | undefined;\n query: string;\n expectedFacts: string[];\n mode: string;\n}): boolean {\n const { result, file, query, expectedFacts, mode } = args;\n if (!result || !file?.code?.trim()) {\n return false;\n }\n\n const cachedFacts = new Set(result.requestedFacts ?? result.facts.map((fact) => fact.key));\n return result.mode === mode &&\n result.contentFingerprint === computeContentFingerprint(file.code) &&\n result.queryFingerprint === computeQueryFingerprint(query) &&\n expectedFacts.every((fact) => cachedFacts.has(fact));\n}\n\nexport function hasFreshSemanticAnalysis(args: {\n analysis: FileAnalysis | undefined;\n file: StructuredFileCapsule | undefined;\n query: string;\n}): boolean {\n const { analysis, file, query } = args;\n if (!analysis?.semanticAnalyzed || !file?.code?.trim()) {\n return false;\n }\n\n return analysis.contentFingerprint === computeContentFingerprint(file.code) &&\n analysis.queryFingerprint === computeQueryFingerprint(query);\n}\n\nexport function hasFreshAgentReadEvidence(args: {\n evidence: AgentReadEvidence | undefined;\n code: string | undefined;\n query: string;\n}): boolean {\n const { evidence, code, query } = args;\n if (!evidence || !String(code ?? \"\").trim()) {\n return false;\n }\n\n return evidence.contentFingerprint === computeContentFingerprint(code) &&\n evidence.queryFingerprint === computeQueryFingerprint(query);\n}\n"]}
|
package/dist/utils/fileTree.js
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fileTree.js","sourceRoot":"","sources":["../../src/utils/fileTree.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from 'fs';\r\nimport path from 'path';\r\nimport { getIndexDir } from '../constants.js';\r\nimport { IGNORED_FOLDER_GLOBS } from '../fileRules/ignoredPaths.js';\r\n\r\n/** Utility to check if a file/folder should be ignored */\r\n/** Utility to check if a file/folder should be ignored */\r\nfunction isIgnored(fullPath: string): boolean {\r\n const normalizedPath = fullPath.replace(/\\\\/g, '/');\r\n\r\n return IGNORED_FOLDER_GLOBS.some(pattern => {\r\n // remove leading/trailing **\r\n const cleanPattern = pattern.replace(/^\\*\\*\\/?/, '').replace(/\\/\\*\\*$/, '');\r\n return normalizedPath.includes(cleanPattern);\r\n });\r\n}\r\n\r\n\r\n/**\r\n * Generate a reduced file tree centered around the focus path, including nearby sibling folders.\r\n */\r\nexport function generateFocusedFileTree(\r\n focusPath: string,\r\n maxDepth: number = 2,\r\n siblingWindow: number = 2\r\n): string {\r\n const absoluteFocus = path.resolve(focusPath);\r\n const fileOrDir = fs.statSync(absoluteFocus);\r\n const targetDir = fileOrDir.isDirectory() ? absoluteFocus : path.dirname(absoluteFocus);\r\n\r\n const parentDir = path.dirname(targetDir);\r\n const indexDir = getIndexDir();\r\n\r\n const siblings = fs\r\n .readdirSync(parentDir, { withFileTypes: true })\r\n .filter(entry => entry.isDirectory() && !isIgnored(path.join(parentDir, entry.name)))\r\n .sort((a, b) => a.name.localeCompare(b.name));\r\n\r\n const focusIndex = siblings.findIndex(\r\n entry => path.resolve(path.join(parentDir, entry.name)) === path.resolve(targetDir)\r\n );\r\n\r\n const start = Math.max(0, focusIndex - siblingWindow);\r\n const end = Math.min(siblings.length, focusIndex + siblingWindow + 1);\r\n const nearbySiblings = siblings.slice(start, end);\r\n\r\n const relativeTitle = path.relative(indexDir, parentDir).replace(/\\\\/g, '/') || '.';\r\n let output = `📂 ${relativeTitle}\\n`;\r\n\r\n nearbySiblings.forEach(entry => {\r\n const siblingPath = path.join(parentDir, entry.name);\r\n const isFocusDir = path.resolve(siblingPath) === path.resolve(targetDir);\r\n const tree = generateFileTree(\r\n siblingPath,\r\n maxDepth - 1,\r\n isFocusDir ? absoluteFocus : undefined,\r\n '│ '\r\n );\r\n output += `${isFocusDir ? '➡️ ' : ''}${entry.name}/\\n${tree}`;\r\n });\r\n\r\n return output;\r\n}\r\n\r\nexport function generateFileTree(\r\n dir: string,\r\n depth: number,\r\n highlightPath?: string,\r\n prefix = ''\r\n): string {\r\n if (depth < 0) return '';\r\n\r\n let output = '';\r\n const entries = fs.readdirSync(dir, { withFileTypes: true })\r\n .filter(entry => !isIgnored(path.join(dir, entry.name)));\r\n\r\n const sorted = entries.sort((a, b) => Number(b.isDirectory()) - Number(a.isDirectory()));\r\n\r\n sorted.forEach((entry, index) => {\r\n const isLast = index === sorted.length - 1;\r\n const connector = isLast ? '└── ' : '├── ';\r\n const fullPath = path.join(dir, entry.name);\r\n const isHighlighted = highlightPath && path.resolve(fullPath) === path.resolve(highlightPath);\r\n\r\n if (entry.isDirectory()) {\r\n output += `${prefix}${connector}${entry.name}/\\n`;\r\n output += generateFileTree(fullPath, depth - 1, highlightPath, prefix + (isLast ? ' ' : '│ '));\r\n } else {\r\n const name = isHighlighted ? `➡️ ${entry.name}` : entry.name;\r\n output += `${prefix}${connector}${name}\\n`;\r\n }\r\n });\r\n\r\n return output;\r\n}\r\n"]}
|
|
@@ -2,17 +2,46 @@
|
|
|
2
2
|
import { getDbForRepo } from '../db/client.js';
|
|
3
3
|
import path from 'path';
|
|
4
4
|
import fs from 'fs';
|
|
5
|
-
|
|
5
|
+
import { normalizePath } from './contentUtils.js';
|
|
6
|
+
export function loadRelevantFolderCapsules(paths, options) {
|
|
6
7
|
const db = getDbForRepo();
|
|
7
8
|
const capsules = [];
|
|
9
|
+
const repoRootPath = options?.repoRootPath ? normalizePath(options.repoRootPath) : undefined;
|
|
10
|
+
const executionPath = options?.executionPath ? normalizePath(options.executionPath) : undefined;
|
|
11
|
+
const toCanonical = (inputPath) => {
|
|
12
|
+
const normalized = normalizePath(inputPath);
|
|
13
|
+
if (!repoRootPath || !executionPath || repoRootPath === executionPath)
|
|
14
|
+
return normalized;
|
|
15
|
+
const relative = path.relative(executionPath, normalized);
|
|
16
|
+
if (!relative || relative.startsWith(".."))
|
|
17
|
+
return normalized;
|
|
18
|
+
return normalizePath(path.join(repoRootPath, relative));
|
|
19
|
+
};
|
|
20
|
+
const toExecution = (inputPath) => {
|
|
21
|
+
const normalized = normalizePath(inputPath);
|
|
22
|
+
if (!repoRootPath || !executionPath || repoRootPath === executionPath)
|
|
23
|
+
return normalized;
|
|
24
|
+
const relative = path.relative(repoRootPath, normalized);
|
|
25
|
+
if (!relative || relative.startsWith(".."))
|
|
26
|
+
return normalized;
|
|
27
|
+
return normalizePath(path.join(executionPath, relative));
|
|
28
|
+
};
|
|
29
|
+
const canonicalPaths = paths.map(toCanonical);
|
|
8
30
|
// 1️⃣ Query DB first
|
|
9
|
-
const
|
|
10
|
-
|
|
11
|
-
|
|
31
|
+
const dbRows = canonicalPaths.length
|
|
32
|
+
? db.prepare(`SELECT capsule_json FROM folder_capsules WHERE path IN (${canonicalPaths.map(() => '?').join(',')})`).all(...canonicalPaths)
|
|
33
|
+
: [];
|
|
12
34
|
for (const row of dbRows) {
|
|
13
35
|
try {
|
|
14
36
|
const c = JSON.parse(row.capsule_json);
|
|
15
|
-
capsules.push(
|
|
37
|
+
capsules.push({
|
|
38
|
+
...c,
|
|
39
|
+
path: toExecution(c.path),
|
|
40
|
+
keyFiles: (c.keyFiles ?? []).map(keyFile => ({
|
|
41
|
+
...keyFile,
|
|
42
|
+
path: toExecution(keyFile.path),
|
|
43
|
+
})),
|
|
44
|
+
});
|
|
16
45
|
}
|
|
17
46
|
catch {
|
|
18
47
|
// skip malformed JSON
|
|
@@ -62,3 +91,4 @@ export function loadRelevantFolderCapsules(paths) {
|
|
|
62
91
|
}
|
|
63
92
|
return capsules;
|
|
64
93
|
}
|
|
94
|
+
//# sourceMappingURL=loadRelevantFolderCapsules.js.map
|