fix(ralph-loop): persist session message count at loop start

This commit is contained in:
YeonGyu-Kim
2026-02-27 03:08:30 +09:00
parent e17a00a906
commit 190c6991ac
2 changed files with 35 additions and 4 deletions

View File

@@ -603,7 +603,7 @@ describe("ralph-loop", () => {
expect(hook.getState()).toBeNull()
// then - messages API was called with correct session ID
expect(messagesCalls.length).toBe(1)
expect(messagesCalls.length).toBe(2)
expect(messagesCalls[0].sessionID).toBe("session-123")
})
@@ -633,7 +633,7 @@ describe("ralph-loop", () => {
expect(hook.getState()).toBeNull()
// then - messages API was called with correct session ID
expect(messagesCalls.length).toBe(1)
expect(messagesCalls.length).toBe(2)
expect(messagesCalls[0].sessionID).toBe("session-123")
})
@@ -1075,7 +1075,7 @@ Original task: Build something`
expect(promptCalls.length).toBe(0)
expect(hook.getState()).toBeNull()
// API should NOT be called since transcript found completion
expect(messagesCalls.length).toBe(0)
expect(messagesCalls.length).toBe(1)
})
test("should show ultrawork completion toast", async () => {

View File

@@ -24,6 +24,19 @@ export interface RalphLoopHook {
const DEFAULT_API_TIMEOUT = 5000 as const
function getMessageCountFromResponse(messagesResponse: unknown): number {
if (Array.isArray(messagesResponse)) {
return messagesResponse.length
}
if (typeof messagesResponse === "object" && messagesResponse !== null && "data" in messagesResponse) {
const data = (messagesResponse as { data?: unknown }).data
return Array.isArray(data) ? data.length : 0
}
return 0
}
export function createRalphLoopHook(
ctx: PluginInput,
options?: RalphLoopOptions
@@ -52,7 +65,25 @@ export function createRalphLoopHook(
return {
event,
startLoop: loopState.startLoop,
startLoop: (sessionID, prompt, loopOptions): boolean => {
const startSuccess = loopState.startLoop(sessionID, prompt, loopOptions)
if (!startSuccess || typeof loopOptions?.messageCountAtStart === "number") {
return startSuccess
}
ctx.client.session
.messages({
path: { id: sessionID },
query: { directory: ctx.directory },
})
.then((messagesResponse: unknown) => {
const messageCountAtStart = getMessageCountFromResponse(messagesResponse)
loopState.setMessageCountAtStart(sessionID, messageCountAtStart)
})
.catch(() => {})
return startSuccess
},
cancelLoop: loopState.cancelLoop,
getState: loopState.getState as () => RalphLoopState | null,
}