合并 master:接入 AGC 内置插件宿主与 Cocos 编辑器能力(#338)
合并 origin/master 4a46f89c9 到 chore/agc-acceptance-build(HEAD 55fab1776),本次合并共涉及 117 个文件(113 个自动合并 + 4 个冲突)。
- 自动合并 113 个文件:插件宿主与插件工作区(plugin_host.rs / builtin_plugins.rs / editor_adapter(_s).rs / plugins/agc-cocos-editor / cocos-editor-bridge crate / editor-adapter-api)、构建与打包脚本、locked Cargo.lock 及 master 侧锁与资源链路改动;不逐条列出。
- 冲突 1 apps/ai-game-creator-shell/src/App.tsx:271-278:两侧各自新增一个 import(本分支 ./services/tauriEventSubscription、master ./services/pluginHost),两个 import 都保留,并按 simple-import-sort 口径排在 ./services/platformSession 之后、tauriEventSubscription 之前;四个符号都仍被使用。
- 冲突 2 docs/project-memory/shared-memory/decision-log.md:8338-8469:两侧在同一位置追加记录,逐字保留两侧记录且各自原有顺序不变(先本分支的 2026-09-11 资源卡预览 data URL / loopback HTTP 两条,后 master 的 2026-09-09~2026-09-12 通用插件宿主、Cocos 桥接与内置插件开关条目),不改写、不合并措辞。
- 冲突 3 docs/project-memory/shared-memory/pitfalls.md:79-112:同上,保留本分支的「2026-09-05 资源画本转场与视口分离」与 master 的「2026-09-11 首页自动工作区必须使用 AGC 管理目录」「2026-09-12 Cocos 项目识别不等于编辑器桥就绪」「2026-09-11 Cocos 项目必须走独立导入分支」,内容逐字保留、两侧原顺序不变。
- 冲突 4 apps/ai-game-creator-shell/src-tauri/src/agent/direct_project_history.rs:400-435:判据是「两侧不互斥」,解法为 both(语义超集)。
- 冲突 4 保留本分支的有界退避重试循环(DIRECT_PROJECT_HISTORY_CONTENTION_RETRY_BACKOFF_MS + is_direct_project_history_contention_failure + 测试注入点)与单次尝试函数 append_direct_project_history_item_once(含锁外幂等回扫与锁内状态复核)。
- 冲突 4 保留 master 的有界等待取项目写锁:把该函数内原来的零等待 crate::project::acquire_project_write_lock(root, "conversation.write") 换成 acquire_game_creator_agent_runtime_project_write_lock_with_wait(root, "conversation.write"),并原样保留 master 的注释(agc_write_file 占锁 5.5 秒期间,零等待取锁会让流式历史落盘直接失败)。
- 冲突 4 判断依据:master 只替换了同一处的取锁语义(零等待 → 约 10 秒有界等待,并有 append_waits_for_a_same_process_project_writer 用例锁定),不改变函数签名、调用方与错误类型;HEAD 的重试循环因此仍然可达,与有界等待叠加后语义更强——写文件占锁由有界等待吃掉,等待窗口耗尽后的残余争用再由一次 250ms 短退避重试兜底。未删除任何一侧行为,也未放弃任何一侧语义。
- 冲突 4 位置取舍:有界等待取锁仍放在锁外回扫与序列化之后(本分支结构),保住「幂等回扫与序列化留在锁外、不让他人等整份历史读完」的性能语义;master 的注释与调用参数逐字保留。
- 验证:npm run typecheck、npm --prefix apps/ai-game-creator-shell run typecheck、cargo check --locked --all-targets(exit 0,0 error)、npm run check:rustfmt、npm run check:encoding、git diff --check 全部通过;冲突标记扫描为空。
- 定向 Rust 测试(--test-threads=1):direct_project_history 19 passed / 0 failed(含本分支 contention_failure_is_retried_with_bounded_backoff、contention_failure_beyond_the_backoff_budget_fails_closed、shape_failure_is_not_retried 与 master 的 append_waits_for_a_same_process_project_writer);conversation 36 passed / 0 failed;write_lock 21 passed / 0 failed。两侧用例同时绿,证明有界等待取锁与有界退避重试叠加后语义自洽。
- 未跑全量测试(按仓库约定本地只跑定向,全量交给 CI);本次不 push。
This commit is contained in:
@@ -12,7 +12,9 @@ export const REQUIRED_WORKSPACES = Object.freeze([
|
||||
'apps/preview-deployer-web',
|
||||
'packages/image-canvas-core',
|
||||
'packages/image-canvas-react',
|
||||
'packages/agc-plugin-sdk',
|
||||
'packages/shared',
|
||||
'plugins/agc-cocos-editor',
|
||||
'tools/spine-json-export-validator',
|
||||
]);
|
||||
|
||||
@@ -24,7 +26,9 @@ const WORKSPACE_NAMES = Object.freeze({
|
||||
'apps/preview-deployer-web': '@genarrative/preview-deployer-web',
|
||||
'packages/image-canvas-core': '@genarrative/image-canvas-core',
|
||||
'packages/image-canvas-react': '@genarrative/image-canvas-react',
|
||||
'packages/agc-plugin-sdk': '@genarrative/agc-plugin-sdk',
|
||||
'packages/shared': '@genarrative/shared',
|
||||
'plugins/agc-cocos-editor': '@genarrative/agc-plugin-cocos-editor',
|
||||
'tools/spine-json-export-validator':
|
||||
'@genarrative/spine-json-export-validator',
|
||||
});
|
||||
@@ -45,6 +49,7 @@ const REQUIRED_LOCAL_DEPENDENCIES = Object.freeze({
|
||||
'packages/image-canvas-react/package.json': [
|
||||
'@genarrative/image-canvas-core',
|
||||
],
|
||||
'plugins/agc-cocos-editor/package.json': ['@genarrative/agc-plugin-sdk'],
|
||||
});
|
||||
|
||||
const DEPENDENCY_FIELDS = Object.freeze([
|
||||
|
||||
@@ -20,7 +20,9 @@ const workspaceNames = {
|
||||
'apps/preview-deployer-web': '@genarrative/preview-deployer-web',
|
||||
'packages/image-canvas-core': '@genarrative/image-canvas-core',
|
||||
'packages/image-canvas-react': '@genarrative/image-canvas-react',
|
||||
'packages/agc-plugin-sdk': '@genarrative/agc-plugin-sdk',
|
||||
'packages/shared': '@genarrative/shared',
|
||||
'plugins/agc-cocos-editor': '@genarrative/agc-plugin-cocos-editor',
|
||||
'tools/spine-json-export-validator':
|
||||
'@genarrative/spine-json-export-validator',
|
||||
};
|
||||
@@ -34,6 +36,7 @@ const localDependencies = {
|
||||
},
|
||||
'apps/mobile-shell': { '@genarrative/shared': '0.1.0' },
|
||||
'packages/image-canvas-react': { '@genarrative/image-canvas-core': '0.1.0' },
|
||||
'plugins/agc-cocos-editor': { '@genarrative/agc-plugin-sdk': '0.1.0' },
|
||||
};
|
||||
|
||||
afterEach(() => {
|
||||
|
||||
@@ -1777,6 +1777,7 @@ class DevRunner {
|
||||
env,
|
||||
stdio: ['ignore', 'pipe', 'pipe'],
|
||||
shell: process.platform === 'win32',
|
||||
windowsHide: process.platform === 'win32',
|
||||
},
|
||||
);
|
||||
|
||||
@@ -2096,6 +2097,7 @@ class DevRunner {
|
||||
env: mergedEnv,
|
||||
stdio: ['ignore', 'pipe', 'pipe'],
|
||||
shell: process.platform === 'win32',
|
||||
windowsHide: process.platform === 'win32',
|
||||
},
|
||||
);
|
||||
|
||||
@@ -2171,6 +2173,7 @@ class DevRunner {
|
||||
env: mergedEnv,
|
||||
stdio: ['ignore', 'pipe', 'pipe'],
|
||||
shell: process.platform === 'win32',
|
||||
windowsHide: process.platform === 'win32',
|
||||
},
|
||||
);
|
||||
|
||||
@@ -2259,6 +2262,7 @@ class DevRunner {
|
||||
env,
|
||||
...createDevServerSpawnOptions(),
|
||||
shell: process.platform === 'win32',
|
||||
windowsHide: process.platform === 'win32',
|
||||
},
|
||||
);
|
||||
|
||||
@@ -2303,6 +2307,7 @@ class DevRunner {
|
||||
env,
|
||||
...createDevServerSpawnOptions(),
|
||||
shell: process.platform === 'win32',
|
||||
windowsHide: process.platform === 'win32',
|
||||
},
|
||||
);
|
||||
|
||||
@@ -3260,6 +3265,7 @@ function runForeground(command, args, { cwd, env, label }) {
|
||||
env,
|
||||
stdio: ['inherit', 'pipe', 'pipe'],
|
||||
shell: process.platform === 'win32',
|
||||
windowsHide: process.platform === 'win32',
|
||||
});
|
||||
|
||||
child.stdout?.on('data', (chunk) => capture(chunk, process.stdout));
|
||||
|
||||
Reference in New Issue
Block a user