(() => { const nav = document.querySelector('[data-view="agents"]'); const view = document.getElementById('agents'); if (!nav || !view) return; const esc = (value) => String(value ?? '').replace(/[&<>"']/g, (char) => ({ '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' }[char])); const note = (agent) => agent.role === 'order-query' ? '只处理订单和单号查询' : ({ cost: '只读取原始成本工作区', retail: '只读取售价价格工作区', dealer: '只读取经销商价格工作区' }[agent.priceCategory] || '独立价格工作区'); const style = document.createElement('style'); style.textContent = '.agent-admin-item{gap:10px}.agent-admin-item>div{flex:1}.agent-avatar,.agent-fallback{width:40px;height:40px;border-radius:6px;object-fit:cover;flex:none}.agent-fallback{display:grid;place-items:center;background:#2f78df;color:#fff}.agent-admin-item .btn{padding:7px 10px}'; document.head.appendChild(style); const render = async () => { const token = window.__manyiToken || ''; if (!token) return; const response = await fetch('/api/agents', { headers: { Authorization: `Bearer ${token}` } }); if (!response.ok) return; const { items } = await response.json(); view.querySelector('.card').innerHTML = `

智能体

${items.map((agent) => `
${esc(String(agent.name).slice(0, 1))}
${esc(agent.name)}
${esc(note(agent))} · 仅群聊使用 · 已上架
`).join('')}

智能体后台仅管理员可见。每个智能体只读取自己的工作区,不会跨区查询。

`; view.querySelectorAll('.agent-rename').forEach((button) => { button.onclick = () => { const wrap = document.createElement('div'); wrap.className = 'invite-modal'; wrap.innerHTML = `
重命名智能体
`; document.body.appendChild(wrap); wrap.querySelectorAll('[data-close]').forEach((item) => item.onclick = () => wrap.remove()); wrap.querySelector('[data-confirm]').onclick = async () => { const name = wrap.querySelector('[data-agent-name]').value.trim(); if (!name) return alert('请输入智能体名称'); const r = await fetch(`/api/agents/${button.dataset.id}`, { method: 'PATCH', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}` }, body: JSON.stringify({ name }) }); if (!r.ok) alert((await r.json()).error || '重命名失败'); else { wrap.remove(); render(); } }; }; }); view.querySelectorAll('.agent-avatar-btn').forEach((button) => { button.onclick = () => view.querySelector(`[data-file="${button.dataset.id}"]`).click(); }); view.querySelectorAll('[data-file]').forEach((input) => { input.onchange = async () => { const file = input.files?.[0]; if (!file) return; const r = await fetch(`/api/agents/${input.dataset.file}/avatar`, { method: 'POST', headers: { Authorization: `Bearer ${token}`, 'X-File-Name-Encoded': encodeURIComponent(file.name), 'Content-Type': file.type || 'application/octet-stream' }, body: file }); if (!r.ok) alert((await r.json()).error || '头像上传失败'); else render(); input.value = ''; }; }); }; nav.addEventListener('click', () => setTimeout(render, 40)); })();