统一 UI workflow 阶段并拒绝未知值

现行阶段原地使用并移除旧阶段 fallback 与迁移兼容
This commit is contained in:
2026-09-05 14:11:00 +08:00
parent d994ccaa78
commit 28af87e3ad
2 changed files with 20 additions and 6 deletions
@@ -684,6 +684,17 @@ fn find_page_ui_resource(
{
return Err(format!("页面 {} 的 UI workflow 资源身份冲突", page.page_id));
}
let generation_kind = asset
.source
.generation_kind
.as_deref()
.ok_or_else(|| format!("页面 {} 的 UI workflow 阶段缺失", page.page_id))?;
if workflow_stage_rank(generation_kind).is_none() {
return Err(format!(
"页面 {} 的 UI workflow 阶段无效:{generation_kind}",
page.page_id
));
}
let mut expected_references = vec![
canonical_resource_id(source),
canonical_resource_id(design_asset),
@@ -755,7 +766,7 @@ fn ensure_page_ui_resource(
prompt: None,
model: None,
generation_route: None,
generation_kind: Some("ui-workflow".to_string()),
generation_kind: Some("ui-workflow.reference-ready".to_string()),
reference_resource_ids: {
let mut references = vec![
canonical_resource_id(source),
@@ -996,13 +1007,16 @@ fn update_page_manifest_stage(root: &Path, asset_id: &str, stage: &str) -> Resul
return Err(format!("UI workflow 资源 {} 类型不匹配", asset_id));
}
let next_kind = format!("ui-workflow.{stage}");
let current_rank = asset
let current_kind = asset
.source
.generation_kind
.as_deref()
.and_then(workflow_stage_rank)
.unwrap_or(0);
let next_rank = workflow_stage_rank(&next_kind).unwrap_or(0);
.ok_or_else(|| format!("UI workflow 资源 {} 阶段缺失", asset_id))?;
let current_rank = workflow_stage_rank(current_kind).ok_or_else(|| {
format!("UI workflow 资源 {} 阶段无效:{current_kind}", asset_id)
})?;
let next_rank = workflow_stage_rank(&next_kind)
.ok_or_else(|| format!("UI workflow 下一阶段无效:{next_kind}"))?;
if current_rank >= next_rank {
return Ok(false);
}
@@ -55,7 +55,7 @@ ui-workflow.completed
联合请求一次携带全部页面参考图和已登记独立素材;页面参考图最多 4 张,独立素材最多 128 个,页面参考图不占用这 128 个独立素材额度。超过独立素材上限时在发起 Provider 请求前直接失败,不会退回旧的素材 batching 路径。
`workflow_stage_rank` 不是前端内存状态,也不是 UI 编辑器的步骤索引。它是 Rust workflow 模块里的内部比较函数:读取 UI JSON manifest 资产上持久化的 `source.generationKind`例如 `ui-workflow.reference-ready``ui-workflow.binding-ready`),把阶段映射为数字 rank,用于 `update_page_manifest_stage` 的单调推进保护,避免较早阶段覆盖较晚阶段。真正的阶段值在项目 manifest 中持久化,并随项目 revision 更新;历史 `structure-ready`/`merge-ready` 是否迁移或继续认可属于持久化兼容决策,不由前端会话状态解决
`workflow_stage_rank` 不是前端内存状态,也不是 UI 编辑器的步骤索引。它是 Rust workflow 模块里的内部比较函数:读取 UI JSON manifest 资产上持久化的 `source.generationKind``ui-workflow.reference-ready``ui-workflow.binding-ready``ui-workflow.application-ready``ui-workflow.completed`),把阶段映射为数字 rank,用于 `update_page_manifest_stage` 的单调推进保护,避免较早阶段覆盖较晚阶段。阶段值在项目 manifest 中持久化,并随项目 revision 更新。当前实现只接受这组现行阶段;缺失或未知阶段直接报错,不做旧值 fallback,也不做迁移
最终回执写入 `.agent/ui-workflows/<source-hash>.json`,客户端可据此恢复页面清单和最终编辑器路由。