8.5 KiB
8.5 KiB
M4 RPG Runtime Story SpacetimeDB 基座记录(2026-04-21)
更新时间:2026-04-22
0. 文档目标
本文件只记录一件事:
把 M4 从“只有任务清单和 crate 占位”推进到“SpacetimeDB 侧已有最小可编译 story 会话基座”的真实落地结果。
本轮只落最小骨架,不扩到完整 runtime story action 迁移,不改前端交互界面设计。
1. 本轮落地范围
本轮按 M4 与 RPG_ENTRY_RUNTIME_CHAIN_REFACTOR_EXECUTION_PLAN_2026-04-21.md 的交叉口径,只落实下面 6 件事:
- 新增
server-rs/crates/module-story/真实 crate,而不是继续停留在 README 占位。 - 在
module-story中冻结story_session / story_event的首版领域类型、ID 前缀、状态枚举与字段校验 helper。 - 在
server-rs/crates/spacetime-module/中新增story_session、story_event两张表。 - 在
spacetime-module中新增begin_story_session、continue_story两个 reducer,形成最小可编译会话主链。 - 在
spacetime-module中新增begin_story_session_and_return、continue_story_and_return两个 procedure,让 Axum 可同步拿到结果快照。 - 在
spacetime-client与api-server中新增最小 story session facade,打通server-rs侧纵向调用链。
2. 本轮新增的真实工程落点
2.1 新增 crate
server-rs/crates/module-story/Cargo.tomlserver-rs/crates/module-story/src/lib.rs
2.2 workspace 与主工程聚合
server-rs/Cargo.toml- 已把
crates/module-story纳入 workspace members
- 已把
server-rs/crates/spacetime-module/Cargo.toml- 已接入
module-story依赖
- 已接入
server-rs/crates/spacetime-module/src/lib.rs- 已接入
module-story类型 - 已新增
story_session - 已新增
story_event - 已新增
begin_story_session - 已新增
continue_story - 已新增
begin_story_session_and_return - 已新增
continue_story_and_return
- 已接入
server-rs/crates/spacetime-client/src/lib.rs- 已新增
begin_story_session(...) - 已新增
continue_story(...)
- 已新增
server-rs/crates/api-server/src/story_sessions.rs- 已新增
POST /api/story/sessions - 已新增
POST /api/story/sessions/continue
- 已新增
3. 当前冻结的数据口径
3.1 story_session
当前首版字段冻结为:
story_session_idruntime_session_idactor_user_idworld_profile_idinitial_promptopening_summarylatest_narrative_textlatest_choice_function_idstatusversioncreated_atupdated_at
当前策略:
story_session保持 private 真相表口径。- 当前只解决“故事会话存在、版本递增、最新叙事状态可追踪”。
- 不在本轮提前塞入 quest、combat、npc、inventory 混合字段。
3.2 story_event
当前首版字段冻结为:
event_idstory_session_idevent_kindnarrative_textchoice_function_idcreated_at
当前策略:
- 事件先只承接
SessionStarted / StoryContinued两类最小事件。 - 先证明事件追加模型能工作,再扩到
resolve_story_action真实子域事件。
4. 当前 reducer 口径
4.1 begin_story_session
当前负责:
- 校验
StorySessionInput - 拒绝重复
story_session_id - 写入
story_session - 追加一条
SessionStarted事件
4.2 continue_story
当前负责:
- 校验
StoryContinueInput - 校验目标
story_session必须存在 - 以事件追加方式写入
story_event - 递增
story_session.version - 更新
latest_narrative_text / latest_choice_function_id / updated_at
5. 当前 procedure / facade 口径
5.1 begin_story_session_and_return
当前负责:
- 在单次 procedure 调用里执行
begin_story_session_tx - 直接返回
storySession + storyEvent快照 - 供
spacetime-client与api-server直接同步消费
5.2 continue_story_and_return
当前负责:
- 在单次 procedure 调用里执行
continue_story_tx - 直接返回推进后的
storySession + storyEvent快照 - 避免 Axum 再额外读取 private table
5.3 spacetime-client story facade
当前已新增:
begin_story_session(...)continue_story(...)
当前策略:
spacetime-client负责把module-story输入 builder 映射到 generated bindings。- procedure 错误统一折叠为
SpacetimeClientError,供 Axum 映射为400 / 502。
5.4 api-server story session facade
当前已新增:
POST /api/story/sessionsPOST /api/story/sessions/continue
当前 contract:
- 两个接口都要求 Bearer JWT。
actorUserId由 JWT claims 提供,不允许前端透传。storySessionId/eventId由 Rust 服务端使用module-story的 ID helper 生成。- 两个接口当前都返回:
storySessionstoryEvent
6. 当前刻意未做
本轮明确没有扩到以下范围:
- 还没有落
resolve_story_action - 还没有落
sync_runtime_snapshot_projection - 还没有接入
npc_state / quest_record / battle_state / inventory_slot - 还没有兼容旧
POST /api/runtime/story/actions/resolve - 还没有兼容旧
GET /api/runtime/story/state/:sessionId - 还没有兼容旧
POST /api/runtime/story/state/resolve - 还没有兼容旧
POST /api/runtime/story/initial - 还没有兼容旧
POST /api/runtime/story/continue - 还没有把
server-node现有rpg-runtime-story主链切换到server-rs - 还没有改任何前端交互界面设计
也就是说,本轮只是把 M4 的 SpacetimeDB 会话基座与最小 Axum facade 立起来,不宣称已经完成 runtime story 兼容迁移。
7. 验证结果
本轮已执行:
cargo check -p module-story --manifest-path D:\\Genarrative\\server-rs\\Cargo.tomlcargo check -p spacetime-module --manifest-path D:\\Genarrative\\server-rs\\Cargo.tomlcargo check -p spacetime-module --target wasm32-unknown-unknown --manifest-path D:\\Genarrative\\server-rs\\Cargo.tomlnpm run spacetime:generatecargo check -p spacetime-client --manifest-path D:\\Genarrative\\server-rs\\Cargo.tomlcargo check -p api-server --manifest-path D:\\Genarrative\\server-rs\\Cargo.tomlnpm run check:encoding
结果:
- 全部通过。
8. 下一步建议
按当前节奏,后续应继续按下面顺序推进:
- 先冻结
story state查询 contract,明确是新/api/story/sessions/:storySessionId/state还是兼容旧/api/runtime/story/state/*。 - 再把
story_session与runtime_snapshot的 projection / sync 边界补清。 - 再把
resolve_story_action的输入/输出与RuntimeStoryActionRequest对齐成下一个 reducer / procedure 设计。 - 再逐步把
npc / quest / treasure / combat子域动作接成显式事件与独立 reducer。 - 最后再处理旧 Node
runtime story兼容接口与前端实际切换。
9. 后续增量状态(2026-04-22)
在本文件记录的首轮 story session 基座之上,当前仓库又继续补了两条与 M4 story runtime 直接相关的增量切片:
- 已补
GET /api/story/sessions/:storySessionId/state- 当前只返回
storySession + storyEvents - 不兼容旧
RuntimeStoryActionResponse
- 当前只返回
- 已补
GET /api/story/battles/:battleStateId- 当前只返回单个
battleState - 供 battle 刷新、重连和后续 story 编排复用
- 当前只返回单个
- 已补
POST /api/story/npc/battle- 当前只承接
npc_fight / npc_spar - 同步返回
npcInteraction + battleState
- 当前只承接
同时,本轮还完成了以下工程收口:
- 已重新执行
npm run spacetime:generate。 - 已把
spacetime-client中 battle query 的占位实现替换为真实 procedure 调用。 - 已再次执行
cargo check -p spacetime-client --manifest-path D:\\Genarrative\\server-rs\\Cargo.toml与cargo check -p api-server --manifest-path D:\\Genarrative\\server-rs\\Cargo.toml并通过。
当前仍需继续追的验证项:
story_sessions/story_battles相关二进制测试在当前机器上编译时间较长,还没有在单次时窗内拿到最终断言结果。npm run check:encoding已启动,但尚未在单次时窗内跑完。
因此,当前准确口径应为:
M4 story session / story state / battle state / NPC 开战的最小后端编译链已经打通。- 旧
runtime story兼容接口与旧 view model 兼容仍未完成。 - 长时回归测试与编码检查仍在继续推进,不应提前宣称整阶段验收完成。