feat(dse): kuratierter DSEAgent + Snapshot-Tab (Art. 13/14, kein Firehose)

DSEAgent wrappt die existierende ART13_CHECKLIST (33 kuratierte Pflichtangaben
L1 + Detailchecks L2) → strukturierter AgentOutput, NICHT der 90k-Library-
Firehose (eCall/Gesundheit/Telekom-Lärm). GET /snapshots/{id}/dse-check spiegelt
impressum-check; doc_input_from_snapshot generalisiert. Frontend: generischer
AgentModuleTab (lazy → AgentResultTab) für Impressum + DSE; DSE-Tab in der
Snapshot-Seite. Plus HRB-Pattern \d→\d+ (volle Registernummer als Beleg).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
Benjamin Admin
2026-06-11 12:46:46 +02:00
parent be93859645
commit 76be96556d
10 changed files with 352 additions and 40 deletions
@@ -0,0 +1,34 @@
/**
* DSE-Analyse-Proxy
* GET /api/sdk/v1/agent/snapshots/{snapshotId}/dse-check
* → backend /api/compliance/agent/snapshots/{snapshotId}/dse-check
*
* Laeuft den kuratierten DSEAgent (Art. 13/14, ART13_CHECKLIST — kein
* Library-Firehose) auf dem gespeicherten DSE-Text (kein Re-Crawl).
*/
import { NextRequest, NextResponse } from 'next/server'
const BACKEND_URL =
process.env.BACKEND_API_URL || process.env.BACKEND_URL ||
'http://backend-compliance:8002'
export async function GET(
_request: NextRequest,
{ params }: { params: Promise<{ snapshotId: string }> },
) {
const { snapshotId } = await params
try {
const response = await fetch(
`${BACKEND_URL}/api/compliance/agent/snapshots/${snapshotId}/dse-check`,
{ signal: AbortSignal.timeout(120_000) },
)
const data = await response.json()
return NextResponse.json(data, { status: response.status })
} catch {
return NextResponse.json(
{ error: 'DSE-Analyse fehlgeschlagen', findings: [] },
{ status: 503 },
)
}
}