{
"event": "PreToolUse",
"tool_name": "Read",
"tool_input": {
"file_path": "\/var\/www\/dev.campus.systemische-tools.de\/public\/js\/chat.js",
"limit": 100
}
}
{
"tool_response": {
"type": "text",
"file": {
"filePath": "\/var\/www\/dev.campus.systemische-tools.de\/public\/js\/chat.js",
"content": "\/**\n * Chat UI JavaScript\n * Extracted from chat\/index.php for code hygiene\n *\/\n\nconst sidebar = document.getElementById('sidebar');\nconst overlay = document.getElementById('overlay');\nconst toggle = document.getElementById('toggle');\nconst messages = document.getElementById('messages');\nconst form = document.getElementById('chatForm');\nconst sendBtn = document.getElementById('sendBtn');\nconst html = document.documentElement;\nconst configPanel = document.getElementById('configPanel');\nconst configPanelToggle = document.getElementById('configPanelToggle');\nconst configPanelClose = document.getElementById('configPanelClose');\n\n\/\/ ========== THEME ==========\nconst savedTheme = localStorage.getItem('chat-theme') || 'light';\nhtml.setAttribute('data-theme', savedTheme);\nupdateThemeUI();\n\nfunction updateThemeUI() {\n const theme = html.getAttribute('data-theme');\n const icon = document.getElementById('configThemeIcon');\n const text = document.getElementById('configThemeText');\n if (icon) icon.textContent = theme === 'dark' ? '☀' : '☽';\n if (text) text.textContent = theme === 'dark' ? 'Dark Mode' : 'Light Mode';\n}\n\ndocument.getElementById('configThemeToggle')?.addEventListener('click', () => {\n const next = html.getAttribute('data-theme') === 'dark' ? 'light' : 'dark';\n html.setAttribute('data-theme', next);\n localStorage.setItem('chat-theme', next);\n updateThemeUI();\n});\n\n\/\/ ========== SIDEBAR ==========\ntoggle.addEventListener('click', (e) => {\n e.stopPropagation();\n sidebar.classList.toggle('chat-sidebar--open');\n overlay.classList.toggle('chat-overlay--visible');\n});\n\noverlay.addEventListener('click', () => {\n sidebar.classList.remove('chat-sidebar--open');\n overlay.classList.remove('chat-overlay--visible');\n});\n\n\/\/ ========== CONFIG PANEL ==========\nconfigPanelToggle.addEventListener('click', () => {\n configPanel.classList.toggle('config-panel--open');\n configPanelToggle.setAttribute('aria-expanded', configPanel.classList.contains('config-panel--open'));\n});\n\nconfigPanelClose.addEventListener('click', () => {\n configPanel.classList.remove('config-panel--open');\n configPanelToggle.setAttribute('aria-expanded', 'false');\n});\n\n\/\/ ========== SYNC CONFIG PANEL TO HIDDEN INPUTS ==========\nfunction syncToHidden(configId, hiddenId) {\n const config = document.getElementById(configId);\n const hidden = document.getElementById(hiddenId);\n if (config && hidden) {\n config.addEventListener('change', function() {\n hidden.value = this.value;\n this.classList.add('is-saving');\n setTimeout(() => {\n this.classList.remove('is-saving');\n this.classList.add('is-saved');\n setTimeout(() => this.classList.remove('is-saved'), 600);\n }, 100);\n localStorage.setItem('chat-' + hiddenId, this.value);\n });\n const saved = localStorage.getItem('chat-' + hiddenId);\n if (saved) {\n const option = config.querySelector('option[value=\"' + saved + '\"]');\n if (option) {\n config.value = saved;\n hidden.value = saved;\n }\n }\n }\n}\n\nsyncToHidden('configModel', 'hiddenModel');\nsyncToHidden('configContextLimit', 'hiddenContextLimit');\nsyncToHidden('configMaxTokens', 'hiddenMaxTokens');\nsyncToHidden('configSystemPrompt', 'hiddenSystemPrompt');\nsyncToHidden('configStructure', 'hiddenStructure');\nsyncToHidden('configAuthorProfile', 'hiddenAuthorProfile');\n\n\/\/ ========== COLLECTIONS SYNC ==========\nfunction syncCollections() {\n const container = document.getElementById('hiddenCollections');\n container.innerHTML = '';\n document.querySelectorAll('#configCollections input[type=\"checkbox\"]:checked').forEach(cb => {\n const input = document.createElement('input');\n input.type = 'hidden';\n input.name = 'collections[]';",
"numLines": 100,
"startLine": 1,
"totalLines": 390
}
}
}