117 lines
3.5 KiB
TypeScript
117 lines
3.5 KiB
TypeScript
import { NextRequest, NextResponse } from "next/server";
|
|
import fs from "fs";
|
|
import path from "path";
|
|
|
|
const STORAGE_DIR = path.join(process.cwd(), "data");
|
|
const TEMPLATES_FILE = path.join(STORAGE_DIR, "recurring-templates.json");
|
|
const LOGS_FILE = path.join(STORAGE_DIR, "execution-logs.json");
|
|
const CHANGELOG_FILE = path.join(STORAGE_DIR, "changelog.json");
|
|
const OUTPUTS_FILE = path.join(STORAGE_DIR, "agent-outputs.json");
|
|
|
|
function ensureDir() {
|
|
if (!fs.existsSync(STORAGE_DIR)) {
|
|
fs.mkdirSync(STORAGE_DIR, { recursive: true });
|
|
}
|
|
}
|
|
|
|
function readJSON(file: string, defaultValue: any = []) {
|
|
ensureDir();
|
|
if (!fs.existsSync(file)) {
|
|
fs.writeFileSync(file, JSON.stringify(defaultValue));
|
|
return defaultValue;
|
|
}
|
|
try {
|
|
return JSON.parse(fs.readFileSync(file, "utf-8"));
|
|
} catch {
|
|
return defaultValue;
|
|
}
|
|
}
|
|
|
|
function writeJSON(file: string, data: any) {
|
|
ensureDir();
|
|
fs.writeFileSync(file, JSON.stringify(data, null, 2));
|
|
}
|
|
|
|
// Templates CRUD
|
|
export async function GET() {
|
|
const templates = readJSON(TEMPLATES_FILE, []);
|
|
return NextResponse.json(templates);
|
|
}
|
|
|
|
export async function POST(request: NextRequest) {
|
|
try {
|
|
const body = await request.json();
|
|
const { action, template, templateId, enabled } = body;
|
|
|
|
const templates = readJSON(TEMPLATES_FILE, []);
|
|
|
|
if (action === "toggle") {
|
|
const idx = templates.findIndex((t: any) => t.id === templateId);
|
|
if (idx >= 0) {
|
|
templates[idx].enabled = enabled;
|
|
writeJSON(TEMPLATES_FILE, templates);
|
|
return NextResponse.json({ success: true, templates });
|
|
}
|
|
}
|
|
|
|
if (action === "save") {
|
|
const idx = templates.findIndex((t: any) => t.id === template.id);
|
|
if (idx >= 0) {
|
|
templates[idx] = { ...templates[idx], ...template };
|
|
} else {
|
|
templates.push({ ...template, runCount: 0, enabled: false });
|
|
}
|
|
writeJSON(TEMPLATES_FILE, templates);
|
|
return NextResponse.json({ success: true, templates });
|
|
}
|
|
|
|
if (action === "delete") {
|
|
const filtered = templates.filter((t: any) => t.id !== templateId);
|
|
writeJSON(TEMPLATES_FILE, filtered);
|
|
return NextResponse.json({ success: true, templates: filtered });
|
|
}
|
|
|
|
if (action === "run-now") {
|
|
// Trigger immediate execution
|
|
const idx = templates.findIndex((t: any) => t.id === templateId);
|
|
if (idx >= 0) {
|
|
const template = templates[idx];
|
|
|
|
// Create execution log
|
|
const logs = readJSON(LOGS_FILE, []);
|
|
const logId = `log-${Date.now()}`;
|
|
const newLog = {
|
|
id: logId,
|
|
templateId: template.id,
|
|
agent: template.agent,
|
|
taskTitle: template.taskTemplate.title,
|
|
startedAt: new Date().toISOString(),
|
|
status: "running",
|
|
output: "Agent executing..."
|
|
};
|
|
logs.unshift(newLog);
|
|
writeJSON(LOGS_FILE, logs);
|
|
|
|
// Update template
|
|
templates[idx].lastRun = new Date().toISOString();
|
|
templates[idx].runCount = (templates[idx].runCount || 0) + 1;
|
|
writeJSON(TEMPLATES_FILE, templates);
|
|
|
|
// TODO: Actually dispatch to OpenClaw agent here
|
|
// For now, simulate completion after delay
|
|
|
|
return NextResponse.json({
|
|
success: true,
|
|
templates,
|
|
executionLog: newLog
|
|
});
|
|
}
|
|
}
|
|
|
|
return NextResponse.json({ error: "Invalid action" }, { status: 400 });
|
|
|
|
} catch (error) {
|
|
return NextResponse.json({ error: "Internal server error" }, { status: 500 });
|
|
}
|
|
}
|