Schedule consultation bridges on demand and preserve delivery evidence

This commit is contained in:
aiagent
2026-10-20 00:39:12 -07:00
parent 557f1ee03c
commit 2f633869fe
18 changed files with 483 additions and 56 deletions
@@ -0,0 +1,17 @@
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)}
}