k88936
|
75ff9ca75b
|
实施计划写清真实进程用例失败时的两个观察点
- 说明子进程输出里的 running 1 test 是命令沙箱垫片的预期现象:垫片就是当前可执行文件,编译到测试态时参数换成 --exact ...trampoline_child_fixture,所以垫片进程是测试二进制在跑那个 fixture 用例。
- 真正失败的是沙箱里解析到的 npm(fnm 包装脚本被另一个 node 版本执行),并写明同一脚本在普通 shell 里能正常产出 zip,避免后人把它当成产品缺陷。
|
2026-10-05 17:22:29 +08:00 |
|
k88936
|
f8ed4e898f
|
保存对话框的默认文件名收进下载助手,复用既有取文件名工具
- xhsMinitoolDownload 自己从 relativePath 取最后一段当默认文件名(取不到才用调用方给的兜底名),参数名随之改为 fallbackFileName;/ 与 \ 两种分隔符统一交给既有的 resourceFileNameFromPath,不再在面板里写第二份取文件名实现。
- ArtifactsPane 只传兜底名,不再自己拼默认文件名,视图层也就不必跨到 features/resource-canvas 去 import。
|
2026-10-05 17:22:05 +08:00 |
|
k88936
|
1b7741ac65
|
适配指令补上包根在 game/ 时的产物落点
- 适配与修复指令的产物契约补一句:路径相对项目根,而 npm 包根通常是 game/ 子目录,所以落点参数要写成 ../.export/xhs-minitool.zip(相对路径按脚本的工作目录解析)。缺这句时 agent 会把 zip 写到 game/.export/ 下,宿主只能报产物缺失,白跑一轮修复。
- 两例前端用例各加一条断言钉住这个落点。
- skill 的 AGC 契约不再给出 <项目根>/.export/xhs-minitool.zip 这个只在包根等于项目根时才成立的写法,改为只声明产物位置并把相对路径的解析规则指回 `node pack.mjs --help`;manifest 同步到 2026-08-26.42。
|
2026-10-05 17:21:41 +08:00 |
|
k88936
|
5dd158ee13
|
补一例默认 ignore 的真实起进程用例覆盖宿主导出链路
- build.rs 新增 executes_the_project_script_and_requires_a_non_empty_artifact_each_time(#[ignore]):造一个声明 build:xhs-minitool 的 npm 包,真跑一遍 run(),覆盖「脚本产出 zip 并回带 stdout → 删掉产物再跑必须重新产出 → 脚本成功但没产出报 artifactMissing」。常规单测里没有真实进程,这条链路此前只有"脚本缺失"这一侧被覆盖。
- 用例默认不跑:它要本机 node/npm 与可用命令沙箱。本次在本机尝试被容器环境挡下——沙箱里解析到的 npm 是 fnm 包装脚本、却由另一个 node 版本执行(Cannot find module '../lib/cli.js',Node.js v26.10.0);同一脚本在普通 shell 里 npm run build:xhs-minitool 正常产出 zip,因此不是代码问题。
- 实施计划与里程碑记录该用例的一键复跑命令、观察到的环境现象,并把「真实 vite 项目首轮适配」明确为本里程碑唯一开口项。
|
2026-10-05 17:06:45 +08:00 |
|
k88936
|
b3be3ee713
|
修正导出里程碑证据口径并补新增用例
- 里程碑证据:Rust export:: 改为 49 例(export::draft::xhs_minitool 33 例)、export_bindings 115 例、前端 vitest 15 例,并把构建收尾判据的六条映射逐条列出(此前把「脚本非零退出/产物缺失」写成已有测试覆盖,实际只有代码分支,现补齐)。
- 实施计划:命令 DTO 口径改为 XHSMiniToolExportRunResult { outputTail } 并说明成功出口不带 exitCode 的理由;提交清单与已验证命令更新到最新;验收文案的「stderr 尾部」改为「输出尾部」(stdout 与 stderr 已合并)。
|
2026-10-05 17:00:55 +08:00 |
|
k88936
|
463341c4bd
|
导出成功后把打包脚本的输出尾部报给用户
- useXhsMinitoolExport 的导出成功提示改为「已重新产出 .export/xhs-minitool.zip」加宿主的构建输出尾部:打包脚本会把 zip 的条目数与体积打在那里,正是上传前要核对的数字。
- ArtifactsPane 的状态行改为保留换行,多行输出不再挤成一行。
- 新增一例前端用例:导出调用只带 projectPath,成功后 notice 同时含产物路径与脚本输出尾部。
|
2026-10-05 16:59:09 +08:00 |
|
k88936
|
5e2426c8a7
|
导出收尾判据抽成可测函数,成功结果去掉恒为 0 的死字段
- build.rs 把「脚本跑完之后算不算数」抽成 conclude(root, exit_code, timed_out, output):非零退出与超时收成 commandFailed(带退出码与输出尾部),退出码 0 但产物不在或为空文件收成 artifactMissing,产物在才算成功。
- 补 5 例确定性用例覆盖这条判据(非零退出、超时无退出码、产物缺失、空产物不算、成功),不再只靠"真的跑一遍 npm"才能碰到这些分支。
- XHSMiniToolExportRunResult 去掉 exit_code:能走到成功出口的退出码必然是 0,带回来只是死字段;失败侧 CommandFailed 自己带退出码。成功时改为回构建输出尾部(打包脚本会把 zip 条目数与体积打在那里)。
- 同步重生成 XHSMiniToolExportRunResult.ts。
|
2026-10-05 16:58:40 +08:00 |
|
k88936
|
faa93929b4
|
导出与小红书小工具里程碑文档回写实现与证据
- 里程碑:Status 改为 implemented-awaiting-runtime-acceptance,九条验收标准勾选,证据要求补已落的自动化证据(Rust export:: 18 例、bindings 117 个文件、前端 vitest 14 例、skill-pack 2026-08-26.41)并明确真实 vite 项目首轮适配是唯一未验证项。
- 实施计划:状态、前端文件落点(state/xhsMinitoolInstruction.ts 等)、pack.mjs 的 --zip-out、快照排除的两侧口径与提交清单逐项对齐实现。
- 主规范与决策记录:把「整个 .export/ 排除出快照」改为精确表述——只排除在快照同步之外,不得并进通用排除口径(那份列表同时是 Agent 的写入门禁,并进去 agc_apply_patch 就拒绝 .export/);skill 落点、prompt 归属与入队链路的文件/函数名同步为实际实现。
|
2026-10-05 16:40:00 +08:00 |
|
k88936
|
3369f76b16
|
导出工作目录 .export 只排除在快照同步之外
- filesystem.rs 新增 PROJECT_SNAPSHOT_SYNC_ONLY_EXCLUDED_COMPONENTS(当前只有 .export):导出注册表、打包脚本拷贝、icon 与 zip 产物都能从项目源码重跑出来,不进项目快照同步。
- 刻意不并入通用排除列表:那份列表同时是 Agent 的写入门禁(agent/direct_patch.rs 直接拿它拒绝路径,agc_apply_patch 报「不得修改受保护或排除路径」),并进去会让 code agent 写不了 .export/ 下的适配脚本。
- project_snapshot 测试补齐两侧口径:.export/* 必须被同步排除,且不得被通用口径排除。
|
2026-10-05 16:30:32 +08:00 |
|
k88936
|
95323ce542
|
小红书导出 skill:新增确定的 zip 落点参数并写清 AGC 接入契约
- pack.mjs 新增 --zip-out <path>:相对当前工作目录解析、父目录自动创建,供「产物必须落在项目根 .export/ 下」的调用方指定落点;原 --zip <name> 默认行为不变。
- SKILL.md 增加「被 AGC 导出面板调用时」一节:三条硬契约(脚本名 build:xhs-minitool、非空 .export/xhs-minitool.zip、--out-dir 只指向构建输出目录)与拷贝到 .export/ 后如何定位项目根。
- vite.config.xhs-minitool.mjs 的注释点明 build.outDir 与 pack 的 --out-dir 必须一致,配错会删源码。
- manifest.json 同步 sha256 与版本 2026-08-26.41(文件清单不变,仍 36 个)。
|
2026-10-05 16:08:53 +08:00 |
|
k88936
|
f8517abaaa
|
小红书导出面板的前端契约测试
- 新增 apps/ai-game-creator-shell/tests/xhsMinitoolExport.test.tsx:十例覆盖指令正文(三条硬契约、示例脚本落点、修复现场)、失败变体到人话与动作的映射、字段复制、icon 与 zip 的下载链路、三颗按钮的职责、冲突逐字段二选一、失败卡片下一步,以及状态 hook 的自动保存(baseHash 带回宿主)与「适配把指令当一条用户消息入队」。
|
2026-10-05 16:02:44 +08:00 |
|
k88936
|
9a8d77dd9a
|
小红书导出面板左半:表单、复制下载、冲突二选一与三颗显式按钮
- 新增 tabs/xiaohongshu/ArtifactsPane.tsx:替换原来的留白占位,落平台表单、交付产物与「适配 / 导出 / 刷新」三颗按钮;没有脚本时导出不可点并说明要去适配。
- 新增 FormCard.tsx:三个字段都能复制,icon 行多一颗下载;红字是宿主校验结果的投影,前端不自己判规则。
- 新增 ConflictCard.tsx:只列真的不一样的字段,逐个二选一(默认「我的」),按选择合并后带回上层,绝不静默覆盖。
- 新增 FailureCard.tsx:宿主失败的原文加现场(输出尾部等),按变体给「让 code agent 修」或「重试」。
- 新增 PaneButton.tsx 与 CopyButton.tsx:按钮语气与复制反馈各收一处。
- Page.tsx / useXiaohongshuTab.ts / usePanel.ts 接线:导出状态挂在面板根,只有真的点进过小红书 tab 才打开注册表读写(进别的目标不在用户项目里补 .export/)。
|
2026-10-05 16:02:18 +08:00 |
|
k88936
|
d694c183d9
|
小红书导出面板的行为层:命令入口、指令正文、失败说法与状态 hook
- 新增 state/xhsMinitoolApi.ts:三个命令的 JS 入口(命令名与 camelCase 参数名唯一收口),结构化失败装成 XhsMinitoolFailure,真 Error 原样抛出。
- 新增 state/xhsMinitoolInstruction.ts:首次适配与按失败修复两段指令正文 + 契约常量(脚本名、产物路径、注册表形状、要显式拷贝的示例脚本与落点),每条都能在 Rust 侧找到对应硬校验。
- 新增 state/xhsMinitoolFailure.ts:七个失败变体各一句人话与下一步动作,穷尽性由 expectNever 在编译期钉住。
- 新增 state/xhsMinitoolFields.ts:三个字段的标签、占位与字数上限;字段身份直接用 ts-rs 的 XHSMiniToolExportField,与表单键一一对应。
- 新增 state/xhsMinitoolDownload.ts:icon / zip 经原生保存对话框落盘,复用素材保存命令的既有门禁。
- 新增 state/useXhsMinitoolExport.ts:读现场、防抖自动保存(带 baseHash)、字段级冲突、每次重新导出,以及只有用户显式点「适配 / 让 agent 修」才入队的指令发送。
- .eslintrc.cjs 把 export/generated 加入 ignorePatterns,与其余 ts-rs 生成目录同口径,禁止 eslint --fix 二次改写。
|
2026-10-05 16:01:49 +08:00 |
|
k88936
|
3a1999e115
|
小红书导出命令面:读、存(带冲突)、跑脚本并确认产物
- 新增 src-tauri/src/export/draft/xhs_minitool/build.rs:以既有 command.exec 边界运行项目声明的 build:xhs-minitool(复用 run_project_verification_with_commit_at,脚本白名单、expectedCommand 反漂移、沙箱与 300 秒超时都在那里),跑完确认 .export/xhs-minitool.zip 是非空普通文件,失败输出只回尾部 4000 字符。
- 新增 commands.rs:read_xhs_minitool_export / save_xhs_minitool_export_form / run_xhs_minitool_export_build 三个 per-target 命令;hasScript 每次现算,project_path 先过 validate_project_root,不拿项目写锁、不推进 revision。
- src-tauri/src/desktop.rs 把三个命令注册进 generate_handler!。
- xhs_minitool/mod.rs 收敛为模块声明,不再对外重导出内部类型。
- 实施计划把 XHSMiniToolExportRunResult 的字段名从 stderrTail 修正为 outputTail:输出是 stdout 与 stderr 合并清洗后的尾部。
- Rust 定向测试新增脚本缺失前置失败与输出截断两例。
|
2026-10-05 15:41:43 +08:00 |
|
k88936
|
b6bef5b10b
|
把 export/generated 纳入 prettier 忽略,恢复 ts-rs 原始输出
- .prettierignore 增加 apps/ai-game-creator-shell/src/view/project-development/export/generated/,与其余四个 ts-rs 生成目录同口径:一律以原始输出提交,禁止 prettier 二次改写,否则生成绑定校验会误报内容变化。
- 重新生成 export/generated 下 12 份绑定,覆盖上一提交中被 prettier 改写过的内容。
|
2026-10-05 15:30:30 +08:00 |
|
k88936
|
2a70926a3e
|
小红书小工具的表单 DTO、typed 失败、路径常量与首错校验
- 新增 src-tauri/src/export/draft/xhs_minitool/dto.rs:XHSMiniToolExportForm / Field / State / RunResult 的线上形状;表单 deny_unknown_fields,TS 由 ts-rs 生成。
- 新增 error.rs:命令边界 typed 失败七变体(registryMalformed、formInvalid、buildScriptMissing、saveConflict、commandFailed、artifactMissing、exportUnavailable),带载荷变体持具名结构体,保证前端拿到可判别联合类型。
- 新增 layout.rs:.export/ 下 xhs-minitool.json 与 xhs-minitool.zip 的契约常量、npm 脚本名 build:xhs-minitool 与路径推导。
- 新增 validation.rs:名称与简介按 Unicode 字符数不超过 14 且非空,icon 必须是项目内普通文件、非符号链接、png/jpg/jpeg 且不超过 5 MiB,首个错误即返回。
- 改写 xhs_minitool/mod.rs 为模块声明与重导出,删除上一轮 xhx-* 草案常量与 xhx-minitool 拼写。
- 生成 src/view/project-development/export/generated/ 下 12 份 ts-rs 绑定。
- scripts/check-generated-bindings.mjs 把 export/generated 纳入 AGC 目标的覆盖目录。
|
2026-10-05 15:27:35 +08:00 |
|
k88936
|
91741f9de0
|
导出注册表文件级读写收口到 export 模块
- 新增 apps/ai-game-creator-shell/src-tauri/src/export/registry.rs:注册表 JSON 的自动创建、严格解析、临时文件原子替换与原始字节 SHA-256 指纹,不认任何 target。
- 改写 apps/ai-game-creator-shell/src-tauri/src/export/mod.rs:写清导出模块边界,重导出注册表原语,说明 .export 工作目录的 flat 约定与不进快照的后果。
- src-tauri/src/main.rs 注册 pub mod export;。
- 删除上一轮「共享命令目录」残留的空壳 src-tauri/src/export/command/,命令落点改为 per-target commands.rs。
- registry.rs 覆盖自动创建且重读指纹稳定、非法 JSON fail closed 不覆写、未知字段拒绝、保存返回新指纹四条单测。
|
2026-10-05 15:19:11 +08:00 |
|
k88936
|
f0ee972c9c
|
补充导出产物面板与小红书小工具导出的主规范、里程碑与实施计划
- 主规范在 docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md 新增「2026-10-05 导出产物面板与小红书小工具导出」一节:宿主只做读写注册表、校验表单与脚本、跑项目脚本、交付产物四件确定性的事,适配与打包归 code agent。
- 新增【里程碑】导出产物面板与小红书小工具导出-2026-10-05.md:范围、非目标、依赖与 9 条验收标准。
- 新增【实施计划】导出产物面板与小红书小工具导出-2026-10-05.md:修改边界、实现顺序、验证命令、风险与回滚点。
- docs/project-memory/shared-memory/decision-log.md 记录边界、注册表无状态字段、内容 hash 冲突模型、.export flat 工作目录、复用 command.exec 权限且不拿写锁、prompt 归前端六条决策。
- docs/README.md 的 AI 游戏创作与 Agent Runtime 区补入口。
|
2026-10-05 15:18:50 +08:00 |
|
k88936
|
bef4151b10
|
导出面板图标盒恒为正方形
Project CI / Backend tests (pull_request) Failing after 15s
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Successful in 5m3s
Project CI / AI game creator shell Rust crates (pull_request) Successful in 2m26s
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Successful in 3m47s
Project CI / Repository checks (pull_request) Failing after 26s
Project CI / Frontend tests (pull_request) Successful in 3m17s
Project CI / AI game creator shell web tests (pull_request) Failing after 3m31s
Project CI / Native shell tests (pull_request) Successful in 8m18s
卡片图标盒改回 aspect-square、tab 图标盒改回 size-5,只用 object-contain 等比缩放。
TapTap 横向 logo 在方盒里按宽度居中留白,不再用矩形盒。
|
2026-10-05 13:15:20 +08:00 |
|
k88936
|
477e60c3f8
|
导出面板改用小红书与 TapTap 真实图标
新增 packages/shared/src/icons/rednote.png 与 taptap.png 两个真实图标。
TargetIcon 按 Target 一处收口图源:陶泥儿用 IP 图,小红书用 RedNote,TapTap 用 TapTap logo。
TapTap 是横向 logo,卡片与 tab 的图标盒改为矩形配 object-contain,宽图按宽度贴满、方图按高度贴满。
|
2026-10-05 13:12:09 +08:00 |
|
k88936
|
df4ef37a1c
|
新增「导出到」全屏面板并复用 DirectProject 对话盒
新增 project-development/export 全屏导出面板:目标大卡、等宽下划线 tab、小红书工作台分栏与第二 subscriber 会话。
面板状态提升到 usePanel 根,tab 页可卸载;输入草稿提升到面板层,切 tab 不丢字。
抽出 DirectProjectChatBox,主聊天与导出会话复用同一套对话盒,不再另写版式。
DirectProjectChatHeader 增加「导出」入口,App.tsx 条件挂载全屏面板。
DirectProjectComposer 增加 referencesEnabled 与 draft/onDraftChange,导出输入区关闭素材引用。
新增 tests/artifactsPanel.test.tsx 覆盖卡片、tab、关闭与对话盒复用。
|
2026-10-05 11:49:32 +08:00 |
|
k88936
|
37cb9fb386
|
审核 Skill 目录加入 eslint 忽略,避免 --fix 改写指纹源
- .eslintrc.cjs 的 ignorePatterns 增加 apps/ai-game-creator-shell/src-tauri/resources/agc-skills/**
- 审核 Skill 脚本按 SHA-256 定址并用 include_bytes! 编进客户端,eslint --fix 改写会导致 manifest 指纹漂移
- .prettierignore 本已排除该目录,eslint 补齐同一口径
- 更新决策记录
|
2026-10-04 19:32:33 +08:00 |
|
k88936
|
e3966bac72
|
注册平台抽象与小红书小工具两项 AGC 审核 Skill,并让隐藏文件永不进包
- 新增 platform-abstract 与 vite-export-xhs-minitool 两项审核 Skill
- agc-skill-pack.v1 清单版本升至 2026-08-26.40,两个新条目 sha256 现场重算
- skill-pack 工具新增隐藏文件规则:. 前缀文件/目录不写清单、不参与指纹、不安装、不可读取
- JS 与 Rust 白名单同步扩到 10 项,AGC_SKILL_PACK_FILES 增加 13 条 include_bytes!
- codex_app_server 三条 skills/list 测试夹具补齐两个新 Skill 名
- 补充隐藏路径拒绝与收集器忽略隐藏文件的 JS/Rust 测试
- 修掉 pack.mjs / validate.mjs 的 eslint 问题与三处空白,使其通过 pre-commit 与 git diff --check
- 同步更新技术方案与决策记录
|
2026-10-04 19:23:12 +08:00 |
|
kdletters
|
81cfbae207
|
后台侧栏按业务分组支持折叠
Project CI / AI game creator shell Rust crates (push) Successful in 2m45s
Project CI / AI game creator shell Rust lane 2/2 (push) Successful in 4m17s
Project CI / AI game creator shell Rust lane 1/2 (push) Successful in 5m27s
Project CI / Frontend tests (push) Successful in 3m4s
Project CI / Backend tests (push) Successful in 6m32s
Project CI / Native shell tests (push) Successful in 7m36s
Project CI / AI game creator shell web tests (push) Successful in 3m24s
Project CI / Repository checks (push) Successful in 6m44s
新增后台侧栏业务分组与当前页自动展开行为
补充折叠交互、路由分组和权限过滤测试
同步后台导航分组行为文档
|
2026-10-04 13:25:58 +08:00 |
|
k88936
|
a6fb2f01c1
|
Merge pull request 'Feat/游玩计数' (#604) from feat/play-count-with-cache into master
Project CI / AI game creator shell Rust crates (push) Successful in 3m8s
Project CI / AI game creator shell Rust lane 2/2 (push) Successful in 4m44s
Project CI / AI game creator shell Rust lane 1/2 (push) Successful in 6m7s
Project CI / Backend tests (push) Successful in 7m12s
Project CI / Frontend tests (push) Successful in 3m3s
Project CI / Native shell 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: #604
|
2026-10-04 13:21:04 +08:00 |
|
k88936
|
9ce43071ad
|
Add gamePlayClientId.ts to module and test exclusions
Project CI / AI game creator shell Rust crates (pull_request) Successful in 3m14s
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Successful in 4m54s
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Successful in 6m0s
Project CI / Backend tests (pull_request) Successful in 6m54s
Project CI / Frontend tests (pull_request) Successful in 2m54s
Project CI / Native shell tests (pull_request) Successful in 6m47s
Project CI / AI game creator shell web tests (pull_request) Successful in 3m8s
Project CI / Repository checks (pull_request) Successful in 5m9s
|
2026-10-04 12:53:17 +08:00 |
|
k88936
|
ff83b67196
|
Merge branch 'master' into feat/play-count-with-cache
Project CI / AI game creator shell Rust crates (pull_request) Successful in 3m7s
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Successful in 4m20s
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Successful in 5m28s
Project CI / Backend tests (pull_request) Successful in 7m46s
Project CI / Frontend tests (pull_request) Successful in 3m55s
Project CI / AI game creator shell web tests (pull_request) Successful in 3m18s
Project CI / Native shell tests (pull_request) Successful in 8m37s
Project CI / Repository checks (pull_request) Failing after 6m40s
|
2026-10-04 12:08:32 +08:00 |
|
k88936
|
57e259278d
|
Merge remote-tracking branch 'origin/master' into feat/play-count-with-cache
Project CI / Backend tests (pull_request) Failing after 36s
Project CI / AI game creator shell Rust crates (pull_request) Successful in 2m28s
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Successful in 6m41s
Project CI / Repository checks (pull_request) Failing after 15s
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
Project CI / Frontend tests (pull_request) Has been cancelled
# Conflicts:
# docs/project-memory/shared-memory/decision-log.md
|
2026-10-04 11:58:25 +08:00 |
|
kdletters
|
13a15fed5c
|
修复 AGC 渠道更新互相终止与快捷方式迁移
Project CI / AI game creator shell Rust crates (push) Successful in 3m5s
Project CI / AI game creator shell Rust lane 2/2 (push) Successful in 4m24s
Project CI / AI game creator shell Rust lane 1/2 (push) Successful in 5m20s
Project CI / Backend tests (push) Successful in 6m42s
Project CI / Frontend tests (push) Successful in 3m2s
Project CI / Native shell tests (push) Successful in 7m16s
Project CI / AI game creator shell web tests (push) Successful in 3m17s
Project CI / Repository checks (push) Successful in 6m25s
为 release 与自定义渠道注入独立主程序名,隔离 Windows 更新进程。
新增 release 旧安装目录与快捷方式迁移钩子,保护 dev 历史目录清理。
同步渠道规范、共享决策与排障记录,补充发布脚本回归测试。
|
2026-10-04 11:45:20 +08:00 |
|
k88936
|
08020e664b
|
文档:同步客户端 IP 只信 X-Real-IP
- ADR:身份与去重键节写明 IP 取 nginx 覆盖的 X-Real-IP、XFF 只取末段,并追加 2026-10-04 修订记录
- 玩法链路:去重与限流节标注 IP 来源
- decision-log:2026-10-04 条目补安全修正说明与标题
|
2026-10-04 11:39:00 +08:00 |
|
k88936
|
95705cbb11
|
后端:客户端 IP 只信 X-Real-IP,不再取 XFF 首段
- request_context.rs:client_ip_from_headers 改为优先 nginx 覆盖写入的 x-real-ip,x-forwarded-for 只作回退且取最后一段(nginx 用 $proxy_add_x_forwarded_for 追加的真实对端),不再信任可伪造的首段
- 影响两个调用方:公开游玩上报的匿名身份与 IP+game 限流键、微信支付下单的 payer_client_ip
- 更新测试:X-Real-IP 优先、XFF 回退取末段、空 X-Real-IP 回退与回环兜底
|
2026-10-04 11:38:47 +08:00 |
|
k88936
|
c0148dda7e
|
文档:同步游玩计数关停不强制 flush 与失败丢弃口径
- ADR:修订「正常关停必须 force flush」为关停不做强制 flush,并补充 flush 任一分片失败即丢弃剩余分片;追加修订记录
- 玩法链路:缓冲与延迟改为崩溃/被杀/正常关停都允许丢一个窗口;限流节补充先做内存预检;写入语义补充失败丢弃口径
- decision-log:顶部新增 2026-10-04 修订条目,并给 2026-10-03 条目标注失效项
- docs/README:ADR 摘要去掉「关停 flush」
|
2026-10-04 11:13:55 +08:00 |
|
k88936
|
28ac8a1037
|
后端:游玩计数 flush 失败后直接丢弃剩余分片
- game_play_counter_worker.rs:任一分片失败即停止本次 flush,不再为后续分片逐个重建连接(连接不通时每片都会各自等一次超时)
- Build(确定未发出)仍放回本批,剩余分片直接丢弃;其余错误连本批一起丢弃,并记录丢弃增量
- 补 total_delta 汇总剩余增量,模块文档写明失败即停止与丢弃口径
|
2026-10-04 11:10:03 +08:00 |
|
k88936
|
75ad087e2c
|
后端:关停不再强制 flush 游玩计数
- main.rs:finalize_shutdown 删除游戏游玩计数强制 flush,关停不再为它等待网络,内存里剩余增量随进程结束丢弃
- game_play_counter_worker.rs:删除 flush_game_play_counter_for_shutdown,flush_deltas 去掉 requeue_on_build 参数(关停路径已不存在),Build 仍放回等待下一轮
- game_play_counter.rs:take_pending 标记为仅测试使用,模块文档改指 take_pending_if_due
|
2026-10-04 11:07:02 +08:00 |
|
k88936
|
3f0a77e65e
|
后端:游玩上报先做内存限流预检再查库
- game_play_counter.rs:新增只读 is_rate_limited,不消耗额度也不改状态
- modules/game_distribution.rs:record_game_play 先做内存限流预检,超限直接 429,不再让这些请求也打一次 SpacetimeDB;真正计数时 record 仍会重新判定
- 补预检只读与固定窗口作用域测试
|
2026-10-04 11:04:52 +08:00 |
|
suzmii
|
f689b97d8a
|
Merge pull request '修复 AGC 画布素材卡「引用」无消费者:新增活跃聊天输入区注册表(Issue #602)' (#605) from fix/agc-canvas-reference-insert into master
Project CI / AI game creator shell Rust crates (push) Successful in 3m2s
Project CI / AI game creator shell Rust lane 2/2 (push) Successful in 4m17s
Project CI / AI game creator shell Rust lane 1/2 (push) Successful in 5m36s
Project CI / Backend tests (push) Successful in 6m51s
Project CI / Frontend tests (push) Successful in 3m5s
Project CI / Native shell tests (push) Successful in 6m47s
Project CI / AI game creator shell web tests (push) Successful in 3m0s
Project CI / Repository checks (push) Successful in 5m5s
Reviewed-on: #605
|
2026-10-04 10:48:19 +08:00 |
|
suzmii
|
afc2068fb3
|
Merge pull request '修复 master CI 红:收银台深链前缀路由、外部 MCP 工具数断言、并发 span 采集竞态、AGC 壳 shard-4 断言' (#609) from fix/ci-master-red into master
Project CI / AI game creator shell Rust crates (push) Successful in 2m58s
Project CI / AI game creator shell Rust lane 2/2 (push) Successful in 3m58s
Project CI / AI game creator shell Rust lane 1/2 (push) Successful in 4m45s
Project CI / Backend tests (push) Successful in 7m9s
Project CI / Frontend tests (push) Successful in 3m12s
Project CI / Native shell tests (push) Successful in 7m9s
Project CI / AI game creator shell web tests (push) Successful in 3m13s
Project CI / Repository checks (push) Successful in 6m31s
Reviewed-on: #609
|
2026-10-04 09:20:59 +08:00 |
|
suzmii
|
4fc13bcfe3
|
合并 fix/ci-master-red(PR #609)到 fix/agc-canvas-reference-insert:取得 master 级 CI 修复
Project CI / AI game creator shell Rust crates (pull_request) Successful in 2m54s
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Successful in 4m22s
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Successful in 5m21s
Project CI / Backend tests (pull_request) Successful in 6m30s
Project CI / Frontend tests (pull_request) Successful in 3m29s
Project CI / Native shell tests (pull_request) Successful in 7m10s
Project CI / AI game creator shell web tests (pull_request) Successful in 3m37s
Project CI / Repository checks (pull_request) Successful in 6m16s
把 #609 的 8/8 全绿修复并进本分支,满足「PR head 必须包含最新 base 提交」的门禁,同时带上共享红修复:check:nginx-spa-routes 的 /pay/<checkoutToken> 前缀路由与 Pingora 路由矩阵、external_mcp::semantic 真值 32、api-server/platform-llm 的 tracing interest 竞态、AGC 壳 Rust shard-4 两条偶发断言
本次 merge 无冲突自动完成:pitfalls.md 两边条目都保留(本分支的 issue #602 条目 + #609 的 2026-10-04 tracing/shard-4/SPA 深链三条)
未改动 #609 引入的任何文件
|
2026-10-04 03:40:21 +08:00 |
|
suzmii
|
8b11dc4e7a
|
语义目录测试的总数断言改回字面量,避免恒真
Project CI / AI game creator shell Rust crates (pull_request) Successful in 2m50s
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Successful in 4m10s
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Successful in 5m5s
Project CI / Backend tests (pull_request) Successful in 6m30s
Project CI / Frontend tests (pull_request) Successful in 3m12s
Project CI / AI game creator shell web tests (pull_request) Successful in 2m44s
Project CI / Native shell tests (pull_request) Successful in 6m33s
Project CI / Repository checks (pull_request) Successful in 5m5s
- names.len() == MCP_OPERATIONS.len() + TOOLS.len() 在 BTreeSet 去重构造下恒真、没有判别力;
改回固定 47(32 条 legacy 工具 + 15 条语义工具),并注明上面的插入断言已保证两组名字互不覆盖
- 本地实跑:cargo test --locked -p api-server --manifest-path server-rs/Cargo.toml --bin api-server semantic
→ 18 passed
|
2026-10-04 03:25:54 +08:00 |
|
suzmii
|
ad0430fcd2
|
补上收银台深链 /pay/<checkoutToken> 的前缀路由(Nginx 三模板 + Pingora + 门禁)
- 现状:只把 `/pay`、`/profile/payment` 加进 allowlist 只能让 check:nginx-spa-routes 变绿;
payment.rs 生成的 checkoutUrl 是 `/pay/<checkoutToken>`,深链仍落默认 location 的
try_files → 404。同一批漂移里 check:pingora-route-parity 也是红的(Pingora MAIN_SPA_PATHS
缺 /pay、/profile/payment),只是被 lint 链里先失败的门禁掩盖,修一条要跑到链尾
- 真相源:src/routing/activeAppPageRoutes.ts 新增 APP_PREFIX_ROUTE_ENTRIES
('/pay' → payment-checkout),resolveSelectionStageFromPath 改用它
- 门禁:scripts/check-nginx-spa-routes.mjs 要求三份模板都有锚定前缀 location
`location ~* "^/pay/[^/]+/?$"`(裸前缀仍由精确 location 负责;前缀 location 必须镜像精确
location 的维护闸与 try_files 回退);新增 scripts/check-nginx-spa-routes.test.mjs 正/反用例
(把前缀写成精确匹配或过宽裸前缀都会红),由 npm run check:nginx-spa-routes 一起执行;
check-pingora-route-parity 新增 MAIN_SPA_PREFIX_PATHS 与前端前缀路由的逐条比对
- 模板:deploy/nginx/genarrative.conf、deploy/nginx/genarrative-dev-http.conf、
deploy/container/nginx.conf 各加一条锚定前缀 location
- Pingora:MAIN_SPA_PATHS 补 /pay、/profile/payment;新增 MAIN_SPA_PREFIX_PATHS 与
is_main_spa_prefix_path(大小写不敏感,只认「前缀 + 恰好一段」),矩阵新增
pay_checkout_spa_fallback 用例,并给网关补一条前缀正/反单测
- 文档:Pingora 试点文档的路由表与门禁说明、deploy/nginx/README 与本地开发/生产运维文档
同步前缀路由口径与线上 curl 复验方式
- 本地实跑:node --test scripts/check-nginx-spa-routes.test.mjs(4 passed)、
node scripts/check-nginx-spa-routes.mjs(OK,14 SPA routes / 1 prefix routes / 3 templates)、
npm run check:pingora-route-parity(OK,25 routes)、
cargo test -p pingora-gateway -- pay_checkout_deep_link matches_nginx_route_parity_matrix(2 passed)
|
2026-10-04 03:25:54 +08:00 |
|
suzmii
|
9e2cea5b72
|
修复 AGC 壳 Rust shard-4 的两条偶发断言,并补齐 pitfalls 记录
- agent::thread_manager::tests::active_turn_changes_publish_one_notification_per_real_change
偶发 left 8/right 7:测试计数器 DIRECT_ACTIVE_TURNS_EVENT_TEST_COUNT 曾在 2026-10-01 按线程
作用域隔离,2026-10-02 退役 runtime_driver 把它搬进 agent/direct_events.rs 时降级回进程级
static AtomicU64,于是断言会取到宿主 tauri::async_runtime 后台回合在别的线程上的广播
(--test-threads=1 只串行测试线程)。改回 thread_local! Cell,并注明跨线程口径的覆盖取舍
- process_session::tests::process_session_graceful_terminate_keeps_wrapper_alive_for_target_cleanup
偶发 left "exited"/right "terminated":测试命令里 leader 打印 READY 后立刻 exit 0,同组后代
仍存活,trampoline 从 leader 被回收起开始 800ms 宽限;客户端只要晚于宽限才发出 terminate
就只能读到既成事实。改为 leader 用 wait 等后台子进程,让 terminate 必然落在会话仍 running 时
(trap / sleep 0.4 / marker / 断言均未改),并注明该用例的确定性来自 400ms < 800ms 的时间余量
- docs/project-memory/shared-memory/pitfalls.md:更新 graceful terminate 那条已过时的验证口径,
补三条 2026-10-04 条目(tracing interest 竞态、AGC 两条偶发的串台根因、SPA 深链前缀路由)
- 本地实跑:修复前把计数器临时改回 AtomicU64 时同一并行口径 17/20 红;修复后并行 20 次全绿、
agent::thread_manager:: 连跑 5 次 72 passed;第 2 条用例是 #[cfg(target_os = "linux")],
Windows 本机跑不到,已用真实 Linux 内核(WSL Alpine)验证命令形状(leader 活到 TERM、
同组后代完成 400ms 延迟清理 marker=done 0.41s、清理后组内零残留),CI 侧仍需跑
node apps/ai-game-creator-shell/scripts/run-rust-shell-test-shards.mjs --shards=4 --shard-index=4 复核
|
2026-10-04 03:25:54 +08:00 |
|
suzmii
|
977b2f0c75
|
修掉并发测试下 HTTP/Provider span 偶发采集为空的 tracing interest 竞态
- 根因:span!/info_span! 宏在 callsite 的缓存 interest 为 never 时会静默返回空 span
(tracing-0.1.44/src/macros.rs 的 span! 分支),而 DefaultCallsite::register 只在调用点
首次被命中时计算一次 interest,且当进程里只注册过一个 dispatcher 时会退化成
dispatcher::get_default()——也就是命中线程自己的 dispatcher(tracing-core-0.1.36
callsite.rs 的 Rebuilder::JustOne)。libtest 默认并发下,没有 subscriber 的普通测试线程
一旦抢到 http.request / llm.request 调用点的首次注册,就会把它永久缓存成 never,
于是 CI 偶发看到 0 个 span(app.rs:603、observability_tests.rs:98)
- 关键:set_default 与 with_subscriber 在 interest 缓存这件事上**等价**(都只是新建 Dispatch
并触发一次 rebuild_interest,只能纠正“已经注册过”的调用点,纠正不了 JustOne→get_default
这条首次注册分支),所以真正起作用的是**在自家 subscriber 下命中同一个调用点做热身**,
把首次注册的顺序握在自己手里;register_callsite 覆写只用于避免本 subscriber 触发的重建
把其它调用点永久标记成 never
- api-server app::tests::http_tracing:不再用 with_subscriber,改为在请求前用同一
http.request 调用点热身到连续两轮采集成功,并在整个请求期间持有 scoped default
(已注明 set_default 是线程绑定,只适用于默认的 current_thread #[tokio::test])
- platform-llm observability_tests:新增 run_under_capture 固定整段流程的 scoped default,
并新增 warm_up_provider_span_callsite(用指向刚释放 loopback 端口的最小失败请求命中同一
llm.request 调用点,连续两轮采集成功才继续)
- 断言未放宽:仍要求每个被拒绝请求恰好 1 个 HTTP span、每次 Provider 调用恰好 1 个
llm.request span;未使用 sleep
- 本地实跑:cargo test -p api-server --bin api-server app::tests::http_tracing(默认并发与
--test-threads=1 各 20 次全绿)、app::tests:: 91 用例并发 10 次全绿、--skip bgfilter_worker
--skip wallet_refund_outbox 的 1133 用例全量 bin 2 次全绿;cargo test -p platform-llm --lib
(162 passed,含 3 条观测用例)连跑 20 次全绿
|
2026-10-04 03:25:54 +08:00 |
|
suzmii
|
05707e61e4
|
修正外部 MCP 语义目录测试里写死的 legacy 工具数断言
- 断言 MCP_OPERATIONS.len() == 30 自 #592 起写死。4b529a895(新增支付服务接入与订单收银台)
在内置 OpenAPI 中新增 createExternalPaymentOrder、getExternalPaymentOrder 两条未被
x-mcp-excluded 排除的操作,legacy 可调用工具由 30 合法增至 32(非重复注册、非覆盖)
- 断言更新为 32 并注明来源(内置 OpenAPI 去掉 5 条元数据/入口操作后的可调用集合),
保留“语义工具是增量、不得覆盖 legacy 工具”的原意;总数断言改为
MCP_OPERATIONS.len() + TOOLS.len() 派生,避免再次写死
- 本地实跑:cargo test --locked -p api-server --no-fail-fast --manifest-path server-rs/Cargo.toml semantic
→ 18 passed(含 semantic_catalog_adds_fifteen_tools_without_replacing_legacy_tools)
|
2026-10-04 00:56:55 +08:00 |
|
suzmii
|
26b6e1095b
|
修复 Nginx SPA allowlist 缺少 /pay 与 /profile/payment
- src/routing/activeAppPageRoutes.ts 的 STAGE_ROUTE_ENTRIES 已把 payment-checkout→/pay、
profile-payment→/profile/payment 定义为主站对外可直达的 SPA 路由(分别渲染
PaymentCheckoutView 与 PlatformPaymentServiceView),但三份 Nginx 模板的 SPA allowlist
仍停留在加入支付入口之前的集合,导致 check:nginx-spa-routes 在 master 上失败
- deploy/nginx/genarrative.conf、deploy/nginx/genarrative-dev-http.conf、
deploy/container/nginx.conf 的 SPA regex 补上 pay、profile/payment,
保持既有形状(锚定完整路径 + 大小写不敏感 + 允许一个尾部斜杠)
- 本地实跑:node scripts/check-nginx-spa-routes.mjs → OK (14 SPA routes, 3 Nginx templates)
|
2026-10-04 00:56:54 +08:00 |
|
suzmii
|
3f18e3dc77
|
按独立评审的三条 P2 收口:空批次不误报、重复注册留线索、文档与实测对齐
Project CI / AI game creator shell Rust crates (pull_request) Failing after 1m35s
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Successful in 4m20s
Project CI / Backend tests (pull_request) Failing after 4m39s
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Successful in 5m18s
Project CI / Frontend tests (pull_request) Successful in 3m19s
Project CI / AI game creator shell web tests (pull_request) Successful in 3m43s
Project CI / Native shell tests (pull_request) Successful in 7m28s
Project CI / Repository checks (pull_request) Failing after 4m32s
App.tsx 的监听处对空批次直接返回:空批次没有要插的东西,不能报成「没有可用的聊天输入区」(原因指向错了方向)
activeChatComposer.registerActiveChatComposer 增加重复注册检测:dev 下 console.warn 指出后注册者顶替了前者,不改运行时语义(仍然后注册者接管、身份校验照旧兜住乱序卸载)
tests/activeChatComposer.test.ts 补两条:空批次不打扰已挂载输入区;重复注册出现告警且乱序注销清不掉更新的句柄
tests/resourceCanvasChatReferenceDrop.test.tsx 补一条:直接构造空批次引用事件时不产生「没有可用的聊天输入区」告警
decision-log 的「影响范围」补记 tests/activeChatComposer.test.ts,「验证」换成合并 master 后的实跑数字;功能说明的用例表补两行
反向证伪:去掉空批次短路、去掉重复注册告警后,上面两条新用例各红一处
|
2026-10-04 00:38:06 +08:00 |
|
suzmii
|
455b265a75
|
合并 master 到 fix/agc-canvas-reference-insert:按新测试替身与类型门禁解冲突
master 侧(PR #601)新增 tests/tauriRuntimeFake.ts(全仓唯一 window.__TAURI__ 安装点)与 tsconfig.tests.json,测试统一改用 installTauriRuntime / resetTauriRuntime,并新增 check:tests:types 门禁
冲突三处测试文件(resourceCanvasChatReferenceDrop.test.tsx、appSurface/project-development.suite.ts、appSurface/design-agent.suite.ts)按语义两边保留:采用 master 的替身安装点与类型收窄(ResourceReference 过滤),保留本分支的真实 DirectProject 聊天面挂载与端到端草稿断言
App 的 props 类型未导出,新增的两处 chat 节点改用 AppComponent 组件类型别名(与 design-agent.suite.ts 同一写法),通过新的 check:tests:types
docs 侧 pitfalls.md / decision-log.md 自动合并:本分支的 issue #602 条目与 master 的「根因 7/8」条目都保留
未在本分支修 master 既有红(check:nginx-spa-routes 缺 /pay 与 /profile/payment、external_mcp::semantic 32 vs 30、http_tracing 偶发、AGC Rust shard 4/4),由上游 fix/ci-master-red 处理
|
2026-10-04 00:28:19 +08:00 |
|
suzmii
|
f4ada50612
|
自审加固:注册表按 ref 转发注册、插入成功语义与失败留痕对齐
Project CI / Backend tests (pull_request) Failing after 17s
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Successful in 4m50s
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Successful in 5m19s
Project CI / AI game creator shell Rust crates (pull_request) Successful in 2m43s
Project CI / Repository checks (pull_request) Failing after 32s
Project CI / Frontend tests (pull_request) Successful in 2m35s
Project CI / AI game creator shell web tests (pull_request) Successful in 2m23s
Project CI / Native shell tests (pull_request) Successful in 6m26s
ActiveChatComposerHandle.insertReferences 改为返回 boolean:由句柄回答这一批有没有真的递到输入区,注册表不再用「有句柄」冒充「插进去了」
insertChatReferences 增加第三种 false(句柄报落空),且只有插入成功才 focus,失败不抢焦点
DirectProjectChatView 改为注册「按 ref 转发」的句柄,注册时不再读 composerHandleRef.current,去掉对父子 effect 顺序的隐式依赖(内层输入区重挂载也不会留下死句柄)
DirectProjectComposer 与 PlanningChatView 的转发句柄同步返回 boolean
App.tsx 的 dev 失败线索文案改为「没有可用的聊天输入区(未挂载或已卸载)」,覆盖句柄落空这一种
新增 tests/activeChatComposer.test.ts:钉住注册表合同(空批次 / 无输入区 / 句柄报落空不聚焦 / 注销身份校验);反向证伪:去掉身份校验后该用例变红
同步 docs/【功能说明】AGC聊天素材引用-2026-09-08.md 与 shared-memory 决策记录
|
2026-10-04 00:12:24 +08:00 |
|
k88936
|
ccd2715726
|
Merge pull request 'Fix/typecheck test' (#601) from fix/typecheck-test into master
Project CI / AI game creator shell Rust crates (push) Successful in 3m9s
Project CI / Backend tests (push) Failing after 4m6s
Project CI / AI game creator shell Rust lane 2/2 (push) Successful in 4m59s
Project CI / AI game creator shell Rust lane 1/2 (push) Successful in 5m49s
Project CI / Frontend tests (push) Successful in 3m5s
Project CI / AI game creator shell web tests (push) Successful in 2m41s
Project CI / Repository checks (push) Failing after 3m36s
Project CI / Native shell tests (push) Successful in 6m18s
Reviewed-on: #601
|
2026-10-03 21:05:42 +08:00 |
|
k88936
|
25c5ecdf6e
|
测试:全仓测试统一 Tauri 运行时替身安装点
Project CI / AI game creator shell Rust crates (pull_request) Successful in 2m58s
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Successful in 6m34s
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Successful in 5m29s
Project CI / Backend tests (pull_request) Failing after 4m38s
Project CI / Frontend tests (pull_request) Successful in 3m33s
Project CI / Repository checks (pull_request) Failing after 4m4s
Project CI / AI game creator shell web tests (pull_request) Successful in 3m13s
Project CI / Native shell tests (pull_request) Successful in 6m35s
- 78 处内联 window.__TAURI__ 赋值改为 installTauriRuntime,覆盖 appSurface 之外的 37 个测试文件
- 31 处 delete window.__TAURI__ / window.__TAURI__ = undefined 复位改为 resetTauriRuntime
- 删除 recentProjectsHook、projectCreationDirectory、projectResourceLiveIntegration、useProjectResourceCardPreviews、resourceVersionReplacementModel、unityProjectOpen 里的本地 asTauriInvoke / asTauriListen 适配器与相关类型别名
- designProjectRestore 的 setup 参数由 ReturnType<typeof vi.fn> 收窄为具体 invoke 签名
- 迁移后仅 tests/tauriRuntimeFake.ts 直接读写 window.__TAURI__
|
2026-10-03 20:19:45 +08:00 |
|
suzmii
|
a22e8ee447
|
修复 AGC 画布素材卡「引用」无消费者:新增活跃聊天输入区注册表
Project CI / Backend tests (pull_request) Failing after 18s
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Successful in 5m44s
Project CI / AI game creator shell Rust crates (pull_request) Successful in 3m2s
Project CI / Repository checks (pull_request) Failing after 30s
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Successful in 5m10s
Project CI / Frontend tests (pull_request) Successful in 2m43s
Project CI / AI game creator shell web tests (pull_request) Successful in 3m16s
Project CI / Native shell tests (pull_request) Successful in 5m58s
新增 features/project-workspace/activeChatComposer.ts:模块级保存当前挂载的输入区句柄,registerActiveChatComposer 注销时校验身份,insertChatReferences 空批次或无句柄返回 false
DirectProjectComposer 用 useImperativeHandle 暴露 DirectProjectComposerHandle(按 ref 转发,句柄稳定),新增可选 ref 入参
DirectProjectChatView 挂载期间注册、卸载注销,并把 composerHandleRef 传给 DirectProjectComposer
PlanningChatView 同样注册(句柄按 composerRef 转发),两条链路互斥渲染,同一时刻只有一个句柄
App.tsx 收敛为一处监听:单条「引用」与批量拖拽两个事件都走 insertChatReferences,返回 false 时 dev 下 console.warn
chatComposerRef 只保留给策划输入盒自己的 getDraft / clear,不再承担跨面板插入
project-development.suite.ts:工具条「引用」用例改为渲染真实 DirectProject 聊天面,断言草稿里出现引用芯片(键盘 + 鼠标两条通路、光标留在插入之后)
resourceCanvasChatReferenceDrop.test.tsx:换成真实 DirectProject 聊天面,批量拖拽断言整批一次落进草稿且顺序 = 拖动集合顺序;新增未登记素材不出「引用」按钮、拖拽只给原因的用例
design-agent.suite.ts:新增策划链路引用插入不回归用例
同步 docs/【功能说明】AGC聊天素材引用-2026-09-08.md、shared-memory 的 pitfalls 与 decision-log
|
2026-10-03 19:43:18 +08:00 |
|