route.ts
1 import { NextResponse } from 'next/server' 2 import { listRuns } from '@/lib/server/runtime/session-run-manager' 3 import { listProtocolRuns } from '@/lib/server/protocols/protocol-queries' 4 import { protocolRunToSessionRunRecord } from '@/lib/server/runs/unified-run-records' 5 import type { ProtocolRunStatus, SessionRunStatus } from '@/types' 6 7 export const dynamic = 'force-dynamic' 8 9 function protocolStatusesForRunStatus(status?: SessionRunStatus): ProtocolRunStatus[] { 10 switch (status) { 11 case 'queued': 12 return ['draft'] 13 case 'running': 14 return ['running', 'waiting', 'paused'] 15 case 'completed': 16 return ['completed'] 17 case 'failed': 18 return ['failed'] 19 case 'cancelled': 20 return ['cancelled', 'archived'] 21 default: 22 return [] 23 } 24 } 25 26 export async function GET(req: Request) { 27 const { searchParams } = new URL(req.url) 28 const sessionId = searchParams.get('sessionId') || undefined 29 const status = (searchParams.get('status') || undefined) as SessionRunStatus | undefined 30 const limitRaw = searchParams.get('limit') 31 const limit = limitRaw ? Number.parseInt(limitRaw, 10) : undefined 32 33 const sessionRuns = listRuns({ sessionId, status, limit }) 34 const fetchLimit = limit || 200 35 const scopedProtocolRuns = status 36 ? protocolStatusesForRunStatus(status).flatMap((protocolStatus) => listProtocolRuns({ 37 includeSystemOwned: true, 38 sessionId, 39 status: protocolStatus, 40 limit: fetchLimit, 41 })) 42 : listProtocolRuns({ 43 includeSystemOwned: true, 44 sessionId, 45 limit: fetchLimit, 46 }) 47 const protocolRuns = Array.from(new Map(scopedProtocolRuns.map((run) => [run.id, run])).values()) 48 .filter((run) => run.status !== 'archived') 49 .map(protocolRunToSessionRunRecord) 50 .filter((run) => !status || run.status === status) 51 const runs = [...sessionRuns, ...protocolRuns] 52 .sort((left, right) => (right.queuedAt || 0) - (left.queuedAt || 0)) 53 .slice(0, fetchLimit) 54 return NextResponse.json(runs) 55 }