Merge pull request #4064 from PeterPonyu/fix/3923-team-error-propagation
fix(team-mode): surface member error to main agent (#3923)
This commit is contained in:
@@ -1,11 +1,15 @@
|
||||
import { randomUUID } from "node:crypto"
|
||||
|
||||
import type { TeamModeConfig } from "../../config/schema/team-mode"
|
||||
import { findResolvedMemberSession } from "../../features/team-mode/member-session-resolution"
|
||||
import { sendMessage } from "../../features/team-mode/team-mailbox/send"
|
||||
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 { isRecord } from "../../shared/record-type-guard"
|
||||
import { log } from "../../shared/logger"
|
||||
import {
|
||||
DEFAULT_SESSION_IDLE_SETTLE_MS,
|
||||
@@ -29,6 +33,18 @@ function getErroredSessionID(properties: unknown): string | undefined {
|
||||
return resolveSessionEventID(properties)
|
||||
}
|
||||
|
||||
function extractErrorText(properties: unknown): string {
|
||||
const props = isRecord(properties) ? properties : undefined
|
||||
const errorValue = props?.["error"]
|
||||
if (errorValue instanceof Error) {
|
||||
return errorValue.message
|
||||
}
|
||||
if (typeof errorValue === "string" && errorValue.length > 0) {
|
||||
return errorValue
|
||||
}
|
||||
return "unknown error"
|
||||
}
|
||||
|
||||
async function requeuePendingLiveDeliveries(
|
||||
teamRunId: string,
|
||||
memberName: string,
|
||||
@@ -165,6 +181,35 @@ export function createTeamMemberErrorHandler(
|
||||
)),
|
||||
}), config)
|
||||
|
||||
const leaderMember = runtimeState.members.find((member) => member.agentType === "leader")
|
||||
if (leaderMember !== undefined && leaderMember.name !== runtimeMember.memberName) {
|
||||
const errorText = extractErrorText(event.properties)
|
||||
const errorBody = `Team member "${runtimeMember.memberName}" has entered an error state and will not complete its task.\nError: ${errorText}`
|
||||
try {
|
||||
await sendMessage(
|
||||
{
|
||||
version: 1,
|
||||
messageId: randomUUID(),
|
||||
from: "system",
|
||||
to: leaderMember.name,
|
||||
kind: "announcement",
|
||||
body: errorBody,
|
||||
timestamp: Date.now(),
|
||||
},
|
||||
runtimeState.teamRunId,
|
||||
config,
|
||||
{ isLead: true, activeMembers: runtimeState.members.map((m) => m.name) },
|
||||
)
|
||||
} catch (sendError) {
|
||||
log("team member error handler: failed to notify lead of member error", {
|
||||
event: "team-mode-member-error-notify-failed",
|
||||
teamRunId: runtimeState.teamRunId,
|
||||
memberName: runtimeMember.memberName,
|
||||
error: sendError instanceof Error ? sendError.message : String(sendError),
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
log("team member session errored", {
|
||||
event: "team-mode-member-errored",
|
||||
teamRunId: runtimeState.teamRunId,
|
||||
|
||||
Reference in New Issue
Block a user