{
"event": "PostToolUse",
"tool_name": "Read",
"tool_response": {
"type": "text",
"file": {
"filePath": "\/var\/www\/dev.campus.systemische-tools.de\/src\/UseCases\/Pipeline\/PipelineRunStatusUseCase.php",
"content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace UseCases\\Pipeline;\n\n\/\/ @responsibility: Ermittelt Pipeline-Status mit Fortschritt und ETA\n\nuse Domain\\Repository\\PipelineRepositoryInterface;\n\nclass PipelineRunStatusUseCase\n{\n public function __construct(\n private PipelineRepositoryInterface $repository\n ) {\n }\n\n \/**\n * Get detailed run status with progress calculations.\n *\n * @param int $pipelineId Pipeline ID\n * @param int $runId Run ID\n * @return array{success: bool, error?: string, data?: array}\n *\/\n public function execute(int $pipelineId, int $runId): array\n {\n $run = $this->repository->findRunById($runId);\n\n if ($run === null || (int) $run['pipeline_id'] !== $pipelineId) {\n return ['success' => false, 'error' => 'Run nicht gefunden'];\n }\n\n return [\n 'success' => true,\n 'data' => $this->buildStatusData($run),\n ];\n }\n\n \/**\n * Build comprehensive status data from run record.\n *\/\n private function buildStatusData(array $run): array\n {\n $startedAt = strtotime($run['started_at'] ?? 'now');\n $elapsed = time() - $startedAt;\n\n $total = (int) ($run['documents_total'] ?? 0);\n $processed = (int) ($run['documents_processed'] ?? 0);\n $progress = $total > 0 ? min(100, round(($processed \/ $total) * 100)) : 0;\n\n \/\/ Cap processed display to not exceed total\n $processedDisplay = min($processed, $total);\n\n $estimatedRemaining = $this->calculateEta($elapsed, $processed, $total);\n\n $lastUpdate = strtotime($run['last_update_at'] ?? $run['started_at'] ?? 'now');\n $isStalled = (time() - $lastUpdate) > 60 && $run['status'] === 'running';\n\n $isTerminal = in_array($run['status'], ['completed', 'failed', 'cancelled'], true);\n\n return [\n 'status' => $run['status'],\n 'current_step' => $run['current_step'],\n 'current_document' => $run['current_document'],\n 'documents_total' => $total,\n 'documents_processed' => $processedDisplay,\n 'documents_failed' => (int) ($run['documents_failed'] ?? 0),\n 'chunks_created' => (int) ($run['chunks_created'] ?? 0),\n 'embeddings_created' => (int) ($run['embeddings_created'] ?? 0),\n 'progress' => $progress,\n 'elapsed' => $elapsed,\n 'elapsed_formatted' => gmdate('i:s', $elapsed),\n 'estimated_remaining' => $estimatedRemaining,\n 'estimated_formatted' => $estimatedRemaining !== null ? gmdate('i:s', $estimatedRemaining) : null,\n 'log_tail' => $run['log_tail'] ?? '',\n 'is_stalled' => $isStalled,\n 'is_terminal' => $isTerminal,\n 'completed_at' => $run['completed_at'],\n 'error_log' => $run['error_log'],\n ];\n }\n\n \/**\n * Calculate estimated time remaining.\n *\/\n private function calculateEta(int $elapsed, int $processed, int $total): ?int\n {\n if ($processed <= 0 || $total <= $processed) {\n return null;\n }\n\n $avgTimePerDoc = $elapsed \/ $processed;\n $remaining = $total - $processed;\n\n return (int) ($avgTimePerDoc * $remaining);\n }\n}\n",
"numLines": 98,
"startLine": 1,
"totalLines": 98
}
}
}