opencode-rag-plugin 1.2.4 → 1.2.10
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 +491 -463
- package/dist/cli.js +55 -1
- package/dist/cli.js.map +1 -1
- package/dist/plugin-entry.d.ts +1 -1
- package/dist/plugin-entry.js +2 -2
- package/dist/plugin-entry.js.map +1 -1
- package/package.json +90 -90
- 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,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 {};
|
|
@@ -1,159 +0,0 @@
|
|
|
1
|
-
import { describe, it, before, after } from "node:test";
|
|
2
|
-
import assert from "node:assert/strict";
|
|
3
|
-
import { LanceDBStore } from "../../vectorstore/lancedb.js";
|
|
4
|
-
import { normalizeFilePath } from "../../core/manifest.js";
|
|
5
|
-
describe("LanceDBStore (memory)", () => {
|
|
6
|
-
let store;
|
|
7
|
-
before(async () => {
|
|
8
|
-
store = new LanceDBStore("memory://");
|
|
9
|
-
});
|
|
10
|
-
after(async () => {
|
|
11
|
-
await store.clear();
|
|
12
|
-
});
|
|
13
|
-
it("starts with zero count", async () => {
|
|
14
|
-
const count = await store.count();
|
|
15
|
-
assert.equal(count, 0);
|
|
16
|
-
});
|
|
17
|
-
it("adds chunks and returns correct count", async () => {
|
|
18
|
-
const chunks = [
|
|
19
|
-
{
|
|
20
|
-
id: "chunk-1",
|
|
21
|
-
content: "function hello() { return 'world'; }",
|
|
22
|
-
embedding: new Array(384).fill(0).map((_, i) => (i % 2 === 0 ? 0.1 : -0.1)),
|
|
23
|
-
metadata: {
|
|
24
|
-
filePath: "src/hello.ts",
|
|
25
|
-
startLine: 1,
|
|
26
|
-
endLine: 5,
|
|
27
|
-
language: "typescript",
|
|
28
|
-
},
|
|
29
|
-
},
|
|
30
|
-
{
|
|
31
|
-
id: "chunk-2",
|
|
32
|
-
content: "function goodbye() { return 'farewell'; }",
|
|
33
|
-
embedding: new Array(384).fill(0).map((_, i) => (i % 2 === 0 ? -0.1 : 0.1)),
|
|
34
|
-
metadata: {
|
|
35
|
-
filePath: "src/goodbye.ts",
|
|
36
|
-
startLine: 1,
|
|
37
|
-
endLine: 5,
|
|
38
|
-
language: "typescript",
|
|
39
|
-
},
|
|
40
|
-
},
|
|
41
|
-
];
|
|
42
|
-
await store.addChunks(chunks);
|
|
43
|
-
const count = await store.count();
|
|
44
|
-
assert.equal(count, 2);
|
|
45
|
-
});
|
|
46
|
-
it("searches and returns results with scores", async () => {
|
|
47
|
-
// Search with a vector similar to chunk-1
|
|
48
|
-
const queryVector = new Array(384).fill(0).map((_, i) => i % 2 === 0 ? 0.1 : -0.1);
|
|
49
|
-
const results = await store.search(queryVector, 2);
|
|
50
|
-
assert.ok(results.length > 0, "Should return at least one result");
|
|
51
|
-
assert.ok(results[0].score > 0, "Score should be positive");
|
|
52
|
-
assert.ok(results[0].score <= 1, "Score should be <= 1");
|
|
53
|
-
assert.equal(typeof results[0].chunk.id, "string");
|
|
54
|
-
assert.equal(typeof results[0].chunk.content, "string");
|
|
55
|
-
});
|
|
56
|
-
it("respects topK parameter", async () => {
|
|
57
|
-
const queryVector = new Array(384).fill(0.1);
|
|
58
|
-
const results = await store.search(queryVector, 1);
|
|
59
|
-
assert.equal(results.length, 1);
|
|
60
|
-
});
|
|
61
|
-
it("clears all chunks", async () => {
|
|
62
|
-
await store.clear();
|
|
63
|
-
const count = await store.count();
|
|
64
|
-
assert.equal(count, 0);
|
|
65
|
-
});
|
|
66
|
-
it("can re-add chunks after clear", async () => {
|
|
67
|
-
const chunks = [
|
|
68
|
-
{
|
|
69
|
-
id: "chunk-3",
|
|
70
|
-
content: "new content",
|
|
71
|
-
embedding: new Array(384).fill(0.05),
|
|
72
|
-
metadata: {
|
|
73
|
-
filePath: "src/new.ts",
|
|
74
|
-
startLine: 1,
|
|
75
|
-
endLine: 3,
|
|
76
|
-
language: "typescript",
|
|
77
|
-
},
|
|
78
|
-
},
|
|
79
|
-
];
|
|
80
|
-
await store.addChunks(chunks);
|
|
81
|
-
const count = await store.count();
|
|
82
|
-
assert.equal(count, 1);
|
|
83
|
-
});
|
|
84
|
-
it("filters out chunks without embeddings in addChunks", async () => {
|
|
85
|
-
await store.clear();
|
|
86
|
-
const chunks = [
|
|
87
|
-
{
|
|
88
|
-
id: "no-embed",
|
|
89
|
-
content: "no embedding",
|
|
90
|
-
embedding: undefined,
|
|
91
|
-
metadata: {
|
|
92
|
-
filePath: "test.ts",
|
|
93
|
-
startLine: 1,
|
|
94
|
-
endLine: 1,
|
|
95
|
-
language: "typescript",
|
|
96
|
-
},
|
|
97
|
-
},
|
|
98
|
-
{
|
|
99
|
-
id: "empty-embed",
|
|
100
|
-
content: "empty embedding",
|
|
101
|
-
embedding: [],
|
|
102
|
-
metadata: {
|
|
103
|
-
filePath: "test.ts",
|
|
104
|
-
startLine: 2,
|
|
105
|
-
endLine: 2,
|
|
106
|
-
language: "typescript",
|
|
107
|
-
},
|
|
108
|
-
},
|
|
109
|
-
];
|
|
110
|
-
await store.addChunks(chunks);
|
|
111
|
-
const count = await store.count();
|
|
112
|
-
assert.equal(count, 0, "Chunks without embeddings should not be stored");
|
|
113
|
-
});
|
|
114
|
-
it("deletes all chunks for a specific file path", async () => {
|
|
115
|
-
await store.clear();
|
|
116
|
-
await store.addChunks([
|
|
117
|
-
{
|
|
118
|
-
id: "delete-1",
|
|
119
|
-
content: "alpha",
|
|
120
|
-
embedding: new Array(384).fill(0.1),
|
|
121
|
-
metadata: {
|
|
122
|
-
filePath: "src/delete-me.ts",
|
|
123
|
-
startLine: 1,
|
|
124
|
-
endLine: 1,
|
|
125
|
-
language: "typescript",
|
|
126
|
-
},
|
|
127
|
-
},
|
|
128
|
-
{
|
|
129
|
-
id: "delete-2",
|
|
130
|
-
content: "beta",
|
|
131
|
-
embedding: new Array(384).fill(0.2),
|
|
132
|
-
metadata: {
|
|
133
|
-
filePath: "src/keep-me.ts",
|
|
134
|
-
startLine: 1,
|
|
135
|
-
endLine: 1,
|
|
136
|
-
language: "typescript",
|
|
137
|
-
},
|
|
138
|
-
},
|
|
139
|
-
{
|
|
140
|
-
id: "delete-3",
|
|
141
|
-
content: "gamma",
|
|
142
|
-
embedding: new Array(384).fill(0.3),
|
|
143
|
-
metadata: {
|
|
144
|
-
filePath: "src/delete-me.ts",
|
|
145
|
-
startLine: 2,
|
|
146
|
-
endLine: 2,
|
|
147
|
-
language: "typescript",
|
|
148
|
-
},
|
|
149
|
-
},
|
|
150
|
-
]);
|
|
151
|
-
await store.deleteByFilePath("src/delete-me.ts");
|
|
152
|
-
const count = await store.count();
|
|
153
|
-
assert.equal(count, 1);
|
|
154
|
-
const results = await store.search(new Array(384).fill(0.2), 5);
|
|
155
|
-
assert.equal(results.length, 1);
|
|
156
|
-
assert.equal(results[0].chunk.metadata.filePath, normalizeFilePath("src/keep-me.ts"));
|
|
157
|
-
});
|
|
158
|
-
});
|
|
159
|
-
//# sourceMappingURL=lancedb.test.js.map
|