2026-03-14 13:47:40 +09:00
|
|
|
import type { SessionState } from "./types"
|
|
|
|
|
import { readFinalWavePlanState } from "./final-wave-plan-state"
|
2026-03-13 12:43:33 +09:00
|
|
|
|
|
|
|
|
const APPROVE_VERDICT_PATTERN = /\bVERDICT:\s*APPROVE\b/i
|
2026-03-14 13:47:40 +09:00
|
|
|
|
|
|
|
|
function clearFinalWaveApprovalTracking(sessionState: SessionState): void {
|
|
|
|
|
sessionState.pendingFinalWaveTaskCount = undefined
|
|
|
|
|
sessionState.approvedFinalWaveTaskCount = undefined
|
|
|
|
|
}
|
2026-03-13 12:43:33 +09:00
|
|
|
|
|
|
|
|
export function shouldPauseForFinalWaveApproval(input: {
|
|
|
|
|
planPath: string
|
|
|
|
|
taskOutput: string
|
2026-03-14 13:47:40 +09:00
|
|
|
sessionState: SessionState
|
2026-03-13 12:43:33 +09:00
|
|
|
}): boolean {
|
2026-03-14 13:47:40 +09:00
|
|
|
const planState = readFinalWavePlanState(input.planPath)
|
|
|
|
|
if (!planState) {
|
2026-03-13 12:43:33 +09:00
|
|
|
return false
|
|
|
|
|
}
|
|
|
|
|
|
2026-03-14 13:47:40 +09:00
|
|
|
if (planState.pendingImplementationTaskCount > 0 || planState.pendingFinalWaveTaskCount === 0) {
|
|
|
|
|
clearFinalWaveApprovalTracking(input.sessionState)
|
2026-03-13 12:43:33 +09:00
|
|
|
return false
|
|
|
|
|
}
|
|
|
|
|
|
2026-03-14 13:47:40 +09:00
|
|
|
if (!APPROVE_VERDICT_PATTERN.test(input.taskOutput)) {
|
2026-03-13 12:43:33 +09:00
|
|
|
return false
|
|
|
|
|
}
|
2026-03-14 13:47:40 +09:00
|
|
|
|
|
|
|
|
if (planState.pendingFinalWaveTaskCount === 1) {
|
|
|
|
|
clearFinalWaveApprovalTracking(input.sessionState)
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (input.sessionState.pendingFinalWaveTaskCount !== planState.pendingFinalWaveTaskCount) {
|
|
|
|
|
input.sessionState.pendingFinalWaveTaskCount = planState.pendingFinalWaveTaskCount
|
|
|
|
|
input.sessionState.approvedFinalWaveTaskCount = 0
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
input.sessionState.approvedFinalWaveTaskCount = (input.sessionState.approvedFinalWaveTaskCount ?? 0) + 1
|
|
|
|
|
const shouldPause = input.sessionState.approvedFinalWaveTaskCount >= planState.pendingFinalWaveTaskCount
|
|
|
|
|
if (shouldPause) {
|
|
|
|
|
clearFinalWaveApprovalTracking(input.sessionState)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return shouldPause
|
2026-03-13 12:43:33 +09:00
|
|
|
}
|