{"repo": "anasyoussoufi/copilotosvscode", "files": {"cockpit/public/app.js": {"914d2ccf2782db5875a09b9e5a89b38953f3a579": {"t": 1785746024.1444721, "n": 18611, "h": "38e9e30202f62349", "c": "'use strict';\n\n/* =========================== Onglets =========================== */\nconst tabs = document.querySelectorAll('.tab');\ntabs.forEach((tab) =>\n tab.addEventListener('click', () => {\n tabs.forEach((t) => t.classList.remove('active'));\n tab.classList.add('active');\n document.querySelectorAll('.panel').forEach((p) => p.classList.remove('active'));\n document.getElementById(`panel-${tab.dataset.tab}`).classList.add('active');\n if (tab.dataset.tab === 'agents') loadAgents();\n if (tab.dataset.tab === 'mcp') loadMcp();\n if (tab.dataset.tab === 'settings') loadSettings();\n })\n);\n\nconst esc = (s) =>\n String(s).replace(/[&<>\"']/g, (c) => ({ '&': '&', '<': '<', '>': '>', '\"': '"', \"'\": ''' }[c]));\n\nfunction renderMarkdownLite(text) {\n let html = esc(text);\n html = html.replace(/`([^`\\n]+)`/g, '$1');\n html = html.replace(/\\*\\*([^*\\n]+)\\*\\*/g, '$1');\n html = html.replace(/(https?:\\/\\/[^\\s<]+)/g, '$1');\n return html;\n}\n\n/* =========================== WebSocket =========================== */\nconst connIndicator = document.getElementById('conn-indicator');\nconst connLabel = document.getElementById('conn-label');\nlet ws = null;\n\nfunction connect() {\n ws = new WebSocket(`${location.protocol === 'https:' ? 'wss' : 'ws'}://${location.host}/ws`);\n ws.onopen = () => {\n connIndicator.className = 'conn online';\n connLabel.textContent = 'en ligne';\n };\n ws.onclose = () => {\n connIndicator.className = 'conn offline';\n connLabel.textContent = 'déconnecté — reconnexion…';\n setTimeout(connect, 2000);\n };\n ws.onmessage = (event) => handleEvent(JSON.parse(event.data));\n}\nconnect();\n\n/* =========================== Chat =========================== */\nconst chatMessages = document.getElementById('chat-messages');\nconst chatEmpty = document.getElementById('chat-empty');\nconst chatForm = document.getElementById('chat-form');\nconst chatText = document.getElementById('chat-text');\nconst btnSend = document.getElementById('btn-send');\nlet streamingEl = null;\nlet streamingRaw = '';\n\nfunction addMessage(cls, text) {\n chatEmpty.hidden = true;\n const el = document.createElement('div');\n el.className = `msg ${cls}`;\n el.innerHTML = renderMarkdownLite(text);\n chatMessages.appendChild(el);\n chatMessages.scrollTop = chatMessages.scrollHeight;\n return el;\n}\n\nchatForm.addEventListener('submit', (e) => {\n e.preventDefault();\n const text = chatText.value.trim();\n if (!text || !ws || ws.readyState !== 1) return;\n addMessage('user', text);\n chatText.value = '';\n btnSend.disabled = true;\n streamingRaw = '';\n streamingEl = addMessage('assistant streaming', '');\n ws.send(JSON.stringify({ type: 'chat', text }));\n});\n\nchatText.addEventListener('keydown', (e) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n chatForm.requestSubmit();\n }\n});\n\ndocument.getElementById('btn-reset').addEventListener('click', () => {\n if (ws && ws.readyState === 1) ws.send(JSON.stringify({ type: 'reset' }));\n chatMessages.querySelectorAll('.msg').forEach((m) => m.remove());\n chatEmpty.hidden = false;\n clearFlow();\n});\n\nfunction handleEvent(event) {\n switch (event.type) {\n case 'token':\n if (!streamingEl) streamingEl = addMessage('assistant streaming', '');\n streamingRaw += event.text;\n streamingEl.innerHTML = renderMarkdownLite(streamingRaw);\n chatMessages.scrollTop = chatMessages.scrollHeight;\n break;\n case 'message_done':\n if (streamingEl) streamingEl.classList.remove('streaming');\n streamingEl = null;\n streamingRaw = '';\n btnSend.disabled = false;\n finishAllNodes();\n break;\n case 'error':\n addMessage('error', event.message);\n break;\n case 'notice':\n addMessage('notice', event.message);\n break;\n case 'agent_event':\n onAgentEvent(event);\n break;\n case 'tool_start':\n onToolStart(event);\n break;\n case 'tool_end':\n onToolEnd(event);\n if (!event.ok) {\n addMessage('error', `Échec de l'outil ${event.tool} (${event.server}) :\\n${event.resultPreview || 'pas de détail'}`);\n }\n break;\n case 'artifact':\n onArtifact(event);\n break;\n case 'claim_check':\n onClaimCheck(event);\n break;\n case 'validation_request':\n onValidationRequest(event);\n break;\n }\n}\n\nfunction onValidationRequest({ id, question }) {\n chatEmpty.hidden = true;\n const el = document.createElement('div');\n el.className = 'msg validation';\n el.innerHTML = `\n
${esc(server.command)}