Resolve spacetime client binding merge conflicts
This commit is contained in:
@@ -83,3 +83,31 @@ cargo check -p spacetime-module
|
||||
```
|
||||
|
||||
结果:通过。`spacetime-module` 仅保留仓库既有 glob re-export warning。
|
||||
|
||||
## 2026-04-24 追加:结果页删除与资产动作闭环
|
||||
|
||||
本次继续补齐除长尾补全外的结果页可见动作:
|
||||
|
||||
1. `delete_characters` / `delete_landmarks` 已由 Rust SpacetimeDB reducer 直接更新 `draft_profile_json`、`result_preview_json`、`publish_gate_json`、`checkpoints_json`、`custom_world_draft_card`、`custom_world_agent_operation` 与 `custom_world_agent_message`。
|
||||
2. `generate_characters` 增加 `roleType`,可扮演角色写入 `playableNpcs`,场景角色写入 `storyNpcs`,不再把可扮演角色落到场景角色列表。
|
||||
3. `generate_role_assets` / `generate_scene_assets` 不再走占位动作,Rust 会校验目标对象、切到 `visual_refining`、设置 `focus_card_id`,并记录 operation/message。
|
||||
4. `sync_role_assets` / `sync_scene_assets` 已迁移 Node 的 profile 字段写回逻辑:角色写回 `imageSrc`、`generatedVisualAssetId`、`generatedAnimationSetId`、`animationMap`;场景写回 `imageSrc`、`generatedSceneAssetId`、`generatedScenePrompt`、`generatedSceneModel`,并同步 `sceneChapters.acts` 背景字段。
|
||||
5. 前端结果页角色卡展示“生成资产”,场景卡展示“生成场景图”,均通过 `autosaveCoordinator.executeAgentActionAndWait` 调 Rust API 并用最新 session 重建预览。
|
||||
|
||||
本轮仍不迁移 `expand_long_tail`,保持后续单独设计。
|
||||
|
||||
## 2026-04-24 追加:创作 Tab 删除作品入口
|
||||
|
||||
用户在 `http://127.0.0.1:3000/` 的“创作”Tab 看不到删除作品入口,原因是 `RpgEntryHomeView` 的 `CreationLibraryCard` 只支持整卡打开详情,没有接收删除回调。已补齐:
|
||||
|
||||
1. `CreationLibraryCard` 右上角展示“删除”按钮,点击时阻止整卡打开详情。
|
||||
2. `RpgEntryHomeView` 新增 `onDeleteLibraryEntry` 与 `deletingLibraryEntryId` props。
|
||||
3. `PlatformEntryFlowShellImpl` 复用 `deleteRpgEntryWorldProfile`,删除后刷新我的作品列表与公开广场。
|
||||
|
||||
链路保持为:前端创作 Tab -> `deleteRpgEntryWorldProfile` -> Rust runtime API -> SpacetimeDB 软删除 profile / 移除 gallery 读模型。
|
||||
|
||||
## 2026-04-24 追加:创作 Hub 草稿删除入口修正
|
||||
|
||||
截图中的“创作”Tab 实际渲染的是 `CustomWorldCreationHub` / `CustomWorldWorkCard`,不是默认 `RpgEntryHomeView` 的 `CreationLibraryCard`。此前 Hub 只给 `status=published` 的 RPG 作品传入删除回调,导致草稿卡片没有“删除”按钮。
|
||||
|
||||
修正后:只要 RPG 创作条目存在 `profileId`,无论 `draft` 还是 `published`,都会在卡片底部动作区展示“删除”。删除继续复用 `PlatformEntryFlowShellImpl.handleDeletePublishedWork`,走 `deleteRpgEntryWorldProfile` -> Rust runtime API -> SpacetimeDB 软删除。
|
||||
|
||||
@@ -52,3 +52,34 @@ cargo test -p api-server custom_world_foundation_draft --no-default-features
|
||||
```
|
||||
|
||||
结果:`3 passed`。
|
||||
|
||||
## 2026-04-24 进度链路补齐
|
||||
|
||||
本次继续补齐“点击生成世界草稿”后的异步执行方式,避免 HTTP 请求阻塞到全部 LLM 调用结束才返回:
|
||||
|
||||
1. `execute_custom_world_agent_action(draft_foundation)` 现在先创建 `draft_foundation` running operation,并立即把 `operationId` 返回给前端。
|
||||
2. API 后台任务继续执行 Node 同序多阶段生成;前端已有的 operation polling 可以持续读取阶段进度。
|
||||
3. Rust 生成器按 Node 的 `onProgress` 节点写入:
|
||||
- `12`:整理世界骨架。
|
||||
- `16-30`:生成可扮演角色。
|
||||
- `30-44`:生成场景角色。
|
||||
- `44-56`:生成关键场景。
|
||||
- `56-66`:建立场景连接。
|
||||
- `66-76`:补全可扮演角色叙事基础。
|
||||
- `76-84`:补全可扮演角色档案细节。
|
||||
- `84-92`:补全场景角色叙事基础。
|
||||
- `92-96`:补全场景角色档案细节。
|
||||
- `97`:编译世界底稿。
|
||||
- `98`:编译草稿卡。
|
||||
4. SpacetimeDB 新增 `upsert_custom_world_agent_operation_progress`,只更新/创建 operation 进度,不插入聊天消息、不推进 turn,专门承接生成中的阶段进度。
|
||||
5. 最终落库仍复用 `execute_custom_world_agent_action(draft_foundation)`,但允许复用同一个 running operation 完成写入,避免中间断点和重复 operation。
|
||||
|
||||
补充验证:
|
||||
|
||||
```bash
|
||||
cargo check -p api-server
|
||||
cargo check -p spacetime-module
|
||||
cargo test -p api-server custom_world_foundation_draft -- --nocapture
|
||||
```
|
||||
|
||||
结果:后端检查通过;`custom_world_foundation_draft` 相关测试 `3 passed`。
|
||||
|
||||
@@ -26,26 +26,28 @@ Agent 结果页点击新增场景角色 / 新增场景
|
||||
-> 刷新结果页 profile
|
||||
```
|
||||
|
||||
说明:当前可扮演角色 tab 的“新增可扮演角色”也会调用 `generate_characters`,后端现阶段会追加到 `storyNpcs`。因此严格意义上的“新增可扮演角色”仍未完整迁移,需要后续给 action 增加角色类型参数或新增 `generate_playable_characters`。
|
||||
说明:当前可扮演角色 tab 的“新增可扮演角色”会调用 `generate_characters` 并传入 `roleType=playable`,Rust 会写入 `draftProfile.playableNpcs`;场景角色则写入 `draftProfile.storyNpcs`。
|
||||
|
||||
## 已迁移 / 可见
|
||||
|
||||
1. 删除作品:已有 Rust + SpacetimeDB 软删除链路。
|
||||
2. 新增场景角色:结果页可见,调用 Rust `generate_characters`。
|
||||
3. 新增场景 / 地点:结果页可见,调用 Rust `generate_landmarks`。
|
||||
4. Agent 结果页发布进入世界:已有 `publish_world` + publish gate 链路。
|
||||
5. 手动编辑结果页 profile:目前仍通过 `sync_result_profile` 自动保存回 Agent session。
|
||||
2. 新增可扮演角色:结果页可见,调用 Rust `generate_characters(roleType=playable)` 并写入 `playableNpcs`。
|
||||
3. 新增场景角色:结果页可见,调用 Rust `generate_characters(roleType=story)` 并写入 `storyNpcs`。
|
||||
4. 新增场景 / 地点:结果页可见,调用 Rust `generate_landmarks` 并写入 `landmarks`。
|
||||
5. 批量删除场景角色:结果页可见,调用 Rust `delete_characters`,同步删除 profile 与 draft card。
|
||||
6. 批量删除场景:结果页可见,调用 Rust `delete_landmarks`,同步删除 profile、连接与 draft card。
|
||||
7. 角色资产准备:结果页角色卡可见“生成资产”,调用 Rust `generate_role_assets`,进入 `visual_refining` 并聚焦角色。
|
||||
8. 场景资产准备:结果页场景卡可见“生成场景图”,调用 Rust `generate_scene_assets`,进入 `visual_refining` 并聚焦场景。
|
||||
9. 角色资产同步:Rust `sync_role_assets` 会把 `portraitPath / generatedVisualAssetId / generatedAnimationSetId / animationMap` 写入 profile、draft card、asset coverage、preview、checkpoint、operation 与 message。
|
||||
10. 场景资产同步:Rust `sync_scene_assets` 会把 `imageSrc / generatedSceneAssetId / prompt / model` 写入 camp 或 landmark,并同步 `sceneChapters.acts`、draft card、asset coverage、preview、checkpoint、operation 与 message。
|
||||
11. Agent 结果页发布进入世界:已有 `publish_world` + publish gate 链路。
|
||||
12. 手动编辑结果页 profile:目前仍通过 `sync_result_profile` 自动保存回 Agent session。
|
||||
|
||||
## 尚未完整迁移的结果页编辑功能
|
||||
|
||||
1. 新增可扮演角色:前端有入口,但 Rust action 暂无角色类型区分,当前会落到 `storyNpcs`。
|
||||
2. 批量删除场景角色:前端只改本地 profile,再靠 `sync_result_profile` 同步,不是独立 Rust action。
|
||||
3. 批量删除场景:前端只改本地 profile,再靠 `sync_result_profile` 同步,不是独立 Rust action。
|
||||
4. 单个角色 / 场景的细粒度编辑:前端 modal 仍编辑本地 profile,再靠 `sync_result_profile` 同步;SpacetimeDB 虽有 `update_draft_card`,但结果页表单尚未按 card section action 化。
|
||||
5. 角色资产生成:`generate_role_assets / sync_role_assets` Rust 侧仍是 placeholder 或外部链路未完全接入结果页。
|
||||
6. 场景资产生成:`generate_scene_assets / sync_scene_assets` Rust 侧仍是 placeholder 或外部链路未完全接入结果页。
|
||||
7. 长尾补全:`expand_long_tail` Rust 侧仍是 placeholder。
|
||||
8. 回滚 checkpoint:Rust 有 `revert_checkpoint`,但结果页没有清晰可见入口。
|
||||
1. 单个角色 / 场景的细粒度编辑:前端 modal 仍编辑本地 profile,再靠 `sync_result_profile` 同步;SpacetimeDB 虽有 `update_draft_card`,但结果页表单尚未按 card section action 化。
|
||||
2. 长尾补全:`expand_long_tail` 本轮明确排除,Rust 侧仍是 placeholder。
|
||||
3. 回滚 checkpoint:Rust 有 `revert_checkpoint`,但结果页没有清晰可见入口。
|
||||
|
||||
## 下一步建议
|
||||
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
# RPG 创作与资产提示词脚本抽离方案(2026-04-24)
|
||||
|
||||
## 背景
|
||||
`server-rs/crates/api-server` 中 RPG 创作链路已经承接草稿生成、结果页补角色/补场景、场景图、角色图与角色动作生成。此前提示词散落在路由处理文件中,导致玩法规则、资产规则与结果页生成规则混杂,后续迭代容易出现落地漂移。
|
||||
|
||||
## 落地边界
|
||||
本次只调整 Rust 后端 `api-server` 内的提示词组织,不兼容 `server-node`,也不改动前端展示文案。
|
||||
|
||||
## 模块拆分
|
||||
1. `custom_world_rpg_draft_prompts.rs`
|
||||
- 承载 RPG 玩法草稿生成相关提示词。
|
||||
- 覆盖八锚点共创主提示词、状态识别提示词、模式规则、用户输入信号规则、上下文渲染。
|
||||
- `custom_world_agent_turn.rs` 只保留流程编排、LLM 调用和结果规范化。
|
||||
|
||||
2. `custom_world_asset_prompts.rs`
|
||||
- 承载生图、生动作相关提示词。
|
||||
- 覆盖角色主图提示词、角色主图负面提示词、角色动作视频/序列帧提示词、动作兜底安全提示词。
|
||||
- 场景图和封面图提示词也属于自定义世界资产提示词,统一迁入该模块。
|
||||
|
||||
3. `custom_world_result_prompts.rs`
|
||||
- 承载结果页新增实体相关提示词。
|
||||
- 覆盖新增可扮演角色、新增场景角色、新增场景的 LLM system/user prompt 构造。
|
||||
- 路由层继续负责 fallback 与返回结构,提示词模块只负责生成可审计的 prompt 文本。
|
||||
|
||||
## 约束
|
||||
- 提示词模块只做纯函数拼装,不访问网络、文件、数据库或 SpacetimeDB。
|
||||
- 保留原中文提示词语义,不把中文改写成英文。
|
||||
- 原有 fallback 行为不变:LLM 不可用或解析失败时仍回退本地生成。
|
||||
- 仅做局部迁移,避免整文件重写导致中文编码风险。
|
||||
|
||||
## 验证
|
||||
- `cargo test -p api-server` 应能通过或至少完成编译阶段。
|
||||
- 既有单元测试中关于角色图、动作结果 payload、场景图请求的断言应保持不变。
|
||||
Reference in New Issue
Block a user