Add runtime guidance input queue

This commit is contained in:
wuyang6
2026-06-12 18:15:52 +08:00
parent 00a83ba4c3
commit 4ba8761db2
14 changed files with 1580 additions and 69 deletions
+52 -5
View File
@@ -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("|");
}