fix: address Cubic round-2 P2 issues
- target-token-truncation: eliminate redundant SDK messages fetch by extracting tool results from already-fetched toolPartsByKey map - recover-thinking-block-order: wrap SDK message fetches in try/catch so recovery continues gracefully on API errors - thinking-strip: guard against missing part.id before calling deletePart to prevent invalid HTTP requests
This commit is contained in:
parent
1a744424ab
commit
880b53c511
@ -1,7 +1,7 @@
|
|||||||
import type { PluginInput } from "@opencode-ai/plugin"
|
import type { PluginInput } from "@opencode-ai/plugin"
|
||||||
import type { AggressiveTruncateResult } from "./tool-part-types"
|
import type { AggressiveTruncateResult } from "./tool-part-types"
|
||||||
import { findToolResultsBySize, truncateToolResult } from "./tool-result-storage"
|
import { findToolResultsBySize, truncateToolResult } from "./tool-result-storage"
|
||||||
import { findToolResultsBySizeFromSDK, truncateToolResultAsync } from "./tool-result-storage-sdk"
|
import { truncateToolResultAsync } from "./tool-result-storage-sdk"
|
||||||
import { isSqliteBackend } from "../../shared/opencode-storage-detection"
|
import { isSqliteBackend } from "../../shared/opencode-storage-detection"
|
||||||
|
|
||||||
type OpencodeClient = PluginInput["client"]
|
type OpencodeClient = PluginInput["client"]
|
||||||
@ -79,7 +79,19 @@ export async function truncateUntilTargetTokens(
|
|||||||
toolPartsByKey = new Map<string, SDKToolPart>()
|
toolPartsByKey = new Map<string, SDKToolPart>()
|
||||||
}
|
}
|
||||||
|
|
||||||
const results = await findToolResultsBySizeFromSDK(client, sessionID)
|
const results: import("./tool-part-types").ToolResultInfo[] = []
|
||||||
|
for (const [key, part] of toolPartsByKey) {
|
||||||
|
if (part.type === "tool" && part.state?.output && !part.truncated && part.tool) {
|
||||||
|
results.push({
|
||||||
|
partPath: "",
|
||||||
|
partId: part.id,
|
||||||
|
messageID: key.split(":")[0],
|
||||||
|
toolName: part.tool,
|
||||||
|
outputSize: part.state.output.length,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
results.sort((a, b) => b.outputSize - a.outputSize)
|
||||||
|
|
||||||
if (results.length === 0) {
|
if (results.length === 0) {
|
||||||
return {
|
return {
|
||||||
|
|||||||
@ -74,8 +74,13 @@ async function findMessagesWithOrphanThinkingFromSDK(
|
|||||||
client: Client,
|
client: Client,
|
||||||
sessionID: string
|
sessionID: string
|
||||||
): Promise<string[]> {
|
): Promise<string[]> {
|
||||||
|
let messages: MessageData[]
|
||||||
|
try {
|
||||||
const response = await client.session.messages({ path: { id: sessionID } })
|
const response = await client.session.messages({ path: { id: sessionID } })
|
||||||
const messages = (response.data ?? []) as MessageData[]
|
messages = (response.data ?? []) as MessageData[]
|
||||||
|
} catch {
|
||||||
|
return []
|
||||||
|
}
|
||||||
|
|
||||||
const result: string[] = []
|
const result: string[] = []
|
||||||
for (const msg of messages) {
|
for (const msg of messages) {
|
||||||
@ -103,8 +108,13 @@ async function findMessageByIndexNeedingThinkingFromSDK(
|
|||||||
sessionID: string,
|
sessionID: string,
|
||||||
targetIndex: number
|
targetIndex: number
|
||||||
): Promise<string | null> {
|
): Promise<string | null> {
|
||||||
|
let messages: MessageData[]
|
||||||
|
try {
|
||||||
const response = await client.session.messages({ path: { id: sessionID } })
|
const response = await client.session.messages({ path: { id: sessionID } })
|
||||||
const messages = (response.data ?? []) as MessageData[]
|
messages = (response.data ?? []) as MessageData[]
|
||||||
|
} catch {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
if (targetIndex < 0 || targetIndex >= messages.length) return null
|
if (targetIndex < 0 || targetIndex >= messages.length) return null
|
||||||
|
|
||||||
|
|||||||
@ -52,7 +52,7 @@ export async function stripThinkingPartsAsync(
|
|||||||
|
|
||||||
let anyRemoved = false
|
let anyRemoved = false
|
||||||
for (const part of targetMsg.parts) {
|
for (const part of targetMsg.parts) {
|
||||||
if (THINKING_TYPES.has(part.type)) {
|
if (THINKING_TYPES.has(part.type) && part.id) {
|
||||||
const deleted = await deletePart(client, sessionID, messageID, part.id)
|
const deleted = await deletePart(client, sessionID, messageID, part.id)
|
||||||
if (deleted) anyRemoved = true
|
if (deleted) anyRemoved = true
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user