// @ts-nocheck import { getToolNameLabel } from '../ui/sidebar.js'; let _toolSeq = 0; export function createToolCard(parentEl, opts) { const { name, args, protocol = 'mcp' } = opts; const seq = ++_toolSeq; const el = document.createElement('div'); const isMeta = name === 'metro_search_tools' || name === 'metro_get_tool_detail'; el.className = `tool-card running${isMeta ? ' meta' : ''}`; el.dataset.seq = seq; el.innerHTML = `
正在调用 ${escapeHtml(getToolNameLabel(name))} ${protocol.toUpperCase()} 运行中
${escapeHtml(JSON.stringify(args, null, 2))}
`; parentEl.appendChild(el); const nameEl = el.querySelector('[data-role="name"]'); const statusEl = el.querySelector('[data-role="status"]'); const progressSection = el.querySelector('[data-role="progress-section"]'); const progressEl = el.querySelector('[data-role="progress"]'); const resultSection = el.querySelector('[data-role="result-section"]'); const resultEl = el.querySelector('[data-role="result"]'); const label = getToolNameLabel(name); el.querySelector('.tool-header').addEventListener('click', () => { el.classList.toggle('expanded'); }); return { el, setStatus(status, summary) { el.classList.remove('running'); if (status === 'success' || status === 'error') { progressSection.style.display = 'none'; } if (status === 'success') { nameEl.textContent = label; el.classList.add('success'); statusEl.className = 'tool-status success'; statusEl.textContent = summary || '完成'; } else if (status === 'error') { nameEl.textContent = label; el.classList.add('error'); statusEl.className = 'tool-status error'; statusEl.textContent = summary || '失败'; } }, setResult(result, isError) { resultSection.style.display = ''; const text = typeof result === 'string' ? result : JSON.stringify(result, null, 2); resultEl.textContent = text; if (text.length > 400) { resultEl.classList.add('collapsed'); resultEl.addEventListener('click', () => { resultEl.classList.remove('collapsed'); }, { once: true }); } }, updateProgress(progress) { if (!progress) return; progressSection.style.display = ''; el.classList.add('expanded'); let html = ''; if (progress.stage) html += `
${escapeHtml(progress.stage)}
`; if (progress.total && progress.current) { const pct = Math.round((progress.current / progress.total) * 100); html += `
`; html += `
${progress.current}/${progress.total}(${pct}%)
`; } if (progress.detail) html += `
${escapeHtml(progress.detail)}
`; progressEl.innerHTML = html; }, }; } function escapeHtml(s) { if (s == null) return ''; return String(s) .replace(/&/g, '&') .replace(//g, '>') .replace(/"/g, '"') .replace(/'/g, '''); }