import { z } from "zod"; import path from "path"; import { fileURLToPath } from "url"; import { getAllTasks } from "../../models/taskModel.js"; import { TaskStatus, Task } from "../../types/index.js"; import { getPlanTaskPrompt } from "../../prompts/index.js"; // 開始規劃工具 export const planTaskSchema = z.object({ description: z .string() .min(10, { message: "任務描述不能少於10個字符,請提供更詳細的描述以確保任務目標明確", }) .describe("完整詳細的任務問題描述,應包含任務目標、背景及預期成果"), requirements: z .string() .optional() .describe("任務的特定技術要求、業務約束條件或品質標準(選填)"), existingTasksReference: z .boolean() .optional() .default(false) .describe("是否參考現有任務作為規劃基礎,用於任務調整和延續性規劃"), }); export async function planTask({ description, requirements, existingTasksReference = false, }: z.infer) { // 獲取基礎目錄路徑 const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); const PROJECT_ROOT = path.resolve(__dirname, "../../.."); const DATA_DIR = process.env.DATA_DIR || path.join(PROJECT_ROOT, "data"); const MEMORY_DIR = path.join(DATA_DIR, "memory"); // 準備所需參數 let completedTasks: Task[] = []; let pendingTasks: Task[] = []; // 當 existingTasksReference 為 true 時,從數據庫中載入所有任務作為參考 if (existingTasksReference) { try { const allTasks = await getAllTasks(); // 將任務分為已完成和未完成兩類 completedTasks = allTasks.filter( (task) => task.status === TaskStatus.COMPLETED ); pendingTasks = allTasks.filter( (task) => task.status !== TaskStatus.COMPLETED ); } catch (error) {} } // 使用prompt生成器獲取最終prompt const prompt = getPlanTaskPrompt({ description, requirements, existingTasksReference, completedTasks, pendingTasks, memoryDir: MEMORY_DIR, }); return { content: [ { type: "text" as const, text: prompt, }, ], }; }