90 lines
2.5 KiB
TypeScript
90 lines
2.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 LOGS_FILE = path.join(STORAGE_DIR, "execution-logs.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));
|
|
}
|
|
|
|
export async function GET(request: NextRequest) {
|
|
const { searchParams } = new URL(request.url);
|
|
const agent = searchParams.get("agent");
|
|
const templateId = searchParams.get("templateId");
|
|
const limit = parseInt(searchParams.get("limit") || "50");
|
|
|
|
let logs = readJSON(LOGS_FILE, []);
|
|
|
|
// Filter by agent
|
|
if (agent) {
|
|
logs = logs.filter((l: any) => l.agent === agent);
|
|
}
|
|
|
|
// Filter by template
|
|
if (templateId) {
|
|
logs = logs.filter((l: any) => l.templateId === templateId);
|
|
}
|
|
|
|
// Limit
|
|
logs = logs.slice(0, limit);
|
|
|
|
return NextResponse.json(logs);
|
|
}
|
|
|
|
export async function POST(request: NextRequest) {
|
|
try {
|
|
const body = await request.json();
|
|
const { action, logId, output, status, agent } = body;
|
|
|
|
const logs = readJSON(LOGS_FILE, []);
|
|
|
|
if (action === "update") {
|
|
const idx = logs.findIndex((l: any) => l.id === logId);
|
|
if (idx >= 0) {
|
|
if (status) logs[idx].status = status;
|
|
if (output) logs[idx].output = output;
|
|
if (status === "completed" || status === "failed") {
|
|
logs[idx].completedAt = new Date().toISOString();
|
|
}
|
|
writeJSON(LOGS_FILE, logs);
|
|
return NextResponse.json({ success: true, log: logs[idx] });
|
|
}
|
|
}
|
|
|
|
if (action === "clear") {
|
|
// Clear old logs (keep last 100)
|
|
const filtered = logs.slice(0, 100);
|
|
writeJSON(LOGS_FILE, filtered);
|
|
return NextResponse.json({ success: true, logs: filtered });
|
|
}
|
|
|
|
return NextResponse.json({ error: "Invalid action" }, { status: 400 });
|
|
|
|
} catch (error) {
|
|
return NextResponse.json({ error: "Internal server error" }, { status: 500 });
|
|
}
|
|
}
|