opencode-rag-plugin 1.3.6 → 1.5.1

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 (67) hide show
  1. package/ReadMe.md +51 -1
  2. package/dist/cli.d.ts +0 -5
  3. package/dist/cli.js +250 -103
  4. package/dist/cli.js.map +1 -1
  5. package/dist/core/config.d.ts +18 -1
  6. package/dist/core/config.js +16 -0
  7. package/dist/core/config.js.map +1 -1
  8. package/dist/core/interfaces.d.ts +6 -1
  9. package/dist/core/manifest.d.ts +2 -0
  10. package/dist/core/manifest.js +5 -2
  11. package/dist/core/manifest.js.map +1 -1
  12. package/dist/core/provider-defaults.d.ts +9 -0
  13. package/dist/core/provider-defaults.js +84 -0
  14. package/dist/core/provider-defaults.js.map +1 -0
  15. package/dist/core/resolve-api-key.d.ts +2 -0
  16. package/dist/core/resolve-api-key.js +71 -0
  17. package/dist/core/resolve-api-key.js.map +1 -0
  18. package/dist/core/runtime-overrides.d.ts +36 -0
  19. package/dist/core/runtime-overrides.js +106 -0
  20. package/dist/core/runtime-overrides.js.map +1 -0
  21. package/dist/describer/anthropic.d.ts +10 -0
  22. package/dist/describer/anthropic.js +167 -0
  23. package/dist/describer/anthropic.js.map +1 -0
  24. package/dist/describer/describer.d.ts +12 -0
  25. package/dist/describer/describer.js +177 -0
  26. package/dist/describer/describer.js.map +1 -0
  27. package/dist/describer/factory.d.ts +3 -0
  28. package/dist/describer/factory.js +19 -0
  29. package/dist/describer/factory.js.map +1 -0
  30. package/dist/describer/gemini.d.ts +10 -0
  31. package/dist/describer/gemini.js +177 -0
  32. package/dist/describer/gemini.js.map +1 -0
  33. package/dist/embedder/cohere.d.ts +12 -0
  34. package/dist/embedder/cohere.js +35 -0
  35. package/dist/embedder/cohere.js.map +1 -0
  36. package/dist/embedder/factory.d.ts +1 -1
  37. package/dist/embedder/factory.js +19 -12
  38. package/dist/embedder/factory.js.map +1 -1
  39. package/dist/embedder/ollama.d.ts +1 -1
  40. package/dist/embedder/ollama.js +1 -1
  41. package/dist/embedder/ollama.js.map +1 -1
  42. package/dist/embedder/openai.d.ts +8 -1
  43. package/dist/embedder/openai.js +30 -2
  44. package/dist/embedder/openai.js.map +1 -1
  45. package/dist/index.d.ts +3 -2
  46. package/dist/index.js +1 -0
  47. package/dist/index.js.map +1 -1
  48. package/dist/indexer.d.ts +2 -1
  49. package/dist/indexer.js +38 -1
  50. package/dist/indexer.js.map +1 -1
  51. package/dist/opencode/create-read-tool.js +2 -2
  52. package/dist/opencode/create-read-tool.js.map +1 -1
  53. package/dist/plugin.d.ts +2 -1
  54. package/dist/plugin.js +67 -18
  55. package/dist/plugin.js.map +1 -1
  56. package/dist/retriever/retriever.d.ts +1 -0
  57. package/dist/retriever/retriever.js +2 -1
  58. package/dist/retriever/retriever.js.map +1 -1
  59. package/dist/tui.js +474 -11
  60. package/dist/tui.js.map +1 -1
  61. package/dist/vectorstore/lancedb.d.ts +19 -0
  62. package/dist/vectorstore/lancedb.js +162 -41
  63. package/dist/vectorstore/lancedb.js.map +1 -1
  64. package/dist/watcher.d.ts +6 -1
  65. package/dist/watcher.js +72 -26
  66. package/dist/watcher.js.map +1 -1
  67. package/package.json +3 -2
