fix: address 5 SDK compatibility issues from Cubic round 8
- P1: Use compacted timestamp check instead of nonexistent truncated field in target-token-truncation.ts - P1: Use defensive (response.data ?? response) pattern in hook-message-injector/injector.ts to match codebase convention - P2: Filter by tool type in countTruncatedResultsFromSDK to avoid counting non-tool compacted parts - P2: Treat thinking/meta-only messages as empty in both empty-content-recovery-sdk.ts and message-builder.ts to align SDK path with file-based logic
This commit is contained in:
@@ -64,7 +64,7 @@ export async function findNearestMessageWithFieldsFromSDK(
|
||||
): Promise<StoredMessage | null> {
|
||||
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<string | null> {
|
||||
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)
|
||||
|
||||
@@ -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[] {
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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++
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user