fix(tui): preserve family session recency

This commit is contained in:
Ryan Vogel 2026-08-01 11:48:29 -04:00
commit 729531550c
7 changed files with 165 additions and 56 deletions

View file

@ -444,6 +444,18 @@ function run(db: DatabaseService, event: MessageEvent) {
})
}
function runAndTouch(db: DatabaseService, event: MessageEvent) {
return Effect.gen(function* () {
yield* run(db, event)
yield* db
.update(SessionTable)
.set({ time_updated: DateTime.toEpochMillis(event.created) })
.where(eq(SessionTable.id, event.data.sessionID))
.run()
.pipe(Effect.orDie)
})
}
function insertMessage(db: DatabaseService, event: SessionEvent.DurableEvent, message: SessionMessage.Info) {
if (event.durable === undefined) return Effect.die(new Error("Durable Session event is missing aggregate sequence"))
const encoded = encodeMessage(message)
@ -678,9 +690,9 @@ const layer = Layer.effectDiscard(
})
}),
)
yield* bus.project(SessionEvent.Execution.Succeeded, (event) => run(db, event))
yield* bus.project(SessionEvent.Execution.Failed, (event) => run(db, event))
yield* bus.project(SessionEvent.Execution.Interrupted, (event) => run(db, event))
yield* bus.project(SessionEvent.Execution.Succeeded, (event) => runAndTouch(db, event))
yield* bus.project(SessionEvent.Execution.Failed, (event) => runAndTouch(db, event))
yield* bus.project(SessionEvent.Execution.Interrupted, (event) => runAndTouch(db, event))
yield* bus.project(SessionEvent.InstructionsUpdated, (event) =>
InstructionState.apply(db, event.data.sessionID, event.durable.seq, event.data.delta),
)

View file

@ -659,6 +659,7 @@ describe("SessionProjector", () => {
directory: "/project",
title: "test",
version: "test",
time_updated: -1,
})
.run()
.pipe(Effect.orDie)
@ -670,9 +671,17 @@ describe("SessionProjector", () => {
.where(eq(SessionTable.id, sessionID))
.get()
.pipe(Effect.orDie)
const updated = () =>
db
.select({ value: SessionTable.time_updated })
.from(SessionTable)
.where(eq(SessionTable.id, sessionID))
.get()
.pipe(Effect.orDie)
yield* bus.publish(SessionEvent.Execution.Interrupted, { sessionID, reason: "shutdown" })
expect((yield* suspended())?.timeSuspended).toBeNull()
expect((yield* updated())?.value ?? -1).toBeGreaterThan(-1)
yield* bus.publish(SessionEvent.Execution.Started, { sessionID })
expect((yield* suspended())?.timeSuspended).toBeNull()