Files
agent-workbench/assets/dashboard/src/lib/message-delivery.ts
T

18 lines
1.5 KiB
TypeScript

import type { Message } from './types'
export type DeliveryStage = 'saved' | 'queued' | 'delivered' | 'processing' | 'replied' | 'blocked' | 'unknown'
export const deliveryLabels: Record<DeliveryStage, string> = { saved:'已保存', queued:'排队中', delivered:'已送达', processing:'处理中', replied:'已回复', blocked:'受阻', unknown:'待核查' }
export function messageDelivery(message: Message, messages: Message[]) {
const replied = messages.some(row => row.source === 'agent' && row.reply_to === message.id && row.session_id === message.session_id)
let stage: DeliveryStage
if (replied) stage = 'replied'
else if (message.delivery_stage && message.delivery_stage in deliveryLabels) stage = message.delivery_stage
else if (['failed','uncertain','blocked'].includes(message.status)) stage = 'blocked'
else if (message.status === 'queued') stage = 'queued'
else if (message.status === 'delivered' || message.submission?.state === 'accepted') stage = 'delivered'
else if (message.status === 'claimed') stage = 'queued' // A lease alone is not a running native turn.
else if (message.status === 'saved') stage = 'saved'
else stage = 'unknown' // Transport completion alone does not prove a visible reply.
const reason = stage === 'blocked' ? (message.delivery_reason || '结果尚未确认,正在核查;请勿重复发送。') : stage === 'unknown' ? '暂无法确认消息阶段,请刷新查看。' : ''
return {stage, label:deliveryLabels[stage], reason, waiting:['queued','processing','blocked','unknown'].includes(stage)}
}