added shared volume to diagnostic, added folder picker to android app, fixed bridge for attachment uploading, fixed hopefully chat history in android app
This commit is contained in:
@@ -859,7 +859,11 @@
|
||||
const el = document.createElement('div');
|
||||
el.className = `chat-msg ${type}`;
|
||||
const escaped = escapeHtml(text);
|
||||
const linked = linkifyText(escaped);
|
||||
let linked = linkifyText(escaped);
|
||||
// /shared/uploads/ Pfade als Inline-Bilder anzeigen
|
||||
linked = linked.replace(/\/shared\/uploads\/[^\s<"]+\.(jpg|jpeg|png|gif)/gi, (match) => {
|
||||
return `<a href="${match}" target="_blank">${match}</a><img src="${match}" class="chat-media" onclick="openLightbox('image','${match}')" onerror="this.style.display='none'">`;
|
||||
});
|
||||
el.innerHTML = `${linked}<div class="meta">${escapeHtml(meta)} — ${new Date().toLocaleTimeString('de-DE')}</div>`;
|
||||
chatBox.appendChild(el);
|
||||
chatBox.scrollTop = chatBox.scrollHeight;
|
||||
|
||||
@@ -462,6 +462,11 @@ function connectRVS(forcePlain) {
|
||||
pipelineEnd(true, `Antwort via RVS von ${sender}: "${(msg.payload.text || "").slice(0, 120)}"`);
|
||||
}
|
||||
broadcast({ type: "rvs_chat", msg });
|
||||
} else if (msg.type === "stt_result" && msg.payload) {
|
||||
const text = msg.payload.text || "(nicht erkannt)";
|
||||
log("info", "rvs", `STT: "${text.slice(0, 100)}"`);
|
||||
// Im Chat als User-Nachricht anzeigen (zur Info, wurde schon an ARIA gesendet)
|
||||
broadcast({ type: "rvs_chat", msg: { type: "chat", payload: { text: `\uD83C\uDFA4 ${text}`, sender: "user" } } });
|
||||
} else if (msg.type === "heartbeat") {
|
||||
// ignorieren
|
||||
} else {
|
||||
@@ -945,6 +950,28 @@ const server = http.createServer((req, res) => {
|
||||
} else if (req.url === "/api/session") {
|
||||
res.writeHead(200, { "Content-Type": "application/json" });
|
||||
res.end(JSON.stringify({ sessionKey: activeSessionKey }));
|
||||
} else if (req.url.startsWith("/shared/")) {
|
||||
// Dateien aus Shared Volume ausliefern (Bilder, Uploads)
|
||||
const filePath = decodeURIComponent(req.url);
|
||||
const safePath = path.resolve(filePath);
|
||||
if (!safePath.startsWith("/shared/")) {
|
||||
res.writeHead(403);
|
||||
res.end("Forbidden");
|
||||
return;
|
||||
}
|
||||
try {
|
||||
if (!fs.existsSync(safePath)) { res.writeHead(404); res.end("Not Found"); return; }
|
||||
const ext = path.extname(safePath).toLowerCase();
|
||||
const mimeTypes = { ".jpg": "image/jpeg", ".jpeg": "image/jpeg", ".png": "image/png", ".gif": "image/gif",
|
||||
".pdf": "application/pdf", ".txt": "text/plain", ".json": "application/json" };
|
||||
const contentType = mimeTypes[ext] || "application/octet-stream";
|
||||
const data = fs.readFileSync(safePath);
|
||||
res.writeHead(200, { "Content-Type": contentType, "Content-Length": data.length });
|
||||
res.end(data);
|
||||
} catch (err) {
|
||||
res.writeHead(500);
|
||||
res.end("Error");
|
||||
}
|
||||
} else {
|
||||
res.writeHead(404);
|
||||
res.end("Not Found");
|
||||
|
||||
Reference in New Issue
Block a user