fix(todo-continuation-enforcer): track continuation stagnation state
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-opencode) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
@@ -10,9 +10,17 @@ interface TrackedSessionState {
|
||||
lastAccessedAt: number
|
||||
}
|
||||
|
||||
export interface ContinuationProgressUpdate {
|
||||
previousIncompleteCount?: number
|
||||
stagnationCount: number
|
||||
hasProgressed: boolean
|
||||
}
|
||||
|
||||
export interface SessionStateStore {
|
||||
getState: (sessionID: string) => SessionState
|
||||
getExistingState: (sessionID: string) => SessionState | undefined
|
||||
trackContinuationProgress: (sessionID: string, incompleteCount: number) => ContinuationProgressUpdate
|
||||
resetContinuationProgress: (sessionID: string) => void
|
||||
cancelCountdown: (sessionID: string) => void
|
||||
cleanup: (sessionID: string) => void
|
||||
cancelAllCountdowns: () => void
|
||||
@@ -46,6 +54,7 @@ export function createSessionStateStore(): SessionStateStore {
|
||||
}
|
||||
|
||||
const state: SessionState = {
|
||||
stagnationCount: 0,
|
||||
consecutiveFailures: 0,
|
||||
}
|
||||
sessions.set(sessionID, { state, lastAccessedAt: Date.now() })
|
||||
@@ -61,6 +70,57 @@ export function createSessionStateStore(): SessionStateStore {
|
||||
return undefined
|
||||
}
|
||||
|
||||
function trackContinuationProgress(
|
||||
sessionID: string,
|
||||
incompleteCount: number
|
||||
): ContinuationProgressUpdate {
|
||||
const state = getState(sessionID)
|
||||
const previousIncompleteCount = state.lastIncompleteCount
|
||||
|
||||
state.lastIncompleteCount = incompleteCount
|
||||
|
||||
if (previousIncompleteCount === undefined) {
|
||||
state.stagnationCount = 0
|
||||
return {
|
||||
previousIncompleteCount,
|
||||
stagnationCount: state.stagnationCount,
|
||||
hasProgressed: false,
|
||||
}
|
||||
}
|
||||
|
||||
if (incompleteCount < previousIncompleteCount) {
|
||||
state.stagnationCount = 0
|
||||
return {
|
||||
previousIncompleteCount,
|
||||
stagnationCount: state.stagnationCount,
|
||||
hasProgressed: true,
|
||||
}
|
||||
}
|
||||
|
||||
if (state.lastInjectedAt === undefined) {
|
||||
return {
|
||||
previousIncompleteCount,
|
||||
stagnationCount: state.stagnationCount,
|
||||
hasProgressed: false,
|
||||
}
|
||||
}
|
||||
|
||||
state.stagnationCount += 1
|
||||
return {
|
||||
previousIncompleteCount,
|
||||
stagnationCount: state.stagnationCount,
|
||||
hasProgressed: false,
|
||||
}
|
||||
}
|
||||
|
||||
function resetContinuationProgress(sessionID: string): void {
|
||||
const state = getExistingState(sessionID)
|
||||
if (!state) return
|
||||
|
||||
state.lastIncompleteCount = undefined
|
||||
state.stagnationCount = 0
|
||||
}
|
||||
|
||||
function cancelCountdown(sessionID: string): void {
|
||||
const tracked = sessions.get(sessionID)
|
||||
if (!tracked) return
|
||||
@@ -100,6 +160,8 @@ export function createSessionStateStore(): SessionStateStore {
|
||||
return {
|
||||
getState,
|
||||
getExistingState,
|
||||
trackContinuationProgress,
|
||||
resetContinuationProgress,
|
||||
cancelCountdown,
|
||||
cleanup,
|
||||
cancelAllCountdowns,
|
||||
|
||||
Reference in New Issue
Block a user