{
"event": "PreToolUse",
"tool_name": "Read",
"tool_input": {
"file_path": "\/var\/www\/dev.campus.systemische-tools.de\/src\/UseCases\/Chat\/StreamingChatMessageUseCase.php",
"offset": 302,
"limit": 100
}
}
{
"tool_response": {
"type": "text",
"file": {
"filePath": "\/var\/www\/dev.campus.systemische-tools.de\/src\/UseCases\/Chat\/StreamingChatMessageUseCase.php",
"content": "\n \/**\n * @param array<int, float> $embedding\n * @param array<string> $collections\n * @return array<int, array{id: int|string, score: float, payload: array<string, mixed>}>\n *\/\n private function searchMultipleCollections(array $embedding, array $collections, int $limit): array\n {\n $allResults = [];\n\n foreach ($collections as $collection) {\n try {\n $results = $this->qdrant->search($embedding, $collection, $limit);\n foreach ($results as &$result) {\n $result['payload']['_collection'] = $collection;\n }\n $allResults = array_merge($allResults, $results);\n } catch (\\RuntimeException) {\n continue;\n }\n }\n\n foreach ($allResults as &$result) {\n $processedAt = $result['payload']['processed_at'] ?? null;\n $documentDate = $processedAt !== null ? new \\DateTime($processedAt) : new \\DateTime();\n $authorityScore = (float) ($result['payload']['authority_score'] ?? 0.5);\n $result['weighted_score'] = $this->scoring->calculateScore(\n $result['score'],\n $documentDate,\n $authorityScore\n );\n }\n unset($result);\n\n usort($allResults, static fn ($a, $b) => ($b['weighted_score'] ?? 0.0) <=> ($a['weighted_score'] ?? 0.0));\n\n return array_slice($allResults, 0, $limit);\n }\n\n \/**\n * @param array<int, array{id: int|string, score: float, payload: array<string, mixed>}> $searchResults\n *\/\n private function buildContext(array $searchResults, int $maxTokens = 3000): string\n {\n $contextParts = [];\n $totalChars = 0;\n $maxChars = $maxTokens * 4;\n\n foreach ($searchResults as $index => $result) {\n $payload = $result['payload'];\n $content = (string) ($payload['content'] ?? $payload['content_preview'] ?? '');\n $docTitle = (string) ($payload['document_title'] ?? $payload['title'] ?? 'Unbekannt');\n\n if ($totalChars + strlen($content) > $maxChars) {\n break;\n }\n\n $contextParts[] = sprintf('[Quelle %d: %s]%s%s', $index + 1, $docTitle, \"\\n\", $content);\n $totalChars += strlen($content);\n }\n\n return implode(\"\\n\\n---\\n\\n\", $contextParts);\n }\n\n \/**\n * @param array<int, array{id: int|string, score: float, payload: array<string, mixed>}> $searchResults\n * @return array<int, array{title: string, score: float, content?: string, collection?: string}>\n *\/\n private function extractSources(array $searchResults): array\n {\n $sources = [];\n $seen = [];\n\n foreach ($searchResults as $result) {\n $payload = $result['payload'];\n $docTitle = (string) ($payload['document_title'] ?? $payload['title'] ?? '');\n\n if ($docTitle === '' || isset($seen[$docTitle])) {\n continue;\n }\n\n $source = [\n 'title' => $docTitle,\n 'score' => round($result['score'], 3),\n ];\n\n $content = $payload['content'] ?? $payload['content_preview'] ?? null;\n if (is_string($content) && $content !== '') {\n $source['content'] = $content;\n }\n\n if (isset($payload['_collection'])) {\n $source['collection'] = $payload['_collection'];\n }\n\n $sources[] = $source;\n $seen[$docTitle] = true;\n }\n\n return $sources;",
"numLines": 100,
"startLine": 302,
"totalLines": 456
}
}
}