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 @@
|
|
|
1
|
+
{"version":3,"file":"SearchOrchestrator.js","sourceRoot":"","sources":["../../src/search/SearchOrchestrator.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Runs all repo search behind one discovery-only orchestrator.\n *\n * Why this file exists:\n * - search used to be split across explicit target resolution, semantic bootstrap, and planner fallback\n * - that mixed \"what did we find\" with downstream \"what should we act on\"\n * - this file keeps search output in one packet so focus and execution can derive their own state later\n *\n * Boundary:\n * - this file may resolve files, folders, symbols, snippets, and raw pattern hits\n * - this file must not set `selectedFiles`, `candidateFiles`, or execution policy state\n * - callers may keep temporary compatibility fields like `relatedFiles`, but only after search returns\n */\nimport fs from \"fs\";\nimport path from \"path\";\nimport { execFileSync } from \"child_process\";\nimport fg from \"fast-glob\";\n\nimport type {\n RegexSearchSpec,\n SearchContentMatch,\n SearchDirectoryEntry,\n SearchFailureClass,\n SearchMode,\n SearchOrchestratorResult,\n SearchRoute,\n SearchResult,\n SearchStageName,\n SearchSymbolResolution,\n StructuredContext,\n} from \"../types.js\";\nimport { getDbForRepo } from \"../db/client.js\";\nimport {\n plannerSearchFiles,\n resolveSymbolRows,\n resolveSymbolRowsByPattern,\n semanticSearchFiles,\n} from \"../db/fileIndex.js\";\nimport { IGNORED_EXTENSIONS } from \"../fileRules/ignoredExtensions.js\";\nimport { isPathIgnoredByFolderGlobs } from \"../fileRules/ignoredPaths.js\";\nimport {\n isExplicitRefCandidate,\n queryLooksLikeOperatorPattern,\n queryNeedsRegexMode,\n} from \"../fileRules/queryTokenRules.js\";\nimport { compileSearchQuery } from \"../utils/compileSearchQuery.js\";\nimport { extractFileReferences } from \"../utils/extractFileReferences.js\";\nimport {\n getContextExecutionPath,\n mapCanonicalPathToExecutionPath,\n} from \"../utils/repoIdentity.js\";\nimport { logInputOutput } from \"../utils/promptLogHelper.js\";\nimport {\n buildMethodSelectionRetrievalQuery,\n isMethodSelectionRetrievalQuery,\n scoreCandidateFiles,\n} from \"./sharedRankingPolicy.js\";\nimport { isVerifyFocusQueryText } from \"../utils/verifyFocusPreference.js\";\n\ntype SearchOrchestratorArgs = {\n context: StructuredContext;\n query: string;\n mode?: SearchMode | \"auto\";\n plannerQuery?: string;\n limit?: number;\n};\n\ntype RegexSearchArgs = {\n context: StructuredContext;\n spec: RegexSearchSpec;\n limit?: number;\n};\n\ntype DirectoryListingArgs = {\n context: StructuredContext;\n query: string;\n};\n\ntype SearchContentScanOptions = {\n repoRoot: string;\n query: string;\n fixed: boolean;\n};\n\ntype SearchPathCollectionOptions = {\n includeIgnoredExtensions?: boolean;\n allowIgnoredPaths?: boolean;\n};\n\ntype RawPathResolution = {\n kind: \"file\" | \"folder\" | \"unresolved\" | \"ambiguous\";\n ref: string;\n path?: string;\n paths?: string[];\n};\n\nconst DEFAULT_LIMIT = 8;\nexport class SearchOrchestrator {\n async run(args: SearchOrchestratorArgs): Promise<SearchOrchestratorResult> {\n return this.runDbSearch(args);\n }\n\n async runDbSearch(args: SearchOrchestratorArgs): Promise<SearchOrchestratorResult> {\n const query = String(args.query ?? \"\").trim();\n const mode = this.resolveMode(args);\n const result = createEmptySearchResult(mode, [], \"db\");\n\n if (!query) {\n return result;\n }\n\n if (mode === \"exact-target\") {\n const exact = await this.runExactTargetSearchWithSemanticFallback(\n args.context,\n query,\n args.plannerQuery,\n args.limit ?? DEFAULT_LIMIT\n );\n logInputOutput(\"SearchOrchestrator\", \"output\", exact);\n return exact;\n }\n\n if (mode === \"sentence-fragment\") {\n const fragment = await this.runSentenceFragmentSearch(args.context, query);\n logInputOutput(\"SearchOrchestrator\", \"output\", fragment);\n return fragment;\n }\n\n if (mode === \"operator-pattern\") {\n const pattern = await this.runOperatorPatternSearchWithSemanticFallback(\n args.context,\n query,\n args.plannerQuery,\n args.limit ?? DEFAULT_LIMIT\n );\n logInputOutput(\"SearchOrchestrator\", \"output\", pattern);\n return pattern;\n }\n\n const semantic = await this.runSemanticRetrieval(args.context, query, args.plannerQuery, args.limit ?? DEFAULT_LIMIT);\n logInputOutput(\"SearchOrchestrator\", \"output\", semantic);\n return semantic;\n }\n\n async runRegexSearch(args: RegexSearchArgs): Promise<SearchOrchestratorResult> {\n const result = createEmptySearchResult(\"regex-execution\", [\"regex-searcher\", \"result-merger-and-ranker\"], \"regex\");\n result.regexSpec = args.spec;\n\n const repoRoot = getContextExecutionPath(args.context);\n if (!repoRoot || !fs.existsSync(repoRoot)) {\n result.failure = {\n status: \"failed\",\n failureClass: \"scope-missing\",\n message: \"Repo root is missing for regex search.\",\n };\n return result;\n }\n\n const flags = normalizeRegexFlags(args.spec.flags);\n const regex = safeCreateRegex(args.spec.pattern, flags);\n if (!regex) {\n result.failure = {\n status: \"failed\",\n failureClass: \"invalid-regex\",\n message: \"Regex pattern could not be compiled.\",\n pattern: args.spec.pattern,\n flags,\n };\n return result;\n }\n\n const scopedFiles = this.resolveRegexScopeFiles(args.context, args.spec.scope, repoRoot);\n if (scopedFiles.length === 0) {\n result.failure = {\n status: \"failed\",\n failureClass: \"scope-missing\",\n message: \"Regex search scope did not resolve to any searchable files.\",\n pattern: args.spec.pattern,\n flags,\n };\n return result;\n }\n\n const pathMatches = args.spec.target === \"content\"\n ? []\n : collectRegexPathMatches(scopedFiles, regex, repoRoot);\n const contentMatches = args.spec.target === \"path\"\n ? []\n : collectRegexContentMatches(scopedFiles, regex);\n\n const fileCandidates = dedupeSearchResults([\n ...pathMatches.map(match => buildFsSearchResult(match.path)),\n ...contentMatches.map(match => buildFsSearchResult(match.path)),\n ]).slice(0, args.limit ?? DEFAULT_LIMIT);\n\n result.patternMatches = contentMatches;\n result.fileCandidates = fileCandidates;\n result.resolvedFolders = dedupeStrings(args.spec.scope?.folders ?? []);\n if (pathMatches.length === 0 && contentMatches.length === 0) {\n result.failure = {\n status: \"failed\",\n failureClass: \"no-match\",\n message: \"Regex search found no matches in scope.\",\n pattern: args.spec.pattern,\n flags,\n };\n }\n return result;\n }\n\n runDirectoryListing(args: DirectoryListingArgs): SearchOrchestratorResult {\n const result = createEmptySearchResult(\"directory-listing\", [\"directory-listing\"], \"list-directory\");\n const repoRoot = getContextExecutionPath(args.context);\n if (!repoRoot || !fs.existsSync(repoRoot)) {\n result.failure = {\n status: \"failed\",\n failureClass: \"scope-missing\",\n message: \"Repo root is missing for directory listing.\",\n };\n return result;\n }\n\n const folderPath = resolveDirectoryListingTarget(args.context, args.query, repoRoot);\n if (!folderPath) {\n result.failure = {\n status: \"failed\",\n failureClass: \"scope-missing\",\n message: \"Could not resolve a folder to list.\",\n };\n return result;\n }\n\n result.resolvedFolders = [folderPath];\n result.directoryEntries = collectDirectDirectoryEntries(folderPath);\n result.folderCandidates = [folderPath];\n return result;\n }\n\n /**\n * Keeps exact-target routing narrow, but avoids dead ends when nothing resolves at all.\n * Example: \"/resume\" stays an explicit ref first, then falls back to semantic retrieval only if exact-target found nothing.\n */\n private async runExactTargetSearchWithSemanticFallback(\n context: StructuredContext,\n query: string,\n plannerQuery: string | undefined,\n limit: number\n ): Promise<SearchOrchestratorResult> {\n const exact = this.runExactTargetSearch(context, query);\n if (!shouldFallbackFromExactTarget(exact)) {\n return exact;\n }\n\n const semantic = await this.runSemanticRetrieval(context, query, plannerQuery, limit);\n exact.stagesRun.push(\"fallback-semantic-retriever\");\n exact.fallbackUsed = true;\n exact.fileCandidates = semantic.fileCandidates;\n exact.folderCandidates = semantic.folderCandidates;\n exact.symbolCandidates = semantic.symbolCandidates;\n exact.fragmentMatches = semantic.fragmentMatches;\n exact.patternMatches = semantic.patternMatches;\n exact.directoryEntries = semantic.directoryEntries;\n exact.failure = semantic.failure;\n return exact;\n }\n\n /**\n * Keeps true operator queries narrow, but broadens once when the lane found nothing useful.\n * Example: a regex-like snippet can fall back to semantic retrieval only after zero matches.\n */\n private async runOperatorPatternSearchWithSemanticFallback(\n context: StructuredContext,\n query: string,\n plannerQuery: string | undefined,\n limit: number\n ): Promise<SearchOrchestratorResult> {\n const pattern = await this.runOperatorPatternSearch(context, query);\n if (!shouldFallbackFromOperatorPattern(pattern)) {\n return pattern;\n }\n\n const semantic = await this.runSemanticRetrieval(context, query, plannerQuery, limit);\n pattern.stagesRun.push(\"fallback-semantic-retriever\");\n pattern.fallbackUsed = true;\n pattern.fileCandidates = semantic.fileCandidates;\n pattern.folderCandidates = semantic.folderCandidates;\n pattern.symbolCandidates = semantic.symbolCandidates;\n pattern.fragmentMatches = semantic.fragmentMatches;\n pattern.directoryEntries = semantic.directoryEntries;\n pattern.failure = semantic.failure;\n return pattern;\n }\n\n private resolveMode(args: SearchOrchestratorArgs): SearchMode {\n if (args.mode && args.mode !== \"auto\") {\n return args.mode;\n }\n\n const query = String(args.query ?? \"\").trim();\n const intent = args.context.analysis?.intent;\n const quotedFragments = extractQuotedFragments(query);\n const explicitFileRefs = extractFileReferences(query);\n // Keep pure quoted-code lookups on fragment search even when intent extraction found symbol-like tokens.\n // Example: \"const currentQuestionId = ...\" should search for matching lines, not chase `currentQuestionId` as an explicit target.\n if (quotedFragments.length > 0 && explicitFileRefs.length === 0) {\n return \"sentence-fragment\";\n }\n if (\n (intent?.targetFiles?.length ?? 0) > 0 ||\n (intent?.targetSymbols?.length ?? 0) > 0 ||\n explicitFileRefs.length > 0\n ) {\n return \"exact-target\";\n }\n if (quotedFragments.length > 0) {\n return \"sentence-fragment\";\n }\n if (queryLooksLikeOperatorPattern(query)) {\n return \"operator-pattern\";\n }\n return \"semantic-retrieval\";\n }\n\n private runExactTargetSearch(context: StructuredContext, query: string): SearchOrchestratorResult {\n const stagesRun: SearchStageName[] = [\"explicit-target-resolver\", \"result-merger-and-ranker\"];\n const repoRoot = getContextExecutionPath(context);\n const result = createEmptySearchResult(\"exact-target\", stagesRun, \"db\");\n if (!repoRoot || !fs.existsSync(repoRoot)) {\n return result;\n }\n\n const allTargetRefs = dedupeStrings([\n ...(context.analysis?.intent?.targetFiles ?? []),\n ...extractFileReferences(query),\n ]);\n const rawTargetRefs = allTargetRefs.filter(shouldTreatAsExplicitRef);\n\n const symbolRefs = dedupeStrings(context.analysis?.intent?.targetSymbols ?? []);\n const fileRows: SearchResult[] = [];\n const resolvedFolders: string[] = [];\n const unresolvedRefs = new Set<string>(allTargetRefs.filter(ref => !shouldTreatAsExplicitRef(ref)));\n const ambiguousRefs = new Set<string>();\n\n for (const rawRef of rawTargetRefs) {\n const resolution = resolvePathReference(rawRef, repoRoot);\n if (resolution.kind === \"file\" && resolution.path) {\n fileRows.push(buildFsSearchResult(resolution.path));\n continue;\n }\n if (resolution.kind === \"folder\" && resolution.path) {\n resolvedFolders.push(resolution.path);\n for (const childFile of collectSearchablePaths(resolution.path, {\n includeIgnoredExtensions: true,\n allowIgnoredPaths: true,\n })) {\n fileRows.push(buildFsSearchResult(childFile));\n }\n continue;\n }\n if (resolution.kind === \"ambiguous\") {\n ambiguousRefs.add(rawRef);\n continue;\n }\n unresolvedRefs.add(rawRef);\n }\n\n const db = getDbForRepo();\n const resolvedSymbols: SearchSymbolResolution[] = [];\n const symbolCandidates: SearchSymbolResolution[] = [];\n for (const symbol of symbolRefs) {\n const rows = resolveSymbolRowsWithFallback(db, symbol)\n .map(row => this.remapSearchResult(row, context));\n if (rows.length === 1) {\n resolvedSymbols.push({ symbol, filePath: rows[0].path });\n fileRows.push(rows[0]);\n } else if (rows.length > 1) {\n ambiguousRefs.add(symbol);\n for (const row of rows) {\n symbolCandidates.push({ symbol, filePath: row.path });\n }\n } else {\n unresolvedRefs.add(symbol);\n }\n }\n\n result.resolvedFiles = dedupeSearchResults(fileRows);\n result.resolvedFolders = dedupeStrings(resolvedFolders);\n result.resolvedSymbols = dedupeSymbolResolutions(resolvedSymbols);\n result.unresolvedRefs = Array.from(unresolvedRefs);\n result.ambiguousRefs = Array.from(ambiguousRefs);\n result.fileCandidates = dedupeSearchResults([\n ...result.resolvedFiles,\n ...dedupeSearchResults(fileRows).filter(item =>\n !result.resolvedFiles.some(resolved => resolved.path === item.path)\n ),\n ]);\n result.folderCandidates = result.resolvedFolders;\n result.symbolCandidates = dedupeSymbolResolutions(symbolCandidates);\n return result;\n }\n\n private async runSemanticRetrieval(\n context: StructuredContext,\n query: string,\n plannerQuery: string | undefined,\n limit: number\n ): Promise<SearchOrchestratorResult> {\n const result = createEmptySearchResult(\"semantic-retrieval\", [\"semantic-retriever\"], \"db\");\n const seen = new Map<string, SearchResult>();\n const addResults = (rows: SearchResult[]) => {\n for (const row of rows.map(item => this.remapSearchResult(item, context))) {\n if (!seen.has(row.path)) {\n seen.set(row.path, row);\n }\n }\n };\n\n if (plannerQuery?.trim()) {\n addResults(await plannerSearchFiles(query, plannerQuery, limit));\n } else {\n addResults(await semanticSearchFiles(query, limit, context.analysis?.intent ?? {}));\n const orderedQuestionQueries = collectOrderedQuestionQueries(context, query);\n for (const orderedQuery of orderedQuestionQueries) {\n addResults(await plannerSearchFiles(query, orderedQuery, Math.min(limit, 6)));\n }\n const methodSelectionQuery = buildMethodSelectionRetrievalQuery(query);\n if (isMethodSelectionRetrievalQuery(query) && methodSelectionQuery) {\n addResults(await plannerSearchFiles(query, methodSelectionQuery, 12));\n const pathSupplement = collectMethodSelectionPathSupplement(context, query, new Set(seen.keys()));\n addResults(pathSupplement);\n }\n\n const pathSupplementQueries = [\n ...(isVerifyFocusQueryText(query) ? [query] : []),\n ...orderedQuestionQueries,\n ];\n const pathSupplement = collectScopedPathSupplements(context, pathSupplementQueries, new Set(seen.keys()));\n addResults(pathSupplement);\n }\n\n if (seen.size === 0) {\n const fallbackRows = await this.runFallbackContentScan(context, plannerQuery?.trim() || query, query);\n if (fallbackRows.length > 0) {\n result.stagesRun.push(\"fallback-content-scanner\");\n result.fallbackUsed = true;\n addResults(fallbackRows);\n }\n }\n\n result.stagesRun.push(\"result-merger-and-ranker\");\n result.fileCandidates = rankMergedSearchResults(Array.from(seen.values()), query).slice(0, limit);\n return result;\n }\n\n private async runSentenceFragmentSearch(\n context: StructuredContext,\n query: string\n ): Promise<SearchOrchestratorResult> {\n const result = createEmptySearchResult(\"sentence-fragment\", [\n \"sentence-fragment-resolver\",\n \"result-merger-and-ranker\",\n ], \"db\");\n const repoRoot = getContextExecutionPath(context);\n if (!repoRoot || !fs.existsSync(repoRoot)) {\n return result;\n }\n\n const fragments = extractQuotedFragments(query);\n const matches = new Map<string, SearchContentMatch>();\n const files: SearchResult[] = [];\n for (const fragment of fragments) {\n const fragmentMatches = await searchContentMatches({\n repoRoot,\n query: fragment,\n fixed: true,\n });\n for (const match of fragmentMatches) {\n const key = `${match.path}:${match.line}:${match.column}`;\n if (!matches.has(key)) {\n matches.set(key, match);\n }\n }\n }\n\n for (const match of matches.values()) {\n files.push(buildFsSearchResult(match.path));\n }\n\n result.fragmentMatches = Array.from(matches.values());\n result.fileCandidates = dedupeSearchResults(files);\n result.fallbackUsed = result.fragmentMatches.length > 0 && !isRipgrepAvailable();\n return result;\n }\n\n private async runOperatorPatternSearch(\n context: StructuredContext,\n query: string\n ): Promise<SearchOrchestratorResult> {\n const result = createEmptySearchResult(\"operator-pattern\", [\n \"operator-pattern-searcher\",\n \"result-merger-and-ranker\",\n ], \"db\");\n const repoRoot = getContextExecutionPath(context);\n if (!repoRoot || !fs.existsSync(repoRoot)) {\n return result;\n }\n\n const compiled = compileSearchQuery({\n query,\n intent: context.analysis?.intent,\n mode: queryNeedsRegexMode(query) ? \"regex\" : \"auto\",\n });\n const matches = await searchContentMatches({\n repoRoot,\n query: compiled.regex.enabled ? compiled.regex.terms[0] ?? query : query,\n fixed: !compiled.regex.enabled && !query.includes(\"|\"),\n });\n\n result.patternMatches = matches;\n result.fileCandidates = dedupeSearchResults(matches.map(match => buildFsSearchResult(match.path)));\n result.fallbackUsed = matches.length > 0 && !isRipgrepAvailable();\n return result;\n }\n\n private async runFallbackContentScan(\n context: StructuredContext,\n query: string,\n rankingQuery: string\n ): Promise<SearchResult[]> {\n const repoRoot = getContextExecutionPath(context);\n if (!repoRoot || !fs.existsSync(repoRoot)) return [];\n\n const compiled = compileSearchQuery({ query, mode: \"auto\", intent: context.analysis?.intent });\n const fallbackTerms = compiled.literal.terms.filter(term => term.length >= 2);\n if (fallbackTerms.length === 0) return [];\n\n const scored = scoreCandidateFiles(\n collectSearchablePaths(repoRoot).filter(filePath => {\n const content = safeReadFile(filePath);\n if (!content) return false;\n return fallbackTerms.some(term => content.toLowerCase().includes(term.toLowerCase()));\n }),\n {},\n rankingQuery\n ).slice(0, DEFAULT_LIMIT);\n\n return scored.map(item => buildFsSearchResult(item.filePath));\n }\n\n private remapSearchResult(result: SearchResult, context: StructuredContext): SearchResult {\n return {\n ...result,\n path: mapCanonicalPathToExecutionPath(result.path, context),\n };\n }\n\n private resolveRegexScopeFiles(\n context: StructuredContext,\n scope: RegexSearchSpec[\"scope\"] | undefined,\n repoRoot: string\n ): string[] {\n const scopedFiles = dedupeStrings([\n ...(scope?.files ?? []),\n ...(context.analysis?.focus?.resolvedTargetFiles ?? []),\n ]).filter(filePath => path.isAbsolute(filePath) && fs.existsSync(filePath));\n if (scopedFiles.length > 0) {\n return scopedFiles;\n }\n\n const scopedFolders = dedupeStrings([\n ...(scope?.folders ?? []),\n ...(context.analysis?.focus?.resolvedTargetFolders ?? []),\n ]).filter(folder => path.isAbsolute(folder) && fs.existsSync(folder));\n if (scopedFolders.length > 0) {\n return dedupeStrings(scopedFolders.flatMap(folder => collectSearchablePaths(folder)));\n }\n\n return collectSearchablePaths(repoRoot);\n }\n}\n\n/**\n * Resolves one target symbol with the same exact-then-pattern fallback the old path used.\n * Example: `run search now` -> exact miss -> pattern rows from `runSearchNow`.\n */\nfunction resolveSymbolRowsWithFallback(\n db: ReturnType<typeof getDbForRepo>,\n symbol: string\n): ReturnType<typeof resolveSymbolRows> {\n const exactRows = resolveSymbolRows(db, [symbol]);\n if (exactRows.length > 0) {\n return exactRows;\n }\n return resolveSymbolRowsByPattern(db, [symbol]);\n}\n\nfunction createEmptySearchResult(\n mode: SearchMode,\n stagesRun: SearchStageName[] = [],\n route: SearchRoute = \"db\"\n): SearchOrchestratorResult {\n return {\n route,\n mode,\n stagesRun,\n resolvedFiles: [],\n resolvedFolders: [],\n resolvedSymbols: [],\n unresolvedRefs: [],\n ambiguousRefs: [],\n fileCandidates: [],\n folderCandidates: [],\n symbolCandidates: [],\n fragmentMatches: [],\n patternMatches: [],\n directoryEntries: [],\n fallbackUsed: false,\n };\n}\n\nfunction shouldFallbackFromExactTarget(result: SearchOrchestratorResult): boolean {\n return result.resolvedFiles.length === 0 &&\n result.resolvedFolders.length === 0 &&\n result.resolvedSymbols.length === 0 &&\n result.fileCandidates.length === 0 &&\n result.folderCandidates.length === 0 &&\n result.symbolCandidates.length === 0 &&\n result.ambiguousRefs.length === 0;\n}\n\nfunction shouldFallbackFromOperatorPattern(result: SearchOrchestratorResult): boolean {\n return result.fileCandidates.length === 0 && result.patternMatches.length === 0;\n}\n\nfunction shouldTreatAsExplicitRef(rawRef: string): boolean {\n return isExplicitRefCandidate(String(rawRef ?? \"\").trim());\n}\n\nfunction resolvePathReference(rawRef: string, repoRoot: string): RawPathResolution {\n const ref = String(rawRef ?? \"\").trim().replace(/\\\\/g, \"/\");\n if (!ref) return { kind: \"unresolved\", ref: rawRef };\n\n const directCandidates = [\n ref,\n path.join(repoRoot, ref),\n ].map(candidate => path.isAbsolute(candidate) ? candidate : path.join(repoRoot, candidate));\n\n for (const candidate of directCandidates) {\n if (!fs.existsSync(candidate)) continue;\n const normalized = path.normalize(candidate);\n const stat = fs.statSync(normalized);\n if (stat.isFile()) return { kind: \"file\", ref: rawRef, path: normalized };\n if (stat.isDirectory()) return { kind: \"folder\", ref: rawRef, path: normalized };\n }\n\n if (ref.includes(\"/\")) {\n const fileMatches = fg.sync(`**/${ref}`, {\n cwd: repoRoot,\n absolute: true,\n onlyFiles: true,\n dot: false,\n ignore: [\"**/node_modules/**\", \"**/dist/**\", \"**/.git/**\", \"**/.scai-worktrees/**\"],\n }).map(path.normalize);\n if (fileMatches.length === 1) return { kind: \"file\", ref: rawRef, path: fileMatches[0] };\n if (fileMatches.length > 1) return { kind: \"ambiguous\", ref: rawRef, paths: fileMatches };\n\n const folderMatches = fg.sync(`**/${ref}`, {\n cwd: repoRoot,\n absolute: true,\n onlyDirectories: true,\n dot: false,\n ignore: [\"**/node_modules/**\", \"**/dist/**\", \"**/.git/**\", \"**/.scai-worktrees/**\"],\n }).map(path.normalize);\n if (folderMatches.length === 1) return { kind: \"folder\", ref: rawRef, path: folderMatches[0] };\n if (folderMatches.length > 1) return { kind: \"ambiguous\", ref: rawRef, paths: folderMatches };\n return { kind: \"unresolved\", ref: rawRef };\n }\n\n const fileMatches = fg.sync(`**/${ref}*`, {\n cwd: repoRoot,\n absolute: true,\n onlyFiles: true,\n dot: false,\n ignore: [\"**/node_modules/**\", \"**/dist/**\", \"**/.git/**\", \"**/.scai-worktrees/**\"],\n }).map(path.normalize).filter(candidate => {\n const filename = path.basename(candidate);\n return normalizeLookupToken(filename) === normalizeLookupToken(ref) ||\n normalizeLookupToken(path.parse(filename).name) === normalizeLookupToken(ref);\n });\n if (fileMatches.length === 1) return { kind: \"file\", ref: rawRef, path: fileMatches[0] };\n if (fileMatches.length > 1) return { kind: \"ambiguous\", ref: rawRef, paths: fileMatches };\n\n const folderMatches = fg.sync(`**/${ref}*`, {\n cwd: repoRoot,\n absolute: true,\n onlyDirectories: true,\n dot: false,\n ignore: [\"**/node_modules/**\", \"**/dist/**\", \"**/.git/**\", \"**/.scai-worktrees/**\"],\n }).map(path.normalize).filter(candidate => {\n return normalizeLookupToken(path.basename(candidate)) === normalizeLookupToken(ref);\n });\n if (folderMatches.length === 1) return { kind: \"folder\", ref: rawRef, path: folderMatches[0] };\n if (folderMatches.length > 1) return { kind: \"ambiguous\", ref: rawRef, paths: folderMatches };\n\n return { kind: \"unresolved\", ref: rawRef };\n}\n\nfunction normalizeLookupToken(value: string): string {\n return String(value ?? \"\").toLowerCase().replace(/[^a-z0-9]/g, \"\");\n}\n\nfunction buildFsSearchResult(filePath: string): SearchResult {\n return {\n id: -Math.abs(hashPath(filePath)),\n path: path.normalize(filePath),\n filename: path.basename(filePath),\n summary: null,\n type: path.extname(filePath).replace(/^\\./, \"\") || \"unknown\",\n lastModified: readLastModified(filePath),\n };\n}\n\nfunction hashPath(filePath: string): number {\n let hash = 0;\n for (const char of filePath) {\n hash = ((hash << 5) - hash) + char.charCodeAt(0);\n hash |= 0;\n }\n return hash === 0 ? 1 : hash;\n}\n\nfunction readLastModified(filePath: string): string {\n try {\n return fs.statSync(filePath).mtime.toISOString();\n } catch {\n return new Date(0).toISOString();\n }\n}\n\nfunction extractQuotedFragments(query: string): string[] {\n const out = new Set<string>();\n const patterns = [\n /\"([^\"\\n]{4,})\"/g,\n /'([^'\\n]{4,})'/g,\n /`([^`\\n]{4,})`/g,\n ];\n for (const pattern of patterns) {\n let match: RegExpExecArray | null = null;\n while ((match = pattern.exec(query)) !== null) {\n const fragment = String(match[1] ?? \"\").trim();\n if (fragment.length >= 4) {\n out.add(fragment);\n }\n }\n }\n return Array.from(out);\n}\n\n/**\n * Keeps regex flags predictable and small.\n * Example: \"igx\" -> \"gi\" because only supported JS flags are kept.\n */\nfunction normalizeRegexFlags(flags: string | undefined): string {\n const allowed = new Set([\"g\", \"i\", \"m\", \"s\", \"u\", \"y\"]);\n const normalized = String(flags ?? \"\")\n .split(\"\")\n .filter(flag => allowed.has(flag));\n return Array.from(new Set(normalized)).join(\"\");\n}\n\nasync function searchContentMatches(options: SearchContentScanOptions): Promise<SearchContentMatch[]> {\n const rgMatches = runRipgrepContentSearch(options);\n if (rgMatches.available) {\n return rgMatches.matches;\n }\n return runNodeContentSearch(options);\n}\n\nfunction runRipgrepContentSearch(options: SearchContentScanOptions): { available: boolean; matches: SearchContentMatch[] } {\n try {\n const args = [\n \"--line-number\",\n \"--column\",\n \"--with-filename\",\n \"--color\",\n \"never\",\n options.fixed ? \"--fixed-strings\" : \"--regexp\",\n options.query,\n \".\",\n ];\n const output = execFileSync(\"rg\", args, {\n cwd: options.repoRoot,\n encoding: \"utf8\",\n maxBuffer: 1024 * 1024 * 8,\n });\n\n const matches = String(output ?? \"\")\n .split(/\\r?\\n/)\n .map(line => line.trim())\n .filter(Boolean)\n .map(line => parseRipgrepLine(line, options.repoRoot))\n .filter((match): match is SearchContentMatch => Boolean(match))\n .filter(match => !isPathIgnoredByFolderGlobs(match.path));\n\n return { available: true, matches };\n } catch (err: any) {\n if (err?.code === \"ENOENT\") {\n return { available: false, matches: [] };\n }\n if (err?.status === 1) {\n return { available: true, matches: [] };\n }\n return { available: false, matches: [] };\n }\n}\n\nfunction parseRipgrepLine(line: string, repoRoot: string): SearchContentMatch | undefined {\n const match = line.match(/^(.*?):(\\d+):(\\d+):(.*)$/);\n if (!match) return undefined;\n const [, rawPath, rawLine, rawColumn, snippet] = match;\n return {\n path: path.normalize(path.join(repoRoot, rawPath)),\n line: Number(rawLine),\n column: Number(rawColumn),\n snippet: snippet.trim(),\n };\n}\n\nfunction runNodeContentSearch(options: SearchContentScanOptions): SearchContentMatch[] {\n const files = collectSearchablePaths(options.repoRoot);\n const matches: SearchContentMatch[] = [];\n const regex = options.fixed ? null : safeCreateRegex(options.query);\n\n for (const filePath of files) {\n const content = safeReadFile(filePath);\n if (!content) continue;\n const lines = content.split(/\\r?\\n/);\n lines.forEach((line, index) => {\n const column = options.fixed\n ? line.indexOf(options.query)\n : regex\n ? line.search(regex)\n : -1;\n if (column < 0) return;\n matches.push({\n path: filePath,\n line: index + 1,\n column: column + 1,\n snippet: line.trim(),\n });\n });\n }\n\n return matches;\n}\n\nfunction safeCreateRegex(pattern: string, flags = \"i\"): RegExp | null {\n try {\n return new RegExp(pattern, flags);\n } catch {\n return null;\n }\n}\n\nfunction safeReadFile(filePath: string): string {\n try {\n return fs.readFileSync(filePath, \"utf8\");\n } catch {\n return \"\";\n }\n}\n\nfunction collectSearchablePaths(rootDir: string, options: SearchPathCollectionOptions = {}): string[] {\n const files: string[] = [];\n const stack = [rootDir];\n\n while (stack.length > 0) {\n const currentDir = stack.pop();\n if (!currentDir) continue;\n\n let entries: fs.Dirent[] = [];\n try {\n entries = fs.readdirSync(currentDir, { withFileTypes: true });\n } catch {\n continue;\n }\n\n for (const entry of entries) {\n if (shouldIgnoreDirectoryEntry(entry.name)) continue;\n const fullPath = path.join(currentDir, entry.name);\n if (!options.allowIgnoredPaths && isPathIgnoredByFolderGlobs(fullPath)) continue;\n\n if (entry.isDirectory()) {\n stack.push(fullPath);\n continue;\n }\n\n const ext = path.extname(entry.name).toLowerCase();\n if (!options.includeIgnoredExtensions && IGNORED_EXTENSIONS.includes(ext)) continue;\n files.push(fullPath);\n }\n }\n\n return files;\n}\n\n/**\n * Returns direct child entries for lightweight folder listing answers.\n * Example: `/repo/artifacts` -> `[{\"name\":\"evals\",\"kind\":\"folder\"}, {\"name\":\"run.md\",\"kind\":\"file\"}]`.\n */\nfunction collectDirectDirectoryEntries(folderPath: string): SearchDirectoryEntry[] {\n let entries: fs.Dirent[] = [];\n try {\n entries = fs.readdirSync(folderPath, { withFileTypes: true });\n } catch {\n return [];\n }\n\n return entries\n .filter(entry => !shouldIgnoreDirectoryEntry(entry.name))\n .map(entry => ({\n path: path.join(folderPath, entry.name),\n name: entry.name,\n kind: entry.isDirectory() ? \"folder\" as const : \"file\" as const,\n }))\n .sort((left, right) => {\n if (left.kind !== right.kind) {\n return left.kind === \"folder\" ? -1 : 1;\n }\n return left.name.localeCompare(right.name);\n });\n}\n\nfunction shouldIgnoreDirectoryEntry(name: string): boolean {\n if (!name) return true;\n if (name.startsWith(\".\")) return true;\n return false;\n}\n\nfunction resolveDirectoryListingTarget(\n context: StructuredContext,\n query: string,\n repoRoot: string\n): string | undefined {\n const explicitFolders = dedupeStrings([\n ...(context.analysis?.focus?.resolvedTargetFolders ?? []),\n ...(context.analysis?.intent?.targetFiles ?? []),\n ...extractFileReferences(query),\n ]);\n\n for (const ref of explicitFolders) {\n const resolution = resolvePathReference(ref, repoRoot);\n if (resolution.kind === \"folder\" && resolution.path) {\n return resolution.path;\n }\n }\n\n return undefined;\n}\n\nfunction collectRegexPathMatches(\n files: string[],\n regex: RegExp,\n repoRoot: string\n): SearchContentMatch[] {\n const matches: SearchContentMatch[] = [];\n for (const filePath of files) {\n const relativePath = path.relative(repoRoot, filePath);\n const basename = path.basename(filePath);\n regex.lastIndex = 0;\n const matchedText = regex.test(relativePath) || regex.test(basename) ? relativePath : null;\n if (!matchedText) continue;\n matches.push({\n path: filePath,\n line: 1,\n column: 1,\n snippet: matchedText,\n });\n }\n return matches;\n}\n\nfunction collectRegexContentMatches(files: string[], regex: RegExp): SearchContentMatch[] {\n const matches: SearchContentMatch[] = [];\n for (const filePath of files) {\n const content = safeReadFile(filePath);\n if (!content) continue;\n const lines = content.split(/\\r?\\n/);\n for (let index = 0; index < lines.length; index += 1) {\n const line = lines[index];\n regex.lastIndex = 0;\n const match = regex.exec(line);\n if (!match) continue;\n matches.push({\n path: filePath,\n line: index + 1,\n column: (match.index ?? 0) + 1,\n snippet: line.trim(),\n });\n }\n }\n return matches;\n}\n\nfunction isRipgrepAvailable(): boolean {\n try {\n execFileSync(\"rg\", [\"--version\"], { encoding: \"utf8\" });\n return true;\n } catch {\n return false;\n }\n}\n\nfunction dedupeStrings(values: string[]): string[] {\n const out: string[] = [];\n const seen = new Set<string>();\n for (const value of values) {\n const normalized = String(value ?? \"\").trim();\n if (!normalized) continue;\n if (seen.has(normalized)) continue;\n seen.add(normalized);\n out.push(normalized);\n }\n return out;\n}\n\nfunction dedupeSearchResults(results: SearchResult[]): SearchResult[] {\n const seen = new Set<string>();\n const out: SearchResult[] = [];\n for (const result of results) {\n if (seen.has(result.path)) continue;\n seen.add(result.path);\n out.push(result);\n }\n return out;\n}\n\nfunction dedupeSymbolResolutions(entries: SearchSymbolResolution[]): SearchSymbolResolution[] {\n const seen = new Set<string>();\n const out: SearchSymbolResolution[] = [];\n for (const entry of entries) {\n const key = `${entry.symbol}::${entry.filePath}`;\n if (seen.has(key)) continue;\n seen.add(key);\n out.push(entry);\n }\n return out;\n}\n\nfunction collectOrderedQuestionQueries(context: StructuredContext, query: string): string[] {\n const orderedQuestions = context.analysis?.intent?.questions ?? [];\n if (orderedQuestions.length <= 1) {\n return [];\n }\n\n const seen = new Set<string>();\n const out: string[] = [];\n for (const item of orderedQuestions) {\n const text = String(item?.text ?? \"\").trim();\n if (!text || text === query || seen.has(text)) continue;\n seen.add(text);\n out.push(text);\n }\n return out;\n}\n\nfunction rankMergedSearchResults(results: SearchResult[], query: string): SearchResult[] {\n const relatedFileScores = Object.fromEntries(\n results.flatMap(result =>\n typeof result.bm25Score === \"number\" && Number.isFinite(result.bm25Score)\n ? [[result.path, result.bm25Score]]\n : []\n )\n );\n const ranked = scoreCandidateFiles(\n results.map(result => result.path),\n relatedFileScores,\n query\n );\n const resultByPath = new Map(results.map(result => [result.path, result]));\n return ranked\n .map(item => resultByPath.get(item.filePath))\n .filter((result): result is SearchResult => Boolean(result));\n}\n\nfunction collectMethodSelectionPathSupplement(\n context: StructuredContext,\n retrievalQuery: string,\n existingPaths: Set<string>\n): SearchResult[] {\n const repoRoot = getContextExecutionPath(context);\n if (!repoRoot || !fs.existsSync(repoRoot)) return [];\n\n const candidates = collectSearchablePaths(repoRoot)\n .filter(filePath => !existingPaths.has(filePath));\n const scored = scoreCandidateFiles(candidates, {}, retrievalQuery)\n .filter(item => item.score >= 8)\n .slice(0, 8);\n\n return scored.map(item => buildFsSearchResult(item.filePath));\n}\n\n/**\n * Adds a small path-scored supplement for broad queries whose first semantic hits skew toward docs.\n * Example: ordered questions can add both routing and verify implementation files before file-check runs.\n */\nfunction collectScopedPathSupplements(\n context: StructuredContext,\n retrievalQueries: string[],\n existingPaths: Set<string>\n): SearchResult[] {\n const repoRoot = getContextExecutionPath(context);\n if (!repoRoot || !fs.existsSync(repoRoot)) return [];\n\n const candidates = collectSearchablePaths(repoRoot)\n .filter(filePath => !existingPaths.has(filePath));\n const out: SearchResult[] = [];\n const added = new Set<string>();\n\n for (const retrievalQuery of dedupeStrings(retrievalQueries)) {\n if (!retrievalQuery.trim()) continue;\n\n const scored = scoreCandidateFiles(candidates, {}, retrievalQuery)\n .filter(item => item.score >= 12)\n .slice(0, 3);\n\n for (const item of scored) {\n if (added.has(item.filePath)) continue;\n added.add(item.filePath);\n out.push(buildFsSearchResult(item.filePath));\n }\n }\n\n return out;\n}\n"]}
|
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Owns the one canonical candidate scorer shared by both search runtimes.
|
|
3
|
+
*
|
|
4
|
+
* Why this file exists:
|
|
5
|
+
* - common ranking should have one owner
|
|
6
|
+
* - agent and orchestrator search should not drift on the same query
|
|
7
|
+
* - lane routing, query understanding, and fallback belong elsewhere
|
|
8
|
+
* - ranking here should stay deterministic and only order an existing frontier
|
|
9
|
+
*/
|
|
10
|
+
import path from "path";
|
|
11
|
+
import { PREFILTER_STOP_WORDS, SENTENCE_STARTER_WORDS, STOP_WORDS } from "../fileRules/stopWords.js";
|
|
12
|
+
import { extractFileReferences } from "../utils/extractFileReferences.js";
|
|
13
|
+
import { countDomainAnchorHits, extractDomainAnchors } from "../utils/queryAnchors.js";
|
|
14
|
+
import { getVerifyFocusFilePreference } from "../utils/verifyFocusPreference.js";
|
|
15
|
+
const METHOD_SELECTION_TERMS = ["method", "function", "decides", "controls", "sets", "chooses"];
|
|
16
|
+
const DECISION_TERMS = ["budget", "limit", "threshold", "policy", "control", "wave", "retry"];
|
|
17
|
+
const BROAD_WORKFLOW_TERMS = ["validate", "analysis", "change", "changes", "plan", "planning", "workflow"];
|
|
18
|
+
const CONTROLLER_ROLE_TOKENS = ["controller", "manager", "resolver", "policy", "budget", "limit", "threshold", "verify"];
|
|
19
|
+
const SELECTION_POLICY_TOKENS = ["selected", "candidate", "selection", "focus", "relevant", "source", "sources"];
|
|
20
|
+
const METHOD_SELECTION_SCOPE_TOKENS = ["repo", "wide", "repository", "codebase", "project"];
|
|
21
|
+
const GENERIC_MATCH_TERMS = new Set(["agent", "code", "config", "count", "file", "loop", "max", "runtime", "turn"]);
|
|
22
|
+
function normalizeLookupToken(value) {
|
|
23
|
+
return String(value ?? "").toLowerCase().replace(/[^a-z0-9]/g, "");
|
|
24
|
+
}
|
|
25
|
+
function extractSymbolAnchors(query) {
|
|
26
|
+
const matches = query.match(/[A-Za-z_][A-Za-z0-9_]{2,}/g) ?? [];
|
|
27
|
+
const out = new Set();
|
|
28
|
+
for (const token of matches) {
|
|
29
|
+
const lowered = token.toLowerCase();
|
|
30
|
+
if (STOP_WORDS.has(lowered) || SENTENCE_STARTER_WORDS.has(lowered))
|
|
31
|
+
continue;
|
|
32
|
+
const looksLikeSymbol = /[a-z][A-Z]/.test(token) ||
|
|
33
|
+
/[A-Z]{2,}[a-z]/.test(token) ||
|
|
34
|
+
token.includes("_") ||
|
|
35
|
+
/[0-9]/.test(token) ||
|
|
36
|
+
token.endsWith("Step") ||
|
|
37
|
+
token.endsWith("Module") ||
|
|
38
|
+
token.endsWith("Cmd");
|
|
39
|
+
if (!looksLikeSymbol)
|
|
40
|
+
continue;
|
|
41
|
+
if (PREFILTER_STOP_WORDS.has(lowered))
|
|
42
|
+
continue;
|
|
43
|
+
out.add(lowered);
|
|
44
|
+
}
|
|
45
|
+
return Array.from(out);
|
|
46
|
+
}
|
|
47
|
+
function extractMethodSelectionSignals(query) {
|
|
48
|
+
const lowered = query.toLowerCase();
|
|
49
|
+
const rawTokens = lowered.match(/[a-zA-Z_][a-zA-Z0-9_]*/g) ?? [];
|
|
50
|
+
const informativeTokens = new Set(rawTokens.filter(token => token.length >= 3 &&
|
|
51
|
+
!STOP_WORDS.has(token) &&
|
|
52
|
+
!SENTENCE_STARTER_WORDS.has(token) &&
|
|
53
|
+
!PREFILTER_STOP_WORDS.has(token) &&
|
|
54
|
+
!METHOD_SELECTION_TERMS.includes(token) &&
|
|
55
|
+
!METHOD_SELECTION_SCOPE_TOKENS.includes(token) &&
|
|
56
|
+
!BROAD_WORKFLOW_TERMS.includes(token)));
|
|
57
|
+
return {
|
|
58
|
+
applicable: isMethodSelectionRetrievalQuery(query),
|
|
59
|
+
informativeTokens,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
function splitPathIdentifierParts(filePath) {
|
|
63
|
+
const normalized = filePath
|
|
64
|
+
.replace(/([a-z0-9])([A-Z])/g, "$1 $2")
|
|
65
|
+
.replace(/[_./-]+/g, " ")
|
|
66
|
+
.toLowerCase();
|
|
67
|
+
return Array.from(new Set(normalized.split(/\s+/).filter(token => token.length >= 3)));
|
|
68
|
+
}
|
|
69
|
+
function extractInformativeTerms(query, hintTerms) {
|
|
70
|
+
const rawTokens = [
|
|
71
|
+
...(query.toLowerCase().match(/[a-z0-9_]{3,}/g) ?? []),
|
|
72
|
+
...hintTerms.map((term) => normalizeLookupToken(term)),
|
|
73
|
+
];
|
|
74
|
+
return Array.from(new Set(rawTokens.filter((token) => token.length >= 3 &&
|
|
75
|
+
!STOP_WORDS.has(token) &&
|
|
76
|
+
!SENTENCE_STARTER_WORDS.has(token) &&
|
|
77
|
+
!PREFILTER_STOP_WORDS.has(token))));
|
|
78
|
+
}
|
|
79
|
+
function collectMatchConfirmations(matches, queryConcepts) {
|
|
80
|
+
const confirmations = new Set();
|
|
81
|
+
for (const match of matches) {
|
|
82
|
+
for (const reason of match.reasons ?? []) {
|
|
83
|
+
const matchTerm = reason.match(/^(?:term|pattern):(.+)$/i)?.[1];
|
|
84
|
+
if (!matchTerm)
|
|
85
|
+
continue;
|
|
86
|
+
const normalized = normalizeLookupToken(matchTerm);
|
|
87
|
+
if (!normalized || GENERIC_MATCH_TERMS.has(normalized)) {
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
if (queryConcepts.has(normalized) || normalized.length >= 4) {
|
|
91
|
+
confirmations.add(normalized);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return Array.from(confirmations);
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Scores snippet context using generic ownership clues.
|
|
99
|
+
* Example: `it("fragment", ...)` should outrank `query: "\"fragment\""`.
|
|
100
|
+
*/
|
|
101
|
+
function computeSnippetContextScore(matches) {
|
|
102
|
+
let score = 0;
|
|
103
|
+
const reasons = new Set();
|
|
104
|
+
for (const match of matches) {
|
|
105
|
+
const snippet = String(match.snippet ?? "").trim();
|
|
106
|
+
if (!snippet) {
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
if (/\b(?:it|test|describe)\s*\(/.test(snippet)) {
|
|
110
|
+
score += 8;
|
|
111
|
+
reasons.add("snippet-owner:test");
|
|
112
|
+
}
|
|
113
|
+
if (/\b(?:query|userQuery|prompt|input|expected|fixture)\s*:/.test(snippet)) {
|
|
114
|
+
score -= 7;
|
|
115
|
+
reasons.add("snippet-meta:fixture");
|
|
116
|
+
}
|
|
117
|
+
if (/^const\s+[A-Za-z0-9_]+\s*=/.test(snippet)) {
|
|
118
|
+
score -= 5;
|
|
119
|
+
reasons.add("snippet-meta:const");
|
|
120
|
+
}
|
|
121
|
+
if (/^\{?\s*(?:path|filePath|targetFile)\s*:/.test(snippet)) {
|
|
122
|
+
score -= 4;
|
|
123
|
+
reasons.add("snippet-meta:path-field");
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return { score, reasons: Array.from(reasons) };
|
|
127
|
+
}
|
|
128
|
+
export function isMethodSelectionRetrievalQuery(query) {
|
|
129
|
+
const lowered = query.toLowerCase();
|
|
130
|
+
return (METHOD_SELECTION_TERMS.some(term => lowered.includes(term)) &&
|
|
131
|
+
(DECISION_TERMS.some(term => lowered.includes(term)) ||
|
|
132
|
+
SELECTION_POLICY_TOKENS.some(term => lowered.includes(term)) ||
|
|
133
|
+
lowered.includes("triage") ||
|
|
134
|
+
lowered.includes("read")));
|
|
135
|
+
}
|
|
136
|
+
export function buildMethodSelectionRetrievalQuery(query) {
|
|
137
|
+
const signals = extractMethodSelectionSignals(query);
|
|
138
|
+
if (!signals.applicable)
|
|
139
|
+
return null;
|
|
140
|
+
const ordered = [...signals.informativeTokens]
|
|
141
|
+
.filter(token => token.length >= 3 && !METHOD_SELECTION_SCOPE_TOKENS.includes(token));
|
|
142
|
+
const selected = ordered.slice(0, 6);
|
|
143
|
+
return selected.length > 0 ? selected.join(" ") : null;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Scores candidate files using the one shared ranking policy.
|
|
147
|
+
* Example: `Explain EvalReportCmd` should strongly prefer `EvalReportCmd.ts`.
|
|
148
|
+
*/
|
|
149
|
+
export function scoreCandidateFiles(filePaths, relatedFileScores, retrievalQuery, options = {}) {
|
|
150
|
+
const explicitRefs = extractFileReferences(retrievalQuery, { lowercase: true });
|
|
151
|
+
const explicitBasenames = new Set(explicitRefs.map(ref => path.basename(ref)));
|
|
152
|
+
const symbolAnchors = extractSymbolAnchors(retrievalQuery);
|
|
153
|
+
const hintAnchors = (options.hintTerms ?? []).map((term) => normalizeLookupToken(term));
|
|
154
|
+
const allSymbolAnchors = Array.from(new Set([...symbolAnchors, ...hintAnchors]));
|
|
155
|
+
const domainAnchors = extractDomainAnchors(retrievalQuery);
|
|
156
|
+
const methodSignals = extractMethodSelectionSignals(retrievalQuery);
|
|
157
|
+
const queryConcepts = new Set(extractInformativeTerms(retrievalQuery, options.hintTerms ?? []));
|
|
158
|
+
const scored = filePaths.map((filePath) => {
|
|
159
|
+
const fileLower = filePath.toLowerCase();
|
|
160
|
+
const basename = path.basename(filePath).toLowerCase();
|
|
161
|
+
const stem = path.parse(basename).name;
|
|
162
|
+
const normalizedStem = normalizeLookupToken(stem);
|
|
163
|
+
const pathTokens = splitPathIdentifierParts(filePath);
|
|
164
|
+
const fileMatches = options.matchesByFile?.[filePath] ?? [];
|
|
165
|
+
const confirmedMatchTerms = collectMatchConfirmations(fileMatches, queryConcepts);
|
|
166
|
+
const snippetContext = computeSnippetContextScore(fileMatches);
|
|
167
|
+
let score = 0;
|
|
168
|
+
const reasons = [];
|
|
169
|
+
for (const ref of explicitRefs) {
|
|
170
|
+
const refBasename = path.basename(ref).toLowerCase();
|
|
171
|
+
const normalizedRef = normalizeLookupToken(refBasename);
|
|
172
|
+
if (basename === refBasename || normalizedStem === normalizedRef) {
|
|
173
|
+
score += 100;
|
|
174
|
+
reasons.push(`exact-basename:${normalizedRef}`);
|
|
175
|
+
break;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
if (explicitBasenames.has(basename)) {
|
|
179
|
+
score += 24;
|
|
180
|
+
reasons.push(`basename-anchor:${basename}`);
|
|
181
|
+
}
|
|
182
|
+
if (explicitRefs.some(ref => fileLower.includes(ref))) {
|
|
183
|
+
score += 60;
|
|
184
|
+
reasons.push("path-anchor");
|
|
185
|
+
}
|
|
186
|
+
for (const anchor of allSymbolAnchors) {
|
|
187
|
+
if (normalizedStem === anchor) {
|
|
188
|
+
score += 48;
|
|
189
|
+
reasons.push(`symbol:${anchor}:basename`);
|
|
190
|
+
}
|
|
191
|
+
else if (basename.includes(anchor)) {
|
|
192
|
+
score += 40;
|
|
193
|
+
reasons.push(`symbol:${anchor}:filename`);
|
|
194
|
+
}
|
|
195
|
+
else if (fileLower.includes(anchor)) {
|
|
196
|
+
score += 20;
|
|
197
|
+
reasons.push(`symbol:${anchor}:path`);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
const domainHitCount = countDomainAnchorHits(`${basename} ${fileLower}`, domainAnchors);
|
|
201
|
+
if (domainHitCount > 0) {
|
|
202
|
+
const boost = domainHitCount >= 2 ? 35 : 14;
|
|
203
|
+
score += boost;
|
|
204
|
+
reasons.push(`domain-anchors:${domainHitCount}`);
|
|
205
|
+
}
|
|
206
|
+
const bm25Raw = relatedFileScores[filePath];
|
|
207
|
+
if (typeof bm25Raw === "number" && Number.isFinite(bm25Raw)) {
|
|
208
|
+
const prior = Math.max(0, Math.min(20, -bm25Raw));
|
|
209
|
+
score += prior;
|
|
210
|
+
reasons.push(`bm25-prior:${prior.toFixed(2)}`);
|
|
211
|
+
}
|
|
212
|
+
const verifyFocus = getVerifyFocusFilePreference({
|
|
213
|
+
query: retrievalQuery,
|
|
214
|
+
filePath,
|
|
215
|
+
explicitRefs,
|
|
216
|
+
});
|
|
217
|
+
if (verifyFocus.applies && verifyFocus.score !== 0) {
|
|
218
|
+
score += verifyFocus.score * 45;
|
|
219
|
+
reasons.push(...verifyFocus.reasons.map(reason => `verify-focus:${reason}`));
|
|
220
|
+
}
|
|
221
|
+
if (methodSignals.applicable) {
|
|
222
|
+
const overlap = pathTokens.filter(token => methodSignals.informativeTokens.has(token));
|
|
223
|
+
if (overlap.length > 0) {
|
|
224
|
+
const boost = overlap.length >= 2 ? 28 : 14;
|
|
225
|
+
score += boost;
|
|
226
|
+
reasons.push(`method-overlap:${overlap.join(",")}`);
|
|
227
|
+
}
|
|
228
|
+
const roleHits = pathTokens.filter(token => CONTROLLER_ROLE_TOKENS.includes(token));
|
|
229
|
+
const controllerRoleHits = roleHits.filter(token => token !== "verify");
|
|
230
|
+
if (controllerRoleHits.length > 0) {
|
|
231
|
+
score += overlap.length > 0 ? 10 : 6;
|
|
232
|
+
reasons.push(`method-owner:${controllerRoleHits[0]}`);
|
|
233
|
+
}
|
|
234
|
+
if (pathTokens.includes("readiness")) {
|
|
235
|
+
score += 18;
|
|
236
|
+
reasons.push("method-owner:readiness");
|
|
237
|
+
}
|
|
238
|
+
const decisionHits = pathTokens.filter(token => DECISION_TERMS.includes(token));
|
|
239
|
+
if (decisionHits.length > 0 && overlap.length > 0) {
|
|
240
|
+
score += 8;
|
|
241
|
+
reasons.push(`decision-term:${decisionHits[0]}`);
|
|
242
|
+
}
|
|
243
|
+
const workflowOnlyHits = pathTokens.filter(token => BROAD_WORKFLOW_TERMS.includes(token));
|
|
244
|
+
if (workflowOnlyHits.length > 0 && overlap.length === 0) {
|
|
245
|
+
score -= 12;
|
|
246
|
+
reasons.push(`workflow-penalty:${workflowOnlyHits[0]}`);
|
|
247
|
+
}
|
|
248
|
+
const selectionPolicyHits = pathTokens.filter(token => SELECTION_POLICY_TOKENS.includes(token));
|
|
249
|
+
if (selectionPolicyHits.length > 0 &&
|
|
250
|
+
overlap.length > 0 &&
|
|
251
|
+
decisionHits.length === 0 &&
|
|
252
|
+
controllerRoleHits.length === 0) {
|
|
253
|
+
score -= 10;
|
|
254
|
+
reasons.push(`selection-policy-penalty:${selectionPolicyHits[0]}`);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
if (confirmedMatchTerms.length >= 2) {
|
|
258
|
+
score += 18;
|
|
259
|
+
reasons.push(`match-confirmation:${confirmedMatchTerms.slice(0, 3).join(",")}`);
|
|
260
|
+
}
|
|
261
|
+
else if (confirmedMatchTerms.length === 1) {
|
|
262
|
+
score += 8;
|
|
263
|
+
reasons.push(`match-confirmation:${confirmedMatchTerms[0]}`);
|
|
264
|
+
}
|
|
265
|
+
if (snippetContext.score !== 0) {
|
|
266
|
+
score += snippetContext.score;
|
|
267
|
+
reasons.push(...snippetContext.reasons);
|
|
268
|
+
}
|
|
269
|
+
if (reasons.length === 0) {
|
|
270
|
+
reasons.push("path-match");
|
|
271
|
+
}
|
|
272
|
+
return { filePath, score, bm25Raw, reasons };
|
|
273
|
+
});
|
|
274
|
+
return scored.sort((left, right) => {
|
|
275
|
+
if (right.score !== left.score) {
|
|
276
|
+
return right.score - left.score;
|
|
277
|
+
}
|
|
278
|
+
const leftBm25 = typeof left.bm25Raw === "number" ? left.bm25Raw : Number.POSITIVE_INFINITY;
|
|
279
|
+
const rightBm25 = typeof right.bm25Raw === "number" ? right.bm25Raw : Number.POSITIVE_INFINITY;
|
|
280
|
+
return leftBm25 - rightBm25;
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
//# sourceMappingURL=sharedRankingPolicy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sharedRankingPolicy.js","sourceRoot":"","sources":["../../src/search/sharedRankingPolicy.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Owns the one canonical candidate scorer shared by both search runtimes.\n *\n * Why this file exists:\n * - common ranking should have one owner\n * - agent and orchestrator search should not drift on the same query\n * - lane routing, query understanding, and fallback belong elsewhere\n * - ranking here should stay deterministic and only order an existing frontier\n */\nimport path from \"path\";\nimport { PREFILTER_STOP_WORDS, SENTENCE_STARTER_WORDS, STOP_WORDS } from \"../fileRules/stopWords.js\";\nimport { extractFileReferences } from \"../utils/extractFileReferences.js\";\nimport { countDomainAnchorHits, extractDomainAnchors } from \"../utils/queryAnchors.js\";\nimport { getVerifyFocusFilePreference } from \"../utils/verifyFocusPreference.js\";\n\nconst METHOD_SELECTION_TERMS = [\"method\", \"function\", \"decides\", \"controls\", \"sets\", \"chooses\"];\nconst DECISION_TERMS = [\"budget\", \"limit\", \"threshold\", \"policy\", \"control\", \"wave\", \"retry\"];\nconst BROAD_WORKFLOW_TERMS = [\"validate\", \"analysis\", \"change\", \"changes\", \"plan\", \"planning\", \"workflow\"];\nconst CONTROLLER_ROLE_TOKENS = [\"controller\", \"manager\", \"resolver\", \"policy\", \"budget\", \"limit\", \"threshold\", \"verify\"];\nconst SELECTION_POLICY_TOKENS = [\"selected\", \"candidate\", \"selection\", \"focus\", \"relevant\", \"source\", \"sources\"];\nconst METHOD_SELECTION_SCOPE_TOKENS = [\"repo\", \"wide\", \"repository\", \"codebase\", \"project\"];\nconst GENERIC_MATCH_TERMS = new Set([\"agent\", \"code\", \"config\", \"count\", \"file\", \"loop\", \"max\", \"runtime\", \"turn\"]);\n\nexport interface SharedScoredSearchHit {\n filePath: string;\n score: number;\n bm25Raw?: number;\n reasons: string[];\n}\n\nexport interface SharedCandidateMatch {\n snippet: string;\n reasons?: string[];\n}\n\nexport interface SharedCandidateScoringOptions {\n matchesByFile?: Record<string, SharedCandidateMatch[]>;\n hintTerms?: string[];\n}\n\nfunction normalizeLookupToken(value: string): string {\n return String(value ?? \"\").toLowerCase().replace(/[^a-z0-9]/g, \"\");\n}\n\nfunction extractSymbolAnchors(query: string): string[] {\n const matches = query.match(/[A-Za-z_][A-Za-z0-9_]{2,}/g) ?? [];\n const out = new Set<string>();\n\n for (const token of matches) {\n const lowered = token.toLowerCase();\n if (STOP_WORDS.has(lowered) || SENTENCE_STARTER_WORDS.has(lowered)) continue;\n const looksLikeSymbol =\n /[a-z][A-Z]/.test(token) ||\n /[A-Z]{2,}[a-z]/.test(token) ||\n token.includes(\"_\") ||\n /[0-9]/.test(token) ||\n token.endsWith(\"Step\") ||\n token.endsWith(\"Module\") ||\n token.endsWith(\"Cmd\");\n if (!looksLikeSymbol) continue;\n if (PREFILTER_STOP_WORDS.has(lowered)) continue;\n out.add(lowered);\n }\n\n return Array.from(out);\n}\n\nfunction extractMethodSelectionSignals(query: string): {\n applicable: boolean;\n informativeTokens: Set<string>;\n} {\n const lowered = query.toLowerCase();\n const rawTokens = lowered.match(/[a-zA-Z_][a-zA-Z0-9_]*/g) ?? [];\n const informativeTokens = new Set(\n rawTokens.filter(token =>\n token.length >= 3 &&\n !STOP_WORDS.has(token) &&\n !SENTENCE_STARTER_WORDS.has(token) &&\n !PREFILTER_STOP_WORDS.has(token) &&\n !METHOD_SELECTION_TERMS.includes(token) &&\n !METHOD_SELECTION_SCOPE_TOKENS.includes(token) &&\n !BROAD_WORKFLOW_TERMS.includes(token)\n )\n );\n\n return {\n applicable: isMethodSelectionRetrievalQuery(query),\n informativeTokens,\n };\n}\n\nfunction splitPathIdentifierParts(filePath: string): string[] {\n const normalized = filePath\n .replace(/([a-z0-9])([A-Z])/g, \"$1 $2\")\n .replace(/[_./-]+/g, \" \")\n .toLowerCase();\n\n return Array.from(new Set(normalized.split(/\\s+/).filter(token => token.length >= 3)));\n}\n\nfunction extractInformativeTerms(query: string, hintTerms: string[]): string[] {\n const rawTokens = [\n ...(query.toLowerCase().match(/[a-z0-9_]{3,}/g) ?? []),\n ...hintTerms.map((term) => normalizeLookupToken(term)),\n ];\n return Array.from(new Set(\n rawTokens.filter((token) =>\n token.length >= 3 &&\n !STOP_WORDS.has(token) &&\n !SENTENCE_STARTER_WORDS.has(token) &&\n !PREFILTER_STOP_WORDS.has(token)\n )\n ));\n}\n\nfunction collectMatchConfirmations(matches: SharedCandidateMatch[], queryConcepts: Set<string>): string[] {\n const confirmations = new Set<string>();\n for (const match of matches) {\n for (const reason of match.reasons ?? []) {\n const matchTerm = reason.match(/^(?:term|pattern):(.+)$/i)?.[1];\n if (!matchTerm) continue;\n const normalized = normalizeLookupToken(matchTerm);\n if (!normalized || GENERIC_MATCH_TERMS.has(normalized)) {\n continue;\n }\n if (queryConcepts.has(normalized) || normalized.length >= 4) {\n confirmations.add(normalized);\n }\n }\n }\n return Array.from(confirmations);\n}\n\n/**\n * Scores snippet context using generic ownership clues.\n * Example: `it(\"fragment\", ...)` should outrank `query: \"\\\"fragment\\\"\"`.\n */\nfunction computeSnippetContextScore(matches: SharedCandidateMatch[]): { score: number; reasons: string[] } {\n let score = 0;\n const reasons = new Set<string>();\n\n for (const match of matches) {\n const snippet = String(match.snippet ?? \"\").trim();\n if (!snippet) {\n continue;\n }\n\n if (/\\b(?:it|test|describe)\\s*\\(/.test(snippet)) {\n score += 8;\n reasons.add(\"snippet-owner:test\");\n }\n\n if (/\\b(?:query|userQuery|prompt|input|expected|fixture)\\s*:/.test(snippet)) {\n score -= 7;\n reasons.add(\"snippet-meta:fixture\");\n }\n\n if (/^const\\s+[A-Za-z0-9_]+\\s*=/.test(snippet)) {\n score -= 5;\n reasons.add(\"snippet-meta:const\");\n }\n\n if (/^\\{?\\s*(?:path|filePath|targetFile)\\s*:/.test(snippet)) {\n score -= 4;\n reasons.add(\"snippet-meta:path-field\");\n }\n }\n\n return { score, reasons: Array.from(reasons) };\n}\n\nexport function isMethodSelectionRetrievalQuery(query: string): boolean {\n const lowered = query.toLowerCase();\n return (\n METHOD_SELECTION_TERMS.some(term => lowered.includes(term)) &&\n (\n DECISION_TERMS.some(term => lowered.includes(term)) ||\n SELECTION_POLICY_TOKENS.some(term => lowered.includes(term)) ||\n lowered.includes(\"triage\") ||\n lowered.includes(\"read\")\n )\n );\n}\n\nexport function buildMethodSelectionRetrievalQuery(query: string): string | null {\n const signals = extractMethodSelectionSignals(query);\n if (!signals.applicable) return null;\n\n const ordered = [...signals.informativeTokens]\n .filter(token => token.length >= 3 && !METHOD_SELECTION_SCOPE_TOKENS.includes(token));\n const selected = ordered.slice(0, 6);\n return selected.length > 0 ? selected.join(\" \") : null;\n}\n\n/**\n * Scores candidate files using the one shared ranking policy.\n * Example: `Explain EvalReportCmd` should strongly prefer `EvalReportCmd.ts`.\n */\nexport function scoreCandidateFiles(\n filePaths: string[],\n relatedFileScores: Record<string, number>,\n retrievalQuery: string,\n options: SharedCandidateScoringOptions = {}\n): SharedScoredSearchHit[] {\n const explicitRefs = extractFileReferences(retrievalQuery, { lowercase: true });\n const explicitBasenames = new Set(explicitRefs.map(ref => path.basename(ref)));\n const symbolAnchors = extractSymbolAnchors(retrievalQuery);\n const hintAnchors = (options.hintTerms ?? []).map((term) => normalizeLookupToken(term));\n const allSymbolAnchors = Array.from(new Set([...symbolAnchors, ...hintAnchors]));\n const domainAnchors = extractDomainAnchors(retrievalQuery);\n const methodSignals = extractMethodSelectionSignals(retrievalQuery);\n const queryConcepts = new Set(extractInformativeTerms(retrievalQuery, options.hintTerms ?? []));\n const scored = filePaths.map((filePath) => {\n const fileLower = filePath.toLowerCase();\n const basename = path.basename(filePath).toLowerCase();\n const stem = path.parse(basename).name;\n const normalizedStem = normalizeLookupToken(stem);\n const pathTokens = splitPathIdentifierParts(filePath);\n const fileMatches = options.matchesByFile?.[filePath] ?? [];\n const confirmedMatchTerms = collectMatchConfirmations(fileMatches, queryConcepts);\n const snippetContext = computeSnippetContextScore(fileMatches);\n let score = 0;\n const reasons: string[] = [];\n\n for (const ref of explicitRefs) {\n const refBasename = path.basename(ref).toLowerCase();\n const normalizedRef = normalizeLookupToken(refBasename);\n if (basename === refBasename || normalizedStem === normalizedRef) {\n score += 100;\n reasons.push(`exact-basename:${normalizedRef}`);\n break;\n }\n }\n\n if (explicitBasenames.has(basename)) {\n score += 24;\n reasons.push(`basename-anchor:${basename}`);\n }\n\n if (explicitRefs.some(ref => fileLower.includes(ref))) {\n score += 60;\n reasons.push(\"path-anchor\");\n }\n\n for (const anchor of allSymbolAnchors) {\n if (normalizedStem === anchor) {\n score += 48;\n reasons.push(`symbol:${anchor}:basename`);\n } else if (basename.includes(anchor)) {\n score += 40;\n reasons.push(`symbol:${anchor}:filename`);\n } else if (fileLower.includes(anchor)) {\n score += 20;\n reasons.push(`symbol:${anchor}:path`);\n }\n }\n\n const domainHitCount = countDomainAnchorHits(`${basename} ${fileLower}`, domainAnchors);\n if (domainHitCount > 0) {\n const boost = domainHitCount >= 2 ? 35 : 14;\n score += boost;\n reasons.push(`domain-anchors:${domainHitCount}`);\n }\n\n const bm25Raw = relatedFileScores[filePath];\n if (typeof bm25Raw === \"number\" && Number.isFinite(bm25Raw)) {\n const prior = Math.max(0, Math.min(20, -bm25Raw));\n score += prior;\n reasons.push(`bm25-prior:${prior.toFixed(2)}`);\n }\n\n const verifyFocus = getVerifyFocusFilePreference({\n query: retrievalQuery,\n filePath,\n explicitRefs,\n });\n if (verifyFocus.applies && verifyFocus.score !== 0) {\n score += verifyFocus.score * 45;\n reasons.push(...verifyFocus.reasons.map(reason => `verify-focus:${reason}`));\n }\n\n if (methodSignals.applicable) {\n const overlap = pathTokens.filter(token => methodSignals.informativeTokens.has(token));\n if (overlap.length > 0) {\n const boost = overlap.length >= 2 ? 28 : 14;\n score += boost;\n reasons.push(`method-overlap:${overlap.join(\",\")}`);\n }\n\n const roleHits = pathTokens.filter(token => CONTROLLER_ROLE_TOKENS.includes(token));\n const controllerRoleHits = roleHits.filter(token => token !== \"verify\");\n if (controllerRoleHits.length > 0) {\n score += overlap.length > 0 ? 10 : 6;\n reasons.push(`method-owner:${controllerRoleHits[0]}`);\n }\n\n if (pathTokens.includes(\"readiness\")) {\n score += 18;\n reasons.push(\"method-owner:readiness\");\n }\n\n const decisionHits = pathTokens.filter(token => DECISION_TERMS.includes(token));\n if (decisionHits.length > 0 && overlap.length > 0) {\n score += 8;\n reasons.push(`decision-term:${decisionHits[0]}`);\n }\n\n const workflowOnlyHits = pathTokens.filter(token => BROAD_WORKFLOW_TERMS.includes(token));\n if (workflowOnlyHits.length > 0 && overlap.length === 0) {\n score -= 12;\n reasons.push(`workflow-penalty:${workflowOnlyHits[0]}`);\n }\n\n const selectionPolicyHits = pathTokens.filter(token => SELECTION_POLICY_TOKENS.includes(token));\n if (\n selectionPolicyHits.length > 0 &&\n overlap.length > 0 &&\n decisionHits.length === 0 &&\n controllerRoleHits.length === 0\n ) {\n score -= 10;\n reasons.push(`selection-policy-penalty:${selectionPolicyHits[0]}`);\n }\n }\n\n if (confirmedMatchTerms.length >= 2) {\n score += 18;\n reasons.push(`match-confirmation:${confirmedMatchTerms.slice(0, 3).join(\",\")}`);\n } else if (confirmedMatchTerms.length === 1) {\n score += 8;\n reasons.push(`match-confirmation:${confirmedMatchTerms[0]}`);\n }\n\n if (snippetContext.score !== 0) {\n score += snippetContext.score;\n reasons.push(...snippetContext.reasons);\n }\n\n if (reasons.length === 0) {\n reasons.push(\"path-match\");\n }\n\n return { filePath, score, bm25Raw, reasons };\n });\n\n return scored.sort((left, right) => {\n if (right.score !== left.score) {\n return right.score - left.score;\n }\n const leftBm25 = typeof left.bm25Raw === \"number\" ? left.bm25Raw : Number.POSITIVE_INFINITY;\n const rightBm25 = typeof right.bm25Raw === \"number\" ? right.bm25Raw : Number.POSITIVE_INFINITY;\n return leftBm25 - rightBm25;\n });\n}\n"]}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Owns foreground reindex setup and the handoff into bounded background indexing.
|
|
3
|
+
*
|
|
4
|
+
* Why this file exists:
|
|
5
|
+
* - setup, manual reindex, and DB reset should reuse one queueing path
|
|
6
|
+
* - file scanning and daemon handoff should stay together in one place
|
|
7
|
+
* - user-facing indexing status text should stay consistent across commands
|
|
8
|
+
*/
|
|
9
|
+
import fg from "fast-glob";
|
|
10
|
+
import lockfile from "proper-lockfile";
|
|
11
|
+
import path from "path";
|
|
12
|
+
import { Spinner } from "../lib/spinner.js";
|
|
13
|
+
import { initSchema } from "../db/schema.js";
|
|
14
|
+
import { getDbForRepo, getDbPathForRepo } from "../db/client.js";
|
|
15
|
+
import { upsertFileTemplate } from "../db/sqlTemplates.js";
|
|
16
|
+
import { detectFileType } from "../fileRules/detectFileType.js";
|
|
17
|
+
import { classifyFile } from "../fileRules/classifyFile.js";
|
|
18
|
+
import { IGNORED_FOLDER_GLOBS } from "../fileRules/ignoredPaths.js";
|
|
19
|
+
import { Config } from "../config.js";
|
|
20
|
+
import { startDaemon } from "../commands/DaemonCmd.js";
|
|
21
|
+
import { log } from "../utils/log.js";
|
|
22
|
+
async function lockDb() {
|
|
23
|
+
try {
|
|
24
|
+
return await lockfile.lock(getDbPathForRepo());
|
|
25
|
+
}
|
|
26
|
+
catch (err) {
|
|
27
|
+
log("❌ Failed to acquire DB lock: " + err);
|
|
28
|
+
throw err;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
export async function runReindexCommand() {
|
|
32
|
+
try {
|
|
33
|
+
initSchema();
|
|
34
|
+
}
|
|
35
|
+
catch (err) {
|
|
36
|
+
console.error("❌ Failed to initialize schema:", err);
|
|
37
|
+
process.exit(1);
|
|
38
|
+
}
|
|
39
|
+
const spinner = new Spinner("Scanning files...");
|
|
40
|
+
const indexDir = Config.getIndexDir() || process.cwd();
|
|
41
|
+
const files = await fg("**/*.*", {
|
|
42
|
+
cwd: indexDir,
|
|
43
|
+
ignore: IGNORED_FOLDER_GLOBS,
|
|
44
|
+
absolute: true,
|
|
45
|
+
});
|
|
46
|
+
spinner.start();
|
|
47
|
+
try {
|
|
48
|
+
const db = getDbForRepo();
|
|
49
|
+
const release = await lockDb();
|
|
50
|
+
let queuedCount = 0;
|
|
51
|
+
let skippedCount = 0;
|
|
52
|
+
try {
|
|
53
|
+
for (const file of files) {
|
|
54
|
+
spinner.update(`Queueing files... ${queuedCount + skippedCount + 1}/${files.length}`);
|
|
55
|
+
const classification = classifyFile(file);
|
|
56
|
+
if (classification !== "valid") {
|
|
57
|
+
skippedCount++;
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
try {
|
|
61
|
+
const normalizedPath = path.normalize(file).replace(/\\/g, "/");
|
|
62
|
+
const filename = path.basename(normalizedPath);
|
|
63
|
+
const type = detectFileType(file);
|
|
64
|
+
db.prepare(upsertFileTemplate).run({
|
|
65
|
+
path: normalizedPath,
|
|
66
|
+
filename,
|
|
67
|
+
summary: null,
|
|
68
|
+
type,
|
|
69
|
+
lastModified: null,
|
|
70
|
+
indexedAt: null,
|
|
71
|
+
});
|
|
72
|
+
queuedCount++;
|
|
73
|
+
}
|
|
74
|
+
catch (err) {
|
|
75
|
+
log(`⚠️ Skipped in reindexOwner ${file}: ${err instanceof Error ? err.message : err}`);
|
|
76
|
+
skippedCount++;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
finally {
|
|
81
|
+
await release();
|
|
82
|
+
}
|
|
83
|
+
spinner.update("Starting background indexing...");
|
|
84
|
+
await startDaemon({ surface: "silent" });
|
|
85
|
+
spinner.succeed(`Done. Enqueued ${queuedCount} files for indexing.`);
|
|
86
|
+
console.log(`🚀 Background indexing started for repo: ${Config.getRaw().activeRepo}`);
|
|
87
|
+
console.log("📄 Follow progress in ~/.scai/daemon.log");
|
|
88
|
+
return { queuedCount, skippedCount };
|
|
89
|
+
}
|
|
90
|
+
catch (err) {
|
|
91
|
+
if (spinner.isActive()) {
|
|
92
|
+
spinner.fail(`Indexing setup failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
93
|
+
}
|
|
94
|
+
throw err;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=reindexOwner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reindexOwner.js","sourceRoot":"","sources":["../../src/setup/reindexOwner.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Owns foreground reindex setup and the handoff into bounded background indexing.\n *\n * Why this file exists:\n * - setup, manual reindex, and DB reset should reuse one queueing path\n * - file scanning and daemon handoff should stay together in one place\n * - user-facing indexing status text should stay consistent across commands\n */\nimport fg from \"fast-glob\";\nimport lockfile from \"proper-lockfile\";\nimport path from \"path\";\nimport { Spinner } from \"../lib/spinner.js\";\nimport { initSchema } from \"../db/schema.js\";\nimport { getDbForRepo, getDbPathForRepo } from \"../db/client.js\";\nimport { upsertFileTemplate } from \"../db/sqlTemplates.js\";\nimport { detectFileType } from \"../fileRules/detectFileType.js\";\nimport { classifyFile } from \"../fileRules/classifyFile.js\";\nimport { IGNORED_FOLDER_GLOBS } from \"../fileRules/ignoredPaths.js\";\nimport { Config } from \"../config.js\";\nimport { startDaemon } from \"../commands/DaemonCmd.js\";\nimport { log } from \"../utils/log.js\";\n\nasync function lockDb() {\n try {\n return await lockfile.lock(getDbPathForRepo());\n } catch (err) {\n log(\"❌ Failed to acquire DB lock: \" + err);\n throw err;\n }\n}\n\nexport type ReindexResult = {\n queuedCount: number;\n skippedCount: number;\n};\n\nexport async function runReindexCommand(): Promise<ReindexResult> {\n try {\n initSchema();\n } catch (err) {\n console.error(\"❌ Failed to initialize schema:\", err);\n process.exit(1);\n }\n\n const spinner = new Spinner(\"Scanning files...\");\n const indexDir = Config.getIndexDir() || process.cwd();\n const files = await fg(\"**/*.*\", {\n cwd: indexDir,\n ignore: IGNORED_FOLDER_GLOBS,\n absolute: true,\n });\n\n spinner.start();\n\n try {\n const db = getDbForRepo();\n const release = await lockDb();\n let queuedCount = 0;\n let skippedCount = 0;\n\n try {\n for (const file of files) {\n spinner.update(`Queueing files... ${queuedCount + skippedCount + 1}/${files.length}`);\n const classification = classifyFile(file);\n if (classification !== \"valid\") {\n skippedCount++;\n continue;\n }\n\n try {\n const normalizedPath = path.normalize(file).replace(/\\\\/g, \"/\");\n const filename = path.basename(normalizedPath);\n const type = detectFileType(file);\n\n db.prepare(upsertFileTemplate).run({\n path: normalizedPath,\n filename,\n summary: null,\n type,\n lastModified: null,\n indexedAt: null,\n });\n\n queuedCount++;\n } catch (err) {\n log(`⚠️ Skipped in reindexOwner ${file}: ${err instanceof Error ? err.message : err}`);\n skippedCount++;\n }\n }\n } finally {\n await release();\n }\n\n spinner.update(\"Starting background indexing...\");\n await startDaemon({ surface: \"silent\" });\n spinner.succeed(`Done. Enqueued ${queuedCount} files for indexing.`);\n console.log(`🚀 Background indexing started for repo: ${Config.getRaw().activeRepo}`);\n console.log(\"📄 Follow progress in ~/.scai/daemon.log\");\n return { queuedCount, skippedCount };\n } catch (err) {\n if (spinner.isActive()) {\n spinner.fail(`Indexing setup failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n throw err;\n }\n}\n"]}
|