/**
 * AG-UI streaming endpoint — Claude Code Agent SDK.
 */

import { NextRequest } from "next/server";
import "@/lib/sdk-init";
import { runAgent } from "@optage/sdk";
import type { RunAgentInput } from "@optage/sdk";

export const runtime = "nodejs";

export async function POST(request: NextRequest) {
  const input = (await request.json()) as RunAgentInput;

  const encoder = new TextEncoder();
  const stream = new ReadableStream({
    async start(controller) {
      const heartbeat = setInterval(() => {
        try {
          controller.enqueue(encoder.encode(": heartbeat\n\n"));
        } catch { /* stream already closed */ }
      }, 15_000);

      try {
        for await (const event of runAgent(input)) {
          controller.enqueue(
            encoder.encode(`data: ${JSON.stringify(event)}\n\n`),
          );
        }
        controller.enqueue(encoder.encode("data: [DONE]\n\n"));
      } catch (err) {
        controller.enqueue(
          encoder.encode(
            `data: ${JSON.stringify({
              type: "RUN_ERROR",
              message: err instanceof Error ? err.message : String(err),
            })}\n\n`,
          ),
        );
      } finally {
        clearInterval(heartbeat);
        controller.close();
      }
    },
  });

  return new Response(stream, {
    headers: {
      "Content-Type": "text/event-stream",
      "Cache-Control": "no-cache",
      Connection: "keep-alive",
    },
  });
}
