Merge branch 'master' into feat/pixel_art
Project CI / Repository checks (pull_request) Successful in 2m57s
Project CI / Frontend tests (pull_request) Successful in 3m38s
Project CI / Backend tests (pull_request) Successful in 4m12s
Project CI / Native shell tests (pull_request) Successful in 14m43s

This commit is contained in:
2026-08-20 12:52:35 +08:00
2 changed files with 14 additions and 16 deletions
@@ -14260,7 +14260,7 @@
- AGC 登录页提供 `release`(`https://www.genarrative.world`)、`dev`(`https://dev.genarrative.world`)和 `custom` 三种服务器选择;选择持久化在客户端本地存储,登录、验证码、刷新和原生平台会话安装统一使用当前选择。
- custom 只接受纯 HTTPS origin;`localhost` / loopback 的 HTTP 也允许用于本机服务,禁止把路径、查询参数、凭据或非本机明文 HTTP 地址作为服务器地址。
- Tauri release 的 HTTP capability scope 必须覆盖 release、dev、custom HTTPS 以及 loopback HTTP,否则前端选择虽能保存,plugin-http 仍会在请求层拒绝登录。
- Tauri release 的 HTTP capability scope 必须覆盖 release、dev、custom HTTPS 以及 loopback HTTP,`check:native-shells` 以该精确 allowlist 作为源码门禁;否则前端选择虽能保存,plugin-http 仍会在请求层拒绝登录。
- 直连 Codex 的本机 External Editor API Key 必须按服务器 origin 独立存储。登录服务器切换后禁止复用另一 origin 的历史 Key 或 base URL;否则会出现登录走新服务器、平台资源生成仍请求旧服务器的漂移。
## 2026-08-18 AGC 登录网络错误与 Web Build 门禁对齐
+13 -15
View File
@@ -2441,10 +2441,16 @@ function assertAiGameCreatorShellUserDevBoundary() {
if (
!httpPermission ||
JSON.stringify(httpPermission.allow ?? []) !==
JSON.stringify([{ url: 'https://dev.genarrative.world/api/*' }])
JSON.stringify([
{ url: 'https://dev.genarrative.world/api/*' },
{ url: 'https://www.genarrative.world/api/*' },
{ url: 'https://*/api/*' },
{ url: 'http://localhost:*/*' },
{ url: 'http://127.0.0.1:*/*' },
])
) {
throw new Error(
'AI game creator native HTTP scope must stay limited to the dev API',
'AI game creator native HTTP scope must match the release, dev, custom HTTPS, and loopback API boundary',
);
}
@@ -2582,22 +2588,14 @@ function assertAiGameCreatorShellUserDevBoundary() {
'AI game creator preview must not invoke the external browser',
);
}
const developerWindowCallCount = [
...aiGameCreatorShellTauriSource.matchAll(
/open_developer_window\(app\.handle\(\)\)\?;/g,
),
].length;
if (
!aiGameCreatorShellTauriSource.includes(
'#[cfg(all(debug_assertions, not(test)))]\npub(crate) fn open_developer_window(',
) ||
!/#\[cfg\(all\(debug_assertions, not\(test\)\)\)\]\s+if game_chat_launch\.is_none\(\) \{\s+open_developer_window\(app\.handle\(\)\)\?;\s+\}/u.test(
aiGameCreatorShellTauriSource,
) ||
developerWindowCallCount !== 1
aiGameCreatorShellTauriSource.includes('fn open_developer_window(') ||
aiGameCreatorShellTauriSource.includes(
'open_developer_window(app.handle())?;',
)
) {
throw new Error(
'AI game creator developer window must stay compile-time debug-only and outside game-chat launch',
'AI game creator normal startup must not automatically open a developer window',
);
}
for (const snippet of [