fix some minor issues

This commit is contained in:
2026-04-08 09:35:49 +02:00
parent 31569b2d19
commit 603f8492cb
3 changed files with 24 additions and 22 deletions
+2 -1
View File
@@ -8,10 +8,11 @@
}, },
"dependencies": { "dependencies": {
"bcrypt": "^5.1.1", "bcrypt": "^5.1.1",
"body-parser": "^1.20.2",
"better-sqlite3": "^9.5.0", "better-sqlite3": "^9.5.0",
"body-parser": "^1.20.2",
"express": "^4.19.2", "express": "^4.19.2",
"express-session": "^1.17.3", "express-session": "^1.17.3",
"qs": "^6.15.0",
"session-file-store": "^1.5.0" "session-file-store": "^1.5.0"
} }
} }
+5 -4
View File
@@ -139,19 +139,20 @@ async function collectMarketPersona(marketId, personaType) {
setMarketStatus(personaType === "assistant" ? "AI persona collected." : "User persona collected.", "success"); setMarketStatus(personaType === "assistant" ? "AI persona collected." : "User persona collected.", "success");
} }
refreshMarketBtn.addEventListener("click", loadMarketPersonas); refreshMarketBtn.addEventListener("click", () => { void loadMarketPersonas(); });
marketSearchInput.addEventListener("input", applyMarketFilter); marketSearchInput.addEventListener("input", applyMarketFilter);
marketPreviewCancel.addEventListener("click", closeMarketPreview); marketPreviewCancel.addEventListener("click", closeMarketPreview);
marketPreviewClose.addEventListener("click", closeMarketPreview); marketPreviewClose.addEventListener("click", closeMarketPreview);
marketPreviewModal.addEventListener("click", (event) => { if (event.target === marketPreviewModal) closeMarketPreview(); }); marketPreviewModal.addEventListener("click", (event) => { if (event.target === marketPreviewModal) closeMarketPreview(); });
marketPreviewConfirm.addEventListener("click", async () => { marketPreviewConfirm.addEventListener("click", async () => {
if (!pendingMarketPersona) return; if (!pendingMarketPersona) return;
const {id, persona_type} = pendingMarketPersona; const marketId = pendingMarketPersona.id;
const personaType = pendingMarketPersona.persona_type;
closeMarketPreview(); closeMarketPreview();
await collectMarketPersona(id, persona_type); await collectMarketPersona(marketId, personaType);
}); });
window.addEventListener("load", () => { window.addEventListener("load", () => {
applyTheme(localStorage.getItem("krishd-theme") || "fakegpt"); applyTheme(localStorage.getItem("krishd-theme") || "fakegpt");
loadMarketPersonas(); void loadMarketPersonas();
}); });
+17 -17
View File
@@ -7,7 +7,7 @@ const registerUsernameInput = $("registerUsername"), registerPasswordInput = $("
const loginSubmit = $("loginSubmit"), registerSubmit = $("registerSubmit"); const loginSubmit = $("loginSubmit"), registerSubmit = $("registerSubmit");
const chatList = $("chatList"), chatSearchInput = $("chatSearch"), newChatBtn = $("newChat"); const chatList = $("chatList"), chatSearchInput = $("chatSearch"), newChatBtn = $("newChat");
const renameChatBtn = $("renameChat"), clearChatBtn = $("clearChat"), exportChatBtn = $("exportChat"); const renameChatBtn = $("renameChat"), clearChatBtn = $("clearChat"), exportChatBtn = $("exportChat");
const activeChatTitle = $("activeChatTitle"), workspaceSubline = $("workspaceSubline"), sessionUser = $("sessionUser"); const activeChatTitle = $("activeChatTitle"), sessionUser = $("sessionUser");
const personaList = $("personaList"), userPersonaList = $("userPersonaList"); const personaList = $("personaList"), userPersonaList = $("userPersonaList");
const personaForm = $("personaForm"), personaFormTitle = $("personaFormTitle"), personaTypeSelect = $("personaType"); const personaForm = $("personaForm"), personaFormTitle = $("personaFormTitle"), personaTypeSelect = $("personaType");
const personaNameInput = $("personaName"), personaPronounsInput = $("personaPronouns"), personaAppearanceInput = $("personaAppearance"); const personaNameInput = $("personaName"), personaPronounsInput = $("personaPronouns"), personaAppearanceInput = $("personaAppearance");
@@ -58,8 +58,10 @@ function setPersonaFormNotice(message = "", state = "") {
personaFormNotice.className = state ? `status ${state}` : "status"; personaFormNotice.className = state ? `status ${state}` : "status";
} }
function setMessageContent(el, content) { function setMessageContent(el, content) {
if (window.marked && window.DOMPurify) { const markdownParser = window.marked;
el.innerHTML = DOMPurify.sanitize(marked.parse(content, {breaks: true})); const purifier = window.DOMPurify;
if (markdownParser?.parse && purifier?.sanitize) {
el.innerHTML = purifier.sanitize(markdownParser.parse(content, {breaks: true}));
} else { } else {
el.textContent = content; el.textContent = content;
} }
@@ -110,10 +112,6 @@ function updateWorkspaceCopy() {
} }
} }
function updateSummaryStats() {
return currentSummary;
}
function updateContextRail() { function updateContextRail() {
return modelSelect?.selectedOptions[0]?.textContent || ""; return modelSelect?.selectedOptions[0]?.textContent || "";
} }
@@ -353,13 +351,14 @@ async function deleteChat(id) {
async function displayModels() { async function displayModels() {
const res = await get("/models"); const res = await get("/models");
if (res.error || !Array.isArray(res.models)) { const models = Array.isArray(res.models) ? res.models : null;
if (res.error || !models) {
modelSelect.innerHTML = "<option>Error loading models</option>"; modelSelect.innerHTML = "<option>Error loading models</option>";
updateContextRail(); updateContextRail();
return setNotice("Models could not be loaded.", "error"); return setNotice("Models could not be loaded.", "error");
} }
modelSelect.innerHTML = ""; modelSelect.innerHTML = "";
res.models.forEach((model, index) => { models.forEach((model, index) => {
const option = document.createElement("option"); const option = document.createElement("option");
option.value = model.model; option.textContent = model.name; option.selected = index === 0; modelSelect.appendChild(option); option.value = model.model; option.textContent = model.name; option.selected = index === 0; modelSelect.appendChild(option);
}); });
@@ -428,23 +427,24 @@ function togglePersonaPopover(event) {
} }
toggleButtons.forEach((btn) => btn.addEventListener("click", () => showAuthScreen(btn.dataset.target))); toggleButtons.forEach((btn) => btn.addEventListener("click", () => showAuthScreen(btn.dataset.target)));
loginForm.addEventListener("submit", (event) => { event.preventDefault(); handleAuth("login", {username: loginUsernameInput.value.trim(), password: loginPasswordInput.value.trim()}); }); loginForm.addEventListener("submit", (event) => { event.preventDefault(); void handleAuth("login", {username: loginUsernameInput.value.trim(), password: loginPasswordInput.value.trim()}); });
registerForm.addEventListener("submit", (event) => { event.preventDefault(); handleAuth("register", {username: registerUsernameInput.value.trim(), password: registerPasswordInput.value.trim()}); }); registerForm.addEventListener("submit", (event) => { event.preventDefault(); void handleAuth("register", {username: registerUsernameInput.value.trim(), password: registerPasswordInput.value.trim()}); });
$("logout").addEventListener("click", async () => { $("logout").addEventListener("click", async () => {
await post("/logout", {}); chatDiv.style.display = "none"; authDiv.style.display = "grid"; await post("/logout", {}); chatDiv.style.display = "none"; authDiv.style.display = "grid";
activeChatId = null; currentUsername = ""; currentSummary = null; chatSessions = []; currentMessages = []; assistantPersonas = []; userPersonas = []; activeChatId = null; currentUsername = ""; currentSummary = null; chatSessions = []; currentMessages = []; assistantPersonas = []; userPersonas = [];
activePersonaId = null; activeUserPersonaId = null; publishedPersonaIds = new Set(); messagesDiv.innerHTML = ""; renderChatList(); updateChatActionState(); activePersonaId = null; activeUserPersonaId = null; publishedPersonaIds = new Set(); messagesDiv.innerHTML = ""; renderChatList(); updateChatActionState();
showAuthScreen("login"); setAuthMessage("Logged out.", "success"); setNotice("Ready."); showAuthScreen("login"); setAuthMessage("Logged out.", "success"); setNotice("Ready.");
}); });
sendBtn.addEventListener("click", sendMessage); sendBtn.addEventListener("click", () => { void sendMessage(); });
msgInput.addEventListener("keydown", (event) => { if (event.key === "Enter" && !event.shiftKey) { event.preventDefault(); sendMessage(); } }); msgInput.addEventListener("keydown", (event) => { if (event.key === "Enter" && !event.shiftKey) { event.preventDefault(); void sendMessage(); } });
msgInput.addEventListener("input", function () { this.style.height = "auto"; this.style.height = `${Math.min(this.scrollHeight, 180)}px`; }); msgInput.addEventListener("input", function () { this.style.height = "auto"; this.style.height = `${Math.min(this.scrollHeight, 180)}px`; });
newChatBtn.addEventListener("click", createNewChat); renameChatBtn.addEventListener("click", () => activeChatId && renameChat(activeChatId)); newChatBtn.addEventListener("click", () => { void createNewChat(); });
clearChatBtn.addEventListener("click", () => activeChatId && clearChat(activeChatId)); exportChatBtn.addEventListener("click", exportCurrentChat); renameChatBtn.addEventListener("click", () => { if (activeChatId) void renameChat(activeChatId); });
clearChatBtn.addEventListener("click", () => { if (activeChatId) void clearChat(activeChatId); }); exportChatBtn.addEventListener("click", exportCurrentChat);
chatSearchInput.addEventListener("input", renderChatList); modelSelect.addEventListener("change", updateContextRail); chatSearchInput.addEventListener("input", renderChatList); modelSelect.addEventListener("change", updateContextRail);
newPersonaBtn.addEventListener("click", () => openPersonaForm()); newUserPersonaBtn.addEventListener("click", () => openPersonaForm(null, "user")); newPersonaBtn.addEventListener("click", () => openPersonaForm()); newUserPersonaBtn.addEventListener("click", () => openPersonaForm(null, "user"));
clearPersonaBtn.addEventListener("click", () => clearPersona("assistant")); clearUserPersonaBtn.addEventListener("click", () => clearPersona("user")); clearPersonaBtn.addEventListener("click", () => { void clearPersona("assistant"); }); clearUserPersonaBtn.addEventListener("click", () => { void clearPersona("user"); });
personaForm.addEventListener("submit", (event) => { event.preventDefault(); savePersona(); }); personaCloseBtn.addEventListener("click", closePersonaForm); personaForm.addEventListener("submit", (event) => { event.preventDefault(); void savePersona(); }); personaCloseBtn.addEventListener("click", closePersonaForm);
personaModal.addEventListener("click", (event) => { if (event.target === personaModal) closePersonaForm(); }); personaModal.addEventListener("click", (event) => { if (event.target === personaModal) closePersonaForm(); });
personaMenuButton.addEventListener("click", togglePersonaPopover); personaPopover.addEventListener("click", (event) => event.stopPropagation()); document.addEventListener("click", closePersonaPopover); personaMenuButton.addEventListener("click", togglePersonaPopover); personaPopover.addEventListener("click", (event) => event.stopPropagation()); document.addEventListener("click", closePersonaPopover);
document.addEventListener("keydown", (event) => { if (event.key === "Escape") { closePersonaPopover(); closePersonaForm(); } }); document.addEventListener("keydown", (event) => { if (event.key === "Escape") { closePersonaPopover(); closePersonaForm(); } });