opencode-rag-plugin 1.11.0 → 1.12.4

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.
Files changed (44) hide show
  1. package/ReadMe.md +14 -6
  2. package/dist/api.js +21 -82
  3. package/dist/api.js.map +1 -1
  4. package/dist/chunker/image.d.ts +14 -0
  5. package/dist/chunker/image.js +356 -0
  6. package/dist/chunker/image.js.map +1 -0
  7. package/dist/chunker/loader.js +5 -0
  8. package/dist/chunker/loader.js.map +1 -1
  9. package/dist/chunker/xml.js +1 -1
  10. package/dist/chunker/xml.js.map +1 -1
  11. package/dist/cli.js +123 -108
  12. package/dist/cli.js.map +1 -1
  13. package/dist/core/bootstrap.d.ts +18 -0
  14. package/dist/core/bootstrap.js +80 -0
  15. package/dist/core/bootstrap.js.map +1 -0
  16. package/dist/core/config.d.ts +15 -0
  17. package/dist/core/config.js +39 -3
  18. package/dist/core/config.js.map +1 -1
  19. package/dist/core/interfaces.d.ts +1 -0
  20. package/dist/core/resolve-api-key.js +3 -0
  21. package/dist/core/resolve-api-key.js.map +1 -1
  22. package/dist/core/runtime-overrides.d.ts +5 -0
  23. package/dist/core/runtime-overrides.js +17 -0
  24. package/dist/core/runtime-overrides.js.map +1 -1
  25. package/dist/describer/describer.js +1 -1
  26. package/dist/describer/describer.js.map +1 -1
  27. package/dist/embedder/health.d.ts +25 -0
  28. package/dist/embedder/health.js +346 -0
  29. package/dist/embedder/health.js.map +1 -0
  30. package/dist/index.d.ts +2 -1
  31. package/dist/index.js +1 -0
  32. package/dist/index.js.map +1 -1
  33. package/dist/indexer.d.ts +1 -1
  34. package/dist/indexer.js +192 -22
  35. package/dist/indexer.js.map +1 -1
  36. package/dist/mcp/server.js +7 -61
  37. package/dist/mcp/server.js.map +1 -1
  38. package/dist/retriever/keyword-index.js +38 -5
  39. package/dist/retriever/keyword-index.js.map +1 -1
  40. package/dist/web/api.d.ts +8 -0
  41. package/dist/web/api.js +81 -0
  42. package/dist/web/api.js.map +1 -1
  43. package/dist/web/ui/index.html +503 -98
  44. package/package.json +3 -2
package/ReadMe.md CHANGED
@@ -1,8 +1,8 @@
1
1
  # OpenCodeRAG
2
2
 
