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
+25 -8
View File
@@ -1,22 +1,20 @@
import { randomUUID } from "node:crypto"
import { tool, type ToolDefinition } from "@opencode-ai/plugin/tool"
import { type ToolDefinition, tool } from "@opencode-ai/plugin/tool"
import { z } from "zod"
import type { TeamModeConfig } from "../../../config/schema/team-mode"
import { promptAsyncAfterSessionIdle } from "../../../hooks/shared/prompt-async-gate"
import { log } from "../../../shared/logger"
import { applyMemberSessionRouting, buildMemberPromptBody } from "../member-session-routing"
import { lookupTeamSession } from "../team-session-registry"
import { loadRuntimeState } from "../team-state-store/store"
import { buildEnvelope } from "../team-mailbox/poll"
import {
commitDeliveryReservation,
releaseDeliveryReservation,
reserveMessageForDelivery,
} from "../team-mailbox/reservation"
import { BroadcastNotPermittedError, sendMessage } from "../team-mailbox/send"
import { promptAsyncAfterSessionIdle } from "../../../hooks/shared/prompt-async-gate"
import { lookupTeamSession } from "../team-session-registry"
import { loadRuntimeState, transitionRuntimeState } from "../team-state-store/store"
import type { Message } from "../types"
import { MessageSchema } from "../types"
@@ -135,6 +133,25 @@ async function releaseReservationSafely(
}
}
async function markLiveDeliveryPending(
teamRunId: string,
recipientName: string,
messageId: string,
config: TeamModeConfig,
): Promise<void> {
await transitionRuntimeState(teamRunId, (currentRuntimeState) => ({
...currentRuntimeState,
members: currentRuntimeState.members.map((member) => (
member.name === recipientName
? {
...member,
pendingInjectedMessageIds: Array.from(new Set([...member.pendingInjectedMessageIds, messageId])),
}
: member
)),
}), config)
}
async function deliverLive(
client: LiveDeliveryClient,
message: Message,
@@ -207,8 +224,8 @@ async function deliverLive(
})
continue
}
await commitDeliveryReservation(reservation)
log("[team-mailbox] live delivery committed", {
await markLiveDeliveryPending(teamRunId, recipientName, message.messageId, config)
log("[team-mailbox] live delivery reserved until recipient idle", {
teamRunId,
recipient: recipientName,
recipientSessionId,