Files
agent-ui/server/routes/snapshots.ts
josedario87 3f15aa590b feat: Add canvas snapshots to save and restore full canvas state
Implements save/restore system that captures HTML base, injected CSS,
executed scripts, and floating Vue windows with their full definitions.
Adds 4 MCP tools, backend CRUD API, Pinia store, and script logger.
2026-02-14 23:08:33 -06:00

50 lines
1.3 KiB
TypeScript

import { db } from '../db'
import { jsonResponse, errorResponse } from '../utils/cors'
export async function handleSnapshots(req: Request) {
if (req.method === 'GET') {
const rows = db.query(
'SELECT id, name, thumbnail, created_at FROM canvas_snapshots ORDER BY created_at DESC'
).all()
return jsonResponse(rows)
}
if (req.method === 'POST') {
const body = await req.json()
const id = body.id || `snap-${Date.now()}`
const stmt = db.prepare(
'INSERT OR REPLACE INTO canvas_snapshots (id, name, data, thumbnail, created_at) VALUES (?, ?, ?, ?, ?)'
)
stmt.run(
id,
body.name,
typeof body.data === 'string' ? body.data : JSON.stringify(body.data),
body.thumbnail || null,
body.created_at || Date.now()
)
return jsonResponse({ success: true, id })
}
return null
}
export async function handleSnapshotById(req: Request, id: string) {
if (req.method === 'GET') {
const row = db.query('SELECT * FROM canvas_snapshots WHERE id = ?').get(id) as any
if (!row) {
return errorResponse('Snapshot not found', 404)
}
return jsonResponse({
...row,
data: JSON.parse(row.data)
})
}
if (req.method === 'DELETE') {
db.run('DELETE FROM canvas_snapshots WHERE id = ?', [id])
return jsonResponse({ success: true })
}
return null
}