Fix todo-continuation-enforcer mock isolation

- idle-event.ts: improve import patterns
- non-idle-events.ts: update for test compatibility
- resolve-message-info.ts: prevent cross-test contamination
- todo-continuation-enforcer.test.ts: narrow mock scope
- types.ts: update type definitions

🤖 GENERATED WITH ASSISTANCE OF OhMyOpenCode
This commit is contained in:
YeonGyu-Kim
2026-04-04 18:56:36 +09:00
parent 382f9b61fa
commit db7dfa1249
5 changed files with 127 additions and 15 deletions
@@ -10,7 +10,7 @@ import { isLastAssistantMessageAborted } from "./abort-detection"
import { hasUnansweredQuestion } from "./pending-question-detection"
import { shouldStopForStagnation } from "./stagnation-detection"
import { getIncompleteCount } from "./todo"
import type { MessageInfo, ResolvedMessageInfo, Todo } from "./types"
import type { MessageInfo, MessageWithInfo, ResolvedMessageInfo, Todo } from "./types"
import { resolveLatestMessageInfo } from "./resolve-message-info"
import { acknowledgeCompactionGuard, isCompactionGuardActive } from "./compaction-guard"
import type { SessionStateStore } from "./session-state"
@@ -61,17 +61,18 @@ export async function handleSessionIdle(args: {
return
}
let prefetchedMessages: MessageWithInfo[] | undefined
try {
const messagesResp = await ctx.client.session.messages({
path: { id: sessionID },
query: { directory: ctx.directory },
})
const messages = normalizeSDKResponse(messagesResp, [] as Array<{ info?: MessageInfo }>)
if (isLastAssistantMessageAborted(messages)) {
prefetchedMessages = normalizeSDKResponse(messagesResp, [] as MessageWithInfo[])
if (isLastAssistantMessageAborted(prefetchedMessages)) {
log(`[${HOOK_NAME}] Skipped: last assistant message was aborted (API fallback)`, { sessionID })
return
}
if (hasUnansweredQuestion(messages)) {
if (hasUnansweredQuestion(prefetchedMessages)) {
log(`[${HOOK_NAME}] Skipped: pending question awaiting user response`, { sessionID })
return
}
@@ -132,7 +133,7 @@ export async function handleSessionIdle(args: {
let resolvedInfo: ResolvedMessageInfo | undefined
let encounteredCompaction = false
try {
const messageInfoResult = await resolveLatestMessageInfo(ctx, sessionID)
const messageInfoResult = await resolveLatestMessageInfo(ctx, sessionID, prefetchedMessages)
resolvedInfo = messageInfoResult.resolvedInfo
encounteredCompaction = messageInfoResult.encounteredCompaction
} catch (error) {