diff --git a/apps/broker/src/broker.ts b/apps/broker/src/broker.ts index f713ebf..b48d7cf 100644 --- a/apps/broker/src/broker.ts +++ b/apps/broker/src/broker.ts @@ -38,7 +38,6 @@ import { meshFileKey, meshContext, meshMember as memberTable, - meshMember, meshMemory, meshNotification, meshState, @@ -896,12 +895,12 @@ async function fanOutMentions(args: { const recipients = await db .select({ - id: meshMember.id, - displayName: meshMember.displayName, + id: memberTable.id, + displayName: memberTable.displayName, }) - .from(meshMember) + .from(memberTable) .where( - and(eq(meshMember.meshId, topic.meshId), isNull(meshMember.revokedAt)), + and(eq(memberTable.meshId, topic.meshId), isNull(memberTable.revokedAt)), ); const tokenSet = new Set(tokens); const targets = recipients diff --git a/apps/broker/src/index.ts b/apps/broker/src/index.ts index bbabcbc..b656620 100644 --- a/apps/broker/src/index.ts +++ b/apps/broker/src/index.ts @@ -1952,6 +1952,7 @@ async function handleSend( senderSessionPubkey: conn.sessionPubkey ?? undefined, nonce: msg.nonce, ciphertext: msg.ciphertext, + mentions: msg.mentions, }).catch((e) => log.warn("appendTopicMessage failed", { topic_id: topicId, err: String(e) }), ); diff --git a/apps/broker/src/types.ts b/apps/broker/src/types.ts index b510874..321eb1b 100644 --- a/apps/broker/src/types.ts +++ b/apps/broker/src/types.ts @@ -98,6 +98,14 @@ export interface WSSendMessage { nonce: string; // base64 ciphertext: string; // base64 id?: string; // client-side correlation id + /** + * Optional client-extracted `@-mention` display names (lowercased, + * no `@` prefix, max 16). Required when `body_version: 2` cipher + * lands in v0.3.0 phase 3 — the server can't read v2 ciphertext to + * regex-match. Today's v1 plaintext path falls back to a regex on + * the body when this is absent. + */ + mentions?: string[]; } /** Broker → client: an envelope addressed to this peer. */