diff --git a/src/services/toolExecutor.ts b/src/services/toolExecutor.ts index 1964f22..b1ebfff 100644 --- a/src/services/toolExecutor.ts +++ b/src/services/toolExecutor.ts @@ -24,7 +24,9 @@ import type { FileListArgs, SyntaxCheckArgs, SimulationArgs, - WaveformSummaryArgs + WaveformSummaryArgs, + KnowledgeSaveArgs, + KnowledgeLoadArgs } from '../types/api'; /** @@ -77,6 +79,12 @@ export async function executeToolCall( case 'waveform_summary': resultText = await executeWaveformSummary(args as unknown as WaveformSummaryArgs); break; + case 'knowledge_save': + resultText = await executeKnowledgeSave(args as unknown as KnowledgeSaveArgs); + break; + case 'knowledge_load': + resultText = await executeKnowledgeLoad(); + break; default: throw new Error(`未知工具: ${toolName}`); } @@ -287,6 +295,53 @@ async function executeWaveformSummary(args: WaveformSummaryArgs): Promise { + const workspaceFolders = vscode.workspace.workspaceFolders; + if (!workspaceFolders || workspaceFolders.length === 0) { + throw new Error('请先打开一个工作区'); + } + + const workspacePath = workspaceFolders[0].uri.fsPath; + const iccoderDir = path.join(workspacePath, '.iccoder'); + const knowledgePath = path.join(iccoderDir, 'knowledge.json'); + + // 确保 .iccoder 目录存在 + if (!fs.existsSync(iccoderDir)) { + fs.mkdirSync(iccoderDir, { recursive: true }); + } + + // 写入知识图谱 + fs.writeFileSync(knowledgePath, args.data, 'utf-8'); + + return `知识图谱已保存: .iccoder/knowledge.json`; +} + +/** + * 执行 knowledge_load 工具 + * 从 .iccoder/knowledge.json 加载知识图谱 + */ +async function executeKnowledgeLoad(): Promise { + const workspaceFolders = vscode.workspace.workspaceFolders; + if (!workspaceFolders || workspaceFolders.length === 0) { + throw new Error('请先打开一个工作区'); + } + + const workspacePath = workspaceFolders[0].uri.fsPath; + const knowledgePath = path.join(workspacePath, '.iccoder', 'knowledge.json'); + + // 如果文件不存在,返回空图谱 + if (!fs.existsSync(knowledgePath)) { + return JSON.stringify({ directed: true, nodes: [], links: [] }); + } + + const content = fs.readFileSync(knowledgePath, 'utf-8'); + return content; +} + /** * 获取 iverilog 路径 */ diff --git a/src/types/api.ts b/src/types/api.ts index caad53f..7927f4f 100644 --- a/src/types/api.ts +++ b/src/types/api.ts @@ -196,7 +196,9 @@ export type ToolName = | 'file_list' | 'syntax_check' | 'simulation' - | 'waveform_summary'; + | 'waveform_summary' + | 'knowledge_save' + | 'knowledge_load'; /** file_read 工具参数 */ export interface FileReadArgs { @@ -240,6 +242,17 @@ export interface WaveformSummaryArgs { checkpoints?: string; } +/** knowledge_save 工具参数 */ +export interface KnowledgeSaveArgs { + /** 知识图谱 JSON 数据 */ + data: string; +} + +/** knowledge_load 工具参数 */ +export interface KnowledgeLoadArgs { + // 无参数,直接读取 .iccoder/knowledge.json +} + /** 工具参数联合类型 */ export type ToolArgs = | FileReadArgs @@ -248,4 +261,6 @@ export type ToolArgs = | FileListArgs | SyntaxCheckArgs | SimulationArgs - | WaveformSummaryArgs; + | WaveformSummaryArgs + | KnowledgeSaveArgs + | KnowledgeLoadArgs;