Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
3aa633b
fix(code-index): port fork reliability fixes (#34, #67, #102, #110)
Nov 12, 2026
bf17260
fix(code-index): address first CI run (format, knip entries, Vitest 4…
Nov 12, 2026
947cea7
fix(code-index): address second CI run (orchestrator class mocks, wat…
Nov 12, 2026
a6186ae
chore(lint): prune code-index ESLint suppressions made stale by the port
Nov 12, 2026
b8fd8e1
chore(lint): prune stale CodebaseSearchTool suppression removed by th…
Nov 12, 2026
c13334a
fix(code-index): resolve type errors in orchestrator and test doubles
Nov 12, 2026
d510201
build: drop unused p-limit; patch @qdrant/js-client-rest Retry-After …
Nov 12, 2026
9309d5e
chore(code-index): remove production-dead code left by the port (knip…
Nov 12, 2026
b2fc597
build: skip non-numeric Retry-After in the Qdrant patch so HTTP dates…
Nov 12, 2026
92c9b71
test(code-index): await both concurrent verify counts in the Retry-Af…
Nov 12, 2026
8844575
fix(code-index): load web-tree-sitter's CJS build in the parse worker…
Nov 12, 2026
b592702
fix(code-index): address CodeRabbit review feedback
Nov 12, 2026
4aca2e6
fix(code-index): address CodeRabbit round 2 feedback
Nov 12, 2026
bb181b2
test(code-index): match trimmed embedding input; cover registered rec…
Nov 12, 2026
dc8deae
fix(code-index): guard pacer deadline and use literal incomplete defa…
Nov 12, 2026
bd8d4f6
test(code-index): cover provider deadline that becomes out-of-range a…
Nov 13, 2026
8e04d28
style(code-index): apply prettier to provider pacer test
Nov 13, 2026
2c63f85
fix(code-index): treat missing source files as removed (port fork #116)
Nov 13, 2026
5393fa7
refactor(code-index): remove parse worker, log module and layout-only…
Nov 13, 2026
26721b4
refactor(code-index): single file writer, pause-gate pacer, counter-m…
Nov 13, 2026
35e1aa2
fix(code-index): route scanner and watcher writes through one writer;…
Nov 13, 2026
850a2cc
fix(code-index): single-attempt providers with rate-limit scopes; Bed…
Nov 13, 2026
51dfbbd
test(code-index): visual specs for failed-file popover, provider-wait…
Nov 13, 2026
88d62cf
style(code-index): apply prettier
Nov 13, 2026
bbcd375
fix(code-index): address review findings and CI failures
Nov 13, 2026
fb2e354
fix(code-index): align tests with single-attempt writer flow and keep…
Nov 13, 2026
532a8fb
fix(code-index): resolve lint, knip and file-watcher test failures
Nov 14, 2026
7ad9a7e
fix(code-index): prune stale lint suppressions and make failure-path …
Nov 14, 2026
fb682aa
fix(code-index): type failedFileSummary as optional and complete stat…
Nov 14, 2026
e12706a
fix(code-index): keep failedFileSummary optional in status type
Nov 14, 2026
338c058
fix(code-index): settle watcher status, classify Qdrant 429s, clear r…
Nov 14, 2026
413ba2f
fix(i18n): translate code index cache and quota errors
Nov 14, 2026
c6ee22c
fix(code-index): isolate Qdrant pacer per test and fix CI test failures
Nov 14, 2026
e8a075f
fix(code-index): restore detached start in webview startIndexing handler
Nov 14, 2026
5061b15
fix(code-index): start from Error in one step, count pending watcher …
Nov 14, 2026
2d2f878
test(code-index): use providerIdentifiers.openai in manager reliabili…
Nov 14, 2026
df9f19b
fix(code-index): keep failure-only entries when file listing is trunc…
Nov 14, 2026
851b844
fix(code-index): remove confirmed-missing failure files on truncated …
Nov 14, 2026
e70cb6d
test(code-index): assert abort reason, cover truncated listing at sta…
Nov 14, 2026
83e455a
fix(code-index): drop finish events from batches of a stopped session
Nov 14, 2026
198520c
test(code-index): read abort reason after scan settles in scanner abo…
Nov 14, 2026
a3ae407
fix(code-index): drop progress from stopped watcher chunks; clean up …
Nov 14, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@ demo.gif filter=lfs diff=lfs merge=lfs -text
assets/docs/demo.gif filter=lfs diff=lfs merge=lfs -text
src/assets/docs/demo.gif filter=lfs diff=lfs merge=lfs -text

# pnpm hashes patch bytes; keep LF on every checkout.
patches/*.patch text eol=lf

# Test snapshot files - mark as linguist-generated to exclude from GitHub language statistics
*.snap linguist-generated=true

Expand Down
1 change: 0 additions & 1 deletion knip.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@
"!**/__tests__/**!",
"!vitest.setup.ts!",
"!utils/vitest-verbosity.ts!",
"!utils/TaskSemaphore.ts!",
"!utils/WorkspacePathResolver.ts!",
"!test-utils/**!",
"!utils/versionToken.ts!",
Expand Down
3 changes: 3 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,9 @@
"zod": "4.6.7",
"@lmstudio/sdk>zod": "3.25.76",
"katex": "0.19.1"
},
"patchedDependencies": {
"@qdrant/js-client-rest@1.20.0": "patches/@qdrant__js-client-rest@1.20.0.patch"
}
}
}
23 changes: 23 additions & 0 deletions packages/types/src/vscode-extension-host.ts
Original file line number Diff line number Diff line change
Expand Up @@ -857,6 +857,9 @@ export type CheckpointRestorePayload = z.infer<typeof checkoutRestorePayloadSche
export interface IndexingStatusPayload {
state: "Standby" | "Indexing" | "Indexed" | "Error" | "Stopping"
message: string
failedFiles?: FailedFileStatus[]
failedFileSummary?: FailedFileSummary
providerWaits?: ProviderWaitStatus[]
}

export interface IndexClearedPayload {
Expand All @@ -873,6 +876,23 @@ export type WebViewMessagePayload =
| EditQueuedMessagePayload
| { item: MarketplaceItem; parameters?: Record<string, string> }

export interface FailedFileStatus {
path: string
activity: "read" | "parse" | "embed" | "upsert" | "delete"
reason: string
state: "retrying" | "exhausted"
}

export interface FailedFileSummary extends FailedFileStatus {
count: number
}

export interface ProviderWaitStatus {
service: string
resumeAt?: number
waitingFiles: string[]
}

export interface IndexingStatus {
systemStatus: string
message?: string
Expand All @@ -882,6 +902,9 @@ export interface IndexingStatus {
workspacePath?: string
workspaceEnabled?: boolean
autoEnableDefault?: boolean
failedFiles?: FailedFileStatus[]
failedFileSummary?: FailedFileSummary
providerWaits?: ProviderWaitStatus[]
}

export interface IndexingStatusUpdateMessage {
Expand Down
56 changes: 56 additions & 0 deletions patches/@qdrant__js-client-rest@1.20.0.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
diff --git a/dist/browser/index.cjs b/dist/browser/index.cjs
--- a/dist/browser/index.cjs
+++ b/dist/browser/index.cjs
@@ -991,8 +991,8 @@
}
catch (error) {
if (error instanceof ApiError && error.status === 429) {
- const retryAfterHeader = error.headers.get('retry-after')?.[0];
- if (retryAfterHeader) {
+ const retryAfterHeader = error.headers.get('retry-after');
+ if (retryAfterHeader && !isNaN(Number(retryAfterHeader))) {
throw new QdrantClientResourceExhaustedError(error.message, retryAfterHeader);
}
}
diff --git a/dist/browser/index.js b/dist/browser/index.js
--- a/dist/browser/index.js
+++ b/dist/browser/index.js
@@ -989,8 +989,8 @@
}
catch (error) {
if (error instanceof ApiError && error.status === 429) {
- const retryAfterHeader = error.headers.get('retry-after')?.[0];
- if (retryAfterHeader) {
+ const retryAfterHeader = error.headers.get('retry-after');
+ if (retryAfterHeader && !isNaN(Number(retryAfterHeader))) {
throw new QdrantClientResourceExhaustedError(error.message, retryAfterHeader);
}
}
diff --git a/dist/cjs/api-client.js b/dist/cjs/api-client.js
--- a/dist/cjs/api-client.js
+++ b/dist/cjs/api-client.js
@@ -51,8 +51,8 @@
}
catch (error) {
if (error instanceof openapi_typescript_fetch_1.ApiError && error.status === 429) {
- const retryAfterHeader = error.headers.get('retry-after')?.[0];
- if (retryAfterHeader) {
+ const retryAfterHeader = error.headers.get('retry-after');
+ if (retryAfterHeader && !isNaN(Number(retryAfterHeader))) {
throw new errors_js_1.QdrantClientResourceExhaustedError(error.message, retryAfterHeader);
}
}
diff --git a/dist/esm/api-client.js b/dist/esm/api-client.js
--- a/dist/esm/api-client.js
+++ b/dist/esm/api-client.js
@@ -47,8 +47,8 @@
}
catch (error) {
if (error instanceof ApiError && error.status === 429) {
- const retryAfterHeader = error.headers.get('retry-after')?.[0];
- if (retryAfterHeader) {
+ const retryAfterHeader = error.headers.get('retry-after');
+ if (retryAfterHeader && !isNaN(Number(retryAfterHeader))) {
throw new QdrantClientResourceExhaustedError(error.message, retryAfterHeader);
}
}
11 changes: 8 additions & 3 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions src/__tests__/extension.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -388,6 +388,9 @@ describe("extension.ts", () => {
workspacePath: "/workspace",
workspaceEnabled: true,
autoEnableDefault: true,
failedFiles: [],
failedFileSummary: undefined,
providerWaits: [],
}
scope["statusManager"]!["publishStatus"](status)
await Promise.resolve()
Expand Down Expand Up @@ -434,6 +437,9 @@ describe("extension.ts", () => {
workspacePath: "/workspace",
workspaceEnabled: true,
autoEnableDefault: true,
failedFiles: [],
failedFileSummary: undefined,
providerWaits: [],
}
scope["statusManager"]!["publishStatus"](status)
await Promise.resolve()
Expand Down
40 changes: 31 additions & 9 deletions src/core/tools/CodebaseSearchTool.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import { Task } from "../task/Task"
import { CodeIndexManagerRegistry } from "../../services/code-index/code-index-manager-registry"
import { getWorkspacePath } from "../../utils/path"
import { formatResponse } from "../prompts/responses"
import { VectorStoreSearchResult } from "../../services/code-index/interfaces"
import type { ToolUse } from "../../shared/tools"

import { BaseTool, ToolCallbacks } from "./BaseTool"
Expand Down Expand Up @@ -78,18 +77,36 @@ export class CodebaseSearchTool extends BaseTool<"codebase_search"> {
throw new Error("Code Indexing is not initialized for this workspace.")
}

const searchResults: VectorStoreSearchResult[] = await manager.searchIndex(query, directoryPrefix)

if (!searchResults || searchResults.length === 0) {
pushToolResult(`No relevant code snippets found for the query: "${query}"`)
return
}
const {
results: searchResults,
incomplete,
failedPaths,
waitingPaths,
} = await manager.searchIndex(query, directoryPrefix)
const incompleteNotice = incomplete
Comment thread
coderabbitai[bot] marked this conversation as resolved.
Resolved
? [
"Partial index: results may be incomplete.",
...(failedPaths.length ? ["Failed files:", ...failedPaths.map((file) => `- ${file}`)] : []),
...(waitingPaths.length
? [
"Waiting files (indexing resumes automatically):",
...waitingPaths.map((file) => `- ${file}`),
]
: []),
].join("\n") + "\n\n"
: ""

const jsonResult = {
query,
results: [],
incomplete,
failedPaths,
waitingPaths,
} as {
query: string
incomplete: boolean
failedPaths: string[]
waitingPaths: string[]
results: Array<{
filePath: string
score: number
Expand Down Expand Up @@ -117,7 +134,12 @@ export class CodebaseSearchTool extends BaseTool<"codebase_search"> {
const payload = { tool: "codebaseSearch", content: jsonResult }
await task.say("codebase_search_result", JSON.stringify(payload))

const output = `Query: ${query}
if (jsonResult.results.length === 0) {
pushToolResult(`${incompleteNotice}No relevant code snippets found for the query: "${query}"`)
return
}

const output = `${incompleteNotice}Query: ${query}
Results:

${jsonResult.results
Expand All @@ -131,7 +153,7 @@ Code Chunk: ${result.codeChunk}
.join("\n")}`

pushToolResult(output)
} catch (error: any) {
} catch (error) {
await handleError("codebase_search", error)
}
}
Expand Down
Loading
Loading