diff --git a/src/features/hook-message-injector/injector.ts b/src/features/hook-message-injector/injector.ts index afc91a61c..1b77997d9 100644 --- a/src/features/hook-message-injector/injector.ts +++ b/src/features/hook-message-injector/injector.ts @@ -64,7 +64,7 @@ export async function findNearestMessageWithFieldsFromSDK( ): Promise { try { const response = await client.session.messages({ path: { id: sessionID } }) - const messages = (response.data ?? []) as SDKMessage[] + const messages = ((response.data ?? response) as unknown as SDKMessage[]) ?? [] for (let i = messages.length - 1; i >= 0; i--) { const stored = convertSDKMessageToStoredMessage(messages[i]) @@ -97,7 +97,7 @@ export async function findFirstMessageWithAgentFromSDK( ): Promise { try { const response = await client.session.messages({ path: { id: sessionID } }) - const messages = (response.data ?? []) as SDKMessage[] + const messages = ((response.data ?? response) as unknown as SDKMessage[]) ?? [] for (const msg of messages) { const stored = convertSDKMessageToStoredMessage(msg) diff --git a/src/hooks/anthropic-context-window-limit-recovery/empty-content-recovery-sdk.ts b/src/hooks/anthropic-context-window-limit-recovery/empty-content-recovery-sdk.ts index 05cf5b44c..4d2b21af1 100644 --- a/src/hooks/anthropic-context-window-limit-recovery/empty-content-recovery-sdk.ts +++ b/src/hooks/anthropic-context-window-limit-recovery/empty-content-recovery-sdk.ts @@ -40,8 +40,9 @@ function messageHasContentFromSDK(message: SDKMessage): boolean { return true } - // Messages with only thinking/meta parts are NOT empty — they have content - return hasIgnoredParts + // Messages with only thinking/meta parts are treated as empty + // to align with file-based logic (messageHasContent) + return false } function getSdkMessages(response: unknown): SDKMessage[] { diff --git a/src/hooks/anthropic-context-window-limit-recovery/message-builder.ts b/src/hooks/anthropic-context-window-limit-recovery/message-builder.ts index aedfbf5c2..a62d655bd 100644 --- a/src/hooks/anthropic-context-window-limit-recovery/message-builder.ts +++ b/src/hooks/anthropic-context-window-limit-recovery/message-builder.ts @@ -51,8 +51,9 @@ function messageHasContentFromSDK(message: SDKMessage): boolean { return true } - // Messages with only thinking/meta parts are NOT empty — they have content - return hasIgnoredParts + // Messages with only thinking/meta parts are treated as empty + // to align with file-based logic (messageHasContent) + return false } async function findEmptyMessageIdsFromSDK( diff --git a/src/hooks/anthropic-context-window-limit-recovery/target-token-truncation.ts b/src/hooks/anthropic-context-window-limit-recovery/target-token-truncation.ts index 2907fa26a..df60d35e8 100644 --- a/src/hooks/anthropic-context-window-limit-recovery/target-token-truncation.ts +++ b/src/hooks/anthropic-context-window-limit-recovery/target-token-truncation.ts @@ -10,8 +10,10 @@ interface SDKToolPart { id: string type: string tool?: string - state?: { output?: string } - truncated?: boolean + state?: { + output?: string + time?: { start?: number; end?: number; compacted?: number } + } originalSize?: number } @@ -81,7 +83,7 @@ export async function truncateUntilTargetTokens( const results: import("./tool-part-types").ToolResultInfo[] = [] for (const [key, part] of toolPartsByKey) { - if (part.type === "tool" && part.state?.output && !part.truncated && part.tool) { + if (part.type === "tool" && part.state?.output && !part.state?.time?.compacted && part.tool) { results.push({ partPath: "", partId: part.id, diff --git a/src/hooks/anthropic-context-window-limit-recovery/tool-result-storage-sdk.ts b/src/hooks/anthropic-context-window-limit-recovery/tool-result-storage-sdk.ts index c0b710752..31c721da2 100644 --- a/src/hooks/anthropic-context-window-limit-recovery/tool-result-storage-sdk.ts +++ b/src/hooks/anthropic-context-window-limit-recovery/tool-result-storage-sdk.ts @@ -104,7 +104,7 @@ export async function countTruncatedResultsFromSDK( for (const msg of messages) { if (!msg.parts) continue for (const part of msg.parts) { - if (part.state?.time?.compacted) count++ + if (part.type === "tool" && part.state?.time?.compacted) count++ } }