3
- OpenCodeRAG is a **local-first RAG plugin** for semantic code search. It converts your codebase into vector indices and retrieves relevant code chunks on natural language queries. The primary aim is to save tokens by replacing full-file reads with targeted chunk retrieval and to speed-up tool calls for large codebases. Integrates seamlessly with [OpenCode](https://opencode.ai) and works as standalone MCP server or CLI tool.
3
+ OpenCodeRAG is a **local-first RAG plugin** for semantic code search. It converts your codebase into vector indices and retrieves relevant code chunks on natural language queries. The primary aim is to save tokens by replacing full-file reads with targeted chunk retrieval and to speed-up tool calls for large codebases. Integrates seamlessly with [OpenCode](https://opencode.ai) and works as standalone MCP server or CLI tool.
4
4
 
5
- You don't need a dedicated GPU to run embedding LLMs, smaller models can still run performant on modern CPUs.
5
+ You don't need a dedicated GPU to run smaller embedding LLMs, as these models can still run performant on modern CPUs.
6
6
 
7
7
  [![npm version](https://img.shields.io/npm/v/opencode-rag-plugin.svg)](https://www.npmjs.com/package/opencode-rag-plugin)
8
8
 
@@ -25,11 +25,11 @@ opencode-rag init
25
25
  # 3. Index your workspace
26
26
  opencode-rag index
27
27
 
28
- # 4. Search
28
+ # 4. CLI search test
29
29
  opencode-rag query "authentication middleware"
30
30
  ```
31
31
 
32
- **Prerequisites:** Node.js v22+, [Ollama](https://ollama.ai) (default) or other LLM-hosters with installed embedding model (e.g. embeddinggemma).
32
+ **Prerequisites:** Node.js v22+, [Ollama](https://ollama.ai) (default) or other LLM-hosters (OpenAI-, Google- or Anthropic-compatible).
33
33
 
34
34
  ## Key Features
35
35
 
@@ -38,10 +38,11 @@ opencode-rag query "authentication middleware"
38
38
  | **MCP server** | `opencode-rag mcp` - stdio-based MCP server exposing `search_semantic`, `get_file_skeleton`, `find_usages` tools for any MCP-compatible client |
39
39
  | **AST chunking** | 26 languages via tree-sitter (TS, JS, Python, Java, Go, Rust, C/C++, C#, Ruby, Kotlin, Swift, Bash, PHP, PowerShell, SQL, JSON, HTML, CSS, XML, YAML, TOML, INI, Dockerfile, Markdown, LaTeX, Razor) |
40
40
  | **Document support** | Markdown, LaTeX, PDF, DOCX, DOC, Excel |
41
+ | **Image indexing** | Describe images via vision LLMs (Ollama, OpenAI, Anthropic, Gemini) and store descriptions as searchable vector chunks |
41
42
  | **Hybrid search** | Vector similarity + TF×IDF keyword fusion |
42
43
  | **OpenCode plugin** | Auto-inject context, read-tool override, TUI settings, Ctrl+Enter to add RAG context, MCP registration on `init` |
43
44
  | **Incremental indexing** | File-hash manifest, background watcher, auto-rebuild on corruption |
44
- | **Privacy-first** | All processing stays local with Ollama |
45
+ | **Privacy-first** | All processing stays local (when using Ollama) |
45
46
  | **CLI** | `index`, `query`, `status`, `list`, `show`, `dump`, `clear`, `init`, `ui`, `mcp` |
46
47
  | **Programmatic API** | TypeScript `search()`, `indexWorkspace()`, `getContext()`, `validateConfig()`, `scanWorkspace()`, `createBackgroundIndexer()`, `getIndexStatusSummary()` |
47
48
  | **Proxy-aware** | Corporate proxy support with raw-socket localhost bypass |
@@ -74,6 +75,13 @@ Launch with `opencode-rag ui`. See [Web UI documentation](doc/webui.md) for deta
74
75
  | [Troubleshooting](doc/troubleshooting.md) | Common issues, logging, debugging |
75
76
  | [Roadmap](doc/roadmap.md) | Completed items, short/mid/long-term plans |
76
77
 
78
+ ## Image Indexing
79
+
80
+ OpenCodeRAG can index image files (PNG, JPEG, WebP, etc.) by sending them to a vision-capable LLM and storing the generated text descriptions as searchable vector chunks. This makes visual assets discoverable via natural language queries (e.g., "login screen screenshot", "architecture diagram").
81
+
82
+ **Supported providers:** Ollama, OpenAI, Anthropic, Google Gemini compatible providers.
83
+ **Disabled by default** — enable in `opencode-rag.json` to opt in.
84
+
77
85
  ## MCP Server
78
86
 
79
87
  OpenCodeRAG ships a stdio-based [MCP (Model Context Protocol)](https://spec.modelcontextprotocol.io/) server that exposes semantic code tools to any MCP-compatible client (Claude Desktop, OpenCode, Cursor, etc.).
@@ -147,7 +155,7 @@ Token counting uses tiktoken BPE (cl100k_base) for accurate code tokenization. S
147
155
 
148
156
  ## Privacy & Security
149
157
 
150
- **100% local by default.** Embeddings are generated locally via Ollama. The vector database stays in your project directory. **No source code or embeddings leave your machine** unless you explicitly configure a third-party API.
158
+ **100% local by default.** By default, embeddings are generated locally via Ollama. The vector database stays in your project directory. **No source code or embeddings leave your machine** unless you explicitly configure to use a third-party API.
151
159
 
152
160
  ## License
153
161
 
package/dist/api.js CHANGED
@@ -1,59 +1,6 @@
1
- import path from "node:path";
2
- import { existsSync } from "node:fs";
3
- import { loadConfig, DEFAULT_CONFIG } from "./core/config.js";
4
- import { resolveApiKey } from "./core/resolve-api-key.js";
5
- import { loadChunkersFromConfig } from "./chunker/loader.js";
6
- import { createEmbedder } from "./embedder/factory.js";
7
- import { createDescriptionProvider } from "./describer/factory.js";
8
- import { LanceDBStore } from "./vectorstore/lancedb.js";
1
+ import { resolveRagContext } from "./core/bootstrap.js";
9
2
  import { retrieve } from "./retriever/retriever.js";
10
- import { KeywordIndex } from "./retriever/keyword-index.js";
11
3
  import { runIndexPass } from "./indexer.js";
12
- async function resolveConfig(cwd, configPath) {
13
- const workDir = cwd ?? process.cwd();
14
- if (configPath) {
15
- const resolved = path.resolve(configPath);
16
- const cfg = loadConfig(resolved);
17
- resolveApiKey(cfg, workDir);
18
- await loadChunkersFromConfig(cfg, path.dirname(resolved));
19
- return cfg;
20
- }
21
- const locations = [
22
- path.join(workDir, "opencode-rag.json"),
23
- path.join(workDir, ".opencode", "opencode-rag.json"),
24
- path.join(workDir, ".opencode", "rag.json"),
25
- ];
26
- for (const loc of locations) {
27
- if (existsSync(loc)) {
28
- const cfg = loadConfig(loc);
29
- resolveApiKey(cfg, workDir);
30
- await loadChunkersFromConfig(cfg, path.dirname(loc));
31
- return cfg;
32
- }
33
- }
34
- return { ...DEFAULT_CONFIG };
35
- }
36
- async function probeDimension(embedder) {
37
- try {
38
- const probe = await embedder.embed(["dimension-probe"], "query");
39
- if (probe && probe[0] && probe[0].length > 0 && typeof probe[0][0] === "number") {
40
- return probe[0].length;
41
- }
42
- }
43
- catch {
44
- // fallback to 384
45
- }
46
- return 384;
47
- }
48
- async function loadKeywordIndex(storePath) {
49
- try {
50
- const idx = await KeywordIndex.load(storePath);
51
- return idx;
52
- }
53
- catch {
54
- return new KeywordIndex(storePath);
55
- }
56
- }
57
4
  function formatContextResults(results) {
58
5
  if (results.length === 0)
59
6
  return "No matching chunks found.";
@@ -72,45 +19,37 @@ function formatContextResults(results) {
72
19
  return lines.join("\n");
73
20
  }
74
21
  export async function search(query, options = {}) {
75
- const cfg = await resolveConfig(options.cwd, options.configPath);
76
- const storePath = path.resolve(options.cwd ?? process.cwd(), cfg.vectorStore.path);
77
- const embedder = createEmbedder(cfg);
78
- const dimension = await probeDimension(embedder);
79
- const store = new LanceDBStore(storePath, dimension);
80
- const keywordIndex = await loadKeywordIndex(storePath);
81
- return retrieve(query, embedder, store, {
82
- topK: options.topK ?? cfg.retrieval.topK,
83
- minScore: options.minScore ?? cfg.retrieval.minScore,
84
- keywordIndex,
85
- keywordWeight: options.keywordWeight ?? cfg.retrieval.hybridSearch?.keywordWeight ?? 0.4,
86
- queryPrefix: cfg.embedding.queryPrefix,
22
+ const ctx = await resolveRagContext({
23
+ cwd: options.cwd,
24
+ configPath: options.configPath,
25
+ });
26
+ return retrieve(query, ctx.embedder, ctx.store, {
27
+ topK: options.topK ?? ctx.config.retrieval.topK,
28
+ minScore: options.minScore ?? ctx.config.retrieval.minScore,
29
+ keywordIndex: ctx.keywordIndex,
30
+ keywordWeight: options.keywordWeight ?? ctx.config.retrieval.hybridSearch?.keywordWeight ?? 0.4,
31
+ queryPrefix: ctx.config.embedding.queryPrefix,
87
32
  explain: options.explain,
88
33
  });
89
34
  }
90
35
  export async function indexWorkspace(cwd, options = {}) {
91
36
  const workDir = cwd ?? process.cwd();
92
- const cfg = await resolveConfig(workDir, options.configPath);
93
- const storePath = path.resolve(workDir, cfg.vectorStore.path);
94
- const embedder = createEmbedder(cfg);
95
- const dimension = await probeDimension(embedder);
96
- const store = new LanceDBStore(storePath, dimension);
97
- const keywordIndex = await loadKeywordIndex(storePath);
98
- const descriptionConfig = cfg.description;
99
- const descriptionProvider = descriptionConfig?.enabled
100
- ? createDescriptionProvider(descriptionConfig)
101
- : undefined;
37
+ const ctx = await resolveRagContext({
38
+ cwd: workDir,
39
+ configPath: options.configPath,
40
+ });
102
41
  if (options.onProgress) {
103
42
  options.onProgress(`Indexing ${workDir}...`);
104
43
  }
105
44
  const stats = await runIndexPass({
106
45
  cwd: workDir,
107
- storePath,
108
- config: cfg,
109
- store,
110
- embedder,
46
+ storePath: ctx.storePath,
47
+ config: ctx.config,
48
+ store: ctx.store,
49
+ embedder: ctx.embedder,
111
50
  force: options.force ?? false,
112
- keywordIndex,
113
- descriptionProvider,
51
+ keywordIndex: ctx.keywordIndex,
52
+ descriptionProvider: ctx.descriptionProvider,
114
53
  });
115
54
  return stats;
116
55
  }
package/dist/api.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { Chunker, Chunk } from "../core/interfaces.js";
2
+ import type { ImageDescriptionConfig } from "../core/config.js";
3
+ export declare const SUPPORTED_IMAGE_EXTENSIONS: Set<string>;
4
+ export declare function getMimeType(ext: string): string;
5
+ export interface ImageVisionProvider {
6
+ describeImage(imageBase64: string, mimeType: string, prompt: string, abort?: AbortSignal): Promise<string>;
7
+ }
8
+ export declare function createImageVisionProvider(config: ImageDescriptionConfig): ImageVisionProvider;
9
+ export declare class ImageChunker implements Chunker {
10
+ readonly language = "image";
11
+ readonly fileExtensions: string[];
12
+ constructor(extensions: string[]);
13
+ chunk(filePath: string, content: string): Promise<Chunk[]>;
14
+ }
@@ -0,0 +1,356 @@
1
+ import { postJson } from "../embedder/http.js";
2
+ import { uuid } from "./uuid.js";
3
+ const MAX_CHUNK_CHARS = 4000;
4
+ const MIN_GROUP_CHARS = 300;
5
+ const PARAGRAPH_SPLIT = /\n\s*\n/;
6
+ const VISION_RETRY_MAX = 2;
7
+ const VISION_RETRY_BASE_DELAY_MS = 1000;
8
+ const VISION_RETRYABLE_STATUSES = new Set([408, 429, 500, 502, 503, 504]);
9
+ function visionSleep(ms) {
10
+ return new Promise((resolve) => setTimeout(resolve, ms));
11
+ }
12
+ export const SUPPORTED_IMAGE_EXTENSIONS = new Set([
13
+ ".png", ".jpg", ".jpeg", ".gif", ".webp", ".bmp",
14
+ ]);
15
+ const MIME_TYPES = {
16
+ png: "image/png",
17
+ jpg: "image/jpeg",
18
+ jpeg: "image/jpeg",
19
+ gif: "image/gif",
20
+ webp: "image/webp",
21
+ bmp: "image/bmp",
22
+ svg: "image/svg+xml",
23
+ };
24
+ export function getMimeType(ext) {
25
+ return MIME_TYPES[ext.toLowerCase().replace(/^\./, "")] || "image/png";
26
+ }
27
+ class OllamaImageVisionProvider {
28
+ baseUrl;
29
+ model;
30
+ timeoutMs;
31
+ think;
32
+ numCtx;
33
+ proxy;
34
+ constructor(config) {
35
+ this.baseUrl = config.baseUrl.replace(/\/+$/, "");
36
+ this.model = config.model;
37
+ this.timeoutMs = config.timeoutMs;
38
+ this.think = config.think ?? false;
39
+ this.numCtx = config.numCtx;
40
+ this.proxy = config.proxy;
41
+ }
42
+ async describeImage(imageBase64, mimeType, prompt, abort) {
43
+ const body = {
44
+ model: this.model,
45
+ messages: [
46
+ {
47
+ role: "user",
48
+ content: prompt,
49
+ images: [imageBase64],
50
+ },
51
+ ],
52
+ stream: false,
53
+ think: this.think,
54
+ options: { num_ctx: this.numCtx },
55
+ };
56
+ let lastError;
57
+ for (let attempt = 0; attempt <= VISION_RETRY_MAX; attempt++) {
58
+ const response = await postJson(`${this.baseUrl}/chat`, body, {}, this.timeoutMs, this.proxy);
59
+ if (!response.ok) {
60
+ const text = await response.text();
61
+ const error = new Error(`Ollama vision request failed (${response.status}): ${text}`);
62
+ if (VISION_RETRYABLE_STATUSES.has(response.status) && attempt < VISION_RETRY_MAX) {
63
+ lastError = error;
64
+ await visionSleep(VISION_RETRY_BASE_DELAY_MS * Math.pow(2, attempt));
65
+ continue;
66
+ }
67
+ throw error;
68
+ }
69
+ const json = (await response.json());
70
+ const content = json.message?.content;
71
+ if (content && content.trim().length > 0) {
72
+ return content.trim();
73
+ }
74
+ lastError = new Error(`Ollama vision returned empty response: ${JSON.stringify(json)}`);
75
+ if (attempt < VISION_RETRY_MAX) {
76
+ await visionSleep(VISION_RETRY_BASE_DELAY_MS * Math.pow(2, attempt));
77
+ }
78
+ }
79
+ throw lastError;
80
+ }
81
+ }
82
+ class OpenAIImageVisionProvider {
83
+ baseUrl;
84
+ model;
85
+ apiKey;
86
+ timeoutMs;
87
+ proxy;
88
+ constructor(config) {
89
+ this.baseUrl = config.baseUrl.replace(/\/+$/, "");
90
+ this.model = config.model;
91
+ this.apiKey = config.apiKey ?? "";
92
+ this.timeoutMs = config.timeoutMs;
93
+ this.proxy = config.proxy;
94
+ }
95
+ async describeImage(imageBase64, mimeType, prompt, abort) {
96
+ const url = `${this.baseUrl}${this.baseUrl.endsWith("/v1") ? "" : "/v1"}/chat/completions`;
97
+ const body = {
98
+ model: this.model,
99
+ messages: [
100
+ {
101
+ role: "user",
102
+ content: [
103
+ { type: "text", text: prompt },
104
+ {
105
+ type: "image_url",
106
+ image_url: { url: `data:${mimeType};base64,${imageBase64}` },
107
+ },
108
+ ],
109
+ },
110
+ ],
111
+ max_tokens: 2048,
112
+ };
113
+ const headers = {
114
+ "Content-Type": "application/json",
115
+ };
116
+ if (this.apiKey) {
117
+ headers.Authorization = `Bearer ${this.apiKey}`;
118
+ }
119
+ let lastError;
120
+ for (let attempt = 0; attempt <= VISION_RETRY_MAX; attempt++) {
121
+ const response = await postJson(url, body, headers, this.timeoutMs, this.proxy);
122
+ if (!response.ok) {
123
+ const text = await response.text();
124
+ const error = new Error(`OpenAI vision request failed (${response.status}): ${text}`);
125
+ if (VISION_RETRYABLE_STATUSES.has(response.status) && attempt < VISION_RETRY_MAX) {
126
+ lastError = error;
127
+ await visionSleep(VISION_RETRY_BASE_DELAY_MS * Math.pow(2, attempt));
128
+ continue;
129
+ }
130
+ throw error;
131
+ }
132
+ const json = (await response.json());
133
+ const content = json.choices?.[0]?.message?.content;
134
+ if (content && content.trim().length > 0) {
135
+ return content.trim();
136
+ }
137
+ lastError = new Error(`OpenAI vision returned empty response: ${JSON.stringify(json)}`);
138
+ if (attempt < VISION_RETRY_MAX) {
139
+ await visionSleep(VISION_RETRY_BASE_DELAY_MS * Math.pow(2, attempt));
140
+ }
141
+ }
142
+ throw lastError;
143
+ }
144
+ }
145
+ class AnthropicImageVisionProvider {
146
+ baseUrl;
147
+ model;
148
+ apiKey;
149
+ timeoutMs;
150
+ proxy;
151
+ constructor(config) {
152
+ this.baseUrl = config.baseUrl.replace(/\/+$/, "");
153
+ this.model = config.model;
154
+ this.apiKey = config.apiKey ?? "";
155
+ this.timeoutMs = config.timeoutMs;
156
+ this.proxy = config.proxy;
157
+ }
158
+ async describeImage(imageBase64, mimeType, prompt, abort) {
159
+ const body = {
160
+ model: this.model,
161
+ max_tokens: 2048,
162
+ messages: [
163
+ {
164
+ role: "user",
165
+ content: [
166
+ {
167
+ type: "image",
168
+ source: { type: "base64", media_type: mimeType, data: imageBase64 },
169
+ },
170
+ { type: "text", text: prompt },
171
+ ],
172
+ },
173
+ ],
174
+ };
175
+ const headers = {
176
+ "x-api-key": this.apiKey,
177
+ "anthropic-version": "2023-06-01",
178
+ "Content-Type": "application/json",
179
+ };
180
+ let lastError;
181
+ for (let attempt = 0; attempt <= VISION_RETRY_MAX; attempt++) {
182
+ const response = await postJson(`${this.baseUrl}/messages`, body, headers, this.timeoutMs, this.proxy);
183
+ if (!response.ok) {
184
+ const text = await response.text();
185
+ const error = new Error(`Anthropic vision request failed (${response.status}): ${text}`);
186
+ if (VISION_RETRYABLE_STATUSES.has(response.status) && attempt < VISION_RETRY_MAX) {
187
+ lastError = error;
188
+ await visionSleep(VISION_RETRY_BASE_DELAY_MS * Math.pow(2, attempt));
189
+ continue;
190
+ }
191
+ throw error;
192
+ }
193
+ const json = (await response.json());
194
+ const text = json.content?.find((c) => c.type === "text")?.text;
195
+ if (text && text.trim().length > 0) {
196
+ return text.trim();
197
+ }
198
+ lastError = new Error(`Anthropic vision returned empty response: ${JSON.stringify(json)}`);
199
+ if (attempt < VISION_RETRY_MAX) {
200
+ await visionSleep(VISION_RETRY_BASE_DELAY_MS * Math.pow(2, attempt));
201
+ }
202
+ }
203
+ throw lastError;
204
+ }
205
+ }
206
+ class GeminiImageVisionProvider {
207
+ baseUrl;
208
+ model;
209
+ apiKey;
210
+ timeoutMs;
211
+ proxy;
212
+ constructor(config) {
213
+ this.baseUrl = config.baseUrl.replace(/\/+$/, "");
214
+ this.model = config.model;
215
+ this.apiKey = config.apiKey;
216
+ this.timeoutMs = config.timeoutMs;
217
+ this.proxy = config.proxy;
218
+ }
219
+ async describeImage(imageBase64, mimeType, prompt, abort) {
220
+ const body = {
221
+ contents: [
222
+ {
223
+ role: "user",
224
+ parts: [
225
+ { text: prompt },
226
+ {
227
+ inline_data: {
228
+ mime_type: mimeType,
229
+ data: imageBase64,
230
+ },
231
+ },
232
+ ],
233
+ },
234
+ ],
235
+ };
236
+ const headers = {
237
+ "Content-Type": "application/json",
238
+ };
239
+ const url = this.apiKey
240
+ ? `${this.baseUrl}/models/${this.model}:generateContent?key=${this.apiKey}`
241
+ : `${this.baseUrl}/models/${this.model}:generateContent`;
242
+ let lastError;
243
+ for (let attempt = 0; attempt <= VISION_RETRY_MAX; attempt++) {
244
+ const response = await postJson(url, body, headers, this.timeoutMs, this.proxy);
245
+ if (!response.ok) {
246
+ const text = await response.text();
247
+ const error = new Error(`Gemini vision request failed (${response.status}): ${text}`);
248
+ if (VISION_RETRYABLE_STATUSES.has(response.status) && attempt < VISION_RETRY_MAX) {
249
+ lastError = error;
250
+ await visionSleep(VISION_RETRY_BASE_DELAY_MS * Math.pow(2, attempt));
251
+ continue;
252
+ }
253
+ throw error;
254
+ }
255
+ const json = (await response.json());
256
+ const text = json.candidates?.[0]?.content?.parts?.[0]?.text;
257
+ if (text && text.trim().length > 0) {
258
+ return text.trim();
259
+ }
260
+ lastError = new Error(`Gemini vision returned empty response: ${JSON.stringify(json)}`);
261
+ if (attempt < VISION_RETRY_MAX) {
262
+ await visionSleep(VISION_RETRY_BASE_DELAY_MS * Math.pow(2, attempt));
263
+ }
264
+ }
265
+ throw lastError;
266
+ }
267
+ }
268
+ export function createImageVisionProvider(config) {
269
+ if (config.provider === "anthropic") {
270
+ if (!config.apiKey) {
271
+ throw new Error("Anthropic image provider requires an apiKey");
272
+ }
273
+ return new AnthropicImageVisionProvider(config);
274
+ }
275
+ if (config.provider === "google") {
276
+ return new GeminiImageVisionProvider(config);
277
+ }
278
+ if (config.provider === "openai") {
279
+ if (!config.apiKey) {
280
+ throw new Error("OpenAI image provider requires an apiKey");
281
+ }
282
+ return new OpenAIImageVisionProvider(config);
283
+ }
284
+ return new OllamaImageVisionProvider(config);
285
+ }
286
+ export class ImageChunker {
287
+ language = "image";
288
+ fileExtensions;
289
+ constructor(extensions) {
290
+ this.fileExtensions = extensions;
291
+ }
292
+ async chunk(filePath, content) {
293
+ if (content.trim().length === 0)
294
+ return [];
295
+ const paragraphs = content.split(PARAGRAPH_SPLIT).filter((p) => p.trim().length > 0);
296
+ if (paragraphs.length === 0)
297
+ return [];
298
+ const chunks = [];
299
+ let currentGroup = [];
300
+ let currentSize = 0;
301
+ let paragraphIndex = 0;
302
+ function flush() {
303
+ const text = currentGroup.join("\n\n").trim();
304
+ if (text.length === 0)
305
+ return;
306
+ chunks.push({
307
+ id: uuid(),
308
+ content: text,
309
+ metadata: {
310
+ filePath,
311
+ startLine: paragraphIndex - currentGroup.length + 1,
312
+ endLine: paragraphIndex,
313
+ language: "image",
314
+ },
315
+ });
316
+ currentGroup = [];
317
+ currentSize = 0;
318
+ }
319
+ for (const para of paragraphs) {
320
+ paragraphIndex++;
321
+ const paraLen = para.length;
322
+ if (paraLen > MAX_CHUNK_CHARS) {
323
+ if (currentGroup.length > 0)
324
+ flush();
325
+ chunks.push({
326
+ id: uuid(),
327
+ content: para,
328
+ metadata: {
329
+ filePath,
330
+ startLine: paragraphIndex,
331
+ endLine: paragraphIndex,
332
+ language: "image",
333
+ },
334
+ });
335
+ continue;
336
+ }
337
+ if (currentGroup.length > 0 && currentSize + paraLen > MAX_CHUNK_CHARS) {
338
+ flush();
339
+ }
340
+ currentGroup.push(para);
341
+ currentSize += paraLen;
342
+ if (currentSize >= MIN_GROUP_CHARS && currentGroup.length >= 1) {
343
+ const nextParaStillSmall = paragraphIndex < paragraphs.length &&
344
+ paragraphs[paragraphIndex].length < MIN_GROUP_CHARS;
345
+ if (!nextParaStillSmall) {
346
+ flush();
347
+ }
348
+ }
349
+ }
350
+ if (currentGroup.length > 0) {
351
+ flush();
352
+ }
353
+ return chunks;
354
+ }
355
+ }
356
+ //# sourceMappingURL=image.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image.js","sourceRoot":"","sources":["../../src/chunker/image.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { registerChunker } from "./factory.js";
2
+ import { ImageChunker, SUPPORTED_IMAGE_EXTENSIONS } from "./image.js";
2
3
  import path from "node:path";
3
4
  import { pathToFileURL } from "node:url";
4
5
  async function loadSingleChunker(entry, configDir) {
@@ -18,6 +19,10 @@ async function loadSingleChunker(entry, configDir) {
18
19
  }
19
20
  }
20
21
  export async function loadChunkersFromConfig(config, configDir) {
22
+ if (config.imageDescription?.enabled) {
23
+ const chunker = new ImageChunker([...SUPPORTED_IMAGE_EXTENSIONS]);
24
+ registerChunker(chunker, [...SUPPORTED_IMAGE_EXTENSIONS]);
25
+ }
21
26
  if (!config.chunkers || config.chunkers.length === 0)
22
27
  return;
23
28
  for (const entry of config.chunkers) {
@@ -1 +1 @@
1
- {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/chunker/loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,KAAK,UAAU,iBAAiB,CAC9B,KAAoB,EACpB,SAAiB;IAEjB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACvD,MAAM,SAAS,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC;IAC/C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;QAEpC,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC;QACnC,IAAI,OAAO,OAAO,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;YACxC,OAAO,CAAC,IAAI,CACV,0BAA0B,KAAK,CAAC,MAAM,mEAAmE,CAC1G,CAAC;YACF,OAAO;QACT,CAAC;QAED,eAAe,CAAC,OAAO,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IAC7C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CACV,iDAAiD,KAAK,CAAC,MAAM,IAAI,EAChE,GAAa,CAAC,OAAO,CACvB,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,MAAiB,EACjB,SAAiB;IAEjB,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAE7D,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACpC,MAAM,iBAAiB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IAC5C,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/chunker/loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,OAAO,EAAE,YAAY,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC;AACtE,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,KAAK,UAAU,iBAAiB,CAC9B,KAAoB,EACpB,SAAiB;IAEjB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACvD,MAAM,SAAS,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC;IAC/C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;QAEpC,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC;QACnC,IAAI,OAAO,OAAO,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;YACxC,OAAO,CAAC,IAAI,CACV,0BAA0B,KAAK,CAAC,MAAM,mEAAmE,CAC1G,CAAC;YACF,OAAO;QACT,CAAC;QAED,eAAe,CAAC,OAAO,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IAC7C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CACV,iDAAiD,KAAK,CAAC,MAAM,IAAI,EAChE,GAAa,CAAC,OAAO,CACvB,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,MAAiB,EACjB,SAAiB;IAEjB,IAAI,MAAM,CAAC,gBAAgB,EAAE,OAAO,EAAE,CAAC;QACrC,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC,CAAC,GAAG,0BAA0B,CAAC,CAAC,CAAC;QAClE,eAAe,CAAC,OAAO,EAAE,CAAC,GAAG,0BAA0B,CAAC,CAAC,CAAC;IAC5D,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAE7D,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACpC,MAAM,iBAAiB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IAC5C,CAAC;AACH,CAAC"}
@@ -1,7 +1,7 @@
1
1
  import { TreeSitterChunker } from "./base.js";
2
2
  export class XmlChunker extends TreeSitterChunker {
3
3
  language = "xml";
4
- fileExtensions = [".xml", ".csproj"];
4
+ fileExtensions = [".xml", ".csproj", ".svg"];
5
5
  grammarName = "xml";
6
6
  nodeTypes = new Set([
7
7
  "element",
@@ -1 +1 @@
1
- {"version":3,"file":"xml.js","sourceRoot":"","sources":["../../src/chunker/xml.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAE9C,MAAM,OAAO,UAAW,SAAQ,iBAAiB;IACtC,QAAQ,GAAG,KAAK,CAAC;IACjB,cAAc,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACrC,WAAW,GAAG,KAAK,CAAC;IACpB,SAAS,GAAG,IAAI,GAAG,CAAC;QAC3B,SAAS;KACV,CAAC,CAAC;CACJ;AAED,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,UAAU,EAAE,CAAC"}
1
+ {"version":3,"file":"xml.js","sourceRoot":"","sources":["../../src/chunker/xml.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAE9C,MAAM,OAAO,UAAW,SAAQ,iBAAiB;IACtC,QAAQ,GAAG,KAAK,CAAC;IACjB,cAAc,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;IAC7C,WAAW,GAAG,KAAK,CAAC;IACpB,SAAS,GAAG,IAAI,GAAG,CAAC;QAC3B,SAAS;KACV,CAAC,CAAC;CACJ;AAED,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,UAAU,EAAE,CAAC"}