# Event Mapping | Pi / Harness 事实 | HarnessEvent | assistant-ui / UI 状态 | |---|---|---| | HTTP message accepted | `user.message`, `run.started` | user message, running | | `message_update.text_delta` | `assistant.delta` | 合并同 messageId 文本 | | assistant `message_end` | `assistant.completed` | complete/stop | | `tool_execution_start` | `tool.requested` | tool-call waiting/running | | successful `tool_execution_end` | `tool.completed` | result/success | | failed `tool_execution_end` | `tool.failed` | isError/error | | canonical Skill `read` preflight | `skill.requested` | Catalog 高亮 | | same `read` successful `tool_result` | `skill.loaded` | loaded 高亮 | | ApprovalBroker request | `approval.required` | Tool card + modal pending | | broker decision/timeout/abort | `approval.resolved` | approved/denied/expired/cancelled | | prompt resolves | `run.completed` | idle | | user abort / deadline | `run.cancelled` | incomplete/cancel reason | | prompt rejects | `run.failed` | error | `skill.requested`/`skill.loaded` 是 Harness 推导事件,不是 Pi 原生事件。未识别 Pi Event 被安全忽略。高频 delta 只在内存窗口和 SSE 中保留,不包含 thinking、密钥或图片 base64。 SSE 的 `afterSequence` 优先于 `Last-Event-ID`。历史仍在窗口时补发;游标早于最早保留 sequence 时发送 `harness.reset` 控制事件,避免静默缺口。客户端再按 eventId/sequence 去重。