Add Android forensics, IOC threat-intel DB, Compose companion; scrub secrets from configs
This commit is contained in:
@@ -2161,6 +2161,8 @@ function halToggle() {
|
||||
if (!p) return;
|
||||
var visible = p.style.display !== 'none';
|
||||
p.style.display = visible ? 'none' : 'flex';
|
||||
// Remember open/closed state across page navigation
|
||||
sessionStorage.setItem('hal_panel_open', visible ? 'false' : 'true');
|
||||
if (!visible) {
|
||||
var inp = document.getElementById('hal-input');
|
||||
if (inp) inp.focus();
|
||||
@@ -2279,6 +2281,7 @@ function halAppendStyled(type, text) {
|
||||
}
|
||||
msgs.appendChild(div);
|
||||
halScroll();
|
||||
_halSaveMessages();
|
||||
}
|
||||
|
||||
function halAppend(role, text) {
|
||||
@@ -2289,6 +2292,8 @@ function halAppend(role, text) {
|
||||
div.textContent = text;
|
||||
msgs.appendChild(div);
|
||||
halScroll();
|
||||
// Persist to sessionStorage so messages survive page navigation
|
||||
_halSaveMessages();
|
||||
return div;
|
||||
}
|
||||
|
||||
@@ -2300,9 +2305,60 @@ function halScroll() {
|
||||
function halClear() {
|
||||
var m = document.getElementById('hal-messages');
|
||||
if (m) m.innerHTML = '';
|
||||
sessionStorage.removeItem('hal_messages');
|
||||
sessionStorage.removeItem('hal_panel_open');
|
||||
fetch('/api/chat/reset', {method: 'POST'}).catch(function() {});
|
||||
}
|
||||
|
||||
// Persist chat messages across page navigation
|
||||
function _halSaveMessages() {
|
||||
var msgs = document.getElementById('hal-messages');
|
||||
if (!msgs) return;
|
||||
var items = [];
|
||||
msgs.querySelectorAll('.hal-msg').forEach(function(el) {
|
||||
var role = 'hal';
|
||||
if (el.classList.contains('hal-msg-user')) role = 'user';
|
||||
else if (el.classList.contains('hal-msg-status')) role = 'status';
|
||||
else if (el.classList.contains('hal-msg-action')) role = 'action';
|
||||
else if (el.classList.contains('hal-msg-error')) role = 'error';
|
||||
items.push({role: role, text: el.textContent});
|
||||
});
|
||||
// Keep last 100 messages to avoid storage bloat
|
||||
if (items.length > 100) items = items.slice(-100);
|
||||
try { sessionStorage.setItem('hal_messages', JSON.stringify(items)); } catch(e) {}
|
||||
}
|
||||
|
||||
function _halRestoreMessages() {
|
||||
var msgs = document.getElementById('hal-messages');
|
||||
if (!msgs) return;
|
||||
try {
|
||||
var saved = sessionStorage.getItem('hal_messages');
|
||||
if (!saved) return;
|
||||
var items = JSON.parse(saved);
|
||||
items.forEach(function(item) {
|
||||
var div = document.createElement('div');
|
||||
if (item.role === 'user' || item.role === 'hal') {
|
||||
div.className = 'hal-msg hal-msg-' + item.role;
|
||||
div.textContent = item.text;
|
||||
} else {
|
||||
div.className = 'hal-msg hal-msg-' + item.role;
|
||||
div.textContent = item.text;
|
||||
}
|
||||
msgs.appendChild(div);
|
||||
});
|
||||
halScroll();
|
||||
} catch(e) {}
|
||||
|
||||
// Restore panel visibility
|
||||
if (sessionStorage.getItem('hal_panel_open') === 'true') {
|
||||
var p = document.getElementById('hal-panel');
|
||||
if (p) p.style.display = 'flex';
|
||||
}
|
||||
}
|
||||
|
||||
// Restore on page load
|
||||
document.addEventListener('DOMContentLoaded', _halRestoreMessages);
|
||||
|
||||
// ── HAL Auto-Analyst ──────────────────────────────────────────────────────────
|
||||
// Call halAnalyze() after any tool displays results. HAL will analyze the output
|
||||
// via the loaded LLM and open the chat panel with findings.
|
||||
|
||||
Reference in New Issue
Block a user