(function () {
var workspace = document.querySelector(".workspace");
var sidebarToggle = document.getElementById("sidebarToggle");
var mobileSidebarToggle = document.getElementById("mobileSidebarToggle");
var userMenu = document.getElementById("userMenu");
var userMenuTrigger = document.getElementById("userMenuTrigger");
var chatScroll = document.getElementById("chatScroll");
var nodeRail = document.getElementById("nodeRail");
var composer = document.getElementById("chatComposer");
var promptInput = document.getElementById("prompt");
var sendButton = document.getElementById("sendButton");
var conversationIdInput = document.getElementById("conversationIdInput");
var chatStage = document.querySelector(".chat-stage");
var nodeAnchors = [];
if (!workspace) {
return;
}
function isMobile() {
return window.matchMedia("(max-width: 980px)").matches;
}
function toggleSidebar() {
var state = workspace.getAttribute("data-sidebar-state");
if (isMobile()) {
workspace.setAttribute("data-sidebar-state", state === "open" ? "closed" : "open");
return;
}
workspace.setAttribute("data-sidebar-state", state === "collapsed" ? "open" : "collapsed");
}
function syncSidebarState() {
if (isMobile()) {
if (workspace.getAttribute("data-sidebar-state") === "collapsed") {
workspace.setAttribute("data-sidebar-state", "closed");
}
} else if (workspace.getAttribute("data-sidebar-state") === "closed") {
workspace.setAttribute("data-sidebar-state", "open");
}
}
function refreshNodeAnchors() {
nodeAnchors = Array.prototype.slice.call(document.querySelectorAll(".node-anchor"));
}
if (sidebarToggle) {
sidebarToggle.addEventListener("click", toggleSidebar);
}
if (mobileSidebarToggle) {
mobileSidebarToggle.addEventListener("click", toggleSidebar);
}
if (userMenu && userMenuTrigger) {
userMenuTrigger.addEventListener("click", function () {
var isOpen = userMenu.classList.toggle("open");
userMenuTrigger.setAttribute("aria-expanded", isOpen ? "true" : "false");
});
document.addEventListener("click", function (event) {
if (!userMenu.contains(event.target)) {
userMenu.classList.remove("open");
userMenuTrigger.setAttribute("aria-expanded", "false");
}
});
}
function setActiveNode() {
if (!chatScroll || !nodeAnchors.length) {
return;
}
var activeTarget = nodeAnchors[0].getAttribute("data-target");
var scrollTop = chatScroll.scrollTop;
var threshold = 80;
nodeAnchors.forEach(function (anchor) {
var targetId = anchor.getAttribute("data-target");
var target = document.getElementById(targetId);
if (!target) {
return;
}
if (target.offsetTop - threshold <= scrollTop) {
activeTarget = targetId;
}
});
nodeAnchors.forEach(function (anchor) {
anchor.classList.toggle("active", anchor.getAttribute("data-target") === activeTarget);
});
}
function bindNodeAnchorClicks() {
if (!chatScroll) {
return;
}
nodeAnchors.forEach(function (anchor) {
if (anchor.dataset.bound === "true") {
return;
}
anchor.dataset.bound = "true";
anchor.addEventListener("click", function (event) {
event.preventDefault();
var targetId = anchor.getAttribute("data-target");
var target = document.getElementById(targetId);
if (!target) {
return;
}
chatScroll.scrollTo({
top: Math.max(target.offsetTop - 20, 0),
behavior: "smooth",
});
});
});
}
function ensureNodeRailVisible() {
if (nodeRail) {
nodeRail.classList.remove("hidden");
}
}
function syncNodeRailVisibility() {
if (!nodeRail) {
return;
}
refreshNodeAnchors();
if (nodeAnchors.length) {
nodeRail.classList.remove("hidden");
} else {
nodeRail.classList.add("hidden");
}
}
function escapeHtml(text) {
return text
.replace(/&/g, "&")
.replace(//g, ">")
.replace(/\"/g, """)
.replace(/'/g, "'");
}
function nl2br(text) {
return escapeHtml(text).replace(/\n/g, "
");
}
function scrollChatToBottom() {
if (chatScroll) {
chatScroll.scrollTop = chatScroll.scrollHeight;
}
}
function createMessage(role, content, messageId, label) {
var article = document.createElement("article");
article.className = "message " + role;
article.id = messageId;
if (label) {
article.setAttribute("data-node-label", label);
}
var avatar = document.createElement("div");
avatar.className = "message-avatar" + (role === "user" ? " user-mark" : "");
avatar.textContent = role === "assistant" ? "AI" : userMenuTrigger.querySelector(".avatar").textContent.trim();
var bubble = document.createElement("div");
bubble.className = "message-bubble";
var text = document.createElement("p");
text.innerHTML = nl2br(content);
bubble.appendChild(text);
article.appendChild(avatar);
article.appendChild(bubble);
chatScroll.appendChild(article);
return { article: article, bubble: bubble, text: text };
}
function appendNode(targetId, title, isLatest) {
if (!nodeRail) {
return;
}
ensureNodeRailVisible();
var anchor = document.createElement("a");
anchor.className = "node-anchor" + (isLatest ? " latest" : "");
anchor.href = "#" + targetId;
anchor.setAttribute("data-target", targetId);
anchor.title = title;
var dot = document.createElement("span");
dot.className = "node-dot";
anchor.appendChild(dot);
nodeRail.appendChild(anchor);
syncNodeRailVisibility();
bindNodeAnchorClicks();
setActiveNode();
}
function updateSidebarConversation(conversationId, title) {
if (!conversationId || !title) {
return;
}
var encodedTitle = title;
var existing = document.querySelector('.history-item[href*="conversation=' + conversationId + '"]');
var list = document.querySelector(".history-list");
var currentTime = new Date();
var month = String(currentTime.getMonth() + 1).padStart(2, "0");
var day = String(currentTime.getDate()).padStart(2, "0");
var hours = String(currentTime.getHours()).padStart(2, "0");
var minutes = String(currentTime.getMinutes()).padStart(2, "0");
var meta = month + "月" + day + "日 " + hours + ":" + minutes;
document.querySelectorAll(".history-item.active").forEach(function (item) {
item.classList.remove("active");
});
if (existing) {
existing.classList.add("active");
existing.querySelector(".history-title").textContent = encodedTitle;
existing.querySelector(".history-meta").textContent = meta;
if (list.firstElementChild !== existing) {
list.prepend(existing);
}
return;
}
if (!list) {
return;
}
var empty = list.querySelector(".history-empty");
if (empty) {
empty.remove();
}
var item = document.createElement("a");
item.className = "history-item active";
item.href = "/?conversation=" + conversationId;
item.innerHTML =
'' +
escapeHtml(encodedTitle) +
'";
list.prepend(item);
}
function setConversationTitle(title) {
if (!title) {
return;
}
var header = document.querySelector(".conversation-header h1");
var empty = document.querySelector(".empty-state");
if (empty) {
empty.remove();
var headerWrap = document.createElement("div");
headerWrap.className = "conversation-header";
headerWrap.id = "conversation-top";
headerWrap.setAttribute("data-node-label", "会话开始");
headerWrap.innerHTML =
'
审核智能体