fix: v0.1.16 — fix message delivery between same-member sessions
Some checks failed
CI / Lint (push) Has been cancelled
CI / Typecheck (push) Has been cancelled
CI / Broker tests (Postgres) (push) Has been cancelled
CI / Docker build (linux/amd64) (push) Has been cancelled
Release / Publish multi-arch images (push) Has been cancelled

excludeSenderMemberId blocked delivery to ALL peers sharing the
same member_id (all sessions from one join). Replaced with
excludeSenderSessionPubkey which only excludes the sender's own
session — peers with different session pubkeys receive correctly.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Alejandro Gutiérrez
2026-04-06 12:44:29 +01:00
parent 2557235c68
commit 663f800b4b
3 changed files with 6 additions and 6 deletions

View File

@@ -492,7 +492,7 @@ export async function drainForMember(
memberPubkey: string, memberPubkey: string,
status: PeerStatus, status: PeerStatus,
sessionPubkey?: string, sessionPubkey?: string,
excludeSenderMemberId?: string, excludeSenderSessionPubkey?: string,
): Promise< ): Promise<
Array<{ Array<{
id: string; id: string;
@@ -534,7 +534,7 @@ export async function drainForMember(
AND delivered_at IS NULL AND delivered_at IS NULL
AND priority::text IN (${priorityList}) AND priority::text IN (${priorityList})
AND (target_spec = ${memberPubkey} OR target_spec = '*'${sessionPubkey ? sql` OR target_spec = ${sessionPubkey}` : sql``}) AND (target_spec = ${memberPubkey} OR target_spec = '*'${sessionPubkey ? sql` OR target_spec = ${sessionPubkey}` : sql``})
${excludeSenderMemberId ? sql`AND sender_member_id != ${excludeSenderMemberId}` : sql``} ${excludeSenderSessionPubkey ? sql`AND (sender_session_pubkey IS NULL OR sender_session_pubkey != ${excludeSenderSessionPubkey})` : sql``}
ORDER BY created_at ASC, id ASC ORDER BY created_at ASC, id ASC
FOR UPDATE SKIP LOCKED FOR UPDATE SKIP LOCKED
) )

View File

@@ -83,7 +83,7 @@ function sendToPeer(presenceId: string, msg: WSServerMessage): void {
async function maybePushQueuedMessages( async function maybePushQueuedMessages(
presenceId: string, presenceId: string,
excludeSenderMemberId?: string, excludeSenderSessionPubkey?: string,
): Promise<void> { ): Promise<void> {
const conn = connections.get(presenceId); const conn = connections.get(presenceId);
if (!conn) return; if (!conn) return;
@@ -98,7 +98,7 @@ async function maybePushQueuedMessages(
conn.memberPubkey, conn.memberPubkey,
status, status,
conn.sessionPubkey ?? undefined, conn.sessionPubkey ?? undefined,
excludeSenderMemberId, excludeSenderSessionPubkey,
); );
for (const m of messages) { for (const m of messages) {
const push: WSPushMessage = { const push: WSPushMessage = {
@@ -470,7 +470,7 @@ async function handleSend(
&& peer.memberPubkey !== msg.targetSpec && peer.memberPubkey !== msg.targetSpec
&& peer.sessionPubkey !== msg.targetSpec) && peer.sessionPubkey !== msg.targetSpec)
continue; continue;
void maybePushQueuedMessages(pid, conn.memberId); void maybePushQueuedMessages(pid, conn.sessionPubkey ?? undefined);
} }
} }

View File

@@ -1,6 +1,6 @@
{ {
"name": "claudemesh-cli", "name": "claudemesh-cli",
"version": "0.1.15", "version": "0.1.16",
"description": "Claude Code MCP client for claudemesh — peer mesh messaging between Claude sessions.", "description": "Claude Code MCP client for claudemesh — peer mesh messaging between Claude sessions.",
"keywords": [ "keywords": [
"claude-code", "claude-code",