| |
| |
|
|
| const chatBox = document.getElementById('chat-messages'); |
| const chatInput = document.getElementById('chat-input'); |
| const btnSend = document.getElementById('btn-send'); |
| const neuralThought = document.getElementById('neural-thought'); |
| const modelToggle = document.getElementById('model-toggle'); |
|
|
| const btnNewChat = document.getElementById('btn-new-chat'); |
| const imageUpload = document.getElementById('image-upload'); |
| const imagePreviewContainer = document.getElementById('image-preview-container'); |
| const imagePreview = document.getElementById('image-preview'); |
| const btnRemoveImage = document.getElementById('btn-remove-image'); |
| const remoteUrlInput = document.getElementById('remote-url-input'); |
|
|
| let currentImageData = null; |
|
|
| |
| remoteUrlInput.addEventListener('change', async () => { |
| const url = remoteUrlInput.value.trim(); |
| if (!url) return; |
| |
| |
| const formattedUrl = url.endsWith('/') ? `${url}v1/chat/completions` : `${url}/v1/chat/completions`; |
| |
| try { |
| await fetch('/api/config', { |
| method: 'POST', |
| headers: { 'Content-Type': 'application/json' }, |
| body: JSON.stringify({ remoteOllamaUrl: formattedUrl }) |
| }); |
| console.log('[SYSTEM] Remote Uplink Synchronized.'); |
| remoteUrlInput.style.borderColor = '#00ff00'; |
| } catch (e) { |
| remoteUrlInput.style.borderColor = '#ff0000'; |
| } |
| }); |
|
|
| |
| |
|
|
| |
| imageUpload.addEventListener('change', (e) => { |
| const file = e.target.files[0]; |
| if (file) { |
| const reader = new FileReader(); |
| reader.onload = (event) => { |
| currentImageData = event.target.result; |
| imagePreview.src = currentImageData; |
| imagePreviewContainer.style.display = 'block'; |
| document.querySelector('.chat-interface').classList.add('vision-active'); |
| }; |
| reader.readAsDataURL(file); |
| } |
| }); |
|
|
| btnRemoveImage.addEventListener('click', () => { |
| currentImageData = null; |
| imagePreview.src = ''; |
| imagePreviewContainer.style.display = 'none'; |
| imageUpload.value = ''; |
| document.querySelector('.chat-interface').classList.remove('vision-active'); |
| }); |
|
|
| function addMessage(text, role) { |
| const p = document.createElement('p'); |
| p.className = `msg ${role}`; |
| p.textContent = text; |
| chatBox.appendChild(p); |
| chatBox.scrollTop = chatBox.scrollHeight; |
| return p; |
| } |
|
|
| async function resetChat() { |
| try { |
| await fetch('/api/reset', { method: 'POST' }); |
| } catch(e) {} |
| chatBox.innerHTML = '<p class="msg bot">Zeta-Llama v3.1 Online. Neural pathways re-aligned to Llama-3.1-70B. I am ready for tactical coordination, Alpha.</p>'; |
| neuralThought.innerHTML = '[W4171NG_F0R_1NPU7]...'; |
| chatInput.value = ''; |
| console.log('ZETA-R3537: Neural path cleared.'); |
| } |
|
|
| async function sendMessage() { |
| const text = chatInput.value.trim(); |
| if (!text) return; |
|
|
| chatInput.value = ''; |
| addMessage(text, 'user'); |
|
|
| |
| const botMsg = addMessage('', 'bot'); |
| const selectedModel = modelToggle.value; |
| neuralThought.innerHTML = `[4N4IY71C5_M0D3] Engine: ${selectedModel.toUpperCase()}. Analyzing reasoning layers...`; |
|
|
| const textLower = text.toLowerCase(); |
| const isPentest = textLower.includes('scan') || textLower.includes('recon'); |
|
|
| if (isPentest) { |
| botMsg.textContent = "[OPENCLAW] 🚨 Neural Bypass Active. Dispatching Pentest Agents..."; |
| neuralThought.innerHTML = `[Z374_ORCH357R470R] Intent: PENTEST_STRIKE. Targeting: ${text}`; |
| |
| try { |
| const pentestResponse = await fetch('/api/pentest', { |
| method: 'POST', |
| headers: { 'Content-Type': 'application/json' }, |
| body: JSON.stringify({ command: text }) |
| }); |
| const data = await pentestResponse.json(); |
| |
| if (data.status === "completed") { |
| const outputData = typeof data.output === 'object' ? data.output : data; |
| |
| botMsg.textContent = `[SUCCESS] OpenClaw Strike Completed.\n\nTARGET: ${outputData.target || 'N/A'}\nIP: ${outputData.ip || 'N/A'}\nLOG: ${outputData.log || 'No logs available.'}\n\nRESULTS:\n${(outputData.open_ports && Array.isArray(outputData.open_ports)) ? outputData.open_ports.join('\n') : 'No open ports found.'}`; |
| |
| |
| const nodesPage = document.querySelector('#page-nodes .chat-box'); |
| if (nodesPage) { |
| const resultDiv = document.createElement('div'); |
| resultDiv.style.margin = '10px 0'; |
| resultDiv.style.padding = '15px'; |
| resultDiv.style.background = 'rgba(0, 212, 255, 0.05)'; |
| resultDiv.style.border = '1px solid var(--primary)'; |
| resultDiv.innerHTML = `<strong style="color:var(--primary)">[SCAN_RESULT] ${outputData.target || 'N/A'}</strong><br><small>${new Date().toLocaleString()}</small><pre style="margin-top:10px; color:#fff;">${(outputData.open_ports && Array.isArray(outputData.open_ports)) ? outputData.open_ports.join('\n') : 'No data'}</pre>`; |
| nodesPage.prepend(resultDiv); |
| } |
|
|
| } else { |
| botMsg.textContent = `[ERROR] Pentest Agent Failed: ${data.message || 'Unknown Error'}`; |
| } |
| chatBox.scrollTop = chatBox.scrollHeight; |
| return; |
| } catch (error) { |
| botMsg.textContent = `[CRITICAL_FAILURE] OpenClaw Bridge Broken: ${error.message}`; |
| return; |
| } |
| } |
|
|
| try { |
| const endpoint = currentImageData ? '/api/vision' : '/api/execute'; |
| const body = currentImageData ? { |
| target: text, |
| image: currentImageData |
| } : { |
| target: text, |
| provider: selectedModel |
| }; |
|
|
| const response = await fetch(endpoint, { |
| method: 'POST', |
| headers: { 'Content-Type': 'application/json' }, |
| body: JSON.stringify(body) |
| }); |
|
|
| |
| if (currentImageData) { |
| btnRemoveImage.click(); |
| } |
|
|
| document.getElementById('stat-chaos').textContent = statsMatch[1]; |
| document.getElementById('stat-wisdom').textContent = statsMatch[2]; |
| document.getElementById('stat-snark').textContent = statsMatch[3]; |
| document.getElementById('stat-patience').textContent = statsMatch[4]; |
| |
| |
| const chaos = parseInt(statsMatch[1]); |
| if (chaos > 50) { |
| document.getElementById('buddy-ascii').textContent = " (\\_/)\n (>.<)\n (> <)"; |
| document.getElementById('buddy-ascii').style.color = "#ff0055"; |
| } else { |
| document.getElementById('buddy-ascii').textContent = " (\\_/)\n (o.o)\n (> <)"; |
| document.getElementById('buddy-ascii').style.color = "#00d4ff"; |
| } |
| } |
| } |
| } else { |
| fullContent += rawContent; |
| botMsg.textContent = fullContent; |
| } |
| chatBox.scrollTop = chatBox.scrollHeight; |
| } |
| } |
| } |
| } catch (error) { |
| botMsg.textContent = `SYSTEM_ERROR: Neural Bridge Offline. Check your connection to the void.`; |
| console.error('Zeta Error:', error); |
| } |
| } |
|
|
| btnSend.addEventListener('click', sendMessage); |
| btnNewChat.addEventListener('click', resetChat); |
| chatInput.addEventListener('keypress', (e) => { |
| if (e.key === 'Enter') sendMessage(); |
| }); |
|
|
| async function startEngagement() { |
| const targetInput = document.getElementById('engagement-target'); |
| const target = targetInput.value.trim(); |
| if (!target) return; |
|
|
| try { |
| const response = await fetch('/api/engage', { |
| method: 'POST', |
| headers: { 'Content-Type': 'application/json' }, |
| body: JSON.stringify({ target }) |
| }); |
| const data = await response.json(); |
| |
| if (data.status === 'success') { |
| const list = document.getElementById('engagement-list'); |
| if (list.querySelector('.msg')) list.innerHTML = ''; |
| |
| const card = document.createElement('div'); |
| card.className = 'engagement-card'; |
| card.style = 'background: rgba(30, 30, 30, 0.5); padding: 15px; border-left: 4px solid #8a2be2; margin-bottom: 10px; animation: slideIn 0.3s ease-out;'; |
| card.innerHTML = ` |
| <div style="display: flex; justify-content: space-between;"> |
| <span style="color: #8a2be2; font-weight: bold;">${data.missionId}</span> |
| <span style="color: #00ff00;">[ST47U5: ${data.engagement.status}]</span> |
| </div> |
| <p style="font-size: 0.7rem; color: #888; margin-top: 5px;">Target: ${target} | Phase: ${data.engagement.phase}</p> |
| `; |
| list.prepend(card); |
| targetInput.value = ''; |
| } |
| } catch (e) { |
| console.error('Engagement failed:', e); |
| } |
| } |
|
|
| |
| const tabMapping = { |
| 'btn-home': 'page-home', |
| 'btn-nodes': 'page-nodes', |
| 'btn-harvest': 'page-harvest', |
| 'btn-stealth': 'page-stealth', |
| 'btn-vision': 'page-vision' |
| }; |
|
|
| Object.keys(tabMapping).forEach(btnId => { |
| const btn = document.getElementById(btnId); |
| if (!btn) return; |
| |
| btn.addEventListener('click', () => { |
| |
| Object.keys(tabMapping).forEach(id => { |
| const b = document.getElementById(id); |
| const p = document.getElementById(tabMapping[id]); |
| if (b) b.classList.remove('active'); |
| if (p) { |
| p.classList.remove('active'); |
| p.style.display = 'none'; |
| } |
| }); |
| |
| btn.classList.add('active'); |
| const activePage = document.getElementById(tabMapping[btnId]); |
| if (activePage) { |
| activePage.classList.add('active'); |
| activePage.style.display = 'block'; |
| } |
| }); |
| }); |
|
|
| console.log('ZETA-OMEGA Dashboard v25.0: Stream Protocol Loaded.'); |
|
|