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,70 @@
|
|
|
1
|
+
export function renderUnderstandPrompt(query, resumedContext) {
|
|
2
|
+
return [
|
|
3
|
+
"Return strict JSON only.",
|
|
4
|
+
"",
|
|
5
|
+
"Task:",
|
|
6
|
+
"- Normalize the user request.",
|
|
7
|
+
"- Classify the coarse request scope as targeted, multi-file, broad-repo, or general.",
|
|
8
|
+
"- Extract raw obvious file, folder, or target mentions without overthinking intent.",
|
|
9
|
+
"- Give one primary intent and up to three alternative intents.",
|
|
10
|
+
"- Return two to four small typed search term groups with three to six short terms each.",
|
|
11
|
+
"- Each search term group must have a kind: repo-anchor, command-path, or generic.",
|
|
12
|
+
"- Search term groups should help code search in this repo, not just describe the topic in English.",
|
|
13
|
+
"- Prefer repo-anchor groups first. Use likely repo-local identifiers, camelCase names, filenames, and symbol-like clues.",
|
|
14
|
+
"- Use command-path groups for slash commands, config files, path-like clues, and CLI entry names.",
|
|
15
|
+
"- Use generic groups only as fallback after concrete groups.",
|
|
16
|
+
"- For code-location, config, owner, or entrypoint questions, include at least one repo-anchor group.",
|
|
17
|
+
"- Prefer code-like anchors such as camelCase names, file names like package.json, and commands like /test-run when plausible.",
|
|
18
|
+
"- Only use broad fallback words like test, config, script, runner, command, or entry when they are paired with at least one concrete anchor.",
|
|
19
|
+
"- Do not guess unrelated frameworks or tools like jest, mocha, cypress, or yarn unless the user query suggests them.",
|
|
20
|
+
"- Search term groups should use terms only, not prose.",
|
|
21
|
+
"- Add ambiguity flags only when they matter.",
|
|
22
|
+
"- Treat queryScope as a coarse shape only. Do not use it to decide whether the agent should stop or ask the user.",
|
|
23
|
+
"- Classify as general when the user asks for general tool or programming knowledge that can be answered without inspecting this repository.",
|
|
24
|
+
"- Command names like git diff, bash, npm test, and docker build are not repo anchors by themselves.",
|
|
25
|
+
"- Do not classify as general when the query names this repo, this project, a file path, a symbol, a module, or quoted code that should be checked in this repo.",
|
|
26
|
+
"- If resumed context is present, use it only to resolve follow-up references like 'also', 'that file', 'did you check X', or 'what did you already inspect'.",
|
|
27
|
+
"- Preserve explicit file mentions from the new user query over older resumed-context clues.",
|
|
28
|
+
"- Do not rewrite the new user query into unrelated terms that are not present in the query or resumed context.",
|
|
29
|
+
"- Do not treat resumed context as fresh grounding for the current turn.",
|
|
30
|
+
"",
|
|
31
|
+
"Good example for a test-entry query:",
|
|
32
|
+
'[{"kind":"repo-anchor","terms":["registerDevCliCommands","testCommands","registerTestingCommands"]},{"kind":"command-path","terms":["/tests","/test-run","run-query"]},{"kind":"generic","terms":["vitest","package.json","entrypoint","register"]}]',
|
|
33
|
+
"",
|
|
34
|
+
"Bad example for the same query:",
|
|
35
|
+
'[{"kind":"generic","terms":["test","run","execute","script","entry","point"]},{"kind":"generic","terms":["package.json","npm","yarn","test","script","command"]},{"kind":"generic","terms":["jest","mocha","cypress","test","runner","config"]}]',
|
|
36
|
+
"",
|
|
37
|
+
"Good example for a loop-limit query:",
|
|
38
|
+
'[{"kind":"repo-anchor","terms":["maxTurns","turnCount"]},{"kind":"command-path","terms":["memory.ts","config","limit"]},{"kind":"generic","terms":["loop","limit","count"]}]',
|
|
39
|
+
"",
|
|
40
|
+
"General knowledge examples:",
|
|
41
|
+
'- "how do I use git bash to save a diff?" -> queryScope: "general"',
|
|
42
|
+
'- "what is recursion?" -> queryScope: "general"',
|
|
43
|
+
'- "how do I squash commits?" -> queryScope: "general"',
|
|
44
|
+
"",
|
|
45
|
+
"Repo-grounded examples:",
|
|
46
|
+
'- "how does this repo run tests?" -> queryScope: "broad-repo"',
|
|
47
|
+
`- "explain cli/src/agent/index.ts" -> queryScope: "targeted"`,
|
|
48
|
+
"",
|
|
49
|
+
"JSON shape:",
|
|
50
|
+
"{",
|
|
51
|
+
' "normalizedQuery": "string",',
|
|
52
|
+
' "queryScope": "targeted | multi-file | broad-repo | general",',
|
|
53
|
+
' "explicitTargets": ["string"],',
|
|
54
|
+
' "constraints": ["string"],',
|
|
55
|
+
' "primaryIntent": "string",',
|
|
56
|
+
' "alternativeIntents": ["string"],',
|
|
57
|
+
' "searchTermGroups": [{"kind":"repo-anchor | command-path | generic","terms":["term1", "term2"]}],',
|
|
58
|
+
' "ambiguityFlags": ["string"]',
|
|
59
|
+
"}",
|
|
60
|
+
"",
|
|
61
|
+
...(resumedContext ? [
|
|
62
|
+
"Resumed context:",
|
|
63
|
+
JSON.stringify(resumedContext, null, 2),
|
|
64
|
+
"",
|
|
65
|
+
] : []),
|
|
66
|
+
"User query:",
|
|
67
|
+
query,
|
|
68
|
+
].join("\n");
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=understand.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"understand.js","sourceRoot":"","sources":["../../../src/agent/prompting/understand.ts"],"names":[],"mappings":"AAUA,MAAM,UAAU,sBAAsB,CACpC,KAAa,EACb,cAA4C;IAE5C,OAAO;QACL,0BAA0B;QAC1B,EAAE;QACF,OAAO;QACP,+BAA+B;QAC/B,sFAAsF;QACtF,qFAAqF;QACrF,gEAAgE;QAChE,yFAAyF;QACzF,mFAAmF;QACnF,oGAAoG;QACpG,0HAA0H;QAC1H,mGAAmG;QACnG,8DAA8D;QAC9D,sGAAsG;QACtG,+HAA+H;QAC/H,8IAA8I;QAC9I,sHAAsH;QACtH,wDAAwD;QACxD,8CAA8C;QAC9C,mHAAmH;QACnH,6IAA6I;QAC7I,qGAAqG;QACrG,iKAAiK;QACjK,8JAA8J;QAC9J,6FAA6F;QAC7F,gHAAgH;QAChH,yEAAyE;QACzE,EAAE;QACF,sCAAsC;QACtC,sPAAsP;QACtP,EAAE;QACF,iCAAiC;QACjC,kPAAkP;QAClP,EAAE;QACF,sCAAsC;QACtC,8KAA8K;QAC9K,EAAE;QACF,6BAA6B;QAC7B,oEAAoE;QACpE,iDAAiD;QACjD,uDAAuD;QACvD,EAAE;QACF,yBAAyB;QACzB,+DAA+D;QAC/D,8DAA8D;QAC9D,EAAE;QACF,aAAa;QACb,GAAG;QACH,gCAAgC;QAChC,iEAAiE;QACjE,kCAAkC;QAClC,8BAA8B;QAC9B,8BAA8B;QAC9B,qCAAqC;QACrC,qGAAqG;QACrG,gCAAgC;QAChC,GAAG;QACH,EAAE;QACF,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC;YACnB,kBAAkB;YAClB,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC;YACvC,EAAE;SACH,CAAC,CAAC,CAAC,EAAE,CAAC;QACP,aAAa;QACb,KAAK;KACN,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC","sourcesContent":["/**\n * Owns understand prompt text for the new agent.\n *\n * Why this file exists:\n * - understand prompt ownership should stay out of runtime wiring\n * - the prompt should live under a direct new-agent owner\n * - direct imports avoid compatibility prompt files\n */\nimport type { ResumeCheckpointPromptShape } from \"../resume/checkpoint.js\";\n\nexport function renderUnderstandPrompt(\n query: string,\n resumedContext?: ResumeCheckpointPromptShape\n): string {\n return [\n \"Return strict JSON only.\",\n \"\",\n \"Task:\",\n \"- Normalize the user request.\",\n \"- Classify the coarse request scope as targeted, multi-file, broad-repo, or general.\",\n \"- Extract raw obvious file, folder, or target mentions without overthinking intent.\",\n \"- Give one primary intent and up to three alternative intents.\",\n \"- Return two to four small typed search term groups with three to six short terms each.\",\n \"- Each search term group must have a kind: repo-anchor, command-path, or generic.\",\n \"- Search term groups should help code search in this repo, not just describe the topic in English.\",\n \"- Prefer repo-anchor groups first. Use likely repo-local identifiers, camelCase names, filenames, and symbol-like clues.\",\n \"- Use command-path groups for slash commands, config files, path-like clues, and CLI entry names.\",\n \"- Use generic groups only as fallback after concrete groups.\",\n \"- For code-location, config, owner, or entrypoint questions, include at least one repo-anchor group.\",\n \"- Prefer code-like anchors such as camelCase names, file names like package.json, and commands like /test-run when plausible.\",\n \"- Only use broad fallback words like test, config, script, runner, command, or entry when they are paired with at least one concrete anchor.\",\n \"- Do not guess unrelated frameworks or tools like jest, mocha, cypress, or yarn unless the user query suggests them.\",\n \"- Search term groups should use terms only, not prose.\",\n \"- Add ambiguity flags only when they matter.\",\n \"- Treat queryScope as a coarse shape only. Do not use it to decide whether the agent should stop or ask the user.\",\n \"- Classify as general when the user asks for general tool or programming knowledge that can be answered without inspecting this repository.\",\n \"- Command names like git diff, bash, npm test, and docker build are not repo anchors by themselves.\",\n \"- Do not classify as general when the query names this repo, this project, a file path, a symbol, a module, or quoted code that should be checked in this repo.\",\n \"- If resumed context is present, use it only to resolve follow-up references like 'also', 'that file', 'did you check X', or 'what did you already inspect'.\",\n \"- Preserve explicit file mentions from the new user query over older resumed-context clues.\",\n \"- Do not rewrite the new user query into unrelated terms that are not present in the query or resumed context.\",\n \"- Do not treat resumed context as fresh grounding for the current turn.\",\n \"\",\n \"Good example for a test-entry query:\",\n '[{\"kind\":\"repo-anchor\",\"terms\":[\"registerDevCliCommands\",\"testCommands\",\"registerTestingCommands\"]},{\"kind\":\"command-path\",\"terms\":[\"/tests\",\"/test-run\",\"run-query\"]},{\"kind\":\"generic\",\"terms\":[\"vitest\",\"package.json\",\"entrypoint\",\"register\"]}]',\n \"\",\n \"Bad example for the same query:\",\n '[{\"kind\":\"generic\",\"terms\":[\"test\",\"run\",\"execute\",\"script\",\"entry\",\"point\"]},{\"kind\":\"generic\",\"terms\":[\"package.json\",\"npm\",\"yarn\",\"test\",\"script\",\"command\"]},{\"kind\":\"generic\",\"terms\":[\"jest\",\"mocha\",\"cypress\",\"test\",\"runner\",\"config\"]}]',\n \"\",\n \"Good example for a loop-limit query:\",\n '[{\"kind\":\"repo-anchor\",\"terms\":[\"maxTurns\",\"turnCount\"]},{\"kind\":\"command-path\",\"terms\":[\"memory.ts\",\"config\",\"limit\"]},{\"kind\":\"generic\",\"terms\":[\"loop\",\"limit\",\"count\"]}]',\n \"\",\n \"General knowledge examples:\",\n '- \"how do I use git bash to save a diff?\" -> queryScope: \"general\"',\n '- \"what is recursion?\" -> queryScope: \"general\"',\n '- \"how do I squash commits?\" -> queryScope: \"general\"',\n \"\",\n \"Repo-grounded examples:\",\n '- \"how does this repo run tests?\" -> queryScope: \"broad-repo\"',\n `- \"explain cli/src/agent/index.ts\" -> queryScope: \"targeted\"`,\n \"\",\n \"JSON shape:\",\n \"{\",\n ' \"normalizedQuery\": \"string\",',\n ' \"queryScope\": \"targeted | multi-file | broad-repo | general\",',\n ' \"explicitTargets\": [\"string\"],',\n ' \"constraints\": [\"string\"],',\n ' \"primaryIntent\": \"string\",',\n ' \"alternativeIntents\": [\"string\"],',\n ' \"searchTermGroups\": [{\"kind\":\"repo-anchor | command-path | generic\",\"terms\":[\"term1\", \"term2\"]}],',\n ' \"ambiguityFlags\": [\"string\"]',\n \"}\",\n \"\",\n ...(resumedContext ? [\n \"Resumed context:\",\n JSON.stringify(resumedContext, null, 2),\n \"\",\n ] : []),\n \"User query:\",\n query,\n ].join(\"\\n\");\n}\n"]}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Checks whether stored read evidence is still fresh for the current query.
|
|
3
|
+
*
|
|
4
|
+
* Why this file exists:
|
|
5
|
+
* - policy should consume freshness facts, not perform file I/O directly
|
|
6
|
+
* - read freshness rules should stay close to read evidence behavior
|
|
7
|
+
*/
|
|
8
|
+
import fs from "fs";
|
|
9
|
+
import { computeContentFingerprint, hasFreshAgentReadEvidence } from "../../utils/fileEvidenceCache.js";
|
|
10
|
+
export function hasFreshReadForPath(memory, filePath, options = {}) {
|
|
11
|
+
const evidence = memory.evidence.fileReads[filePath];
|
|
12
|
+
if (!evidence || !fs.existsSync(filePath)) {
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
const actualMode = evidence.readMode ?? "full";
|
|
16
|
+
if (options.mode && actualMode !== options.mode) {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
const code = fs.readFileSync(filePath, "utf-8");
|
|
20
|
+
if (actualMode === "full") {
|
|
21
|
+
return evidence.contentFingerprint === computeContentFingerprint(code);
|
|
22
|
+
}
|
|
23
|
+
return hasFreshAgentReadEvidence({
|
|
24
|
+
evidence,
|
|
25
|
+
code,
|
|
26
|
+
query: memory.task.normalizedQuery,
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=freshness.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"freshness.js","sourceRoot":"","sources":["../../../src/agent/read/freshness.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpB,OAAO,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,MAAM,kCAAkC,CAAC;AAMxG,MAAM,UAAU,mBAAmB,CAAC,MAAmB,EAAE,QAAgB,EAAE,UAA4B,EAAE;IACvG,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IACrD,IAAI,CAAC,QAAQ,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1C,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,UAAU,GAAG,QAAQ,CAAC,QAAQ,IAAI,MAAM,CAAC;IAC/C,IAAI,OAAO,CAAC,IAAI,IAAI,UAAU,KAAK,OAAO,CAAC,IAAI,EAAE,CAAC;QAChD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAChD,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;QAC1B,OAAO,QAAQ,CAAC,kBAAkB,KAAK,yBAAyB,CAAC,IAAI,CAAC,CAAC;IACzE,CAAC;IACD,OAAO,yBAAyB,CAAC;QAC/B,QAAQ;QACR,IAAI;QACJ,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,eAAe;KACnC,CAAC,CAAC;AACL,CAAC","sourcesContent":["/**\n * Checks whether stored read evidence is still fresh for the current query.\n *\n * Why this file exists:\n * - policy should consume freshness facts, not perform file I/O directly\n * - read freshness rules should stay close to read evidence behavior\n */\nimport fs from \"fs\";\nimport type { AgentMemory, AgentReadEvidence } from \"../types.js\";\nimport { computeContentFingerprint, hasFreshAgentReadEvidence } from \"../../utils/fileEvidenceCache.js\";\n\ninterface FreshReadOptions {\n mode?: AgentReadEvidence[\"readMode\"];\n}\n\nexport function hasFreshReadForPath(memory: AgentMemory, filePath: string, options: FreshReadOptions = {}): boolean {\n const evidence = memory.evidence.fileReads[filePath];\n if (!evidence || !fs.existsSync(filePath)) {\n return false;\n }\n const actualMode = evidence.readMode ?? \"full\";\n if (options.mode && actualMode !== options.mode) {\n return false;\n }\n const code = fs.readFileSync(filePath, \"utf-8\");\n if (actualMode === \"full\") {\n return evidence.contentFingerprint === computeContentFingerprint(code);\n }\n return hasFreshAgentReadEvidence({\n evidence,\n code,\n query: memory.task.normalizedQuery,\n });\n}\n"]}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Builds the full-read model prompt for one grounded file understanding pass.
|
|
3
|
+
*
|
|
4
|
+
* Why this file exists:
|
|
5
|
+
* - full-read prompt shaping should stay inside the read area
|
|
6
|
+
* - read execution should not also own prompt wording details
|
|
7
|
+
* - fallback and prompt output should target the same read evidence shape
|
|
8
|
+
*/
|
|
9
|
+
export function buildFullReadPrompt(query, filePath, code) {
|
|
10
|
+
return [
|
|
11
|
+
"Return strict JSON only.",
|
|
12
|
+
"",
|
|
13
|
+
"You are doing one grounded file read for the modular agent runtime.",
|
|
14
|
+
"The goal is to understand the file itself, not to plan edits.",
|
|
15
|
+
"",
|
|
16
|
+
"Task query:",
|
|
17
|
+
query,
|
|
18
|
+
"",
|
|
19
|
+
`File path: ${filePath}`,
|
|
20
|
+
"",
|
|
21
|
+
"Return JSON:",
|
|
22
|
+
"{",
|
|
23
|
+
' "summary": "short plain summary",',
|
|
24
|
+
' "relevanceExplanation": "why this file matters to the query",',
|
|
25
|
+
' "role": "primary | supporting | contextual",',
|
|
26
|
+
' "keySymbols": ["symbol"],',
|
|
27
|
+
' "excerpts": [',
|
|
28
|
+
' { "description": "why this code matters", "startLine": 1, "endLine": 5, "symbols": ["name"], "code": "actual code" }',
|
|
29
|
+
" ],",
|
|
30
|
+
' "risks": ["constraint or uncertainty"]',
|
|
31
|
+
"}",
|
|
32
|
+
"",
|
|
33
|
+
"Rules:",
|
|
34
|
+
"- Prefer complete functions, configuration blocks, or object literals as excerpts.",
|
|
35
|
+
"- Keep excerpts directly grounded in the file text.",
|
|
36
|
+
"- Do not propose changes.",
|
|
37
|
+
"- If evidence is weak, say so in risks.",
|
|
38
|
+
"",
|
|
39
|
+
"Code excerpt:",
|
|
40
|
+
code,
|
|
41
|
+
].join("\n");
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=fullReadPrompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fullReadPrompt.js","sourceRoot":"","sources":["../../../src/agent/read/fullReadPrompt.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,UAAU,mBAAmB,CAAC,KAAa,EAAE,QAAgB,EAAE,IAAY;IAC/E,OAAO;QACL,0BAA0B;QAC1B,EAAE;QACF,qEAAqE;QACrE,+DAA+D;QAC/D,EAAE;QACF,aAAa;QACb,KAAK;QACL,EAAE;QACF,cAAc,QAAQ,EAAE;QACxB,EAAE;QACF,cAAc;QACd,GAAG;QACH,qCAAqC;QACrC,iEAAiE;QACjE,gDAAgD;QAChD,6BAA6B;QAC7B,iBAAiB;QACjB,0HAA0H;QAC1H,MAAM;QACN,0CAA0C;QAC1C,GAAG;QACH,EAAE;QACF,QAAQ;QACR,oFAAoF;QACpF,qDAAqD;QACrD,2BAA2B;QAC3B,yCAAyC;QACzC,EAAE;QACF,eAAe;QACf,IAAI;KACL,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC","sourcesContent":["/**\n * Builds the full-read model prompt for one grounded file understanding pass.\n *\n * Why this file exists:\n * - full-read prompt shaping should stay inside the read area\n * - read execution should not also own prompt wording details\n * - fallback and prompt output should target the same read evidence shape\n */\n\nexport function buildFullReadPrompt(query: string, filePath: string, code: string): string {\n return [\n \"Return strict JSON only.\",\n \"\",\n \"You are doing one grounded file read for the modular agent runtime.\",\n \"The goal is to understand the file itself, not to plan edits.\",\n \"\",\n \"Task query:\",\n query,\n \"\",\n `File path: ${filePath}`,\n \"\",\n \"Return JSON:\",\n \"{\",\n ' \"summary\": \"short plain summary\",',\n ' \"relevanceExplanation\": \"why this file matters to the query\",',\n ' \"role\": \"primary | supporting | contextual\",',\n ' \"keySymbols\": [\"symbol\"],',\n ' \"excerpts\": [',\n ' { \"description\": \"why this code matters\", \"startLine\": 1, \"endLine\": 5, \"symbols\": [\"name\"], \"code\": \"actual code\" }',\n \" ],\",\n ' \"risks\": [\"constraint or uncertainty\"]',\n \"}\",\n \"\",\n \"Rules:\",\n \"- Prefer complete functions, configuration blocks, or object literals as excerpts.\",\n \"- Keep excerpts directly grounded in the file text.\",\n \"- Do not propose changes.\",\n \"- If evidence is weak, say so in risks.\",\n \"\",\n \"Code excerpt:\",\n code,\n ].join(\"\\n\");\n}\n"]}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Owns the canonical read path for the modular agent runtime.
|
|
3
|
+
*
|
|
4
|
+
* Why this file exists:
|
|
5
|
+
* - the new agent should have one read entrypoint area
|
|
6
|
+
* - read execution should stay separate from policy decisions about when to triage or fully read
|
|
7
|
+
* - target resolution, freshness, prompts, and fallback shaping belong together
|
|
8
|
+
* - policy should call read-owned path checks instead of touching the file system directly
|
|
9
|
+
*/
|
|
10
|
+
import fs from "fs";
|
|
11
|
+
import { generate } from "../../lib/generate.js";
|
|
12
|
+
import { buildDeterministicFullReadFallback, selectCodeForFullReadPrompt, summarizeFileRead, } from "./summarizeReadEvidence.js";
|
|
13
|
+
import { canReadExplicitTarget, resolveExplicitFileTarget, resolveReadTarget, UnresolvedAgentTargetError, } from "./targetResolution.js";
|
|
14
|
+
import { hasFreshReadForPath } from "./freshness.js";
|
|
15
|
+
import { buildFullReadPrompt } from "./fullReadPrompt.js";
|
|
16
|
+
import { loadPersistedFullRead, savePersistedFullRead } from "./persistence.js";
|
|
17
|
+
const MAX_FULL_READ_CODE_CHARS = 9000;
|
|
18
|
+
export { canReadExplicitTarget, hasFreshReadForPath, resolveExplicitFileTarget, resolveReadTarget, summarizeFileRead, UnresolvedAgentTargetError, };
|
|
19
|
+
function isHardTarget(memory, filePath) {
|
|
20
|
+
return memory.task.hardFileTargets.includes(filePath);
|
|
21
|
+
}
|
|
22
|
+
function parseStructuredReadResponse(raw) {
|
|
23
|
+
const trimmed = raw.trim();
|
|
24
|
+
const fenced = trimmed.match(/```(?:json)?\s*([\s\S]*?)```/i);
|
|
25
|
+
const candidate = fenced?.[1]?.trim() || trimmed;
|
|
26
|
+
try {
|
|
27
|
+
return JSON.parse(candidate);
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return {};
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
function chooseFullReadRole(value, fallback) {
|
|
34
|
+
return value === "primary" || value === "supporting" || value === "contextual"
|
|
35
|
+
? value
|
|
36
|
+
: fallback;
|
|
37
|
+
}
|
|
38
|
+
function normalizeStringList(values, limit) {
|
|
39
|
+
if (!Array.isArray(values)) {
|
|
40
|
+
return undefined;
|
|
41
|
+
}
|
|
42
|
+
return values.map((value) => String(value ?? "").trim()).filter(Boolean).slice(0, limit);
|
|
43
|
+
}
|
|
44
|
+
function normalizeExcerpts(excerpts, fallback) {
|
|
45
|
+
if (!Array.isArray(excerpts)) {
|
|
46
|
+
return fallback;
|
|
47
|
+
}
|
|
48
|
+
return excerpts
|
|
49
|
+
.filter((excerpt) => {
|
|
50
|
+
return typeof excerpt?.code === "string" && excerpt.code.trim().length > 0;
|
|
51
|
+
})
|
|
52
|
+
.slice(0, 3);
|
|
53
|
+
}
|
|
54
|
+
function mergeFullReadEvidence(base, parsed) {
|
|
55
|
+
return {
|
|
56
|
+
...base,
|
|
57
|
+
readMode: "full",
|
|
58
|
+
summary: typeof parsed.summary === "string" && parsed.summary.trim().length > 0
|
|
59
|
+
? parsed.summary.trim().slice(0, 240)
|
|
60
|
+
: base.summary,
|
|
61
|
+
relevanceExplanation: typeof parsed.relevanceExplanation === "string" && parsed.relevanceExplanation.trim().length > 0
|
|
62
|
+
? parsed.relevanceExplanation.trim()
|
|
63
|
+
: base.relevanceExplanation,
|
|
64
|
+
role: chooseFullReadRole(parsed.role, base.role),
|
|
65
|
+
excerpts: normalizeExcerpts(parsed.excerpts, base.excerpts),
|
|
66
|
+
risks: normalizeStringList(parsed.risks, 4) ?? base.risks,
|
|
67
|
+
keySymbols: normalizeStringList(parsed.keySymbols, 8) ?? base.keySymbols,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
function resolveReadPriority(searchScore, triageScore) {
|
|
71
|
+
if (typeof triageScore !== "number") {
|
|
72
|
+
return undefined;
|
|
73
|
+
}
|
|
74
|
+
if (typeof searchScore === "number") {
|
|
75
|
+
return Number((searchScore + triageScore).toFixed(2));
|
|
76
|
+
}
|
|
77
|
+
return triageScore;
|
|
78
|
+
}
|
|
79
|
+
function updateCandidateMetadata(memory, filePath, evidence) {
|
|
80
|
+
var _a;
|
|
81
|
+
(_a = memory.evidence).candidateMetadata ?? (_a.candidateMetadata = {});
|
|
82
|
+
const existing = memory.evidence.candidateMetadata[filePath] ?? {};
|
|
83
|
+
const readPriority = resolveReadPriority(existing.searchScore, evidence.triageScore);
|
|
84
|
+
memory.evidence.candidateMetadata[filePath] = {
|
|
85
|
+
...existing,
|
|
86
|
+
...(typeof evidence.triageScore === "number" ? { triageScore: evidence.triageScore } : {}),
|
|
87
|
+
...(typeof readPriority === "number" ? { readPriority } : {}),
|
|
88
|
+
lastUpdatedAt: evidence.recordedAt,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
function storeReadEvidence(memory, filePath, evidence) {
|
|
92
|
+
memory.evidence.fileReads[filePath] = evidence;
|
|
93
|
+
if (!memory.evidence.candidateFiles.includes(filePath)) {
|
|
94
|
+
memory.evidence.candidateFiles.push(filePath);
|
|
95
|
+
}
|
|
96
|
+
updateCandidateMetadata(memory, filePath, evidence);
|
|
97
|
+
return evidence;
|
|
98
|
+
}
|
|
99
|
+
export async function triageAgentFile(memory, rawTarget) {
|
|
100
|
+
const targetPath = resolveReadTarget(memory, rawTarget);
|
|
101
|
+
const code = fs.readFileSync(targetPath, "utf-8");
|
|
102
|
+
const evidence = summarizeFileRead(targetPath, code, memory.task.normalizedQuery, {
|
|
103
|
+
readMode: "triage",
|
|
104
|
+
hardTarget: isHardTarget(memory, targetPath),
|
|
105
|
+
explicitTargets: memory.task.explicitTargets,
|
|
106
|
+
});
|
|
107
|
+
return storeReadEvidence(memory, targetPath, evidence);
|
|
108
|
+
}
|
|
109
|
+
export async function readAgentFile(memory, rawTarget) {
|
|
110
|
+
const targetPath = resolveReadTarget(memory, rawTarget);
|
|
111
|
+
const code = fs.readFileSync(targetPath, "utf-8");
|
|
112
|
+
const persisted = loadPersistedFullRead(targetPath, code);
|
|
113
|
+
if (persisted) {
|
|
114
|
+
return storeReadEvidence(memory, targetPath, persisted);
|
|
115
|
+
}
|
|
116
|
+
const base = buildDeterministicFullReadFallback(targetPath, code, memory.task.normalizedQuery, {
|
|
117
|
+
hardTarget: isHardTarget(memory, targetPath),
|
|
118
|
+
explicitTargets: memory.task.explicitTargets,
|
|
119
|
+
});
|
|
120
|
+
const prompt = buildFullReadPrompt(memory.task.normalizedQuery, targetPath, selectCodeForFullReadPrompt(code, memory.task.normalizedQuery, MAX_FULL_READ_CODE_CHARS));
|
|
121
|
+
try {
|
|
122
|
+
const response = await generate({ query: memory.task.initialQuery, content: prompt }, {
|
|
123
|
+
caller: "agent.read-file",
|
|
124
|
+
inputContext: {
|
|
125
|
+
query: memory.task.normalizedQuery,
|
|
126
|
+
filePath: targetPath,
|
|
127
|
+
hardTarget: isHardTarget(memory, targetPath),
|
|
128
|
+
},
|
|
129
|
+
});
|
|
130
|
+
const parsed = parseStructuredReadResponse(String(response?.data ?? ""));
|
|
131
|
+
const evidence = mergeFullReadEvidence(base, parsed);
|
|
132
|
+
savePersistedFullRead(evidence);
|
|
133
|
+
return storeReadEvidence(memory, targetPath, evidence);
|
|
134
|
+
}
|
|
135
|
+
catch {
|
|
136
|
+
savePersistedFullRead(base);
|
|
137
|
+
return storeReadEvidence(memory, targetPath, base);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/agent/read/index.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Owns the canonical read path for the modular agent runtime.\n *\n * Why this file exists:\n * - the new agent should have one read entrypoint area\n * - read execution should stay separate from policy decisions about when to triage or fully read\n * - target resolution, freshness, prompts, and fallback shaping belong together\n * - policy should call read-owned path checks instead of touching the file system directly\n */\nimport fs from \"fs\";\nimport type { AgentMemory, AgentReadEvidence } from \"../types.js\";\nimport { generate } from \"../../lib/generate.js\";\nimport {\n buildDeterministicFullReadFallback,\n selectCodeForFullReadPrompt,\n summarizeFileRead,\n} from \"./summarizeReadEvidence.js\";\nimport {\n canReadExplicitTarget,\n resolveExplicitFileTarget,\n resolveReadTarget,\n UnresolvedAgentTargetError,\n} from \"./targetResolution.js\";\nimport { hasFreshReadForPath } from \"./freshness.js\";\nimport { buildFullReadPrompt } from \"./fullReadPrompt.js\";\nimport { loadPersistedFullRead, savePersistedFullRead } from \"./persistence.js\";\n\nconst MAX_FULL_READ_CODE_CHARS = 9000;\n\nexport {\n canReadExplicitTarget,\n hasFreshReadForPath,\n resolveExplicitFileTarget,\n resolveReadTarget,\n summarizeFileRead,\n UnresolvedAgentTargetError,\n};\n\nfunction isHardTarget(memory: AgentMemory, filePath: string): boolean {\n return memory.task.hardFileTargets.includes(filePath);\n}\n\nfunction parseStructuredReadResponse(raw: string): Partial<AgentReadEvidence> {\n const trimmed = raw.trim();\n const fenced = trimmed.match(/```(?:json)?\\s*([\\s\\S]*?)```/i);\n const candidate = fenced?.[1]?.trim() || trimmed;\n try {\n return JSON.parse(candidate) as Partial<AgentReadEvidence>;\n } catch {\n return {};\n }\n}\n\nfunction chooseFullReadRole(value: unknown, fallback: AgentReadEvidence[\"role\"]): AgentReadEvidence[\"role\"] {\n return value === \"primary\" || value === \"supporting\" || value === \"contextual\"\n ? value\n : fallback;\n}\n\nfunction normalizeStringList(values: unknown, limit: number): string[] | undefined {\n if (!Array.isArray(values)) {\n return undefined;\n }\n return values.map((value) => String(value ?? \"\").trim()).filter(Boolean).slice(0, limit);\n}\n\nfunction normalizeExcerpts(\n excerpts: unknown,\n fallback: AgentReadEvidence[\"excerpts\"]\n): AgentReadEvidence[\"excerpts\"] {\n if (!Array.isArray(excerpts)) {\n return fallback;\n }\n return excerpts\n .filter((excerpt): excerpt is NonNullable<AgentReadEvidence[\"excerpts\"]>[number] => {\n return typeof excerpt?.code === \"string\" && excerpt.code.trim().length > 0;\n })\n .slice(0, 3);\n}\n\nfunction mergeFullReadEvidence(base: AgentReadEvidence, parsed: Partial<AgentReadEvidence>): AgentReadEvidence {\n return {\n ...base,\n readMode: \"full\",\n summary: typeof parsed.summary === \"string\" && parsed.summary.trim().length > 0\n ? parsed.summary.trim().slice(0, 240)\n : base.summary,\n relevanceExplanation: typeof parsed.relevanceExplanation === \"string\" && parsed.relevanceExplanation.trim().length > 0\n ? parsed.relevanceExplanation.trim()\n : base.relevanceExplanation,\n role: chooseFullReadRole(parsed.role, base.role),\n excerpts: normalizeExcerpts(parsed.excerpts, base.excerpts),\n risks: normalizeStringList(parsed.risks, 4) ?? base.risks,\n keySymbols: normalizeStringList(parsed.keySymbols, 8) ?? base.keySymbols,\n };\n}\n\nfunction resolveReadPriority(searchScore: number | undefined, triageScore: number | undefined): number | undefined {\n if (typeof triageScore !== \"number\") {\n return undefined;\n }\n if (typeof searchScore === \"number\") {\n return Number((searchScore + triageScore).toFixed(2));\n }\n return triageScore;\n}\n\nfunction updateCandidateMetadata(memory: AgentMemory, filePath: string, evidence: AgentReadEvidence): void {\n memory.evidence.candidateMetadata ??= {};\n const existing = memory.evidence.candidateMetadata[filePath] ?? {};\n const readPriority = resolveReadPriority(existing.searchScore, evidence.triageScore);\n memory.evidence.candidateMetadata[filePath] = {\n ...existing,\n ...(typeof evidence.triageScore === \"number\" ? { triageScore: evidence.triageScore } : {}),\n ...(typeof readPriority === \"number\" ? { readPriority } : {}),\n lastUpdatedAt: evidence.recordedAt,\n };\n}\n\nfunction storeReadEvidence(memory: AgentMemory, filePath: string, evidence: AgentReadEvidence): AgentReadEvidence {\n memory.evidence.fileReads[filePath] = evidence;\n if (!memory.evidence.candidateFiles.includes(filePath)) {\n memory.evidence.candidateFiles.push(filePath);\n }\n updateCandidateMetadata(memory, filePath, evidence);\n return evidence;\n}\n\nexport async function triageAgentFile(memory: AgentMemory, rawTarget: string): Promise<AgentReadEvidence> {\n const targetPath = resolveReadTarget(memory, rawTarget);\n const code = fs.readFileSync(targetPath, \"utf-8\");\n const evidence = summarizeFileRead(targetPath, code, memory.task.normalizedQuery, {\n readMode: \"triage\",\n hardTarget: isHardTarget(memory, targetPath),\n explicitTargets: memory.task.explicitTargets,\n });\n return storeReadEvidence(memory, targetPath, evidence);\n}\n\nexport async function readAgentFile(memory: AgentMemory, rawTarget: string): Promise<AgentReadEvidence> {\n const targetPath = resolveReadTarget(memory, rawTarget);\n const code = fs.readFileSync(targetPath, \"utf-8\");\n const persisted = loadPersistedFullRead(targetPath, code);\n if (persisted) {\n return storeReadEvidence(memory, targetPath, persisted);\n }\n const base = buildDeterministicFullReadFallback(targetPath, code, memory.task.normalizedQuery, {\n hardTarget: isHardTarget(memory, targetPath),\n explicitTargets: memory.task.explicitTargets,\n });\n const prompt = buildFullReadPrompt(\n memory.task.normalizedQuery,\n targetPath,\n selectCodeForFullReadPrompt(code, memory.task.normalizedQuery, MAX_FULL_READ_CODE_CHARS)\n );\n\n try {\n const response = await generate({ query: memory.task.initialQuery, content: prompt }, {\n caller: \"agent.read-file\",\n inputContext: {\n query: memory.task.normalizedQuery,\n filePath: targetPath,\n hardTarget: isHardTarget(memory, targetPath),\n },\n });\n const parsed = parseStructuredReadResponse(String(response?.data ?? \"\"));\n const evidence = mergeFullReadEvidence(base, parsed);\n savePersistedFullRead(evidence);\n return storeReadEvidence(memory, targetPath, evidence);\n } catch {\n savePersistedFullRead(base);\n return storeReadEvidence(memory, targetPath, base);\n }\n}\n"]}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Persists reusable full-read evidence for the modular agent by file content hash.
|
|
3
|
+
*
|
|
4
|
+
* Why this file exists:
|
|
5
|
+
* - full reads are expensive and should be reused across later runs when file bytes did not change
|
|
6
|
+
* - the new agent needs one small owner for read persistence instead of mixing DB logic into the loop
|
|
7
|
+
* - reuse rules for persisted reads should stay content-based and separate from older query-based cache rules
|
|
8
|
+
*/
|
|
9
|
+
import fs from "fs";
|
|
10
|
+
import { createHash } from "crypto";
|
|
11
|
+
import { getDbForRepo } from "../../db/client.js";
|
|
12
|
+
function withPersistedReadDb(fn) {
|
|
13
|
+
try {
|
|
14
|
+
const db = getDbForRepo();
|
|
15
|
+
return fn(db);
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return undefined;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
function normalizePersistedFullRead(payload, filePath) {
|
|
22
|
+
if (!payload || typeof payload !== "object") {
|
|
23
|
+
return undefined;
|
|
24
|
+
}
|
|
25
|
+
const evidence = payload;
|
|
26
|
+
const summary = typeof evidence.summary === "string" ? evidence.summary : undefined;
|
|
27
|
+
const recordedAt = typeof evidence.recordedAt === "string" ? evidence.recordedAt : undefined;
|
|
28
|
+
if (!summary || !recordedAt) {
|
|
29
|
+
return undefined;
|
|
30
|
+
}
|
|
31
|
+
return {
|
|
32
|
+
...evidence,
|
|
33
|
+
filePath,
|
|
34
|
+
readMode: "full",
|
|
35
|
+
summary,
|
|
36
|
+
snippets: Array.isArray(evidence.snippets) ? evidence.snippets.map((snippet) => String(snippet)) : [],
|
|
37
|
+
matchedTerms: Array.isArray(evidence.matchedTerms) ? evidence.matchedTerms.map((term) => String(term)) : [],
|
|
38
|
+
relevantContext: Array.isArray(evidence.relevantContext)
|
|
39
|
+
? evidence.relevantContext.filter((item) => {
|
|
40
|
+
return typeof item?.kind === "string" && typeof item?.text === "string";
|
|
41
|
+
})
|
|
42
|
+
: [],
|
|
43
|
+
recordedAt,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
export function computeReadContentHash(code) {
|
|
47
|
+
return createHash("sha1").update(code).digest("hex").slice(0, 12);
|
|
48
|
+
}
|
|
49
|
+
export function loadPersistedFullRead(filePath, code) {
|
|
50
|
+
const row = withPersistedReadDb((db) => db.prepare(`
|
|
51
|
+
SELECT file_path, content_hash, read_mode, payload_json
|
|
52
|
+
FROM agent_file_reads
|
|
53
|
+
WHERE file_path = ? AND read_mode = 'full'
|
|
54
|
+
`).get(filePath));
|
|
55
|
+
if (!row) {
|
|
56
|
+
return undefined;
|
|
57
|
+
}
|
|
58
|
+
const currentHash = computeReadContentHash(code);
|
|
59
|
+
if (row.content_hash !== currentHash) {
|
|
60
|
+
return undefined;
|
|
61
|
+
}
|
|
62
|
+
try {
|
|
63
|
+
return normalizePersistedFullRead(JSON.parse(row.payload_json), filePath);
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
return undefined;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
export function savePersistedFullRead(evidence) {
|
|
70
|
+
const now = new Date().toISOString();
|
|
71
|
+
const code = fs.readFileSync(evidence.filePath, "utf-8");
|
|
72
|
+
const contentHash = computeReadContentHash(code);
|
|
73
|
+
withPersistedReadDb((db) => db.prepare(`
|
|
74
|
+
INSERT INTO agent_file_reads (
|
|
75
|
+
file_path,
|
|
76
|
+
content_hash,
|
|
77
|
+
read_mode,
|
|
78
|
+
payload_json,
|
|
79
|
+
created_at,
|
|
80
|
+
updated_at
|
|
81
|
+
) VALUES (?, ?, 'full', ?, ?, ?)
|
|
82
|
+
ON CONFLICT(file_path, read_mode) DO UPDATE SET
|
|
83
|
+
content_hash = excluded.content_hash,
|
|
84
|
+
payload_json = excluded.payload_json,
|
|
85
|
+
updated_at = excluded.updated_at
|
|
86
|
+
`).run(evidence.filePath, contentHash, JSON.stringify(evidence), now, now));
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=persistence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persistence.js","sourceRoot":"","sources":["../../../src/agent/read/persistence.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Persists reusable full-read evidence for the modular agent by file content hash.\n *\n * Why this file exists:\n * - full reads are expensive and should be reused across later runs when file bytes did not change\n * - the new agent needs one small owner for read persistence instead of mixing DB logic into the loop\n * - reuse rules for persisted reads should stay content-based and separate from older query-based cache rules\n */\nimport fs from \"fs\";\nimport { createHash } from \"crypto\";\nimport { getDbForRepo } from \"../../db/client.js\";\nimport type { AgentReadEvidence } from \"../types.js\";\nimport type { Database as DatabaseType } from \"better-sqlite3\";\n\ninterface PersistedFullReadRow {\n file_path: string;\n content_hash: string;\n read_mode: string;\n payload_json: string;\n}\n\nfunction withPersistedReadDb<T>(fn: (db: DatabaseType) => T): T | undefined {\n try {\n const db = getDbForRepo();\n return fn(db);\n } catch {\n return undefined;\n }\n}\n\nfunction normalizePersistedFullRead(payload: unknown, filePath: string): AgentReadEvidence | undefined {\n if (!payload || typeof payload !== \"object\") {\n return undefined;\n }\n const evidence = payload as Partial<AgentReadEvidence>;\n const summary = typeof evidence.summary === \"string\" ? evidence.summary : undefined;\n const recordedAt = typeof evidence.recordedAt === \"string\" ? evidence.recordedAt : undefined;\n if (!summary || !recordedAt) {\n return undefined;\n }\n return {\n ...evidence,\n filePath,\n readMode: \"full\",\n summary,\n snippets: Array.isArray(evidence.snippets) ? evidence.snippets.map((snippet) => String(snippet)) : [],\n matchedTerms: Array.isArray(evidence.matchedTerms) ? evidence.matchedTerms.map((term) => String(term)) : [],\n relevantContext: Array.isArray(evidence.relevantContext)\n ? evidence.relevantContext.filter((item): item is AgentReadEvidence[\"relevantContext\"][number] => {\n return typeof item?.kind === \"string\" && typeof item?.text === \"string\";\n })\n : [],\n recordedAt,\n };\n}\n\nexport function computeReadContentHash(code: string): string {\n return createHash(\"sha1\").update(code).digest(\"hex\").slice(0, 12);\n}\n\nexport function loadPersistedFullRead(filePath: string, code: string): AgentReadEvidence | undefined {\n const row = withPersistedReadDb((db) => db.prepare(`\n SELECT file_path, content_hash, read_mode, payload_json\n FROM agent_file_reads\n WHERE file_path = ? AND read_mode = 'full'\n `).get(filePath) as PersistedFullReadRow | undefined);\n if (!row) {\n return undefined;\n }\n const currentHash = computeReadContentHash(code);\n if (row.content_hash !== currentHash) {\n return undefined;\n }\n try {\n return normalizePersistedFullRead(JSON.parse(row.payload_json), filePath);\n } catch {\n return undefined;\n }\n}\n\nexport function savePersistedFullRead(evidence: AgentReadEvidence): void {\n const now = new Date().toISOString();\n const code = fs.readFileSync(evidence.filePath, \"utf-8\");\n const contentHash = computeReadContentHash(code);\n withPersistedReadDb((db) => db.prepare(`\n INSERT INTO agent_file_reads (\n file_path,\n content_hash,\n read_mode,\n payload_json,\n created_at,\n updated_at\n ) VALUES (?, ?, 'full', ?, ?, ?)\n ON CONFLICT(file_path, read_mode) DO UPDATE SET\n content_hash = excluded.content_hash,\n payload_json = excluded.payload_json,\n updated_at = excluded.updated_at\n `).run(\n evidence.filePath,\n contentHash,\n JSON.stringify(evidence),\n now,\n now\n ));\n}\n"]}
|