Merge branch 'main' of github.com:getpaseo/paseo

# Conflicts:
#	packages/app/src/contexts/session-context.tsx
This commit is contained in:
Mohamed Boudra
2026-02-23 19:33:15 +07:00
12 changed files with 1744 additions and 116 deletions
@@ -0,0 +1,26 @@
import { describe, expect, it } from "vitest";
import { __private__ } from "./use-agent-initialization";
describe("useAgentInitialization timeline request policy", () => {
it("uses canonical tail bootstrap when cursor is missing", () => {
expect(__private__.buildInitialTimelineRequest(undefined)).toEqual({
direction: "tail",
limit: 200,
projection: "canonical",
});
});
it("uses canonical catch-up after the current cursor when present", () => {
expect(
__private__.buildInitialTimelineRequest({
epoch: "epoch-1",
endSeq: 42,
})
).toEqual({
direction: "after",
cursor: { epoch: "epoch-1", seq: 42 },
limit: 0,
projection: "canonical",
});
});
});
@@ -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);