合并 master 并接入 DirectProject 新聊天架构

- 合并 origin/master(304 个提交:DirectProject 聊天容器重构、Project Supervisor 退役、策划附件导入、CI 隔离编译缓存等)。
- 接受 master 对 ProjectSupervisorView / SupervisorChatOnlyView 的退役与预览快捷测试收敛;发布入口改由 DirectProject 聊天头承载。
- DirectProjectChatHeader 新增「发布到游戏广场」入口(无回调不渲染、回合忙态禁用),DirectProjectChatView 透传 onRequestGamePublish。
- App.tsx 继续由工作台壳持有试玩包导出与 GameDistributionPublishPanel,沿用 project.export_package 权限确认队列;check-config 把该命令从 native-only 清单移回 App invoke。
- 后台游戏审核 API / 类型 / 路由测试与 master 新增的 AGC 模板管理按双方保留合并,并修掉拼接造成的接口与用例闭合缺陷。
- 修正 master 自带的 viteProxyConfig 断言:/api/creation-entry 属退役路由,测试改为断言不进入代理。
- 记录合并踩坑:语法结构内部的冲突不能简单按「双方保留」拼接,必须按某一侧骨架重建并跑 tsc 与单文件测试。
- 验证:全量 vitest 393 文件 / 4374 用例通过,root / AGC / admin-web 三端 typecheck,cargo check 与游戏分发 Rust 测试,encoding、doc-index、rustfmt、SpacetimeDB schema guard。
This commit is contained in:
2026-09-22 16:45:29 +08:00
651 changed files with 78860 additions and 60952 deletions
+35
View File
@@ -2188,6 +2188,8 @@ fn admin_permission_requirement(_method: &Method, path: &str) -> AdminPermission
match path {
"/admin/api/me" => Authenticated,
"/admin/api/agc-models" => OwnerOnly,
"/admin/api/agc-templates" => AnyTab(&["agc-templates"]),
path if path.starts_with("/admin/api/agc-templates/") => AnyTab(&["agc-templates"]),
"/admin/api/dashboard" => AnyTab(&["dashboard"]),
"/admin/api/overview" => AnyTab(&["overview"]),
"/admin/api/external-api-keys" => AnyTab(&["tables"]),
@@ -6846,6 +6848,39 @@ mod tests {
));
}
#[test]
fn agc_template_routes_require_the_template_tab_permission() {
for (method, path) in [
(Method::GET, "/admin/api/agc-templates"),
(Method::PUT, "/admin/api/agc-templates/cocos-empty-2d"),
(Method::POST, "/admin/api/agc-templates/import"),
] {
assert!(enforce_admin_request_permission("owner", &[], &[], &method, path).is_ok());
assert!(
enforce_admin_request_permission(
"member",
&["agc-templates".to_string()],
&[],
&method,
path,
)
.is_ok()
);
assert_eq!(
enforce_admin_request_permission(
"member",
&["editor-assets".to_string()],
&[],
&method,
path,
)
.expect_err("unassigned template permission")
.status_code(),
StatusCode::FORBIDDEN
);
}
}
#[test]
fn admin_tab_permissions_cover_shared_and_sensitive_routes() {
assert!(