43 lines
1.5 KiB
TypeScript
43 lines
1.5 KiB
TypeScript
import { tool, definePlugin } from "opencode";
|
|
import { z } from "zod";
|
|
|
|
export default definePlugin({
|
|
name: "ocrag-plugin",
|
|
hooks: () => ({
|
|
rag_add: tool({
|
|
description: "向本地 RAG 知识库添加一个或多个代码文件或目录。添加后,后续搜索将包含这些代码。",
|
|
parameters: {
|
|
paths: z.array(z.string()).describe("要添加的文件或目录路径列表"),
|
|
recursive: z.boolean().optional().describe("如果路径是目录,是否递归添加所有子文件"),
|
|
},
|
|
execute: async (args) => {
|
|
try {
|
|
const paths = args.paths.join(" ");
|
|
const recursiveFlag = args.recursive ? "--recursive" : "";
|
|
const cmd = `ocrag add ${paths} ${recursiveFlag}`;
|
|
const result = Bun.$`${cmd}`.text();
|
|
return result;
|
|
} catch (error) {
|
|
return `Error: ${error.message}`;
|
|
}
|
|
},
|
|
}),
|
|
rag_search: tool({
|
|
description: "在本地 RAG 知识库中执行语义搜索,返回与查询最相关的代码片段。",
|
|
parameters: {
|
|
query: z.string().describe("自然语言查询,例如:'如何实现用户认证'"),
|
|
top_k: z.number().optional().default(5).describe("返回结果数量"),
|
|
},
|
|
execute: async (args) => {
|
|
try {
|
|
const cmd = `ocrag search "${args.query}" --top-k ${args.top_k}`;
|
|
const result = Bun.$`${cmd}`.text();
|
|
return result;
|
|
} catch (error) {
|
|
return `Error: ${error.message}`;
|
|
}
|
|
},
|
|
}),
|
|
}),
|
|
});
|