opencode-rag-plugin 1.2.0 → 1.2.2
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 +463 -463
- package/dist/cli.d.ts +7 -0
- package/dist/cli.js +20 -5
- package/dist/cli.js.map +1 -1
- package/dist/plugin.js +1 -1
- package/dist/plugin.js.map +1 -1
- package/package.json +89 -89
- package/dist/__tests__/chunker/c.test.d.ts +0 -1
- package/dist/__tests__/chunker/c.test.js +0 -82
- package/dist/__tests__/chunker/c.test.js.map +0 -1
- package/dist/__tests__/chunker/cpp.test.d.ts +0 -1
- package/dist/__tests__/chunker/cpp.test.js +0 -96
- package/dist/__tests__/chunker/cpp.test.js.map +0 -1
- package/dist/__tests__/chunker/csharp.test.d.ts +0 -1
- package/dist/__tests__/chunker/csharp.test.js +0 -85
- package/dist/__tests__/chunker/csharp.test.js.map +0 -1
- package/dist/__tests__/chunker/css.test.d.ts +0 -1
- package/dist/__tests__/chunker/css.test.js +0 -64
- package/dist/__tests__/chunker/css.test.js.map +0 -1
- package/dist/__tests__/chunker/factory.test.d.ts +0 -1
- package/dist/__tests__/chunker/factory.test.js +0 -202
- package/dist/__tests__/chunker/factory.test.js.map +0 -1
- package/dist/__tests__/chunker/fallback.test.d.ts +0 -1
- package/dist/__tests__/chunker/fallback.test.js +0 -67
- package/dist/__tests__/chunker/fallback.test.js.map +0 -1
- package/dist/__tests__/chunker/go.test.d.ts +0 -1
- package/dist/__tests__/chunker/go.test.js +0 -90
- package/dist/__tests__/chunker/go.test.js.map +0 -1
- package/dist/__tests__/chunker/grammar.test.d.ts +0 -1
- package/dist/__tests__/chunker/grammar.test.js +0 -108
- package/dist/__tests__/chunker/grammar.test.js.map +0 -1
- package/dist/__tests__/chunker/html.test.d.ts +0 -1
- package/dist/__tests__/chunker/html.test.js +0 -64
- package/dist/__tests__/chunker/html.test.js.map +0 -1
- package/dist/__tests__/chunker/java.test.d.ts +0 -1
- package/dist/__tests__/chunker/java.test.js +0 -83
- package/dist/__tests__/chunker/java.test.js.map +0 -1
- package/dist/__tests__/chunker/javascript.test.d.ts +0 -1
- package/dist/__tests__/chunker/javascript.test.js +0 -88
- package/dist/__tests__/chunker/javascript.test.js.map +0 -1
- package/dist/__tests__/chunker/json.test.d.ts +0 -1
- package/dist/__tests__/chunker/json.test.js +0 -54
- package/dist/__tests__/chunker/json.test.js.map +0 -1
- package/dist/__tests__/chunker/kotlin.test.d.ts +0 -1
- package/dist/__tests__/chunker/kotlin.test.js +0 -42
- package/dist/__tests__/chunker/kotlin.test.js.map +0 -1
- package/dist/__tests__/chunker/markdown.test.d.ts +0 -1
- package/dist/__tests__/chunker/markdown.test.js +0 -76
- package/dist/__tests__/chunker/markdown.test.js.map +0 -1
- package/dist/__tests__/chunker/python.test.d.ts +0 -1
- package/dist/__tests__/chunker/python.test.js +0 -81
- package/dist/__tests__/chunker/python.test.js.map +0 -1
- package/dist/__tests__/chunker/razor.test.d.ts +0 -1
- package/dist/__tests__/chunker/razor.test.js +0 -73
- package/dist/__tests__/chunker/razor.test.js.map +0 -1
- package/dist/__tests__/chunker/register.test.d.ts +0 -1
- package/dist/__tests__/chunker/register.test.js +0 -93
- package/dist/__tests__/chunker/register.test.js.map +0 -1
- package/dist/__tests__/chunker/ruby.test.d.ts +0 -1
- package/dist/__tests__/chunker/ruby.test.js +0 -40
- package/dist/__tests__/chunker/ruby.test.js.map +0 -1
- package/dist/__tests__/chunker/rust.test.d.ts +0 -1
- package/dist/__tests__/chunker/rust.test.js +0 -42
- package/dist/__tests__/chunker/rust.test.js.map +0 -1
- package/dist/__tests__/chunker/sln.test.d.ts +0 -1
- package/dist/__tests__/chunker/sln.test.js +0 -45
- package/dist/__tests__/chunker/sln.test.js.map +0 -1
- package/dist/__tests__/chunker/swift.test.d.ts +0 -1
- package/dist/__tests__/chunker/swift.test.js +0 -49
- package/dist/__tests__/chunker/swift.test.js.map +0 -1
- package/dist/__tests__/chunker/typescript.test.d.ts +0 -1
- package/dist/__tests__/chunker/typescript.test.js +0 -92
- package/dist/__tests__/chunker/typescript.test.js.map +0 -1
- package/dist/__tests__/chunker/uuid.test.d.ts +0 -1
- package/dist/__tests__/chunker/uuid.test.js +0 -19
- package/dist/__tests__/chunker/uuid.test.js.map +0 -1
- package/dist/__tests__/chunker/xml.test.d.ts +0 -1
- package/dist/__tests__/chunker/xml.test.js +0 -50
- package/dist/__tests__/chunker/xml.test.js.map +0 -1
- package/dist/__tests__/core/config.test.d.ts +0 -1
- package/dist/__tests__/core/config.test.js +0 -75
- package/dist/__tests__/core/config.test.js.map +0 -1
- package/dist/__tests__/core/fileLogger.test.d.ts +0 -1
- package/dist/__tests__/core/fileLogger.test.js +0 -34
- package/dist/__tests__/core/fileLogger.test.js.map +0 -1
- package/dist/__tests__/core/manifest.test.d.ts +0 -1
- package/dist/__tests__/core/manifest.test.js +0 -56
- package/dist/__tests__/core/manifest.test.js.map +0 -1
- package/dist/__tests__/embedder/embedBatch.test.d.ts +0 -1
- package/dist/__tests__/embedder/embedBatch.test.js +0 -88
- package/dist/__tests__/embedder/embedBatch.test.js.map +0 -1
- package/dist/__tests__/embedder/factory.test.d.ts +0 -1
- package/dist/__tests__/embedder/factory.test.js +0 -71
- package/dist/__tests__/embedder/factory.test.js.map +0 -1
- package/dist/__tests__/embedder/ollama.test.d.ts +0 -1
- package/dist/__tests__/embedder/ollama.test.js +0 -106
- package/dist/__tests__/embedder/ollama.test.js.map +0 -1
- package/dist/__tests__/embedder/openai.test.d.ts +0 -1
- package/dist/__tests__/embedder/openai.test.js +0 -94
- package/dist/__tests__/embedder/openai.test.js.map +0 -1
- package/dist/__tests__/indexer/indexer.test.d.ts +0 -1
- package/dist/__tests__/indexer/indexer.test.js +0 -176
- package/dist/__tests__/indexer/indexer.test.js.map +0 -1
- package/dist/__tests__/plugin.test.d.ts +0 -1
- package/dist/__tests__/plugin.test.js +0 -77
- package/dist/__tests__/plugin.test.js.map +0 -1
- package/dist/__tests__/retriever/retriever.test.d.ts +0 -1
- package/dist/__tests__/retriever/retriever.test.js +0 -97
- package/dist/__tests__/retriever/retriever.test.js.map +0 -1
- package/dist/__tests__/vectorstore/lancedb.test.d.ts +0 -1
- package/dist/__tests__/vectorstore/lancedb.test.js +0 -159
- package/dist/__tests__/vectorstore/lancedb.test.js.map +0 -1
|
@@ -1,106 +0,0 @@
|
|
|
1
|
-
import { describe, it } from "node:test";
|
|
2
|
-
import assert from "node:assert/strict";
|
|
3
|
-
import { createServer } from "node:http";
|
|
4
|
-
import { OllamaProvider } from "../../embedder/ollama.js";
|
|
5
|
-
describe("OllamaProvider", () => {
|
|
6
|
-
it("name is 'ollama'", () => {
|
|
7
|
-
const p = new OllamaProvider("http://localhost:11434/api", "nomic-embed-text");
|
|
8
|
-
assert.equal(p.name, "ollama");
|
|
9
|
-
});
|
|
10
|
-
it("strips single trailing slash from baseUrl", () => {
|
|
11
|
-
const p = new OllamaProvider("http://localhost:11434/api/", "model");
|
|
12
|
-
assert.ok(p);
|
|
13
|
-
});
|
|
14
|
-
it("strips multiple trailing slashes from baseUrl", () => {
|
|
15
|
-
const p = new OllamaProvider("http://localhost:11434/api///", "model");
|
|
16
|
-
assert.ok(p);
|
|
17
|
-
});
|
|
18
|
-
it("preserves baseUrl without trailing slash", () => {
|
|
19
|
-
const p = new OllamaProvider("http://localhost:11434/api", "model");
|
|
20
|
-
assert.ok(p);
|
|
21
|
-
});
|
|
22
|
-
it("stores apiKey when provided", () => {
|
|
23
|
-
const p = new OllamaProvider("http://localhost:11434/api", "model", "my-api-key");
|
|
24
|
-
assert.ok(p);
|
|
25
|
-
});
|
|
26
|
-
it("apiKey defaults to undefined when not provided", () => {
|
|
27
|
-
const p = new OllamaProvider("http://localhost:11434/api", "model");
|
|
28
|
-
assert.ok(p);
|
|
29
|
-
});
|
|
30
|
-
it("embeds single text with correct API format", async () => {
|
|
31
|
-
// Test that the embed method exists and is callable.
|
|
32
|
-
// Actual fetch calls are not made in unit tests.
|
|
33
|
-
const p = new OllamaProvider("http://localhost:11434/api", "embeddinggemma");
|
|
34
|
-
assert.equal(typeof p.embed, "function");
|
|
35
|
-
assert.equal(p.embed.length, 1); // expects texts array parameter
|
|
36
|
-
});
|
|
37
|
-
it("does not require apiKey for construction", () => {
|
|
38
|
-
const p = new OllamaProvider("http://localhost:11434/api", "embeddinggemma");
|
|
39
|
-
assert.equal(p.name, "ollama");
|
|
40
|
-
});
|
|
41
|
-
it("handles custom baseUrl with port and path", () => {
|
|
42
|
-
const p = new OllamaProvider("http://192.168.1.100:8080/api", "model");
|
|
43
|
-
assert.ok(p);
|
|
44
|
-
});
|
|
45
|
-
it("handles https baseUrl", () => {
|
|
46
|
-
const p = new OllamaProvider("https://ollama.example.com/api", "model");
|
|
47
|
-
assert.ok(p);
|
|
48
|
-
});
|
|
49
|
-
it("aborts slow embedding requests instead of hanging forever", async () => {
|
|
50
|
-
const originalFetch = globalThis.fetch;
|
|
51
|
-
globalThis.fetch = (async (_url, init) => {
|
|
52
|
-
const signal = init?.signal;
|
|
53
|
-
return await new Promise((_resolve, reject) => {
|
|
54
|
-
if (signal) {
|
|
55
|
-
signal.addEventListener("abort", () => {
|
|
56
|
-
const error = new Error("Aborted");
|
|
57
|
-
error.name = "AbortError";
|
|
58
|
-
reject(error);
|
|
59
|
-
}, { once: true });
|
|
60
|
-
}
|
|
61
|
-
});
|
|
62
|
-
});
|
|
63
|
-
try {
|
|
64
|
-
const p = new OllamaProvider("http://localhost:11434/api", "embeddinggemma", undefined, 1);
|
|
65
|
-
await assert.rejects(() => p.embed(["test"]), /timed out after 1ms/);
|
|
66
|
-
}
|
|
67
|
-
finally {
|
|
68
|
-
globalThis.fetch = originalFetch;
|
|
69
|
-
}
|
|
70
|
-
});
|
|
71
|
-
it("uses a direct localhost request instead of fetch", async () => {
|
|
72
|
-
const originalFetch = globalThis.fetch;
|
|
73
|
-
globalThis.fetch = (async () => {
|
|
74
|
-
throw new Error("fetch should not be called for localhost");
|
|
75
|
-
});
|
|
76
|
-
const server = createServer((req, res) => {
|
|
77
|
-
let body = "";
|
|
78
|
-
req.on("data", (chunk) => {
|
|
79
|
-
body += String(chunk);
|
|
80
|
-
});
|
|
81
|
-
req.on("end", () => {
|
|
82
|
-
assert.equal(req.method, "POST");
|
|
83
|
-
assert.equal(req.url, "/api/embed");
|
|
84
|
-
assert.equal(req.headers["content-type"], "application/json");
|
|
85
|
-
assert.match(body, /"input":"hello"/);
|
|
86
|
-
res.writeHead(200, { "Content-Type": "application/json" });
|
|
87
|
-
res.end(JSON.stringify({ embeddings: [[1, 2, 3]] }));
|
|
88
|
-
});
|
|
89
|
-
});
|
|
90
|
-
try {
|
|
91
|
-
await new Promise((resolve) => server.listen(0, "127.0.0.1", resolve));
|
|
92
|
-
const address = server.address();
|
|
93
|
-
if (typeof address !== "object" || address === null) {
|
|
94
|
-
throw new Error("failed to start test server");
|
|
95
|
-
}
|
|
96
|
-
const p = new OllamaProvider(`http://localhost:${address.port}/api`, "embeddinggemma");
|
|
97
|
-
const embeddings = await p.embed(["hello"]);
|
|
98
|
-
assert.deepEqual(embeddings, [[1, 2, 3]]);
|
|
99
|
-
}
|
|
100
|
-
finally {
|
|
101
|
-
await new Promise((resolve) => server.close(() => resolve()));
|
|
102
|
-
globalThis.fetch = originalFetch;
|
|
103
|
-
}
|
|
104
|
-
});
|
|
105
|
-
});
|
|
106
|
-
//# sourceMappingURL=ollama.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ollama.test.js","sourceRoot":"","sources":["../../../src/__tests__/embedder/ollama.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
import { describe, it } from "node:test";
|
|
2
|
-
import assert from "node:assert/strict";
|
|
3
|
-
import { createServer } from "node:http";
|
|
4
|
-
import { OpenAIProvider } from "../../embedder/openai.js";
|
|
5
|
-
describe("OpenAIProvider", () => {
|
|
6
|
-
it("name is 'openai'", () => {
|
|
7
|
-
const p = new OpenAIProvider("https://api.openai.com/v1", "text-embedding-3-small", "sk-test-key");
|
|
8
|
-
assert.equal(p.name, "openai");
|
|
9
|
-
});
|
|
10
|
-
it("strips single trailing slash from baseUrl", () => {
|
|
11
|
-
const p = new OpenAIProvider("https://api.openai.com/v1/", "model", "sk-key");
|
|
12
|
-
assert.ok(p);
|
|
13
|
-
});
|
|
14
|
-
it("strips multiple trailing slashes from baseUrl", () => {
|
|
15
|
-
const p = new OpenAIProvider("https://api.openai.com/v1///", "model", "sk-key");
|
|
16
|
-
assert.ok(p);
|
|
17
|
-
});
|
|
18
|
-
it("preserves baseUrl without trailing slash", () => {
|
|
19
|
-
const p = new OpenAIProvider("https://api.openai.com/v1", "model", "sk-key");
|
|
20
|
-
assert.ok(p);
|
|
21
|
-
});
|
|
22
|
-
it("requires apiKey", () => {
|
|
23
|
-
const p = new OpenAIProvider("https://api.openai.com/v1", "text-embedding-3-small", "sk-required-key");
|
|
24
|
-
assert.equal(p.name, "openai");
|
|
25
|
-
});
|
|
26
|
-
it("embeds method exists and accepts texts array", () => {
|
|
27
|
-
const p = new OpenAIProvider("https://api.openai.com/v1", "text-embedding-3-small", "sk-key");
|
|
28
|
-
assert.equal(typeof p.embed, "function");
|
|
29
|
-
assert.equal(p.embed.length, 1); // expects texts array parameter
|
|
30
|
-
});
|
|
31
|
-
it("handles custom baseUrl with subpath", () => {
|
|
32
|
-
const p = new OpenAIProvider("https://custom.openai.com/embeddings/v1", "model", "sk-key");
|
|
33
|
-
assert.ok(p);
|
|
34
|
-
});
|
|
35
|
-
it("handles baseUrl with port number", () => {
|
|
36
|
-
const p = new OpenAIProvider("http://localhost:8080/v1", "model", "sk-key");
|
|
37
|
-
assert.ok(p);
|
|
38
|
-
});
|
|
39
|
-
it("aborts slow embedding requests instead of hanging forever", async () => {
|
|
40
|
-
const originalFetch = globalThis.fetch;
|
|
41
|
-
globalThis.fetch = (async (_url, init) => {
|
|
42
|
-
const signal = init?.signal;
|
|
43
|
-
return await new Promise((_resolve, reject) => {
|
|
44
|
-
if (signal) {
|
|
45
|
-
signal.addEventListener("abort", () => {
|
|
46
|
-
const error = new Error("Aborted");
|
|
47
|
-
error.name = "AbortError";
|
|
48
|
-
reject(error);
|
|
49
|
-
}, { once: true });
|
|
50
|
-
}
|
|
51
|
-
});
|
|
52
|
-
});
|
|
53
|
-
try {
|
|
54
|
-
const p = new OpenAIProvider("https://api.openai.com/v1", "text-embedding-3-small", "sk-test-key", 1);
|
|
55
|
-
await assert.rejects(() => p.embed(["test"]), /timed out after 1ms/);
|
|
56
|
-
}
|
|
57
|
-
finally {
|
|
58
|
-
globalThis.fetch = originalFetch;
|
|
59
|
-
}
|
|
60
|
-
});
|
|
61
|
-
it("uses a direct localhost request instead of fetch", async () => {
|
|
62
|
-
const originalFetch = globalThis.fetch;
|
|
63
|
-
globalThis.fetch = (async () => {
|
|
64
|
-
throw new Error("fetch should not be called for localhost");
|
|
65
|
-
});
|
|
66
|
-
const server = createServer((req, res) => {
|
|
67
|
-
let body = "";
|
|
68
|
-
req.on("data", (chunk) => {
|
|
69
|
-
body += String(chunk);
|
|
70
|
-
});
|
|
71
|
-
req.on("end", () => {
|
|
72
|
-
assert.equal(req.method, "POST");
|
|
73
|
-
assert.ok(req.url?.includes("/embeddings"));
|
|
74
|
-
res.writeHead(200, { "Content-Type": "application/json" });
|
|
75
|
-
res.end(JSON.stringify({ data: [{ embedding: [4, 5, 6] }] }));
|
|
76
|
-
});
|
|
77
|
-
});
|
|
78
|
-
try {
|
|
79
|
-
await new Promise((resolve) => server.listen(0, "127.0.0.1", resolve));
|
|
80
|
-
const address = server.address();
|
|
81
|
-
if (typeof address !== "object" || address === null) {
|
|
82
|
-
throw new Error("failed to start test server");
|
|
83
|
-
}
|
|
84
|
-
const p = new OpenAIProvider(`http://localhost:${address.port}/v1`, "text-embedding-3-small", "sk-key");
|
|
85
|
-
const embeddings = await p.embed(["hello"]);
|
|
86
|
-
assert.deepEqual(embeddings, [[4, 5, 6]]);
|
|
87
|
-
}
|
|
88
|
-
finally {
|
|
89
|
-
await new Promise((resolve) => server.close(() => resolve()));
|
|
90
|
-
globalThis.fetch = originalFetch;
|
|
91
|
-
}
|
|
92
|
-
});
|
|
93
|
-
});
|
|
94
|
-
//# sourceMappingURL=openai.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"openai.test.js","sourceRoot":"","sources":["../../../src/__tests__/embedder/openai.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,176 +0,0 @@
|
|
|
1
|
-
import { describe, it, beforeEach } from "node:test";
|
|
2
|
-
import assert from "node:assert/strict";
|
|
3
|
-
import fs from "node:fs/promises";
|
|
4
|
-
import os from "node:os";
|
|
5
|
-
import path from "node:path";
|
|
6
|
-
import { setTimeout as delay } from "node:timers/promises";
|
|
7
|
-
import { DEFAULT_CONFIG } from "../../core/config.js";
|
|
8
|
-
import { loadManifest } from "../../core/manifest.js";
|
|
9
|
-
import { createWatchPassScheduler, getIndexStatusSummary, runIndexPass, } from "../../indexer.js";
|
|
10
|
-
import { LanceDBStore } from "../../vectorstore/lancedb.js";
|
|
11
|
-
class TestEmbedder {
|
|
12
|
-
name = "test";
|
|
13
|
-
async embed(texts) {
|
|
14
|
-
return texts.map((text, index) => [text.length, index + 1, 0.5, -0.5]);
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
async function makeTempDir(name) {
|
|
18
|
-
return fs.mkdtemp(path.join(os.tmpdir(), `${name}-`));
|
|
19
|
-
}
|
|
20
|
-
async function writeFile(filePath, content) {
|
|
21
|
-
await fs.mkdir(path.dirname(filePath), { recursive: true });
|
|
22
|
-
await fs.writeFile(filePath, content, "utf-8");
|
|
23
|
-
}
|
|
24
|
-
function testConfig() {
|
|
25
|
-
return {
|
|
26
|
-
...DEFAULT_CONFIG,
|
|
27
|
-
indexing: {
|
|
28
|
-
...DEFAULT_CONFIG.indexing,
|
|
29
|
-
includeExtensions: [".ts"],
|
|
30
|
-
excludeDirs: ["node_modules", ".git", ".opencode"],
|
|
31
|
-
},
|
|
32
|
-
};
|
|
33
|
-
}
|
|
34
|
-
describe("indexer", () => {
|
|
35
|
-
let workspaceDir;
|
|
36
|
-
let storeDir;
|
|
37
|
-
let store;
|
|
38
|
-
const embedder = new TestEmbedder();
|
|
39
|
-
beforeEach(async () => {
|
|
40
|
-
workspaceDir = await makeTempDir("indexer-workspace");
|
|
41
|
-
storeDir = await makeTempDir("indexer-store");
|
|
42
|
-
store = new LanceDBStore(storeDir, 4);
|
|
43
|
-
});
|
|
44
|
-
it("indexes new files and records them in the manifest", async () => {
|
|
45
|
-
await writeFile(path.join(workspaceDir, "src", "a.ts"), "function alpha() { return 1; }\n");
|
|
46
|
-
await writeFile(path.join(workspaceDir, "src", "b.ts"), "function beta() { return 2; }\n");
|
|
47
|
-
const stats = await runIndexPass({
|
|
48
|
-
cwd: workspaceDir,
|
|
49
|
-
storePath: storeDir,
|
|
50
|
-
config: testConfig(),
|
|
51
|
-
store,
|
|
52
|
-
embedder,
|
|
53
|
-
});
|
|
54
|
-
assert.equal(stats.newFiles, 2);
|
|
55
|
-
assert.equal(stats.modifiedFiles, 0);
|
|
56
|
-
assert.equal(stats.unchangedFiles, 0);
|
|
57
|
-
assert.equal(stats.deletedFiles, 0);
|
|
58
|
-
assert.equal(stats.finalCount, 2);
|
|
59
|
-
const manifest = await loadManifest(storeDir);
|
|
60
|
-
assert.equal(manifest.status, "ok");
|
|
61
|
-
assert.equal(Object.keys(manifest.manifest.files).length, 2);
|
|
62
|
-
});
|
|
63
|
-
it("skips unchanged files and updates modified or deleted files", async () => {
|
|
64
|
-
const fileA = path.join(workspaceDir, "src", "a.ts");
|
|
65
|
-
const fileB = path.join(workspaceDir, "src", "b.ts");
|
|
66
|
-
const fileC = path.join(workspaceDir, "src", "c.ts");
|
|
67
|
-
await writeFile(fileA, "function alpha() { return 1; }\n");
|
|
68
|
-
await writeFile(fileB, "function beta() { return 2; }\n");
|
|
69
|
-
await runIndexPass({
|
|
70
|
-
cwd: workspaceDir,
|
|
71
|
-
storePath: storeDir,
|
|
72
|
-
config: testConfig(),
|
|
73
|
-
store,
|
|
74
|
-
embedder,
|
|
75
|
-
});
|
|
76
|
-
await writeFile(fileA, "function alpha() { return 10; }\n");
|
|
77
|
-
await fs.unlink(fileB);
|
|
78
|
-
await writeFile(fileC, "function gamma() { return 3; }\n");
|
|
79
|
-
const stats = await runIndexPass({
|
|
80
|
-
cwd: workspaceDir,
|
|
81
|
-
storePath: storeDir,
|
|
82
|
-
config: testConfig(),
|
|
83
|
-
store,
|
|
84
|
-
embedder,
|
|
85
|
-
});
|
|
86
|
-
assert.equal(stats.newFiles, 1);
|
|
87
|
-
assert.equal(stats.modifiedFiles, 1);
|
|
88
|
-
assert.equal(stats.deletedFiles, 1);
|
|
89
|
-
assert.equal(stats.unchangedFiles, 0);
|
|
90
|
-
assert.equal(stats.finalCount, 2);
|
|
91
|
-
});
|
|
92
|
-
it("removes empty files from the index", async () => {
|
|
93
|
-
const filePath = path.join(workspaceDir, "src", "empty.ts");
|
|
94
|
-
await writeFile(filePath, "function keep() { return 1; }\n");
|
|
95
|
-
await runIndexPass({
|
|
96
|
-
cwd: workspaceDir,
|
|
97
|
-
storePath: storeDir,
|
|
98
|
-
config: testConfig(),
|
|
99
|
-
store,
|
|
100
|
-
embedder,
|
|
101
|
-
});
|
|
102
|
-
await writeFile(filePath, " \n");
|
|
103
|
-
const stats = await runIndexPass({
|
|
104
|
-
cwd: workspaceDir,
|
|
105
|
-
storePath: storeDir,
|
|
106
|
-
config: testConfig(),
|
|
107
|
-
store,
|
|
108
|
-
embedder,
|
|
109
|
-
});
|
|
110
|
-
assert.equal(stats.skippedEmptyFiles, 1);
|
|
111
|
-
assert.equal(stats.removedFiles, 1);
|
|
112
|
-
assert.equal(await store.count(), 0);
|
|
113
|
-
});
|
|
114
|
-
it("reports pending files in status summary", async () => {
|
|
115
|
-
const filePath = path.join(workspaceDir, "src", "a.ts");
|
|
116
|
-
await writeFile(filePath, "function alpha() { return 1; }\n");
|
|
117
|
-
await runIndexPass({
|
|
118
|
-
cwd: workspaceDir,
|
|
119
|
-
storePath: storeDir,
|
|
120
|
-
config: testConfig(),
|
|
121
|
-
store,
|
|
122
|
-
embedder,
|
|
123
|
-
});
|
|
124
|
-
await writeFile(filePath, "function alpha() { return 2; }\n");
|
|
125
|
-
const summary = await getIndexStatusSummary(workspaceDir, storeDir, testConfig(), store);
|
|
126
|
-
assert.equal(summary.manifestStatus, "ok");
|
|
127
|
-
assert.equal(summary.upToDateFiles, 0);
|
|
128
|
-
assert.equal(summary.pendingFiles, 1);
|
|
129
|
-
assert.equal(summary.manifestEntries, 1);
|
|
130
|
-
});
|
|
131
|
-
it("rebuilds safely when manifest is missing but store has data", async () => {
|
|
132
|
-
const filePath = path.join(workspaceDir, "src", "a.ts");
|
|
133
|
-
await writeFile(filePath, "function alpha() { return 1; }\n");
|
|
134
|
-
await runIndexPass({
|
|
135
|
-
cwd: workspaceDir,
|
|
136
|
-
storePath: storeDir,
|
|
137
|
-
config: testConfig(),
|
|
138
|
-
store,
|
|
139
|
-
embedder,
|
|
140
|
-
});
|
|
141
|
-
await fs.unlink(path.join(storeDir, "manifest.json"));
|
|
142
|
-
const stats = await runIndexPass({
|
|
143
|
-
cwd: workspaceDir,
|
|
144
|
-
storePath: storeDir,
|
|
145
|
-
config: testConfig(),
|
|
146
|
-
store,
|
|
147
|
-
embedder,
|
|
148
|
-
});
|
|
149
|
-
assert.equal(stats.rebuildPerformed, true);
|
|
150
|
-
assert.equal(stats.newFiles, 1);
|
|
151
|
-
assert.equal(await store.count(), 1);
|
|
152
|
-
});
|
|
153
|
-
it("queues one follow-up watch pass while a pass is running", async () => {
|
|
154
|
-
let runs = 0;
|
|
155
|
-
let release = () => { };
|
|
156
|
-
const scheduler = createWatchPassScheduler(async () => {
|
|
157
|
-
runs++;
|
|
158
|
-
if (runs === 1) {
|
|
159
|
-
await new Promise((resolve) => {
|
|
160
|
-
release = resolve;
|
|
161
|
-
});
|
|
162
|
-
}
|
|
163
|
-
}, () => {
|
|
164
|
-
assert.fail("unexpected watch scheduler error");
|
|
165
|
-
}, 10);
|
|
166
|
-
scheduler.notifyChange();
|
|
167
|
-
await delay(25);
|
|
168
|
-
scheduler.notifyChange();
|
|
169
|
-
scheduler.notifyChange();
|
|
170
|
-
release();
|
|
171
|
-
await scheduler.waitForIdle();
|
|
172
|
-
scheduler.close();
|
|
173
|
-
assert.equal(runs, 2);
|
|
174
|
-
});
|
|
175
|
-
});
|
|
176
|
-
//# sourceMappingURL=indexer.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"indexer.test.js","sourceRoot":"","sources":["../../../src/__tests__/indexer/indexer.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
import { describe, it } from "node:test";
|
|
2
|
-
import assert from "node:assert/strict";
|
|
3
|
-
import { ragPlugin } from "../plugin.js";
|
|
4
|
-
import { mkdtempSync, writeFileSync, mkdirSync, rmSync } from "node:fs";
|
|
5
|
-
import { tmpdir } from "node:os";
|
|
6
|
-
import path from "node:path";
|
|
7
|
-
// IMPORTANT: The plugin module caches the config globally (module-level `config` variable).
|
|
8
|
-
// The first call to `getConfig()` caches the result. All subsequent calls use the cache.
|
|
9
|
-
// Therefore, the first test in this file determines the cached config for all tests.
|
|
10
|
-
describe("ragPlugin", () => {
|
|
11
|
-
it("returns chat.message hook with default config (no config file)", async () => {
|
|
12
|
-
const dir = mkdtempSync(path.join(tmpdir(), "opencode-rag-test-"));
|
|
13
|
-
try {
|
|
14
|
-
// First getConfig call — caches DEFAULT_CONFIG (openCode.enabled = true)
|
|
15
|
-
const hooks = await ragPlugin({ directory: dir }, {});
|
|
16
|
-
assert.ok(typeof hooks["chat.message"] === "function");
|
|
17
|
-
}
|
|
18
|
-
finally {
|
|
19
|
-
rmSync(dir, { recursive: true, force: true });
|
|
20
|
-
}
|
|
21
|
-
});
|
|
22
|
-
it("returns empty hooks when openCode is disabled via opencode-rag.json", async () => {
|
|
23
|
-
const dir = mkdtempSync(path.join(tmpdir(), "opencode-rag-test-"));
|
|
24
|
-
try {
|
|
25
|
-
writeFileSync(path.join(dir, "opencode-rag.json"), JSON.stringify({ openCode: { enabled: false } }));
|
|
26
|
-
const hooks = await ragPlugin({ directory: dir }, {});
|
|
27
|
-
// Note: config was already cached by the first test above.
|
|
28
|
-
// This call will use the cached config (enabled=true), not the file.
|
|
29
|
-
// This tests that caching works correctly — the file is ignored after first load.
|
|
30
|
-
assert.ok(typeof hooks["chat.message"] === "function");
|
|
31
|
-
}
|
|
32
|
-
finally {
|
|
33
|
-
rmSync(dir, { recursive: true, force: true });
|
|
34
|
-
}
|
|
35
|
-
});
|
|
36
|
-
it("reads config from .opencode/rag.json (fallback path)", async () => {
|
|
37
|
-
const dir = mkdtempSync(path.join(tmpdir(), "opencode-rag-test-"));
|
|
38
|
-
try {
|
|
39
|
-
// opencode-rag.json disabled, .opencode/rag.json enabled
|
|
40
|
-
// opencode-rag.json is checked first by getConfig
|
|
41
|
-
writeFileSync(path.join(dir, "opencode-rag.json"), JSON.stringify({ openCode: { enabled: "should-not-matter" } }));
|
|
42
|
-
const opencodeDir = path.join(dir, ".opencode");
|
|
43
|
-
mkdirSync(opencodeDir, { recursive: true });
|
|
44
|
-
writeFileSync(path.join(opencodeDir, "rag.json"), JSON.stringify({ openCode: { enabled: true } }));
|
|
45
|
-
// Config already cached from first test — this uses the cache.
|
|
46
|
-
// But we still verify the plugin doesn't throw when both files exist.
|
|
47
|
-
const hooks = await ragPlugin({ directory: dir }, {});
|
|
48
|
-
assert.ok(typeof hooks["chat.message"] === "function");
|
|
49
|
-
}
|
|
50
|
-
finally {
|
|
51
|
-
rmSync(dir, { recursive: true, force: true });
|
|
52
|
-
}
|
|
53
|
-
});
|
|
54
|
-
it("handles partial config override without crashing", async () => {
|
|
55
|
-
const dir = mkdtempSync(path.join(tmpdir(), "opencode-rag-test-"));
|
|
56
|
-
try {
|
|
57
|
-
writeFileSync(path.join(dir, "opencode-rag.json"), JSON.stringify({ retrieval: { topK: 5 } }));
|
|
58
|
-
const hooks = await ragPlugin({ directory: dir }, {});
|
|
59
|
-
assert.ok(typeof hooks["chat.message"] === "function");
|
|
60
|
-
}
|
|
61
|
-
finally {
|
|
62
|
-
rmSync(dir, { recursive: true, force: true });
|
|
63
|
-
}
|
|
64
|
-
});
|
|
65
|
-
it("handles invalid JSON config gracefully (falls back to defaults)", async () => {
|
|
66
|
-
const dir = mkdtempSync(path.join(tmpdir(), "opencode-rag-test-"));
|
|
67
|
-
try {
|
|
68
|
-
writeFileSync(path.join(dir, "opencode-rag.json"), "not valid json {{{");
|
|
69
|
-
const hooks = await ragPlugin({ directory: dir }, {});
|
|
70
|
-
assert.ok(typeof hooks["chat.message"] === "function");
|
|
71
|
-
}
|
|
72
|
-
finally {
|
|
73
|
-
rmSync(dir, { recursive: true, force: true });
|
|
74
|
-
}
|
|
75
|
-
});
|
|
76
|
-
});
|
|
77
|
-
//# sourceMappingURL=plugin.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.test.js","sourceRoot":"","sources":["../../src/__tests__/plugin.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
import { describe, it } from "node:test";
|
|
2
|
-
import assert from "node:assert/strict";
|
|
3
|
-
import { retrieve } from "../../retriever/retriever.js";
|
|
4
|
-
function makeEmbedder(vectors) {
|
|
5
|
-
return {
|
|
6
|
-
name: "mock",
|
|
7
|
-
async embed(_texts) {
|
|
8
|
-
return vectors;
|
|
9
|
-
},
|
|
10
|
-
};
|
|
11
|
-
}
|
|
12
|
-
function makeStore(results) {
|
|
13
|
-
return {
|
|
14
|
-
async addChunks(_chunks) { },
|
|
15
|
-
async search(_embedding, _topK) {
|
|
16
|
-
return results;
|
|
17
|
-
},
|
|
18
|
-
async count() {
|
|
19
|
-
return results.length;
|
|
20
|
-
},
|
|
21
|
-
async clear() { },
|
|
22
|
-
async deleteByFilePath(_filePath) { },
|
|
23
|
-
};
|
|
24
|
-
}
|
|
25
|
-
describe("retrieve", () => {
|
|
26
|
-
it("returns search results from store", async () => {
|
|
27
|
-
const embedder = makeEmbedder([[0.1, 0.2, 0.3]]);
|
|
28
|
-
const store = makeStore([
|
|
29
|
-
{
|
|
30
|
-
score: 0.95,
|
|
31
|
-
chunk: {
|
|
32
|
-
id: "chunk-1",
|
|
33
|
-
content: "test content",
|
|
34
|
-
metadata: {
|
|
35
|
-
filePath: "test.ts",
|
|
36
|
-
startLine: 1,
|
|
37
|
-
endLine: 10,
|
|
38
|
-
language: "typescript",
|
|
39
|
-
},
|
|
40
|
-
},
|
|
41
|
-
},
|
|
42
|
-
]);
|
|
43
|
-
const results = await retrieve("test query", embedder, store);
|
|
44
|
-
assert.equal(results.length, 1);
|
|
45
|
-
assert.equal(results[0].score, 0.95);
|
|
46
|
-
assert.equal(results[0].chunk.id, "chunk-1");
|
|
47
|
-
});
|
|
48
|
-
it("returns empty array when embedding is empty", async () => {
|
|
49
|
-
const embedder = makeEmbedder([[]]);
|
|
50
|
-
const store = makeStore([]);
|
|
51
|
-
const results = await retrieve("test query", embedder, store);
|
|
52
|
-
assert.deepStrictEqual(results, []);
|
|
53
|
-
});
|
|
54
|
-
it("returns empty array when embeddings are empty array", async () => {
|
|
55
|
-
const embedder = makeEmbedder([]);
|
|
56
|
-
const store = makeStore([]);
|
|
57
|
-
const results = await retrieve("test query", embedder, store);
|
|
58
|
-
assert.deepStrictEqual(results, []);
|
|
59
|
-
});
|
|
60
|
-
it("passes custom topK to store", async () => {
|
|
61
|
-
let receivedTopK = 0;
|
|
62
|
-
const embedder = makeEmbedder([[0.1, 0.2]]);
|
|
63
|
-
const store = {
|
|
64
|
-
async addChunks() { },
|
|
65
|
-
async search(_embedding, topK) {
|
|
66
|
-
receivedTopK = topK;
|
|
67
|
-
return [];
|
|
68
|
-
},
|
|
69
|
-
async count() {
|
|
70
|
-
return 0;
|
|
71
|
-
},
|
|
72
|
-
async clear() { },
|
|
73
|
-
async deleteByFilePath(_filePath) { },
|
|
74
|
-
};
|
|
75
|
-
await retrieve("query", embedder, store, { topK: 5 });
|
|
76
|
-
assert.equal(receivedTopK, 5);
|
|
77
|
-
});
|
|
78
|
-
it("uses default topK of 10", async () => {
|
|
79
|
-
let receivedTopK = 0;
|
|
80
|
-
const embedder = makeEmbedder([[0.1, 0.2]]);
|
|
81
|
-
const store = {
|
|
82
|
-
async addChunks() { },
|
|
83
|
-
async search(_embedding, topK) {
|
|
84
|
-
receivedTopK = topK;
|
|
85
|
-
return [];
|
|
86
|
-
},
|
|
87
|
-
async count() {
|
|
88
|
-
return 0;
|
|
89
|
-
},
|
|
90
|
-
async clear() { },
|
|
91
|
-
async deleteByFilePath(_filePath) { },
|
|
92
|
-
};
|
|
93
|
-
await retrieve("query", embedder, store);
|
|
94
|
-
assert.equal(receivedTopK, 10);
|
|
95
|
-
});
|
|
96
|
-
});
|
|
97
|
-
//# sourceMappingURL=retriever.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"retriever.test.js","sourceRoot":"","sources":["../../../src/__tests__/retriever/retriever.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|