Spaces:
Sleeping
Sleeping
| import { NextRequest, NextResponse } from 'next/server' | |
| import { requireRole } from '@/lib/auth' | |
| import { syncAgentsFromConfig, previewSyncDiff } from '@/lib/agent-sync' | |
| import { syncLocalAgents } from '@/lib/local-agent-sync' | |
| import { logger } from '@/lib/logger' | |
| /** | |
| * POST /api/agents/sync - Trigger agent config sync | |
| * ?source=local triggers local disk scan instead of openclaw.json sync. | |
| * Requires admin role. | |
| */ | |
| export async function POST(request: NextRequest) { | |
| const auth = requireRole(request, 'admin') | |
| if ('error' in auth) return NextResponse.json({ error: auth.error }, { status: auth.status }) | |
| const { searchParams } = new URL(request.url) | |
| const source = searchParams.get('source') | |
| try { | |
| if (source === 'local') { | |
| const result = await syncLocalAgents() | |
| return NextResponse.json(result) | |
| } | |
| const result = await syncAgentsFromConfig(auth.user.username) | |
| if (result.error) { | |
| return NextResponse.json({ error: result.error }, { status: 500 }) | |
| } | |
| return NextResponse.json(result) | |
| } catch (error: any) { | |
| logger.error({ err: error }, 'POST /api/agents/sync error') | |
| return NextResponse.json({ error: error.message || 'Sync failed' }, { status: 500 }) | |
| } | |
| } | |
| /** | |
| * GET /api/agents/sync - Preview diff between openclaw.json and MC | |
| * Shows what would change without writing. | |
| */ | |
| export async function GET(request: NextRequest) { | |
| const auth = requireRole(request, 'admin') | |
| if ('error' in auth) return NextResponse.json({ error: auth.error }, { status: auth.status }) | |
| try { | |
| const diff = await previewSyncDiff() | |
| return NextResponse.json(diff) | |
| } catch (error: any) { | |
| logger.error({ err: error }, 'GET /api/agents/sync error') | |
| return NextResponse.json({ error: error.message || 'Preview failed' }, { status: 500 }) | |
| } | |
| } | |