feat(FN-4583): complete Step 1 — add chat room message tail ordering

Fusion-Task-Id: FN-4583
Fusion-Task-Lineage: 4d9b088d-a705-4376-b547-15b37e5370aa
This commit is contained in:
Fusion
2026-05-15 01:52:29 -07:00
committed by gsxdsm
parent f725a92f6c
commit a24d601b86
3 changed files with 24 additions and 2 deletions

View File

@@ -146,6 +146,25 @@ describe("ChatStore — rooms (FN-3805..FN-3811 contract)", () => {
expect(store.listRoomMessagesSince(room.id, new Date().toISOString())).toEqual([]);
});
it("returns newest limited room window when order is desc while preserving ascending output", () => {
const room = store.createRoom({ name: "window-test" });
for (let i = 1; i <= 107; i += 1) {
store.addRoomMessage(room.id, { role: "user", content: `message-${i}` });
}
const newestWindow = store.getRoomMessages(room.id, { limit: 100, order: "desc" });
expect(newestWindow).toHaveLength(100);
expect(newestWindow[0]?.content).toBe("message-8");
expect(newestWindow.at(-1)?.content).toBe("message-107");
expect(newestWindow.some((message) => message.content === "message-1")).toBe(false);
const legacyWindow = store.getRoomMessages(room.id, { limit: 100 });
expect(legacyWindow).toHaveLength(100);
expect(legacyWindow[0]?.content).toBe("message-1");
expect(legacyWindow.at(-1)?.content).toBe("message-100");
});
it("keeps cross-room and direct-vs-room histories isolated", () => {
const session = store.createSession({ agentId: "agent-1" });
store.addMessage(session.id, { role: "user", content: "direct" });

View File

@@ -926,14 +926,16 @@ export class ChatStore extends EventEmitter<ChatStoreEvents> {
params.push(filter.before);
}
const order = filter?.order === "desc" ? "DESC" : "ASC";
const rows = this.db.prepare(`
SELECT * FROM chat_room_messages
WHERE ${whereClauses.join(" AND ")}
ORDER BY createdAt ASC
ORDER BY createdAt ${order}
LIMIT ? OFFSET ?
`).all(...params, filter?.limit ?? 100, filter?.offset ?? 0) as ChatRoomMessageRow[];
return rows.map((row) => this.rowToRoomMessage(row));
const normalizedRows = filter?.order === "desc" ? [...rows].reverse() : rows;
return normalizedRows.map((row) => this.rowToRoomMessage(row));
}
listRoomMessagesSince(

View File

@@ -263,4 +263,5 @@ export interface ChatRoomMessagesFilter {
limit?: number;
offset?: number;
before?: string;
order?: "asc" | "desc";
}