\u6587\u4ef6\u4e0d\u5728\u5b89\u5168\u533a\u57df\u5185\uff0c\u662f\u5426\u5199\u5165\uff1f
';
+ document.body.appendChild(popup);
+ popup.querySelector('.btn-approve').addEventListener('click', async function() { popup.remove();
+ try { var r = await apiFetch(CHAT_SERVER + '/api/confirm_write', { method:'POST', headers:{'Content-Type':'application/json'}, body:JSON.stringify({confirm_id:confirmId, choice:'approve'}) });
+ var d = await r.json(); addMessage('system', d.success ? '\u2705 \u5df2\u5199\u5165: ' + (d.path||'') : '\u5199\u5165\u5931\u8d25: ' + (d.error||d.message), '\u7cfb\u7edf'); }
+ catch(e) { addMessage('system', '\u8bf7\u6c42\u5931\u8d25: ' + e.message, '\u7cfb\u7edf'); }
+ });
+ popup.querySelector('.btn-reject').addEventListener('click', async function() { popup.remove();
+ try { await apiFetch(CHAT_SERVER + '/api/confirm_write', { method:'POST', headers:{'Content-Type':'application/json'}, body:JSON.stringify({confirm_id:confirmId, choice:'reject'}) }); } catch(e){}
+ addMessage('system', '\u5df2\u62d2\u7edd\u5199\u5165', '\u7cfb\u7edf');
+ });
+ document.addEventListener('keydown', function esc(e) { if (e.key === 'Escape') popup.remove(); }, { once: true });
+}
+
+// ====== Stream Processing ======
+async function processStream(response) {
+ var reader = response.body.getReader(); var decoder = new TextDecoder(); var buffer = '', first = false;
+ try { while (true) { var result = await reader.read(); if (result.done) break;
+ buffer += decoder.decode(result.value, { stream: true }); var lines = buffer.split('\n'); buffer = lines.pop();
+ for (var i = 0; i < lines.length; i++) { var line = lines[i]; if (!line.startsWith('data: ')) continue;
+ try { var data = JSON.parse(line.slice(6));
+ if (data.__interrupt__) { showInterruptPopup(data.__interrupt__); reader.cancel(); loadingIndicator.style.display='none'; stopUI(); return; }
+ if (data.messages) { if (!first) { loadingIndicator.style.display='none'; first=true; }
+ for (var j=0;j