fix: GStreamer PipeWire Plugin-Pfad im Nix-Launcher + Paste-Collapse (10 Zeilen) [appimage]
All checks were successful
Build AppImage / build (push) Successful in 6m9s

- 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 <noreply@anthropic.com>
This commit is contained in:
Eddy 2026-04-20 23:38:26 +02:00
parent 54b58cf166
commit 5eed2a36bb
2 changed files with 41 additions and 9 deletions

View file

@ -37,6 +37,16 @@ let
openssl 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, # Laufzeit-Binaries die die App spawnen muss (node fuer claude-bridge.js,
# npm fuer apply_bundle_update, tar fuer Bundle-Extract) # npm fuer apply_bundle_update, tar fuer Bundle-Extract)
runtimeBins = [ pkgs.nodejs_22 pkgs.gnutar pkgs.gzip ]; runtimeBins = [ pkgs.nodejs_22 pkgs.gnutar pkgs.gzip ];
@ -109,9 +119,11 @@ pkgs.stdenv.mkDerivation {
# LD_LIBRARY_PATH + PATH dauerhaft ans Launcher-Script binden # LD_LIBRARY_PATH + PATH dauerhaft ans Launcher-Script binden
# PATH: node/npm/tar muessen fuer die Bridge und apply_bundle_update verfuegbar sein # 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 \ wrapProgram $out/bin/claude-desktop \
--prefix LD_LIBRARY_PATH : ${pkgs.lib.makeLibraryPath runtimeLibs} \ --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 # 2) Installer: kopiert ein frisch gebautes Binary an den Ziel-Ort
cat > $out/bin/claude-desktop-install <<'INSTALLER' cat > $out/bin/claude-desktop-install <<'INSTALLER'

View file

@ -27,8 +27,9 @@
marked.setOptions({ breaks: true, gfm: true, renderer }); marked.setOptions({ breaks: true, gfm: true, renderer });
// Collapse: Nachrichten mit > 25 Zeilen werden eingeklappt // Collapse: Nachrichten mit > X Zeilen werden eingeklappt (rollenabhängig)
const COLLAPSE_LINES = 25; const COLLAPSE_LINES_USER = 10;
const COLLAPSE_LINES_ASSISTANT = 25;
let expandedMessages = $state<string[]>([]); let expandedMessages = $state<string[]>([]);
function toggleExpand(msgId: string) { function toggleExpand(msgId: string) {
@ -39,8 +40,13 @@
} }
} }
function shouldCollapse(content: string): boolean { function shouldCollapse(content: string, role: string = 'assistant'): boolean {
return content.split('\n').length > COLLAPSE_LINES; 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 { function renderMarkdown(text: string): string {
@ -917,16 +923,16 @@
</div> </div>
{:else if message.role === 'assistant'} {:else if message.role === 'assistant'}
{#if message.content} {#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))}
<div class="msg-collapsed"> <div class="msg-collapsed">
{@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...')}
</div> </div>
<button class="expand-btn" onclick={() => toggleExpand(message.id)}> <button class="expand-btn" onclick={() => toggleExpand(message.id)}>
▼ Mehr anzeigen ({message.content.split('\n').length} Zeilen) ▼ Mehr anzeigen ({message.content.split('\n').length} Zeilen)
</button> </button>
{:else} {:else}
{@html renderMarkdown(message.content)} {@html renderMarkdown(message.content)}
{#if shouldCollapse(message.content) && !($isProcessing && isLastAssistantMessage(index))} {#if shouldCollapse(message.content, 'assistant') && !($isProcessing && isLastAssistantMessage(index))}
<button class="expand-btn" onclick={() => toggleExpand(message.id)}> <button class="expand-btn" onclick={() => toggleExpand(message.id)}>
▲ Einklappen ▲ Einklappen
</button> </button>
@ -951,7 +957,21 @@
</span> </span>
{/if} {/if}
{:else} {:else}
{message.content} {#if message.role === 'user' && message.content && shouldCollapse(message.content, 'user') && !expandedMessages.includes(message.id)}
<div class="msg-collapsed">
{message.content.split('\n').slice(0, COLLAPSE_LINES_USER).join('\n')}{'\n...'}
</div>
<button class="expand-btn" onclick={() => toggleExpand(message.id)}>
▼ Eingefügt: {message.content.split('\n').length} Zeilen
</button>
{:else}
{message.content}
{#if message.role === 'user' && message.content && shouldCollapse(message.content, 'user')}
<button class="expand-btn" onclick={() => toggleExpand(message.id)}>
▲ Einklappen
</button>
{/if}
{/if}
{/if} {/if}
</div> </div>
</div> </div>