// Brain Search — query the centralized brain index (brain/ notes,
// skill learnings, chat history) via /api/brain-index/search.
async function renderBrainSearch() {
const content = document.getElementById('pageContent');
content.innerHTML = `
🔍
Search your brain
Type a query above to search across all indexed knowledge.
`;
// Load stats + initial hint.
try {
const s = await api.getBrainIndexStats();
const parts = Object.entries(s)
.filter(([k]) => k !== 'total')
.map(([k, v]) => `${k}: ${v}`);
document.getElementById('brainStats').textContent =
`Indexed: ${s.total || 0} docs (${parts.join(' · ')})`;
} catch (e) {
document.getElementById('brainStats').textContent = 'Index not built yet — click Re-ingest.';
}
}
async function brainSearchRun() {
const q = document.getElementById('brainQuery').value.trim();
const source = document.getElementById('brainSource').value;
const box = document.getElementById('brainResults');
if (!q) { box.innerHTML = ''; return; }
box.innerHTML = '';
try {
const data = await api.getBrainIndexSearch(q, source);
if (!data.results.length) {
box.innerHTML = '🔍
No results
Nothing matched "' + escapeHtml(q) + '"' + (source ? ' in ' + escapeHtml(source) : '') + '.
';
return;
}
box.innerHTML = `${data.count} result(s) for "${escapeHtml(q)}"
` +
data.results.map(r => {
const srcIcon = { 'brain': '📝', 'skill-learning': '🧠', 'chat': '💬', 'agent-note': '🤖' }[r.source] || '📄';
const agent = r.agent ? `${escapeHtml(r.agent)}` : '';
return `
${srcIcon}
${escapeHtml(r.title)}
${escapeHtml(r.source)}
${agent}
${escapeHtml(r.snippet || '')}
`;
}).join('');
} catch (err) {
box.innerHTML = `⚠
Search failed
${escapeHtml(err.message)}
`;
}
}
async function brainSearchIngest() {
const btn = event && event.target;
if (btn) { btn.disabled = true; btn.textContent = 'Ingesting…'; }
try {
const r = await api.brainIndexIngest();
const s = r.stats || {};
if (btn) btn.textContent = '✓ Re-ingest';
const statEl = document.getElementById('brainStats');
if (statEl) {
const parts = Object.entries(s).filter(([k]) => k !== 'total').map(([k, v]) => `${k}: ${v}`);
statEl.textContent = `Indexed: ${s.total || 0} docs (${parts.join(' · ')})`;
}
} catch (e) {
if (btn) btn.textContent = 'Ingest failed';
} finally {
if (btn) setTimeout(() => { btn.disabled = false; btn.textContent = '⟳ Re-ingest'; }, 1500);
}
}