Fix app stream/timeline ordering desync and init lifecycle race (#73)

* fix(app): enforce canonical stream sequencing and init resolution

* refactor: extract timeline and stream reducers to pure functions
This commit is contained in:
Mohamed Boudra
2026-02-23 19:30:48 +07:00
committed by GitHub
parent 9b6f5e028c
commit a134132418
12 changed files with 1732 additions and 109 deletions
@@ -27,7 +27,7 @@ function buildInitialTimelineRequest(
return {
direction: "tail",
limit: DEFAULT_INITIAL_TIMELINE_LIMIT,
projection: "projected",
projection: "canonical",
};
}
@@ -36,10 +36,14 @@ function buildInitialTimelineRequest(
cursor: { epoch: cursor.epoch, seq: cursor.endSeq },
// Catch up all missing canonical rows by default.
limit: 0,
projection: "projected",
projection: "canonical",
};
}
export const __private__ = {
buildInitialTimelineRequest,
};
export function useAgentInitialization({
serverId,
client,
@@ -70,7 +74,13 @@ export function useAgentInitialization({
return existing.promise;
}
const deferred = createInitDeferred(key);
const session = useSessionStore.getState().sessions[serverId];
const cursor = session?.agentTimelineCursor.get(agentId);
const timelineRequest = buildInitialTimelineRequest(cursor);
const initRequestDirection =
timelineRequest.direction === "after" ? "after" : "tail";
const deferred = createInitDeferred(key, initRequestDirection);
const timeoutId = setTimeout(() => {
setAgentInitializing(agentId, false);
rejectInitDeferred(
@@ -90,10 +100,6 @@ export function useAgentInitialization({
return deferred.promise;
}
const session = useSessionStore.getState().sessions[serverId];
const cursor = session?.agentTimelineCursor.get(agentId);
const timelineRequest = buildInitialTimelineRequest(cursor);
client
.fetchAgentTimeline(agentId, timelineRequest)
.then(() => {
@@ -125,7 +131,7 @@ export function useAgentInitialization({
await client.fetchAgentTimeline(agentId, {
direction: "tail",
limit: DEFAULT_INITIAL_TIMELINE_LIMIT,
projection: "projected",
projection: "canonical",
});
} catch (error) {
setAgentInitializing(agentId, false);