feat: route incoming messages to correct session by sessionId
When server includes sessionId in text/voice/image payloads, route
to that specific session via addMessageToSession instead of always
adding to active session. Enables unread badges on non-active sessions.
| .. | .. |
|---|
| 285 | 285 | timestamp: Date.now(), |
|---|
| 286 | 286 | status: "sent", |
|---|
| 287 | 287 | }; |
|---|
| 288 | | - addMessageToActive(msg); |
|---|
| 288 | + if (data.sessionId) { |
|---|
| 289 | + addMessageToSession(data.sessionId, msg); |
|---|
| 290 | + } else { |
|---|
| 291 | + addMessageToActive(msg); |
|---|
| 292 | + } |
|---|
| 289 | 293 | notifyIncomingMessage("PAILot", data.content ?? "New message"); |
|---|
| 290 | 294 | break; |
|---|
| 291 | 295 | } |
|---|
| .. | .. |
|---|
| 308 | 312 | timestamp: Date.now(), |
|---|
| 309 | 313 | status: "sent", |
|---|
| 310 | 314 | }; |
|---|
| 311 | | - addMessageToActive(msg); |
|---|
| 315 | + if (data.sessionId) { |
|---|
| 316 | + addMessageToSession(data.sessionId, msg); |
|---|
| 317 | + } else { |
|---|
| 318 | + addMessageToActive(msg); |
|---|
| 319 | + } |
|---|
| 312 | 320 | notifyIncomingMessage("PAILot", data.content ?? "Voice message"); |
|---|
| 313 | 321 | if (msg.audioUri && canAutoplay()) { |
|---|
| 314 | 322 | playAudio(msg.audioUri).catch(() => {}); |
|---|
| .. | .. |
|---|
| 326 | 334 | timestamp: Date.now(), |
|---|
| 327 | 335 | status: "sent", |
|---|
| 328 | 336 | }; |
|---|
| 329 | | - addMessageToActive(msg); |
|---|
| 337 | + if (data.sessionId) { |
|---|
| 338 | + addMessageToSession(data.sessionId, msg); |
|---|
| 339 | + } else { |
|---|
| 340 | + addMessageToActive(msg); |
|---|
| 341 | + } |
|---|
| 330 | 342 | notifyIncomingMessage("PAILot", data.caption ?? "New image"); |
|---|
| 331 | 343 | break; |
|---|
| 332 | 344 | } |
|---|
| .. | .. |
|---|
| 56 | 56 | export interface WsIncomingText { |
|---|
| 57 | 57 | type: "text"; |
|---|
| 58 | 58 | content: string; |
|---|
| 59 | + sessionId?: string; |
|---|
| 59 | 60 | } |
|---|
| 60 | 61 | |
|---|
| 61 | 62 | export interface WsIncomingVoice { |
|---|
| 62 | 63 | type: "voice"; |
|---|
| 63 | 64 | content: string; |
|---|
| 64 | 65 | audioBase64?: string; |
|---|
| 66 | + sessionId?: string; |
|---|
| 65 | 67 | } |
|---|
| 66 | 68 | |
|---|
| 67 | 69 | export interface WsIncomingImage { |
|---|
| 68 | 70 | type: "image"; |
|---|
| 69 | 71 | imageBase64: string; |
|---|
| 70 | 72 | caption?: string; |
|---|
| 73 | + sessionId?: string; |
|---|
| 71 | 74 | } |
|---|
| 72 | 75 | |
|---|
| 73 | 76 | export interface WsSession { |
|---|