// ── RAG helpers: findProductByName + updatePanelResults ── // Called by queryProducts() and show_product tool. function findProductByName(query) { if (!vaistudioAllProducts.length) return null; const qs = _sd(query), terms = qs.split(/\s+/).filter(t=>t.length>1); let best = null, bestScore = 0; for (const p of vaistudioAllProducts) { let sc = 0; const nm = _sd(p.title_clean||p.name), sk = _sd(p.sku||p.model), br = _sd(p.brand); if (nm===qs||sk===qs) return p; if (nm.includes(qs)||sk.includes(qs)||br.includes(qs)) sc+=20; for (const t of terms) { if (nm.includes(t)) sc+=5; if (sk.includes(t)) sc+=4; if (br.includes(t)) sc+=3; } if (sc>bestScore) { bestScore=sc; best=p; } } return best; } function updatePanelResults(products) { const panel = document.getElementById("vaistudio-panel"); const toggle = document.getElementById("vaistudio-toggle"); const loadingEl = document.getElementById("vaistudio-loading"); const prodsEl = document.getElementById("vaistudio-products"); const countEl = document.getElementById("vaistudio-count"); if (!prodsEl) return; if (panel && !panel.classList.contains("open")) { panel.classList.add("open"); panel.style.display="flex"; } if (toggle) toggle.classList.add("active"); if (loadingEl) loadingEl.hidden = true; prodsEl.innerHTML = ""; prodsEl.style.display = "block"; for (let i=0; it.length>1); const scored = []; for (let i=0; i 0) scored.push({ product:p, score }); } scored.sort((a,b)=>b.score-a.score); const top = scored.slice(0, 5).map(s=>s.product); // UPDATE UI PANEL with search results (opens panel, shows cards) updatePanelResults(top.length ? top : vaistudioAllProducts.slice(0,20)); if (!top.length) return `No products matching "${q}". Try a different term.`; let result = `Found ${top.length} product(s) matching "${q}":\n\n`; for (let i=0; i5?"...":""}\n`; if (p.specs&&Object.keys(p.specs).length) { const entries = Object.entries(p.specs).filter(([_,v])=>v&&v!=="None").slice(0,4); for (const [k,v] of entries) result += ` ${k}: ${String(v).slice(0,80)}\n`; } result += `\n`; } result += `Best: ${top[0].title_clean||top[0].name} (${_fmt(top[0].priceNum)}). Panel updated!`; return result; }