77 lines
2.2 KiB
TypeScript
Raw Normal View History

2025-05-05 16:22:21 +08:00
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<typeof planTaskSchema>) {
// 獲取基礎目錄路徑
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,
},
],
};
}