# 第5阶段:复杂作品与预览空间 作品格式于0.5.0引入,当前0.6.0沿用。依照用户确认的六阶段计划:第5阶段实现复杂作品,第6阶段进行整体兼容、性能、安装卸载和最终交付。当前第6阶段检查结果另见第六阶段检查报告,不将此前的组件测试等同于完整集成验收。 ## 模型如何生成 模型可按任务自行调用`reply_ui_guide({kind:"artifact"})`,在正式回复中给出一个`dsh-artifact`围栏JSON。无需用户记格式或明确点名组件。普通HTML、JavaScript、JSON程序代码块继续作为原生代码显示,不自动运行。DSH隐藏围栏语言时,仅识别具备作品完整标识的对象。 字段:`type:"artifact"`、稳定英文`id`(字母开头,至多64字符)、`title`(至多120字符)、`version`(1–9999整数)、`html`(1–30000字符),可选`description`(至多600字符)、`height`(260–900,默认460)。整段JSON仍受40000字符上限限制。 页面使用内联HTML/CSS/JavaScript、原生DOM、SVG或canvas。适合组合式模拟器、多个视图的小工具、可操作的演示作品。简单表格、曲线或选择题仍优先使用已有结构化组件。模型必须给出完整页面,修改沿用同一id并递增version;同版本不同内容会保留原文并报错。 ## 查看与修改 - 回复内点击“运行预览”,在原回复的作品卡片中操作;“停止预览”撤下运行页面。查看原文也会停止作品。 - “在侧栏打开”复用DSH原生右侧栏,按对话提供作品列表。关闭或切走侧栏会卸载该处运行页。重新打开可再次运行,不影响回复输入框。 - “全屏预览”打开有关闭按钮和Escape退出的对话框;底层会话仍保留。 - “编辑源码”允许本机修改HTML并“应用为新版本”,不会覆盖模型原文或发消息。版本菜单可切回模型版本或本机版本。未应用的源码草稿也会保留。 - “复制当前源码”复制当前选中版本;外层“复制原文”始终复制模型回复原始块,两者用途不同。 ## 状态恢复 作品中使用`window.dshArtifact.getState()`取得已保存JSON对象,修改输入后调用`dshArtifact.setState({...})`。单份状态最多24000字符。启动时须把状态写回控件;监听`dsh-artifact-state`事件并重新读状态,可同步其他预览里的更改。缺失、旧字段须提供默认值。 状态按会话和作品id隔离,兼容字段可跨版本保留。插件无法自动恢复任意DOM、JS变量、画布像素、运行中的计时器或文件。关闭后再次运行是重新加载页面,再由作品的状态API还原输入。完整重启后,侧栏导航参数即使丢失,仍可从本机作品库和选中记录恢复。 最多保留12个作品,每个最多6个版本,总记录不超过约180万字符。超过保留范围会清理较旧记录;存储失败时保留当前页面内存,并如实提示。记录不跨设备同步。停用或卸载不主动删除本机作品记录。 ## 运行边界 聊天主页面从不插入模型HTML或执行模型JS。作品先装入可信外壳iframe,再装入内部作品iframe;二者均为`sandbox="allow-scripts"`,不提供`allow-same-origin`、弹窗、下载、表单提交或顶层导航权限。外壳通过`frame-src about:`限制内部页导航,内部页面另有`frame-src 'none'`等CSP;连接、外部脚本/样式/字体和对象均禁用,仅允许内联脚本/样式及data图片。宿主仅接收当前iframe来源、当前通道标识对应的状态/就绪/错误消息。 这是页面权限与DOM隔离,不是可保证无限循环不会拖慢渲染进程的CPU隔离。生成作品应避免忙循环、大规模计算和无限资源增长。只接收本机状态,不提供文件、网络、Node/Electron、聊天历史或模型工具调用桥梁。运行错误显示在作品卡片状态区,原始内容始终可查看和复制。 深浅色及预设通过`--bg`、`--fg`、`--card`、`--line`、`--accent`传入页面;作品自行硬编码的配色不会被强行替换。主题变化会重载正在运行的作品,API已保存状态仍可恢复。 本阶段以Node、VM及DOM契约测试核对代码,没有操作DSH或浏览器。原生侧栏的实际挂载、iframe策略在本机Electron中的行为与视觉效果,由用户按验收指南确认;未将模拟测试当作实机验证。