mirror of
https://github.com/getcompanion-ai/co-mono.git
synced 2026-04-21 11:04:35 +00:00
fix(coding-agent): handle auto-compaction failures gracefully
When auto-compaction fails (e.g., quota exceeded), emit the error via the auto_compaction_end event instead of throwing. The UI now displays the error message, allowing users to take action (switch models, wait for quota reset, etc.) instead of crashing. fixes #792
This commit is contained in:
parent
5c59caee4e
commit
20f5fcc79d
4 changed files with 25 additions and 8 deletions
|
|
@ -14,6 +14,7 @@
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|
||||||
|
- Fixed crash during auto-compaction when summarization fails (e.g., quota exceeded). Now displays error message instead of crashing ([#792](https://github.com/badlogic/pi-mono/issues/792))
|
||||||
- Fixed `--no-extensions` flag not preventing extension discovery ([#776](https://github.com/badlogic/pi-mono/issues/776))
|
- Fixed `--no-extensions` flag not preventing extension discovery ([#776](https://github.com/badlogic/pi-mono/issues/776))
|
||||||
- Fixed extension messages rendering twice on startup when `pi.sendMessage({ display: true })` is called during `session_start` ([#765](https://github.com/badlogic/pi-mono/pull/765) by [@dannote](https://github.com/dannote))
|
- Fixed extension messages rendering twice on startup when `pi.sendMessage({ display: true })` is called during `session_start` ([#765](https://github.com/badlogic/pi-mono/pull/765) by [@dannote](https://github.com/dannote))
|
||||||
- Fixed `PI_CODING_AGENT_DIR` env var not expanding tilde (`~`) to home directory ([#778](https://github.com/badlogic/pi-mono/pull/778) by [@aliou](https://github.com/aliou))
|
- Fixed `PI_CODING_AGENT_DIR` env var not expanding tilde (`~`) to home directory ([#778](https://github.com/badlogic/pi-mono/pull/778) by [@aliou](https://github.com/aliou))
|
||||||
|
|
|
||||||
|
|
@ -795,6 +795,8 @@ If `reason` was `"overflow"` and compaction succeeds, `willRetry` is `true` and
|
||||||
|
|
||||||
If compaction was aborted, `result` is `null` and `aborted` is `true`.
|
If compaction was aborted, `result` is `null` and `aborted` is `true`.
|
||||||
|
|
||||||
|
If compaction failed (e.g., API quota exceeded), `result` is `null`, `aborted` is `false`, and `errorMessage` contains the error description.
|
||||||
|
|
||||||
### auto_retry_start / auto_retry_end
|
### auto_retry_start / auto_retry_end
|
||||||
|
|
||||||
Emitted when automatic retry is triggered after a transient error (overloaded, rate limit, 5xx).
|
Emitted when automatic retry is triggered after a transient error (overloaded, rate limit, 5xx).
|
||||||
|
|
|
||||||
|
|
@ -62,7 +62,13 @@ import type { BashOperations } from "./tools/bash.js";
|
||||||
export type AgentSessionEvent =
|
export type AgentSessionEvent =
|
||||||
| AgentEvent
|
| AgentEvent
|
||||||
| { type: "auto_compaction_start"; reason: "threshold" | "overflow" }
|
| { type: "auto_compaction_start"; reason: "threshold" | "overflow" }
|
||||||
| { type: "auto_compaction_end"; result: CompactionResult | undefined; aborted: boolean; willRetry: boolean }
|
| {
|
||||||
|
type: "auto_compaction_end";
|
||||||
|
result: CompactionResult | undefined;
|
||||||
|
aborted: boolean;
|
||||||
|
willRetry: boolean;
|
||||||
|
errorMessage?: string;
|
||||||
|
}
|
||||||
| { type: "auto_retry_start"; attempt: number; maxAttempts: number; delayMs: number; errorMessage: string }
|
| { type: "auto_retry_start"; attempt: number; maxAttempts: number; delayMs: number; errorMessage: string }
|
||||||
| { type: "auto_retry_end"; success: boolean; attempt: number; finalError?: string };
|
| { type: "auto_retry_end"; success: boolean; attempt: number; finalError?: string };
|
||||||
|
|
||||||
|
|
@ -1544,13 +1550,17 @@ export class AgentSession {
|
||||||
}, 100);
|
}, 100);
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
this._emit({ type: "auto_compaction_end", result: undefined, aborted: false, willRetry: false });
|
const errorMessage = error instanceof Error ? error.message : "compaction failed";
|
||||||
|
this._emit({
|
||||||
if (reason === "overflow") {
|
type: "auto_compaction_end",
|
||||||
throw new Error(
|
result: undefined,
|
||||||
`Context overflow: ${error instanceof Error ? error.message : "compaction failed"}. Your input may be too large for the context window.`,
|
aborted: false,
|
||||||
);
|
willRetry: false,
|
||||||
}
|
errorMessage:
|
||||||
|
reason === "overflow"
|
||||||
|
? `Context overflow recovery failed: ${errorMessage}`
|
||||||
|
: `Auto-compaction failed: ${errorMessage}`,
|
||||||
|
});
|
||||||
} finally {
|
} finally {
|
||||||
this._autoCompactionAbortController = undefined;
|
this._autoCompactionAbortController = undefined;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1820,6 +1820,10 @@ export class InteractiveMode {
|
||||||
timestamp: Date.now(),
|
timestamp: Date.now(),
|
||||||
});
|
});
|
||||||
this.footer.invalidate();
|
this.footer.invalidate();
|
||||||
|
} else if (event.errorMessage) {
|
||||||
|
// Compaction failed (e.g., quota exceeded, API error)
|
||||||
|
this.chatContainer.addChild(new Spacer(1));
|
||||||
|
this.chatContainer.addChild(new Text(theme.fg("error", event.errorMessage), 1, 0));
|
||||||
}
|
}
|
||||||
void this.flushCompactionQueue({ willRetry: event.willRetry });
|
void this.flushCompactionQueue({ willRetry: event.willRetry });
|
||||||
this.ui.requestRender();
|
this.ui.requestRender();
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue