// 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 = '
Enter a search term
'; return; } box.innerHTML = '
Searching…
'; 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); } }