diff --git a/packages/core/src/session/projector.ts b/packages/core/src/session/projector.ts index 9d0062fee6ae..64ab79dea853 100644 --- a/packages/core/src/session/projector.ts +++ b/packages/core/src/session/projector.ts @@ -657,6 +657,12 @@ const layer = Layer.effectDiscard( input: event.data.input, timeCreated: event.created, }) + yield* db + .update(SessionTable) + .set({ time_updated: DateTime.toEpochMillis(event.created) }) + .where(eq(SessionTable.id, event.data.sessionID)) + .run() + .pipe(Effect.orDie) }), ) yield* bus.project(SessionEvent.Compaction.Admitted, (event) => diff --git a/packages/core/test/session-create.test.ts b/packages/core/test/session-create.test.ts index 1bda9a548813..3a319664972f 100644 --- a/packages/core/test/session-create.test.ts +++ b/packages/core/test/session-create.test.ts @@ -171,6 +171,30 @@ describe("Session.create", () => { }), ) + it.effect("orders sessions by their latest prompt", () => + Effect.gen(function* () { + const session = yield* Session.Service + const { db } = yield* Database.Service + const active = yield* session.create({ location, title: "active" }) + const newer = yield* session.create({ location, title: "newer" }) + + yield* db + .update(SessionTable) + .set({ time_created: -2, time_updated: -2 }) + .where(eq(SessionTable.id, active.id)) + .run() + yield* db + .update(SessionTable) + .set({ time_created: -1, time_updated: -1 }) + .where(eq(SessionTable.id, newer.id)) + .run() + + yield* session.prompt({ sessionID: active.id, text: "continue", resume: false }) + + expect((yield* session.list()).data.map((item) => item.id)).toEqual([active.id, newer.id]) + }), + ) + it.effect("filters direct child sessions by parent ID", () => Effect.gen(function* () { const session = yield* Session.Service