fix(team-mode): defer live mailbox acks

This commit is contained in:
YeonGyu-Kim
2026-05-15 22:49:10 +09:00
parent ae7ff3bb7e
commit 196f6512ae
7 changed files with 301 additions and 27 deletions
@@ -1,5 +1,9 @@
import type { TeamModeConfig } from "../../config/schema/team-mode"
import { findResolvedMemberSession } from "../../features/team-mode/member-session-resolution"
import {
releaseDeliveryReservation,
reserveMessageForDelivery,
} from "../../features/team-mode/team-mailbox/reservation"
import { loadRuntimeState, transitionRuntimeState } from "../../features/team-mode/team-state-store/store"
import { resolveSessionEventID } from "../../shared/event-session-id"
import { log } from "../../shared/logger"
@@ -11,6 +15,22 @@ function getErroredSessionID(properties: unknown): string | undefined {
return resolveSessionEventID(properties)
}
async function requeuePendingLiveDeliveries(
teamRunId: string,
memberName: string,
messageIds: readonly string[],
config: TeamModeConfig,
): Promise<void> {
for (const messageId of messageIds) {
const reservation = await reserveMessageForDelivery(teamRunId, memberName, messageId, config)
if (reservation === null) {
continue
}
await releaseDeliveryReservation(reservation)
}
}
export function createTeamMemberErrorHandler(config: TeamModeConfig): HookImpl {
return async ({ event }: HookInput): Promise<void> => {
if (event.type !== "session.error") return
@@ -25,11 +45,19 @@ export function createTeamMemberErrorHandler(config: TeamModeConfig): HookImpl {
}
const runtimeState = await loadRuntimeState(runtimeMember.teamRunId, config)
const memberEntry = runtimeState.members.find((member) => member.name === runtimeMember.memberName)
const pendingInjectedMessageIds = memberEntry?.pendingInjectedMessageIds ?? []
await requeuePendingLiveDeliveries(
runtimeState.teamRunId,
runtimeMember.memberName,
pendingInjectedMessageIds,
config,
)
await transitionRuntimeState(runtimeState.teamRunId, (currentRuntimeState) => ({
...currentRuntimeState,
members: currentRuntimeState.members.map((member) => (
member.name === runtimeMember.memberName
? { ...member, status: "errored" }
? { ...member, status: "errored", pendingInjectedMessageIds: [] }
: member
)),
}), config)