package gateway // 本文件归属编排器推给前端的每会话状态事件类型(design/15 §5/§2.1)。 // 它们从 session_orchestrator.go 拆出,使编排器本体只留消息状态机,并保持在 // 「单文件 ≤500 行」的硬约束内。帧名即契约:客户端按 type 分发,因此这些取值 // 绝不随重构改名(要改就是契约变更,须先登记)。 // // 这里只放**状态机信号**(不含消息内容)。带内容的帧(message.*、steer_ack、 // chat_duplicate 等)由 design/11 §7.1 的帧门按 fail-closed 默认档只投给 // owner + admin,见 ws_frame_scope.go。 // 经 WS 通道推给前端的状态事件类型。每个的 data map 都 // 携带 sessionId,使客户端能按会话关联状态。 const ( EventSessionBusy = "session_busy" EventPendingAck = "pending_ack" EventPendingDrain = "pending_drain" EventSessionIdle = "session_idle" EventSessionInterrupt = "session_interrupted" EventPendingFull = "pending_full" // EventChatDuplicate 是一次重复到达的明确应答(G4 幂等):本条 clientMsgId // 已有落库的消息,本次没有新回合、也不会有新帧。它的 data 携带 // {sessionId, clientMsgId, messageId},让客户端把本地乐观气泡对齐到既有 // 消息;没有发过这个 clientMsgId 的其他客户端自行忽略即可。它不是状态机 // 迁移,因此不在 design/11 §7.1 的「状态信号」白名单里 —— 帧门默认只把它 // 投给 owner/admin(fail-closed)。 EventChatDuplicate = "chat_duplicate" )