diff --git a/crates/sprout-mcp/src/server.rs b/crates/sprout-mcp/src/server.rs index 98cfe15..713dac2 100644 --- a/crates/sprout-mcp/src/server.rs +++ b/crates/sprout-mcp/src/server.rs @@ -464,17 +464,24 @@ impl SproutMcpServer { let channel_tag = match nostr::Tag::parse(&["channel", &p.channel_id]) { Ok(t) => t, - Err(e) => return format!("Error building tag: {e}"), + Err(e) => return format!("Error building channel tag: {e}"), + }; + let event_ref_tag = match nostr::Tag::parse(&["e", &p.channel_id]) { + Ok(t) => t, + Err(e) => return format!("Error building event-ref tag: {e}"), }; let keys = self.client.keys().clone(); - let event = - match nostr::EventBuilder::new(nostr::Kind::Custom(kind), &p.content, [channel_tag]) - .sign_with_keys(&keys) - { - Ok(e) => e, - Err(e) => return format!("Error signing event: {e}"), - }; + let event = match nostr::EventBuilder::new( + nostr::Kind::Custom(kind), + &p.content, + [channel_tag, event_ref_tag], + ) + .sign_with_keys(&keys) + { + Ok(e) => e, + Err(e) => return format!("Error signing event: {e}"), + }; match self.client.send_event(event).await { Ok(ok) if ok.accepted => format!("Message sent. Event ID: {}", ok.event_id), diff --git a/desktop/src/app/AppShell.tsx b/desktop/src/app/AppShell.tsx index b2eb31d..6777975 100644 --- a/desktop/src/app/AppShell.tsx +++ b/desktop/src/app/AppShell.tsx @@ -167,7 +167,6 @@ export function AppShell() { : "No channel selected" } isLoading={messagesQuery.isLoading} - key={activeChannel?.id ?? "no-channel"} messages={timelineMessages} /> { await sendMessageMutation.mutateAsync(content); }} diff --git a/desktop/src/features/messages/hooks.ts b/desktop/src/features/messages/hooks.ts index e782e61..77138ad 100644 --- a/desktop/src/features/messages/hooks.ts +++ b/desktop/src/features/messages/hooks.ts @@ -35,7 +35,10 @@ function createOptimisticMessage( pubkey: identity.pubkey, created_at: Math.floor(Date.now() / 1_000), kind: 4_0001, - tags: [["e", channelId]], + tags: [ + ["channel", channelId], + ["e", channelId], + ], content, sig: "", pending: true, diff --git a/desktop/src/shared/api/relayClient.ts b/desktop/src/shared/api/relayClient.ts index c726e7e..5381e7d 100644 --- a/desktop/src/shared/api/relayClient.ts +++ b/desktop/src/shared/api/relayClient.ts @@ -122,7 +122,13 @@ class RelayClient { const event = await signRelayEvent({ kind: 40001, content: content.trim(), - tags: [["e", channelId]], + // Include both tags for now: + // - `channel` lets the relay persist and authorize the event as channel-scoped + // - `e` keeps the existing desktop WebSocket history/subscription filters working + tags: [ + ["channel", channelId], + ["e", channelId], + ], }); return new Promise((resolve, reject) => {