chore: release v0.96.0

This commit is contained in:
coso
2026-03-25 22:04:38 +08:00
parent 307b2d3670
commit 0ee56c1098
328 changed files with 40949 additions and 6948 deletions
@@ -0,0 +1,744 @@
# Lime Artifact Workbench 架构蓝图
> 状态:提案
> 更新时间:2026-03-24
> 运行时边界:凡涉及发送边界、runtime metadata、Team 委派、Op/Event 收口,均以 `docs/roadmap/lime-conversation-execution-efficiency-roadmap.md` 为准;本文只细化 Artifact Workbench 架构
> 依赖文档:
> - `docs/roadmap/artifacts/roadmap.md`
> - `docs/roadmap/artifacts/artifact-document-v1.md`
> - `docs/roadmap/artifacts/framework-boundary.md`
> - `docs/roadmap/artifacts/system-prompt-and-schema-contract.md`
> 目标:把 Lime 高配版 Artifact Workbench 的产品形态、运行链路、时序关系、system prompt 组装策略与实现边界收敛成一份可直接指导开发实施的总装图
## 1. 固定决策
本蓝图固定以下 v1 决策,不再留给后续实现阶段临时判断:
1. **右侧主工作台**
Artifact Workbench 的主交互面是聊天右侧工作台,不以全屏页为默认入口。
2. **双阶段生成**
高价值结构化交付物默认采用:
- Stage 1:Reasoning / Outline / Intent Resolution
- Stage 2:ArtifactDocument 结构化产出
3. **分层组装 prompt**
system prompt 由后端统一分层拼装,不让前端直接拼完整 prompt。
4. **产品层 canonical model**
- `ArtifactDocument JSON` 是长期事实源
- `Tiptap / ProseMirror JSON` 仅是 `rich_text` block 的编辑器载荷
- `Markdown / HTML / PDF` 是导出快照
5. **研究类 source 强约束**
- `report / analysis / comparison / research`:必须有 source
- `roadmap / prd / plan / brief`:source 可选,但建议保留
6. **消息区与交付区职责分离**
- 消息区负责解释、进度、追问、下一步
- 交付区负责正式产物
- 不允许整篇 Artifact 再重复贴回消息区
7. **框架层与产品层分离**
- Lime 持有 `ArtifactDocument` 与 Workbench 产品能力
- Aster Runtime 持有 `thread / turn / item / event / output schema`
- `blueprint` 只是可选 planning module,不是主运行时
## 2. 文档依据
本文基于以下现役事实源:
- `src/components/agent/chat/hooks/agentRuntimeAdapter.ts`
- `src-tauri/src/commands/aster_agent_cmd/runtime_turn.rs`
- `src-tauri/src/commands/aster_agent_cmd/prompt_context.rs`
- `src-tauri/src/services/memory_profile_prompt_service.rs`
- `src-tauri/src/services/web_search_prompt_service.rs`
- `src/components/agent/chat/workspace/workbenchPreview.tsx`
- `src/components/agent/chat/workspace/WorkspaceCanvasContent.tsx`
- `src/components/artifact/ArtifactRenderer.tsx`
- `src/components/content-creator/canvas/document/editor/NotionEditor.tsx`
- `src-tauri/src/services/agent_timeline_service.rs`
从这些事实源可以确认:
1. 前端已支持 turn 级 `systemPrompt` 透传。
2. 后端现有主链已按阶段合并 `runtime agents / memory / web search / request policy / elicitation / team preference / auto continue`。
3. Lime 已具备右侧工作台、Artifact 渲染、Timeline 投影与富文本编辑器底座。
4. 需要新增的是 Artifact 相关的产品层协议、编排层与 prompt 层,而不是另造第二套聊天系统。
## 3. 总体架构
## 3.0 跨层总装图
```mermaid
flowchart TB
User["用户"]
subgraph FE["Lime 前端"]
Conversation["Conversation"]
Workbench["Artifact Workbench"]
Inspector["Timeline / Sources / Diff"]
end
subgraph App["Lime 应用层"]
ArtifactDomain["ArtifactDocument Domain"]
WorkbenchService["Artifact Workbench Service"]
ProductPolicy["Artifact Product Policy"]
end
subgraph Runtime["Aster Runtime 层"]
ThreadTurn["Thread / Turn / Item"]
PromptComposer["Prompt Composer"]
SchemaRuntime["Output Schema Runtime"]
EventBus["Runtime Event Bus"]
Approval["Approval / Elicitation / Interrupt"]
end
subgraph Planning["Blueprint 模块"]
Blueprint["Blueprint / TaskTree / Worker"]
end
subgraph Model["模型与工具"]
LLM["LLM"]
Tooling["Web / File / Exec / MCP"]
end
User --> Conversation
Conversation --> WorkbenchService
Workbench --> ArtifactDomain
Inspector --> EventBus
WorkbenchService --> ProductPolicy
WorkbenchService --> ThreadTurn
ProductPolicy --> PromptComposer
ThreadTurn --> PromptComposer
PromptComposer --> SchemaRuntime
SchemaRuntime --> LLM
LLM --> Tooling
Tooling --> EventBus
EventBus --> ArtifactDomain
ThreadTurn -. optional planning handoff .-> Blueprint
```
## 3.1 总体架构图
```mermaid
flowchart TB
User["用户请求"]
subgraph Frontend["前端交互层"]
Conversation["Conversation / Message List"]
Inputbar["Inputbar / Intent Metadata"]
Workbench["Artifact Workbench Shell"]
Inspector["Timeline / Inspector / Sources Drawer"]
end
subgraph Runtime["Aster Runtime / Lime Runtime Adapter"]
TurnGateway["agent_runtime_submit_turn"]
IntentResolver["Artifact Intent Resolver"]
PromptComposer["Artifact Prompt Composer"]
Planner["Stage 1 Planner / Reasoner"]
Generator["Stage 2 Artifact Generator"]
Validator["Validator / Repair"]
Timeline["Agent Timeline Recorder"]
end
subgraph Domain["Artifact Domain 层"]
ArtifactStore["ArtifactDocument Store"]
Versioning["Artifact Versioning"]
SourceRegistry["Artifact Source Registry"]
Exporter["Export Adapters"]
end
subgraph Render["渲染与编辑层"]
BlockRenderer["Artifact Block Renderer Registry"]
RichTextAdapter["RichText Adapter / Tiptap"]
end
User --> Inputbar --> TurnGateway
TurnGateway --> IntentResolver
IntentResolver --> PromptComposer
PromptComposer --> Planner
Planner --> Generator
Generator --> Validator
Validator --> ArtifactStore
Validator --> Timeline
ArtifactStore --> Versioning
ArtifactStore --> SourceRegistry
Conversation --> Inspector
Timeline --> Inspector
ArtifactStore --> Workbench
SourceRegistry --> Inspector
Workbench --> BlockRenderer
BlockRenderer --> RichTextAdapter
Workbench --> Exporter
Exporter --> Versioning
```
## 3.2 分层职责
### 前端交互层
- 收集用户输入与 UI 场景元数据
- 展示消息区、右侧 Artifact Workbench、Timeline / Source Inspector
- 不负责拼装完整 system prompt
- 不负责决定最终 block schema
### Runtime 层
- 判断本次 turn 是否进入 Artifact 主链
- 组装 prompt
- 绑定 turn 级 output schema
- 执行 Stage 1 / Stage 2
- 做 validator / repair
- 产出 timeline 事件
- 持有 item / delta / approval / interrupt 语义
### Artifact Domain 层
- 作为 `ArtifactDocument` 的持久化与版本事实源
- 管理 sources、version、export records
- 连接 turn / item 与 artifact
### 渲染与编辑层
- 把 block 渲染成统一视觉组件
- 让 `rich_text` block 接入 Tiptap
- 承载局部编辑、局部 AI 改写、diff、导出
## 4. 生命周期流程
## 4.1 生命周期流程图
```mermaid
flowchart TD
A["用户发起请求"] --> B{"是否需要正式交付物?"}
B -- 否 --> C["普通消息链路"]
B -- 是 --> D["解析 artifact intent / kind / source policy"]
D --> E["组装 Stage 1 system prompt"]
E --> F["Stage 1 输出意图、骨架、source 需求、block 计划"]
F --> G["组装 Stage 2 system prompt"]
G --> H["Stage 2 输出 artifact_document_draft 或 artifact ops"]
H --> I["Validator / Repair"]
I --> J{"是否合法?"}
J -- 否 --> K["降级为 rich_text fallback + 记录 telemetry"]
J -- 是 --> L["写入 ArtifactDocument Store"]
K --> L
L --> M["生成版本记录 / source 绑定 / timeline 事件"]
M --> N["右侧 Artifact Workbench 渲染"]
N --> O{"用户继续编辑/改写?"}
O -- 否 --> P["导出 / 归档 / 保留为最终版本"]
O -- 是 --> Q["局部 rewrite / 局部编辑 / 新版本生成"]
Q --> I
```
## 4.2 状态机
| 状态 | 说明 | 可迁移到 |
|------|------|------|
| `draft` | 已建立 ArtifactDocument,尚未开始正式流式写入 | `streaming` / `failed` |
| `streaming` | 正在由 Stage 2 或局部 rewrite 写入 | `ready` / `failed` |
| `ready` | 当前版本可用 | `streaming` / `archived` |
| `failed` | 当前回合生成失败,但文档对象仍保留 | `streaming` / `archived` |
| `archived` | 已归档,只读 | - |
触发原则:
- `artifact.begin` 或创建 draft 时进入 `draft`
- 第一个有效 block 写入时进入 `streaming`
- validator / repair 完成并落盘进入 `ready`
- Stage 2 或 rewrite 失败进入 `failed`
- 归档操作进入 `archived`
## 5. 核心时序图
以下时序图只表达产品层与运行时层的职责分工,不单独定义 Lime 当前仓库的 on-wire 字段名、命令名或 metadata 归一化细节。
这些当前实施细节统一以 `docs/roadmap/lime-conversation-execution-efficiency-roadmap.md` 为准。
## 5.1 生成时序图
```mermaid
sequenceDiagram
participant User as 用户
participant FE as 前端工作台
participant RT as Runtime Turn
participant PC as Artifact Prompt Composer
participant S1 as Stage 1 Planner
participant S2 as Stage 2 Generator
participant VR as Validator/Repair
participant Store as ArtifactDocument Store
participant TL as Timeline
participant WB as Workbench
User->>FE: 输入请求
FE->>RT: submit_turn(message + artifact metadata)
RT->>PC: build prompts by layers
PC-->>RT: stage1_prompt + stage2_prompt context
RT->>S1: 执行 Stage 1
S1-->>RT: artifact_intent + outline + source policy
RT->>TL: emit artifact_intent_resolved
RT->>S2: 执行 Stage 2
S2-->>RT: artifact_document_draft / artifact ops
RT->>VR: validate and repair
VR-->>RT: repaired document
RT->>Store: persist document + version + sources
RT->>TL: emit artifact_version_persisted
Store-->>WB: latest ArtifactDocument
WB-->>User: 右侧显示正式交付物
```
## 5.2 Prompt 组装时序图
```mermaid
sequenceDiagram
participant FE as 前端
participant RT as runtime_turn
participant AP as artifact_prompt_service
participant Base as Base Prompt Layer
participant Mem as Memory Prompt Layer
participant Search as Web Search Layer
participant Artifact as Artifact Policy Layer
participant Source as Source Policy Layer
participant Stage as Stage Contract Layer
participant Schema as Output Schema Binder
FE->>RT: submit_turn(system metadata only)
RT->>AP: compose(stage, kind, sourcePolicy, metadata)
AP->>Base: merge base runtime rules
AP->>Mem: merge memory prompt
AP->>Search: merge web search prompt
AP->>Artifact: merge artifact policy prompt
AP->>Source: merge source requirement prompt
AP->>Stage: merge stage-specific contract
AP->>Schema: attach turn-level output schema
Schema-->>AP: final system prompt + output schema
AP-->>RT: composed prompt + stage markers + schema
```
## 5.3 局部改写时序图
```mermaid
sequenceDiagram
participant User as 用户
participant WB as Workbench
participant RT as Artifact Rewrite Runtime
participant PC as Prompt Composer
participant Gen as Rewrite Generator
participant VR as Validator/Repair
participant Store as Version Store
participant Diff as Diff Engine
User->>WB: 选中 block 并点击 AI 改写
WB->>RT: rewrite(blockId, instruction, current document)
RT->>PC: compose rewrite prompt
PC-->>RT: rewrite system prompt
RT->>Gen: 仅生成目标 block 新内容
Gen-->>RT: updated block
RT->>VR: validate block + document
VR-->>RT: repaired document snapshot
RT->>Store: create new version
Store->>Diff: compare previous/current
Diff-->>WB: block diff
WB-->>User: 展示差异并切换到新版本
```
## 5.4 导出时序图
```mermaid
sequenceDiagram
participant User as 用户
participant WB as Workbench
participant Export as Export Service
participant Render as Render Adapter
participant Store as Artifact Store
User->>WB: 点击导出
WB->>Export: export(artifactId, format)
Export->>Store: load latest version
Store-->>Export: ArtifactDocument + editor payloads
Export->>Render: convert to md/html/pdf/json
Render-->>Export: exported content/file
Export-->>WB: download path / result
WB-->>User: 导出完成
```
## 6. Prompt 架构
## 6.1 为什么必须由后端组装
当前现役事实源已经说明,system prompt 的主要规则是在后端主链按阶段合并:
- `runtime agents`
- `memory`
- `web search`
- `request tool policy`
- `elicitation`
- `team preference`
- `auto continue`
Artifact Workbench 不应绕开这条链,也不应让前端页面继续自行决定 prompt 顺序。
因此:
- 前端只传意图元数据
- 后端统一决定 prompt 层级、去重 marker、冲突处理与日志记录
## 6.2 Prompt 分层
v1 固定采用 7 层 prompt:
### 1) Base Runtime Layer
职责:
- 基础身份
- 输出语言
- 工具边界
- 安全约束
- “消息区 vs 交付区”职责分工
### 2) Runtime Agents Layer
复用现有运行时能力提示与工作目录上下文。
### 3) Memory Layer
复用现有记忆画像和记忆来源提示。
### 4) Search / Source Layer
包含:
- 现有 web search 偏好
- 新增 Artifact source policy
规则:
- 研究类任务要求引用来源
- 普通计划类任务仅鼓励来源
### 5) Artifact Policy Layer
新增 Artifact 专属系统规则,至少包含:
1. 何时必须生成 Artifact
2. 不要把完整文档重复发回聊天区
3. 模型只输出语义结构,不输出视觉样式
4. block 类型必须来自白名单
### 6) Stage Contract Layer
根据 stage 动态切换:
- `stage1`: 输出 artifact intent / outline / source policy / block plan
- `stage2`: 输出 `artifact_document_draft` 或 `artifact ops`
- `rewrite`: 只重写指定 block
### 7) Turn Context Layer
来自 turn metadata 的本次上下文:
- theme
- artifact kind
- source policy
- selected block
- rewrite instruction
- workspace mode
### 8) Output Schema Hint Layer
职责:
- 提醒模型当前 turn 存在严格 schema
- 明确优先满足结构合同,而不是自由排版
- 让 stage1 / stage2 / rewrite 三条链分别受约束
## 6.3 Prompt marker 约定
为避免重复拼装,建议引入新 marker:
- `【Artifact 交付策略】`
- `【Artifact 来源策略】`
- `【Artifact Stage 1 合同】`
- `【Artifact Stage 2 合同】`
- `【Artifact Rewrite 合同】`
规则与现有服务一致:
- 已包含 marker 时不重复追加
- 空 prompt 不插入空段落
- 每层都是可独立观测的 prompt section
## 6.4 前端到后端的 Artifact 意图字段
前端不直接传完整 prompt,而是透传结构化 Artifact 意图。
这里的接口只描述 Artifact 领域希望表达的最小语义,不等于 Lime 当前请求载荷的最终 wire contract。
当前仓库实际发送边界、`harness` 结构和 metadata 归一化,统一以执行效率路线图为准。
建议长期需要表达的 Artifact turn intent 包含:
```ts
interface ArtifactTurnMetadata {
artifact_mode?: "none" | "draft" | "rewrite";
artifact_kind?:
| "report"
| "roadmap"
| "prd"
| "brief"
| "analysis"
| "comparison"
| "plan";
artifact_stage?: "stage1" | "stage2" | "rewrite";
source_policy?: "required" | "preferred" | "none";
workbench_surface?: "right_panel" | "fullscreen";
artifact_request_id?: string;
artifact_target_block_id?: string;
artifact_rewrite_instruction?: string;
}
```
用途:
- 驱动 prompt 组装
- 写入 timeline
- 连接 ArtifactDocument 与本次 turn
## 6.5 Stage 1 system prompt 目标
Stage 1 的职责不是写正文,而是锁定结构。
必须输出:
- 是否需要 Artifact
- `kind`
- 建议标题
- source policy
- block 计划
- section 骨架
- 风险或缺失信息
不得输出:
- 完整长文
- 任意 HTML
- 样式参数
## 6.6 Stage 2 system prompt 目标
Stage 2 的职责是生成正式结构化交付物。
必须输出:
- `artifact_document_draft`
- 或增量 `artifact ops`
必须遵守:
- block 类型白名单
- source 绑定要求
- 不重复把全文写回消息区
## 6.7 Prompt 不是唯一控制点
本蓝图在此明确:
- prompt 负责行为引导
- turn 级 output schema 负责结构约束
- validator / repair 负责最后兜底
如果只做 prompt,不做 schema 和 validator,Workbench 最终只会退化成“更漂亮的 Markdown 容器”。
## 7. 运行时服务设计
## 7.1 新增服务
建议新增:
- `src-tauri/src/services/artifact_prompt_service.rs`
- `src-tauri/src/services/artifact_document_service.rs`
- `src-tauri/src/services/artifact_document_validator.rs`
- 可选 `src-tauri/src/services/artifact_generation_orchestrator.rs`
如果同步建设 `aster-rust`,则建议把运行时通用能力下沉为独立 runtime 模块:
- `/Users/coso/Documents/dev/ai/astercloud/aster-rust/crates/aster/src/runtime/thread.rs`
- `/Users/coso/Documents/dev/ai/astercloud/aster-rust/crates/aster/src/runtime/turn.rs`
- `/Users/coso/Documents/dev/ai/astercloud/aster-rust/crates/aster/src/runtime/item.rs`
- `/Users/coso/Documents/dev/ai/astercloud/aster-rust/crates/aster/src/runtime/event.rs`
- `/Users/coso/Documents/dev/ai/astercloud/aster-rust/crates/aster/src/runtime/prompt.rs`
- `/Users/coso/Documents/dev/ai/astercloud/aster-rust/crates/aster/src/runtime/schema.rs`
这部分是框架层远期形态参考,不构成 Lime 当前仓库的直接实施清单。
职责:
### `artifact_prompt_service`
- 组装 Artifact 相关 prompt 层
- 输出 stage1/stage2/rewrite 的最终 system prompt
- 记录 prompt stage 结果
### `artifact_document_service`
- 持久化 `ArtifactDocument`
- 管理版本、sources、导出记录
- 提供读模型给右侧 Workbench
### `artifact_document_validator`
- 做 schema 校验
- 做 repair
- 输出 telemetry 与错误信息
### `artifact_generation_orchestrator`
- 负责编排 Stage 1 / Stage 2
- 连接 timeline 与 store
- 负责失败回退
## 7.2 建议新增事件
建议新增以下运行时事件,既供前端消费,也供 timeline 投影:
- `artifact_intent_resolved`
- `artifact_stage_started`
- `artifact_stage_completed`
- `artifact_validation_repaired`
- `artifact_validation_failed`
- `artifact_version_persisted`
- `artifact_ready_for_render`
## 8. 前端工作台设计
## 8.1 右侧主工作台壳层
建议新增 `ArtifactWorkbenchShell`,统一承载:
- 阅读态
- 编辑态
- 版本条
- source drawer
- diff 入口
- 导出入口
### 阅读态
- 主渲染面
- 使用 block renderer
- `rich_text` block 才接 Tiptap static renderer
### 编辑态
- 仅对 `rich_text` block 进入 Tiptap 编辑
- 结构型 block 走专用编辑表单或轻量编辑器
### 来源抽屉
- 展示 `sourceId -> locator`
- 可跳转到 timeline item / web result / file path
## 8.2 与现有模块的关系
| 现有模块 | 蓝图定位 |
|------|------|
| `workbenchPreview.tsx` | 过渡期入口壳 |
| `WorkspaceCanvasContent.tsx` | 右侧容器事实源 |
| `ArtifactRenderer.tsx` | 兼容层入口,后续可下沉为 block renderer 包装器 |
| `NotionEditor.tsx` | `rich_text` block 编辑器 |
| `AgentThreadTimeline.tsx` | 过程和证据面 |
## 9. 数据与导出
## 9.1 产品层事实源
唯一长期事实源:
- `ArtifactDocument JSON`
附属快照:
- `editor_payload_snapshot`
- `markdown_snapshot`
- `render_manifest`
规则:
- 产品逻辑只依赖 `ArtifactDocument`
- 编辑器恢复依赖 `editor_payload_snapshot`
- 导出依赖 `markdown_snapshot` 或渲染适配
## 9.2 导出策略
v1 支持:
- Markdown
- HTML
- PDF
- JSON
其中:
- Markdown 面向可复用文本
- HTML/PDF 面向阅读和交付
- JSON 面向版本、调试、二次处理
## 10. 失败与回退
## 10.1 Stage 1 失败
- 回退为普通消息链路
- timeline 标记本次未进入 Artifact 主链
## 10.2 Stage 2 失败
- 仍创建 ArtifactDocument
- 状态记为 `failed`
- 保留最小 fallback 内容:
- 一个 `rich_text(markdown)` block
- 错误诊断进入 timeline / telemetry
## 10.3 validator 失败
- 优先 repair
- repair 后仍失败则降级为 `rich_text(markdown)`
- 不允许把不合法结构直接渲染成 ready
## 11. 验收标准
满足以下条件,才算架构蓝图落地正确:
1. 右侧 Workbench 成为高价值交付物默认展示面。
2. system prompt 的 Artifact 规则由后端统一组装,不由前端页面拼接。
3. Stage 1 与 Stage 2 的输出边界清晰,timeline 能区分。
4. `ArtifactDocument JSON` 与 `Tiptap/ProseMirror JSON` 的层级关系明确,不混淆。
5. 研究类交付物缺 source 时不会直接进入 ready。
6. 消息区不再重复整篇 Artifact。
7. `blueprint` 不承担 Artifact 主链的根抽象。
8. turn 级 output schema 已纳入主链,而不是只靠 prompt。
## 12. 本蓝图刻意不做
1. 不做无限开放的 block DSL。
2. 不做任意页面搭建器。
3. 不做完整协同编辑协议。
4. 不做全屏页优先的主导航改造。
5. 不做所有内容类型一次性统一迁移。
## 13. 实施顺序建议
建议严格按以下顺序推进:
1. 实现 `artifact_prompt_service` 与 prompt marker
2. 实现 Stage 1 / Stage 2 编排
3. 实现 validator / repair
4. 实现 `ArtifactWorkbenchShell`
5. 接入 3 个核心结构块:
- `hero_summary`
- `callout`
- `table`
6. 最后再接入 source drawer、diff、导出
原因:
**没有 prompt 合同和 validator,WorkBench 只会成为更漂亮的 Markdown 容器。**
@@ -0,0 +1,777 @@
# ArtifactDocument v1 协议草案
> 状态:提案
> 更新时间:2026-03-24
> 运行时边界:turn metadata、prompt 组装入口、runtime output schema 注入链以 `docs/roadmap/lime-conversation-execution-efficiency-roadmap.md` 为准;本文只定义 `ArtifactDocument v1` 的产品层协议与校验映射
> 依赖文档:`docs/roadmap/artifacts/roadmap.md`
> 架构蓝图:`docs/roadmap/artifacts/architecture-blueprint.md`
> 分层边界:`docs/roadmap/artifacts/framework-boundary.md`
> Prompt 合同:`docs/roadmap/artifacts/system-prompt-and-schema-contract.md`
> 目标:定义 Lime 高配版 Artifact Workbench 的第一版正式协议,包括产品层对象模型、模型输出契约、校验修复规则与渲染映射
## 1. 结论先行
本协议锁定以下架构决策:
1. `ArtifactDocument JSON` 是产品层长期事实源。
2. `Tiptap / ProseMirror JSON` 只作为编辑器层载荷,主要存在于 `rich_text` block 内。
3. 模型不负责视觉样式,只负责语义结构。
4. 前端不直接渲染“任意 Markdown 长文”为最终交付面,而是渲染语义 block。
5. validator / repair 是主链路必备组件,不允许把模型原始输出直接当成可靠协议。
一句话概括:
**模型输出结构,系统校验结构,渲染器呈现结构。**
这里还要补一句边界声明:
**`ArtifactDocument v1` 是产品层 persisted snapshot,不是 Aster runtime 的 thread/turn/item 协议。**
## 2. 适用范围
`ArtifactDocument v1` 适用于以下高价值输出:
- 报告
- 研究总结
- roadmap
- PRD
- 方案对比
- 执行摘要
- 调研表格
- 多来源整合文档
不适用于:
- 纯聊天短答
- 普通代码片段
- 单张图片生成结果
- 浏览器实时会话帧流本身
这些内容仍可通过现有 `Artifact` 兼容层或其他工作台承载。
## 3. 设计原则
## 3.1 语义优先
协议描述“这是什么内容”,而不是“它长什么样”。
允许:
- `hero_summary`
- `table`
- `callout`
- `citation_list`
不允许:
- 自定义颜色值
- 自定义边距
- 自定义字体大小
- 自定义 CSS class
## 3.2 产品对象优先于编辑器对象
产品层要能表达:
- 版本
- 来源
- 执行绑定
- block 语义
- 导出
这些不应被编辑器内部树结构主导。
## 3.3 Flat But Typed
`v1` 采用**扁平有序 block 列表**,不做复杂嵌套布局系统。
原因:
1. 降低模型输出难度。
2. 降低 validator / repair 复杂度。
3. 降低 renderer 实现成本。
4. 足够支持 80% 的报告类场景。
## 3.4 可降级
任何 block 在渲染失败、校验失败或组件不存在时,都必须可降级到:
- `rich_text`
- 或纯文本 fallback
## 4. 顶层对象模型
## 4.1 ArtifactDocumentV1
```ts
export type ArtifactKind =
| "report"
| "roadmap"
| "prd"
| "brief"
| "analysis"
| "comparison"
| "plan"
| "table_report";
export type ArtifactStatus =
| "draft"
| "streaming"
| "ready"
| "failed"
| "archived";
export interface ArtifactDocumentV1 {
schemaVersion: "artifact_document.v1";
artifactId: string;
workspaceId?: string;
threadId?: string;
turnId?: string;
kind: ArtifactKind;
title: string;
status: ArtifactStatus;
language: "zh-CN";
summary?: string;
blocks: ArtifactBlockV1[];
sources: ArtifactSourceV1[];
metadata: ArtifactDocumentMetaV1;
}
export interface ArtifactDocumentMetaV1 {
theme?:
| "general"
| "document"
| "knowledge"
| "planning"
| "social-media";
audience?: string;
intent?: string;
generatedBy?: "agent" | "user" | "automation";
rendererHints?: {
density?: "comfortable" | "compact";
defaultExpandedSections?: string[];
};
sourceRunBinding?: {
threadId?: string;
turnId?: string;
itemIds?: string[];
};
exportHints?: {
preferredFormats?: Array<"md" | "html" | "pdf" | "json">;
};
}
```
## 4.2 顶层约束
1. `schemaVersion` 必须固定为 `artifact_document.v1`。
2. `title` 必须为非空字符串。
3. `blocks` 至少 1 个,建议不超过 40 个。
4. `sources` 可以为空,但如果文档声称“基于搜索/网页/文件”,则不应为空。
5. `language` 在 `v1` 固定为 `zh-CN`,避免多语言排版漂移。
## 5. Block 模型
## 5.1 通用字段
```ts
export interface ArtifactBlockBase {
id: string;
type: ArtifactBlockType;
sectionId?: string;
hidden?: boolean;
sourceIds?: string[];
}
export type ArtifactBlockType =
| "section_header"
| "hero_summary"
| "key_points"
| "rich_text"
| "callout"
| "table"
| "checklist"
| "metric_grid"
| "quote"
| "citation_list"
| "image"
| "code_block"
| "divider";
```
规则:
1. `id` 在同一文档内必须唯一。
2. `sourceIds` 只能引用 `sources[]` 中已存在的 id。
3. `sectionId` 只作归组标记,不引入嵌套 DOM 协议。
## 5.2 Block 定义
### A. `section_header`
用于开始一个新章节。
```ts
export interface SectionHeaderBlock extends ArtifactBlockBase {
type: "section_header";
title: string;
description?: string;
}
```
约束:
1. `title` 必填。
2. 文档首块不强制必须是 `section_header`。
### B. `hero_summary`
用于顶部摘要卡。
```ts
export interface HeroSummaryBlock extends ArtifactBlockBase {
type: "hero_summary";
eyebrow?: string;
title?: string;
summary: string;
highlights?: string[];
}
```
约束:
1. `summary` 必填,建议 60 到 220 字。
2. `highlights` 建议 2 到 5 项。
### C. `key_points`
用于快速结论列表。
```ts
export interface KeyPointsBlock extends ArtifactBlockBase {
type: "key_points";
title?: string;
items: string[];
}
```
约束:
1. `items` 至少 2 项,建议不超过 7 项。
### D. `rich_text`
通用正文块。
```ts
export interface RichTextBlock extends ArtifactBlockBase {
type: "rich_text";
contentFormat: "prosemirror_json" | "markdown";
content: unknown;
}
```
规则:
1. 长期建议以 `prosemirror_json` 为主。
2. `markdown` 只作为兼容输入与 repair fallback。
3. `rich_text` 是唯一允许承载大段连续正文的 block。
### E. `callout`
用于提醒、结论、风险、建议。
```ts
export interface CalloutBlock extends ArtifactBlockBase {
type: "callout";
tone: "info" | "success" | "warning" | "danger" | "neutral";
title?: string;
body: string;
}
```
### F. `table`
```ts
export interface TableBlock extends ArtifactBlockBase {
type: "table";
title?: string;
columns: string[];
rows: string[][];
}
```
约束:
1. `columns` 至少 2 列。
2. 每行单元格数量应与列数一致。
3. 单元格内容必须是字符串,`v1` 不支持复杂嵌套对象。
### G. `checklist`
```ts
export interface ChecklistBlock extends ArtifactBlockBase {
type: "checklist";
title?: string;
items: Array<{
id: string;
text: string;
state: "todo" | "doing" | "done";
}>;
}
```
### H. `metric_grid`
```ts
export interface MetricGridBlock extends ArtifactBlockBase {
type: "metric_grid";
title?: string;
metrics: Array<{
id: string;
label: string;
value: string;
note?: string;
tone?: "neutral" | "success" | "warning" | "danger";
}>;
}
```
约束:
1. 建议 2 到 8 个 metric。
2. `value` 一律字符串化,避免渲染层处理 number/date 混乱。
### I. `quote`
```ts
export interface QuoteBlock extends ArtifactBlockBase {
type: "quote";
text: string;
attribution?: string;
}
```
### J. `citation_list`
```ts
export interface CitationListBlock extends ArtifactBlockBase {
type: "citation_list";
title?: string;
items: Array<{
sourceId: string;
note?: string;
}>;
}
```
### K. `image`
```ts
export interface ImageBlock extends ArtifactBlockBase {
type: "image";
url: string;
alt?: string;
caption?: string;
}
```
### L. `code_block`
```ts
export interface CodeBlock extends ArtifactBlockBase {
type: "code_block";
language?: string;
title?: string;
code: string;
}
```
### M. `divider`
```ts
export interface DividerBlock extends ArtifactBlockBase {
type: "divider";
}
```
## 5.3 Block 联合类型
```ts
export type ArtifactBlockV1 =
| SectionHeaderBlock
| HeroSummaryBlock
| KeyPointsBlock
| RichTextBlock
| CalloutBlock
| TableBlock
| ChecklistBlock
| MetricGridBlock
| QuoteBlock
| CitationListBlock
| ImageBlock
| CodeBlock
| DividerBlock;
```
## 6. Source 模型
```ts
export type ArtifactSourceType =
| "web"
| "file"
| "tool"
| "message"
| "search_result";
export interface ArtifactSourceV1 {
id: string;
type: ArtifactSourceType;
label: string;
locator?: {
url?: string;
path?: string;
lineStart?: number;
lineEnd?: number;
toolCallId?: string;
messageId?: string;
};
snippet?: string;
reliability?: "primary" | "secondary" | "derived";
}
```
规则:
1. `label` 必填。
2. `snippet` 为可选摘录,不是完整内容镜像。
3. `locator` 用于跳转,不要求所有字段齐全。
## 7. Version 模型
`v1` 不要求把版本协议塞进文档正文,但必须预留独立版本对象:
```ts
export interface ArtifactVersionRecordV1 {
id: string;
artifactId: string;
versionNo: number;
documentSnapshot: ArtifactDocumentV1;
editorPayloads?: Record<string, unknown>;
markdownSnapshot?: string;
summary?: string;
createdBy: "agent" | "user" | "automation";
createdAt: string;
}
```
## 8. 模型输出契约
## 8.1 模型不应该直接输出什么
禁止作为正式协议输出:
- 任意 CSS
- 任意 HTML 模板
- 组件名 + 样式参数混合
- 整篇只靠纯自然语言长文承载结构
## 8.2 模型应该输出什么
模型应输出以下两类之一:
### 模式 A:一次性草稿
适用于:
- 首次生成
- 非流式离线生成
- 简单交付物
输出对象:
```ts
export interface ArtifactDraftEnvelope {
type: "artifact_document_draft";
document: ArtifactDocumentV1;
}
```
### 模式 B:增量操作
适用于:
- 流式生成
- 多轮修订
- 局部改写
输出对象:
```ts
export type ArtifactOpEnvelope =
| {
type: "artifact.begin";
artifactId: string;
kind: ArtifactKind;
title: string;
}
| {
type: "artifact.meta.patch";
artifactId: string;
patch: Partial<ArtifactDocumentMetaV1>;
}
| {
type: "artifact.source.upsert";
artifactId: string;
source: ArtifactSourceV1;
}
| {
type: "artifact.block.upsert";
artifactId: string;
block: ArtifactBlockV1;
}
| {
type: "artifact.block.remove";
artifactId: string;
blockId: string;
}
| {
type: "artifact.complete";
artifactId: string;
summary?: string;
}
| {
type: "artifact.fail";
artifactId: string;
reason: string;
};
```
## 8.3 推荐生成流程
推荐两段式:
1. `artifact_intent`
- 判断是否需要 Artifact
- 判断文档 kind
- 判断是否需要 sources
2. `artifact_document_draft` 或 `artifact ops`
- 正式生成结构化内容
这样比“一次自然语言长回复”更稳定。
## 8.4 模型约束规则
提示词应明确要求模型:
1. 优先输出有限 block 集,不要发明新 block 类型。
2. 每个 block 只承载单一职责。
3. 所有来源型结论必须绑定 `sourceIds` 或 `citation_list`。
4. 不要重复把整篇文档再输出到聊天消息区。
5. block id 必须稳定且语义化,如 `hero`, `market-table`, `next-steps`。
6. 需要大段正文时,使用 `rich_text` block,而不是拆成很多碎 paragraph block。
## 9. Validator 规则
## 9.1 文档级校验
必须校验:
1. `schemaVersion` 是否匹配。
2. `title` 是否存在。
3. `kind` 是否在白名单中。
4. `blocks` 是否非空。
5. `block.id` 是否唯一。
6. `sourceIds` 是否都可解析。
## 9.2 Block 级校验
### `hero_summary`
- `summary` 必填
- `highlights` 非字符串项直接丢弃
### `table`
- `columns.length >= 2`
- 每行长度与列数对齐
### `checklist`
- item `state` 只能是 `todo / doing / done`
- `text` 为空则删除该项
### `metric_grid`
- `label` 与 `value` 必填
- 超过 8 项时保留前 8 项
### `citation_list`
- `sourceId` 必须存在于 `sources`
### `rich_text`
- `contentFormat` 只能是 `prosemirror_json` 或 `markdown`
- `content` 不能为空
## 9.3 Source 级校验
1. `id` 必须唯一。
2. `label` 必填。
3. `type` 必须在白名单中。
4. `snippet` 超长时截断,不作为正文存档。
## 10. Repair 策略
validator 失败时,不应直接放弃整份文档。
`v1` 采用保守修复策略:
## 10.1 文档级 repair
1. 缺 `title`
- 用首个 `section_header.title`
- 再不行用任务标题
- 再不行用 `未命名交付物`
2. 缺 `blocks`
- 将原始文本包成一个 `rich_text(markdown)` block
3. 重复 block id
- 自动追加稳定后缀,如 `-2`、`-3`
## 10.2 Block 级 repair
1. 不支持的 block type
- 降级为 `rich_text(markdown)`
2. `table` 行列不齐
- 自动补空字符串到齐平
3. `citation_list` 引用了不存在的 source
- 删除非法项
- 若最终为空,整个 block 删除
4. `metric_grid` 非法 value
- 强制转字符串
5. `callout.body` 为空
- 降级为 `rich_text(markdown)`
6. `rich_text.prosemirror_json` 无法解析
- 降级为 `rich_text(markdown)`
## 10.3 最终 fallback
如果整份文档经过 repair 仍不合法:
1. 保留 `artifactId / kind / title`
2. 将模型原始输出包成单个 `rich_text(markdown)` block
3. 标记 `metadata.rendererHints.density = "comfortable"`
4. 在 telemetry 中记录 repair failure
## 11. Renderer 映射
| Block 类型 | 建议组件 | 失败回退 |
|------|------|------|
| `section_header` | `ArtifactSectionHeader` | `rich_text` |
| `hero_summary` | `ArtifactHeroSummaryCard` | `rich_text` |
| `key_points` | `ArtifactKeyPointsList` | `rich_text` |
| `rich_text` | `ArtifactRichTextRenderer` | 纯文本 |
| `callout` | `ArtifactCallout` | `rich_text` |
| `table` | `ArtifactStructuredTable` | `rich_text` |
| `checklist` | `ArtifactChecklist` | `rich_text` |
| `metric_grid` | `ArtifactMetricGrid` | `rich_text` |
| `quote` | `ArtifactQuote` | `rich_text` |
| `citation_list` | `ArtifactCitationList` | 删除 |
| `image` | `ArtifactImageBlock` | 占位图 |
| `code_block` | 复用现有 `CodeRenderer` | `rich_text` |
| `divider` | `ArtifactDivider` | 删除 |
## 11.1 RichText Renderer 约束
`ArtifactRichTextRenderer` 只负责:
- 解析 `rich_text` 内容
- 渲染内联 mark
- 渲染段落、标题、列表、引用、代码
不负责:
- 指标卡
- 提示框
- 表格型业务块
- 来源列表
这些必须由业务 block 组件承载。
## 12. Prompt 模板约束
本节只定义 `ArtifactDocument v1` 需要的结构约束,不重新定义 runtime prompt 入口。
也就是说:
- “哪些 turn 进入 Artifact 主链”
- “turn metadata 如何归一化”
- “output schema 在哪里注入”
这些执行层问题仍以 `docs/roadmap/lime-conversation-execution-efficiency-roadmap.md` 为准。
系统提示词应增加以下硬约束:
1. 当用户请求的是报告、roadmap、PRD、比较、研究、整合总结时,优先输出 `ArtifactDocument v1`。
2. 先给 `hero_summary` 或 `key_points`,再给主体 block。
3. 对来源敏感内容必须附带 source。
4. 不要输出 CSS、HTML class、视觉说明。
5. 不要在消息正文里重复完整文档,只输出简短说明和下一步。
## 13. 仓库落地建议
建议新增:
```text
src/lib/artifact-document/schema.ts
src/lib/artifact-document/validator.ts
src/lib/artifact-document/repair.ts
src/lib/artifact-document/adapters/tiptap.ts
src/lib/artifact-document/examples.ts
```
职责建议:
- `schema.ts`:类型与 zod/schema 定义
- `validator.ts`:协议合法性检查
- `repair.ts`:保守修复逻辑
- `adapters/tiptap.ts`:`rich_text` 与 Tiptap 互转
- `examples.ts`:供 prompt / tests / storybook 复用的样例
后端建议新增:
```text
src-tauri/src/services/artifact_document_service.rs
src-tauri/src/services/artifact_document_validator.rs
```
## 14. 本版刻意不做
1. 不做复杂栅格布局协议。
2. 不做任意嵌套 section tree。
3. 不做通用组件 DSL。
4. 不做样式 token 下发。
5. 不做完全开放的自定义 block 注册。
`v1` 的目标是稳定,不是无限灵活。
## 15. 最终建议
如果你们要把“漂亮回复”真正做成产品能力,实施顺序应该是:
1. 先锁定 `ArtifactDocument v1`
2. 再做 validator / repair
3. 再做 renderer registry
4. 再做模型输出约束
5. 最后才是视觉细化
原因很简单:
**没有协议,渲染只是化妆。**
@@ -0,0 +1,356 @@
# Lime Artifact Workbench 与 Aster Runtime 分层边界
> 状态:提案
> 更新时间:2026-03-24
> 运行时边界:凡涉及发送边界、runtime metadata、Team 委派、Op/Event 收口、状态同步,均以 `docs/roadmap/lime-conversation-execution-efficiency-roadmap.md` 为准;本文只定义长期框架分层原则与远期边界
> 关联文档:
> - `docs/roadmap/artifacts/roadmap.md`
> - `docs/roadmap/artifacts/architecture-blueprint.md`
> - `docs/roadmap/artifacts/system-prompt-and-schema-contract.md`
> 目标:明确 Lime 产品层、Aster 框架层、Blueprint 规划模块三者的长期职责边界,避免后续把产品协议、任务规划、运行时编排混成一团
## 1. 结论先行
本文件锁定以下分层判断:
1. **Lime 持有产品层交付物模型**
- `ArtifactDocument`
- Workbench UI
- block renderer / editor / source drawer / export
- `report / roadmap / prd / analysis / comparison` 这些产品语义
2. **Aster 应补齐通用 runtime substrate**
- `thread / turn / item / event`
- prompt 组装管线
- turn 级 `output schema`
- approval / elicitation / interrupt / retry
- 运行时状态持久化与事件流
3. **Blueprint 不是 Artifact Workbench 的根抽象**
- Blueprint 应定位为长期规划与执行模块
- 适合承接需求蓝图、任务树、TDD loop、worker coordination
- 不适合作为 Lime 文档交付协议或聊天主运行时
4. **Codex 值得参考的是运行时协议,不是它的 artifact 名字**
- `codex` 的强项在 `turn/start + outputSchema + item events + thread state`
- `codex-artifacts` 则是本地 JS runtime 的 presentation/spreadsheet 工具,不是报告文档协议
一句话总结:
**Lime 负责“交付物产品”,Aster 负责“代理运行时”,Blueprint 负责“长周期规划”。**
## 2. 事实依据
## 2.1 Lime 现役事实
来自以下文件:
- `src-tauri/src/commands/aster_agent_cmd/runtime_turn.rs`
- `src-tauri/src/commands/aster_agent_cmd/prompt_context.rs`
- `src-tauri/src/services/memory_profile_prompt_service.rs`
- `src-tauri/src/services/web_search_prompt_service.rs`
- `src/components/agent/chat/hooks/agentRuntimeAdapter.ts`
可确认:
1. Lime 已经有以 turn 为单位的运行链路。
2. system prompt 已经是后端分层组装,而不是纯前端拼接。
3. 前端只需要透传结构化 metadata,就可以驱动不同运行策略。
4. Lime 当前缺的是正式 Artifact 产品协议与工作台闭环,而不是重新发明 thread/turn 的概念。
## 2.2 Aster Blueprint 现役事实
来自以下文件:
- `/Users/coso/Documents/dev/ai/astercloud/aster-rust/crates/aster/src/blueprint/README.md`
- `/Users/coso/Documents/dev/ai/astercloud/aster-rust/crates/aster/src/blueprint/types.rs`
- `/Users/coso/Documents/dev/ai/astercloud/aster-rust/crates/aster/src/blueprint/task_tree_manager.rs`
- `/Users/coso/Documents/dev/ai/astercloud/aster-rust/crates/aster/src/blueprint/worker_executor.rs`
可确认:
1. Blueprint 的中心对象是 `Blueprint / TaskTree / TaskNode / Checkpoint / WorkerAgent`。
2. 它的 `ArtifactType` 是 `file / patch / command`,明显偏代码执行产物。
3. prompt 模板围绕 TDD 测试、写代码、重构,不围绕正式交付文档。
4. Timeline 也是任务执行事件,不是聊天交付事件。
因此:
**Blueprint 与 Artifact Workbench 存在概念相邻,但语义核心不同。**
## 2.3 Codex 现役事实
来自以下文件:
- `/Users/coso/Documents/dev/rust/codex/codex-rs/app-server/README.md`
- `/Users/coso/Documents/dev/rust/codex/codex-rs/app-server-protocol/schema/typescript/v2/TurnStartParams.ts`
- `/Users/coso/Documents/dev/rust/codex/codex-rs/app-server/src/thread_state.rs`
- `/Users/coso/Documents/dev/rust/codex/codex-rs/codex-api/src/common.rs`
- `/Users/coso/Documents/dev/rust/codex/codex-rs/core/src/memories/phase1.rs`
- `/Users/coso/Documents/dev/rust/codex/codex-rs/artifacts/README.md`
可确认:
1. `turn/start` 支持 turn 级 `outputSchema`。
2. app-server 明确定义了 `thread / turn / item / item delta / approval / interruption` 协议。
3. 内部已经把结构化输出作为 runtime 能力,而不是业务页面私货。
4. `codex-artifacts` 只是受控 JS artifact runtime,不是文档产品协议。
因此:
**Codex 给我们的参考点,是 runtime substrate 的形状。**
## 3. 分层总图
```mermaid
flowchart TB
User["用户"]
subgraph Lime["Lime 产品层"]
UI["Conversation + Artifact Workbench + Inspector"]
Product["ArtifactDocument / Source UX / Export UX"]
Policy["Artifact Kind / Source Policy / UX Rules"]
end
subgraph Aster["Aster Runtime 层"]
Thread["Thread / Turn / Item"]
Events["Runtime Event Bus"]
Prompt["Prompt Composer"]
Schema["Output Schema / Validator Contract"]
Control["Approval / Elicitation / Interrupt / Retry"]
Persist["Runtime State Store"]
end
subgraph Planning["Blueprint 模块"]
BP["Blueprint"]
Tree["TaskTree / Checkpoint"]
Worker["Worker / TDD / Sandbox"]
end
subgraph Model["模型与工具层"]
LLM["LLM"]
Tools["Tools / Web / File / Exec"]
end
User --> UI
UI --> Product
UI --> Policy
Product --> Thread
Policy --> Prompt
Thread --> Events
Prompt --> Schema
Schema --> LLM
LLM --> Tools
Tools --> Events
Events --> Persist
Events --> Product
Thread -. optional planning handoff .-> BP
BP --> Tree
Tree --> Worker
Worker --> Events
```
## 4. 职责边界表
| 能力 | Lime 产品层 | Aster Runtime 层 | Blueprint 模块 |
|------|------|------|------|
| 线程 / 回合 / item 生命周期 | 不持有根定义 | 持有 | 可消费 |
| turn 级 `output schema` | 提供业务 schema | 持有执行通道 | 不负责 |
| prompt 分层组装 | 提供 Artifact 业务片段 | 持有总组装器 | 仅自有规划 prompt |
| 正式交付物对象 | 持有 `ArtifactDocument` | 不持有业务语义 | 不持有 |
| block renderer / editor | 持有 | 不持有 | 不持有 |
| source policy | 持有业务规则 | 负责执行与校验挂钩 | 不持有 |
| approvals / elicitation / interrupt | UI 展示与交互 | 持有协议与状态 | 可复用 |
| task tree / TDD loop | 仅作为某类 Artifact 来源 | 可桥接 | 持有 |
| file / patch / command 代码产物 | 只做引用展示 | 可流转 | 持有 |
## 5. 为什么 Blueprint 不应直接接管 Artifact Workbench
## 5.1 对象模型不匹配
Blueprint 的产物中心是:
- 模块
- 任务
- 测试
- patch
- command
Lime Artifact Workbench 的产物中心是:
- 文档
- block
- source
- version
- reading/edit/export
这不是同一类对象。
## 5.2 生命周期不匹配
Blueprint 关注:
- 立项
- 拆任务
- 执行
- 回滚
- 验收
Artifact Workbench 关注:
- 生成草稿
- 结构校验
- 工作台阅读
- 局部改写
- 版本 diff
- 导出分享
前者是执行治理,后者是交付体验。
## 5.3 prompt 不匹配
Blueprint 的 prompt 语言天然偏:
- 写测试
- 写实现
- 修复错误
- 重构代码
Artifact Workbench 要控制的是:
- 交付物 kind
- source policy
- block plan
- report / roadmap / comparison 结构
直接混用会让 runtime 概念污染产品协议。
## 6. 应从 Codex 借鉴什么
## 6.1 必须借鉴
1. **turn 级输出 schema**
- 每次调用都能带一个明确的结构目标
- 不把“结构化输出”写死成某个固定产品
2. **thread / turn / item / delta 协议**
- UI 能增量渲染
- 持久化层能重建历史
- 工具、计划、消息、文件改动可归一化
3. **独立的事件流**
- `turn_started`
- `item_started`
- `item_delta`
- `item_completed`
- `turn_completed`
4. **approval / elicitation / interrupt 是 runtime 一等公民**
- 不能散落在某个单独产品页面中硬编码
## 6.2 不应照搬
1. 不照搬 `codex-artifacts` 的 JS runtime 工具模型。
2. 不照搬终端/TUI 的 UI 心智。
3. 不把 Lime 的文档协议退化成单一 `outputSchema` 结果对象。
因为 Lime 的核心仍然是:
**多轮对话中的正式交付物工作台。**
## 7. 建议中的 Aster Runtime 新边界
这里要明确:
- 本节描述的是 **Aster 框架层的目标形状参考**
- 不是 Lime 当前仓库的直接实施主计划
- 如果与 `docs/roadmap/lime-conversation-execution-efficiency-roadmap.md` 的当前迁移顺序、协议收口方式冲突,以后者为准
建议在 `aster-rust` 中,把通用 agent runtime 从 `blueprint` 旁边独立出来,而不是继续把所有能力堆进 `blueprint/`。
建议中的模块形态:
```text
crates/aster/src/runtime/
mod.rs
thread.rs
turn.rs
item.rs
event.rs
prompt.rs
schema.rs
approval.rs
persistence.rs
orchestration.rs
```
建议职责:
- `thread.rs`:线程与上下文边界
- `turn.rs`:turn 生命周期、输入、状态机
- `item.rs`:消息、plan、tool、artifact stage 等 item 定义
- `event.rs`:统一事件类型与 delta
- `prompt.rs`:分层 prompt composer
- `schema.rs`:turn 级输出 schema 注册与校验入口
- `approval.rs`:approval / elicitation / interrupt / retry
- `persistence.rs`:runtime state 存储
- `orchestration.rs`:Stage Runner、模型调用与失败恢复
## 8. Lime 与 Aster 的连接方式
本节时序图只表达长期职责连接,不单独定义 Lime 当前发送协议字段名。
建议 Lime 不直接自己实现第二套完整 runtime,而是成为 Aster runtime 的产品适配层:
```mermaid
sequenceDiagram
participant FE as Lime Frontend
participant App as Lime App Service
participant RT as Aster Runtime
participant LLM as Model
participant WB as Artifact Workbench
FE->>App: submit_turn(message + artifact metadata)
App->>RT: turn.start(input + prompt layers + output schema refs)
RT->>LLM: response request
LLM-->>RT: item deltas / final output
RT-->>App: turn events + item events + validated result
App-->>WB: ArtifactDocument / timeline / diff
WB-->>FE: render delivery view
```
这里的关键是:
- Lime 提供业务语义和工作台
- Aster 提供运行时协议和编排
- 两者通过 turn metadata、schema id、event taxonomy 对接
- 但 Lime 当前仓库里的实际发送边界和 runtime 收口步骤,仍按执行效率路线图推进
## 9. 实施顺序建议
本节属于框架层远期演进建议,不覆盖 Lime 当前仓库已确定的 P1 / P2 / P3 / P4 执行顺序。
## Phase A:先立 runtime 边界
- 在文档和接口层确认 Aster runtime 与 Blueprint 分家
- 定义 `thread / turn / item / event / schema`
## Phase B:再接 Artifact 主链
- Lime 将 Stage 1 / Stage 2 接到 Aster runtime turn
- 引入 Artifact 专用 output schema
## Phase C:最后接 Blueprint
- 仅在需要“长周期规划 / 多 worker 执行”时,把 Blueprint 作为特殊 item 或 planning capability 接入
- 不让 Blueprint 接管普通 report / prd / roadmap 生成
## 10. 最终决策
长期最稳的架构不是:
**Blueprint 不断膨胀,最后既当聊天 runtime,又当 Artifact 协议,又当任务执行器。**
长期最稳的架构应该是:
**Codex 式 runtime substrate + Blueprint 式 planning module + Lime 式 artifact product layer。**
+903
View File
@@ -0,0 +1,903 @@
# Lime 高配版 Artifacts 路线图
> 状态:进行中,P1 / P2 已落地,P3 已闭环,rewrite typed patch 合同已落地
> 更新时间:2026-03-25
> 运行时边界:发送边界、runtime metadata、Team 委派、协议瘦身以 `docs/roadmap/lime-conversation-execution-efficiency-roadmap.md` 为准;本文只定义 Artifact 产品层与 Workbench 主线
> 目标:把 Lime 从“能显示文件/画布的聊天工作台”升级为“交付物优先的 Artifact Workbench”,让回复不再只是普通 Markdown,而是可扫描、可编辑、可版本化、可复用的正式产物
>
> 配套文档:
> - `docs/roadmap/artifacts/architecture-blueprint.md`
> - `docs/roadmap/artifacts/artifact-document-v1.md`
> - `docs/roadmap/artifacts/framework-boundary.md`
> - `docs/roadmap/artifacts/system-prompt-and-schema-contract.md`
## 1. 文档依据
本文不是从抽象概念反推,而是基于当前仓库现役实现与设计约束编写。
关键事实源:
- `docs/aiprompts/overview.md`
- `docs/aiprompts/design-language.md`
- `src/lib/artifact/types.ts`
- `src/lib/artifact/parser.ts`
- `src/components/artifact/ArtifactRenderer.tsx`
- `src/components/artifact/ArtifactToolbar.tsx`
- `src/components/agent/chat/components/MarkdownRenderer.tsx`
- `src/components/agent/chat/hooks/useArtifactDisplayState.ts`
- `src/components/agent/chat/components/AgentThreadTimeline.tsx`
- `src/components/agent/chat/workspace/workbenchPreview.tsx`
- `src/components/agent/chat/workspace/WorkspaceCanvasContent.tsx`
- `src/components/content-creator/core/CanvasContainer/CanvasContainer.tsx`
- `src/components/content-creator/canvas/document/DocumentRenderer.tsx`
- `src/components/content-creator/canvas/document/editor/NotionEditor.tsx`
- `src-tauri/src/services/agent_timeline_service.rs`
从这些事实源可以确认:
1. Lime 已经是 `Artifact First` 方向,而不是纯聊天产品。
2. 当前前端已经具备 `ArtifactRenderer + CanvasWorkbench + Timeline + Tiptap 编辑器` 这四块关键底座。
3. 当前 Artifact 系统仍以“文件快照/Markdown 内容”作为主要载体,还不是“结构化交付物协议”。
4. 当前回复的美观度问题,本质不是“模型不会写”,而是“产物协议、渲染层、交互层还没有真正收敛成一个系统”。
## 1.1 当前已落地能力
以下链路已经在当前仓库进入实现态:
1. `runtime_turn` 已接入 Artifact 专属 prompt 组装服务。
2. Artifact 回合已支持 turn-level `output_schema` 注入,不再只依赖 prompt hint。
3. 后端已具备 `ArtifactDocument v1` 的 validator / repair / fallback / workspace 落盘能力。
4. Timeline snapshot metadata 已可回灌 `artifactDocument`,前端在 `content` 为空时也能直接渲染结构化文档。
5. 前端已落地最小 `artifact-protocol` 壳层,用于统一 runtime metadata 中的 `artifactDocument` 与 `artifact_path(s)` 读取合同。
6. 后端已支持最小 `artifact_ops` 增量协议,可把 `artifact.upsert_block / attach_source / finalize_version` 等操作应用到已有 `ArtifactDocument` 并生成新版本。
7. 右侧已接入最小 `ArtifactWorkbenchShell`,包含阅读面与 `概览 / 来源 / 版本 / 差异` inspector。
8. 当前版本已支持最小 block diff 摘要,以及来源项 / 差异项到文档 block 的 Workbench 内跳转。
9. `rewrite` 已把 `artifact_target_block_id` 贯通到 prompt / output schema / ops apply / persist 链路,非目标 block 的 op 会在运行时被忽略并记录 issue。
10. `rewrite` 现已支持专用 `artifact_rewrite_patch` envelope,并保留 `artifact_ops` 兼容回退,用于逐步收紧模型输出合同。
这意味着当前主线已经从“只有路线图”推进到“结构合同 + 版本快照 + Workbench inspector 闭环”。当前仍然属于后续阶段的,主要是更细粒度的 typed rewrite patch 合同,以及编辑态 / 展示态 / 导出态的进一步同源。
## 2. 现状判断
## 2.1 Lime 已经具备的能力
- 有聊天主入口与工作台分栏能力,支持右侧预览区。
- 有 Artifact 类型系统、解析器、统一渲染入口、工具栏与列表。
- 有 Document Canvas 与 Tiptap 编辑器,可承载更高级的文档编辑体验。
- 有 Agent Timeline,可记录 turn、item、artifact snapshot、warning、error。
- 有 Workspace 概念,可作为 Artifact 的上下文边界与持久化边界。
这说明 Lime 不需要再造第二套“文档产品”,而是要把现有能力从“散件”收敛成“Artifact Workbench”。
## 2.2 当前短板
当前体验之所以还不够像 Ribbi / Manus / Claude Artifacts 的高配版本,主要有五个结构性问题:
### 1) 回复仍以消息文本为主,Artifact 只是附属物
`MarkdownRenderer.tsx` 负责把 assistant 文本渲染成较好的 Markdown,但主心智仍然是“消息正文”。
这会导致:
- 模型把重要内容写在消息里,而不是交付区
- 视觉上仍然像聊天气泡,而不是正式报告
- 后续编辑、复用、导出、版本比较都不自然
### 2) Artifact 模型还是“文件/片段导向”,不是“结构化文档导向”
当前 `Artifact` 的核心字段是:
- `type`
- `title`
- `content`
- `meta`
这对代码块、HTML、Mermaid 足够,但对高质量报告类交付物不够。
缺的是:
- section / block 层级
- citations / references
- summary / scorecard / callout / table / checklist 等语义块
- 版本差异与局部 patch
### 3) Timeline、Canvas、Document Editor 还没有同源
当前:
- Timeline 记录的是过程事件
- Canvas 展示的是当前 artifact 预览
- DocumentCanvas 编辑的是内容画布
三者都与 Artifact 相关,但还没有统一到同一个交付物主模型。
### 4) 当前 parser 仍以 fence/markdown 提取为主
`src/lib/artifact/parser.ts` 现在主要做:
- ` ```artifact ... ` 提取
- 普通代码块推断
- plainText 与 artifact 分离
这适合兼容模式,不适合作为高配版的长期事实源。
高配版必须从“解析文本里有什么 artifact”升级为“运行时明确产出什么 artifact block”。
### 5) 编辑态与展示态还不是一个产品闭环
当前有 Tiptap 编辑器,但它主要存在于 `document canvas` 内。
高配版需要的是:
- 先生成
- 再预览
- 再局部重写
- 再比对版本
- 再导出/复用
这些动作要围绕同一个 Artifact Document 完成,而不是在聊天、画布、文件之间来回切换。
## 3. 核心决策
## 3.1 产品主张
Lime 的高配版 Artifacts 应该明确采用:
**Chat for reasoning, Artifact for delivery。**
含义:
- 聊天区负责目标澄清、任务推进、过程解释、追问与协作
- Artifact Workbench 负责正式产物的创建、阅读、编辑、对比、导出与沉淀
- Timeline 负责过程透明,而不是承担最终阅读面
换句话说:
**消息区不是最终作品区。**
## 3.2 长期事实源
长期统一到:
**结构化 Artifact Document + 版本化 Block Tree + 可编辑 Workbench**
而不是:
- 普通 Markdown 长文
- 单个大字符串 HTML
- 临时 artifact fence 解析结果
## 3.3 技术主栈决策
高配版建议采用:
**Tiptap / ProseMirror 作为主编辑引擎,但不作为顶层长期 canonical model。**
更准确地说:
- `ArtifactDocument JSON` 才是产品层长期事实源
- `Tiptap / ProseMirror JSON` 是编辑器层载荷与 rich_text block 的工作表示
- `Markdown / HTML / PDF` 是导出与分发表达
理由:
1. Tiptap / ProseMirror 非常适合富文本编辑、schema 约束、节点扩展、局部事务与协同增强。
2. 但它的 JSON 结构本质上贴近编辑器内部 schema,不适合作为整个平台的顶层产品对象。
3. Lime 的 Artifact 不只是富文本,还包括来源、评分块、表格块、执行绑定、浏览器会话引用、导出记录等领域对象。
4. 如果把这些全部硬塞进 ProseMirror 节点树,未来的迁移、查询、导出、跨端实现和协议演进成本会被放大。
因此建议采用四层模型:
- 兼容输入层:Markdown / artifact fence / 文件快照
- 运行时协议层:Artifact Parts / Block Ops
- 产品持久化层:ArtifactDocument JSON
- 编辑器载荷层:RichText Block 内可使用 Tiptap / ProseMirror JSON
## 3.4 框架层决策
在重新评估 `aster-rust blueprint` 与 `codex-rs` 之后,路线图增加一条硬决策:
**不要把 Artifact Workbench 直接建立在 Blueprint 抽象之上。**
更合适的长期分层是:
- Lime:产品层交付物与工作台
- Aster Runtime:通用 `thread / turn / item / event / output schema`
- Blueprint:可选的长周期 planning module
判断依据见:
- `docs/roadmap/artifacts/framework-boundary.md`
这条决策很关键,因为一旦把文档交付协议和任务树执行框架混在一起,后面每扩一种 Artifact 类型,都会反向污染 runtime。
## 4. 目标与非目标
## 4.1 总目标
为 Lime 建立一套统一的 Artifact Workbench,让高价值回复默认沉淀为:
`结构化交付物 -> 专用阅读面 -> 局部可编辑 -> 可版本比较 -> 可导出复用`
## 4.2 子目标
1. 让“报告、方案、规划、研究、执行摘要、表格型结论”默认进入 Artifact Workbench,而不是只停留在消息正文。
2. 让回复具备更强的视觉层级:摘要卡、提示框、表格、评分块、引用块、来源区、版本条。
3. 让 Artifact 在会话中持续增量更新,而不是每轮都生成一个新的孤岛文件。
4. 让编辑态、展示态、导出态围绕同一份 Artifact Document 运转。
5. 让 Service Skill、Automation、Browser Assist、Theme Workbench 的产物最终都能落到同一套 Artifact Workbench。
## 4.3 非目标
1. 不做通用网页搭建器。
2. 不在第一阶段做任意 React 组件执行沙箱。
3. 不让模型直接输出大量不受控 HTML 作为主协议。
4. 不重写现有全部 Canvas,只做收敛与增量替换。
5. 不把所有回复都强制转成 Artifact,短问答仍可保持轻量聊天。
## 5. 目标产品形态
## 5.1 三栏心智
高配版建议把主界面稳定为三种职责:
| 区域 | 主职责 | 说明 |
|------|------|------|
| Conversation | 对话、追问、任务推进 | 保留聊天心智,但弱化“大段正式正文” |
| Artifact Workbench | 阅读、编辑、比对、导出 | 正式交付面 |
| Timeline / Inspector | 过程、工具、来源、状态 | 可折叠的执行与证据面 |
这与当前 Lime 的工作台分栏方向一致,不需要推翻现有 UI 模式。
## 5.2 Artifact Workbench 的核心视图
每个 Artifact Document 至少支持五种视图:
1. `阅读视图`
- 报告式排版
- 强层级和可扫描性
2. `源码视图`
- Markdown / JSON / 原始块数据
3. `编辑视图`
- Tiptap 可编辑文档
4. `版本对比视图`
- 上一版本与当前版本差异
5. `来源视图`
- citations、搜索结果、文件引用、工具产物引用
## 5.3 回复升级规则
不是所有回复都进入高配 Artifact。
建议由运行时按任务意图决定:
| 场景 | 默认形态 |
|------|------|
| 简短问答 | 普通消息 |
| 研究、汇总、总结、方案、PRD、roadmap | Artifact Document |
| 表格、评分、对比、清单 | Artifact 内语义块 |
| 浏览器实时会话 | Browser Assist Artifact |
| 图片/海报/文档主题工作台 | Theme Canvas / Artifact Workbench |
判断原则:
- 有明确交付物时,Artifact 优先
- 需要多轮持续改写时,Artifact 优先
- 只是即时回答问题时,消息优先
## 6. 信息架构
## 6.1 核心对象模型
建议新增或收敛为以下产品对象:
### ArtifactDocument
正式交付物实体。
建议字段:
| 字段 | 说明 |
|------|------|
| `id` | Artifact 文档 ID |
| `threadId` | 所属 thread |
| `workspaceId` | 所属 workspace |
| `theme` | 主题域,如 general / document / social-media |
| `kind` | `report / plan / brief / table / dashboard / canvas` |
| `title` | 标题 |
| `status` | `draft / streaming / ready / failed / archived` |
| `currentVersionId` | 当前版本 |
| `sourceRunId` | 来源 turn/run |
| `deliveryMode` | `inline / docked / fullscreen / exported` |
### ArtifactVersion
文档版本实体。
建议字段:
| 字段 | 说明 |
|------|------|
| `id` | 版本 ID |
| `artifactId` | 所属文档 |
| `versionNo` | 递增版本号 |
| `documentSnapshot` | ArtifactDocument JSON 快照 |
| `editorPayloads` | 可选的编辑器层载荷快照,如 rich_text block 的 Tiptap JSON |
| `markdownSnapshot` | 兼容导出快照 |
| `summary` | 版本摘要 |
| `createdBy` | `agent / user / automation` |
| `createdAt` | 创建时间 |
### ArtifactBlock
文档内部结构块。
建议首批支持:
- `heading`
- `paragraph`
- `summary_card`
- `key_points`
- `callout`
- `table`
- `checklist`
- `score_grid`
- `quote`
- `citation_list`
- `image`
- `code_block`
- `divider`
### ArtifactSourceLink
来源绑定。
建议字段:
| 字段 | 说明 |
|------|------|
| `artifactId` | 文档 ID |
| `blockId` | 对应 block |
| `sourceType` | `web / file / tool / message / search_result` |
| `sourceRef` | 来源引用 |
| `label` | 显示名称 |
| `locator` | 行号、URL、toolCallId 等定位信息 |
### ArtifactRunBinding
交付物与执行过程的绑定关系。
建议字段:
| 字段 | 说明 |
|------|------|
| `artifactId` | 文档 ID |
| `threadId` | thread |
| `turnId` | turn |
| `itemId` | timeline item |
| `bindingType` | `primary_output / intermediate / exported` |
## 6.2 与现有 `Artifact` 的关系
当前 `src/lib/artifact/types.ts` 不应直接废弃,而应定位为:
- 兼容层 Artifact
- 流式展示与轻量渲染容器
高配版建议新增一层更长期的 `ArtifactDocument` 模型。
关系如下:
- `Artifact`:运行时 UI 容器
- `ArtifactDocument`:产品层正式交付物
- `ArtifactVersion`:持久化版本
- `ArtifactBlock`:结构化文档语义块
## 7. 协议设计
## 7.1 为什么要引入协议层
如果继续让模型只输出普通 Markdown,前端只能“尽量渲染好看”。
高配版需要的是:
- 模型明确声明自己在生成什么类型的交付物
- 前端知道哪些内容属于摘要卡、表格、结论、提醒、引用
- 后端能在流式过程中做版本记录与落盘
因此需要从“文本解析”升级为“结构化产物协议”。
但这里要注意:
**结构化产物协议属于 Lime 产品层,不等于 runtime 协议。**
runtime 协议更接近 `codex` 的做法:
- turn 级 `outputSchema`
- item lifecycle
- approval / elicitation / interrupt
- event stream
Artifact Workbench 应建立在这层稳定 runtime substrate 之上,而不是反过来把产品协议塞进框架层。
## 7.2 三层协议
### A. Message Parts 协议
用于聊天流中的即时显示。
建议 part 类型:
- `text`
- `reasoning_summary`
- `tool_call`
- `tool_result`
- `artifact_intent`
- `artifact_progress`
- `artifact_block`
- `citation`
这层用于:
- 消息区轻量回显
- Timeline 过程展示
- Workbench 流式创建状态
### B. Artifact Ops 协议
用于构建正式交付物。
建议操作:
- `artifact.create`
- `artifact.set_meta`
- `artifact.upsert_block`
- `artifact.reorder_blocks`
- `artifact.remove_block`
- `artifact.attach_source`
- `artifact.finalize_version`
- `artifact.fail`
每个 block 必须有稳定 `blockId`,这样才支持:
- 流式增量更新
- 局部重写
- 版本 diff
- 引用与块绑定
### C. Persisted Snapshot 协议
最终持久化为:
- `artifact_document_json`
- `editor_payload_snapshot`
- `markdown_snapshot`
- `render_manifest`
其中:
- `artifact_document_json` 是长期事实源
- `editor_payload_snapshot` 是编辑器层快照,不是产品层 canonical
- `markdown_snapshot` 负责兼容导出
- `render_manifest` 负责阅读态性能与缓存
## 7.3 与当前 parser 的关系
`src/lib/artifact/parser.ts` 应保留,但角色需要降级为:
### current
- 兼容旧模型输出
- 解析 fence/code block
- 在没有结构化协议时尽量抽出 artifact
### future
- 仅作为 fallback ingest
- 不再承担高配版主生成链路
## 8. 前端架构
## 8.1 Workbench Shell
建议新增统一的 `ArtifactWorkbenchShell`,作为右侧或全屏交付物容器。
应复用:
- `workbenchPreview.tsx`
- `WorkspaceCanvasContent.tsx`
- `ArtifactToolbar`
- `ArtifactRenderer`
但职责要更清晰:
- Shell 负责布局、视图切换、侧栏、版本条、来源抽屉
- Renderer 负责块渲染
- Editor 负责编辑
- Timeline/Inspector 负责过程与证据
## 8.2 阅读态渲染器
阅读态不建议继续只靠通用 Markdown CSS。
应改为:
**Artifact Block Renderer Registry -> 自定义 React 组件**
其中:
- 语义块直接走业务组件渲染
- rich_text block 可选使用 Tiptap Static Renderer
每个语义块对应稳定组件:
- 摘要卡
- 指标卡
- 对比表
- 提示框
- 评分矩阵
- 来源列表
这样才能做到:
- 风格稳定
- 留白稳定
- 层级稳定
- 多次生成看起来像同一产品,而不是不同模型的随机输出
## 8.3 编辑态
编辑态建议直接复用并扩展现有 `NotionEditor.tsx`:
- 支持块级选中
- 支持局部 AI 改写
- 支持引用插入
- 支持固定模板块
- 支持 slash command 插入语义块
不建议新起第二套富文本编辑器。
## 8.4 版本比较
高配版必须把“上一版/最新版”作为一等能力。
当前 `useArtifactDisplayState.ts` 已经有“上一版本占位”思路。
下一步应该升级为真正的版本系统:
- block diff
- 章节级变化高亮
- 用户确认采纳/回退
## 8.5 来源与证据层
漂亮的回复如果没有证据层,会变成只是“看起来专业”。
因此 Workbench 需要固定的来源面:
- 本地文件引用
- 搜索结果引用
- 网页来源
- tool 输出来源
- timeline item 引用
阅读态中可用上标或尾注形式呈现,点击后跳到右侧来源抽屉。
## 8.6 UI / UX 原则
遵守 `docs/aiprompts/design-language.md`,并针对 Artifact Workbench 补充以下原则:
1. 主表面使用实体白底,不用半透明磨砂主容器。
2. 正文排版优先中文阅读节奏,避免文档像英文博客模板。
3. 强调色只用于:
- 状态
- 关键结论
- 引导操作
4. 表格、提示框、指标卡必须来自统一组件,不允许模型自由拼样式。
5. 右侧阅读面优先长时间可读,不做营销风大横幅。
## 9. 后端与持久化
## 9.1 数据库建议
建议新增以下表:
### `artifact_documents`
- 文档主表
- 归属 workspace / thread / theme
### `artifact_versions`
- 版本表
- 保存 `artifact_document_json`、可选 `editor_payload_snapshot`、`markdown_snapshot` 与版本摘要
### `artifact_sources`
- block 到 source 的映射
### `artifact_exports`
- 导出记录
- 记录导出格式、路径、时间
### `artifact_run_bindings`
- 连接 timeline turn/item 与 artifact
## 9.2 文件系统策略
Lime 是本地优先产品,Artifact 应支持落盘,但不能写死平台路径。
要求:
1. 落盘路径通过 Workspace 或应用目录 API 解析。
2. 导出格式首期支持:
- Markdown
- HTML
- PDF
- JSON
3. 自动保存使用原子写入策略,避免写入中断造成损坏。
4. Windows/macOS 都走统一目录解析,不写死 `~/Library/...`。
## 9.3 与 Timeline 的关系
`src-tauri/src/services/agent_timeline_service.rs` 当前已能投影 `ArtifactSnapshot`。
高配版建议扩展为:
- timeline 记录过程
- artifact document 记录产物
- 两者通过 `artifact_run_bindings` 连接
原则:
- Timeline 不直接承担正式阅读面
- Artifact 不丢失来源过程
## 10. Agent 与编排策略
## 10.1 产物生成策略
高配版不建议一开始就拆成很多 formatter 子 agent。
首期先统一协议,再逐步增强编排。
建议顺序:
1. 先让主 agent 明确输出 `artifact_intent`
2. 再通过 `artifact ops` 生成结构化块
3. 最后可选地引入 `formatter/refiner` 子阶段
## 10.2 Prompt 约束
系统提示词需要明确:
1. 当任务目标是报告、方案、roadmap、总结、研究时,优先生成 Artifact Document。
2. 消息区只保留:
- 简短说明
- 进度
- 下一步
3. 不把完整长文再次重复贴回聊天区。
4. 优先使用 block 语义,而不是自由拼 HTML。
## 10.3 与 Service Skills 的关系
当前正在推进 `ServiceSkill`。
高配版 Artifact Workbench 可以成为 ServiceSkill 的统一交付面:
- `instant`:生成一份 Artifact Document
- `scheduled`:定期生成新版本
- `managed`:持续维护同一文档或同一档案集
这会让 ServiceSkill 从“启动器”真正闭环到“交付物系统”。
## 11. 分阶段路线图
## Phase 0:协议与壳层对齐
目标:
- 明确长期对象模型与协议边界
- 不大改 UI,只先收口事实源
交付:
1. 定义 `ArtifactDocument / ArtifactVersion / ArtifactSourceLink` 类型
2. 明确 `Artifact` 兼容层与 `ArtifactDocument` 长期层的关系
3. 定义 `artifact ops` 事件协议
4. 新增 Workbench Shell 设计稿与组件边界
不做:
- 大规模 UI 改版
- 完整编辑器改造
## Phase 1:高质量阅读态 Workbench
目标:
- 先把“看起来高级”做出来
- 回复从普通 Markdown 升级为报告式交付物
交付:
1. 新增 `ArtifactWorkbenchShell`
2. 新增首批语义块:
- `summary_card`
- `callout`
- `table`
- `checklist`
- `score_grid`
- `citation_list`
3. 消息区与 Artifact Workbench 分工明确
4. 高价值回复默认进入右侧交付面
验收:
- 用户不打开源码,也能一眼扫读主要结论
- 报告类回复在视觉上明显区别于普通消息
## Phase 2:可编辑 Artifact Document
目标:
- 让 Artifact 不只是预览面,而是正式编辑面
交付:
1. 以 `ArtifactDocument JSON` 作为正式持久化模型
2. 在 `rich_text` block 内引入 Tiptap / ProseMirror 编辑载荷
3. 将现有 `NotionEditor` 融入 Artifact Workbench
4. 支持局部块编辑、局部 AI 改写、块插入
5. 支持自动保存与版本生成
验收:
- 用户能直接在 Workbench 上编辑,而不是跳回消息区重来
- 编辑后的结果不会丢失结构与样式
## Phase 3:版本、差异与来源闭环
目标:
- 让 Artifact 成为长期资产,而不是一次性结果
交付:
1. 版本列表与版本摘要(已落地)
2. block diff(最小闭环已落地)
3. source drawer / citations(已落地,支持来源项 -> block 跳转)
4. timeline item 与 artifact block 双向跳转(已落地)
验收:
- 用户能知道“新版本改了什么”
- 用户能知道“这段内容从哪里来”
## Phase 4:Artifact First 产品化
目标:
- 让 Artifact Workbench 成为 Lime 的统一交付层
交付:
1. ServiceSkill 默认输出 Artifact
2. Automation 定时生成 Artifact 版本
3. Browser Assist / Search / File 结果可沉淀到同一文档
4. 支持导出、分享、归档、项目复用
验收:
- 用户可以把 Lime 当作持续生成与维护交付物的工作台
- 交付物在会话结束后仍具备长期价值
## 12. 仓库落地建议
## 12.1 建议优先复用的现有模块
| 现有模块 | 建议角色 |
|------|------|
| `src/components/artifact/*` | 保留为渲染与工具栏底座 |
| `src/lib/artifact/*` | 保留为兼容层与基础状态层 |
| `workbenchPreview.tsx` | 升级为 Artifact Workbench 入口壳 |
| `WorkspaceCanvasContent.tsx` | 继续承载右侧主预览容器 |
| `NotionEditor.tsx` | 作为编辑态主内核 |
| `AgentThreadTimeline.tsx` | 作为过程层和来源层入口 |
| `CanvasContainer.tsx` | 继续承接主题类 Canvas |
## 12.2 建议新增的目录
建议新增:
```text
src/components/artifact-workbench/
src/lib/artifact-document/
src/lib/artifact-protocol/
src-tauri/src/services/artifact_document_service.rs
```
职责建议:
- `artifact-workbench/`:壳层、视图切换、侧栏、版本条、来源抽屉
- `artifact-document/`:对象模型、版本管理、diff、序列化
- `artifact-protocol/`:artifact ops、part 映射、兼容层;当前已先落地 metadata/path 读取壳层,后续继续向完整协议边界收敛
- `artifact_document_service.rs`:持久化与查询
如果后续同步推进 `aster-rust`,则建议新增独立 runtime 模块,而不是继续堆进 `blueprint/`:
```text
/Users/coso/Documents/dev/ai/astercloud/aster-rust/crates/aster/src/runtime/
```
这部分是框架层远期方向,不覆盖 Lime 当前仓库已确定的运行时收口主计划。
建议职责:
- `thread / turn / item`
- `event bus`
- `prompt composer`
- `output schema`
- `approval / elicitation / interrupt`
- `state persistence`
## 12.3 迁移原则
1. 不直接删除旧 Artifact 系统,先把它降级成兼容层。
2. 不直接替换所有 Canvas,只先把通用报告类产物接到新 Workbench。
3. 优先打通 `general/document/planning/knowledge` 四类高价值文本产物。
4. 在协议稳定前,不急着让所有模型都严格产出结构化块。
5. 不让 `blueprint` 直接接管 Artifact 主链,Blueprint 只作为可选 planning capability 接入。
## 12.4 运行时迁移原则
本节只表达 Artifact 产品侧对 runtime 的依赖顺序,不替代 `docs/roadmap/lime-conversation-execution-efficiency-roadmap.md` 已锁定的 P1 / P2 / P3 / P4 执行顺序。
1. 先把 `system prompt + output schema + validator` 的控制链建立起来。
2. 再把 Stage 1 / Stage 2 生成链升级为标准 turn。
3. 再定义 item / delta / version / diff 事件。
4. 最后才考虑把 Blueprint 接入某些“复杂规划型 Artifact”场景。
## 13. 成功指标
上线后建议重点观察:
1. 报告类任务中,Artifact 打开率与停留时长。
2. 用户对同一 Artifact 的二次编辑率。
3. 版本比较的使用率。
4. 导出率与复制率。
5. 消息区长文占比是否下降。
6. 用户是否更少要求“帮我重新整理得更清晰一点”。
## 14. 风险与约束
## 14.1 主要风险
1. 同时维护产品层 JSON、编辑器载荷和导出快照,容易漂移。
2. 过早做成任意页面搭建器,会把范围做爆。
3. 语义块过多、过复杂,会压垮 prompt 与 renderer。
4. 如果没有来源层,最终只会变成“更好看的幻觉输出”。
## 14.2 控制原则
1. `ArtifactDocument JSON` 是正式事实源;Tiptap / ProseMirror JSON 只存在于编辑器层或 rich_text block 内。
2. 首批只做有限 block 集,不追求无限扩展。
3. 先把阅读态与编辑态打通,再做复杂自动排版。
4. 任何导出与落盘都必须通过 workspace / 应用目录 API 解析路径。
5. system prompt 不是唯一控制点,必须叠加 turn 级 schema 与 validator。
## 15. 最终结论
Lime 不缺“漂亮回复”的单点技巧,缺的是:
**统一的 Artifact Product Model。**
你们现有代码已经具备高配版所需的 70% 基础设施:
- 有工作台
- 有 artifact
- 有 timeline
- 有 canvas
- 有 Tiptap
真正要补的是剩下这 30%:
- 正式交付物对象
- 结构化协议
- 报告式阅读面
- 版本与来源闭环
因此最优路径不是“继续调 Markdown 样式”,而是:
**把 Artifact 从“聊天的附件”升级为“Lime 的正式交付层”。**
@@ -0,0 +1,402 @@
# Artifact Workbench 的 System Prompt 与 Schema 合同
> 状态:进行中,核心合同已落地,P3 产品闭环已落地,rewrite typed patch 合同已落地
> 更新时间:2026-03-25
> 运行时边界:prompt 组装入口、turn metadata 主合同、runtime output schema 注入链以 `docs/roadmap/lime-conversation-execution-efficiency-roadmap.md` 为准;本文只细化 Artifact 相关合同
> 关联文档:
> - `docs/roadmap/artifacts/architecture-blueprint.md`
> - `docs/roadmap/artifacts/artifact-document-v1.md`
> - `docs/roadmap/artifacts/framework-boundary.md`
> 目标:定义 Artifact Workbench 在运行时如何通过 prompt、turn metadata、output schema、validator 四层协同控制结构化输出质量
## 当前落地状态
以下能力已经进入实现态:
1. 后端已按 turn metadata 组装 Artifact 专属 prompt 段落。
2. Artifact 回合已在 `runtime_turn` 中绑定 turn-level output schema。
3. 结构化输出已经接入 validator / repair / fallback,并可落盘为 `ArtifactDocument v1`。
4. `stage2` 已允许输出 `artifact_document_draft | artifact_ops`,`rewrite` 已收紧到增量 `artifact_ops`。
5. 后端已支持最小 `artifact_ops` 应用链,可在已有 Artifact 上执行 block / source / version 级增量更新。
6. 当前版本已回灌 `currentVersionDiff / artifactVersionDiff`,Workbench 也已接入来源抽屉、差异面以及来源项 / 差异项到 block 的定位。
7. 当前版本已支持 `timeline item <-> artifact block` 双向跳转:timeline 可精确打开目标 block,Workbench 也可回跳对应过程项。
8. `rewrite` 已把 `artifact_target_block_id` 下沉到 prompt hint、turn-level output schema、`artifact_ops` runtime apply 与 persist validator context;非目标 block 的改写 / 绑定 / 删除会被忽略并记录 issue。
9. `rewrite` 已支持专用 `artifact_rewrite_patch` 输出 envelope,并在后端兼容转换为 `artifact_ops` 应用链,便于逐步把改写合同从“通用 ops”收紧到“目标 block patch”。
仍未完全落地的部分:
1. rewrite 已具备 typed patch 主合同,但当前仍保留 `artifact_ops` 兼容分支;待模型稳定后可进一步收紧到单一 rewrite envelope
## 1. 核心观点
用户之前的判断是对的:
**渲染只是结果层。**
如果模型上游没有被清晰约束,后面的漂亮渲染只是在给随机长文做包装。
Artifact Workbench 的真正控制链应是:
1. prompt policy 决定任务规则
2. stage contract 决定本轮该输出什么
3. output schema 决定结果必须长什么结构
4. validator / repair 决定是否可以进入 ready
5. renderer 决定最终视觉呈现
一句话:
**结构质量先于视觉质量。**
## 2. 总控制栈
```mermaid
flowchart TD
A["用户请求"] --> B["Turn Metadata"]
B --> C["System Prompt Composer"]
C --> D["Stage Contract"]
D --> E["Turn-level Output Schema"]
E --> F["LLM 输出"]
F --> G["Validator / Repair"]
G --> H["ArtifactDocument Store"]
H --> I["Renderer / Editor / Export"]
```
## 3. 为什么不能只靠 Prompt
只靠 prompt,会稳定出现以下问题:
1. **阶段串线**
- Stage 1 应该给结构计划,结果却开始写正文
2. **来源丢失**
- 明明要求 source,模型仍然忘记挂引用
3. **block 漂移**
- 一会儿输出表格,一会儿输出纯长文
4. **协议脆弱**
- 一旦模型换版本,结果 shape 就可能漂
所以 prompt 只能解决“倾向”,不能单独保证“合同”。
## 4. 参考基准
本合同借鉴 `codex` 的一个关键思路:
- turn 可以携带自己的 `outputSchema`
- schema 只约束当前 turn 的结构,不污染整个产品层协议
依据:
- `/Users/coso/Documents/dev/rust/codex/codex-rs/app-server/README.md`
- `/Users/coso/Documents/dev/rust/codex/codex-rs/app-server-protocol/schema/typescript/v2/TurnStartParams.ts`
- `/Users/coso/Documents/dev/rust/codex/codex-rs/codex-api/src/common.rs`
这说明:
**把结构化输出做成 runtime 能力,比把所有结构约束硬写死在前端页面或单个 prompt 模板里更稳。**
## 5. 后端 Prompt 组装原则
## 5.1 前端不拼完整 prompt
前端只提供:
- 用户输入
- artifact metadata
- 工作台上下文
- 局部改写目标
后端负责:
- 合并基础 system prompt
- 合并记忆/搜索/source 规则
- 合并 Artifact 专属规则
- 合并 stage 合同
- 绑定 output schema
## 5.2 Prompt 分层
建议长期固定为以下 8 层:
1. `Base Runtime Layer`
- 身份、语言、安全边界、消息区与交付区职责分离
2. `Workspace / Team Layer`
- 团队偏好、项目约束、cwd、工作模式
3. `Memory Layer`
- 记忆画像、长期偏好、已知上下文
4. `Search / Source Layer`
- 搜索行为、来源要求、引文约束
5. `Artifact Policy Layer`
- 什么时候必须进入 Artifact
- 不要在消息区重复整篇文档
- 只能输出白名单 block
6. `Stage Contract Layer`
- 当前是 `stage1 / stage2 / rewrite`
7. `Turn Context Layer`
- kind、source_policy、selected_block、rewrite_instruction
8. `Schema Hint Layer`
- 明确提醒本轮有严格 output schema
- 模型应优先满足 schema 而不是自由发挥
## 5.3 Marker 约定
建议统一 marker:
- `【Artifact 交付策略】`
- `【Artifact 来源策略】`
- `【Artifact Stage 1 合同】`
- `【Artifact Stage 2 合同】`
- `【Artifact Rewrite 合同】`
- `【Artifact 输出 Schema 提示】`
作用:
- 可观测
- 可去重
- 可调试
## 6. Turn Metadata 合同
这里的 `ArtifactTurnMetadata` 只表达 Artifact 领域的意图模型,不直接等于 Lime 当前仓库的请求 wire format。
当前实际发送边界、`harness` 结构、metadata 归一化与兼容收口,统一以 `docs/roadmap/lime-conversation-execution-efficiency-roadmap.md` 为准。
建议长期保留以下 Artifact turn intent:
```ts
interface ArtifactTurnMetadata {
artifactMode?: "none" | "draft" | "rewrite";
artifactKind?:
| "report"
| "roadmap"
| "prd"
| "brief"
| "analysis"
| "comparison"
| "plan";
artifactStage?: "stage1" | "stage2" | "rewrite";
sourcePolicy?: "required" | "preferred" | "none";
workbenchSurface?: "right_panel" | "fullscreen";
artifactRequestId?: string;
artifactTargetBlockId?: string;
artifactRewriteInstruction?: string;
}
```
这里的设计原则是:
- metadata 表达意图
- prompt 表达规则
- schema 表达结构
三者不要混写。
## 7. Stage 合同
## 7.1 Stage 1
职责:
- 判断是否需要正式交付物
- 锁定 `kind`
- 生成标题建议
- 生成 source policy
- 生成 block plan / section outline
- 标记缺口与风险
禁止:
- 直接写完整长文
- 输出 HTML / CSS
- 输出最终排版说明
建议 schema 形态:
```ts
interface ArtifactStage1Result {
needsArtifact: boolean;
kind:
| "report"
| "roadmap"
| "prd"
| "brief"
| "analysis"
| "comparison"
| "plan";
title: string;
sourcePolicy: "required" | "preferred" | "none";
outline: Array<{
id: string;
title: string;
goal: string;
}>;
blockPlan: Array<{
id: string;
type:
| "section_header"
| "hero_summary"
| "key_points"
| "rich_text"
| "callout"
| "table"
| "checklist"
| "metric_grid"
| "citation_list";
sectionId?: string;
purpose: string;
}>;
gaps?: string[];
}
```
## 7.2 Stage 2
职责:
- 输出正式 `artifact_document_draft`
- 或输出增量 `artifact ops`
必须:
- 满足 `ArtifactDocument v1`
- 满足 source 约束
- block 类型只能来自白名单
建议 schema 形态:
```ts
type ArtifactStage2Result =
| {
type: "artifact_document_draft";
document: ArtifactDocumentV1;
}
| {
type: "artifact_ops";
artifactId: string;
ops: ArtifactOpEnvelope[];
};
```
## 7.3 Rewrite
职责:
- 只改目标 block
- 不允许顺手重写整篇文档
建议 schema 形态:
```ts
interface ArtifactRewriteResult {
artifactId: string;
targetBlockId: string;
block: ArtifactBlockV1;
}
```
## 8. Output Schema 策略
## 8.1 Schema 绑定位置
建议 schema 不是前端硬编码,而是由后端在 turn 发起时绑定。
以下时序图只表达“绑定责任在后端”,不单独定义当前仓库的命令名、函数名或中间结构:
```mermaid
sequenceDiagram
participant FE as 前端
participant App as Lime App
participant RT as Aster Runtime
participant Model as LLM
FE->>App: submit_turn(input + artifact metadata)
App->>RT: build_turn(stage, metadata)
RT->>RT: compose system prompt
RT->>RT: attach output schema
RT->>Model: request(instructions + schema)
Model-->>RT: structured output
```
## 8.2 Schema 颗粒度
建议采用三类 schema:
1. **运行时 schema**
- 限制某一轮输出结构
2. **产品层 schema**
- `ArtifactDocument v1`
3. **编辑器 payload schema**
- `rich_text` 内的 ProseMirror/Tiptap JSON
不要把这三层混成一个巨大 schema。
## 8.3 Schema 与 Validator 的关系
schema 不是 validator 的替代品。
原因:
1. 模型可能输出“表面符合 schema,但业务仍非法”的内容
2. sourceId 引用、block 数量、fallback 等逻辑需要业务修复
3. 编辑器 payload 可能需要额外兼容修正
因此主链仍然必须有:
- schema check
- business validation
- repair
- fallback
## 9. Validator / Repair 策略
validator 至少负责:
1. 顶层字段校验
2. block 类型白名单校验
3. source 引用合法性校验
4. `rich_text` payload 兼容性校验
5. source policy 业务校验
repair 至少负责:
1. 缺省 title 补全
2. table 行列补齐
3. citation 无效项删除
4. block fallback 到 `rich_text(markdown)`
5. 整体失败时回退为单个 `rich_text` 文档
## 10. 推荐实现边界
## 10.1 Lime 产品层
建议新增或持有:
- `artifact_document_schema.ts`
- `artifact_stage1_schema.ts`
- `artifact_stage2_schema.ts`
- `artifact_rewrite_schema.ts`
- `artifact_document_validator.ts`
- `artifact_document_repair.ts`
## 10.2 Aster Runtime 层
建议持有:
- prompt composer
- turn 级 schema registry
- model invocation wrapper
- item/turn events
- output parsing / validation hook
## 11. 最终决策
Artifact Workbench 的输出质量,不应依赖“模型今天状态好不好”。
长期正确方案是:
**Prompt 负责引导,Schema 负责约束,Validator 负责兜底,Renderer 负责呈现。**