@@ -0,0 +1,106 @@
1
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from "node:fs";
2
+ import { dirname, join } from "node:path";
3
+ export function loadRuntimeOverrides(storePath) {
4
+ const overridePath = join(storePath, "runtime-overrides.json");
5
+ if (!existsSync(overridePath))
6
+ return {};
7
+ try {
8
+ return JSON.parse(readFileSync(overridePath, "utf-8"));
9
+ }
10
+ catch {
11
+ return {};
12
+ }
13
+ }
14
+ export function saveRuntimeOverride(storePath, path, value) {
15
+ const overridePath = join(storePath, "runtime-overrides.json");
16
+ const overrides = loadRuntimeOverrides(storePath);
17
+ let target = overrides;
18
+ for (let i = 0; i < path.length - 1; i++) {
19
+ const key = path[i];
20
+ if (!target[key] || typeof target[key] !== "object") {
21
+ target[key] = {};
22
+ }
23
+ target = target[key];
24
+ }
25
+ target[path[path.length - 1]] = value;
26
+ try {
27
+ const dir = dirname(overridePath);
28
+ if (!existsSync(dir))
29
+ mkdirSync(dir, { recursive: true });
30
+ writeFileSync(overridePath, JSON.stringify(overrides, null, 2), "utf-8");
31
+ }
32
+ catch {
33
+ // silently ignore write errors
34
+ }
35
+ }
36
+ export function applyRuntimeOverrides(cfg, overrides) {
37
+ if (!overrides || Object.keys(overrides).length === 0)
38
+ return cfg;
39
+ const merged = JSON.parse(JSON.stringify(cfg));
40
+ if (overrides.retrieval) {
41
+ if (overrides.retrieval.topK !== undefined)
42
+ merged.retrieval.topK = overrides.retrieval.topK;
43
+ if (overrides.retrieval.minScore !== undefined)
44
+ merged.retrieval.minScore = overrides.retrieval.minScore;
45
+ if (overrides.retrieval.hybridSearch) {
46
+ if (!merged.retrieval.hybridSearch)
47
+ merged.retrieval.hybridSearch = { enabled: true, keywordWeight: 0.4 };
48
+ if (overrides.retrieval.hybridSearch.enabled !== undefined)
49
+ merged.retrieval.hybridSearch.enabled = overrides.retrieval.hybridSearch.enabled;
50
+ if (overrides.retrieval.hybridSearch.keywordWeight !== undefined)
51
+ merged.retrieval.hybridSearch.keywordWeight = overrides.retrieval.hybridSearch.keywordWeight;
52
+ }
53
+ }
54
+ if (overrides.openCode) {
55
+ if (overrides.openCode.autoIndex) {
56
+ if (!merged.openCode.autoIndex)
57
+ merged.openCode.autoIndex = { enabled: true, debounceMs: 2000, intervalMs: 300000 };
58
+ if (overrides.openCode.autoIndex.enabled !== undefined)
59
+ merged.openCode.autoIndex.enabled = overrides.openCode.autoIndex.enabled;
60
+ if (overrides.openCode.autoIndex.debounceMs !== undefined)
61
+ merged.openCode.autoIndex.debounceMs = overrides.openCode.autoIndex.debounceMs;
62
+ }
63
+ if (overrides.openCode.autoInject) {
64
+ if (!merged.openCode.autoInject)
65
+ merged.openCode.autoInject = { enabled: true, minScore: 0.75, maxChunks: 3, maxTokens: 2000 };
66
+ if (overrides.openCode.autoInject.enabled !== undefined)
67
+ merged.openCode.autoInject.enabled = overrides.openCode.autoInject.enabled;
68
+ if (overrides.openCode.autoInject.minScore !== undefined)
69
+ merged.openCode.autoInject.minScore = overrides.openCode.autoInject.minScore;
70
+ if (overrides.openCode.autoInject.maxChunks !== undefined)
71
+ merged.openCode.autoInject.maxChunks = overrides.openCode.autoInject.maxChunks;
72
+ }
73
+ }
74
+ if (overrides.embedding) {
75
+ if (overrides.embedding.provider !== undefined)
76
+ merged.embedding.provider = overrides.embedding.provider;
77
+ if (overrides.embedding.model !== undefined)
78
+ merged.embedding.model = overrides.embedding.model;
79
+ if (overrides.embedding.baseUrl !== undefined)
80
+ merged.embedding.baseUrl = overrides.embedding.baseUrl;
81
+ }
82
+ if (overrides.description) {
83
+ if (overrides.description.enabled !== undefined) {
84
+ if (!merged.description)
85
+ merged.description = { enabled: true, provider: "ollama", baseUrl: "http://127.0.0.1:11434/api", model: "qwen2.5:3b", systemPrompt: "" };
86
+ merged.description.enabled = overrides.description.enabled;
87
+ }
88
+ if (overrides.description.provider !== undefined) {
89
+ if (!merged.description)
90
+ merged.description = { enabled: true, provider: "ollama", baseUrl: "http://127.0.0.1:11434/api", model: "qwen2.5:3b", systemPrompt: "" };
91
+ merged.description.provider = overrides.description.provider;
92
+ }
93
+ if (overrides.description.model !== undefined) {
94
+ if (!merged.description)
95
+ merged.description = { enabled: true, provider: "ollama", baseUrl: "http://127.0.0.1:11434/api", model: "qwen2.5:3b", systemPrompt: "" };
96
+ merged.description.model = overrides.description.model;
97
+ }
98
+ if (overrides.description.baseUrl !== undefined) {
99
+ if (!merged.description)
100
+ merged.description = { enabled: true, provider: "ollama", baseUrl: "http://127.0.0.1:11434/api", model: "qwen2.5:3b", systemPrompt: "" };
101
+ merged.description.baseUrl = overrides.description.baseUrl;
102
+ }
103
+ }
104
+ return merged;
105
+ }
106
+ //# sourceMappingURL=runtime-overrides.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-overrides.js","sourceRoot":"","sources":["../../src/core/runtime-overrides.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { Chunk, DescriptionProvider } from "../core/interfaces.js";
2
+ import type { DescriptionConfig } from "../core/config.js";
3
+ export declare class AnthropicDescriptionProvider implements DescriptionProvider {
4
+ private readonly config;
5
+ constructor(config: DescriptionConfig);
6
+ generateDescription(chunk: Chunk): Promise<string>;
7
+ generateBatchDescriptions(chunks: Chunk[]): Promise<Map<string, string>>;
8
+ private executeBatch;
9
+ private chatRequest;
10
+ }
@@ -0,0 +1,167 @@
1
+ import { postJson } from "../embedder/http.js";
2
+ const RETRYABLE_STATUSES = new Set([408, 429, 500, 502, 503, 504]);
3
+ export class AnthropicDescriptionProvider {
4
+ config;
5
+ constructor(config) {
6
+ this.config = config;
7
+ }
8
+ async generateDescription(chunk) {
9
+ const messages = [
10
+ { role: "user", content: buildUserMessage(chunk) },
11
+ ];
12
+ return this.chatRequest(messages, this.config.timeoutMs ?? 60000);
13
+ }
14
+ async generateBatchDescriptions(chunks) {
15
+ if (chunks.length === 1) {
16
+ const desc = await this.generateDescription(chunks[0]);
17
+ return new Map([[chunks[0].id, desc]]);
18
+ }
19
+ const batchMaxChunks = this.config.batchMaxChunks ?? 25;
20
+ const batches = [];
21
+ for (let i = 0; i < chunks.length; i += batchMaxChunks) {
22
+ batches.push(chunks.slice(i, i + batchMaxChunks));
23
+ }
24
+ const result = new Map();
25
+ for (const batch of batches) {
26
+ try {
27
+ const batchResult = await this.executeBatch(batch);
28
+ for (const [id, desc] of batchResult) {
29
+ result.set(id, desc);
30
+ }
31
+ }
32
+ catch {
33
+ // Batch failed — individual fallback below handles missing chunks
34
+ }
35
+ }
36
+ for (let i = 0; i < chunks.length; i++) {
37
+ const chunk = chunks[i];
38
+ if (!result.has(chunk.id)) {
39
+ try {
40
+ const desc = await this.generateDescription(chunk);
41
+ result.set(chunk.id, desc);
42
+ }
43
+ catch {
44
+ // skip — caller will fall back to content
45
+ }
46
+ }
47
+ }
48
+ return result;
49
+ }
50
+ async executeBatch(chunks) {
51
+ const messages = [
52
+ { role: "user", content: buildBatchUserMessage(chunks) },
53
+ ];
54
+ const timeoutMs = this.config.batchTimeoutMs ?? 120000;
55
+ const responseText = await this.chatRequest(messages, timeoutMs);
56
+ return parseBatchResponse(responseText, chunks);
57
+ }
58
+ async chatRequest(messages, timeoutMs) {
59
+ const baseUrl = this.config.baseUrl.replace(/\/+$/, "");
60
+ const apiKey = this.config.apiKey ?? "";
61
+ const systemPrompt = this.config.systemPrompt;
62
+ const body = {
63
+ model: this.config.model,
64
+ max_tokens: 4096,
65
+ messages: [{ role: "user", content: systemPrompt + "\n\n" + messages.map((m) => `${m.role}: ${m.content}`).join("\n\n") + "\n\nassistant:" }],
66
+ };
67
+ const headers = {
68
+ "x-api-key": apiKey,
69
+ "anthropic-version": "2023-06-01",
70
+ "Content-Type": "application/json",
71
+ };
72
+ const retryMax = this.config.retryMax ?? 3;
73
+ const retryBaseDelayMs = this.config.retryBaseDelayMs ?? 1000;
74
+ let lastError;
75
+ for (let attempt = 0; attempt <= retryMax; attempt++) {
76
+ const response = await postJson(`${baseUrl}/messages`, body, headers, timeoutMs, this.config.proxy);
77
+ if (response.ok) {
78
+ const json = (await response.json());
79
+ const text = json.content?.[0]?.text;
80
+ if (text && text.trim().length > 0) {
81
+ return text.trim();
82
+ }
83
+ throw new Error(`Anthropic returned empty response: ${JSON.stringify(json)}`);
84
+ }
85
+ const text = await response.text();
86
+ const error = new Error(`Anthropic LLM request failed (${response.status}): ${text}`);
87
+ if (!RETRYABLE_STATUSES.has(response.status) || attempt === retryMax) {
88
+ throw error;
89
+ }
90
+ lastError = error;
91
+ const delayMs = retryBaseDelayMs * Math.pow(2, attempt);
92
+ await sleep(delayMs);
93
+ }
94
+ throw lastError ?? new Error("Anthropic LLM request failed: unknown error");
95
+ }
96
+ }
97
+ function sleep(ms) {
98
+ return new Promise((resolve) => setTimeout(resolve, ms));
99
+ }
100
+ function buildUserMessage(chunk) {
101
+ const parts = [];
102
+ if (chunk.metadata.filePath) {
103
+ parts.push(`File: ${chunk.metadata.filePath}`);
104
+ }
105
+ if (chunk.metadata.language) {
106
+ parts.push(`Language: ${chunk.metadata.language}`);
107
+ }
108
+ parts.push(`Lines: ${chunk.metadata.startLine}-${chunk.metadata.endLine}`);
109
+ parts.push("");
110
+ parts.push("```" + (chunk.metadata.language || ""));
111
+ parts.push(chunk.content);
112
+ parts.push("```");
113
+ return parts.join("\n");
114
+ }
115
+ function buildBatchUserMessage(chunks) {
116
+ const first = chunks[0];
117
+ const parts = [];
118
+ if (first.metadata.filePath) {
119
+ parts.push(`File: ${first.metadata.filePath}`);
120
+ }
121
+ if (first.metadata.language) {
122
+ parts.push(`Language: ${first.metadata.language}`);
123
+ }
124
+ parts.push(`Chunks: ${chunks.length}`);
125
+ parts.push("");
126
+ for (let i = 0; i < chunks.length; i++) {
127
+ const chunk = chunks[i];
128
+ const lang = chunk.metadata.language || "";
129
+ parts.push(`=== CHUNK ${i} (lines ${chunk.metadata.startLine}-${chunk.metadata.endLine}) ===`);
130
+ parts.push("```" + lang);
131
+ parts.push(chunk.content);
132
+ parts.push("```");
133
+ parts.push("");
134
+ }
135
+ return parts.join("\n");
136
+ }
137
+ function parseBatchResponse(text, chunks) {
138
+ const result = new Map();
139
+ const chunkPattern = /^CHUNK\s+(\d+)\s*[):-]?\s*/i;
140
+ const lines = text.split("\n");
141
+ let currentIndex = null;
142
+ let currentDesc = [];
143
+ for (const line of lines) {
144
+ const match = chunkPattern.exec(line.trim());
145
+ if (match) {
146
+ if (currentIndex !== null && currentDesc.length > 0) {
147
+ const desc = currentDesc.join(" ").trim();
148
+ if (desc.length > 0 && currentIndex >= 0 && currentIndex < chunks.length) {
149
+ result.set(chunks[currentIndex].id, desc);
150
+ }
151
+ }
152
+ currentIndex = parseInt(match[1], 10);
153
+ currentDesc = [line.slice(match[0].length).trim()];
154
+ }
155
+ else if (currentIndex !== null) {
156
+ currentDesc.push(line.trim());
157
+ }
158
+ }
159
+ if (currentIndex !== null && currentDesc.length > 0) {
160
+ const desc = currentDesc.join(" ").trim();
161
+ if (desc.length > 0 && currentIndex >= 0 && currentIndex < chunks.length) {
162
+ result.set(chunks[currentIndex].id, desc);
163
+ }
164
+ }
165
+ return result;
166
+ }
167
+ //# sourceMappingURL=anthropic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../src/describer/anthropic.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { Chunk, DescriptionProvider } from "../core/interfaces.js";
2
+ import type { DescriptionConfig } from "../core/config.js";
3
+ export declare class LLMDescriptionProvider implements DescriptionProvider {
4
+ private readonly config;
5
+ constructor(config: DescriptionConfig);
6
+ generateDescription(chunk: Chunk): Promise<string>;
7
+ generateBatchDescriptions(chunks: Chunk[]): Promise<Map<string, string>>;
8
+ private executeBatch;
9
+ private chatRequest;
10
+ }
11
+ export declare function buildBatchUserMessage(chunks: Chunk[]): string;
12
+ export declare function parseBatchResponse(text: string, chunks: Chunk[]): Map<string, string>;
@@ -0,0 +1,177 @@
1
+ import { postJson } from "../embedder/http.js";
2
+ const RETRYABLE_STATUSES = new Set([404, 408, 429, 500, 502, 503, 504]);
3
+ export class LLMDescriptionProvider {
4
+ config;
5
+ constructor(config) {
6
+ this.config = config;
7
+ }
8
+ async generateDescription(chunk) {
9
+ const messages = [
10
+ { role: "system", content: this.config.systemPrompt },
11
+ { role: "user", content: buildUserMessage(chunk) },
12
+ ];
13
+ return this.chatRequest(messages, this.config.timeoutMs ?? 60000);
14
+ }
15
+ async generateBatchDescriptions(chunks) {
16
+ if (chunks.length === 1) {
17
+ const desc = await this.generateDescription(chunks[0]);
18
+ return new Map([[chunks[0].id, desc]]);
19
+ }
20
+ const batchMaxChunks = this.config.batchMaxChunks ?? 25;
21
+ const batches = [];
22
+ for (let i = 0; i < chunks.length; i += batchMaxChunks) {
23
+ batches.push(chunks.slice(i, i + batchMaxChunks));
24
+ }
25
+ const result = new Map();
26
+ for (const batch of batches) {
27
+ try {
28
+ const batchResult = await this.executeBatch(batch);
29
+ for (const [id, desc] of batchResult) {
30
+ result.set(id, desc);
31
+ }
32
+ }
33
+ catch {
34
+ // Batch failed — individual fallback loop below will handle missing chunks
35
+ }
36
+ }
37
+ for (let i = 0; i < chunks.length; i++) {
38
+ const chunk = chunks[i];
39
+ if (!result.has(chunk.id)) {
40
+ try {
41
+ const desc = await this.generateDescription(chunk);
42
+ result.set(chunk.id, desc);
43
+ }
44
+ catch {
45
+ // skip — caller will fall back to content
46
+ }
47
+ }
48
+ }
49
+ return result;
50
+ }
51
+ async executeBatch(chunks) {
52
+ const messages = [
53
+ { role: "system", content: this.config.systemPrompt },
54
+ { role: "user", content: buildBatchUserMessage(chunks) },
55
+ ];
56
+ const timeoutMs = this.config.batchTimeoutMs ?? 120000;
57
+ const responseText = await this.chatRequest(messages, timeoutMs);
58
+ return parseBatchResponse(responseText, chunks);
59
+ }
60
+ async chatRequest(messages, timeoutMs) {
61
+ const baseUrl = this.config.baseUrl.replace(/\/+$/, "").replace(/\/api$/, "");
62
+ const isOllama = this.config.provider === "ollama";
63
+ const url = isOllama
64
+ ? `${baseUrl}/api/chat`
65
+ : `${baseUrl}/v1/chat/completions`;
66
+ const body = isOllama
67
+ ? { model: this.config.model, messages, stream: false }
68
+ : { model: this.config.model, messages };
69
+ const headers = {};
70
+ if (this.config.apiKey) {
71
+ headers.Authorization = `Bearer ${this.config.apiKey}`;
72
+ }
73
+ const retryMax = this.config.retryMax ?? 3;
74
+ const retryBaseDelayMs = this.config.retryBaseDelayMs ?? 1000;
75
+ let lastError;
76
+ for (let attempt = 0; attempt <= retryMax; attempt++) {
77
+ const response = await postJson(url, body, headers, timeoutMs, this.config.proxy);
78
+ if (response.ok) {
79
+ const json = (await response.json());
80
+ return extractResponseText(json, isOllama);
81
+ }
82
+ const text = await response.text();
83
+ const error = new Error(`Description LLM request failed (${response.status}): ${text}`);
84
+ if (!RETRYABLE_STATUSES.has(response.status) || attempt === retryMax) {
85
+ throw error;
86
+ }
87
+ lastError = error;
88
+ const delayMs = retryBaseDelayMs * Math.pow(2, attempt);
89
+ await sleep(delayMs);
90
+ }
91
+ throw lastError ?? new Error("Description LLM request failed: unknown error");
92
+ }
93
+ }
94
+ function sleep(ms) {
95
+ return new Promise((resolve) => setTimeout(resolve, ms));
96
+ }
97
+ function buildUserMessage(chunk) {
98
+ const parts = [];
99
+ if (chunk.metadata.filePath) {
100
+ parts.push(`File: ${chunk.metadata.filePath}`);
101
+ }
102
+ if (chunk.metadata.language) {
103
+ parts.push(`Language: ${chunk.metadata.language}`);
104
+ }
105
+ parts.push(`Lines: ${chunk.metadata.startLine}-${chunk.metadata.endLine}`);
106
+ parts.push("");
107
+ parts.push("```" + (chunk.metadata.language || ""));
108
+ parts.push(chunk.content);
109
+ parts.push("```");
110
+ return parts.join("\n");
111
+ }
112
+ export function buildBatchUserMessage(chunks) {
113
+ const first = chunks[0];
114
+ const parts = [];
115
+ if (first.metadata.filePath) {
116
+ parts.push(`File: ${first.metadata.filePath}`);
117
+ }
118
+ if (first.metadata.language) {
119
+ parts.push(`Language: ${first.metadata.language}`);
120
+ }
121
+ parts.push(`Chunks: ${chunks.length}`);
122
+ parts.push("");
123
+ for (let i = 0; i < chunks.length; i++) {
124
+ const chunk = chunks[i];
125
+ const lang = chunk.metadata.language || "";
126
+ parts.push(`=== CHUNK ${i} (lines ${chunk.metadata.startLine}-${chunk.metadata.endLine}) ===`);
127
+ parts.push("```" + lang);
128
+ parts.push(chunk.content);
129
+ parts.push("```");
130
+ parts.push("");
131
+ }
132
+ return parts.join("\n");
133
+ }
134
+ export function parseBatchResponse(text, chunks) {
135
+ const result = new Map();
136
+ const chunkPattern = /^CHUNK\s+(\d+)\s*[):-]?\s*/i;
137
+ const lines = text.split("\n");
138
+ let currentIndex = null;
139
+ let currentDesc = [];
140
+ for (const line of lines) {
141
+ const match = chunkPattern.exec(line.trim());
142
+ if (match) {
143
+ if (currentIndex !== null && currentDesc.length > 0) {
144
+ const desc = currentDesc.join(" ").trim();
145
+ if (desc.length > 0 && currentIndex >= 0 && currentIndex < chunks.length) {
146
+ result.set(chunks[currentIndex].id, desc);
147
+ }
148
+ }
149
+ currentIndex = parseInt(match[1], 10);
150
+ currentDesc = [line.slice(match[0].length).trim()];
151
+ }
152
+ else if (currentIndex !== null) {
153
+ currentDesc.push(line.trim());
154
+ }
155
+ }
156
+ if (currentIndex !== null && currentDesc.length > 0) {
157
+ const desc = currentDesc.join(" ").trim();
158
+ if (desc.length > 0 && currentIndex >= 0 && currentIndex < chunks.length) {
159
+ result.set(chunks[currentIndex].id, desc);
160
+ }
161
+ }
162
+ return result;
163
+ }
164
+ function extractResponseText(json, isOllama) {
165
+ if (isOllama) {
166
+ const content = json.message?.content;
167
+ if (typeof content === "string" && content.trim().length > 0) {
168
+ return content.trim();
169
+ }
170
+ }
171
+ const content = json.choices?.[0]?.message?.content;
172
+ if (typeof content === "string" && content.trim().length > 0) {
173
+ return content.trim();
174
+ }
175
+ throw new Error(`Description LLM returned empty response: ${JSON.stringify(json)}`);
176
+ }
177
+ //# sourceMappingURL=describer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"describer.js","sourceRoot":"","sources":["../../src/describer/describer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { DescriptionProvider } from "../core/interfaces.js";
2
+ import type { DescriptionConfig } from "../core/config.js";
3
+ export declare function createDescriptionProvider(config: DescriptionConfig): DescriptionProvider;
@@ -0,0 +1,19 @@
1
+ import { LLMDescriptionProvider } from "./describer.js";
2
+ import { AnthropicDescriptionProvider } from "./anthropic.js";
3
+ import { GeminiDescriptionProvider } from "./gemini.js";
4
+ export function createDescriptionProvider(config) {
5
+ if (config.provider === "anthropic") {
6
+ if (!config.apiKey) {
7
+ throw new Error("Anthropic provider requires an apiKey");
8
+ }
9
+ return new AnthropicDescriptionProvider(config);
10
+ }
11
+ if (config.provider === "google") {
12
+ if (!config.apiKey) {
13
+ throw new Error("Google Gemini provider requires an apiKey");
14
+ }
15
+ return new GeminiDescriptionProvider(config);
16
+ }
17
+ return new LLMDescriptionProvider(config);
18
+ }
19
+ //# sourceMappingURL=factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/describer/factory.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,4BAA4B,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAExD,MAAM,UAAU,yBAAyB,CACvC,MAAyB;IAEzB,IAAI,MAAM,CAAC,QAAQ,KAAK,WAAW,EAAE,CAAC;QACpC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;QAC3D,CAAC;QACD,OAAO,IAAI,4BAA4B,CAAC,MAAM,CAAC,CAAC;IAClD,CAAC;IAED,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACjC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC/D,CAAC;QACD,OAAO,IAAI,yBAAyB,CAAC,MAAM,CAAC,CAAC;IAC/C,CAAC;IAED,OAAO,IAAI,sBAAsB,CAAC,MAAM,CAAC,CAAC;AAC5C,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { Chunk, DescriptionProvider } from "../core/interfaces.js";
2
+ import type { DescriptionConfig } from "../core/config.js";
3
+ export declare class GeminiDescriptionProvider implements DescriptionProvider {
4
+ private readonly config;
5
+ constructor(config: DescriptionConfig);
6
+ generateDescription(chunk: Chunk): Promise<string>;
7
+ generateBatchDescriptions(chunks: Chunk[]): Promise<Map<string, string>>;
8
+ private executeBatch;
9
+ private chatRequest;
10
+ }