import { config } from "dotenv"; import fs from "fs"; import path from "path"; import { env } from "process"; export async function main() { const url = new URL(process.argv[2]); const threadId = url.pathname.split("/").pop(); const host = url.host; const apiURL = new URL( `/api/langgraph/threads/${threadId}/history`, `${url.protocol}//${host}`, ); const response = await fetch(apiURL, { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ limit: 10, }), }); const data = (await response.json())[0]; if (!data) { console.error("No data found"); return; } const title = data.values.title; const rootPath = path.resolve(process.cwd(), "public/demo/threads", threadId); if (fs.existsSync(rootPath)) { fs.rmSync(rootPath, { recursive: true }); } fs.mkdirSync(rootPath, { recursive: true }); fs.writeFileSync( path.resolve(rootPath, "thread.json"), JSON.stringify(data, null, 2), ); const backendRootPath = path.resolve( process.cwd(), "../backend/.deer-flow/threads", threadId, ); copyFolder("user-data/outputs", rootPath, backendRootPath); copyFolder("user-data/uploads", rootPath, backendRootPath); console.info(`Saved demo "${title}" to ${rootPath}`); } function copyFolder(relPath, rootPath, backendRootPath) { const outputsPath = path.resolve(backendRootPath, relPath); if (fs.existsSync(outputsPath)) { fs.cpSync(outputsPath, path.resolve(rootPath, relPath), { recursive: true, }); } } config(); main();