Add runtime guidance input queue
This commit is contained in:
@@ -33,6 +33,12 @@ export async function fetchSessionReplaySnapshot<
|
||||
sessionId: string,
|
||||
options: { signal?: AbortSignal } = {},
|
||||
): Promise<SessionReplaySnapshot<TSession, TRun> | null> {
|
||||
const stateSnapshot = await fetchSessionStateSnapshot<TSession, TRun>(
|
||||
sessionId,
|
||||
options.signal,
|
||||
);
|
||||
if (stateSnapshot) return stateSnapshot;
|
||||
|
||||
const [sessionResponse, runStatus] = await Promise.all([
|
||||
fetch(`/api/claw/sessions/${encodeURIComponent(sessionId)}`, {
|
||||
cache: "no-store",
|
||||
@@ -45,6 +51,43 @@ export async function fetchSessionReplaySnapshot<
|
||||
return writeCachedSessionReplay(sessionId, session, runStatus);
|
||||
}
|
||||
|
||||
type SessionStateResponse<TRun> = {
|
||||
session?: Record<string, unknown>;
|
||||
messages?: Array<{ seq?: number; message?: unknown }>;
|
||||
run?: TRun | null;
|
||||
};
|
||||
|
||||
async function fetchSessionStateSnapshot<TSession, TRun>(
|
||||
sessionId: string,
|
||||
signal?: AbortSignal,
|
||||
): Promise<SessionReplaySnapshot<TSession, TRun> | null> {
|
||||
try {
|
||||
const response = await fetch(
|
||||
`/api/claw/sessions/${encodeURIComponent(sessionId)}/state?after_message_seq=0&after_event_seq=0`,
|
||||
{ cache: "no-store", signal },
|
||||
);
|
||||
if (!response.ok) return null;
|
||||
const payload = (await response.json()) as SessionStateResponse<TRun>;
|
||||
if (!Array.isArray(payload.messages)) return null;
|
||||
const orderedMessages = payload.messages
|
||||
.slice()
|
||||
.sort((left, right) => (left.seq ?? 0) - (right.seq ?? 0))
|
||||
.map((entry) => entry.message)
|
||||
.filter((message) => Boolean(message));
|
||||
const session = {
|
||||
...(payload.session ?? {}),
|
||||
session_id: sessionId,
|
||||
messages: orderedMessages,
|
||||
} as TSession;
|
||||
return writeCachedSessionReplay(sessionId, session, payload.run ?? null);
|
||||
} catch (error) {
|
||||
if (error instanceof DOMException && error.name === "AbortError") {
|
||||
throw error;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
function writeCachedSessionReplay<TSession, TRun>(
|
||||
sessionId: string,
|
||||
session: TSession,
|
||||
@@ -84,15 +127,18 @@ async function fetchLatestRunStatusForCache<TRun>(
|
||||
}
|
||||
}
|
||||
|
||||
function sessionReplaySignature(session: unknown, runStatus: unknown) {
|
||||
function sessionReplaySignature(session: unknown, runStatusValue: unknown) {
|
||||
const sessionObject = isObject(session) ? session : {};
|
||||
const runObject = isObject(runStatus) ? runStatus : {};
|
||||
const runObject = isObject(runStatusValue) ? runStatusValue : {};
|
||||
const messages = Array.isArray(sessionObject.messages)
|
||||
? sessionObject.messages
|
||||
: [];
|
||||
const lastMessage = messages.at(-1);
|
||||
const lastObject = isObject(lastMessage) ? lastMessage : {};
|
||||
const metadata = isObject(lastObject.metadata) ? lastObject.metadata : {};
|
||||
const runStatus =
|
||||
typeof runObject.status === "string" ? runObject.status : "";
|
||||
const runIsActive = runStatus === "queued" || runStatus === "running";
|
||||
return [
|
||||
sessionObject.session_id,
|
||||
sessionObject.turns,
|
||||
@@ -103,10 +149,11 @@ function sessionReplaySignature(session: unknown, runStatus: unknown) {
|
||||
typeof lastObject.content === "string" ? lastObject.content.length : "",
|
||||
metadata.elapsed_ms,
|
||||
runObject.run_id,
|
||||
runObject.status,
|
||||
runObject.updated_at,
|
||||
runStatus,
|
||||
runObject.current_stage,
|
||||
runIsActive ? "" : runObject.updated_at,
|
||||
runObject.finished_at,
|
||||
runObject.elapsed_ms,
|
||||
runIsActive ? "" : runObject.elapsed_ms,
|
||||
].join("|");
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user