Commit Graph

3329 Commits

Author SHA1 Message Date
suzmii 2a3d1b3d65 Merge origin/master into chore/rust-compile-warnings
- 合入最新 base(2 个提交,15 文件),满足 CI 守卫步骤要求的 "pull request head 必须包含最新 base commit"。
- 自动合并无冲突;重叠文件(claude_code_cli.rs / codex_app_server/mod.rs / direct_runtime/mod.rs / config.rs / pitfalls.md / 技术方案文档)均为两侧改动互补。
2026-10-06 19:05:25 +08:00
suzmii d2b2cad045 refactor(agc): 补齐 llm_request 改名的 plumbing 与模块文档
Project CI / Backend tests (pull_request) Has been cancelled
Project CI / Native shell tests (pull_request) Has been cancelled
Project CI / Frontend tests (pull_request) Has been cancelled
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust crates (pull_request) Has been cancelled
Project CI / Repository checks (pull_request) Has been cancelled
Project CI / AI game creator shell web tests (pull_request) Has been cancelled
上一条提交(0a735ec0d)因 git add 命令里带了已不存在的旧路径而返回 128,只带上了文件重命名;本提交补齐同一改名所需的另外两处:

src/agent/generation.rs:6 mod loop_orchestration; → mod llm_request;,:52 pub(crate) use loop_orchestration::{ → llm_request::{。

src/agent/generation/llm_request.rs 顶部新增 //! 模块文档(LLM 文本请求与额度/进度错误面,注明循环编排已退役)。

两者与已提交的重命名构成完整改名;0a735ec0d 单独不可编译,本分支最终 tip 不受影响。

验证(在本 tip 上复测):bin 口径 0 warning / EXIT=0;--all-targets EXIT=0(test 实例 339 条);测试 runtime_prompt_bundle_build 17、prompt_source_boundaries 6、thread_manager 72、manifest_invalidation 1、agent_db 65、redaction 4 全 passed;cargo fmt --all --check、npm run check:encoding、git diff --check 全 rc=0;零新增 #[allow]。
2026-10-06 18:18:49 +08:00
suzmii 0a735ec0db refactor(agc): loop_orchestration 按内容改名为 llm_request(只动文件与 mod/再导出两行)
agent/generation/loop_orchestration.rs → agent/generation/llm_request.rs:剩 5 个符号全是 LLM 文本请求与其额度/进度错误面(request_game_creator_llm_text、GAME_CREATOR_MUD_POINTS_INSUFFICIENT_ERROR_KIND、消息构造、判定、公开摘要),多 pass 循环编排已随 Agent Runtime 退役。

同步 agent/generation.rs:6 的 mod 声明(mod loop_orchestration; → mod llm_request;)与 :52 的 pub(crate) use 前缀(loop_orchestration::{ → llm_request::{)。

文件顶部新增 //! 模块文档:LLM 文本请求与额度/进度错误面,并注明循环编排已退役。

实现、可见性、cfg 一律未改;调用点改动 0:git status 仅 1 个 R + 1 个 M(plumbing),无任何调用点文件被改(调用方使用再导出的项名)。

验证:bin 口径 0 warning / EXIT=0;--all-targets EXIT=0(test 实例 339 条不变);测试 runtime_prompt_bundle_build 17、prompt_source_boundaries 6、thread_manager 72、manifest_invalidation 1、agent_db 65、redaction 4 全 passed;cargo fmt --all --check、npm run check:encoding(5406 文件)、git diff --check 全 rc=0;零新增 #[allow]。
2026-10-06 18:18:14 +08:00
lhk229 9f1c5df446 规划移除GameAgent宿主运行时间上限 (#652)
Project CI / AI game creator shell Rust crates (push) Has been cancelled
Project CI / Backend tests (push) Has been cancelled
Project CI / AI game creator shell Rust lane 1/2 (push) Has been cancelled
Project CI / AI game creator shell Rust lane 2/2 (push) Has been cancelled
Project CI / Native shell tests (push) Has been cancelled
Project CI / Frontend tests (push) Has been cancelled
Project CI / Repository checks (push) Has been cancelled
Project CI / AI game creator shell web tests (push) Has been cancelled
补充移除累计执行与整轮墙钟上限的行为规范
新增里程碑及实施计划,明确保留独立超时与生命周期控制
明确删除退役代码并限制旧配置和执行账本的数据迁移范围

Reviewed-on: #652
Co-authored-by: lhk <ink29535@proton.me>
Co-committed-by: lhk <ink29535@proton.me>
2026-10-06 18:13:39 +08:00
suzmii 8b7cd8de5a refactor(agc): 三个名不副实的模块按内容改名,只动文件与 mod/再导出(各 2 行 plumbing)
Project CI / Backend tests (pull_request) Failing after 20s
Project CI / Frontend tests (pull_request) Has been cancelled
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust crates (pull_request) Has been cancelled
Project CI / Repository checks (pull_request) Has been cancelled
Project CI / AI game creator shell web tests (pull_request) Has been cancelled
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Has been cancelled
Project CI / Native shell tests (pull_request) Has been cancelled
agent/generation/draft_validation.rs → agent/generation/game_html_validation.rs(剩 9 个公开项全是游戏 HTML/JS 校验原语,草案链已退役);同步 agent/generation.rs:4 的 mod 声明与 :35 的再导出前缀;文件顶部新增 //! 模块文档。

agent/runtime_models.rs → agent/provider_request_snapshot.rs(只剩 1 个 DTO AgentRuntimeProviderRequestSnapshot);同步 agent.rs:36 的 mod 声明与 :80 的 pub(in crate::agent) use 前缀;顶部新增 //! 模块文档。

process_session/recovery.rs → process_session/shutdown.rs(只剩 shutdown_all_process_sessions 与 shutdown_all_process_sessions_and_wait);同步 process_session.rs:8 的 mod 声明与 :11 的再导出前缀;顶部新增 //! 模块文档。

实现、可见性、cfg 一律未改:三个文件的函数体逐字节不变,无新增/删除 #[allow];无新增导入。

调用点改动数 = 0(证据):git status 仅 3 个 R(重命名)+ 3 个 M(plumbing:agent/generation.rs、agent.rs、process_session.rs),无任何调用点文件被改;shutdown_all_process_sessions 的两处调用点 runner/dispatch.rs:543 与 runner/server/desktop.rs:164 用的是项名 crate::shutdown_all_process_sessions*,模块改名不影响。

第四项 loop_orchestration.rs → llm_request.rs 未做:按约定规则,改名会碰到 mod/再导出之外的引用(3 处文档),已停下单独报告等裁决。

验证:bin 口径 0 warning / EXIT=0;--all-targets EXIT=0(test 实例 339 条不变);测试 runtime_prompt_bundle_build 17、prompt_source_boundaries 6、thread_manager 72、manifest_invalidation 1、agent_db 65、redaction 4 全 passed;cargo fmt --all --check、npm run check:encoding(5406 文件)、git diff --check 全 rc=0。
2026-10-06 18:13:29 +08:00
suzmii fbea592513 refactor(agc): 把角色记忆路径 helper 并回 project/memory.rs,删除名实不符的 pass_artifacts.rs
src/agent/generation/pass_artifacts.rs 整文件删除:该文件名承诺“多 pass 产物写入”,退役清理后只剩两个“角色记忆路径”工具函数,与文件名无关。

两个函数(agent_role_memory_relative_path / agent_role_memory_relative_path_for_task)逐字移入 src/project/memory.rs(其唯一消费者 project/memory.rs:38/71 所在模块,记忆路径构造属该模块域),实现未改一字。

src/agent/generation.rs 删除 mod pass_artifacts; 与 pub(crate) use pass_artifacts::agent_role_memory_relative_path_for_task;(原跨模块再导出不再需要)。

调用点不变:project/memory.rs 的两处调用现在解析到同模块定义。

验证:AGC 壳 bin 口径 0 warning / EXIT=0;--all-targets EXIT=0(test 实例 339 条不变);定向用例 invalid_toolbar_arguments_are_rejected_before_any_generation(唯一触达这些记忆函数的用例)1 passed;cargo fmt --all --check、npm run check:encoding、git diff --check 全绿;零新增 #[allow]。
2026-10-06 18:04:29 +08:00
suzmii 8cd6d45d1c refactor(agc): 把路径脱敏原语并入 agent/redaction.rs,删除名实不符的空壳模块
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust crates (pull_request) Has been cancelled
Project CI / Backend tests (pull_request) Has been cancelled
Project CI / Native shell tests (pull_request) Has been cancelled
Project CI / Frontend tests (pull_request) Has been cancelled
Project CI / Repository checks (pull_request) Has been cancelled
Project CI / AI game creator shell web tests (pull_request) Has been cancelled
src/repository_context.rs 整文件删除:该文件在 lane A 收敛后只剩脱敏链,文件名承诺的“仓库启动上下文”已不存在(名实不符)。

redact_absolute_path_tokens + 5 个私有 helper(starts_absolute_path / starts_forward_slash_unc_path / starts_file_uri / is_path_boundary / consume_path_token)+ #[cfg(test)] mod tests(2 例)逐字搬入 src/agent/redaction.rs(该模块自述职责即“诊断文本的长度收口与脱敏”),可见性保持 pub(crate),实现未改一字。

main.rs 删除 mod repository_context; 与 use repository_context::*;。

agent/generation/canvas_generation.rs 改为显式 use crate::agent::redaction::redact_absolute_path_tokens;(不再依赖 crate 根 glob);agent/redaction.rs 内部调用点不受影响。

验证:AGC 壳 bin 口径 0 warning / EXIT=0;--all-targets EXIT=0(test harness 实例 339 条不变);测试 runtime_prompt_bundle_build 17、prompt_source_boundaries 6、thread_manager 72、manifest_invalidation 1、agent_db 65、redaction 4(含搬移过来的 2 例)全 passed;cargo fmt --all --check、npm run check:encoding、git diff --check 全绿;零新增 #[allow]。
2026-10-06 18:00:55 +08:00
suzmii 9fbab1a92c chore(agc): 给 AGC 壳加生产口径 warning 门禁(cfg_attr(not(test), deny(warnings)))
src/main.rs 顶部加 `#![cfg_attr(not(test), deny(warnings))]`,并留注释说明为何不用 `[lints]` 表:`--all-targets` 会把同一个 bin target 再编一次,harness 实例里 `#[cfg(not(test))] fn main()` 被排除、`generate_handler!`/`desktop::run()` 链不可达,产生一批属测试构建产物的假死告警(当前 339 条),若用 `[lints] warnings = deny` 会被 deny 而 CI 必红。

AGC 的 Cargo.toml 不加 `[lints]`(保持现状);server-rs workspace、4 个 exclude crate、desktop-shell 与三个 bridge 的 `[lints]` 写法不变。

门禁自证(生产可见处插入未使用变量):bin 口径失败并报 `error: unused variable: gate_selfcheck_unused_probe` + `= note: #[deny(unused_variables)] implied by #[deny(warnings)]`(RC=101);撤销后同命令转绿(RC=0,无 warning)。

带门禁的 `--all-targets` 仍 EXIT=0(test 实例 339 条不受影响)。
2026-10-06 17:42:38 +08:00
suzmii 92ac352709 chore(agc): 摘掉从未构造的 brief 传参空转(戊组,bin 2 → 0)
src/main.rs:删除 `AgentRoleBrief` 与 `AgentGroupBrief` 两个从未被构造的结构(全仓 0 处 `AgentRoleBrief {` / `AgentGroupBrief {`)。

canvas_generation.rs:摘掉 9 个函数形参(8 个 `briefs: &[AgentGroupBrief]` + 1 个 `_briefs: &[AgentGroupBrief]`:generate_platform_art_asset_at / admit_platform_art_generation_at / generate_admitted_platform_art_asset_at / generate_platform_art_asset_with_options_at / generate_platform_art_asset_with_runtime_options_at / generate_art_package_asset_with_runtime_options_at / generate_platform_art_asset_with_runtime_options_and_retention_at / request_platform_art_asset_with_runtime_options_at)。

删除 31 个调用点的对应实参(10 处 `briefs`/`_briefs` 透传、21 处字面量 `&[]`),涉及 canvas_generation.rs、agent/direct_runtime/mod.rs、agent/direct_tool_bridge.rs、asset_generation_tasks/runtime.rs、commands.rs、commands/desktop.rs。

定性:这些值可证永远为空且无读取者,函数可见性均 crate 内私有、无 `#[tauri::command]`、不涉持久化与公开契约;行为不变。

验证:bin 口径 warning 2 → **0**,EXIT=0;`cargo fmt --all --check` 干净。
2026-10-06 17:37:22 +08:00
suzmii a5d28c9898 chore(agc): 生成器只发射消费方读取的角色/分组字段(丁组,bin 4 → 2)
build_support/runtime_prompt_bundle.rs:render_role_array 不再 emit `id`/`tool_id`,改为 `AgentRoleDefinition {{ role, task_id, brief_path_name }}`;render_group_value 不再 emit `role`/`brief_path_name`,改为 `AgentGroupDefinition {{ id, label, roles }}`。

src/main.rs:AgentRoleDefinition 删 `id`/`tool_id`(保留 `role`/`task_id`/`brief_path_name`——`agent/generation/pass_artifacts.rs:9` 仍在读 `brief_path_name`);AgentGroupDefinition 删 `role`/`brief_path_name`(保留 `id`/`label`/`roles`)。

tests/runtime_prompt_bundle_build.rs:fixture 自带的两个 struct 声明同步为新形状(358 与 882-891 的断言不受影响)。

prompts/runtime/manifest.json 与 build_support 的 catalog 字段一律未动;生成物只经生成器改(OUT_DIR/agent_runtime_prompt_bundle.rs 已被 include! 进 crate)。

验证:bin 口径 warning 4 → 2,EXIT=0;生成物新形状实例:`AgentRoleDefinition { role: "Director", task_id: "design-director", brief_path_name: "director.md" }`、`AgentGroupDefinition { id: "supervisor", label: "项目总控", roles: &PROJECT_SUPERVISOR_AGENT_ROLES }`。
2026-10-06 17:35:20 +08:00
suzmii 2412eede4f chore(agc): 删除随多 lane 合并才失去消费者的 run profile 常量与函数(丙组,bin 6 → 4)
main.rs:删 `const AGENT_RUNTIME_RUN_PROFILE_STANDARD: &str = "standard";` 与 `fn default_agent_runtime_run_profile()`——后者唯一引用前者,两者在任一 lane 树上都还各有 1 处引用,属真跨分支耦合(合并后 0 引用)。

已全仓搜索确认无 `#[serde(default = "default_agent_runtime_run_profile")]` 之类字符串引用。

验证:bin 口径 warning 6 → 4,EXIT=0。
2026-10-06 17:33:38 +08:00
suzmii 82f0907294 chore(agc): 把仅测试使用的常量与探针按 cfg(test) 收敛(乙组,bin 9 → 6)
main.rs:`AGENT_RUNTIME_AUTONOMOUS_SOURCE_FIELD_MAX_CHARS`、`AGENT_RUNTIME_AUTONOMOUS_SOURCE_TOTAL_MAX_CHARS` 加 `#[cfg(test)]`(使用点全在 cfg(test):project/agent_db.rs 的测试区与 project/agent_db/security_tests.rs;security_tests.rs 68 例零改动)。

assets.rs:`external_editor_api_credentials_override_is_active` 加 `#[cfg(test)]`(使用点全在本文件 2785-2819 的测试)。

只做 cfg 收敛,不删实现、不新增 allow、不加假引用。

验证:bin 口径 warning 9 → 6,EXIT=0。
2026-10-06 17:32:55 +08:00
suzmii 98cecdfc5e chore(agc): 清理跨分支耦合后失去消费者的退役 DTO/常量/函数(甲组,bin 24 → 9)
main.rs:删 `use platform_agent::{build_game_creation_seed_task_graph, plan_game_creation_agent_pass, route_game_creation_repair_issues};` 与 shared-contracts 列表中已无消费者的 `GAME_CREATION_AGENT_RUN_SCHEMA_VERSION`。

main.rs:删退役 DTO/结构 `GenerateLocalGameDraftResult`、`AgentPassArtifactPaths`、`AgentPassAgenda`、`LlmGameDraft`、`LlmAgentHandoff`、`GameCreatorAgentLoopResult`(后三者互引,一并删除后无级联孤儿)。

main.rs:删退役常量 `GAME_CREATOR_AGENT_LOOP_MAX_PASSES`、`GAME_CREATOR_CONVERSATION_CONTEXT_MAX_MESSAGES`。

platform_session.rs:删 `platform_session_is_available`。

project/agent_db.rs:删 `append_jsonl_line`(其内部 `append_jsonl_line_unlocked` 仍有其他使用者)。

project/conversation.rs:删 `append_markdown_entry`。

project/manifest.rs:删 `record_draft_task_progress`。

config.rs:删 `build_game_creator_llm_client_without_redirects_from_llm_config`。

验证:bin 口径 warning 24 → 9,EXIT=0,无 error 行;每个符号删前均以 Git 全树引用矩阵确认(见 local://rust-warning-coupling-report-20261006.md §3a)。
2026-10-06 17:32:10 +08:00
suzmii f83cf1b9bf fix(agc): rustfmt 对齐合并后的 lane C agent 链文件
合并 lane C 后 cargo fmt --all --check 在 5 个文件上不干净(agent.rs、agent/codex_cli.rs、agent/direct_events.rs、agent/generation.rs、agent/codex_app_server/model_catalog/real_tests.rs):仅 reorder/wrap,无行为改动。

原因:这些文件是 lane C 的内容,其分支上未过 rustfmt;仓库 pre-commit 的 rustfmt 门禁按 AGC workspace 整体检查,不修会挡住后续各组提交。

处理:cargo fmt --all --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml 后 --check 干净(rc=0)。
2026-10-06 17:31:55 +08:00
suzmii a667355164 合并 lane D2 后续:prompt bundle 生成器标签收敛与 rustfmt 修正
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust crates (pull_request) Has been cancelled
Project CI / Backend tests (pull_request) Has been cancelled
Project CI / Native shell tests (pull_request) Has been cancelled
Project CI / Frontend tests (pull_request) Has been cancelled
Project CI / Repository checks (pull_request) Has been cancelled
Project CI / AI game creator shell web tests (pull_request) Has been cancelled
- 并入本地分支 chore/agc-warnings-misc @ 09f7a310c(4 文件):build_support/runtime_prompt_bundle.rs 的 provider_fragment_entries 收敛、game_distribution_publish.rs 注释对齐退役事实、image_inspect.rs 与 command_exec.rs 的 rustfmt 修正。
- 与后续丁组(改 render_role_array/render_group_value 的 emit)改同一文件的不同函数,语义互不重叠。
2026-10-06 17:29:30 +08:00
suzmii 09f7a310cc chore(agc): 对齐退役注释、收敛 prompt bundle 生成器标签,并 rustfmt 修正
- `game_distribution_publish.rs`:`OwnerGameEntry` 的 doc 注释与 `localProjectId` 字段
  已按「仅测试读取」收敛成 `cfg(test)` 的现状对齐(生产按本地 manifest 的 `projectId` 匹配,
  只有 `parse_owner_game_entry` 的解析用例读它)。
- `build_support/runtime_prompt_bundle.rs`:`provider_fragment_entries` 第二个元素
  (`RUNTIME_PROMPT_PROVIDER_*_SECTION` 常量名)随退役 Runtime 的常量生成逻辑停发后已无消费者
  (三处调用点都忽略它),收敛为 `(manifest 路径键, section 键)` 二元组,行为不变。
- rustfmt:HEAD 上 `cargo fmt --all --check` 不通过(M1 的 `command_sandbox` 导入换行、
  `image_inspect.rs` 两处调用/断言换行),会让 husky `check:rustfmt` 失败;一并修正,无语义变化。

实测(`CARGO_TARGET_DIR=W:/tmp/agc-target-laneD`,features cocos/unity/godot-editor-execute):
- `cargo check`(bin)EXIT=0,领地 21 条(全为耦合项,未变);
- `cargo check --all-targets` EXIT=0,领地 harness 增量 336→335(-1 来自 M2 的 unused import);
- `cargo test --test runtime_prompt_bundle_build --test prompt_source_boundaries`:
  17 passed + 6 passed,0 failed(改了生成器,按 dev 运维文档必跑);
- `cargo fmt --all --check` 通过。
2026-10-06 17:11:08 +08:00
suzmii e4361b1924 合并 lane D:收敛无测试消费者的 Tauri 命令接入与退役 Runtime 残留
- 并入本地分支 chore/agc-warnings-misc @ 3a97ce6b1(22 文件,含两批):commands.rs/config.rs 命令接入收敛、debug.rs 删除、command_exec/command_sandbox/runner 等未用项清理、runtime_prompt_bundle 生成器停发无消费者 prompt section;末端两处必修项:command_exec.rs 补 #[cfg(target_os = "linux")] use crate::command_sandbox::{…}(M1)、runner/tests.rs 删残留 import(M2)。
2026-10-06 17:02:34 +08:00
suzmii 867045765f 合并 lane A:清理 AGC 热点三模块不可达实现(272 条 warning)
- 并入本地分支 chore/agc-compile-warnings @ 6d5436541(5 文件):删除 git_inspect.rs / patchset.rs 全文件、repository_context.rs 收敛到 141 行只保留脱敏链、main.rs 撤 4 行、tests/prompt_source_boundaries.rs 撤 1 条 case。
2026-10-06 17:02:20 +08:00
suzmii 098431d5fe 合并 lane B:清理 AGC 客户端退役运行时(session record / 内容 diff / ledger 写入层)遗留告警
- 并入本地分支 chore/agc-warnings-session @ 4e8662e87(18 文件):process_session 退役模块删除、project/* 与 runner/tests.rs 未用项收敛。
2026-10-06 17:02:11 +08:00
suzmii f3a476af7b 合并 lane C:清理 AGC agent 生成链退役实现并删除 OAuth/AuthBridge 链路
- 并入本地分支 chore/agc-warnings-agent @ 86478e8a5(两批共 30 文件):第一批收敛 generation 链退役实现与重导出、task_lock/redaction/direct_events/agent.rs 未用导入、codex_bundle CLI_VERSION 按 profile 收敛;第二批删除 OAuth/AuthBridge 链路(codex_cli.rs / codex_app_server / model_catalog / canvas_generation / prompt_context 等)与 agent 子系统余下 dead_code。
2026-10-06 17:02:03 +08:00
suzmii 3a97ce6b13 fix(agc): 修 lane B 评审的两处必修项
1. 非 Windows 目标会 E0425:main.rs 去掉 `use command_sandbox::*;` 后,
   command_exec.rs 在 `#[cfg(target_os = "linux")]` 块里裸名使用的
   prepare_command_sandbox_launch / stage_command_sandbox_launch /
   CommandSandboxLaunch / command_sandbox_platform_metadata 失去来源
   (command_exec.rs 靠 `use super::*` 继承 main.rs 的 glob)。改为在
   command_exec.rs 顶部显式 `#[cfg(target_os = "linux")] use crate::command_sandbox::{...}`,
   Windows 口径下不引入新的 unused import。已核对这是全部裸名使用点:
   trampoline/process_session_bridge 均为全限定或自带 import。

2. src/runner/tests.rs 的 `use crate::{unix_timestamp, ProcessSessionRecord};`
   两个名字在文件内各只在 import 行出现一次,整行删除(warning 已消失);
   lane B 已删 ProcessSessionRecord 本体,保留该名字合并后会 E0432。

实测:bin 与 --all-targets 两口径 cargo check 均 EXIT=0;领地 bin 21(不变)、
--all-targets 346→345。Linux 目标本机无法编译验证(缺少 GTK sysroot,
glib-sys/gobject-sys/gio-sys 的 pkg-config 交叉编译失败,与本改动无关),
第 1 项按"显式 import 覆盖全部 4 个裸名"构造性验证。
2026-10-06 16:59:21 +08:00
suzmii 86478e8a5f chore(agc): 删除 OAuth/AuthBridge 链路并清掉 agent 子系统的余下 dead_code
认证路线决策(2026-10-06):不支持用户自有 Codex 的 OAuth 登录态,模型流量统一走中转站。

- 删除 AuthBridge 凭据变体、OAuth 专属 auth.json 读取分支、OAuth 轮换链、
  model_catalog/auth_handoff.rs 整文件,以及 G11 余下只服务该链的符号
  (APP_SERVER_PROTOCOL/protocol_identity、AUTH_MAX_BYTES、ToolHost、
  acquire、request_/stream_agent_codex_app_server)。
- 保留并逐条验证中转站路由(平台会话代理 / 显式自定义 Key)、共享模型目录捕获、
  隔离运行环境;存疑即留。
- G8 余下:prompt_context 14 项、canvas_generation 12 项、
  external_generation_state 6 项、loop_orchestration 6 项;generation.rs re-export 同步收敛。
- G12:codex_cli 退役 CLI 请求路径(601 行)与其 7 个专属用例。
- runtime_models 收敛为仍在服役的 provider 请求快照。
- thread_manager 仅测试使用的访问器按 cfg(test) 收敛;仅生产入口使用的按
  cfg(not(test)) 收敛;direct_events 事件接收端 import 同口径收敛。

bin 口径 0 warning;--all-targets 口径余 5 条(lib target 编译把 config/commands/
project 等模块排除在外导致的假阳性,见报告)。无新增 allow、无假引用。
2026-10-06 16:59:16 +08:00
suzmii 6621bbad97 chore(agc): 把无测试消费者的 Tauri 命令接入收敛到生产边界
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Failing after 2m56s
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Failing after 3m17s
Project CI / AI game creator shell Rust crates (pull_request) Failing after 4m49s
Project CI / Repository checks (pull_request) Failing after 1m15s
Project CI / Frontend tests (pull_request) Successful in 3m29s
Project CI / Native shell tests (pull_request) Failing after 7m22s
Project CI / AI game creator shell web tests (pull_request) Successful in 3m12s
Project CI / Backend tests (pull_request) Successful in 9m26s
run_limited_local_command / read_local_game_memory / read_local_agent_memory /
write_local_agent_memory / write_local_game_memory / read_local_project_file 这 6 条
#[tauri::command] 没有任何测试直接调用(--all-targets 实测均报 never used),按仓库
既定口径给包装加 #[cfg(not(test))]。注册表在 src/desktop.rs 的
invoke_handler(generate_handler![...]),而 main.rs 已是 #[cfg(not(test))] mod desktop;,
测试构建不编译该表,因此无需改动注册表。

这样被调用方在测试构建里不再被无条件引用,lane B 可继续收敛:
project/memory.rs 的 read_local_game_memory_at / read_local_agent_memory_at /
write_local_agent_memory_at / write_local_game_memory_at / memory_file_path,
project/filesystem.rs 的 is_agent_trace_read_path,
project/verification.rs 的 run_limited_local_command_at。

实测:bin 与 --all-targets 两口径 cargo check 均 EXIT=0。
2026-10-06 16:49:52 +08:00
suzmii fcd8607204 chore(agc): 清理退役 Runtime 残留,改生成器停发无消费者的 prompt section
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust crates (pull_request) Has been cancelled
Project CI / Backend tests (pull_request) Has been cancelled
Project CI / Native shell tests (pull_request) Has been cancelled
Project CI / Frontend tests (pull_request) Has been cancelled
Project CI / Repository checks (pull_request) Has been cancelled
Project CI / AI game creator shell web tests (pull_request) Has been cancelled
- main.rs:删除已退役 Runtime/Goal/Task/Event 序列化视图、无人引用的输出 token 与
  runtime 限额常量、AgentRuntimeState 等 DTO 及其专属夹具
- 删除只服务退役 Runtime 的调试草稿模块(src/debug.rs、src/debug/debug_drafts.rs)
- image_inspect:删除退役的 image.inspect 入口(load_agent_runtime_inspection_images
  及其路径解析/校验/摘要链);资源预览路径与共享读取器行为不变,专属测试改打资源预览入口
- 仅测试使用 → cfg(test):command_output 分页 API、resource_preview_scheduler
  uncancelled、ui_editor initialize_ui_design_state_at、assets 凭据失败判定、
  game_distribution_publish OwnerGameEntry.localProjectId、command_exec as_str
- 仅 Linux 使用 → cfg(target_os = "linux"):command_sandbox CommandSandboxMetadata /
  command_sandbox_platform_metadata,并删掉 non-linux legacy 分支
- 删无用导入/形参(runner re-export、command_sandbox glob、TcpListener 改 cfg(test)、
  LlmMessageContentPart、config 提权修复未用的 path 形参)
- build.rs 生成器:不再产出 runtime_prompt_bundle_section 与 RUNTIME_PROMPT_* 常量,
  只生成仍被引用的 Agent 目录;同步更新 tests/runtime_prompt_bundle_build 期望

实测:bin 口径(--features cocos/unity/godot-editor-execute)本人领地残留 21 条,
全部是 lane C 死函数仍按类型引用的耦合项;runtime_prompt_bundle_build(17) 与
prompt_source_boundaries(6) 共 23 例全绿。
2026-10-06 16:47:07 +08:00
suzmii 4e8662e87c 清理 AGC 客户端退役运行时遗留的编译告警(session record / 内容 diff / ledger 写入层)
Project CI / AI game creator shell Rust crates (pull_request) Successful in 5m57s
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Successful in 7m16s
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Successful in 8m0s
Project CI / Frontend tests (pull_request) Successful in 3m31s
Project CI / Backend tests (pull_request) Successful in 7m31s
Project CI / AI game creator shell web tests (pull_request) Successful in 3m21s
Project CI / Native shell tests (pull_request) Successful in 8m27s
Project CI / Repository checks (pull_request) Successful in 6m58s
- process_session:删除退役的 record 模型与 io/persistence/lifecycle 模块及 30 例专属测试,保留 WindowsProcessJob、process_session_bridge 与 Runner 退出用的会话收尾入口。
- project/checkpoint:删除退役的本地项目内容 diff 实现与 3 例专属测试;3 例链接/敏感路径安全用例剥离 diff 断言后保留。
- project/agent_db:ledger 写入/校验层已无生产调用方、仅安全断言使用,27 项按 cfg(test) 收敛保留 68 例覆盖,4 项真死删除。
- project/*:真死条目删除,测试独占条目 cfg(test),仅生产入口条目按调用方条件 cfg(not(test));project.rs 丢弃失效 re-export/导入。
- runner/tests.rs:删除已无引用的 crate 导入块。
2026-10-06 16:46:14 +08:00
suzmii 22540a874a chore(agc): 清掉 agent 生成链退役实现的 dead_code 与未用导入
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Failing after 4m1s
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Failing after 2m15s
Project CI / AI game creator shell Rust crates (pull_request) Failing after 4m45s
Project CI / Frontend tests (pull_request) Successful in 3m51s
Project CI / AI game creator shell web tests (pull_request) Successful in 3m46s
Project CI / Repository checks (pull_request) Failing after 3m53s
Project CI / Backend tests (pull_request) Successful in 9m2s
Project CI / Native shell tests (pull_request) Successful in 11m6s
- 删除已退役的多 pass 生成链实现:generation/pass_artifacts.rs(保留仍被
  project/memory.rs 使用的 agent_role_memory_relative_path*)、
  generation/draft_writer.rs(整文件)、generation/draft_validation.rs 与
  generation/trace.rs 中已无任何 cfg 引用的实现与其专属测试。
- generation.rs 按新边界收敛 re-export;draft_validation.rs 不再需要 use super::*。
- redaction.rs / task_lock.rs 删除无调用方的 helper;task_lock 的 Mutex/OnceLock
  只在 unix 分支使用,按 cfg 收敛导入。
- direct_events.rs 删除只服务已删实现的测试 helper。
- agent.rs 删除未使用的 BTreeSet/Seek/Atomic* 导入(sha2 仍被子模块经 use super::*
  使用,保留)。
- build_support/codex_bundle.rs:CLI_VERSION 只在发行构建与单测使用,按 cfg 收敛。

无新增 allow,无假引用;AGC 壳 bin 口径(cocos/unity/godot-editor-execute)编译通过。
2026-10-06 16:33:55 +08:00
suzmii c1ad1a19f8 修复 api-server 未使用常量并给已清零的 Rust 包加 warning 门禁
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust crates (pull_request) Has been cancelled
Project CI / Backend tests (pull_request) Has been cancelled
Project CI / Native shell tests (pull_request) Has been cancelled
Project CI / Frontend tests (pull_request) Has been cancelled
Project CI / Repository checks (pull_request) Has been cancelled
Project CI / AI game creator shell web tests (pull_request) Has been cancelled
删除 api-server src/llm/mod.rs 中零引用的测试常量 TEST_AGC_MODEL_DEFAULT_ID,全仓仅定义处命中,无调用方与专属用例。

server-rs workspace 根新增 [workspace.lints.rust] warnings = "deny",27 个成员 crate 各自新增 [lints] workspace = true。

4 个被 exclude 的独立 crate(agent-runtime-core、agent-runtime-orchestration、editor-adapter-api、platform-agent)各自新增 [lints.rust] warnings = "deny"。

apps/desktop-shell/src-tauri 与 unity/godot/cocos 三个编辑器 bridge 各自新增 [lints.rust] warnings = "deny";未触碰 apps/ai-game-creator-shell/src-tauri 及其 vendor。

验证:server-rs --workspace --all-targets、desktop-shell、三个 bridge、4 个 exclude crate 全部 rc=0 且输出 0 条 warning;api-server llm:: 定向用例 30 passed / 0 failed。

门禁自证:api-server 与 editor-adapter-api 各插入未使用变量后 cargo check 均失败并报 -D warnings(-D unused-variables implied by -D warnings),撤销后同一命令转绿 rc=0。
2026-10-06 16:32:28 +08:00
suzmii 6d5436541c 清理 AGC 热点三模块不可达实现(272 条 warning)
Project CI / AI game creator shell Rust crates (pull_request) Successful in 6m5s
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Successful in 7m2s
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Successful in 8m0s
Project CI / Backend tests (pull_request) Successful in 8m58s
Project CI / Frontend tests (pull_request) Successful in 3m11s
Project CI / AI game creator shell web tests (pull_request) Successful in 3m47s
Project CI / Repository checks (pull_request) Successful in 6m38s
Project CI / Native shell tests (pull_request) Successful in 8m34s
根因:退役提交 839051f5「退役AGC独立Agent Runtime与CLI执行面」删除 agent/runtime_tools 等调用面时漏删这三个模块,此后三者均无现役调用方(bin 与 --all-targets 两种口径下 dead_code 计数相同,且文件内无 cfg(feature/cfg(windows) 分支)。

- 删除 src/git_inspect.rs 全部实现(88 条 dead_code):文件内部互相调用不构成活根;同时删除 main.rs 的 `mod git_inspect;`、`use git_inspect::*;` 与文件内 #[cfg(test)] 模块 23 例。失去的行为覆盖:受控本地提交事务、Windows index 替换语义、Git 控制文件硬链接/重解析点拒绝、fingerprint 稳定性;当前文件级补丁与提交路径为 agent/direct_patch.rs,不含多文件提交事务语义。
- 删除 src/patchset.rs 全部实现(65 条 dead_code):多文件原子 patchset 应用已被 agent/direct_patch.rs 取代,无任何调用方;同时删除 main.rs 的 `mod patchset;`、`use patchset::*;` 与 mod tests 9 例。失去的行为覆盖:patchset 输入解析与七字段严格校验、预检/应用/回滚事务、路径冲突与敏感路径拒绝、正文大小预算。
- 收敛 src/repository_context.rs(119 条 → 0):仅保留现役脱敏链 redact_absolute_path_tokens 及私有 helper starts_absolute_path / starts_forward_slash_unc_path / starts_file_uri / is_path_boundary / consume_path_token(经 main.rs glob 供 agent/redaction.rs:88 与 agent/generation/canvas_generation.rs:1080 使用);删除仓库启动上下文扫描与渲染的其余 113 条实现、全部常量与 20 例测试,保留仍覆盖保留函数的 2 例路径脱敏测试。失去的行为覆盖:仓库扫描/清单与 Skill 摘要/文档预算/Git 状态采集与渲染/fingerprint。
- 删除 tests/prompt_source_boundaries.rs 中 src/repository_context.rs 的源码边界用例:其断言对象 render_repository_startup_context_for_prompt 已随实现删除。

口径:cargo check --features cocos-editor-execute,unity-editor-execute,godot-editor-execute
2026-10-06 16:23:21 +08:00
suzmii d2e05dbeb7 Merge remote-tracking branch 'origin/master' into fix/agc-composer-layout
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Successful in 7m3s
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Successful in 5m24s
Project CI / AI game creator shell Rust crates (pull_request) Successful in 4m14s
Project CI / Frontend tests (pull_request) Successful in 3m48s
Project CI / Backend tests (pull_request) Successful in 8m5s
Project CI / AI game creator shell web tests (pull_request) Successful in 3m0s
Project CI / Repository checks (pull_request) Successful in 7m30s
Project CI / Native shell tests (pull_request) Successful in 9m44s
合并 master be9f74f42(付费游玩泥点付费规范 #635 等):保留双方条目/内容
- 唯一冲突:`docs/project-memory/shared-memory/pitfalls.md` —— 本分支 2 条(2026-10-05「PR #607 复核修复」+「模型菜单的观感是组件自带的共享样式面」)在前,master 新增 2 条(「给 shared-contracts 请求 DTO 加字段」+「付费游戏播放会话前缀落在 /api/*」)紧随其后,**两侧 4 条都保留**(grep 逐条命中 1)
- 其余 286 个文件自动合并(master 侧含 server-rs / admin-web / 主站 / vite.config.ts 等,与本分支不重叠;`styles.css` 也是自动合并、无冲突)
- 门禁(本轮只合并、未改内容):`vitest run appSurface + chatDialogFrameLayout + conversationModelSelect` **258 passed / 9 skipped**;`npm run agc:typecheck` pass 3 / fail 0;`npm run check:encoding` 5418 files;`git diff --check` rc=0;prettier 已对合并后的 pitfalls 重新折行
2026-10-06 15:19:31 +08:00
suzmii b2ffdc4cae 模型菜单刷新行改成左对齐:图标 + 文本贴最左成一组
Project CI / AI game creator shell Rust crates (pull_request) Successful in 5m1s
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Successful in 7m11s
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Successful in 6m25s
Project CI / Frontend tests (pull_request) Successful in 3m23s
Project CI / Backend tests (pull_request) Successful in 8m1s
Project CI / AI game creator shell web tests (pull_request) Successful in 3m2s
Project CI / Repository checks (pull_request) Successful in 7m6s
Project CI / Native shell tests (pull_request) Successful in 9m31s
- 现象(用户截图 446×330):刷新行的图标在左、「刷新模型列表」文案被顶到行右端
- 根因:`styles.css:11706`(本次修复前)宿主作用域那条「抵消通用按钮样式」的规则统一写了 `justify-content: space-between !important`(8 类 + `!important`)→ 特异性压过 `styles.css:11751` 的 `.conversation-model-menu-refresh { justify-content: flex-start !important }`(1 类)
- 改法:宿主那条块**不再写对齐**(只留 position/display/align-items/width/margin/border/shadow/字号),对齐按角色分到共享样式面——`.conversation-model-select .conversation-model-menu button[role='option'] { justify-content: space-between !important }`(选项行名字左 / 勾右),刷新行继续用 `.conversation-model-menu-refresh { justify-content: flex-start !important; gap: 8px !important }`(gap 从 7px 收到卡片内既有的 8px 节奏,与工具条列间距同值,不新造数)
- 实测(无头 Chromium,438px / 280px):卡片 `padding-left: 12px`;**列表行 left = 刷新行 left = 459.5**(438 档;280 档同为 380.5);图标 left = 行 left + 行内边距 10 = 469.5;文本 left = 图标右缘 482.5 + **8.00px** = 490.5;计算值 `justify-content: flex-start`、`gap: 8px`;文本右缘 562.5 ≪ 行右缘 693.5(改前会贴近右端)
- 测试:`chatDialogFrameLayout.test.ts` 新增「模型菜单刷新行:图标与文本贴最左,选项行才用 space-between」——刷新行必须解出 `flex-start` + `gap: 8px`,选项行必须仍是 `space-between`(宿主块那条 8 类规则会被一并算进层叠求值,写回对齐就会变 `space-between` 而红)。**改前红(实测)**:把 `justify-content: space-between !important` 写回宿主块 → `expected 'space-between' to be 'flex-start'`(1 failed / 15 skipped);移除即绿
- 校验:`vitest run appSurface + chatDialogFrameLayout + conversationModelSelect` **258 passed / 9 skipped**;typecheck pass 3 / fail 0;eslint(TS 部分)0 error;prettier 全绿;encoding 5402 files;spacetime-schema 93 tables;`git diff --check` rc=0

Refs #600, PR #607
2026-10-06 14:03:36 +08:00
suzmii f0cad9dddc 合并 origin/master(52c83cc2a,248 个提交)到 feat/game-purchase
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Successful in 5m28s
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Successful in 7m26s
Project CI / AI game creator shell Rust crates (pull_request) Successful in 4m41s
Project CI / AI game creator shell web tests (pull_request) Successful in 3m56s
Project CI / Backend tests (pull_request) Successful in 9m4s
Project CI / Repository checks (pull_request) Successful in 7m13s
Project CI / Native shell tests (pull_request) Successful in 10m16s
Project CI / Frontend tests (pull_request) Successful in 2m26s
- 同步 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/绑定语义变化。
2026-10-06 13:12:32 +08:00
suzmii 76ad99d2f7 Merge remote-tracking branch 'origin/master' into fix/agc-composer-layout
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Successful in 7m5s
Project CI / AI game creator shell Rust crates (pull_request) Successful in 4m33s
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Successful in 6m19s
Project CI / Frontend tests (pull_request) Successful in 2m22s
Project CI / Backend tests (pull_request) Successful in 8m0s
Project CI / AI game creator shell web tests (pull_request) Successful in 3m53s
Project CI / Repository checks (pull_request) Successful in 7m6s
Project CI / Native shell tests (pull_request) Successful in 9m54s
合并 master 52c83cc2a(模板 templateVersion 递增,#643):零冲突
- master 只动 template-library/v1/{blank-3d-scene,phaser-2d-starter,threejs-3d-starter}/meta.json 各 1 行,与本分支不重叠
- 验证:ancestor rc=0、工作树干净;门禁:`vitest` appSurface + chatDialogFrameLayout + conversationModelSelect = 257 passed / 9 skipped、`agc:typecheck` pass 3 / fail 0、`git diff --check` rc=0、模板发布守卫 `node --test scripts/agc-template-library-publish.test.mjs` 28 passed / 0 failed
2026-10-06 12:36:14 +08:00
suzmii 40f0b2cd24 Merge remote-tracking branch 'origin/master' into fix/agc-composer-layout
Project CI / AI game creator shell Rust crates (pull_request) Successful in 5m1s
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Successful in 7m2s
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Successful in 8m19s
Project CI / Frontend tests (pull_request) Successful in 3m13s
Project CI / AI game creator shell web tests (pull_request) Successful in 2m54s
Project CI / Repository checks (pull_request) Successful in 6m11s
Project CI / Backend tests (pull_request) Successful in 8m0s
Project CI / Native shell tests (pull_request) Successful in 10m14s
2026-10-06 11:35:11 +08:00
suzmii 31a3d326b3 项目版本改用平台派发的下一个版本号:AGC 只读展示 + 提交同一个值
Project CI / Backend tests (pull_request) Failing after 15s
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Successful in 6m9s
Project CI / AI game creator shell Rust crates (pull_request) Successful in 4m23s
Project CI / Repository checks (pull_request) Failing after 33s
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Successful in 7m39s
Project CI / Frontend tests (pull_request) Successful in 3m20s
Project CI / AI game creator shell web tests (pull_request) Successful in 2m51s
Project CI / Native shell tests (pull_request) Successful in 9m1s
- packages/shared:定价字段提示句补 `id` 并挂进 `aria-describedby`(与错误行并列),恢复「最多 1000000 泥点」的程序化关联;补两条断言(有错/无误时描述里都含上限)。
- packages/shared:分组标题改用 `PlatformFieldLabel variant="field"`(12px/700/弱化色),与网页「支持设备 / 封面与截图」的 legend 同号;价格输入中和原生 number spinner(`appearance: textfield` + 隐藏 `::-webkit-inner-spin-button`),不再压住「泥点」单位,`inputMode="numeric"` 保留。
- packages/shared:非法态去掉组件级 `!important`,改由网页宿主 remap 的 `[aria-invalid='true']` 分支给出错误色(`src/index.css`,排在 `:focus` 之后),组件侧保留正常权重同名声明供 AGC 生效。
- AGC 壳 Rust(`game_distribution_publish.rs`):作者作品条目解析 `versions[]`;新增 `resolve_owner_next_version_number`(已有版本最大 `versionNumber + 1`,对齐平台 `resolve_version_number(None)`);发布状态回读下发 `nextVersionNumber`(首次发布 `1`;刷新成功的更新 `max+1`;`unavailable` 与「有绑定但没刷新成功」为 `None`);补单测两条。
- AGC 服务层(`gameDistributionPublish.ts`):`versionNumber` 改为必填,删除按清单 `versions[]` 条数的回落;回读结果类型补 `nextVersionNumber`。
- AGC 发布面板:删除本地派生的 `projectVersion`,`项目版本` 显示并提交同一个平台版本号;字段改为只读 + 禁用观感(未知时显示 `—` 占位);平台版本未知时提交按钮禁用并提示重试;「项目版本」不再可从 AGC 手填。
- AGC 样式:新增 `__version-field` / `__version-value`(与相邻字段同形 + 灰底只读观感),并更新版本标签注释为平台口径。
- 测试:AGC 面板三条新口径断言(显示值==提交值==平台下一个版本号;本地迭代计数与遗留字段不参与;平台数据不可得时显示占位/提交禁用/不调用发布)、非 Tauri 宿主用例改为断言禁用、服务层用例改为「只认调用方传入值 + 缺省失败关闭」、live 用例补显式版本号;陈旧注释同步(`game_publish_attempt.rs`、`project/manifest.rs`、`resourceProjectionModel.ts`)。
2026-10-06 11:29:38 +08:00
suzmii fdf6424e42 递增三个已更新模板的 templateVersion
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Successful in 6m37s
Project CI / AI game creator shell Rust crates (pull_request) Successful in 3m52s
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Successful in 5m52s
Project CI / Frontend tests (pull_request) Successful in 3m24s
Project CI / Backend tests (pull_request) Successful in 7m36s
Project CI / AI game creator shell web tests (pull_request) Successful in 2m43s
Project CI / Repository checks (pull_request) Successful in 6m46s
Project CI / Native shell tests (pull_request) Successful in 9m7s
- phaser-2d-starter / threejs-3d-starter / blank-3d-scene 的 meta.json templateVersion 0.1.1 → 0.1.2
- 解除发布脚本对「同 templateVersion 的 ZIP 内容变化」的 fail-closed 守卫,其余字段一个字未动
2026-10-06 11:09:11 +08:00
suzmii 0619b5e833 合并收口:恢复 master 的不可用模型列表渲染(冲突块取并集时漏了)
Project CI / Backend tests (pull_request) Failing after 14s
Project CI / AI game creator shell Rust crates (pull_request) Successful in 5m14s
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Successful in 7m5s
Project CI / Repository checks (pull_request) Failing after 25s
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Successful in 7m40s
Project CI / Frontend tests (pull_request) Successful in 3m14s
Project CI / AI game creator shell web tests (pull_request) Successful in 3m32s
Project CI / Native shell tests (pull_request) Successful in 8m44s
- 合并 master 76166b08c 时,`ConversationModelSelect` 的菜单渲染冲突块取了本分支的「强度区外壳」一侧,但 master 那侧**同时**包含不可用模型列表(`unavailableModels.map` + `Lock` 图标 + `unavailableModelReasonLabel`)→ 结果那三处变成未使用(eslint 三条 error)
- 修法:把 master 的不可用模型块(含注释)原样补回 `modelMenu` 变量里(`models.map` 之后、分隔线之前),外壳一侧不动;`Lock` / `unavailableModelReasonLabel` / `unavailableModels` 全部重新被使用
- 校验:eslint 该文件 0 error;typecheck pass 3 / fail 0;`conversationModelSelect + appSurface + chatDialogFrameLayout` 257 passed / 9 skipped
2026-10-06 11:03:45 +08:00
suzmii 811efc102c Merge remote-tracking branch 'origin/master' into fix/agc-composer-layout
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust crates (pull_request) Has been cancelled
Project CI / Backend tests (pull_request) Has been cancelled
Project CI / Native shell tests (pull_request) Has been cancelled
Project CI / Frontend tests (pull_request) Has been cancelled
Project CI / Repository checks (pull_request) Has been cancelled
Project CI / AI game creator shell web tests (pull_request) Has been cancelled
合并 master 76166b08c(模型目录不可用项 / 管理端等):保留双方条目
- apps/ai-game-creator-shell/src/services/clientApi.ts:取 master 的 typed 目录读取(`ClientLlmModelCatalog` 已含 unavailableModels,不再手写 agentMode 映射),但保留本分支的文案「模型服务不可用」(本 PR 的口径,master 那侧还是旧的「本地…」)
- ConversationModelSelect.tsx:import 取并集(`Lock` + `ReactNode`),渲染结构保留本分支的「强度区外壳」(`strengthSection ? <shell>{strengthSection}{modelMenu}</shell> : modelMenu`)——master 把菜单内联展开、并加了不可用项列表,那段已自动合并进 `modelMenu` 变量里,两边语义都在
- tests/conversationModelSelect.test.tsx:取 master 的新文案「所选模型已下线,已切换为默认模型」,保留本分支的异步查询(`await screen.findByText`,文案走 portal toast)
- docs/project-memory/shared-memory/pitfalls.md:两侧条目都保留(本分支在前,master 新增在后)
- 校验:typecheck pass 3 / fail 0;`appSurface + chatDialogFrameLayout + conversationModelSelect` 257 passed / 9 skipped
2026-10-06 11:00:40 +08:00
suzmii 7d342856fa Merge pull request '修复运行页刷新按钮不真正重载' (#640) from fix/run-preview-refresh-reload into master
Project CI / AI game creator shell Rust lane 1/2 (push) Successful in 7m7s
Project CI / AI game creator shell Rust lane 2/2 (push) Successful in 6m4s
Project CI / AI game creator shell Rust crates (push) Successful in 5m19s
Project CI / Frontend tests (push) Successful in 4m25s
Project CI / Backend tests (push) Successful in 9m6s
Project CI / AI game creator shell web tests (push) Successful in 2m42s
Project CI / Repository checks (push) Successful in 6m59s
Project CI / Native shell tests (push) Successful in 11m3s
Reviewed-on: http://git.genarrative.world/git/GenarrativeAI/Genarrative/pulls/640
2026-10-06 10:59:23 +08:00
suzmii 7e036a7199 润色钮挪到发送钮左边(右组相邻成组)
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust crates (pull_request) Has been cancelled
Project CI / Backend tests (pull_request) Has been cancelled
Project CI / Native shell tests (pull_request) Has been cancelled
Project CI / Frontend tests (pull_request) Has been cancelled
Project CI / Repository checks (pull_request) Has been cancelled
Project CI / AI game creator shell web tests (pull_request) Has been cancelled
- 口径:AI 润色 / 恢复原文与发送钮同为圆角矩形按钮,放一起更协调 → 从「左组 `@` `+` 之后」挪到**右组最末、发送钮左侧**,最终顺序 `@` `+` | 模型 麦克风 润色 发送(`space-between` 左右分组不变)
- 实现:portal 挂点搬进右组(`DirectProjectComposer` 里把 `.project-chat-composer-controls-actions` 移到 `-controls-right` 内、发送钮之前),`actionsPortalTarget` 的「可选 prop、不传则行为不变」契约保持;用显式槽位而不是 CSS `order`,因为 DOM 顺序即 Tab 与读屏顺序(现在就是 模型 → 麦克风 → 润色 → 发送,与视觉一致)
- 注释/文档同步:composer 与 styles.css 里「与 `@` / `+` 同组、排在左组最后一个」那类旧口径全部改成新口径(「与发送同为圆角矩形按钮、相邻成组」),pitfalls 同段一并更新;全仓 grep `输入类动作` / `生成类动作` / `排在左组` / `左组最后一个` 命中 0
- 测试:`chat-composer.suite.ts` 的 DOM 断言改成新挂点——润色钮必须在 `.project-chat-composer-controls` 内、父链是 `-controls-right`、**`slot.nextElementSibling` 就是发送钮**、且 `compareDocumentPosition` 证明润色在发送之前;`chatDialogFrameLayout.test.ts` 的源码顺序断言改成「挂点在 `-controls-right` 之后、`{canStopTurn` 之前」;空态「工具条之外无第二个按钮」计数仍为 6;七宽度单行/不相交用例不变(含新位置)
- min-width 复核(无头 Chromium 夹具,240/280/296/320/360/438/900 七档):控件排仍 **252px** 所需、外壳仍 **278px**;自然宽度 290.4(438/900 档)→ 算式不变;七档 `topSpread ≤ 1px`、控件两两相交 **0** 处、`outsideControlsRow` 空、润色钮与发送钮间距固定 **8px**(同一行、同一组)
- 截图:240px 改前→改后 + 438px 改后 + 438px toast 已换新(正文引用与附件 1:1:12 = 12,未引用的旧图已删)

Refs #600, PR #607
2026-10-06 10:57:19 +08:00
k88936 796cf9843c Merge remote-tracking branch 'origin/master' into feat/pricing-plan
Project CI / AI game creator shell Rust crates (pull_request) Successful in 6m0s
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Successful in 6m43s
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Successful in 7m42s
Project CI / Frontend tests (pull_request) Failing after 1m16s
Project CI / Backend tests (pull_request) Successful in 8m51s
Project CI / AI game creator shell web tests (pull_request) Successful in 3m34s
Project CI / Repository checks (pull_request) Successful in 5m34s
Project CI / Native shell tests (pull_request) Successful in 7m18s
# Conflicts:
#	docs/project-memory/shared-memory/decision-log.md
2026-10-06 10:14:15 +08:00
k88936 febbdd59d5 Merge branch 'feat/pricing-plan-fix' into feat/pricing-plan 2026-10-06 10:12:41 +08:00
suzmii 4d901eec65 后台:撤回审核页价格客户端二次回退,改为哑渲染服务端字段
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust crates (pull_request) Has been cancelled
Project CI / Backend tests (pull_request) Has been cancelled
Project CI / Native shell tests (pull_request) Has been cancelled
Project CI / Frontend tests (pull_request) Has been cancelled
Project CI / Repository checks (pull_request) Has been cancelled
Project CI / AI game creator shell web tests (pull_request) Has been cancelled
- AdminGameDistributionReviewPage.tsx:删除新增的 resolveFrozenPriceMudPoints,恢复「价格不在这里二次叠加」的单一实现
  (服务端 version_detail_payload 已把版本冻结价优先、缺字段按 0 归一写进 game.priceMudPoints,M4 已明确客户端不得复刻该语义)
- AdminGameDistributionReviewPage.test.tsx:详情价格用例改为直接编码「客户端保持哑渲染」约束
  - 服务端下发 game.priceMudPoints = 30 → 详情显示「30 泥点」(列表侧由价格列用例覆盖同一字段)
  - 对抗用例:冻结资料故意传 frozenMetadata.priceMudPoints = 999,断言仍显示 30 且不出现「999 泥点」
2026-10-06 02:21:44 +08:00
suzmii b4bf37671d 前端:修复买断制付费评审问题(flaky 用例、草稿恢复定价、契约口径、守卫与测试质量)
Project CI / Backend tests (pull_request) Has been cancelled
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust crates (pull_request) Has been cancelled
Project CI / Native shell tests (pull_request) Has been cancelled
Project CI / Frontend tests (pull_request) Has been cancelled
Project CI / Repository checks (pull_request) Has been cancelled
Project CI / AI game creator shell web tests (pull_request) Has been cancelled
- GameDistributionPages.test.tsx:作者补查断言包进 waitFor,消除并发下的 0 调用 flaky
- GameDistributionPages.test.tsx:购买确认改为双击只发一次请求,按格式断言幂等键而非仅非空
- GameDistributionPages.test.tsx:新增 409「价格已变化」UI 分支与「旧响应缺价格且无入口」可操作说明用例
- GameDetailPage.tsx:禁用「立即玩」且无入口时补原因说明并用 aria-describedby 关联按钮
- GamePublishPage.tsx:草稿恢复按版本冻结价预填付费模式与价格,恢复提示写明「本次将沿用版本冻结价 N 泥点 / 免费」
- GamePublishPage.test.tsx:删除与共享组件重复的定价纯函数用例,改为草稿恢复定价(游戏行 999 / 版本冻结 240)网页独有用例
- gameDistributionGuards.ts:播放会话 token 段收窄为 [A-Za-z0-9-],拒绝 `..` 逃逸
- gameDistributionGuards.test.ts:补 UUID 令牌、`..`、超长 URL、控制字符与字母表外字符用例
- gameDistributionClient.test.ts:补 purchaseGame / createGamePlaySession 路径、幂等键、expectedPriceMudPoints 序列化与 401/403/409/余额不足错误码映射
- PlatformGamePricingField.tsx:错误行加 id,价格输入补 aria-invalid / aria-describedby
- PlatformGamePricingField.test.tsx:禁用态改用「买断制 + 禁用」以覆盖价格输入;新增错误关联 a11y 用例
- packages/shared 契约与 admin-web DTO:priceMudPoints / purchased 改为可选,与 Rust #[serde(default)] 口径对齐
- AdminGameDistributionReviewPage.tsx:详情价格按「版本冻结价优先、游戏行价兜底」取值(与服务端 version_detail_payload 同口径)
- AdminGameDistributionReviewPage.test.tsx:详情价格改发散值(game=999 / frozen=30,断言 30);价格列按列名定位、去掉全局 NaN 弱断言
- adminGameDistributionReview.css:价格列 96px nowrap 放宽为 120px 并允许换行,避免最大价被硬裁
- AGC 发布面板与发布服务:深相对路径改走 @genarrative/shared/components alias
- AGC 壳 game_distribution_publish.rs:修正预填价注释为「最近版本冻结价优先,可能仍待审/被拒」
2026-10-06 02:18:21 +08:00
suzmii b7440d8c39 语音提示不再常驻 + 模型触发钮补 title + 工具条 DOM 级断言
Project CI / AI game creator shell Rust crates (pull_request) Successful in 4m18s
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Successful in 6m30s
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Successful in 7m18s
Project CI / Backend tests (pull_request) Successful in 7m43s
Project CI / Frontend tests (pull_request) Successful in 4m39s
Project CI / Repository checks (pull_request) Successful in 7m7s
Project CI / AI game creator shell web tests (pull_request) Successful in 3m53s
Project CI / Native shell tests (pull_request) Successful in 9m18s
- D-B:`voiceNotice` 只在 mic 的 `onNotice` 里 set、从不清理(会常驻到组件卸载)→ 改成「拿到转写就收掉」(`onTranscript` 里 `setVoiceNotice('')`);提示是上一次动作的回执,选这个时机而不是 6s 定时,避免与 toast 的 6s 语义混在一起
- D-B 用例(改前红):`chat-composer.suite.ts`「语音提示是上一次动作的回执:拿到转写后不再常驻」——录音 + `onerror({error:'network'})` → `project-chat-composer-notice` 出现「语音识别服务…」;再 `emitTranscript('做一个小游戏')` → 该行消失且节点脱离文档(旧实现里它一直在)
- D-C:模型触发钮最窄可缩到 64px、名字走省略号但没有 `title`,截断后无从查看 → 触发钮补 `title={triggerLabel}`(与显示名同源),并加属性断言:`title` == 触发钮文本
- 测试加强(评审说偏声明级):`chat-composer.suite.ts` 新增「AI 润色钮在工具条这一行里(DOM 位置级)」——润色钮必须位于 `.project-chat-composer-controls` 内、父链在 `-controls-actions` 挂点里、不在 `.resource-reference-input` 里、空态工具条外没有第二行按钮(用真实挂载的 Direct 输入区断言);同排几何(top 差 ≤1px、两两不相交、七宽度)由无头 Chromium 夹具实测(240/280/296/320/360/438/900 全通过)
- 校验:`appSurface + chatDialogFrameLayout` **227 passed / 9 skipped**;typecheck pass 3 / fail 0;eslint、prettier、encoding 5327 files、spacetime-schema 92 tables、diff-check 全绿

Refs #600, PR #607
2026-10-06 01:25:43 +08:00
suzmii 69a5b868ef 修掉润色状态行的死声明:margin-top 6px 不再被后面的 0 盖掉
- 评审 D-A:上一轮给状态行加的 `margin-top: 6px` 被紧接着的旧 `margin-top: 0`(styles.css 两条 Direct 状态规则)覆盖 → 实际间距是 0、状态紧贴编辑器末行;注释与测试注释也跟着说错
- 改法:删掉那两行 `margin-top: 0`,保留 6px,并把 CSS 注释与测试注释改成事实(输入盒 `gap` 的 row 分量为 0,间距由状态元素自带)
- 实测(无头 Chromium 夹具,438px 面板):无状态行时输入盒 **72px** / 表单 **136px**;出现「AI 润色失败,可重试」时状态行 `margin-top` 计算值 = **6px**、状态行高 16.8px,输入盒 **95px** / 表单 **159px**(= 136 + 6 + 16.8);空态仍 0 高,222 算式与空态断言不变
- 测试:`statusRowHeight = 0` 不再写死——断言 `ResourceReferenceInput` 里状态行仍是条件渲染(`polishing || polishError || polishNotice`)+ 状态规则 `margin-top` 解出 6px(谁改回常驻渲染或把间距写回 0 都会红)

Refs #600, PR #607
2026-10-06 01:25:42 +08:00
suzmii bbd5e51d3d 测试:模型状态文案改走底部 toast 后改用异步查询
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Successful in 6m31s
Project CI / AI game creator shell Rust crates (pull_request) Successful in 4m36s
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Successful in 6m10s
Project CI / Frontend tests (pull_request) Successful in 3m19s
Project CI / Backend tests (pull_request) Successful in 7m32s
Project CI / AI game creator shell web tests (pull_request) Successful in 2m59s
Project CI / Repository checks (pull_request) Successful in 6m26s
Project CI / Native shell tests (pull_request) Successful in 8m52s
- `conversationModelSelect.test.tsx` 两处同步 `screen.getByText('…')` 改为 `await screen.findByText(…)`:状态文案现在渲染在 portal 的 toast 里(发布 → 宿主 re-render 一次),同步查询在慢机/并行下会竞态(CI 上就是这样红的)
- 本地:`npx vitest run tests/conversationModelSelect.test.tsx` 29 passed;`appSurface + chatDialogFrameLayout` 225 passed / 9 skipped

Refs #600, PR #607
2026-10-06 00:35:32 +08:00
suzmii 959ed4fd53 合并 origin/master(51cb05f41,22 个提交)到 feat/game-purchase
- 逐块合并 server-rs/crates/api-server/src/modules/game_distribution.rs:以 master 的 ReleaseAssetResponseInput / 5 参 release_asset_response_with_cache / ETag / 304 / gzip 结构为准,并在其上保留本分支的付费 404 守卫(price_mud_points > 0 仍在 release_package_bytes 读包之前返回);播放会话资源响应改用同一结构(etag None、cache_control no-store、沿用 accept-encoding 协商)。
- 合并 src/components/game-distribution/GamePlayPage.tsx:接入 master 的共享 PlatformGameLoadingSurface 与 PLATFORM_GAME_LOADING_TIMEOUT_MS,删除本地重复常量 GAME_PLAY_STARTUP_TIMEOUT_MS 与裸 div,买断制播放会话准备态改由共享加载面承载。
- 合并 src/components/game-distribution/GameDetailPage.tsx:同时保留 master 的 onOpenCreator 作者插槽与本分支的买断制购买弹窗、onOpenRecharge 充值入口。
- 合并 vite.config.ts:保留 master 的 /api/creators 代理,并保留 play-sessions 前缀清 Cookie 规则(顺序仍在通用 /api/game-distribution 之前)。
- 合并 deploy/nginx/README.md:保留 master 的 SPA allowlist 门禁口径(含 /creators、/creators/connections)与本分支的播放会话前缀章节;三份 nginx 模板的 ^~ play-sessions location 与清 Cookie 原样保留。
- 合并 apps/admin-web/src/pages/AdminGameDistributionReviewPage.test.tsx:保留 master 的加载面/超时用例与本分支的审核价格(冻结价优先、历史按 0)用例。
- 合并 src/components/game-distribution/GameDistributionPages.test.tsx:保留双方 mock,并新增「付费作品在会话签发期间显示共享加载面」用例。
- 合并 docs/【玩法创作】平台入口与玩法链路-2026-05-15.md(保留买断制合同并回填 master 的创作者主页与关注粉丝合同)、decision-log.md、pitfalls.md:追加双方条目,不改写任一侧正文。
- 保留 master 侧新增能力:release_asset_etag / if_none_match_matches / accepts_gzip_encoding / gzip_release_asset / release_asset_not_modified_response、SPA 加载面、创作者主页与关注粉丝(user_follow 表、creator 查询与 author_id 过滤)。
2026-10-06 00:28:36 +08:00
suzmii 870d6457bc 输入区工具条改回唯一一行:润色钮并入工具条,nowrap + 实测 min-width
Project CI / Backend tests (pull_request) Failing after 26s
Project CI / AI game creator shell Rust crates (pull_request) Successful in 5m45s
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Successful in 6m30s
Project CI / Repository checks (pull_request) Failing after 14s
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Successful in 7m4s
Project CI / Frontend tests (pull_request) Successful in 2m51s
Project CI / AI game creator shell web tests (pull_request) Failing after 4m12s
Project CI / Native shell tests (pull_request) Successful in 10m32s
- 口径:工具条只允许一行——`@` / `+` / 「AI 润色 / 恢复原文」/ 模型 / 语音 / 发送 六颗控件平铺,任何面板宽下都不换行、不堆叠、不重叠;宽度不够时按 `min-width` 横向溢出可见,发送钮仍在可视区内
- 换行来源(首轮为「避免重叠」加的 wrap):styles.css:11893 `.project-chat-composer-controls`(6 类)`flex-wrap: wrap`、styles.css:11933 `.project-chat-composer-controls-left` `flex-wrap: wrap`、styles.css:13747 `.conversation-model-select` `flex-wrap: wrap` → 三处都改 `nowrap`;左组补 `flex: 0 0 auto`(固定 28px 动作钮不参与收缩,否则槽位被压窄会把润色钮挤到模型钮上)
- 润色钮进工具条:`ResourceReferenceInput` 新增 `actionsPortalTarget`(portal 目标,不传时行为不变,策划面照旧),`DirectProjectComposer` 在左组 `+` 之后放挂点 `.project-chat-composer-controls-actions` 并传入 → 空输入态不再为它留一行;输入盒第二行只剩「润色状态」(无内容时 0 高,`gap` 的 row 分量 6→0、状态自带 `margin-top: 6px`)
- min-width 算式(落到两个元素):控件排 `.project-chat-composer-controls` = `@`28 + `+`28 + 润色28 + 模型钮 64(`min-width: 64px`,名字省略号)+ 语音28 + 发送28 = 204,加 5×8px 列间距 = 244,再留 8 余量 → **252px**;外壳 `form.project-chat-composer.is-direct-codex` = 252 + 左右内边距 12×2 + 边框 1×2 → **278px**。夹具实测:自然宽度 290.4、七档(240…900)控件 `top` 差值 ≤1px、两两相交 0 处、`outsideControlsRow` 空
- 低于 min-width:外壳保持 278px、**内容按自身宽度溢出可见**(面板与 composer 都不裁切,选它而不是给工具条 `overflow-x: auto` 是因为工具条里挂着模型菜单浮层,加滚动容器会把它裁掉——#600 的老问题);240px 实测发送钮 rect 仍在窗口内且 `elementFromPoint` 命中它
- 测试:`chatDialogFrameLayout.test.ts` 新增「工具条只有一行…」——七个宽度下 `flex-wrap` 必须 `nowrap`(右组本来就不换行)、控件排 `min-width: 252` / 外壳 `min-width: 278`、组件源码里润色钮渲染在控件排之后的挂点;最高高度算式按新结构更新为 222。**改前红已记录**:把三个源文件 stash 回旧实现后单跑,`240px 下工具条必须保持单行: expected 'wrap' to be 'nowrap'` 与 `expected 228 to be 222` 两条同时红
- 校验:`npx vitest run tests/appSurface.test.ts tests/chatDialogFrameLayout.test.ts` → **225 passed / 9 skipped**;`agc:typecheck` pass 3 / fail 0;eslint、prettier、encoding 5280 files、spacetime-schema 91 tables、`git diff --check` 全绿;对照图与 PR 正文已更新

Refs #600, PR #607
2026-10-06 00:19:17 +08:00
suzmii 342cc75d20 Merge remote-tracking branch 'origin/master' into fix/agc-composer-layout
Project CI / AI game creator shell Rust crates (pull_request) Successful in 4m59s
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Successful in 7m17s
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Successful in 6m38s
Project CI / Frontend tests (pull_request) Successful in 3m1s
Project CI / Backend tests (pull_request) Successful in 7m16s
Project CI / AI game creator shell web tests (pull_request) Successful in 2m15s
Project CI / Repository checks (pull_request) Successful in 5m19s
Project CI / Native shell tests (pull_request) Successful in 7m2s
合并 master 96859666f(AGC 运行画面点选 #624 等):保留双方条目
- docs/project-memory/shared-memory/pitfalls.md 冲突:本分支 2 条(2026-10-05 PR #607 复核修复 / 模型菜单共享样式面)在前,master 新增 6 条(运行画面点选 ×5、Phaser 4 ×2)紧随其后,其余各节原样保留
- 其余文件自动合并(master 侧改动与本分支不重叠)
2026-10-05 21:01:39 +08:00
k88936 d917d2f4d1 修复(AGC模型): 会员到账后主动刷新模型目录
- confirmNativeRechargePayment 确认订单为 paid 且 kind=membership 时调用 notifyLlmConfigChanged
- 保留 applyCatalog 的 revision 门控不变,由配置变更事件重置已应用 revision 并重新读取
- 补「revision 不变但账号档位变化时,显式通知必须重新应用」的回归测试
2026-10-05 20:22:43 +08:00