From 5eed2a36bbbd61c3cd06be8085a544edca7364de Mon Sep 17 00:00:00 2001 From: Eddy Date: Mon, 20 Apr 2026 23:38:26 +0200 Subject: [PATCH] fix: GStreamer PipeWire Plugin-Pfad im Nix-Launcher + Paste-Collapse (10 Zeilen) [appimage] - GST_PLUGIN_SYSTEM_PATH_1_0 mit pipewire im wrapProgram gesetzt - User-Nachrichten >10 Zeilen werden collapsed ("Eingefuegt: X Zeilen") - Assistant-Nachrichten weiterhin ab 25 Zeilen Co-Authored-By: Claude Opus 4.6 --- nix/default.nix | 14 ++++++++++- src/lib/components/ChatPanel.svelte | 36 ++++++++++++++++++++++------- 2 files changed, 41 insertions(+), 9 deletions(-) diff --git a/nix/default.nix b/nix/default.nix index faec47b..71b1103 100644 --- a/nix/default.nix +++ b/nix/default.nix @@ -37,6 +37,16 @@ let openssl ]; + # GStreamer-Plugins fuer WebKitGTK (Audio/Video, WebRTC, Mikrofon via PipeWire) + gstPlugins = with pkgs.gst_all_1; [ + gst-plugins-base + gst-plugins-good + gst-plugins-bad + ]; + + gstPluginPath = pkgs.lib.concatMapStringsSep ":" (p: "${p}/lib/gstreamer-1.0") gstPlugins + + ":${pkgs.pipewire}/lib/gstreamer-1.0"; + # Laufzeit-Binaries die die App spawnen muss (node fuer claude-bridge.js, # npm fuer apply_bundle_update, tar fuer Bundle-Extract) runtimeBins = [ pkgs.nodejs_22 pkgs.gnutar pkgs.gzip ]; @@ -109,9 +119,11 @@ pkgs.stdenv.mkDerivation { # LD_LIBRARY_PATH + PATH dauerhaft ans Launcher-Script binden # PATH: node/npm/tar muessen fuer die Bridge und apply_bundle_update verfuegbar sein + # GST_PLUGIN_SYSTEM_PATH_1_0: GStreamer-Plugins fuer WebKitGTK (Mikrofon/PipeWire) wrapProgram $out/bin/claude-desktop \ --prefix LD_LIBRARY_PATH : ${pkgs.lib.makeLibraryPath runtimeLibs} \ - --prefix PATH : ${pkgs.lib.makeBinPath runtimeBins} + --prefix PATH : ${pkgs.lib.makeBinPath runtimeBins} \ + --prefix GST_PLUGIN_SYSTEM_PATH_1_0 : ${gstPluginPath} # 2) Installer: kopiert ein frisch gebautes Binary an den Ziel-Ort cat > $out/bin/claude-desktop-install <<'INSTALLER' diff --git a/src/lib/components/ChatPanel.svelte b/src/lib/components/ChatPanel.svelte index 071eab8..961ebc4 100644 --- a/src/lib/components/ChatPanel.svelte +++ b/src/lib/components/ChatPanel.svelte @@ -27,8 +27,9 @@ marked.setOptions({ breaks: true, gfm: true, renderer }); - // Collapse: Nachrichten mit > 25 Zeilen werden eingeklappt - const COLLAPSE_LINES = 25; + // Collapse: Nachrichten mit > X Zeilen werden eingeklappt (rollenabhängig) + const COLLAPSE_LINES_USER = 10; + const COLLAPSE_LINES_ASSISTANT = 25; let expandedMessages = $state([]); function toggleExpand(msgId: string) { @@ -39,8 +40,13 @@ } } - function shouldCollapse(content: string): boolean { - return content.split('\n').length > COLLAPSE_LINES; + function shouldCollapse(content: string, role: string = 'assistant'): boolean { + const limit = role === 'user' ? COLLAPSE_LINES_USER : COLLAPSE_LINES_ASSISTANT; + return content.split('\n').length > limit; + } + + function getCollapseLimit(role: string): number { + return role === 'user' ? COLLAPSE_LINES_USER : COLLAPSE_LINES_ASSISTANT; } function renderMarkdown(text: string): string { @@ -917,16 +923,16 @@ {:else if message.role === 'assistant'} {#if message.content} - {#if shouldCollapse(message.content) && !expandedMessages.includes(message.id) && !($isProcessing && isLastAssistantMessage(index))} + {#if shouldCollapse(message.content, 'assistant') && !expandedMessages.includes(message.id) && !($isProcessing && isLastAssistantMessage(index))}
- {@html renderMarkdown(message.content.split('\n').slice(0, COLLAPSE_LINES).join('\n') + '\n...')} + {@html renderMarkdown(message.content.split('\n').slice(0, COLLAPSE_LINES_ASSISTANT).join('\n') + '\n...')}
{:else} {@html renderMarkdown(message.content)} - {#if shouldCollapse(message.content) && !($isProcessing && isLastAssistantMessage(index))} + {#if shouldCollapse(message.content, 'assistant') && !($isProcessing && isLastAssistantMessage(index))} @@ -951,7 +957,21 @@ {/if} {:else} - {message.content} + {#if message.role === 'user' && message.content && shouldCollapse(message.content, 'user') && !expandedMessages.includes(message.id)} +
+ {message.content.split('\n').slice(0, COLLAPSE_LINES_USER).join('\n')}{'\n...'} +
+ + {:else} + {message.content} + {#if message.role === 'user' && message.content && shouldCollapse(message.content, 'user')} + + {/if} + {/if} {/if}