( state: KimiClientState, event: AppEvent, meta: EventMeta, )
| 228 | } |
| 229 | |
| 230 | export function reduceAppEvent( |
| 231 | state: KimiClientState, |
| 232 | event: AppEvent, |
| 233 | meta: EventMeta, |
| 234 | ): KimiClientState { |
| 235 | const next = cloneState(state); |
| 236 | |
| 237 | // Always advance lastSeqBySession for every event that carries seq info. |
| 238 | advanceSeq(next, meta.sessionId, meta.seq); |
| 239 | |
| 240 | switch (event.type) { |
| 241 | // ------------------------------------------------------------------------- |
| 242 | case 'sessionCreated': { |
| 243 | const exists = next.sessions.some((s) => s.id === event.session.id); |
| 244 | if (!exists) { |
| 245 | next.sessions = [event.session, ...next.sessions]; |
| 246 | } |
| 247 | break; |
| 248 | } |
| 249 | |
| 250 | // ------------------------------------------------------------------------- |
| 251 | case 'sessionUpdated': { |
| 252 | next.sessions = next.sessions.map((s) => |
| 253 | s.id === event.session.id ? event.session : s, |
| 254 | ); |
| 255 | break; |
| 256 | } |
| 257 | |
| 258 | // ------------------------------------------------------------------------- |
| 259 | case 'sessionDeleted': { |
| 260 | const id = event.sessionId; |
| 261 | next.sessions = next.sessions.filter((s) => s.id !== id); |
| 262 | delete next.messagesBySession[id]; |
| 263 | delete next.tasksBySession[id]; |
| 264 | delete next.goalBySession[id]; |
| 265 | delete next.approvalsBySession[id]; |
| 266 | delete next.questionsBySession[id]; |
| 267 | delete next.lastSeqBySession[id]; |
| 268 | if (next.activeSessionId === id) { |
| 269 | next.activeSessionId = undefined; |
| 270 | } |
| 271 | break; |
| 272 | } |
| 273 | |
| 274 | // ------------------------------------------------------------------------- |
| 275 | case 'sessionStatusChanged': { |
| 276 | next.sessions = next.sessions.map((s) => { |
| 277 | if (s.id !== event.sessionId) return s; |
| 278 | return { |
| 279 | ...s, |
| 280 | status: event.status, |
| 281 | currentPromptId: event.currentPromptId, |
| 282 | }; |
| 283 | }); |
| 284 | break; |
| 285 | } |
| 286 | |
| 287 | // ------------------------------------------------------------------------- |
no test coverage detected