2026-02-08 16:22:01 +09:00
|
|
|
import type { AutoCompactState } from "./types";
|
2026-02-22 17:19:43 +09:00
|
|
|
import type { OhMyOpenCodeConfig } from "../../config";
|
2025-12-25 19:36:22 +09:00
|
|
|
import type { ExperimentalConfig } from "../../config";
|
2026-02-08 16:22:01 +09:00
|
|
|
import { TRUNCATE_CONFIG } from "./types";
|
2026-01-16 10:51:59 +09:00
|
|
|
|
2026-02-08 16:22:01 +09:00
|
|
|
import type { Client } from "./client";
|
|
|
|
|
import { getOrCreateTruncateState } from "./state";
|
2025-12-25 19:36:22 +09:00
|
|
|
import {
|
2026-02-08 16:22:01 +09:00
|
|
|
runAggressiveTruncationStrategy,
|
|
|
|
|
runSummarizeRetryStrategy,
|
|
|
|
|
} from "./recovery-strategy";
|
2025-12-19 02:45:59 +09:00
|
|
|
|
2026-02-08 16:22:01 +09:00
|
|
|
export { getLastAssistant } from "./message-builder";
|
2025-12-19 02:45:59 +09:00
|
|
|
|
2025-12-09 11:48:53 +09:00
|
|
|
export async function executeCompact(
|
|
|
|
|
sessionID: string,
|
|
|
|
|
msg: Record<string, unknown>,
|
|
|
|
|
autoCompactState: AutoCompactState,
|
2026-02-23 02:42:24 +09:00
|
|
|
client: Client,
|
2025-12-19 02:45:59 +09:00
|
|
|
directory: string,
|
2026-02-23 02:42:24 +09:00
|
|
|
pluginConfig: OhMyOpenCodeConfig,
|
|
|
|
|
_experimental?: ExperimentalConfig
|
2025-12-09 11:48:53 +09:00
|
|
|
): Promise<void> {
|
2026-02-23 02:42:24 +09:00
|
|
|
void _experimental
|
2026-02-08 16:22:01 +09:00
|
|
|
|
2025-12-16 21:02:38 +09:00
|
|
|
if (autoCompactState.compactionInProgress.has(sessionID)) {
|
2026-02-23 02:42:24 +09:00
|
|
|
await client.tui
|
2025-12-25 19:36:22 +09:00
|
|
|
.showToast({
|
|
|
|
|
body: {
|
|
|
|
|
title: "Compact In Progress",
|
|
|
|
|
message:
|
|
|
|
|
"Recovery already running. Please wait or start new session if stuck.",
|
|
|
|
|
variant: "warning",
|
|
|
|
|
duration: 5000,
|
|
|
|
|
},
|
|
|
|
|
})
|
|
|
|
|
.catch(() => {});
|
|
|
|
|
return;
|
2025-12-16 21:02:38 +09:00
|
|
|
}
|
2025-12-25 19:36:22 +09:00
|
|
|
autoCompactState.compactionInProgress.add(sessionID);
|
2025-12-19 02:45:59 +09:00
|
|
|
|
2025-12-25 19:36:22 +09:00
|
|
|
try {
|
|
|
|
|
const errorData = autoCompactState.errorDataBySession.get(sessionID);
|
|
|
|
|
const truncateState = getOrCreateTruncateState(autoCompactState, sessionID);
|
|
|
|
|
|
2026-01-01 16:18:52 +09:00
|
|
|
const isOverLimit =
|
2025-12-28 14:13:50 +09:00
|
|
|
errorData?.currentTokens &&
|
|
|
|
|
errorData?.maxTokens &&
|
2026-01-01 16:18:52 +09:00
|
|
|
errorData.currentTokens > errorData.maxTokens;
|
|
|
|
|
|
2026-01-16 10:51:59 +09:00
|
|
|
// Aggressive Truncation - always try when over limit
|
2025-12-25 19:36:22 +09:00
|
|
|
if (
|
2026-01-01 16:18:52 +09:00
|
|
|
isOverLimit &&
|
2025-12-25 19:36:22 +09:00
|
|
|
truncateState.truncateAttempt < TRUNCATE_CONFIG.maxTruncateAttempts
|
|
|
|
|
) {
|
2026-02-08 16:22:01 +09:00
|
|
|
const result = await runAggressiveTruncationStrategy({
|
|
|
|
|
sessionID,
|
|
|
|
|
autoCompactState,
|
2026-02-23 02:42:24 +09:00
|
|
|
client: client,
|
2026-02-08 16:22:01 +09:00
|
|
|
directory,
|
|
|
|
|
truncateAttempt: truncateState.truncateAttempt,
|
2025-12-25 19:36:22 +09:00
|
|
|
currentTokens: errorData.currentTokens,
|
|
|
|
|
maxTokens: errorData.maxTokens,
|
|
|
|
|
});
|
|
|
|
|
|
2026-02-08 16:22:01 +09:00
|
|
|
truncateState.truncateAttempt = result.nextTruncateAttempt;
|
|
|
|
|
if (result.handled) return;
|
2025-12-19 02:45:59 +09:00
|
|
|
}
|
|
|
|
|
|
2026-02-08 16:22:01 +09:00
|
|
|
await runSummarizeRetryStrategy({
|
|
|
|
|
sessionID,
|
|
|
|
|
msg,
|
|
|
|
|
autoCompactState,
|
2026-02-23 02:42:24 +09:00
|
|
|
client: client,
|
2026-02-08 16:22:01 +09:00
|
|
|
directory,
|
2026-02-22 17:19:43 +09:00
|
|
|
pluginConfig,
|
2026-02-08 16:22:01 +09:00
|
|
|
errorType: errorData?.errorType,
|
|
|
|
|
messageIndex: errorData?.messageIndex,
|
|
|
|
|
})
|
2025-12-25 19:36:22 +09:00
|
|
|
} finally {
|
|
|
|
|
autoCompactState.compactionInProgress.delete(sessionID);
|
|
|
|
|
}
|
2025-12-09 11:48:53 +09:00
|
|
|
}
|