deerflow2/.planning/phases/04-iframe-markdown-new-syst.../04-CONTEXT.md

6.0 KiB
Raw Blame History

Phase 4: Iframe + Markdown New-System Stabilization - Context

Gathered: 2026-04-07 Status: Ready for planning

## Phase Boundary

本阶段仅聚焦“新系统能力稳定化”,范围限定为:

  1. iframe 场景下的宿主/子页面消息通信selected skill、XClawUsed、fullscreen、clipboard稳定
  2. markdown 导出链路markdown/json/pdf/docx稳定
  3. artifact 相关集成点在上述链路中的兼容性确认。

不新增业务能力,不改后端协议,仅做前端稳定化、容错与可验证性增强。

## Implementation Decisions

Iframe 消息协议稳定策略

  • D-01: 统一以 frontend/src/core/iframe-messages.ts 作为消息类型单一真源,禁止在页面/Hook 内散落硬编码 type 字符串。
  • D-02: 所有 postMessage 接收端先做 type 与最小字段校验,再进入业务逻辑;非法 payload 只记录调试日志,不触发 UI 错误。
  • D-03: selectedSkill 重复消息保持幂等,沿用现有 keythread + skill + language防抖初始化逻辑。

Iframe 路由与技能初始化行为

  • D-04: /workspace/chats/new/workspace/chats/[thread_id] 的路由判定仍以前端路由为真源,不再依赖历史接口成功与否。
  • D-05: skill bootstrap 失败采用“可恢复错误”策略toast/dialog不阻断基础聊天输入与路由切换。
  • D-06: xclaw_used 仅作为兼容参数,不作为新会话/历史渲染核心开关。

Markdown 导出稳定策略

  • D-07: 维持导出入口统一在 core/threads/export.ts格式转换能力docx/pdf保持在 core/utils/markdown-download/,避免职责混叠。
  • D-08: 转换失败必须可见toast 或 error callback且不影响会话继续使用。
  • D-09: 文件名策略保持可预测title 派生 + sanitize并保证无消息时禁止导出。

Artifact 集成点策略

  • D-10: artifact 仍以线程 state 为来源,不在 Phase 4 引入新的 artifact 数据源。
  • D-11: markdown 导出以消息内容为核心artifact 链接保留现有 markdown 行为不在本阶段扩展“artifact 打包导出”新能力。

测试与验证策略

  • D-12: Phase 4 优先补“前端可控”的稳定性验证:消息协议、防重入、错误兜底、导出成功/失败路径。
  • D-13: 与后端耦合点(如 /history)在 E2E 中采用“前端状态可验证优先”断言,减少无意义级联失败。

the agent's Discretion

  • 具体日志粒度、错误文案细节、hook 内部状态组织方式。
  • 不中断主流程前提下的最小重构范围。
## Specific Ideas
  • 保持 Titan 对齐方向:在前端契约层尽量“单一入口 + 显式容错 + 幂等执行”。
  • 以“可恢复失败”替代“整页失败”:即使 skill bootstrap 或 history 出错,聊天主路径可继续。
  • 导出体验保持轻量:用户只看到明确成功/失败反馈,不暴露底层转换细节。

<canonical_refs>

Canonical References

Downstream agents MUST read these before planning or implementing.

Iframe 通信与技能联动

  • frontend/src/core/iframe-messages.ts — iframe 消息类型与发送辅助函数。
  • frontend/src/hooks/use-iframe-skill.ts — query + postMessage 双通道 skill 选择处理。
  • frontend/src/hooks/use-selected-skill-listener.ts — selectedSkill 接收与 bootstrapRemoteSkill 调用链。
  • frontend/src/app/workspace/chats/[thread_id]/page.tsx — 线程页内路由、欢迎态、skill 错误兜底和主交互承接。
  • frontend/src/lib/utils.ts — iframe 场景 copyToClipboard 的父页面代理逻辑。

Markdown 导出链路

  • frontend/src/components/workspace/export-trigger.tsx — 导出入口与用户可见反馈。
  • frontend/src/core/threads/export.ts — markdown/json 导出格式与下载实现。
  • frontend/src/core/utils/markdown-download/use-markdown-download.ts — docx/pdf 下载状态管理与错误回调。
  • frontend/src/core/utils/markdown-download/converter.ts — markdown 到 docx/pdf 的核心转换实现。

Roadmap / Phase 约束

  • .planning/ROADMAP.md — Phase 4 范围与目标定义。
  • .planning/phases/03-legacy-visual-alignment-pass/03-UAT.md — 上一阶段遗留问题与验证边界。
  • .planning/phases/03-legacy-visual-alignment-pass/03-02-SUMMARY.md — 已完成的前端侧 E2E 稳定化策略。

</canonical_refs>

<code_context>

Existing Code Insights

Reusable Assets

  • useSelectedSkillListener:已经具备 bootstrap 幂等键、防重复初始化、错误弹窗能力,可直接扩展协议校验与容错分支。
  • useIframeSkill:已覆盖 query 与 postMessage 两条输入通道,可作为统一入口继续收敛。
  • exportThreadAsMarkdown/exportThreadAsJSON:导出职责清晰,适合作为导出稳定化主承载点。
  • useMarkdownDownload:已提供下载中状态和错误回调,是 PDF/DOCX 稳定化的天然抓手。

Established Patterns

  • 前端通过 toast + 非阻断 UI 处理异步失败。
  • 聊天路由在 Hook (useThreadChat) 中归一化,页面层消费“是否欢迎态/是否渲染历史”。
  • 线程页将 artifact、消息、输入框拆为独立上下文与组件便于局部加固。

Integration Points

  • ChatPageuseSelectedSkillListenerselected skill 到 bootstrap 请求链。
  • ExportTriggercore/threads/export.ts:导出按钮到文件下载链。
  • useIframeSkill / copyToClipboard ↔ 宿主页 postMessageiframe 能力对接链。

</code_context>

## Deferred Ideas
  • artifact 打包导出zip/多文件合并)属于新增能力,延后到独立 phase。
  • 跨窗口消息安全增强origin allowlist、签名校验可在后续安全专项 phase 深化。
  • 导出模板皮肤化(品牌样式、主题模板)不在本阶段。

Phase: 04-iframe-markdown-new-system-stabilization Context gathered: 2026-04-07