feat(worker-logs): add worker run-log viewer page
Nieuwe /worker-logs pagina: een tabel van de laatste N (10/25/50/100) worker-runs met een inline detailpaneel dat de stream-json output van Claude Code als leesbare timeline toont (system-init, assistant-tekst, tool-calls/results, result-kaart). - lib/parse-worker-log.ts: pure parser — summarizeRunLog (tabel) + parseRunLog (timeline), discriminated-union events, server-side truncatie van grote tool-results. - lib/worker-logs.ts: server-only fs-toegang, leest uit WORKER_LOGS_DIR (read-only bind mount), naam-regex + pad-confinement, .gz support. - app/api/worker-logs[/[name]]: GET-routes, auth-guarded, force-dynamic. - app/worker-logs: server page + client view (tabel, N-selector, auto-refresh) + detail (timeline, auto-refresh tijdens in-progress run). Vereist een read-only bind mount van /srv/scrum4me/worker-logs in de ops-dashboard-container (docker-compose.yml + WORKER_LOGS_DIR in .env). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
84b3afbefa
commit
7e049ebdef
10 changed files with 1159 additions and 0 deletions
34
app/worker-logs/page.tsx
Normal file
34
app/worker-logs/page.tsx
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
import { redirect } from 'next/navigation'
|
||||
import { getCurrentUser } from '@/lib/session'
|
||||
import { listRunLogs } from '@/lib/worker-logs'
|
||||
import type { RunLogSummary } from '@/lib/parse-worker-log'
|
||||
import WorkerLogsView from './_components/worker-logs-view'
|
||||
|
||||
export const dynamic = 'force-dynamic'
|
||||
|
||||
export default async function WorkerLogsPage() {
|
||||
const user = await getCurrentUser()
|
||||
if (!user) redirect('/login')
|
||||
|
||||
let initialLogs: RunLogSummary[] = []
|
||||
let initialError: string | null = null
|
||||
try {
|
||||
initialLogs = await listRunLogs(10)
|
||||
} catch (err) {
|
||||
initialError = err instanceof Error ? err.message : 'Failed to read worker logs'
|
||||
}
|
||||
|
||||
return (
|
||||
<div className="min-h-screen bg-background p-6">
|
||||
<div className="mx-auto max-w-6xl space-y-6">
|
||||
<div>
|
||||
<h1 className="text-2xl font-semibold tracking-tight">Worker Logs</h1>
|
||||
<p className="text-sm text-muted-foreground">
|
||||
Recente runs van de Scrum4Me-worker — klik een rij voor de uitgewerkte timeline
|
||||
</p>
|
||||
</div>
|
||||
<WorkerLogsView initialLogs={initialLogs} initialError={initialError} />
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue