/ src / app / api / runs / route.ts
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  }