# Agent Stream Nesting Logic

> 万悟平台 SSE 子会话递归嵌套与三明治序列渲染架构指南。涵盖 parentId 领养、order 绝对排序、动静 Chunk 分层及 Vue 2 响应式引用协议。

- Skill: `unicomai/agent-stream-nesting-logic` (Agent Skill)
- Install (CLI): `npx skillmds add unicomai/agent-stream-nesting-logic`
- Raw SKILL.md: https://api.skillmd.com/api/skills/unicomai/agent-stream-nesting-logic/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Web & Frontend
- Author: UnicomAI (https://skillmd.com/u/unicomai)
- Updated: 2026-09-09
- Page: https://skillmd.com/skills/unicomai/agent-stream-nesting-logic

---


# 子会话递归嵌套渲染架构协议 (Nesting Architecture Protocol)

本指南针对万悟平台中「主消息 -> 子会话 (Skill/Tool/Knowledge) -> 孙级会话」的递归序列化渲染标准，定义了 AI 助手及后续维护者必须遵守的底层逻辑。

## 1. 核心模型：三明治序列 (The Sandwich Sequence)
为了支持正文与多个子会话（工具调用、知识库）的任意插空排列，我们不再按类型分块渲染，而是通过 `messageSequence` 数组实现**“三明治”交错结构**。

- **`type: 'main'`**: 文本片段。直接由 `StreamProcessor` 驱动打字机渲染。
- **`type: 'sub'`**: 子会话卡片。触发 `SubConversion.vue` 组件递归渲染。

### 核心映射逻辑：
- **顶级子会话**: `parentId` 为空的包，进入主消息的 `messageSequence`。
- **嵌套子会话**: 具有 `parentId` 的包，必须由对应的父组件 ID “领养”，存入其自身的 `messageSequence` 中。

## 2. 时序法则：Order 绝对排序
- **局部闭包排序**: 在每一个 `messageSequence` 内部，必须以 `order` 字段为唯一权重进行升序排列。
- **同 Order 追加协定**: 若同一个 ID 下出现多个 Order 相同的数据包，前端视为“内容的物理追加”而非“组件的新增”。

## 3. 动力学：动静 Chunk 分层
在渲染 `main` 片段时，必须区分两种状态以防止打字时界面闪烁：
- **`stableChunks`**: 已完成 Markdown 语法闭环解析并生成的 HTML 块集合。
- **`activeResponse`**: 正在缓冲区排队、尚未完成闭环解析的输入文本（打字动画部分）。

## 4. 引用溯源：Data Attributes 协议
所有生成的子会话 DOM 必须携带以下身份锚点，以支持「引文角标点击」的事件冒泡定位：
- **`data-sub-id`**: 该段文字所属的原子消息 ID（若是吸收片段，则为分片 ID）。
- **`data-parent-id`**: 视觉所属的容器组件 ID（父卡片 ID）。

## 5. 响应式红线 (CRITICAL) - Vue 2 专供
> [!IMPORTANT]
> **绝对禁止使用浅拷贝或快照！**
> 
> 在将子会话（尤其是 `agentSkillText` 正文分段）注册进父组件序列时，**必须直接传递原始响应式对象的引用**（即 `parentSub.messageSequence.push(subConversion)`）。
> 
> - **原因**: 只有保持引用一致，外部 `StreamProcessor` 对 `activeResponse` 的实时增长才能无缝穿透进多层嵌套的子组件 UI 中。若使用 `{...subConversion}` 浅拷贝，会导致打字效果丢失或不连续。

## 6. 生命周期管理
- **状态单向锁**: 状态 `status: 3/4`（结束/失败）一旦更新，不再受后续包干扰回退。
- **ID 纠错逻辑**: 若后端返回 `id === parentId`（自引用死循环），必须在 `sseMethod.js` 拦截层将其重刷 ID 为 `content_` 前缀的分片包。

