fix(MULTIVERSION-0001): fix version isolation, 404 on unknown version, commit-hash lookup, and searchModeUsed
Bug 1: Thread version tag from run() into crawl() via getVersionTag() helper so
LocalCrawler and GithubCrawler receive the correct ref when indexing a named
version instead of always crawling HEAD.
Bug 2: Return HTTP 404 with code VERSION_NOT_FOUND when a requested version tag
is not found in repository_versions, instead of silently falling back to a
cross-version mixed result set.
Bug 4: Before returning 404, attempt a commit_hash prefix match (min 7 chars)
so callers can request a version by full or short SHA.
Bug 3: Change HybridSearchService.search() to return
{ results, searchModeUsed } and propagate searchModeUsed through
ContextResponseMetadata and ContextJsonResponseDto so callers can see which
strategy (keyword / semantic / hybrid / keyword_fallback) was actually used.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -198,6 +198,7 @@ export const GET: RequestHandler = async ({ url }) => {
|
||||
let versionId: string | undefined;
|
||||
let resolvedVersion: RawVersionRow | undefined;
|
||||
if (parsed.version) {
|
||||
// Try exact tag match first.
|
||||
resolvedVersion = db
|
||||
.prepare<
|
||||
[string, string],
|
||||
@@ -205,12 +206,33 @@ export const GET: RequestHandler = async ({ url }) => {
|
||||
>(`SELECT id, tag FROM repository_versions WHERE repository_id = ? AND tag = ?`)
|
||||
.get(parsed.repositoryId, parsed.version);
|
||||
|
||||
// Version not found is not fatal — fall back to default branch.
|
||||
versionId = resolvedVersion?.id;
|
||||
// Fall back to commit hash prefix match (min 7 chars).
|
||||
if (!resolvedVersion && parsed.version.length >= 7) {
|
||||
resolvedVersion = db
|
||||
.prepare<
|
||||
[string, string],
|
||||
RawVersionRow
|
||||
>(
|
||||
`SELECT id, tag FROM repository_versions
|
||||
WHERE repository_id = ? AND commit_hash LIKE ?`
|
||||
)
|
||||
.get(parsed.repositoryId, `${parsed.version}%`);
|
||||
}
|
||||
|
||||
if (!resolvedVersion) {
|
||||
return new Response(
|
||||
JSON.stringify({
|
||||
error: `Version ${parsed.version} not found for library ${parsed.repositoryId}`,
|
||||
code: 'VERSION_NOT_FOUND'
|
||||
}),
|
||||
{ status: 404, headers: { 'Content-Type': 'application/json', ...CORS_HEADERS } }
|
||||
);
|
||||
}
|
||||
versionId = resolvedVersion.id;
|
||||
}
|
||||
|
||||
// Execute hybrid search (falls back to FTS5 when no embedding provider is set).
|
||||
const searchResults = await hybridService.search(query, {
|
||||
const { results: searchResults, searchModeUsed } = await hybridService.search(query, {
|
||||
repositoryId: parsed.repositoryId,
|
||||
versionId,
|
||||
limit: 50, // fetch more than needed; token budget will trim
|
||||
@@ -242,6 +264,7 @@ export const GET: RequestHandler = async ({ url }) => {
|
||||
const metadata: ContextResponseMetadata = {
|
||||
localSource: repo.source === 'local',
|
||||
resultCount: selectedResults.length,
|
||||
searchModeUsed,
|
||||
repository: {
|
||||
id: repo.id,
|
||||
title: repo.title,
|
||||
|
||||
Reference in New Issue
Block a user