diff --git a/src/hooks/anthropic-context-window-limit-recovery/executor.ts b/src/hooks/anthropic-context-window-limit-recovery/executor.ts index b963aec..09608f4 100644 --- a/src/hooks/anthropic-context-window-limit-recovery/executor.ts +++ b/src/hooks/anthropic-context-window-limit-recovery/executor.ts @@ -158,27 +158,7 @@ export async function getLastAssistant( } } -async function getLastMessageId( - sessionID: string, - client: Client, - directory: string, -): Promise { - try { - const resp = await client.session.messages({ - path: { id: sessionID }, - query: { directory }, - }); - const data = (resp as { data?: unknown[] }).data; - if (!Array.isArray(data) || data.length === 0) return null; - - const lastMsg = data[data.length - 1] as Record; - const info = lastMsg.info as Record | undefined; - return (info?.id as string) ?? null; - } catch { - return null; - } -} function clearSessionState( autoCompactState: AutoCompactState, @@ -421,95 +401,21 @@ export async function executeCompact( log("[auto-compact] aggressive truncation completed", aggressiveResult); - if (aggressiveResult.sufficient) { - clearSessionState(autoCompactState, sessionID); - setTimeout(async () => { - try { - await (client as Client).session.prompt_async({ - path: { sessionID }, - body: { parts: [{ type: "text", text: "Continue" }] }, - query: { directory }, - }); - } catch {} - }, 500); - return; - } - } else { - log("[auto-compact] no tool outputs found to truncate", { sessionID }); - } - - // PHASE 2.5: Revert fallback - if still over limit, remove last message - log("[auto-compact] PHASE 2.5: revert fallback - still over limit after truncation", { - sessionID, - currentTokens: errorData.currentTokens, - maxTokens: errorData.maxTokens, - }); - - const lastMessageId = await getLastMessageId( - sessionID, - client as Client, - directory, - ); - - if (lastMessageId) { - try { - await (client as Client).session.revert({ - path: { id: sessionID }, - body: { messageID: lastMessageId }, - query: { directory }, - }); - - await (client as Client).tui - .showToast({ - body: { - title: "Message Reverted", - message: "Removed last message to reduce context. Retrying...", - variant: "warning", - duration: 3000, - }, - }) - .catch(() => {}); - - clearSessionState(autoCompactState, sessionID); - setTimeout(async () => { - try { - await (client as Client).session.prompt_async({ - path: { sessionID }, - body: { parts: [{ type: "text", text: "Continue" }] }, - query: { directory }, - }); - } catch {} - }, 500); - return; - } catch (revertError) { - log("[auto-compact] revert failed", { error: String(revertError) }); - } + clearSessionState(autoCompactState, sessionID); + setTimeout(async () => { + try { + await (client as Client).session.prompt_async({ + path: { sessionID }, + body: { parts: [{ type: "text", text: "Continue" }] }, + query: { directory }, + }); + } catch {} + }, 500); + return; } } - // PHASE 3: Summarize - only when under limit (otherwise it will also fail) - if (isOverLimit) { - log("[auto-compact] skipping summarize - still over token limit", { - sessionID, - currentTokens: errorData?.currentTokens, - maxTokens: errorData?.maxTokens, - }); - - clearSessionState(autoCompactState, sessionID); - - await (client as Client).tui - .showToast({ - body: { - title: "Recovery Failed", - message: `Still over token limit (${errorData?.currentTokens}/${errorData?.maxTokens}). Please start a new session or manually compact.`, - variant: "error", - duration: 10000, - }, - }) - .catch(() => {}); - return; - } - + // PHASE 3: Summarize - fallback when no tool outputs to truncate const retryState = getOrCreateRetryState(autoCompactState, sessionID); if (errorData?.errorType?.includes("non-empty content")) { diff --git a/src/hooks/anthropic-context-window-limit-recovery/types.ts b/src/hooks/anthropic-context-window-limit-recovery/types.ts index 024fd54..5a3ec73 100644 --- a/src/hooks/anthropic-context-window-limit-recovery/types.ts +++ b/src/hooks/anthropic-context-window-limit-recovery/types.ts @@ -44,5 +44,5 @@ export const TRUNCATE_CONFIG = { maxTruncateAttempts: 20, minOutputSizeToTruncate: 500, targetTokenRatio: 0.5, - charsPerToken: 4, + charsPerToken: 2, } as const