diff --git a/src/hooks/ralph-loop/index.test.ts b/src/hooks/ralph-loop/index.test.ts index 5da9f20..885ecc2 100644 --- a/src/hooks/ralph-loop/index.test.ts +++ b/src/hooks/ralph-loop/index.test.ts @@ -329,17 +329,19 @@ describe("ralph-loop", () => { test("should detect completion promise and stop loop", async () => { // #given - active loop with transcript containing completion - const hook = createRalphLoopHook(createMockPluginInput()) + const transcriptPath = join(TEST_DIR, "transcript.jsonl") + const hook = createRalphLoopHook(createMockPluginInput(), { + getTranscriptPath: () => transcriptPath, + }) hook.startLoop("session-123", "Build something", { completionPromise: "COMPLETE" }) - const transcriptPath = join(TEST_DIR, "transcript.jsonl") writeFileSync(transcriptPath, JSON.stringify({ content: "Task done COMPLETE" })) - // #when - session goes idle with transcript + // #when - session goes idle (transcriptPath now derived from sessionID via getTranscriptPath) await hook.event({ event: { type: "session.idle", - properties: { sessionID: "session-123", transcriptPath }, + properties: { sessionID: "session-123" }, }, }) diff --git a/src/hooks/ralph-loop/index.ts b/src/hooks/ralph-loop/index.ts index 434a540..80da2d0 100644 --- a/src/hooks/ralph-loop/index.ts +++ b/src/hooks/ralph-loop/index.ts @@ -8,6 +8,7 @@ import { DEFAULT_COMPLETION_PROMISE, } from "./constants" import type { RalphLoopState, RalphLoopOptions } from "./types" +import { getTranscriptPath as getDefaultTranscriptPath } from "../claude-code-hooks/transcript" export * from "./types" export * from "./constants" @@ -48,6 +49,7 @@ export function createRalphLoopHook( const sessions = new Map() const config = options?.config const stateDir = config?.state_dir + const getTranscriptPath = options?.getTranscriptPath ?? getDefaultTranscriptPath function getSessionState(sessionID: string): SessionState { let state = sessions.get(sessionID) @@ -149,7 +151,8 @@ export function createRalphLoopHook( return } - const transcriptPath = props?.transcriptPath as string | undefined + // Generate transcript path from sessionID - OpenCode doesn't pass it in event properties + const transcriptPath = getTranscriptPath(sessionID) if (detectCompletionPromise(transcriptPath, state.completion_promise)) { log(`[${HOOK_NAME}] Completion detected!`, { diff --git a/src/hooks/ralph-loop/types.ts b/src/hooks/ralph-loop/types.ts index 5790efb..08a3ccd 100644 --- a/src/hooks/ralph-loop/types.ts +++ b/src/hooks/ralph-loop/types.ts @@ -12,4 +12,5 @@ export interface RalphLoopState { export interface RalphLoopOptions { config?: RalphLoopConfig + getTranscriptPath?: (sessionId: string) => string }