{
"event": "PreToolUse",
"tool_name": "Edit",
"tool_input": {
"file_path": "\/var\/www\/dev.campus.systemische-tools.de\/src\/View\/content-pipeline\/show.php",
"old_string": "<style>\n.config-list {\n list-style: none;\n padding: 0;\n margin: 1rem 0 2rem;\n}\n.config-list__item {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.5rem 0;\n border-bottom: 1px solid var(--border-color-light, #eee);\n}\n.config-list__label {\n font-weight: 500;\n min-width: 100px;\n}\n.config-list__value {\n flex: 1;\n font-family: monospace;\n font-size: 0.9rem;\n}\n.config-list__value.editable {\n cursor: pointer;\n padding: 0.25rem 0.5rem;\n border-radius: 4px;\n transition: background-color 0.15s;\n}\n.config-list__value.editable:hover {\n background: var(--bg-muted, #f5f5f5);\n}\n.config-list__value.editable::after {\n content: ' \\270E';\n font-size: 0.8rem;\n color: var(--text-muted, #999);\n opacity: 0;\n transition: opacity 0.15s;\n}\n.config-list__value.editable:hover::after {\n opacity: 1;\n}\n.config-list__input {\n flex: 1;\n font-family: monospace;\n font-size: 0.9rem;\n padding: 0.25rem 0.5rem;\n border: 1px solid var(--border-color, #ccc);\n border-radius: 4px;\n}\n.config-list__input:focus {\n outline: none;\n border-color: var(--color-primary, #0066cc);\n}\n.config-list__value.is-saving {\n opacity: 0.6;\n}",
"new_string": "<style>\n.config-list {\n list-style: none;\n padding: 0;\n margin: 1rem 0 2rem;\n}\n.config-list__item {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.5rem 0;\n border-bottom: 1px solid var(--border-color-light, #eee);\n}\n.config-list__label {\n font-weight: 500;\n min-width: 100px;\n}\n.config-list__input {\n flex: 1;\n font-family: monospace;\n font-size: 0.9rem;\n padding: 0.25rem 0.5rem;\n border: 1px solid var(--border-color, #ccc);\n border-radius: 4px;\n}\n.config-list__input--inline {\n border-color: transparent;\n background: transparent;\n}\n.config-list__input--inline:hover {\n border-color: var(--border-color, #ccc);\n background: var(--bg-input, #fff);\n}\n.config-list__input:focus {\n outline: none;\n border-color: var(--color-primary, #0066cc);\n background: var(--bg-input, #fff);\n}\n.config-list__input.is-saved {\n border-color: var(--color-success, #28a745);\n animation: flash-success 0.5s;\n}\n.config-list__input:disabled {\n opacity: 0.6;\n}"
}
}
{
"tool_response": {
"filePath": "\/var\/www\/dev.campus.systemische-tools.de\/src\/View\/content-pipeline\/show.php",
"oldString": "<style>\n.config-list {\n list-style: none;\n padding: 0;\n margin: 1rem 0 2rem;\n}\n.config-list__item {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.5rem 0;\n border-bottom: 1px solid var(--border-color-light, #eee);\n}\n.config-list__label {\n font-weight: 500;\n min-width: 100px;\n}\n.config-list__value {\n flex: 1;\n font-family: monospace;\n font-size: 0.9rem;\n}\n.config-list__value.editable {\n cursor: pointer;\n padding: 0.25rem 0.5rem;\n border-radius: 4px;\n transition: background-color 0.15s;\n}\n.config-list__value.editable:hover {\n background: var(--bg-muted, #f5f5f5);\n}\n.config-list__value.editable::after {\n content: ' \\270E';\n font-size: 0.8rem;\n color: var(--text-muted, #999);\n opacity: 0;\n transition: opacity 0.15s;\n}\n.config-list__value.editable:hover::after {\n opacity: 1;\n}\n.config-list__input {\n flex: 1;\n font-family: monospace;\n font-size: 0.9rem;\n padding: 0.25rem 0.5rem;\n border: 1px solid var(--border-color, #ccc);\n border-radius: 4px;\n}\n.config-list__input:focus {\n outline: none;\n border-color: var(--color-primary, #0066cc);\n}\n.config-list__value.is-saving {\n opacity: 0.6;\n}",
"newString": "<style>\n.config-list {\n list-style: none;\n padding: 0;\n margin: 1rem 0 2rem;\n}\n.config-list__item {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.5rem 0;\n border-bottom: 1px solid var(--border-color-light, #eee);\n}\n.config-list__label {\n font-weight: 500;\n min-width: 100px;\n}\n.config-list__input {\n flex: 1;\n font-family: monospace;\n font-size: 0.9rem;\n padding: 0.25rem 0.5rem;\n border: 1px solid var(--border-color, #ccc);\n border-radius: 4px;\n}\n.config-list__input--inline {\n border-color: transparent;\n background: transparent;\n}\n.config-list__input--inline:hover {\n border-color: var(--border-color, #ccc);\n background: var(--bg-input, #fff);\n}\n.config-list__input:focus {\n outline: none;\n border-color: var(--color-primary, #0066cc);\n background: var(--bg-input, #fff);\n}\n.config-list__input.is-saved {\n border-color: var(--color-success, #28a745);\n animation: flash-success 0.5s;\n}\n.config-list__input:disabled {\n opacity: 0.6;\n}",
"originalFile": "<?php ob_start(); ?>\n\n<h1>Pipeline: <?= htmlspecialchars($pipeline['name']) ?><\/h1>\n\n<?php if ($pipeline['is_default']): ?>\n<span class=\"badge badge--success\">Standard-Pipeline<\/span>\n<?php endif; ?>\n\n<div class=\"page-actions\">\n <a href=\"\/content-pipeline\/<?= $pipeline['id'] ?>\/edit\" class=\"btn btn--secondary\">Bearbeiten<\/a>\n <form action=\"\/content-pipeline\/<?= $pipeline['id'] ?>\/run\" method=\"POST\" style=\"display:inline;\">\n <input type=\"hidden\" name=\"_csrf_token\" value=\"<?= htmlspecialchars($_SESSION['_csrf_token'] ?? '') ?>\">\n <button type=\"submit\" class=\"btn btn--primary\">Pipeline starten<\/button>\n <\/form>\n<\/div>\n\n<ul class=\"config-list\">\n <li class=\"config-list__item\">\n <span class=\"config-list__label\">Quelle:<\/span>\n <input type=\"text\" name=\"source_path\" class=\"config-list__input config-list__input--inline\"\n value=\"<?= htmlspecialchars($pipeline['source_path']) ?>\"\n hx-post=\"\/content-pipeline\/<?= $pipeline['id'] ?>\/config\"\n hx-headers='{\"X-CSRF-TOKEN\": \"<?= $csrfToken ?>\"}'\n hx-trigger=\"blur, keyup[key=='Enter']\"\n hx-swap=\"none\"\n hx-disabled-elt=\"this\"\n hx-on::after-request=\"this.classList.toggle('is-saved', event.detail.successful); setTimeout(() => this.classList.remove('is-saved'), 1000)\">\n <\/li>\n <li class=\"config-list__item\">\n <span class=\"config-list__label\">Dateitypen:<\/span>\n <input type=\"text\" name=\"extensions\" class=\"config-list__input config-list__input--inline\"\n value=\"<?= implode(', ', $pipeline['extensions'] ?? []) ?>\"\n hx-post=\"\/content-pipeline\/<?= $pipeline['id'] ?>\/config\"\n hx-headers='{\"X-CSRF-TOKEN\": \"<?= $csrfToken ?>\"}'\n hx-trigger=\"blur, keyup[key=='Enter']\"\n hx-swap=\"none\"\n hx-disabled-elt=\"this\"\n hx-on::after-request=\"this.classList.toggle('is-saved', event.detail.successful); setTimeout(() => this.classList.remove('is-saved'), 1000)\">\n <\/li>\n<\/ul>\n\n<h2>Pipeline-Schritte<\/h2>\n\n<table>\n <thead>\n <tr>\n <th>#<\/th>\n <th>Schritt<\/th>\n <th>Phase<\/th>\n <th>Modell<\/th>\n <th>Zielspeicher<\/th>\n <th>Konfiguration<\/th>\n <\/tr>\n <\/thead>\n <tbody>\n <?php foreach ($pipeline['steps'] as $step): ?>\n <?php\n $meta = $stepTypes[$step['step_type']] ?? ['label' => $step['step_type'], 'description' => '', 'phase' => '-', 'storage' => null];\n $config = $step['config'] ?? [];\n\n \/\/ Aktuelles Modell ermitteln (mit ollama: Prefix für Dropdown)\n $currentModel = null;\n $usesVision = $meta['uses_vision'] ?? false;\n $usesLlm = $meta['uses_llm'] ?? false;\n\n if (!empty($config['model'])) {\n $isAnthropic = str_contains($config['model'], 'claude') || ($config['provider'] ?? '') === 'anthropic';\n $currentModel = $isAnthropic ? $config['model'] : 'ollama:' . $config['model'];\n }\n\n \/\/ Config ohne model\/provider für kompaktere Anzeige\n $displayConfig = array_filter($config, fn ($k) => !in_array($k, ['provider', 'model']), ARRAY_FILTER_USE_KEY);\n\n \/\/ Zielspeicher mit dynamischen Werten ersetzen\n $storage = $meta['storage'] ?? null;\n if ($storage !== null && isset($config['collection'])) {\n $storage = str_replace('{collection}', $config['collection'], $storage);\n }\n ?>\n <tr data-step-id=\"<?= $step['id'] ?>\">\n <td><?= $step['sort_order'] ?><\/td>\n <td>\n <strong><?= $meta['label'] ?><\/strong>\n <br>\n <small><?= $meta['description'] ?><\/small>\n <\/td>\n <td><?= $meta['phase'] ?><\/td>\n <td class=\"model-cell\">\n <?php if (!empty($meta['fixed_model'])): ?>\n <span class=\"fixed-model\"><?= htmlspecialchars($meta['fixed_model']) ?><\/span>\n <?php elseif ($currentModel !== null || $usesVision || $usesLlm): ?>\n <?php\n $selected = $currentModel ?? ($usesVision ? \\Infrastructure\\AI\\ModelConfig::getDefaultVisionModel() : \\Infrastructure\\AI\\ModelConfig::getDefaultModel());\n $availableModels = $usesVision ? \\Infrastructure\\AI\\ModelConfig::getVisionModels() : \\Infrastructure\\AI\\ModelConfig::getAll();\n $ollamaModels = array_filter($availableModels, fn ($k) => str_starts_with($k, 'ollama:'), ARRAY_FILTER_USE_KEY);\n $anthropicModels = array_filter($availableModels, fn ($k) => !str_starts_with($k, 'ollama:'), ARRAY_FILTER_USE_KEY);\n ?>\n <select name=\"model\" class=\"form-select form-select--compact\"\n hx-post=\"\/content-pipeline\/<?= $pipeline['id'] ?>\/steps\/<?= $step['id'] ?>\/model\"\n hx-headers='{\"X-CSRF-TOKEN\": \"<?= $csrfToken ?>\"}'\n hx-swap=\"none\"\n hx-disabled-elt=\"this\"\n hx-on::after-request=\"this.classList.toggle('is-saved', event.detail.successful); setTimeout(() => this.classList.remove('is-saved'), 1000)\">\n <?php if (!empty($ollamaModels)): ?>\n <optgroup label=\"Ollama (lokal)\">\n <?php foreach ($ollamaModels as $modelId => $label): ?>\n <option value=\"<?= htmlspecialchars($modelId) ?>\" <?= $selected === $modelId ? 'selected' : '' ?>><?= htmlspecialchars($label) ?><\/option>\n <?php endforeach; ?>\n <\/optgroup>\n <?php endif; ?>\n <?php if (!empty($anthropicModels)): ?>\n <optgroup label=\"Anthropic\">\n <?php foreach ($anthropicModels as $modelId => $label): ?>\n <option value=\"<?= htmlspecialchars($modelId) ?>\" <?= $selected === $modelId ? 'selected' : '' ?>><?= htmlspecialchars($label) ?><\/option>\n <?php endforeach; ?>\n <\/optgroup>\n <?php endif; ?>\n <\/select>\n <?php else: ?>\n <span class=\"text-muted\">-<\/span>\n <?php endif; ?>\n <\/td>\n <td class=\"storage-cell\">\n <?php if (!empty($meta['has_collection'])): ?>\n <span class=\"storage-prefix\">Qdrant:<\/span>\n <select name=\"collection\" class=\"collection-select\"\n hx-post=\"\/content-pipeline\/<?= $pipeline['id'] ?>\/steps\/<?= $step['id'] ?>\/collection\"\n hx-headers='{\"X-CSRF-TOKEN\": \"<?= $csrfToken ?>\"}'\n hx-swap=\"none\"\n hx-disabled-elt=\"this\"\n hx-on::after-request=\"this.classList.toggle('is-saved', event.detail.successful); setTimeout(() => this.classList.remove('is-saved'), 1000)\">\n <?php foreach ($collections as $collKey => $collLabel): ?>\n <option value=\"<?= htmlspecialchars($collKey) ?>\" <?= ($config['collection'] ?? 'documents') === $collKey ? 'selected' : '' ?>>\n <?= htmlspecialchars($collKey) ?>\n <\/option>\n <?php endforeach; ?>\n <\/select>\n <?php elseif ($storage): ?>\n <code class=\"storage-code\"><?= htmlspecialchars($storage) ?><\/code>\n <?php else: ?>\n <span class=\"text-muted\">-<\/span>\n <?php endif; ?>\n <\/td>\n <td>\n <?php if ($displayConfig): ?>\n <code class=\"config-code\"><?= htmlspecialchars(json_encode($displayConfig, JSON_UNESCAPED_UNICODE)) ?><\/code>\n <?php else: ?>\n <span class=\"text-muted\">-<\/span>\n <?php endif; ?>\n <\/td>\n <\/tr>\n <?php endforeach; ?>\n <\/tbody>\n<\/table>\n\n<h2>Ausführungen<\/h2>\n\n<?php if (!empty($runs)): ?>\n<table>\n <thead>\n <tr>\n <th>ID<\/th>\n <th>Status<\/th>\n <th>Gestartet<\/th>\n <th>Beendet<\/th>\n <th>Dokumente<\/th>\n <th>Chunks<\/th>\n <\/tr>\n <\/thead>\n <tbody>\n <?php foreach ($runs as $run): ?>\n <tr>\n <td><a href=\"\/content-pipeline\/<?= $pipeline['id'] ?>\/run\/<?= $run['id'] ?>\/status\">#<?= $run['id'] ?><\/a><\/td>\n <td>\n <span class=\"badge badge--<?= $run['status'] === 'completed' ? 'success' : ($run['status'] === 'failed' ? 'danger' : ($run['status'] === 'running' ? 'warning' : 'muted')) ?>\">\n <?= $run['status'] ?>\n <\/span>\n <\/td>\n <td><?= $run['started_at'] ?? '-' ?><\/td>\n <td><?= $run['completed_at'] ?? '-' ?><\/td>\n <td>\n <?= $run['documents_processed'] ?? 0 ?>\/<?= $run['documents_total'] ?? 0 ?>\n <?php if (($run['documents_failed'] ?? 0) > 0): ?>\n <span class=\"text-danger\">(<?= $run['documents_failed'] ?> Fehler)<\/span>\n <?php endif; ?>\n <\/td>\n <td><?= $run['chunks_created'] ?? 0 ?><\/td>\n <\/tr>\n <?php endforeach; ?>\n <\/tbody>\n<\/table>\n<?php else: ?>\n<p class=\"empty-state empty-state--small\">Noch keine Ausführungen vorhanden.<\/p>\n<?php endif; ?>\n\n<p class=\"links-bar\">\n <a href=\"\/content-pipeline\">Zurück zur Übersicht<\/a>\n<\/p>\n\n<style>\n.config-list {\n list-style: none;\n padding: 0;\n margin: 1rem 0 2rem;\n}\n.config-list__item {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.5rem 0;\n border-bottom: 1px solid var(--border-color-light, #eee);\n}\n.config-list__label {\n font-weight: 500;\n min-width: 100px;\n}\n.config-list__value {\n flex: 1;\n font-family: monospace;\n f... [TRUNCATED-4dba55e15c623337]",
"structuredPatch": [
{
"oldStart": 214,
"oldLines": 30,
"newStart": 214,
"newLines": 6,
"lines": [
" font-weight: 500;",
" min-width: 100px;",
" }",
"-.config-list__value {",
"- flex: 1;",
"- font-family: monospace;",
"- font-size: 0.9rem;",
"-}",
"-.config-list__value.editable {",
"- cursor: pointer;",
"- padding: 0.25rem 0.5rem;",
"- border-radius: 4px;",
"- transition: background-color 0.15s;",
"-}",
"-.config-list__value.editable:hover {",
"- background: var(--bg-muted, #f5f5f5);",
"-}",
"-.config-list__value.editable::after {",
"- content: ' \\270E';",
"- font-size: 0.8rem;",
"- color: var(--text-muted, #999);",
"- opacity: 0;",
"- transition: opacity 0.15s;",
"-}",
"-.config-list__value.editable:hover::after {",
"- opacity: 1;",
"-}",
" .config-list__input {",
" flex: 1;",
" font-family: monospace;"
]
},
{
"oldStart": 246,
"oldLines": 11,
"newStart": 222,
"newLines": 24,
"lines": [
" border: 1px solid var(--border-color, #ccc);",
" border-radius: 4px;",
" }",
"+.config-list__input--inline {",
"+ border-color: transparent;",
"+ background: transparent;",
"+}",
"+.config-list__input--inline:hover {",
"+ border-color: var(--border-color, #ccc);",
"+ background: var(--bg-input, #fff);",
"+}",
" .config-list__input:focus {",
" outline: none;",
" border-color: var(--color-primary, #0066cc);",
"+ background: var(--bg-input, #fff);",
" }",
"-.config-list__value.is-saving {",
"+.config-list__input.is-saved {",
"+ border-color: var(--color-success, #28a745);",
"+ animation: flash-success 0.5s;",
"+}",
"+.config-list__input:disabled {",
" opacity: 0.6;",
" }",
" .config-code,"
]
}
],
"userModified": false,
"replaceAll": false
}
}