fix: regenerate from target turn
Agent CI/CD / docker-image (push) Successful in 49s
Agent CI/CD / deploy-fallback-log (push) Has been skipped

This commit is contained in:
2026-06-08 16:07:39 +08:00
parent 0e1ca2418f
commit f3b62ed108
3 changed files with 121 additions and 13 deletions
+46 -8
View File
@@ -33,6 +33,16 @@ type RuntimeModelOverride = {
export type PermissionReply = "once" | "always" | "reject";
type RuntimeMessage = {
info: {
id: string;
role: string;
};
};
const getRuntimeMessageRole = (message: RuntimeMessage) => message.info.role;
const getRuntimeMessageId = (message: RuntimeMessage) => message.info.id;
export class OpencodeRuntimeAdapter {
private clientPromise: Promise<OpencodeClient> | null = null;
private closeServer: (() => void) | null = null;
@@ -108,17 +118,45 @@ export class OpencodeRuntimeAdapter {
return response.data;
}
async revertLastUserMessage(sessionId: string) {
const messages = await this.messages(sessionId, 40);
const lastUserMessage = [...messages]
.reverse()
.find((message) => message.info.role === "user");
async removeMessage(sessionId: string, messageId: string) {
const client = await this.ensureClient();
const response = await client.session.deleteMessage({
sessionID: sessionId,
messageID: messageId,
});
return response.data;
}
if (!lastUserMessage) {
throw new Error("no user message found to revert");
async revertToUserMessage(sessionId: string, options: { userOrdinal: number }) {
const messages = await this.messages(sessionId, 80);
const userMessages = messages.filter(
(message) => getRuntimeMessageRole(message) === "user",
);
const targetUserMessage = userMessages[options.userOrdinal - 1];
if (!targetUserMessage) {
throw new Error("target user message not found to revert");
}
return this.revertMessage(sessionId, lastUserMessage.info.id);
const targetMessageId = getRuntimeMessageId(targetUserMessage);
const targetIndex = messages.findIndex(
(message) => getRuntimeMessageId(message) === targetMessageId,
);
const messagesToRemove = targetIndex >= 0 ? messages.slice(targetIndex) : [targetUserMessage];
await this.revertMessage(sessionId, targetMessageId);
for (const message of messagesToRemove.reverse()) {
const messageId = getRuntimeMessageId(message);
try {
await this.removeMessage(sessionId, messageId);
} catch (error) {
logger.warn(
{ err: error, sessionId, messageId },
"failed to remove reverted opencode message",
);
}
}
}
async abortSession(sessionId: string) {