- 同步 master 侧 248 个提交:会员与泥点计费(PR #588 / #603)、创作者主页与关注粉丝(PR #638)、运行页刷新真重载(PR #640)、AGC 模板 templateVersion 递增(PR #643)等;确认 master 未触碰发行网关与 `api-server/src/modules/game_distribution.rs`。 - 冲突 1(server-rs/crates/module-runtime/src/domain.rs:1157-1162)`RuntimeProfileWalletLedgerSourceType` 两侧各自在末尾追加变体:保留 master 的 `MembershipUpgradeGrant` 为索引 16(线上已落库口径),本分支 `GamePurchase` 顺延为索引 17,并保留其「每账号每游戏一次扣费」注释。 - 冲突 2(server-rs/crates/module-runtime/src/domain.rs:1184-1188)`as_str()` 同时保留 `membership_upgrade_grant` 与 `game_purchase` 两个分支。 - 冲突 3(server-rs/crates/spacetime-client/src/active/mapper/runtime_profile.rs:95-101)bindings→领域枚举映射同时保留 `MembershipUpgradeGrant` 与 `GamePurchase` 两支,按新索引顺序排列。 - 冲突 4(server-rs/crates/spacetime-client/src/module_bindings/runtime_profile_wallet_ledger_source_type_type.rs:43-47)生成枚举按模块源码顺序合并为 …`MembershipUpgradeGrant`、`GamePurchase`;随后 `npm run spacetime:generate` 复核该文件与生成结果逐字节一致。 - 冲突 5(server-rs/crates/api-server/src/admin.rs:4849-4853)sats 索引映射改为 `16 => membership_upgrade_grant` 与 `17 => game_purchase` 两条并存。 - 冲突 6(server-rs/crates/api-server/src/admin.rs:6368-6461)索引断言并入 master 的 `[16] => membership_upgrade_grant`,并把 master 的「17 尚未映射」占位断言替换为 `[17] => game_purchase`;本分支的后台消耗统计两个用例原样保留。 - 冲突 7(server-rs/crates/api-server/src/runtime_profile.rs:219-226)来源文案格式化同时保留 `MembershipUpgradeGrant` 与 `GamePurchase` 两支,注释随 `GamePurchase` 保留。 - 冲突 8(docs/project-memory/shared-memory/decision-log.md:3-24)两条决策记录并列保留:本分支 2026-10-05「播放会话前缀在三处入口清空 Cookie」在前,master 2026-10-03「每日免费发放额为 0 时前端隐藏该池」在后。 - 保住 master 侧:发行响应 ETag/304/gzip(`release_asset_response_with_cache` 五参形态与 `release_asset_etag` / `if_none_match_matches` / `accepts_gzip_encoding` / `gzip_release_asset` / `release_asset_not_modified_response`)、共享加载面 `PlatformGameLoadingSurface` 及其使用方、三池钱包与会员档位目录改造。 - 保住本分支侧:付费作品 404 守卫(`price_mud_points > 0` 且位于 `load_package` 之前)、购买与播放会话网关路由、nginx×3 / Pingora / Vite 的播放会话 Cookie 清空与 `nginx-route-parity.matrix.json` 登记、viewer 感知公开详情、后台审核价格、`PlatformGamePricingField` 共享定价组件与两端接入、AGC 项目版本只读 + 平台派发下一版本号、schema 与迁移白名单、钱包来源 `game_purchase`。 - 验证:`git merge-base --is-ancestor origin/master HEAD` 返回 0;`check:encoding`、`check:doc-index`、`check:spacetime-schema`、`check:server-rs-ddd`、`check:rustfmt`、`check:npm-workspaces`、`check:game-distribution-dto-parity`、`check:game-distribution-price-limit-parity`、`check:pingora-route-parity`、`check:nginx-spa-routes`、根/admin-web/AGC typecheck、`git diff --check` 全绿。 - 测试:`cargo test -p module-game-distribution` 30 passed,`cargo test -p api-server game_distribution` 61 passed,`cargo test -p spacetime-module game_distribution` 7 passed;定向 vitest 28 个文件 252 个用例全通过。 - `npm run spacetime:generate` 除 11 个 procedure 文件的纯空白格式差异外无任何语义改动(`git diff -w` 为空),已保留 master 的生成产物形态,提交内无 schema/绑定语义变化。
spacetime-module 主工程 crate 说明
日期:2026-09-22
1. crate 职责
spacetime-module 是新后端的 SpacetimeDB 主工程 crate,后续负责:
- 聚合各独立模块 crate 的表定义
- 聚合各独立模块 crate 的 reducer
- 聚合各独立模块 crate 的 view / 读模型
- 生成可发布的 SpacetimeDB wasm 模块
- 由
../../scripts/spacetime-dev.ps1与../../scripts/spacetime-dev.sh驱动的本地 standalone 启动链路
2. 当前阶段说明
当前阶段以 src/active.rs 的现役聚合入口为准,已覆盖资产管理、认证、AI 任务、runtime / profile、编辑器工程与精选、外部生成、游戏分发、后台存储和数据库迁移能力。
后续与本 crate 直接相关的任务包括:
- 继续扩充模块聚合入口
- 保持 table / reducer / view / procedure、迁移白名单和生成 bindings 同步
- 接入身份 claims 透传
- 在当前 scaffold 基础上接入 publish / dev 循环
- 新增业务域时按
src/active.rs的现役声明落位,不得恢复不在现役声明中的业务域目录
当前已落地:
spacetime-module真实cdylibcrate scaffoldasset_object、asset_entity_binding与资产绑定 procedureruntime_setting、runtime_snapshot、user_browse_historycreation_entry_config、creation_entry_type_config、feature_gate_config- 账号、身份、refresh session 与认证 procedure
- profile / 钱包 / 充值 / 任务 / 邀请码 / 兑换码 / 埋点投影
ai_task、ai_task_stage、ai_text_chunk、ai_result_reference与任务事件- 编辑器工程、画布、资源、素材、精选和编辑器 Agent 会话
- 外部生成任务、游戏分发、LLM Router、AGC 模型、外部 API Key、后台与错误报告存储
- 数据库导出 / 导入 / 分片导入 / operator 授权等通用迁移 procedure
2.0.1 runtime 域落位
src/runtime.rs 只承担聚合职责,现役入口如下:
- 现役表定义:
src/runtime/legacy_schema/{settings,snapshots,browse_history}.rs、src/legacy_schema/creation_entry_config.rs - 现役 procedure / helper:
src/runtime/active/{settings,profile}.rs - 独立配置与投影:
src/runtime/feature_gate_config.rs、src/runtime/analytics_date_dimension.rs
后续新增 runtime 相关 table / reducer / procedure / helper 时,必须直接落到对应二级文件,禁止回写到 src/active.rs;不得把未登记的根文件重新加入 runtime.rs。
2.0.2 ai 域拆分进度
截至 2026-04-23,ai 域也已完成第一轮真实内容拆分,根入口不再保留 ai_task / ai_task_stage / ai_text_chunk / ai_result_reference / ai_task_event 的业务实现。
当前 src/ai/ 的实际落位如下:
src/ai/tasks.rsai_task表- task 创建、启动、完成、失败、取消的 reducer / procedure
- task 状态迁移与持久化 helper
src/ai/stages.rsai_task_stageai_text_chunkai_result_reference- stage 启动、chunk 追加、stage 完成、result reference 绑定的 procedure / helper
src/ai/snapshots.rs- AI 任务、阶段、chunk、reference 的 row / snapshot 转换 helper
src/ai.rs 当前只承担聚合职责:
- 声明
tasks / stages / snapshots / events - 对外统一使用
pub use xxx::*; - 对内部共享的 row / snapshot helper 使用
pub(crate) use snapshots::*;
后续新增 AI 相关 table / reducer / procedure / helper 时,必须直接落到上述二级文件,禁止回写到 src/active.rs。
2.1 src/active.rs 聚合路由规则
从 2026-04-23 起,src/active.rs 不再承载具体业务域的 table / reducer / procedure / tx helper。
根入口只允许保留:
use聚合mod声明- 少量跨域共享 helper
- 迁移过渡期测试
根入口与子模块的导入导出规则同步冻结为:
src/active.rs对外统一优先使用pub use xxx::*;重新导出模块内容- 已拆业务模块内部统一优先使用
use crate::*;复用主入口已聚合的类型与函数 - 只有
use crate::*;无法覆盖或会引入明显歧义时,才补局部显式use - 新增业务域内容禁止为了堆
use列表再回写到src/active.rs
当前业务内容按以下入口落位:
src/asset_metadata/- 资产对象与资产绑定真相表
src/auth/- 登录身份、账号、refresh session 和认证 procedure
src/ai/- AI task / stage / chunk / result reference / event
src/runtime/- runtime setting / snapshot / browse history / profile / 入口配置 / 功能灰度 / 日期维度
src/editor_project_storage.rs- 编辑器工程、画布、资源、素材、精选和生成幂等
src/editor_agent_storage.rs- 编辑器 Agent 会话存储
- 其它单一领域存储入口
admin_account_storage.rs、admin_dashboard.rs、agc_models.rs、error_report.rs、external_api_key_storage.rs、external_generation.rs、game_distribution.rs、llm_router_account.rs、migration.rs
已冻结的二级模块落位点
src/asset_metadata/objects.rssrc/asset_metadata/bindings.rssrc/auth/tables.rssrc/auth/procedures.rssrc/ai/tasks.rssrc/ai/stages.rssrc/ai/snapshots.rssrc/ai/events.rssrc/runtime/active/settings.rssrc/runtime/active/profile.rssrc/runtime/legacy_schema/settings.rssrc/runtime/legacy_schema/snapshots.rssrc/runtime/legacy_schema/browse_history.rssrc/legacy_schema/creation_entry_config.rssrc/runtime/feature_gate_config.rssrc/runtime/analytics_date_dimension.rs
后续如果新增 SpacetimeDB 表、reducer、procedure 或同域 helper,必须先判断属于哪个一级模块与二级落位点,再写入对应文件;禁止直接追加到 src/active.rs,也不得恢复不在现役声明中的业务域目录。
当前文档入口
当前长期工程口径已融合到:
- ../../../docs/【后端架构】server-rs与SpacetimeDB数据契约-2026-05-15.md
- ../../../docs/【玩法创作】平台入口与玩法链路-2026-05-15.md
- ../../../docs/【开发运维】本地开发验证与生产运维-2026-05-15.md
旧阶段设计文档不再作为实现依据。
3. 边界约束
spacetime-module只聚合状态模型,不直接承接 HTTP、Cookie、Header、OSS、短信、微信、LLM 等外部副作用。- 每个业务模块优先在自己的
crates/module-*中定义状态与规则,再由主工程聚合。 - 主工程不重新吞并各模块实现细节,避免回到单大包结构。
- 新增跨域状态必须先在对应
module-*定义领域规则,再由spacetime-module聚合;不得从未挂载源码复制未登记模块。