Files
daluandou/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/CHANGELOG.md
T
huadexuan 13d0c80335 ```
chore(bridge): 删除桥接包的提交记录和Git属性配置

删除了 .codely-bridge-commit 文件中存储的提交哈希值
移除了 .gitattributes 文件中的行结束符配置规则
```
2026-09-24 21:41:14 +08:00

1708 lines
121 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Changelog
All notable changes to Codely Bridge will be documented in this file.
## [1.0.84] - 2026-09-14
### Added
- **Cowork 支持按项目暂停自动资源监听**(`b088ccb`、`b8c203e`、`1940db0`、`2bad5d6`、`73afad0`、`1b27c52`):
- 新增内部 `set` / `status` 动作并向所有连接的 Cowork 窗口广播状态;暂停状态保存在 `SessionState`,domain reload 后仍保持,关闭编辑器后恢复默认监听
- 暂停时仅阻止编辑器聚焦触发的 AutoRefresh,工具主动发起的刷新与导入仍正常执行;恢复时在下一帧统一扫描并导入暂停期间的改动,同时兼容 Unity 6
## [1.0.83] - 2026-09-11
### Fixed
- **Bridge 更新检测改用原生 DLL 哈希,不再误判同版本 UPM 重注册**(`ce21879`、`fdf6a92`、`d9143fc`):
- UPM 在安装或移除其它包时会把 Bridge 重新列进 changedTo,此前即使版本与 DLL 均未变化也会卸载 socket 并弹重启提示;现在改为比较原生插件 MD5,字节相同则既不卸载也不提示
- 首次记录只写入基线,离线替换 DLL 后打开编辑器不再误弹重启提示
- DLL 哈希计算失败时输出警告日志,不再静默吞掉,便于排查漏检
- **macOS AI Marketplace 无法选择图片**(`d686fcc`):
- macOS WKWebView 需要宿主实现 `WKUIDelegate` 才会弹出文件选择框,此前页面上点击 `<input type="file">`(如生成页的“添加参考图”)没有任何反应;Windows WebView2 无此问题
- 实现原生 `NSOpenPanel` 文件选择,主 frame 与嵌套 iframe 均生效,并同步更新 macOS `WebViewPlugin` 二进制
## [1.0.82] - 2026-09-09
### Added
- **`manage_asset.ensure_prefab_variant` 幂等创建 Prefab Variant**(`4b23d27`、`8067fbc`、`be40a4a`、`f7a6922`、`b41f636`、`3545673`):
- 传入 `path` + `sourcePrefab` 创建 Prefab Variant;目标已是同一 source 的 Variant 时直接返回成功(幂等),目标存在但不是 Variant 或基于其它 source 时报错
- 拒绝 FBX/Model 源并提示先创建普通 Prefab;AssetDatabase 尚未导入 / 刚保存的目标按幂等重试处理,不再误报冲突;保存成功但读取资产信息失败时不误删已生成的 Variant
- **Bridge 包更新后弹窗提示重启团结编辑器**(`9afd0aa`、`1573e8a`):原生插件与当前编辑器进程绑定,包更新需要完整重启而非 domain reload;更新后弹出 “Codely Bridge Updated” 对话框(Restart Now / Later),Restart Now 重开当前工程;pending 标记存于 SessionState(domain reload 后仍会提示),批量 / 自动化运行不弹窗
### Changed
- **`unity_asset` / `unity_shader` 动作面精简**(`2678ca9`、`1915c41`):
- `manage_asset` 移除 `ensure_has_meta`、`ensure_meta_integrity`、`create_folder`、`get_components`:组件列表并入 `get_info` 响应(含 Missing Script 槽位标记);.meta 确保 / 完整性助手移除(refresh / import 本就会安全重建 .meta);不再支持显式创建文件夹——`create` / `move` 会自动创建缺失的父目录
- `manage_shader` 仅保留 `compile` 与 `preview`,移除与场景 / 材质工作流重复的 `detect_render_pipeline`、`ensure_material_shader_for_srp`
- **`manage_editor.refresh` 在 Play 模式下不再报错**(`cf83963`):刷新前自动退出 Play 模式(Job 新增 ensure-edit-mode 步骤,已处于编辑模式时跳过),替代原先的 `refresh_blocked_in_play_mode` 错误
- **发布渠道切换为 CDN**(`e13099e`、`311e5cf`):引入 `scripts/release-tools` 发布脚本与 `release_bridge` 手动流水线(打包、上传 TOS、校验 CDN、创建 release tag 并自动开 bump MR);Packman 发布、兼容性注册与 1.0.0 别名退役
### Fixed
- **Windows 下输出路径含非 ASCII 字符时 MP4 录制失败**(`8faae3c`):原生 MediaEncoder 在 Dispose 重写时间戳时对非 ASCII 路径报错(WindowsVideoMedia 0x8000ffff “Erase timestamps”);编码先落到 `%TEMP%` 暂存文件,成功后再移动到目标路径
- **`manage_asset` 路径校验加固**(`5a5faa7`):路径清洗不再盲信 `Assets/` 前缀,解析后强制结果留在项目 `Assets/` 内,越界直接报错而非探测 / 写到工程外
## [1.0.81-exp.1] - 2026-09-04
### Added
- **Game View 录制改用原生 MediaEncoder,并支持慢动作 encodeFps**(`691799c`):
- Windows / macOS 使用 Unity `MediaEncoder` 编码 H.264 MP4,不再依赖外部编码器
- `start_game_view_recording` 新增 `encodeFps`(默认 2),低于采集 fps 时输出慢动作,方便低采样率模型看全每一帧
### Fixed
- **替换 meta 中的占位 GUID**(`b7a70ba`):
- 将 AI 生成的顺序占位 GUID 换成真实唯一值,避免导入时资源引用冲突
### Changed
- **端口注册与 handshake 行为调整**(`893e8f1`):
- 端口注册文件改到项目 `Temp/`;native heartbeat 不再写入 `stream_port`
- **更新各平台原生 TCP Bridge**(`893e8f1`、`a35e6d9`、`a2c1c5b`):
- 同步最新 Windows `NativeTcpBridge.dll`、macOS `libNativeTcpBridge.dylib`、Linux `libNativeTcpBridge.so`
## [1.0.80] - 2026-09-03
## [1.0.80-exp.1] - 2026-09-02
## [1.0.79-exp.2] - 2026-09-02
### Added
- **刷新资源数据库并返回最新诊断**(`94b2808`):
- `manage_editor.refresh` 同步刷新资源数据库,等待导入与编译结束后返回错误、警告和控制台信息;播放或暂停模式下会阻止刷新
## [1.0.79-exp.1] - 2026-08-31
### Added
- **显式 resume 动作**(`0cbeef3`):
- `manage_editor` 新增 `resume`,通过 `singleFrame` 选择单帧步进或持续播放;`pause` 支持 `targetPaused` 指定目标暂停状态,不再只能切换
### Changed
- **移除已废弃的 wait_for_upm**(`c8dddd3`):
- 删除 `wait_for_upm` 处理与对应 job,未知 action 统一走路由错误;`install_package` / `remove_package` 本身已等待完成
- **更新 Windows 原生 TCP Bridge**(`46040d2`):
- 同步最新 Windows `NativeTcpBridge.dll` 预编译产物
## [1.0.78] - 2026-08-28
### Changed
- **废弃 wait_for_bake**(`d0d0628`):
- `bake_lighting` / `bake_navmesh` 本身会等到完成,`wait_for_bake` 改为返回 `action_deprecated`,引导改用阻塞烘焙或 `wait_for_idle`
- **废弃 wait_for_upm,并处理传递依赖**(`99451ad`):
- `install_package` / `remove_package` 完成后才返回,`wait_for_upm` 改为返回 `action_deprecated`
- 安装已作为传递依赖存在的包时返回 `already_present`;移除传递依赖时给出可操作错误
## [1.0.78-exp.1] - 2026-08-27
### Fixed
- **域重载期间保留待处理命令**(`8c1b74a`):
- 重载时暂停原生命令领取并恢复未完成租约,在新域的命令消费者与弹窗处理准备就绪后继续执行,避免排队命令丢失
## [1.0.77] - 2026-08-27
## [1.0.77-exp.1] - 2026-08-26
### Added
- **按模式拆分脚本执行**(`efe9e12`、`b8ef1c4`、`9071a49`、`8153fa6`):
- 新增 `exec_editor_script` / `exec_runtime_script`,由命令名选择编辑器或运行时模式;不再接受 `execution_mode`
### Changed
- **统一 Action 分发**(`e75ddbb`):
- 新增 `ActionRouter`,各工具改为字典路由,统一处理别名、默认 action 与未知 action 错误
- **精简 manage_asset**(`38c89de`):
- 删除批量资源操作,并重命名 action 别名
- **移除实验性 manage_ui_toolkit**(`c406b6d`、`6966515`):
- 先精简为 `ensure_panel_settings_asset`,随后整工具下线
- **Yamato 在 main 推送时跑测试**(`1fa666b`、`60465f9`):
- 推送到 main 时同样触发 bridge 测试,覆盖 merge commit 与直接推送
## [1.0.76] - 2026-08-21
### Added
- **Game View MP4 录制与原子化脚本验证**(`23102e7`、`6b3f359`、`ab3ff33`):
- 支持分段录制及 `execute_csharp_script.record_game_view`,提供 ffmpeg 编码、录制会话隔离、输出路径约束与生命周期清理
- **有状态 C# REPL 会话**(`18d05f1`、`74e4fcd`、`5654fae`):
- 支持跨调用变量、方法与类型复用,新增 `Repl.Id` / `Repl.ById`、`Repl.Vars` 及反射签名查询
- **自定义工具元数据与 Agent 附件**(`d3b9d53`、`bb24b5c`):
- 支持查询、刷新自定义工具注册信息,并允许 AgentInputNotifier 携带可选附件
- **Shader 变体编译与预览**(`89a3660`、`85e7c32`):
- 新增 `ShaderVariantApi` 与 `manage_shader` 的 `compile` / `preview`,按变体模式预热并渲染预览帧
- **Scene View 多视角截图**(`efb4fb0`):
- `capture_scene_view` 支持多方向拍摄;时间戳精确到毫秒,避免连拍文件名冲突
- **编译流水线内嵌控制台**(`6840981`):
- `start_compilation_pipeline` 完成后直接返回控制台诊断,无需再单独读取 console
### Changed
- **C# 脚本异步执行与会话安全**(`92d79ad`、`5ffc251`、`ed3b86b`):
- 支持 Task / IEnumerator 跨帧完成,REPL 默认改为关闭,并增加超时、取消及域重载操作保护
- **C# 执行结果与控制台输出整理**(`ae08d2f`、`56ca366`):
- 统一返回脚本结果并移除控制台消息内嵌堆栈,减少重复输出
- **精简 manage_shader**(`85e7c32`):
- 删除 shader CRUD,仅保留 `detect_render_pipeline` / `ensure_material_shader_for_srp` / `compile` / `preview`
### Fixed
- **C# 执行死锁、会话延续与结果格式化**(`c8dde2c`、`c387e95`、`3d73799`、`4198b41`):
- 修复阻塞调用、迭代器误判、REPL 自动修复延续及嵌套调用破坏会话状态等问题
- **串流窗口与复合布局恢复**(`d41da2f`、`b740d8f`、`24677d3`、`092fc22`):
- 修复遮罩窗口残留或消失,以及应用布局后未激活聚焦复合槽位的问题
- **原生插件平台配置**(`8dc1ff3`):
- 修正 Windows、Linux 与 macOS 原生插件的目标平台和 CPU 设置
- **Shader 编译错误过滤与预览防护**(`de261c1`):
- 过滤过期 shader 错误,编译/预览前校验,避免损坏变体提交 GPU compiler 导致卡住
- **Scene View 线框渲染**(`efb4fb0`):
- 非 Shaded 模式改走 `GL.wireframe`,修复 wireframe / shadedwireframe 被内部相机反射路径忽略的问题
## [1.0.76-exp.1] - 2026-08-18
### Added
- **Game View MP4 录制与原子化脚本验证**(`23102e7`、`6b3f359`、`ab3ff33`):
- 支持分段录制及 `execute_csharp_script.record_game_view`,提供 ffmpeg 编码、录制会话隔离、输出路径约束与生命周期清理
- **有状态 C# REPL 会话**(`18d05f1`、`74e4fcd`、`5654fae`):
- 支持跨调用变量、方法与类型复用,新增 `Repl.Id` / `Repl.ById`、`Repl.Vars` 及反射签名查询
- **自定义工具元数据与 Agent 附件**(`d3b9d53`、`bb24b5c`):
- 支持查询、刷新自定义工具注册信息,并允许 AgentInputNotifier 携带可选附件
### Changed
- **C# 脚本异步执行与会话安全**(`92d79ad`、`5ffc251`、`ed3b86b`):
- 支持 Task / IEnumerator 跨帧完成,REPL 默认改为关闭,并增加超时、取消及域重载操作保护
- **C# 执行结果与控制台输出整理**(`ae08d2f`、`56ca366`):
- 统一返回脚本结果并移除控制台消息内嵌堆栈,减少重复输出
### Fixed
- **C# 执行死锁、会话延续与结果格式化**(`c8dde2c`、`c387e95`、`3d73799`、`4198b41`):
- 修复阻塞调用、迭代器误判、REPL 自动修复延续及嵌套调用破坏会话状态等问题
- **串流窗口与复合布局恢复**(`d41da2f`、`b740d8f`、`24677d3`、`092fc22`):
- 修复遮罩窗口残留或消失,以及应用布局后未激活聚焦复合槽位的问题
- **原生插件平台配置**(`8dc1ff3`):
- 修正 Windows、Linux 与 macOS 原生插件的目标平台和 CPU 设置
## [1.0.75] - 2026-08-13
## [1.0.75-exp.1] - 2026-08-04
### Added
- **Scene View 所见即所得截图**(`40ae2a3`、`731b1c4`):
- 新增 `capture_scene_view`,支持按当前编辑器视角、渲染模式、时间序列及 GIF 捕获 Scene View
- **Yamato 代码覆盖率与发布流程指引**(`8b9eaf2`、`aa0a889`):
- 新增 EditMode 覆盖率采集、报告生成与归档任务,并补充 Bridge 发布及版本更新指引
### Changed
- **原生 TCP Bridge 与日志精简**(`969f2d6`):
- 更新 Windows、macOS、Linux 原生插件,移除逐命令 verbose 处理日志
- **UPM CI 打包与测试产物调整**(`aa0a889`、`c9aec68`):
- 统一传递完整 `upm-ci~` 产物并更新测试命令、产物名称;从 npm 包排除测试配置 meta 与内部发布文件
### Fixed
- **编辑模式 Game View 截图陈旧**(`2713352`、`24c7794`、`cb2ce01`):
- 捕获前强制刷新 Game View 与编辑器渲染循环,避免场景或 UI 变化后仍读取缓存帧
## [1.0.74] - 2026-08-01
## [1.0.74-exp.1] - 2026-08-01
### Added
- **编辑器消息注入 Agent 输入框**(`79d38a4`、`3a4ddd5`):
- 新增 `AgentInputNotifier`,广播 `input_from_editor` 事件,将编辑器侧消息推入 Agent 输入框
- Codely 窗口未就绪时自动打开并排队;前端可通过 `manage_editor.drain_agent_input` 在页面加载完成后取队列
- **Yamato Windows 多版本 EditMode 测试与 CI 加固**(`dfd7bd4`、`2e0be74`、`272e8cf`、`6afd6aa`):
- 拆分 TUANJIE/UNITY 版本变量,迁移 Windows EditMode 到新镜像与物理机,增加 flaky 重试
- 恢复 `Tests` 目录并修复 EditMode 失败;补充 `EditorAutomationGuard` meta 与 `TestRunnerOptions.json`
### Changed
- **精简协调面:移除 manage_workflow 与 console token**(`71cbcbf`、`e1f4dfc`):
- 删除 `manage_workflow`(保留 stub 指引改用 `manage_editor.start_compilation_pipeline`)
- 取消增量 console token;`wait_for_idle` 改为等待 JobRegistry 全部完成且非编译/导入
- `wait_for_compile` / `wait_for_stop` 等返回 `action_deprecated`;错误路径改用 `Response.Error`(`12dcaba`)
- **串流启动时隐藏迷你窗口**(`e2abe93`)
### Fixed
- **复合串流停止后黑屏僵尸窗与编辑器消失**(`762d22a`、`9cf0016`):
- 释放时销毁僵尸 HWND,并在 layout/stop 路径关闭空孤儿 ContainerWindow,避免误关主编辑器窗口
- **复合/远程串流纵向抖动与 resize 循环**(`42b9cbd`、`c2ae1f3`):
- 复合/远程模式跳过 `DeactivateUnityKeepWindows`(除非任务栏激活),并收紧 reclaim 告警噪音
- **停靠 GameView 压缩串流 UI**(`c04029f`):
- 串流前关闭停靠 GameView,每帧强制刷新 PanelSettings,停止后恢复停靠状态
- **GameView 播放区误点 PaneOptions**(`d1484ee`):
- Play 模式下跳过游戏区域的 PaneOptions 命中拦截
- **Windows 串流遮罩抢焦点**(`872aff2`):
- Windows 推迟显示 streaming mask,直至用户经任务栏激活 Unity
- **Unity 6 兼容与 CI batchmode**(`3357aac`、`4ae138e`、`80480cf`):
- 实例 ID 改用 long、修正 `FindObjectsByType` 版本守卫;batchmode 下跳过 Bridge 自动启动
- **Win32 模态对话框扫描器 Mono 委托崩溃**(`3a4ddd5`):
- 主线程预创建枚举回调并复用长生命周期委托
## [1.0.73] - 2026-07-28
## [1.0.73-exp.1] - 2026-07-27
### Added
- **模态对话框检测与后台命令泵**(`a095256`、`0daf2b9`):
- 新增 `BackgroundCommandPump`,在主线程被原生模态对话框阻塞时仍可处理线程安全命令
- 新增 `DialogWatcher` / `ModalDialogScanner`(Win32/macOS),检测模态对话框、分离在途 Job,并跨线程点击按钮
- 新增 `manage_dialog` / `manage_job` 命令,以及 `JobRegistry` / `JobControl` 跟踪 attached/detached Job
- **New Input System 鼠标状态注入**(`206197c`):
- 离屏串流场景下通过反射 `QueueStateEvent` 注入 Mouse 位置与按键,修复 InputAction 绑定拖拽/点击失效
### Fixed
- **对话框/Job 后台处理评审修复**(`0daf2b9`):
- 原生 dequeue 串行化,避免超时 Stop 后残留 fetch 线程并发出队;仅在 Editor update 心跳停滞时升级扫描到的对话框;修复 DetachedJobs 旧字段加载后立刻过期
- **串流鼠标注入与恢复**(`31441c4`、`5acde62`、`4602051`、`26b445f`):
- 修正同批 mousedown/mouseup 的拖拽检测;串流结束后通过 domain reload / LegacyMouseBridge 恢复 InputSystem;恢复 raw input 注册并清理卡住的鼠标按键状态
## [1.0.72] - 2026-07-21
## [1.0.72-exp.1] - 2026-07-21
### Added
- **UI Toolkit 流式指针注入兜底**(`33b5fca`):
- 在 UI Toolkit 场景下补齐 streaming pointer injection fallback
- **支持 client DPR 以提升高 DPI 采集清晰度**(`32f786e`):
- 根据 client DPR 调整采集逻辑,提升高 DPI 捕获效果
### Changed
- **替换 AsyncOperationTracker 轮询:改为 StepJob 运行到完成**(`191e3f5`):
- 用 run-to-completion jobs 驱动流程,降低轮询带来的回归风险
- **简化 UI Toolkit 释放注入**(`4f2dd93`):
- 精简 release 注入逻辑,统一 streaming 注入路径
- **停止在每个工具响应中附带环境编辑器状态**(`82b58eb`):
- 减少无关状态传输,避免后续解析噪音
- **更新 mac 平台 native 库版本**(`184e95d`):
- 将 native lib 更新到 1.0.0 以匹配平台需求
### Fixed
- **修复 StepJob runner 回归并补齐覆盖率**(`7a14764`):
- 纠正 runner 行为并新增测试覆盖,避免回归
- **域重载后恢复离屏窗口位置**(`6b595ed`):
- 处理 off-screen window positions,在 domain reload 后回到可见状态
- **复合窗口桥接 DPI 缩放修正**(`b564df2`):
- 修复 composite window bridge 的 DPI scaling 计算
- **UI Toolkit 流式拖拽增量与兜底修复**(`6de5594`):
- 修复 streaming drag delta,并补齐 UI Toolkit fallback
- **修正 Letterboxed 视图下 GameView 输入坐标**(`7684f9b`):
- 在 letterboxed 场景下使用正确坐标映射
- **支持 plain VisualElements 上的 Clickable manipulators**(`0ea02d5`):
- 让 Clickable manipulators 能在普通 VisualElements 工作
- **修复 unity-script 依赖问题**(`5bb6aec`):
- 修复 unity-script 相关依赖,保证脚本可用
## [1.0.71] - 2026-07-17
## [1.0.71-exp.1] - 2026-07-17
### Added
- **Bridge 停止原因上报与无重载包更新后自动重启**(`863ed8d`、`859da3d`):
- 贯通 `manually_stopped` / `unity_quit` / `package_updating` / `package_removed` 等停止原因至握手文件;无脚本变更的包更新跳过重载时从 `Events.registeredPackages` 自动重启 Bridge;同步重建各平台 native 插件
- **声明式脚本无顶层语句检测测试**(`c4ce285`):
- 新增 `NoTopLevelStatementsTests`,覆盖拒绝路径、合法用例与嵌套语句场景
### Changed
- **Tauri 实例生命周期策略调整**(`c1ca350`):
- Unity 不再主动销毁 Tauri 实例,精简 `CodelyWindow` 相关逻辑
### Fixed
- **声明式脚本空跑与编译诊断**(`c4ce285`、`ea13615`):
- `execute_csharp_script` 在 emit 前拒绝仅含类型声明的脚本,避免无效果的成功返回;将检测移至编译成功后以返回真实 Roslyn 诊断,并移除易误导的 `SuggestEntryCall`
## [1.0.70-exp.3] - 2026-07-16
### Fixed
- **Unity 2019 原生桥接崩溃修复**(`7df5956`):
- 新增 ABI 版本握手与 handle 有效性探测,避免 domain reload 后误用无效句柄或 ABI 不匹配的原生库;同步更新各平台 native 插件
- **复合布局 GameView 鼠标坐标修正**(`c9385ce`、`a46c8cc`):
- composite 模式下 rawX/rawY 相对整帧而非 GameView 渲染纹理,导致点击与 uGUI 拖拽注入位置错误;改用 GameView 本地 gameRawX/gameRawY
- **New Input System 按键解析加固**(`d01d4d7`):
- `TryParseKey` 改用 `Enum.IsDefined` + `Enum.Parse`,无效键名返回 null 而非默认值
## [1.0.70-exp.2] - 2026-07-16
### Fixed
- **ReadConsole 绕过编辑器 UI 过滤**(`0e365c5`):
- 读取控制台时临时绕过 Collapse / Log·Warning·Error 级别开关与搜索过滤,避免被 Console 工具栏隐藏的日志读不到
## [1.0.70-exp.1] - 2026-07-16
### Added
- **编辑器循环 Task/协程 Runner**(`114ba85`、`5ab56bf`):
- 新增 `AsyncTaskRunner` / `CoroutineRunner`,支持 `execute_csharp_script` 调度异步 Task 与协程(含 `WaitFor*`),并将 `manage_input` / 截图流程迁至非阻塞 Job 模型
- **New Input System 与 uGUI 拖拽注入**(`f8ca500`、`ba331fa`):
- 通过反射 `QueueStateEvent` 注入键盘状态,补齐离屏/串流场景下 New Input System 输入
- 支持虚拟摇杆等 drag-handler 的 uGUI OnDrag 注入,并抽取 GameView 坐标辅助方法
- **编译进度 DataChannel 转发**(`7783f79`、`4389cb3`):
- 将脚本编译进度转发至前端;domain reload 完成后发送 `domain_reload_complete`;Unity 2019 提供 CompilationPipeline 事件回退
- **异步退出 PlayMode 等待**(`b10d8cb`):
- 新增 `wait_for_stop`,支持异步等待 PlayMode 退出完成
### Changed
- **心跳写入下沉至原生 TCP Bridge**(`3a38433`、`0c04c2c`):
- `.com-unity-codely.json` 心跳改由 native 层维护,移除 `StatusHelper` 并精简 `PortManager`;同步更新各平台 native 库
- **observation-invalidated 归因与节流**(`c42f5f6`、`94b5f04`):
- 通知载荷补充 `source` / `pending`;5s 静默窗口内节流合并,避免会话期间通知洪水
- **窗口透明度刷新节流**(`e3d9612`):
- `ReapplyWindowTransparency` 限制为最多每 250ms 一次,降低离屏串流帧开销
### Fixed
- **脚本异步失败与协程清理**(`5ab56bf`、`7b738e4`):
- Task 失败以 tool error 返回;协程异常/超时处置 enumerator 栈以执行 `finally`;去重 log capture
- **Canvas 布局与输入反射加固**(`ba331fa`):
- SetFocus 后恢复 Canvas 渲染尺寸,避免 ScreenSpaceOverlay UI 偏移;加固 Input System 反射缓存与按键解析
- **observation 源归因与脚本拒绝语义**(`94b5f04`、`dbe5937`):
- dirty 源在 MarkDirty 时捕获,避免误归因到后续 flush 命令;`execution_mode` 不匹配时返回 Error 而非 Success
- **ReadConsole Unity 6 反射修复**(`38848d2`、`9f47466`):
- 修复最新 Unity 6 下控制台日志反射读取失败
- **Drill 窗口交互与完成态**(`59c686d`):
- 保持 drill 窗口控件与 completion 响应可用,并修复 cowork 缺失时的回退打开路径
- **EnumWindows 原生崩溃规避**(`208913e`):
- 改用 `GetWindow`/`GetDesktopWindow` 遍历 HWND,避免 shell extension 触发 `STATUS_DLL_INIT_FAILED` 原生崩溃
## [1.0.69-exp.1] - 2026-07-09
### Added
- **编辑器测试 CI 覆盖补齐**(`d375edb`):
- 新增 bridge EditMode tests 的 Yamato CI 流程,提升回归覆盖
- **Input System 依赖声明补齐**(`fd9b66a`):
- package 依赖中新增 Input System,为可选输入能力提供安装基础
- **脚本执行异常可观测性增强**(`ee42f50`):
- `CSharpScript.EvaluateAsync` 抛错时返回 stacktrace,便于定位运行期脚本问题
### Changed
- **CI 任务中包拷贝流程优化**(`dcd9b53`、`0255468`、`77e7670`):
- 调整 package copy 方式并改用显式 `PACKAGE_NAME`,提升流水线稳定性
- **输入系统集成策略调整**(`2d5f6c0`):
- 通过 `CODELY_INPUT_SYSTEM` 编译开关将 Input System 改为可选集成,降低无依赖场景接入成本
### Fixed
- **平台守卫与条件编译修复**(`89bb341`、`ddea6d7`):
- 为 `reuseDetachedTarget` 增加平台 guard;修正预处理分支与测试断言,避免跨平台分支误行为
- **Roslyn 引用与测试可见性恢复**(`0a9109a`):
- 恢复 Roslyn 引用和 `InternalsVisibleTo`,修复编辑器测试编译/运行失败
## [1.0.68] - 2026-07-09
### Added
- **Unity 6.5(6000.5)兼容性支持**(`ae78b49`、`98fa895`、`699dfc5`):
- 引入 EntityId 兼容层(`InstanceIdExtensions`),统一封装 Unity 6.5 中被弃用为错误的 int 实例 ID API(`GetInstanceID`、`InstanceIDToObject`、`Selection.activeInstanceID` 等),全链路改用 64 位 `long` 承载,确保 ID 在存储与传输中无损往返
- 修复 Unity 6.5 下 bridge 无法安装的问题(AICODE-2127)
- **输入模拟与 GIF 捕获能力增强**(`f1348f6`、`b8f6f51`):
- 新增 `manage_input` 桥接命令,支持 PlayMode 下的输入模拟
- 为 `ManageScreenshot` 新增增量式内存 GIF 捕获 API
- **复合布局重连能力**(`33a5f27`):
- 支持在 detached-hidden 重连场景下保留 composite 布局
### Changed
- **Composite 功能模块化与持久化重构**(`51a61ea`、`af73df6`、`f3d2e85`):
- 将 composite 相关功能拆分到独立文件,提升可维护性
- 改进 composite 窗口在 domain reload 后的持久化,并补充 slot 管理的 verbose 日志
- **脚本编译性能优化**(`f3d7dbf`):
- `ExecuteCSharpScript` 的阻塞调用扫描复用 Roslyn 编译结果,降低重复编译开销
- **构建与发布流程调整**(`921fd35`、`af1ca8b`、`93b1010`、`58eb69b`):
- 非 canary 版本仅允许从 release 分支构建;实验版本仅上传至 TOS;从版本号直接推导 `IS_CANARY_RELEASE`;移除多余调试日志
### Fixed
- **Composite slot 稳定性修复**(`78bc94e`、`4daf696`):
- 校验尺寸并延迟 handle 重新获取,加固 composite remap 与 slot handle 重取逻辑
- **拖拽与输入交互修复**(`41c4f8b`、`b19e00b`、`f1bb14b`、`6966ea8`):
- 忽略低于阈值的细微拖拽抖动;修正 `manage_input` 的 UI 拖拽目标与协程释放;修复拖拽 popup 阻塞问题;为 Unity 2019 增加版本感知的 tab-drag 守卫
- **截图与离屏窗口修复**(`f59e040`、`0d4d08e`、`8f89316`):
- 加固 `ManageScreenshot.CaptureFrame` 的纹理缩放;修复离屏窗口处理的 fallback 与缩进问题;编辑器失焦时支持全速 PlayMode 与 GIF 捕获
- **脚本编译流程修复**(`c8dae67`、`c308966`):
- 脚本编译前自动保存 dirty 场景;修复 `RequestScriptCompilation` 重入问题
## [1.0.67] - 2026-07-03
### Added
- **拖拽与场景交互能力增强**(`abe18de`、`af8bfa0`、`dfc44e6`、`6363eac`):
- 新增将资源拖拽到场景进行交互的能力,补齐编辑器内拖拽工作流
- 修复并优化 drag-and-drop 相关链路,提升稳定性与可用性
### Changed
- **原生桥接平台与事件追踪路径重构**(`47c12c0`、`af2aa43`、`6c1f17a`、`2012543`、`2de2568`):
- 为 Native Bridge 增加平台抽象层,并移除 Native Window Bridge 的 Linux 平台支持
- `CodelyEventTracker` 改为以 HTTP invoke 为主,补充 pending metrics 的即时 flush 机制,提升生命周期事件上报可靠性
- 增加原生日志回调的平台守卫,降低跨平台构建风险
- **截图与异步流程优化**(`e25b143`、`06f1317`):
- 优化 `PrintWindow` 捕获流程,引入 viewport cropping 提升截图效率
- 让异步任务在 reload 后继续可追踪,并在缓存过期场景下自动重试编译
### Fixed
- **复合布局输入稳定性修复**(`1d4bca0`):
- 修复 composite layout 下键盘输入处理问题,降低输入丢失与交互异常风险
## [1.0.66] - 2026-06-30
### Added
- **Popup 菜单与标签页交互能力增强**(`d2378a0`、`934d4ff`、`8986725`、`d346e60`):
- 新增 `PopupMenu` 能力并重构 `NativeWindowBridgeHost` 相关路径,补齐左键下拉(`DisplayPopupMenu`)与标签页表头菜单触发链路
- 新增标签页表头 context menu 能力与 composite 自动恢复机制,完善串流场景下标签页操作
- 新增 `ProjectBrowser` 过滤器场景下的 `PopupList` 支持,覆盖更多编辑器原生弹出菜单类型
- **GUID 修复脚本与校验流程增强**(`99df5b2`、`99b8ba9`):
- 新增用于修复无效 Unity `.meta` GUID 的脚本
- 改进 GUID 校验 hook 与脚本交互体验,降低 `.meta` GUID 异常导致的导入问题
### Changed
- **上下文菜单与指针事件路径优化**(`b604490`、`c139b04`):
- 优化上下文菜单日志与关闭(dismissal)流程,减少噪声并提升可观测性
- 优化指针事件处理与 tooltip 开销,降低高频交互路径的性能负担
- **开发流程文档与仓库整洁度更新**(`3287efa`、`e70351b`):
- 新增 Git hooks 配置文档
### Fixed
- **弹窗定位与命中检测修复**(`2a78541`、`91ace8d`、`9094bf0`、`8664761`):
- 统一 composite 视图下的 popup 定位计算逻辑,修复弹窗位置偏移问题
- 提升 PaneOptions 按钮 hit-test 精度,减少误判与误触发
- 修复上下文菜单处理与原生 popup 关闭流程的稳定性问题
## [1.0.65] - 2026-06-29
### Added
- **TextMeshPro Essentials 自动导入**(`181108d`、`96c1627`、`07c7e49`):
- 新增 `TmpEssentialsAutoImporter`,在工具触发安装 `com.unity.textmeshpro` 后静默执行 `Window/TextMeshPro/Import TMP Essential Resources`,避免首次使用 TMP 时缺少 Essentials 资源
- `execute_csharp_script` 在脚本包含 `TextMeshProUGUI` 时自动补齐 TMP Essentials;`manage_editor` 编译前检查也会识别 TMP UI 依赖并触发导入
- `execute_menu_item` 执行 TMP Essentials 菜单项后同步调用导入流程,并通过 `Response.SuccessWithData` 返回更结构化的成功数据
### Changed
- **遥测事件追踪增强**(`0ee3c00`、`6d29f7e`、`1644599`):
- 重构 `CodelyEventTracker` 与 IPC 消息处理,将欢迎页 / 面板生命周期事件统一到事件追踪入口
- `codely_panel_opened` / `codely_panel_closed` 等面板事件接入生命周期追踪,并对需要用户标识的事件补充 user ID
- `CodelyIpcManager` 补充连接状态回调,使事件在 IPC 连接变化时能更可靠地投递
## [1.0.64] - 2026-06-25
### Added
- **`manage_gameview` 工具 + 场景视图渲染模式 + GIF 截图**(`191c384`、`0240e83`):
- 新增 `manage_gameview` 工具,支持获取 / 设置 / 列举 Game View 分辨率;接入 `CommandRegistry` 与 `UnityTcpBridge`,并在 `StateDirtyPolicy` 中标记为非 dirty 动作,避免产生多余的 observation-invalidated 通知
- `ManageScreenshot.capture_scene_view` 新增 `render_mode`(`shaded` / `wireframe` / `shadedwireframe`);`shadedwireframe` 将 shaded pass 与双背景 wireframe 蒙版合成,做到与渲染管线无关
- `capture_game_view` 新增 `scale` 参数(0.25–1.0,默认 0.5)
- 新增 `as_gif`:录制 N 帧并编码为动画 GIF(`frameCount` / `fps` / `colorCount` / `startDelay`),覆盖 `game_view` / `scene_view` / `main_camera` / `specific_camera`;内置自包含的 median-cut + LZW GIF89a 编码器,逐帧延迟按实际抓帧间隔测量
- `DrawLabelOnTexture` 将标签高度限制在图像高度的 1/5 并按宽度自适应
- **遥测事件追踪(经 IPC 上报 Tauri 后端)**(`d1c17ea`):新增 `CodelyEventTracker`,从 Unity Bridge 经 IPC `trackEvent` 消息向 Tauri cowork APP 上报 6 个分析事件——`welcome_window_shown` / `welcome_window_closed`(`DrillWindow` OnEnable / OnDestroy)、`welcome_button_clicked`(`OnDrillCompleted`)、`codely_panel_opened`(`CodelyWindow` OnEnable)、`codely_panel_closed`(OnDisable,置于 IPC release 之前以保证可投递)、`codely_panel_input_submitted`(Tauri 侧经 `llm/streamChat` 处理)
- `CodelyIpcManager` 缓冲 IPC 连接建立前发送的消息并在连接后 flush,避免事件静默丢失
- `CodelyIpcServer` 的 `IpcMessageType` 新增 `TrackEvent`;`TauriUtils.GetEditorType()` 增强 tuanjie 检测(回退到 `m_EditorVersion` 的 `t` 后缀判断)
- **串流标签页 "more options" 弹出菜单**(`2a7566d`、`e0bcf09`):新增 `NativeWindowBridgeHost.PaneOptions.cs`,为合成 / 串流模式下的 `DockArea` 标签页提供窗口选项(kebab / more action)按钮的弹出菜单提取与回调处理,使串流前端能正确触发标签页的更多操作
- **串流图标选择器(icon picker)**(`8a9dc08`、`2821905`):新增 `NativeWindowBridgeHost.IconSelector.cs`,为串流场景提供简易的图标选择弹窗支持;并修复其在 Unity 2019 上的编译错误
- **合成模式新弹窗自动停靠到 DockArea**(`a593f90`):增强多窗口合成(composite)串流——合成开始后自动检测并停靠新出现的 `EditorWindow`,覆盖经菜单项创建与右键 `Add Tab` 创建的窗口,确保它们被纳入合成串流捕获
- 新增 `NativeWindowBridgeHost.PopupDock.cs`:`InterceptAndDockNewPopupWindows`(自动停靠新弹窗)、`TrackUntrackedCompositePanes`(检测原生新增标签页)、`InitCompositeWindowTracking`(快照基线窗口 ID 集合)
- 基于反射的标签页移动,并对 Windows / macOS 分别处理;将弹窗检测与 `Add Tab` 右键菜单检测集成进 `ManageWindowBridge` 工作流
### Changed
- **更新 Windows 原生二进制**(`3acfb27`):更新 `Plugins/Win` 下的 `NativeWindowBridge.dll` 与 `datachannel.dll` 至最新构建
- **新增脚本后编译前先 `AssetDatabase.Refresh()`**(`2660b00`):经 `write_file` 或外部工具新建的脚本在触发编译前先执行 `AssetDatabase.Refresh()` 导入,确保新增脚本被纳入本次编译(`CompilationHelper`、`ManageEditor`)
- **暂时禁用 `SceneHierarchyNotifier` 与 `ConsoleLogChangedNotifier`**(`1f73a84`):关闭这两个推送通知器
### Fixed
- **AICODE-1977 `execute_csharp_script` 非 UTF-8 脚本编码乱码**(`f723f56`):修复脚本文件以本地 ANSI 代码页(如 zh-CN Windows 的 GBK/936)保存时,`File.ReadAllText` 默认按 UTF-8 解码导致中文标识符 / 字符串变成 '�' 并触发 Roslyn `CS1056` 的问题——新增 `ReadScriptFileSmart` 编码自动探测:优先识别 BOM(UTF-8 / UTF-16 LE / BE),无 BOM 时手动校验字节是否为合法 UTF-8(Mono 的 `UTF8Encoding.throwOnInvalidBytes` 不可靠,会静默替换为 '�' 而不抛异常),否则按结构校验回退到 GBK/936,再不行才用系统默认页并大声告警;脚本路径含 `U+FFFD` 时给出明确的"路径已在 TCP 层被非 UTF-8 解码、原始字节不可恢复"诊断提示,替代含糊的 not-found
- **`manage_gameobject` find 对缺失脚本组件抛 NRE**(`e60a32c`):含缺失 / 损坏脚本引用(脚本被重命名 / 删除、编译错误、或非 UTF-8 脚本导入失败)的 GameObject,其 `GetComponents<Component>()` 会返回 null 项;`find` 动作序列化时在 `GetGameObjectData` 的 `componentNames` 中解引用这些 null,抛出以 "Internal error processing action 'find'" 暴露的 `NullReferenceException`,现已加 null 防护(`GameObjectSerializer`、`ManageGameObject`)
### Removed
- **移除 WebRTC 串流功能**(`1194445`):移除基于 Unity RenderStreaming 包的 WebRTC 串流特性(已弃用),简化代码并减少依赖——删除 `ManageWebRtcStream` 工具及其 `.meta`、从 `CommandRegistry` 移除 `manage_webrtc_stream` 命令、从 `UnityTcpBridge` 移除 WebRTC 命令路由、从 `CodelyIpcServer` 移除 WebRTC IPC 消息类型与处理器;同步更新原生 `NativeWindowBridge.dll` / `datachannel.dll`
## [1.0.63] - 2026-06-22
### Added
- **合成窗口选择变更同步与 domain reload 句柄重获**(`f289ec5`):大幅增强多窗口合成(composite)串流的捕获与状态同步
- 新增选择变更监听与通知机制,selection 改变时主动驱动合成槽位重绘并向前端同步状态,确保 Inspector 等随选择刷新的窗口在串流端及时更新
- domain reload 后重新获取各合成槽位(composite slot)的原生窗口句柄,避免脚本重编译后句柄失效导致黑帧 / 不刷新
- 新增 `ForceRepaintImmediately`,对离屏窗口执行同步立即重绘,消除合成更新延迟
- 新增 `NativeWindowBridgeHost.Json.cs` 共享 JSON 解析工具,捕获操作后恢复 GL 矩阵(避免抓帧改写渲染状态),并将 `EditorWindowNativeHandleHelper` 改为 `public` 以供合成槽位访问
- 改进 `PrintWindow` 抓帧的 DPI 缩放与日志
- **串流标签页拖出自动重路由为 AddTab**(`54198be`):新增 `NativeWindowBridgeHost.TabDrag.cs`,修复串流(合成 / 离屏)模式下把 Editor 标签页拖出停靠区时的问题——在串流画布中央释放标签页时 Unity 会新建一个无法被串流的浮动 `ContainerWindow`(`DropInfo.dropArea == null`);改为经反射检测该情形并将拖放重路由为对光标下 `DockArea` 的 `AddTab`(从原 DockArea `RemoveTab` 后按末尾索引插入并选中、关闭残留的 `PaneDragTab`、复位拖拽状态与 `hotControl` 并重绘相关窗口);落在停靠边缘 / 既有面板(`dropArea` 非空)的拖放仍走 Unity 原生 `SendEvent` 流程
### Changed
- **`ExecuteCSharpScript` 错误路径改为返回成功响应**(`0a2e598`):`script` 参数缺失、脚本文件不存在 / 为空 / 读取失败 / 访问被拒,以及脚本执行抛异常等原先返回 `Response.Error` 的分支,统一改为返回 `Response.Success` 并仅携带提示文本;执行异常分支不再附带 `logs` 与 `exception` 详情
### Fixed
- **AICODE-1952 编辑器内嵌 cowork 卡 Loading**(`f9b792f`):修复 macOS 内嵌 WebView(WKWebView)在 Tauri 后端尚未就绪 / 被重启替换时停在白屏的问题
- 新增 `/api/tauri/status` HTTP 就绪门控(`_serverHttpReady`):`_tauriServerPort` 在选定端口时即被赋值(远早于 Tauri 进程实际 bind),仅凭 `port > 0` 就导航会与服务端竞速并永久停在 connection-refused 白屏(WKWebView 不会自动重试失败的导航);改为经后台轮询 `ProbeServerReadyAsync` 确认状态接口应答后再创建 / 重载 WebView
- 后端被重启或重新 attach(经 project lock 或新启进程)时,从序列化句柄恢复的 WebView 绑定的是已失效 / 被替换的后端,页面停在白屏且 SPA 不再重跑加载握手;新增 `_pendingWebViewReloadAfterRelaunch`,在新服务 HTTP 就绪后重载内嵌 WebView 以重新 bootstrap UI(新服务可能复用同一端口,故经 `ResetServerReadyGate` 显式失效旧的就绪状态)
- **合成 GameView 在 Play 模式下水平压缩**(`6dccde1`、`75e1155`):修复 Play 模式下合成 GameView 槽位(尤其鼠标点击后)出现水平压缩的渲染瑕疵——根因是 focus 事件期间 `Camera.aspect` 被破坏,以及 `PlayModeView` 优先级不当导致取到陈旧 render texture
- 在 `SetFocus` 等原生 focus 事件后恢复相机 aspect,单窗口与合成两种模式均恢复宽高比
- 合成已激活时不再重置帧计数,避免 warm-up 抢焦点;新增 Play 模式初始化检测与正确的 GameView 聚焦处理
- 点击后强制连续 3 帧同步重绘以消除 backbuffer 延迟;合成模式下跳过原生鼠标按键消息以免扰动 backbuffer
- 随后(`75e1155`)清理用于排查压缩 / 渲染问题的诊断日志与未使用的反射辅助方法(`GetGameViewDiagState`、`GetGameViewRenderTextureDiag`、`GameViewRenderTextureFieldResolved`、`WM_MOUSEMOVE` 常量),focus 操作日志降为 verbose,保留必要日志
- **`CompilationHelper` 编译错误 / 警告计数反射签名错误**(`f289ec5`):内部 `LogEntries.GetCountsByType` 实际签名为 `(ref int errorCount, ref int warningCount, ref int logCount)` 三个 `ref int` 参数,而非单个 `int[3]` 数组;原代码传入数组无法被正确回填,导致错误 / 警告计数失效,进而影响编译自动修复判定。改为传入 `object[] { 0, 0, 0 }` 并在反射调用后回读 `args[0]` / `args[1]`
- **Unity 2019 标签页拖拽崩溃**(`f289ec5`):跟踪标签栏鼠标位置以避免 Unity 2019 上 `DragTab` 崩溃,并为布局变化的标签页拖出检测增加跳帧处理
## [1.0.62] - 2026-06-18
### Fixed
- **Unity 2019 下串流光标相关代码编译错误**(`bae7482`):修复串流光标 / 弹窗支持在 Unity 2019 上的编译错误(`NativeWindowBridgeHost.Cursor.cs`、`NativeWindowBridgeHost.AddComponent.cs`、`NativeWindowBridgeHost.ObjectSelector.cs`),并补齐相应 `.meta` 文件
## [1.0.61] - 2026-06-18
### Added
- **串流弹窗(popup)支持**(`4488ced`):新增对 Editor 弹出式 UI 的串流支持,覆盖 `AddComponent`(`NativeWindowBridgeHost.AddComponent.cs`)、`AdvancedDropdown`(`NativeWindowBridgeHost.AdvancedDropdownPopup.cs`)与对象选择器 `ObjectSelector`(`NativeWindowBridgeHost.ObjectSelector.cs`),使这些原生弹窗能在远程串流场景下正确呈现与交互
- **串流光标样式支持**(`0ef377c`、`91c1193`):新增 `NativeWindowBridgeHost.Cursor.cs`,将 Unity 编辑器光标样式同步到串流前端;并修复串流光标的相关问题
- **Canary(beta)通道版本注册**(`3c81426`):`scripts/register-version.js` 与 `.gitlab-ci.yml` 增加将包注册到 canary(beta)通道的能力,便于灰度发布
- **Unity 2019 菜单 fallback 与 ConnectionTreeView 弹窗支持**(`876a399`):在 `Menu.GetMenuItems` 不可用时,经反射使用 `Unsupported.GetSubmenus` / `GetSubmenusCommands` 提取菜单(`EnsureUnsupportedMenuReflection`、`SendDelayedPopupViaSubmenus`),兼容 Unity 2019;并新增对 `ConnectionTreeViewWindow`(Console / Profiler 连接目标选择器)弹出菜单的提取与回调处理,缓存原始弹窗索引以将前端选择映射回原生索引
### Changed
- **提取离屏 sentinel 处理逻辑为辅助方法**(`35be89d`):将分散的离屏哨兵坐标(off-screen sentinel)判断与修复代码抽取为 `IsAtOffscreenSentinel` 与 `RepairOffscreenSentinel` 辅助方法,移除 `RestoreAllWindows` 中冗余的兜底代码并统一 POST-STOP 自动修复逻辑,降低重复、提升可维护性
### Fixed
- **窗口恢复后卡在离屏哨兵位置**(`e837798`):修复 Unity 窗口在恢复后可能滞留在离屏哨兵坐标 `(-32000, -32000)` 而彻底消失的严重问题——当累积的恢复失败(尤其窗口因上次停止失败已处于哨兵位置)阻止其回到屏幕内时,新增安全兜底:保存时若窗口已在哨兵位置则赋予默认屏幕内坐标、主恢复后用兜底循环强制移回卡住的窗口、并在停止后校验中分离样式与坐标检查、补充恢复坐标的详细日志
- **Unity 2019 Gamma 色彩空间下截图黑屏**(`c9261b2`):修复 Unity 2019 + Gamma 色彩空间下抓帧黑屏——`Present` 后 SwapChain 后台缓冲为空导致 `GrabPixels` 取到黑色像素;新增 `PrintWindow` fallback(`s_UseRenderTextureFallback`),经 DWM 合成抓取窗口内容,并在该模式下用 `HWND_BOTTOM` 定位以维持 DWM 合成
- **`ExecuteCSharpScript` 在 `Codely.Utility` 包出现时未更新引用**(`51fe455`):修复 Codely.Utility 包后续加入时 `ExecuteCSharpScript` 未刷新程序集引用的问题
## [1.0.60] - 2026-06-15
### Fixed
- **AICODE-1862 Windows Unity6 内嵌 Tuanjie AI 卡 Loading**(`b6ca840`、`a168a99`):重写 `NativeWindowHelper.GetHWND`,使其能在多显示器 / 多 DPI 缩放环境下可靠定位 Unity `EditorWindow` 背后的 Win32 HWND;此前纯绝对坐标匹配仅在主显示器有效,副屏上永远匹配不到导致内嵌面板一直卡在 "Loading"
- 新增策略 1(首选):经反射读取宿主 GUIView 的内部 `nativeHandle`(`EditorWindowNativeHandleHelper`),并校验其为本进程的 `UnityGUIViewWndClass` 窗口后直接使用,与坐标 / DPI 无关;Unity 构建缺少该属性或返回非 HWND 指针时安全降级到坐标搜索
- 当反射得到的是本进程其他类窗口(如 ContainerWindow)时,将搜索范围收窄到该顶层窗口;其唯一 GUIView 子窗口直接采纳(浮动面板常见情形)
- 坐标搜索对每个候选窗口在多种坐标假设下测试包含关系:(a) 旧逻辑物理像素 × `pixelsPerPoint`、(b) 候选物理矩形 ÷ 自身 `GetDpiForWindow` 缩放后按点比较、(d) 保留显示器物理原点的 monitor-anchored 映射、(c) container-relative 相对偏移比较(相对偏移不跨显示器,在任意 per-monitor 映射下都成立);取最小匹配候选
- 全部失败时按节流输出每个候选窗口的诊断转储,便于现场定位实际坐标映射
- **AICODE-1768 `ensure_scene_saved` 对未命名场景会弹出文件系统对话框卡住 yolo 模式**(`add76ed`):未命名(untitled)场景没有路径,`SaveScene` 会弹出阻塞编辑器线程的原生 "Save Scene" 对话框使自动化 / yolo 模式卡死;改为在 `path` 为空时快速失败并提示先用 `save` 动作指定 `name` 与 `path`,而非触发对话框
- **退出编辑器时停止 WebRTC 服务以防卡死**(`9c27eae`):WebRTC 串流激活时关闭 Unity 编辑器会卡死——libdatachannel 的原生线程在 DLL 卸载后仍存活,Mono 线程管理器无法中止它们;在原生 DLL 卸载前于 `OnEditorQuitting` 调用 `NativeWindowBridgeHost.StopServer()`,先销毁 `PeerConnection`(其析构会 join libdatachannel 内部处理线程),`StopServer` 已在带超时的后台线程执行 `NWB_StopServer` 故不阻塞主线程
- **合成模式下 IMGUI 浮层交互改进**(`b6a6f2d`):修复合成窗口模式下 IMGUI 浮层(如 SceneView 的 OrientationGizmo)无法正确接收鼠标事件的问题——为合成模式增加标签页切换以将事件派发到正确浮层、在 Layout 事件中传入真实鼠标位置以便浮层控件注册、经 `hotControl` 变化检测并跟踪浮层是否消费了 MouseDown(消费时跳过 picking 命令注入以免抢占交互)、在 domain reload 与工作区清理时重置浮层状态、并抑制弹出菜单移除期间的 Unity 内部报错
## [1.0.59] - 2026-06-12
### Added
- **合成窗口关闭标签页(Close Tab)检测与通知**(`6f2fd0b`):`NativeWindowBridgeHost` 在执行 `Close Tab` 菜单动作前先快照该合成窗口涉及的窗口类型,关闭后检测被移除的合成槽位(composite slot),并经 DataChannel 主动通知前端,使前端能及时同步窗口状态
### Changed
- **限制 ContextClick 合成范围到标签页表头**(`6f2fd0b`):合成的 `ContextClick` 事件仅在 `DockArea` 标签页表头区域内触发,避免误伤 Game 输入与 Scene 导航等其他区域的交互
- **原生状态跨 domain reload 保活**(`b2c5287`):重构 assembly reload 处理,使原生 C++ 单例(HTTP 服务、WebRTC 会话、离屏渲染)在 domain reload 期间保持存活,消除端口重新绑定、避免 WebRTC 断连、并规避在主线程调用 `Stop()` 可能导致的死锁;reload 期间仅清理 C# 侧状态并将日志回调置空以防悬空委托调用,reload 后重新注册日志回调恢复日志
- `OnBeforeAssemblyReload` 移除 `NWB_StopServer` / `NWB_StopCapture` 调用,reload 前先关闭浮动捕获窗口以避免遗留孤窗
- 更新 Windows 原生二进制 `NativeWindowBridge.dll`、`datachannel.dll`
- **UI Toolkit 截图样式微调**(`7dc9dad`):`ManageUIToolkit` 为根视觉元素增加背景色与居中对齐,放大标题字号并调整标题 Label 样式,改善视觉呈现
### Fixed
- **沙箱 iframe 下双击检测不可靠**(`857a7a2`):在沙箱 iframe 或 `setPointerCapture` 重置浏览器内部计数器导致 `e.detail` 始终为 1 的场景下,原先仅依赖前端 `clickCount` 的判断会漏检双击;改为始终在 C# 侧运行计时 / 位置跟踪,并与前端值取 `MAX` 组合判定,提升双击检测稳健性;新增双击检测的 verbose 调试日志
## [1.0.57] - 2026-06-09
### Fixed
- Fix unity 2019 编译错误
## [1.0.56] - 2026-06-05
### Added
- **多窗口串流支持**(`0952ec1`):`NativeWindowBridgeHost` 大幅扩展(约 +1000 行),支持同时串流多个 Editor 窗口;新增 `NWB_GetPendingCompositeRequest` P/Invoke,拉取待处理的合成(composite)串流请求并回传 fps / width / height;同步更新 Windows 原生二进制 `NativeWindowBridge.dll`、`datachannel.dll`、`libcrypto-3-x64.dll`、`libssl-3-x64.dll`
- **平台相关窗口句柄检测以支持键盘注入**(`3acdaa2`):`NativeWindowBridgeHost` 在 `Show()` 后通过 before/after diff 捕获新建的原生窗口句柄——Windows 记录 `ContainerHwnd` / `GUIViewHwnd`,macOS 记录 `NSWindow` 指针——供 Play 模式键盘焦点操作使用(Windows `SetFocus` / `PostMessageW`,macOS `activateIgnoringOtherApps` / `makeKeyWindow`),确保串流交互时 `Input.GetKey` 正常工作;新增 `Menu.GetMenuItems` 反射缓存
- **GameView Play 模式鼠标处理与远程串流增强**(`74ac304`):针对物理鼠标位于另一台机器的远程串流场景,全面改进 Play 模式 GameView 的鼠标事件处理,覆盖 uGUI 交互、Input Manager 集成与 cursor lock,跨 Windows / macOS
- 新增 uGUI EventSystem 直接注入,绕过离屏 GameView 下 `StandaloneInputModule` 的限制,保证 UI 点击可靠
- 经前端专用 `mousedelta` 消息注入远程鼠标增量,并新增 `connection_info` 消息区分远程 / 本地串流
- Windows 经原生 Win32 鼠标按键注入支持 `Input.GetMouseButton`;macOS 经 CGEvent 鼠标注入支持 cursor-locked 模式下的 `Input.GetAxisRaw`
- 新增 `BrowserBtnToUnityBtn` 按键映射、按住鼠标按键跟踪与断开时清理、`QueuePlayModeMouseEvent` 精确坐标排队、新连接建立时重发 cursor lock 状态
- 更新 macOS 原生二进制 `libNativeWindowBridge.dylib` / `libdatachannel.dylib`
### Changed
- **Play 模式跳过窗口去激活并统一日志**(`74ac304`):Play 模式下不再执行窗口去激活,以维持 Input Manager 焦点;相关 `Debug.Log` 调用统一改走 `CodelyLogger`
- **关闭原生窗口桥接的冗余日志**(`361e8a0`):默认关闭 `NativeWindowBridgeHost` 的 verbose 日志输出
### Fixed
- **AICODE-1636 Bridge 状态没有实时切换**(`53f44f6`):`NativeDllLoader` 的包变更回调原先仅处理 `args.changedTo`(更新场景),而卸载只出现在 `args.removed` 中而被忽略,导致卸载后原生 socket 仍保持打开、客户端永远收不到断开通知;新增对 `args.removed` 的处理,卸载时同步调用 `Unload()`
- **macOS 暂时禁用串流并改进平台检测**(`4ce6311`):`IsStreamingSupportedOnCurrentPlatform` 在 macOS 改回返回 `false`,避免 macOS 用户使用尚未完善的串流功能;`GetStreamServerStatus` 新增平台检测,响应新增 `platformSupported` 与 `platform`(windows / macos / linux)字段,平台不支持时 `running` / `port` / `streamStatus` 返回空值
### Removed
- **移除 verbose 日志切换菜单项**(`f015771`):删除 `Window/Codely/Toggle Verbose Log` 菜单项及 `ToggleVerboseLog()` 方法与关联的 verbose log 状态,简化界面
## [1.0.55] - 2026-06-03
### Added
- **`manage_window_bridge` / `manage_webrtc_stream` 标记为只读动作类别**(`fe6691f`):在 `StateDirtyPolicy` 中将这两类工具注册为额外的只读(readonly)动作类别——`manage_window_bridge` 9 个动作、`manage_webrtc_stream` 5 个动作——使窗口管理与 WebRTC 串流操作不再触发多余的 dirty state delta,符合其本质上不改变工程状态的语义;新增对应单元测试
### Changed
- **集中式日志系统 CodelyLogger**(AICODE-1703):新增 `Editor/Logging/CodelyLogger.cs`(独立 `Codely.Logging.asmdef`),作为全包唯一允许直接调用 `UnityEngine.Debug` 的入口,统一品牌前缀(`Codely Bridge`)并支持全局开关;移除旧的 `TcpLog`,56 个文件的日志调用统一改走 `CodelyLogger`
- 经菜单 `AI/Logging/Enable Codely Logs` / `AI/Logging/Enable Verbose Logs` 或 `CodelyLogger.Enabled` 切换;Verbose 复用既有 `UnityTcp.DebugLogs` 偏好键以保持向后兼容
- 开关值持久化(`EditorPrefs`)并缓存到 volatile 字段,使后台线程(IPC 循环、ThreadPool 回调)与 domain reload 期间的 `[InitializeOnLoad]` 静态构造函数也能安全读取——首次主线程访问时惰性加载,避免 off-thread 读 `EditorPrefs` 抛异常
- **公共接口统一加 Codely 命名空间前缀**(`23e97d4`):将所有对外公开的类型前缀化到 `Codely` 命名空间,避免与宿主工程 / 其他包的类型名冲突(主要涉及 ScriptFix 系列与 `ExecuteCSharpScript` / `ManageScript`);同步更新 `Codely.Roslyn.dll` 与 README
- **更新 macOS 原生桥接二进制**(`b8ffd44`):更新 `libNativeTcpBridge.dylib`、`libNativeWindowBridge.dylib`、`libdatachannel.dylib` 至最新版本,纳入原生侧 bug 修复与性能改进
### Fixed
- **AICODE-1655 bridge 依赖冲突**:将分散的 Roslyn / `Microsoft.CodeAnalysis.*` / `System.*` 托管 DLL 合并打包为单个 `Codely.Roslyn.dll`,删除 `Microsoft.Bcl.*`、`Microsoft.CodeAnalysis.*`、`System.Buffers/Memory/Collections.Immutable/Reflection.Metadata/...` 等独立 DLL,避免与宿主工程或其他包携带的同名程序集冲突
- **AICODE-1416 内嵌模式下 Ctrl+L 快捷键会关闭 Codely**:标签页重新可见时(已初始化的 WebView)新增 `FocusEmbeddedInputOnBecameVisible`,延迟一帧把原生焦点显式送入内嵌内容(macOS `_webViewBridge.Focus()` / Windows `_webView2Host.MoveFocus()`),使页面输入框直接获得光标,不再因焦点停留在 Unity 侧而让 Ctrl+L 等快捷键命中编辑器并关闭 Codely
- **AICODE-1618 右键菜单 AI → Add to context 逻辑问题**:`Add to context` 不再强制打开 CodelyWindow;当无窗口打开导致共享 IPC 客户端未启动时,经新增的独立 IPC owner(`CodelyWindow:StaticContextSender`)启动客户端把排队的 context items 投递出去,投递完成后释放该 owner,使无窗口存活时共享客户端能正常停止
- **Windows domain reload 后窗口透明度恢复**(`cc6de44`):修复 domain reload 清空静态状态但原生 HWND 仍保留被改样式 / 位置,导致窗口不可见或卡在屏幕外的问题——保存原始样式前先剥离 `WS_EX_TRANSPARENT`、跳过保存屏幕外哨兵位置、恢复可见时始终剥离 `WS_EX_TRANSPARENT`,并新增 `ShowWindow`(`SW_SHOWNOACTIVATE`)回退与停止后验证阶段的自动修复兜底
## [1.0.54] - 2026-05-28
### Fixed
- **macOS 串流 DPI 缩放错误**(`52b6148`):`NativeWindowBridgeHost.DPIScale` 的预处理守卫由 `UNITY_EDITOR_WIN` 扩展为 `UNITY_EDITOR_WIN || UNITY_EDITOR_OSX`,使 macOS 也按 `EditorGUIUtility.pixelsPerPoint` 计算缩放,修复 Retina / HiDPI 显示器下 macOS 串流帧尺寸缩放错误的问题
- **串流期间 macOS Dock 图标处理**(`591c403`):移除离屏 / Play 模式串流期间将 NSApp 切到 `Accessory` 激活策略(隐藏 Dock 图标)的逻辑,串流期间保留 Tuanjie / Unity 编辑器的 Dock 图标常驻;恢复可见时改为在 `activate` 前先 `unhide` 并设回 `Regular` 策略,避免遗留的 `hide:` / `Accessory` 状态导致编辑器窗口不可见
## [1.0.53] - 2026-05-27
### Added
- **`unity_menu` 的 `get_available_menus` 正式实现**(AICODE-1272):原先返回空列表的占位实现改为真正枚举 Editor 菜单项
- 主路径经反射调用内部 `UnityEditor.Menu.GetMenuItems(string, bool, bool)`,同时覆盖原生(C++ 定义)与脚本定义菜单项;该 API 在当前 Unity 版本不可用时回退到通过 `TypeCache` 扫描 `[MenuItem]` 特性方法
- 内置顶层菜单(`File`/`Edit`/`Assets`/`GameObject`/`Component`/`Window`/`Help`/`Tools`/`Mobile`)作为基线种子,自定义顶层菜单(如 `AI`)动态补充
- 支持可选参数:`menu_path`/`menuPath`(限定子树)、`filter`/`search`(大小写不敏感子串匹配)、`include_separators`/`includeSeparators`(默认 `false`)
- 修复(`e1cdce7`):`TypeCache` 结果改为无条件并入同一集合(去重),即使反射 API 仅返回部分子树或不可用,脚本定义菜单项也始终存在;`path` `PropertyInfo` 改为按条目运行时类型缓存(`_pathPropByType`),并新增快捷键尾串正则 `_shortcutTailPattern` 以正确剥离菜单热键标记
- **Device Simulator / HMI Simulator 截图支持**(AICODE-1533):`ManageScreenshot.CaptureGameViewTexture` 不再只抓 Game View,而是枚举所有 `PlayModeView` 派生窗口(Game View、Device Simulator、HMI Simulator…)并逐一探测,返回首个非黑帧
- 按基类名 `PlayModeView` 识别窗口(而非按已解析 `Type`),解决 Simulator 位于独立模块程序集(`UnityEditor.DeviceSimulatorModule` / `HMISimulatorModule`)导致 `Type.GetType(...,UnityEditor)` 返回 `null` 而被跳过的原 bug
- 探测顺序:聚焦窗口优先,其次 Simulator,最后 Game View,使活跃的模拟帧优先于陈旧的 Game View RT;新增 `IsTextureBlack` 中心采样判黑,黑帧让位于下一来源,全黑时仍返回首帧
- `GetGameViewRT` 沿类型层级遍历读取 RT 字段(`m_RenderTexture` / 基类 `PlayModeView.m_TargetTexture`);Tuanjie 专属 HMI Simulator 渲染进 `DeviceView.PreviewTexture` 而不落到基类 RT,故在 `TUANJIE_1_0_OR_NEWER` 下通过 `FindPreviewTextureInVisualTree` 反射遍历可视树查找 `PreviewTexture`
- **串流遮罩窗口(Streaming Mask Window)**:新增 `StreamingMaskWindow`,在离屏 / Play 模式串流期间于 Windows 与 macOS 上叠加遮罩 UI,配合帧串流隐藏底层窗口内容
- **macOS 原生键盘输入注入**:Play 模式串流期间经 `CGEventCreateKeyboardEvent` 注入 OS 级键盘事件,新增浏览器键到 macOS 虚拟键码映射、按住键跟踪与超时去激活、本机物理按键状态轮询优化;新增 verbose 日志开关(菜单命令),高频日志改用 `LogVerbose`
- **Cowork 输入框自动 focus**(AICODE-1542):WebView2 内嵌为 Unity GUIView 子窗口时,仅 `EditorWindow.Focus()` 只把 Win32 焦点给到父 GUIView,HTML 的 `autofocus` / `element.focus()` 不显示光标也收不到键盘输入;新增 `NB_MoveFocus` P/Invoke 与 `WebView2Host.MoveFocus`,首次导航完成后(仅本窗口可见时,且只做一次)把焦点显式送入内容,避免 SPA 后续路由切换抢焦点
### Changed
- **NWB 信令服务改用 OS 动态分配端口**(`361f647`):原生窗口桥接的串流信令服务默认端口由固定值改为 `port=0`(OS 自动分配),避免同机多 Unity Editor 实例的端口冲突
- `PortManager.PortConfig` 新增 `stream_port` 字段,`StatusHelper` 经 `NativeWindowBridgeHost.GetBoundPort()` 查询并在状态载荷(含 legacy payload)中上报实际绑定端口,供客户端运行时发现
- `AutoStartStreamServer` 与 `start_stream_server` 默认走动态端口;端口回退逻辑调整为仅在显式指定固定端口(`port>0`)且 `allowPortFallback=true` 时生效,错误信息与日志同步改为动态端口语境
- **DrillWindow 单实例 attach 流程**(AICODE-1507):Walkthrough 启动改为 `EnsureTauriProcess`——先经 `~/.codely/app.lock.meta.json` 发现运行中的单实例 `cowork` APP,校验 `/api/tauri/status` 的 `single_instance` 后 POST `/api/tauri/attach-embed-workspace` 注册当前工作区并走正常 lock-file attach,仅在无运行实例时才新启进程;HTTP 与 lock 轮询置于后台线程,避免阻塞主线程
- `OnGUI` backstop 改以 IPC `server_ready` URL 的端口为准(覆盖启动时乐观缓存的陈旧端口),杜绝把 WebView2 指向死端口(`ERR_CONNECTION_REFUSED`)
- `GetWebViewUrl` 追加 `workspaceDir` / `theme` / `mode=embedded` 查询参数,使 Tauri 后端能为这个无窗口标签的内嵌 WebView 注入 `window.__CODELY_WORKSPACE_DIR__` 并正确路由 drill 相关 invoke
- **重绘 / 重新隐藏逻辑改用基于帧的 ticker**(`126ba3e`):将嵌套 `delayCall` 回调替换为 `PlayModeRepaintTick` / `ReloadRehideTick` 帧计数器(`s_PendingPlayModeRepaints` / `s_PendingReloadRehidePasses`),使 GameView 重绘与 domain reload 后窗口重新隐藏分散到不同 editor 帧、时序更可控
- **打包 macOS 原生桥接依赖**(`f5fb3a9`):随包附带 `libcrypto.3.dylib`、`libssl.3.dylib`,并更新 `libNativeWindowBridge.dylib` / `libdatachannel.dylib`,解决传递依赖缺失
- **更新各平台原生二进制**:Windows `NativeWindowBridge.dll` / `datachannel.dll` / `NativeBrowser.dll` / `NativeIpcClient.dll` / `NativeTcpBridge.dll`,macOS `libNativeWindowBridge.dylib` / `libNativeTcpBridge.dylib`,Linux `libNativeTcpBridge.so`
### Fixed
- **AICODE-1508 Walk Through 最后一步点击无响应**:内嵌 WebView 缺少工作区路由信息时后端以 "Missing workspace routing info" 拒绝全部 invoke,`drill/drillCompleted` 永远到不了处理器、Unity 收不到 `drillCompleted` IPC;经 `GetWebViewUrl` 注入 `workspaceDir` 修复
- **AICODE-1507 Walk Through 页面无法访问 / 打开时把 Tuanjie Cowork 拉到前台**:经单实例 attach 流程复用运行中的 APP,不再新启会被 `tauri_plugin_single_instance` 转发后立即退出(端口从未绑定)的多余进程
- **Windows Play 模式下幽灵移动与遮罩窗口闪烁**(`c8951ff`):`SetFocus` 触发前台窗口回收打断 `WM_KEYUP`、Input Manager 残留按键状态;新增前台回收宽限期与按住键跟踪,在 mouseup 时 flush 陈旧状态,离屏去激活时重置按键跟踪
- **Windows Play 模式按住键卡顿**(`9c700fb`):初始按键重复延迟(~500ms)超过宽限期(0.15s)导致遮罩窗口过早回收焦点;前台回收跳过逻辑扩展为在整个按住期间检查 `s_WinHeldKeys`
- **退出 Play 模式时帧停顿与 domain reload 恢复**(`45e6298`):Play 模式状态切换后强制立即重绘 GameView 并安排多次重绘覆盖 Unity 短暂渲染停顿;domain reload teardown 前先通知浏览器以缩短重连延迟
- **assembly reload 期间残留浮动捕获窗口**(`fb53c07`):自动创建的浮动捕获窗口因 close 被推迟到 `delayCall`,会先被 `RestoreAllWindowsVisible` 恢复可见而永久残留;改为 reload 前经 `SessionState` 跟踪并同步关闭,reload 后再按保存的 instance ID 检测并清理遗留窗口,macOS `RestoreAllWindowsVisible` 排除正在关闭的 NSWindow
## [1.0.52] - 2026-05-21
### Fixed
- **Unity 2019 / 标准 Unity 编译失败**:1.0.50–1.0.51 引入的 WebRTC 串流 / 窗口桥接代码无法在 Unity 2019.4 与标准 Unity(非团结引擎)上编译,本次统一修复
- C# 8.0 switch 表达式改写为传统 switch 语句(`ManageWebRtcStream`、`ManageWindowBridge`),并将目标类型 `new()` 还原为显式构造函数调用(`new object()` / `new RenderStreamingSession()`)
- `EditorWindow.docked` 在团结引擎中为 internal(标准 Unity 2020.1+ 为 public):新增 `NativeWindowBridgeHost.IsWindowDocked` 反射助手,`ManageWindowBridge` 的 `list_windows` 等改为经其读取,不可用时返回 `false`
- `EditorSnapSettings.gridSize` 仅团结引擎存在:`NativeWindowBridgeHost.Panel` 新增 `GetSnapGridSize` / `SetSnapGridSize` 反射访问,标准 Unity 下回退到 `EditorSnapSettings.move`
- `SceneView.IsCameraDrawModeSupported`、`EditorGUIUtility.GetIconForObject` 在团结引擎中为 internal:改为反射调用(`IsCameraDrawModeSupportedReflected`),API 不可用时默认视为支持,避免静默隐藏绘制模式
- Windows / macOS 原生 DLL 静态字段加 `#if UNITY_EDITOR_WIN` / `#if UNITY_EDITOR_OSX` 平台预处理守卫
- .NET Standard 2.0 兼容:`string.Contains(char)` 改为 `Contains(string)`(`ManageGameObject`、`ReadConsole`),`Contains(string, StringComparison)` 改为 `IndexOf(..., StringComparison) >= 0`(`CodelyIpcServer`)
- **批处理 / 无头模式下自动弹窗导致测试失败**:新增 `TauriUtils.IsAutomatedEditorRun`(`Application.isBatchMode` 或 `SystemInfo.graphicsDeviceType == Null`);`CodelyWindow.TryAutoOpenAfterInstall`、`DrillWindow.AutoOpenOnLoadIfDrillIncomplete` 与 `OpenWalkThrough` 在该环境下不再创建窗口,避免触发原生 `SUCCEEDED(hr)` 断言把本可通过的 CI / QA 测试整体判为 FAIL
## [1.0.51] - 2026-05-20
### Added
- **macOS 原生依赖预加载**:`NativeWindowBridgeHost` 新增 `EnsureMacDylibLoaded`,在首次探测原生可用性前通过 `dlopen`(`RTLD_NOW | RTLD_GLOBAL`)主动加载 `libdatachannel.dylib` 与 `libNativeWindowBridge.dylib`,解决部分打包流程产生的裸名称(bare-name)链接无法解析传递依赖的问题
- `EnumerateMacNativeBridgeFolders` 先经 `AssetDatabase.FindAssets` 定位已导入的 dylib 资源目录,再回退到 `Packages/cn.tuanjie.codely.bridge/Plugins/macOS` 与 `Library/PackageCache` 下的包目录
- 预加载结果(成功路径或 `dlerror` 详情)记录到 `macNativeDylibLoadDetail`,并在 `DllNotFoundException` / `EntryPointNotFoundException` 时追加到可用性原因中,便于排查
- **流服务自动启动重试与失败检测**:`ManageWindowBridge.AutoStartStreamServer` 新增可配置的重试机制(`AutoStartRetryDelayMs` 2000ms、`AutoStartRetryMaxAttempts` 30 次),插件尚未就绪时按节流策略(首次及每 5 次)打印进度日志,超过上限后停止重试并提示可手动调用 `start_stream_server`
- 新增 `IsNonRetryablePluginFailure`,识别架构不匹配(`wrong architecture` / `incompatible architecture` / `no suitable image found` 等)等不可恢复失败,直接报错并停止重试,避免无意义的日志噪音
### Changed
- **macOS 暂时禁用原生流服务**:`IsStreamingSupportedOnCurrentPlatform` 在 macOS 平台改为返回 `false`(与 Linux 一致),在 macOS 原生插件 / 运行时路径完善前保持硬禁用
- **平台相关日志与错误信息细化**:Linux / macOS 分别打印各自的禁用提示;`AutoStartStreamServer` 失败及 `start_stream_server` / offscreen 入口的错误信息改为附带 `GetAvailabilityReason()` 详情,并去除指向特定平台的过时措辞
- **更新 macOS 原生二进制**:同步发布更新后的 `libNativeWindowBridge.dylib` 与 `libdatachannel.dylib`(通用 / x86_64 构建)
## [1.0.50] - 2026-05-20
### Added
- **WebRTC 串流与窗口管理桥接**:新增完整的 Editor 窗口 WebRTC 串流基础设施,支持通过浏览器远程查看与交互 Unity Editor 窗口
- 新增 `ManageWebRtcStream` 与 `ManageWindowBridge` 两个工具,并配套 `NativeWindowBridgeHost` / `NativeWindowBridgeAPI` P/Invoke 绑定层
- 随包附带跨平台原生插件:Windows `NativeWindowBridge.dll`、`datachannel.dll`、`libcrypto-3-x64.dll`、`libssl-3-x64.dll`;macOS `libNativeWindowBridge.dylib`、`libdatachannel.dylib`
- 支持窗口枚举、聚焦与原生句柄解析;鼠标 / 键盘事件注入;离屏(offscreen)渲染模式与帧串流
- WebRTC 会话生命周期经 IPC(`CodelyIpcServer`)管理,串流服务端口被占用时支持端口回退(port fallback)启动
- Unity 与原生平台之间的坐标系转换,并通过反射访问 Unity 内部 Editor API
- 交互式面板提取:Grid Settings、Snap Increments、Grid Snapping(`NativeWindowBridgeHost.Panel.cs`)
- **原生日志回调与 assembly reload 加固**:`NativeWindowBridgeHost` 新增 `NWB_SetLogCallback` 委托 / P/Invoke,将原生 C++ 日志接入 Unity Console,并在服务初始化前注册回调以捕获全部 C++ 日志
- 新增 `OnBeforeAssemblyReload` 处理:domain reload 前停止服务并安全置空日志回调,避免悬空函数指针导致崩溃
- 新增 `ForceResetNativeOffscreenState`(restore 失败时清理原生状态)与 `NWB_StopCapture` P/Invoke(干净退出 offscreen 模式)
- 找不到 `NWB_SetLogCallback` 导出时打印 `Debug.LogWarning`,替代原先的静默跳过,便于排查原生日志缺失
- **macOS 原生键盘事件注入**:更新 `libNativeWindowBridge.dylib`,接入 CoreGraphics / CoreFoundation 的 `CGEventCreateKeyboardEvent` / `CGEventSetFlags`,使 Play 模式 GameView 串流期间可向 Unity 运行时 Input 系统派发 OS 级键盘事件
### Changed
- **DPI 缩放逻辑集中到 `DPIScale`**:`NativeWindowBridgeHost` 新增静态 `DPIScale` 属性,统一 Windows / macOS 平台相关的缩放计算,替换散落在 capture 尺寸、GUIView 尺寸提取、resize 目标比较中的重复条件分支
- **截图未指定尺寸时自动降采样并下调默认分辨率**:`ManageScreenshot` 在调用方未提供 width/height 时,将每张截图按最长边降采样至 256px(保持宽高比);同时下调各截图入口的默认回退分辨率(Scene View `960×540` → `480×270`、asset `1024` → `480×270`、UI Toolkit 改用 `Math.Min(..., 480/270)`),避免输出超大图
- **更新 Windows 原生二进制**:同步发布更新后的 `NativeWindowBridge.dll` 与 `datachannel.dll`
### Fixed
- **ERD-4273 启动失败**:更新 Windows `NativeBrowser.dll`、`NativeIpcClient.dll`、`NativeTcpBridge.dll`(并补充 `NativeBrowser/CMakeLists.txt`),修复启动失败问题
- **Windows HiDPI 离屏截图被放大**:修复 Windows HiDPI 显示器下 offscreen 窗口渲染内容被放大 / 缩放错误的问题——前端 CSS 像素与 Unity 逻辑点 1:1 对应,但 GPU backbuffer 工作在物理像素分辨率,Windows 需缩放到物理像素、macOS 由 backing scale 内部处理;`TryGetCurrentGUIViewSize` 在 Windows 改为返回物理像素,并移除错误的 `pixelsPerPoint` 除法
- **离屏串流结束后相机宽高比错乱**:串流期间相机被手动设为浮窗尺寸,docked GameView 恢复时 Unity 的 aspect 重置逻辑会跳过 manual 模式相机,导致后续渲染水平压缩;`StopOffscreenCapture` 新增 `ResetAspect()` 恢复 auto 模式,新增 `RestoreGameCameraAspects()` 在串流事件期间修复 aspect 损坏,并缓存 `m_TargetTexture` FieldInfo 避免反复反射
- **Editor 无焦点启动时 WebView2 初始化卡住**:编辑器无焦点启动时 `EditorApplication.update` / `delayCall` 被节流到接近停摆,导致 `server_ready → OnTauriServerReady → TryInitializeWebView2` 链路卡在 "Loading..." 占位
- `CodelyIpcManager` 用 volatile 静态缓存最新 `server_ready` URL,主线程无需等待 delayCall 即可读取
- 从 IPC 后台线程对每个 `UnityGUIViewWndClass` 子窗口 `InvalidateRect`,借 WM_PAINT 唤醒 Unity 消息循环、强制走一次 OnGUI
- `CodelyWindow` / `DrillWindow` 新增 OnGUI backstop,在 paint 期间读取缓存 URL 直接驱动 `TryInitializeWebView2`
- 移除主线程冗余 delayCall 与基于 Sleep 的阻塞式 HWND 轮询;`Ctrl+L` 无选中时恢复(Show/Focus)已有窗口而非将其关闭
- **Windows 包升级时原生崩溃**:domain reload 前对 WebView2 BrowserInstances 做 Windows 平台同步关闭(`NB_ShutdownAll`,5000ms 超时),在 `NativeBrowser.dll` 卸载前完成全部原生资源清理;清空 C# 句柄引用避免重复清理,并清理 `DrillWindow` 的 WebView2 引用
- **移除过时的 signaling URL 构建并加强 JSON 转义**:移除依赖已不存在的 `CodelyIpcManager.LastServerUrl` 的 `BuildSignalingUrlFromTauri`,RenderStreaming 会话改为要求显式 `signaling_url` 参数;`EscapeJson` 补充 Unicode 控制字符(U+0000–U+001F,含退格 / 换页)转义,避免 JSON 解析错误
- **AICODE-1474 force reload 与点击 AI 后 layout 错乱**:新增 `CodelyWindowDocker`,修复 force reload 及点击 AI 之后窗口 layout 不正确的问题
- **AICODE-1492 Get Started 最后一步按钮无响应**:修复 Walkthrough 中 Get Started 最后按钮点击无反应的问题(`CodelyWindow` / `CodelyWindowDocker`)
## [1.0.49] - 2026-05-15
### Added
- **Editor 加载时若 drill 未完成则自动弹出 Walkthrough**:`DrillWindow` 新增 `[InitializeOnLoadMethod] AutoOpenOnLoadIfDrillIncomplete`,在编辑器启动 / domain reload 时通过 `EditorApplication.delayCall` 延迟到首个 idle tick,再读取 `~/.codely/data.json` 的 `drillCompleted` 字段;为 `false` 时自动调用 `OpenWalkThrough()` 让首次接入的用户无需手动点 `AI/Open Walkthrough` 菜单
- 使用 `SessionState` key `Codely_DrillAutoOpened` 作为 per-session 守卫,确保同一个 Editor 会话内的多次 domain reload(脚本重编译)不会反复弹窗
- 跳过条件:`TauriUtils.GetCodelyRunnable()` 为空(未安装 cowork runnable)、已存在 `DrillWindow` 实例(`HasOpenInstances<DrillWindow>()`)、或 drill 已完成
### Changed
- **`IsDrillCompleted` 从 `CodelyWindow` 提升到 `TauriUtils`**:原先位于 `CodelyWindow` 的私有静态方法 `IsDrillCompleted` 迁移到 `TauriUtils.IsDrillCompleted`(`internal`),`CodelyWindow.OpenCodelyWindow` 与新的 `DrillWindow.AutoOpenOnLoadIfDrillIncomplete` 共享同一份 `~/.codely/data.json` 读取实现,避免后续两份代码出现行为漂移
## [1.0.48] - 2026-05-15
### Changed
- **顶层菜单从 `Window/Tuanjie AI/` 改为 `AI/`**:将 1.0.46 引入的 `Window/Tuanjie AI/*` 菜单组整体上移到主菜单栏顶层 `AI/`,并去除 `Tuanjie` 前缀,使条目在菜单栏一级即可访问
- `Window/Tuanjie AI/Open Assistant` → `AI/Open Assistant`(保留 `Ctrl+L`)
- `Window/Tuanjie AI/Open CLI` → `AI/Open CLI`
- `Window/Tuanjie AI/Open Walkthrough` → `AI/Open Walkthrough`
- `Window/Tuanjie AI/Check Connections` → `AI/Check Connections`
- `Window/Tuanjie AI/Force Reload` → `AI/Force Reload`
- 右键菜单同步:`Assets/Tuanjie AI/Add to context` → `Assets/AI/Add to context`,`GameObject/Tuanjie AI/Add to context` → `GameObject/AI/Add to context`
- **主工具栏按钮文案改为 `AI`**:`CodelyToolbar` 中 `MainToolbarContent` text、`ToolbarButton.tooltip` 与 `Label` 由 `Tuanjie AI` 改为 `AI`,与新的顶层菜单命名保持一致
- **`Open CLI` 未找到 CLI 时的提示更新**:`CodelyWindow.OpenCodelyTerminal` 中 `Tuanjie AI CLI Not Found` 弹窗的提示改为指引设置 `CODELY_HOME`(包含 `codely[.exe]`)或 `CODELY_APP_HOME`(包含 `cli/bin/<platform>/codely[.exe]`),替换原先 `CODELY_CLI_PATH` 的过时描述
- **`CODELY_APP_HOME` 查询走统一 `ReadOsEnvVar` 助手**:`TauriUtils.GetCodelyRunnable` 删除内联的 Windows 注册表 / macOS 登录 shell 查询代码,改为通过共享的 `ReadOsEnvVar("CODELY_APP_HOME")` 每次从 OS 级存储读取,行为与 1.0.46 等价但实现统一,便于其它读取项复用
### Fixed
- **macOS `Open CLI` 路径含空格时启动失败**:`CodelyWindow.OpenCodelyTerminal` 在调用 `osascript` 时不再直接把 `cliPath` 拼进 `do script "..."` 字符串,而是先做 AppleScript 级 escape(先 `\` 后 `"`)再用 `quoted form of` 由 AppleScript 在运行时做 shell quote;包含空格的安装路径(如 `/Applications/Codely Cowork.app/Contents/Resources/cli/...`)现在能作为单一参数完整传入 Terminal 子 shell,不再被空格截断
### Documentation
- **Tests/Coverage 文档对齐 bridge 实现**:
- 新增 `execute_csharp_script_full_coverage.md`(约 500 行),覆盖 ExecuteCSharpScript 自动修复、`script_path`、内部日志抑制等用例
- 重写 `unity_script_full_coverage.md`(+1191 行)覆盖 ScriptFix 全套修复器与 edit revision 行为
- 修正 `execute_custom_tool_full_coverage.md` 断言与 lookup 用例,与当前 `ExecuteCustomTool` 注册/反射路径一致
- `unity_workflow_full_coverage.md` 补充 batch + 工作流场景;`README.md` 更新索引
## [1.0.47] - 2026-05-15
### Changed
- **UI 文案统一改为 "Tuanjie AI"**:将编辑器内残留的 "Codely" 用户可见字符串整体替换为 "Tuanjie AI",与顶层菜单 `Window/Tuanjie AI` 改名保持一致;底层命名空间、包名、`CODELY_APP_HOME` 等环境变量与 IPC 协议保持不变,仅修改可见文案与菜单/资源命名
- `TcpBridgeControlWindow`:窗口标题 `Codely Bridge` → `Tuanjie AI Bridge`,就绪 / 未连接提示文案同步替换为 `Tuanjie AI bridge is ready` / `Connect to Tuanjie AI Agent` / `Start Tuanjie AI Bridge to connect to Tuanjie AI Agents.`
- `CodelyToolbar`:主工具栏元素路径 `Codely AI/Codely Bridge` → `Tuanjie AI/Tuanjie AI Bridge`,按钮 tooltip / Label 由 `Codely` 改为 `Tuanjie AI`
- `CodelyWindow`:窗口标题、`Loading Codely...` 占位、`Updating Codely` 更新页、Setup 引导页的 logo / 主副标题、`Codely CLI Not Found` 与终端打开失败弹窗等全部改为 `Tuanjie AI`;右键菜单 `Assets/Codely AI/Add to context` → `Assets/Tuanjie AI/Add to context`,`GameObject/Codely AI/Add to context` → `GameObject/Tuanjie AI/Add to context`
- `DrillWindow`:Walkthrough 窗口标题 `Codely WalkThrough` → `Tuanjie AI WalkThrough`
- **布局文件改名 `Codely Mode.wlt` → `Tuanjie AI Mode.wlt`**:随包附带的 Window Layout 资源同步更名,避免 `Window > Layouts` 菜单中同时出现新旧两份 Codely 布局
### Fixed
- **`CodelyLayoutInstaller` 兼容老布局迁移**:
- 安装新 `Tuanjie AI Mode.wlt` 时同步从用户 layouts 目录删除遗留的 `Codely Mode.wlt`,确保菜单中不再出现旧条目
- 新增 `IsLegacyLayoutActive` 检测:通过反射定位 `UnityEditor.WindowLayout.GetCurrentLayoutPath()`(不可用时回退到扫描 `layoutsPreferencesPath` 下最新的 `CurrentLayout*.dwlt`),解析 `m_LastLoadedLayoutName` 是否为 `Codely Mode` / `Codely`;仅当用户仍停留在旧布局时才自动切换到 `Tuanjie AI Mode`,避免每次 domain reload 都重置用户的窗口自定义
## [1.0.46] - 2026-05-15
### Added
- **Welcome 流程结束后自动切换 Codely Layout**:`DrillWindow.OnDrillCompleted` 在打开 `CodelyWindow` 前先调用新增的 `CodelyLayoutInstaller.ApplyCodelyLayout()`,把 Editor 加载到随包附带的 Codely `.wlt` 布局
- 新增 `ApplyCodelyLayout`:若用户 layouts 目录缺少布局文件则先执行 `InstallCodelyLayout` 重新落盘,再通过反射调用 `UnityEditor.WindowLayout.TryLoadWindowLayout` / `LoadWindowLayout` 加载
- 在 layout swap 前先 `Close()` DrillWindow,确保 IPC release / WebView teardown 同步走完,避免布局切换将其他窗口一并销毁时遗留资源
### Changed
- **顶层菜单移入 `Window/Tuanjie AI`**:原 `Codely AI/*` 菜单整组迁出主菜单栏,挂到 `Window` 下并改名 `Tuanjie AI`,同时重命名条目以去除 "Codely" 字样
- `Open Codely` → `Open Assistant`(保留 `Ctrl+L` 快捷键)
- `Open Codely (Terminal)` → `Open CLI`
- `Open Codely Walkthrough` → `Open Walkthrough`
- `Open Codely Bridge` → `Check Connections`
- `Force Reload Codely` → `Force Reload`
- **默认安装目录优先 Tuanjie Cowork**:`GetCodelyRunnable` 在 `CODELY_APP_HOME` 未设置时,先尝试 `%LOCALAPPDATA%\programs\Tuanjie Cowork`(macOS:`/Applications/Tuanjie Cowork.app/Contents/MacOS`),仅当该路径下不存在 `cowork[.exe]` 时回退至 `Codely Cowork`
- **`CODELY_APP_HOME` 每次从最新环境读取**:移除进程启动时缓存的 `Environment.GetEnvironmentVariable("CODELY_APP_HOME")`,改为每次解析时从 Windows 注册表(`HKCU/HKLM Environment`)或 macOS 登录 shell 读取,避免安装器更新环境变量后必须重启 Editor 才能生效
### Fixed
- **`CODELY_APP_HOME` 指向无效目录时不再硬失败**:`GetCodelyRunnable` 在读取到 `CODELY_APP_HOME` 后,若该目录下不存在 `cowork[.exe]`,会打印 warning 并清空 `home`,让默认 `Tuanjie Cowork` / `Codely Cowork` 回退逻辑继续生效,而不是把无效路径一直传到最末的 `File.Exists` 错误
## [1.0.45] - 2026-05-15
### Fixed
- **`capture_ui_toolkit` 空白截图**:重写 `CaptureUIToolkitCoroutine` 中 PanelSettings / UIDocument 初始化与渲染驱动逻辑,解决在 HiDPI 显示器与全新 Editor 会话下 UI Toolkit 截图输出为空白或 0×0 的问题
- `PanelSettings.scaleMode` 改为 `ConstantPixelSize` 并将 `scale`、`referenceDpi`、`fallbackDpi` 锁定到 1×/96 dpi,避免 HiDPI 下 panel 解析尺寸缩半或为 0
- `clearDepthStencil` 置为 `true`,清理上一次重试残留深度,防止后续 UI quad 被深度剔除
- 临时 `__CodelyTempUIDocument__` GameObject 改用 `HideFlags.DontSave`,使 runtime panel 系统能正确注册其离屏 panel
- root `VisualElement` 显式钉到 RenderTexture 尺寸,避免首次 layout tick 之前为 0×0
- 新增 `GetDefaultRuntimeTheme` 回退,当 UI Builder 主题映射不可用时仍使用默认 runtime 主题渲染
- 新增 `TryForceUIDocumentRepaint`:通过反射调用 panel 的 `Repaint(Event)` / `Render()` 同步刷新 UIR draws,移除原先依赖编辑器前台 + player loop 的实现
- 移除 `FocusUnityEditor` 及配套 Win32 `SetForegroundWindow` / `AttachThreadInput` P/Invoke 与 macOS `osascript` 调用,截图不再抢占用户当前前台窗口
### Changed
- **`Plugins\Codely.Newtonsoft.Json.dll` Auto Reference 打开**:将 `isExplicitlyReferenced` 由 1 改为 0,使用户程序集无需显式 reference 即可使用 bundled Newtonsoft.Json
## [1.0.44] - 2026-05-14
### Added
- **Unity 2019.4 支持**:将包最低支持版本从 Unity 2021.3 下调至 Unity 2019.4,并打平 Mono / C# 7.3 兼容性差异
- 重写跨 Bridge / Tauri 编辑器代码中的 C# 8+ 构造(switch expressions、range indexers、`using var`)为 7.3 兼容形式
- 随包附带 Unity 2019 缺失的 .NET Standard 2.0 facade DLL:`System.Memory`、`System.Buffers`、`System.Numerics.Vectors`、`System.Threading.Tasks.Extensions`、`Microsoft.Bcl.*`、`System.Text.Encoding.CodePages`
- Windows 下将 `CodelyIpcServer` 内的 `System.IO.Pipes.NamedPipeClientStream` 替换为原生 `NIC_*` 单例(`NativeIpcClient.dll`),规避 Mono 5.x 命名管道取消挂起与程序集重载线程泄漏
- `NativeWindowHelper` 改为基于位置的 GUIView 匹配 + 缓存的静态 `EnumWindowsProc` 委托,避免 Mono `delegate_hash_table` 每次分配委托导致的崩溃
- 移除未使用的 `BinaryFrameHelper` 与 `InternalAPIEditorBridge.017` asmdef
- **`ConsoleLogChangedNotifier`**:新增 NTB_* 推送通知器,监听 Unity Console 日志变化并向已订阅客户端广播
- **`ManageEditor` focus window 前置**:聚焦 Codely 窗口前先将 Unity 主进程带到前台(Windows `AttachThreadInput` + `SetForegroundWindow`、macOS `osascript` 激活 PID),避免被其他应用遮挡
- **`ExecuteCSharpScript`**
- 新增 `description` 参数,用于在调用侧标注脚本意图
- 抑制工具自身内部跟踪日志,避免污染脚本执行期间捕获的 Console 输出
- **macOS WebView**:新增 `WebViewPlugin.bundle` 骨架,Tauri/WebView 多平台共享同一组接口
### Changed
- **Tauri 单实例进程管理重构**:在 Codely 跨工作区切换、关闭窗口等场景下保留单一 Tauri 进程,避免 UI 拆解与重复启动
- `CodelyWindow` / `TauriUtils` 增加 single-instance attach 逻辑与全局 app meta path 检索
- 工作区目录获取统一走 `GetWorkspaceDirectory`,standalone window state 处理更新以与 attach 流程对齐
- Tauri 应用启动改为 async 入口,提升窗口打开响应性
- 关闭窗口时清理遗留 Tauri 进程;切换 workspace 时不再误杀仍在使用的 Tauri 实例
- 强化进程终止与 IPC 通道在单实例模式下的清理顺序
- **拖拽 UI 重写(`CodelyWindow`)**:重写 drag & drop 渲染与命中测试路径(+623 行),修正拖拽视觉与上下文添加流程
- **macOS 主题同步**:IPC 连接建立时与 Tauri 同步深色/浅色主题,主题变更时主动下发颜色到 Tauri
- **场景视图截图默认分辨率**:`take_scene_screenshot` 在未提供 width/height 时回退到 1920×1080,避免输出空尺寸
- **更新插件图标**
- **更新 `Plugins\Win\NativeIpcClient.dll` 与 `NativeBrowser.dll` 元数据**
### Fixed
- **WebView 与编辑器 Tab 重叠**:调整 `CodelyWindow` 中 WebView 的布局,避免覆盖编辑器窗口标签栏
- **Unity 2019 macOS WebView 错误**:修复 macOS + Unity 2019 下 WebView 初始化与崩溃问题
- **Unity 2020.3.15 兼容性**:修复 `ManageUIToolkit` 与 `CodelyIpcServer` 在 2020.3.15 上的编译/运行错误
- **Windows IL2CPP 构建报错**:修正 Win 原生插件(`NativeBrowser.dll`、`NativeIpcClient.dll`、相关 cpp/h)的 `.meta` 平台设置,使 IL2CPP 构建不再误纳编辑器原生插件
- **DLL 平台 meta 配置**:修正随包附带的 facade DLL(`System.Buffers`、`System.Memory`、`System.Numerics.Vectors`、`System.Text.Encoding.CodePages`、`System.Threading.Tasks.Extensions`)以及 `NativeBrowser.dll` / `NativeIpcClient.dll` 的 import settings,消除 dll 重复加载/平台冲突报错
- **ScriptFix `SyntaxTree` 歧义**:在 `ScriptFixProvider` 与各 `Fix*` 类中显式限定 `Microsoft.CodeAnalysis.SyntaxTree`,解决与其他程序集类型同名导致的编译歧义
- 移除遗留调试日志
## [1.0.43] - 2026-05-07
- 版本号占位(package.json 已升至 1.0.43,但未独立发布;变更内容合并至 1.0.44)
## [1.0.42] - 2026-04-29
### Fixed
- **Codely Window 显示问题**:修复 Codely Setup Window Icon 显示问题
## [1.0.41] - 2026-04-29
### Fixed
- **GameObject 序列化崩溃**:新增 `Matrix4x4Converter` 与 `TransformHandleConverter`,避免 Newtonsoft 反射序列化 `Matrix4x4`(`inverse`/`transpose` 递归与 `rotation` 触发 `ValidTRS` 断言导致 StackOverflow)以及 `UnityEngine.TransformHandle`(默认值触发 `AssertHandleIsValid`)时的崩溃
- **`get_components` 按 instanceID 查找失败**:`FindObjectsInternal` 现将数字字符串与 `searchMethod == "default"` 视为按 ID 查找,避免传入整型 instance ID(如 `49552`)时回退到按名称匹配
- **U6 打开 Codely 时点击 AI 按钮自动输入 `@Readme`**(AICODE-1326)
- **`OnServerReady` 端口校验**:在服务就绪回调中新增端口有效性校验
- **WebView 稳定性与资源共享**:改善 WebView 多窗口场景下的资源共享与稳定性
### Changed
- **Unity Bridge UI 调整**(AICODE-1317)
- 更新插件图标
### Removed
- 移除未使用文件
## [1.0.40] - 2026-04-22
### Added
- **统一命令与通知 TCP 通道**:将原有 `UnityStateServer`(USS_*)与 `NativeTcpBridge`(NTB_*)整合为单一 NTB_* ABI,单条 TCP 监听同时承载入站命令与出站推送通知;`CLIENT_VERSION>=2` 客户端可订阅推送
- **Unity 状态推送通知**:新增 `SceneHierarchyNotifier` 与 `SelectionChangedNotifier`,通过 debounce 合并高频事件,载荷与 `ManageScene` / `ManageEditor` 响应保持一致
- **`UnityTcpBridge.NotifyAll(eventType, payload)` 公共 API**:暴露统一的推送入口
- **`ManageEditor.GetSelection` 增强**:响应额外返回 `activeAsset`、`assetPaths` 以及每个 GameObject 的层级路径
- **Tauri Embed 模式检测**:通过 `/api/tauri/status` 端点读取远端 detach/embed 状态,附加进程时正确判定模式;新增 `TryParseJsonEmbedModeField` 解析与同步调试日志
### Changed
- **GameObject 路径语义统一**:`ManageEditor.GetGameObjectPath` 返回层级路径而非场景路径,与 `SelectionChangedNotifier` 对齐,使 `get_selection` 响应与 `selection_changed` 通知中的 `path` 字段含义一致
- **场景层级树构建迭代化**:`ManageScene` / `SceneHierarchyNotifier` 的递归 DFS 重写为两阶段迭代实现,避免深层级时托管栈溢出
- **`SceneHierarchyNotifier` 防抖**:从 per-frame `delayCall` 合并改为基于 `EditorApplication.update` 的 250 ms idle-debounce,事件爆发时仅产生单条通知
- **原生桥接绑定流程**:`NativeUnityTcpBridgeHost.StartOrAttach` 在调用 `NTB_Start` 前先探测 `IsRunning` / `GetBoundPort`,域重载后能可靠复用既有原生监听
- **`NativeDllLoader.Load` 句柄校验**:通过 `GetModuleHandleExW`(Windows)/ `dlopen(RTLD_NOLOAD)`(macOS/Linux)做 path-based 探测,消除包升级后 `SessionState` 句柄复用导致的 double-free 风险
- **拆解顺序修正**:新增 `NativeDllLoader.OnUnload` 事件,`UnityTcpBridge` 与 `UnityStateServer` 在原生句柄释放前先自行停止,替代 `Unload()` 中的直接调用
- **反射加载容错**:`ICommandExecutor.Register` 捕获 `ReflectionTypeLoadException`,部分类型加载失败时仍可注册其余可用类型,避免整体扫描被静默丢弃
- **`UssConfig` 缓存**:内存缓存配置,避免心跳写入时反复读取磁盘
- **进程环境清理**:启动 Tauri 前调用 `TauriUtils.SanitizePkgEnvironment` 从 `ProcessStartInfo` 中移除 `PKG_EXECPATH`、`PKG_INVOKE_NODEJS`、`PKG_INVOKE_ENTRYPOINT` 等 pkg bootstrap 变量,防止 cowork/core 启动时入口探测失败
- **DLL 加载与进程绑定**:补充错误检查路径,加载或绑定失败时及时返回
- **更新 Win/Linux/macOS 原生插件二进制**:同步发布 `NativeTcpBridge.dll`、`libNativeTcpBridge.so`、`libNativeTcpBridge.dylib`
### Fixed
- **iOS 打包失败(AICODE-1278)**:修复安装 codelybridge 后打 iOS 应用报错
### Removed
- 旧版 `Editor/Bridge/Server` 目录(`UnityStateServer`、executor 抽象、`SceneHierarchyBuilder`、`UssConfigHelper`、schema 文档),由统一 NTB 通道及新通知器替代
## [1.0.39] - 2026-04-16
### Added
- **FixMissingAssemblyReference 支持 CS0234 命名空间修复**:当 CS0234 错误因使用了错误命名空间前缀(如 `UnityEngine.SerializedObject` 实际位于 `UnityEditor`)时,自动重写源码将错误前缀替换为正确命名空间
- **FixMissingAssemblyReference 扩展至 CS0103**:将 `FixMissingAssemblyReference` 支持的诊断 ID 扩展为 `CS0246`、`CS0234`、`CS0103`,提升未限定符号的自动修复覆盖范围
- **新增 FixMissingAssemblyReference 测试套件**:新增 226 行覆盖测试(`FixMissingAssemblyReferenceTests.cs`)及 115 行 `FixMissingImportsTests.cs` 补充用例
### Changed
- **包升级处理优化**:改善 `CodelyWindow` 与 `DrillWindow` 在 Unity 包升级场景下的窗口生命周期处理,提升升级过程中的稳定性
## [1.0.38] - 2026-04-15
### Added
- **Native TCP Bridge**:将托管 C# TCP 服务器替换为原生插件架构,新增 Windows、macOS、Linux 三平台原生插件(`NativeTcpBridge.dll` / `libNativeTcpBridge.dylib` / `libNativeTcpBridge.so`)
- **NativeTcpBridgeHost**:新增 P/Invoke 绑定层,支持跨程序集重载后保持原生服务器状态;新增 `GetConnectedClients` 原生快照 API
- **NativeLibLoader**:动态加载原生 DLL,支持包更新后无需重启即可热替换
- **FixUnqualifiedUnityStaticMethod**:新增 ScriptFix 自动修复器,处理 CS0103(未限定的 Unity 静态方法调用),通过诊断 span 精确定位节点
### Changed
- **TCP 架构重构**:移除托管 `TcpListener` 及客户端循环代码,网络 I/O 移至原生层,减少 Editor 主线程阻塞;移除端口发现逻辑,改用操作系统自动分配端口
- **CompileAndAutoFix 重构**:用 `CSharpScript.Create()` 替代 `WrapScript`/`ExtractScript` 方案,自动修复编译检查与实际执行使用同一脚本引擎;新增回归保护,若修复后错误数增加则自动回滚;简化 `FixMissingBrace`,新增正则守卫跳过锯齿数组与命名元组数组的 CS1513
- **asmdef 重命名**:将内部桥接 asmdef 重命名为 `Unity.InternalAPIEditorBridge.017`,修复与 `com.unity.localization` 的冲突(AICODE-1121)
- **`NativeTcpBridge` 仅限 Editor**:将原生桥接代码限制为仅在 Editor 环境编译
- **`.npmignore` 更新**:排除构建产物
### Fixed
- **右键"加到 Codely"上下文未添加**:修复在未打开 Codely 窗口时使用右键菜单,内容不会被添加到上下文的问题(AICODE-1258)
- **Welcome 页面未显示**:修复 Tuanjie 和 Unity Editor 中未出现 Welcome 页面的问题(AICODE-1232)
- **Linux 原生库加载**:修复 Linux 下 DLL 加载器问题并更新 `.so` 文件
- **macOS 原生插件**:更新 macOS `libNativeTcpBridge.dylib`
## [1.0.37] - 2026-04-10
### Fixed
- fix: 打开Plugins\Codely.Newtonsoft.Json.dll auto reference
## [1.0.36] - 2026-04-09
### Added
- **ExecuteCSharpScript 自动修复**:新增 ScriptFix 框架,包含 `FixMissingImports`、`FixMissingSemicolon`、`FixMissingBrace`、`FixMissingParenthesis`、`FixMissingSquareBracket`、`FixMissingAssemblyReference`、`FixAmbiguousReference` 等修复器,编译失败时自动尝试修复并重试
- **ExecuteCSharpScript 支持 `script_path`**:新增 `script_path` 参数,可直接传入脚本文件路径;`script` 与 `script_path` 二选一
- **Assets 右键菜单"加到 Codely"**:启用 `Assets/Codely/Add to context` 右键菜单,将选中资源/GameObject 添加为 Codely 上下文(AICODE-1096)
- **Codely Layout**:新增 Codely 专属布局入口
### Changed
- **更新加载 UI 重构**:采用纯色 `#2d2d2d` 背景;内容区域扩展至 480px;标题字号升至 22px Bold;状态文本与页脚文本分行并用分割线隔开;旋转 spinner 改用 `Handles.DrawSolidDisc` 渲染
- **包名校验修正**:`OnPackagesRegistered` / `OnPackagesRemoved` 中将 `cn.tuanjie.codely` 更正为 `cn.tuanjie.codely.bridge`
- **安装后窗口打开方式**:改为调用 `ToggleCodely()` 优先显示引导页,Setup 完成后同样使用 `ToggleCodely()` 打开窗口
- **菜单栏结构**:`Open Codely Bridge` 菜单项从 `Window/Codely/` 移至顶层 `Codely/`(AICODE-1123)
- **DLL 重命名**:将 `Codely.Microsoft.CodeAnalysis.*` 系列 DLL 统一去除 `Codely.` 前缀,修复 Burst 编译报错
- **ReadConsole 优化**:新增最大 1000 条目限制、完善堆栈信息处理(AICODE-1117)
- **共享 IPC 基础设施**:提取可复用的 IPC 消息处理与工具类到独立模块
- **Codely Logo 及图标更新**:更新应用图标与标题栏图标
### Fixed
- **连接前进程存活检查**:尝试连接前先验证目标进程是否仍在运行,避免无效连接
- **Bridge 移除时窗口行为**:修复在 Codely 对话打开状态下移除 Bridge 不会自动关闭 Codely 窗口、顶部面板显示异常的问题(AICODE-1131)
- **TCP 服务器停止时端口状态**:服务器停止后将 `currentUnityPort` 重置为 `-1`(无效状态),避免残留端口被误用
- **Meta GUID 修复**:修正若干 `.meta` 文件的 GUID
## [1.0.35] - 2026-04-01
### Added
- **Tauri 自动更新**:新增 `updateRestart` IPC;更新重启期间显示加载 UI,重连后恢复窗口;`OnConnectionChanged` 经 `EditorApplication.delayCall` 派发;30 秒超时兜底
- **`manage_screenshot`**:支持 `capture_asset`、`capture_ui_toolkit`;部分命令支持协程执行;`UnityTcpBridge` 相应配合
### Changed
- **拖拽上下文 IPC**:`dropItems` 更名为 `addContexts`(Unity 内拖拽资源/GameObject 作为上下文)
- **启动 Tauri**:简化 Unity 登录态逻辑,直接使用当前会话 token,移除 `RefreshAccessToken` 与超时回退
- **工程锁与 Tauri 进程**:抽取可复用的 lock 解析与校验;支持就地更新后刷新进程身份
- **可执行文件与文案**:`codely-app` 更名为 `cowork`(Windows/macOS 路径与日志)
### Fixed
- **安装路径**:未配置 `CODELY_APP_HOME` 时回退到默认安装目录(Windows:`%LOCALAPPDATA%\programs\Codely Cowork`;macOS:`/Applications/Codely Cowork.app/Contents/MacOS`)
- **关闭标签页**:主线程立即 `Kill` Tauri 进程,避免新窗口误复用旧进程导致竞态(AICODE-1054)
- **切换工程关闭窗口**:`preserveTauri` 为 true 时不终止 Tauri 进程
- **macOS 粘贴**:聚焦嵌入 WKWebView(`MacOSWebViewBridge` / `WebViewPlugin`)
## [1.0.34] - 2026-03-26
### Fixed
- fix: 修复mac os 文件拖拽问题
## [1.0.33] - 2026-03-25
### Fixed
- fix: close window if project switched
- fix: codely bridge mac 上经常重连报错
## [1.0.32] - 2026-03-24
### Fixed
- 修复 `editor codely` 无法通过拖拽添加文件的问题
## [1.0.31] - 2026-03-23
### Changed
- **`take_scene_screenshot` multi-view capture**: Replace single scene-camera capture with a 4-view composite; a temporary camera mirrors all scene camera settings and shoots from ISO, TOP, FRONT, and RIGHT angles, then stitches the four renders into a 2×2 grid image (`StitchTextures2x2`)
- **Scene screenshot labels**: Draw white uppercase view-name labels (ISO / TOP / FRONT / RIGHT) with a darkened background at the top-left corner of each quadrant using a built-in 5×7 bitmap font rendered at 12× scale (`DrawLabelOnTexture`)
## [1.0.30] - 2026-03-23
### Added
- **IPC `focus_window` message**: Add `focusWindow` IPC message type and handler to bring the Unity Editor window to the foreground; on Windows uses `AttachThreadInput` + `SetForegroundWindow` to bypass foreground-switch restrictions; on macOS uses `osascript` to activate the process by PID
### Fixed
- **`execute-csharp-script` Assembly-CSharp.dll lock**: Switch Roslyn assembly references from in-process `Assembly` objects to `MetadataReference.CreateFromFile`; shadow-copy `Assembly-CSharp` and `Assembly-CSharp-Editor` to a versioned temp directory (`CodelyScriptRefs`) so the originals are never locked during script compilation; automatically clean up stale shadow copies on each run
## [1.0.29] - 2026-03-20
### Added
- **WebView persistence across domain reloads**: Keep webview alive by storing the native browser window handle (`_serializedWebView2Handle`) and validity flag as serialized fields; add set-callback methods to re-bind C# callbacks after assembly reload (`NativeBrowserAPI`, `WebView2Host`)
### Changed
- **CodelyToolbar**: Rename `TcpBridgeToolbar` -> `CodelyToolbar` and wire toolbar button to `CodelyWindow.FocusOrOpenWindow` instead of `TcpBridgeControlWindow.ShowWindow`
### Fixed
- Fix `Editor/Bridge/Icons/app.png.meta` GUID and remove stale Server platform texture settings
- Skip `MeshFilter.mesh` access in `GameObjectSerializer` to avoid instantiating a new mesh and causing unintended side effects
- Remove unused function in `CodelyWindow`
- Exclude Tauri-specific code on Linux with platform compile guards
## [1.0.28] - 2026-03-17
### Added
- **WebView persistence across domain reloads**: Keep webview alive by storing the native browser window handle (`_serializedWebView2Handle`) and validity flag as serialized fields; add set-callback methods to re-bind C# callbacks after assembly reload (`NativeBrowserAPI`, `WebView2Host`)
### Changed
- **CodelyToolbar**: Rename `TcpBridgeToolbar` → `CodelyToolbar` and wire toolbar button to `CodelyWindow.FocusOrOpenWindow` instead of `TcpBridgeControlWindow.ShowWindow`
### Fixed
- Fix `Editor/Bridge/Icons/app.png.meta` GUID and remove stale Server platform texture settings
- Skip `MeshFilter.mesh` access in `GameObjectSerializer` to avoid instantiating a new mesh and causing unintended side effects
- Remove unused function in `CodelyWindow`
- Exclude Tauri-specific code on Linux with platform compile guards
## [1.0.27] - 2026-03-13
### Added
- Add meta files: `Editor\Bridge\fonts\NotoSans-Regular.ttf.meta`, `Editor\Bridge\Icons\setup_download.png.meta`, `Editor\Bridge\Icons\setup_main.png.meta`
## [1.0.26] - 2026-03-13
### Added
- **Download Codely page** and new menu items
- Setup window assets: `setup_download.png`, `setup_main.png` (Editor/Bridge/Icons)
- Noto Sans Regular font for setup UI (Editor/Bridge/fonts/NotoSans-Regular.ttf)
### Changed
- CodelyWindow and DrillWindow updates for download/setup flow and new menu entries
- TcpBridgeControlWindow minor update
## [1.0.25] - 2026-03-10
### Added
- **Codely setup flow**
- Add setup window (CodelySetupWindow) to guide users when Codely is not installed; includes download link and "重新检测" (re-detect) button
- Resolve `CODELY_HOME` without Unity restart: read from Windows registry (user/system) and macOS login shell when process env is not set
- **Drill / Tauri server management**
- Add detach/attach mode and replace previous drill mode
- Introduce `DrillWindow` for Tauri server management
- Add drill walkthrough check in CodelyWindow and `DrillCompleted` event
### Changed
- Rename **codely-tauri** to **codely-app** (executable and references)
- Use **CODELY_APP_HOME** instead of **CODELY_HOME** as the app home environment variable
- Optimize `GetCodelyRunnable` logic
- Update UI to show multiple connection status for the same platform
### Fixed
- Try to dock Codely window to any existing editor window when embedding fails
- Fix `Editor/Tauri/CodelyWindow.cs.meta` GUID issue
## [1.0.24] - 2026-03-03
### Changed
- Meged Codely and Codely Bridge into one package
- Update cicd pipeline to build package into dll
- Add `AI` toolbar button to open Codely Window
## [1.0.23] - 2026-02-25
### Changed
- **UI**
Codely bridge 页面改版
## [1.0.22] - 2026-02-11
### Enhanced
- **ExecuteCSharpScript**
- Added Unity.InputSystem assembly support for C# script execution
- Scripts can now access Input System types and APIs when the package is installed
## [1.0.21] - 2026-02-06
### Changed
- **Batch Operations Refactoring**
- Split generic `batch` action into two distinct operations: `create_batch` for write-only deterministic sequences and `edit_batch` for search-then-write edits
- Added `HandleCreateBatch` method for write-only deterministic batch operations
- Added `HandleEditBatch` method for search-then-write batch operations with captureAs support
- Improved code clarity and prevented mixed read/write batch states
- Maintained parity with TypeScript client schema
- Added backward compatibility aliases for snake_case to camelCase parameters
- Updated ValidActions list to include new batch operation types
- Updated writeActions array to include new batch operations for state validation
### Enhanced
- **ManageAsset**
- Enhanced batch operation handling with clearer separation of concerns
- Improved parameter naming consistency with backward compatibility support
- **ManageGameObject**
- Enhanced batch operation handling with clearer separation of concerns
- Improved parameter naming consistency with backward compatibility support
### Test Coverage
- Updated `unity_asset_full_coverage.md` to reflect new batch operations
- Updated `unity_gameobject_full_coverage.md` to reflect new batch operations
- Updated `unity_workflow_full_coverage.md` with refined batch operation workflows
- Updated `Tests/Coverage/README.md` documentation
## [1.0.20] - 2026-02-05
### Fixed
- **TCP Port Management on macOS**
- Disabled ReuseAddress socket option on macOS in PortManager.cs
## [1.0.19] - 2026-02-04
### Fixed
- **TCP Port Management on macOS**
- Disabled ReuseAddress socket option on macOS to prevent multiple Unity instances from listening on the same port
- Ensures proper port exclusivity across Unity Editor instances
## [1.0.18] - 2026-02-04
### Fixed
- **TCP Connection Reliability**
- Add LingerState to test listener to send RST on close (same as actual listener)
- Increase immediate retry attempts from 3 to 5
- Increase retry sleep time from 75ms to 150ms
- Extend wait time on Windows from 100ms to 500ms to allow TCP port full release
## [1.0.17] - 2026-02-03
### Fixed
- **Revert IPV6 Loopback Support**
## [1.0.16] - 2026-02-03
### Added
- **C# Script Execution**
- New `ExecuteCSharpScript` tool for executing arbitrary C# code at runtime using Microsoft.CodeAnalysis.CSharp.Scripting (Roslyn compiler services)
- Captures and returns Unity console logs during script execution
- Supports custom using directives and assembly references
- Enables dynamic C# code execution without requiring editor restart or recompilation
- Added bundled Roslyn assemblies: `Codely.Microsoft.CodeAnalysis.dll`, `Codely.Microsoft.CodeAnalysis.CSharp.dll`, `Codely.Microsoft.CodeAnalysis.Scripting.dll`, `Codely.Microsoft.CodeAnalysis.CSharp.Scripting.dll`
- Added supporting assemblies: `Codely.System.Collections.Immutable.dll`, `Codely.System.Reflection.Metadata.dll`, `Codely.System.Runtime.CompilerServices.Unsafe.dll`
### Fixed
- **UnityTcpBridge**
- Reverted accidental handshake string change that broke package functionality (changed from incorrect 'WELCOME UNITY-TCP 1 FRAMING=1' back to correct 'WELCOME Codely-Bridge 1 FRAMING=1')
- **Add IPV6 Loopback Support**
### Changed
- **Branding & Menu Structure**
- Renamed "Unity TCP" to "Codely Bridge" across logging and port management
- Simplified menu structure: removed redundant menu items and kept only "Window/Codely Bridge/Control Window"
- Updated menu organization for better user experience
- **CI/CD**
- Updated register_version job rules in CI pipeline
## [1.0.15] - 2026-01-29
### Changed
- **ManageScreenshot**
- Simplified screenshot API: removed redundant `capture_game_view` action; its behavior is now covered by the unified `capture` action
- `capture` action now consistently uses GameView reflection to capture what the user sees in both edit and play modes
- Removed redundant `FlipTextureVertically` call and related comments for clearer, more maintainable code
- **Package Publishing**
- Updated `.npmignore` to include `Tests/` directory in the published npm package so consumers can run and extend the test suite
### Fixed
- **Screenshot Capture**
- Fixed vertical flip of textures captured from RenderTexture so screenshots match on-screen orientation
### Test Coverage
- Updated `unity_screenshot_full_coverage.md` and `Tests/Coverage/README.md` to reflect the simplified screenshot API and current test structure
## [1.0.14] - 2026-01-22
### Changed
- **Dependency Management**
- Swapped to bundled `Codely.Newtonsoft.Json.dll` in `Plugins/` directory instead of external `Newtonsoft.Json` package
- Removed external `Newtonsoft.Json` dependency from `package.json`
- Updated all code references to use bundled Newtonsoft.Json assembly
- **Architecture**
- Moved runtime implementation code from `Runtime/` to `Editor/` scope to align with Unity usage patterns
### Added
- **Package Publishing**
- Added `.npmignore` file to exclude unwanted files from npm publication
- Excludes CI/CD configuration, build artifacts, Git metadata, IDE files, and test directories
- Ensures only essential code and documentation are published to npm registry
- **CI/CD Pipeline**
- Added automated npm pack and TOS (Tencent Object Storage) upload steps to deployment pipelines
- Added backup version (1.0.0) upload for both staging and production environments
- Improved deployment reliability with fallback version availability
## [1.0.13] - 2026-01-20
### Fixed
- **Test Assembly Dependencies**
- Fixed missing `Newtonsoft.Json.dll` reference in `UnityTcp.Editor.Tests.asmdef`
- Added `com.unity.ext.nunit` package dependency to `package.json` for proper NUnit framework support
- Ensures test assembly can properly reference required dependencies for compilation
## [1.0.12] - 2026-01-19
### Added
- **ManageGameObject**
- Added `list_children` action for listing GameObject children with configurable depth
- Support for three result modes: `auto` (default), `inline`, and `file`
- Automatic fallback to file output when hierarchy exceeds `maxInlineItems` threshold (default: 200)
- Depth-limited traversal with `depth` parameter (default: 1 for direct children)
- `includeInactive` parameter to control whether inactive GameObjects are included
- Iterative tree building to avoid stack overflow on deep hierarchies
- JSON streaming to file for large results to prevent memory issues
- New helper methods: `CountDescendantsUpToDepth`, `BuildChildrenTreeIterative`, `WriteChildrenTreeIterative`
### Enhanced
- **ManageScene**
- Improved large scene hierarchy handling (>500 GameObjects)
- Returns shallow root-only tree with hints instead of error when scene is too large
- Changed `CountGameObjectsRecursive` to use iterative traversal (stack-based) to avoid stack overflow on deep hierarchies
- Better user guidance for drilling down into large hierarchies incrementally
- **Coverage Tools**
- Added `CodelyUnityCoverageTools` class for E2E test utilities
- New `codely.generate_large_hierarchy` custom tool for quickly generating test hierarchies
- Configurable generation parameters: root name, child/grandchild prefixes, and counts
### Test Coverage
- Added `unity_large_hierarchy_e2e_coverage.md` with 152 lines of E2E test scenarios for large hierarchy handling
- Updated `unity_gameobject_full_coverage.md` with `list_children` action coverage
- Updated `unity_scene_full_coverage.md` with improved large scene handling coverage
## [1.0.11] - 2026-01-13
### Added
- **Tuanjie Editor Scene File Support**
- Added support for `.scene` file extension used by Tuanjie Editor
- Implemented extension-aware scene path handling in `ManageScene`
- Support both `.unity` (Unity Editor) and `.scene` (Tuanjie Editor) extensions based on editor type
### Enhanced
- **UnityStateDirtyHook**
- Added `.scene` extension detection for scene file change tracking
- Ensures proper state tracking for both Unity and Tuanjie editor scene files
- **Documentation**
- Improved documentation for scene file extension handling
## [1.0.10] - 2026-01-12
### Fixed
- **ManageGameObject**
- Updated default behavior for `searchInactive` parameter from `false` to `true`
- Ensures inactive GameObjects are included in search results unless explicitly specified otherwise
- **UnityEngineObjectConverter**
- Added support for `{"find":"...", "method":"..."}` reference format in object deserialization
- Fixed deserialization errors when encountering find instruction format used by MCP tools for dynamic GameObject lookups
- Implemented delegate pattern to call `ManageGameObject.FindObjectByInstruction` from Runtime assembly without direct Editor assembly reference
## [1.0.9] - 2026-01-05
### Changed
- **Unity Project Metadata**
- Updated Unity project metadata GUIDs across all .meta files
- Refreshed GUIDs in Editor, Runtime, and Tests directories
## [1.0.8] - 2025-12-16
### Enhanced
- **Compilation Tracking**
- Improved compilation error/warning count tracking with nullable integers
- Changed `CompilationHelper.GetCompilationErrors()` and `GetCompilationWarnings()` to return `int?` instead of `int`
- Updated `GetCompilationSummary()` to only include known values in result (removes misleading default 0 values)
- Enhanced compilation result handling in `ManageEditor` to properly process nullable values
- Improved type handling for compilation result payloads (supports both dictionary and anonymous object formats)
- Added clarifying comments explaining why returning 0 for unknown counts is problematic
- Better distinction between "0 errors/warnings" (validated) vs "unknown count" (not yet validated)
## [1.0.7] - 2025-12-15
### Changed
- **Package Renaming**
- Renamed package from `com.unity.codely` to `cn.tuanjie.codely.bridge`
- Updated all internal references and documentation to reflect new package name
- **Branding Update**
- Renamed all menu item paths and labels in the Unity Editor
## [1.0.6] - 2025-12-10
### Added
- **Compilation Pipeline**
- New `pipeline_kind: "compile"` field for structured hints to downstream tools
- `requires_console_validation: true` flag to guide compilation validation
- Comprehensive integration test documentation for compilation pipeline policy
- Enhanced play mode state synchronization with `playMode` field in responses
### Enhanced
- **StateComposer**
- Simplified state reporting to focus on essential information (compiling vs idle)
- Minimized state complexity with clear documentation directing users to specific diagnostic tools
- **ManageAsset**
- Improved `AssetExists` method with ghost asset detection
- New `BuildAssetNotFoundResponse` for better error messaging about desync issues
- Enhanced asset validation and error handling
- **Test Coverage**
- Added `unity_compile_pipeline_integration.md` with 152 lines of comprehensive test scenarios
- Updated `unity_editor_full_coverage.md` with compilation pipeline requirements
## [1.0.5] - 2025-12-04
### Added
- **Test Coverage**
- Added comprehensive test coverage for `ExecuteCustomTool` functionality
- UI Toolkit tools test coverage documentation and validation
### Enhanced
- **ManageUIToolkit**
- Enhanced `link_uss_to_uxml` action with GUID support
- Added `ResolveAssetPath` helper method for flexible path/GUID resolution
- Improved parameter validation for mixed path/GUID usage
- **ManageShader**
- Enhanced `ensure_material_shader_for_srp` action with `material_guid` parameter support
- Improved parameter handling for material identification via path or GUID
- Better error messages for missing material parameters
- **CodelyUnityValidationTools**
- Added nested field path support in `validate_response`
- Support for dot-notation field paths (e.g., "state.project.srp", "project.srp")
- Automatic recursive field search when direct path fails
- Enhanced field validation with path tracking and debugging
- **ManageBake**
- Refactored NavMesh operations to use runtime reflection
- Improved AI Navigation package detection and type resolution
- Better compatibility with optional AI Navigation package installation
- Enhanced error handling for missing package scenarios
## [1.0.4] - 2025-12-03
### Added
- **Validation Tools Framework**
- New `CodelyUnityValidationTools`: 15+ validation helpers for automated testing
- `codely.validate_play_mode`: Validate current editor PlayMode state
- `codely.validate_active_tool`: Validate current active editor tool
- `codely.validate_not_compiling`: Ensure editor is not compiling
- `codely.validate_tag_and_layer_exist`: Verify Tag/Layer existence
- `codely.validate_window_open`: Check editor window state
- `codely.validate_console_contains`: Validate console messages with filter
- `codely.validate_console_count`: Verify console message counts
- `codely.validate_active_scene`: Validate active scene properties
- `codely.validate_scene_dirty`: Check scene dirty state
- `codely.validate_hierarchy_root_count`: Verify hierarchy root object count
- `codely.validate_gameobject_exists`: Check GameObject existence
- `codely.validate_response`: Generic response validation
- **Compilation Pipeline**
- `CompilationHelper`: New helper class for compilation status checking and error tracking
- `start_compilation_pipeline` action in ManageEditor for standardized compile workflow
- Block compilation during play mode to prevent editor errors
- **Test Coverage Documentation**
- Complete test coverage specs for all Unity tools
- `unity_editor_full_coverage.md`: 24 actions coverage
- `unity_console_full_coverage.md`: Console operations coverage
- `unity_scene_full_coverage.md`: Scene management coverage
- `unity_gameobject_full_coverage.md`: GameObject operations coverage
- `unity_asset_full_coverage.md`: Asset management coverage
- `unity_script_full_coverage.md`: Script management coverage
- `unity_shader_full_coverage.md`: Shader operations coverage
- `unity_package_full_coverage.md`: Package manager coverage
- `unity_menu_full_coverage.md`: Menu execution coverage
### Enhanced
- **State Management**
- State delta tracking added to async operation responses
- Internal state publish tracking for write operations
- Enhanced console state tracking with `since_token` filtering
- **ManageEditor**
- Idempotent `ensure_tag` and `ensure_layer` operations
- Extended with compilation pipeline integration
- **ManageAsset**
- Enhanced robustness with better error handling
- **ManageGameObject**
- Improved serialization with `GameObjectSerializer` enhancements
- **ReadConsole**
- Enhanced filtering with `since_token` support for incremental reads
- **ExecuteCustomTool**
- Improved tool registry with better parameter validation
### Fixed
- Improved Unity version compatibility across various tools
## [1.0.3] - 2025-12-01
### Added
- **State Management System**
- `AsyncOperationTracker`: Comprehensive async operation management with progress tracking and cancellation support
- `StateComposer`: Full Unity state composition including scene, project, packages, and shaders
- `UnityStateDirtyHook`: Automatic tracking of Unity Editor state changes (hierarchy, project, selection, console)
- `WriteGuard`: Thread-safe write operation protection with main thread enforcement
- New `get_current_state` endpoint for retrieving complete Unity state snapshots
- **New Unity Tools**
- `ManageBake`: Light baking controls (start, cancel, clear, status queries)
- `ManagePackage`: Package manager operations with version pinning support (package@version syntax)
- `ManageUIToolkit`: UI Toolkit template instantiation with automatic USS/C# generation
- **Custom Tool Execution Framework**
- `ExecuteCustomTool`: Reflection-based tool discovery and execution via `[CustomTool]` attribute
- Automatic tool registry with parameter validation and error handling
- Support for custom tools without modifying CommandRegistry
- **Enhanced Existing Tools**
- `ManageEditor`: Extended with state-aware operations and full state retrieval
- `ManageGameObject`: Added find, query, parent/child operations, and component management
- `ManageAsset`: New asset import, export, and metadata operations
- `ManageScene`: Enhanced with scene creation and multi-scene management
- `ManageShader`: Expanded with shader compilation, variant queries, and global property management
- `ReadConsole`: Added scope-based console clearing and entry filtering
### Enhanced
- **Response Helpers**: New state-aware methods (`SuccessWithDelta`, `SuccessWithState`, `Conflict`) for better change tracking
- **CompilationHelper**: Improved compilation workflow handling with better async integration
- **Test Coverage**: Added unit tests for `AsyncOperationTracker`, `StateComposer`, and `WriteGuard`
## [1.0.2] - 2025-11-11
### Fixed
- **Unity Version Compatibility**: Added conditional compilation in `ManageGameObject.cs`
- Uses `FindObjectsByType` with `FindObjectsInactive` enum for Unity 2022.2+
- Falls back to `FindObjectsOfType` for Unity 2021.3 and earlier
- Resolves CS0246 error: `FindObjectsInactive` type not found on Unity 2021
- Maintains backward compatibility across Unity versions
## [1.0.1] - 2025-11-07
### Fixed
- 🐛 **Fixed build compilation error**
- Corrected assembly definition configuration for `UnityTcp.Editor.asmdef`
- Changed from platform exclusion list to explicit Editor platform inclusion
- Ensures Editor assembly only compiles in Unity Editor, not in game builds
- Resolves compilation errors during game packaging for all platforms
## [1.0.0] - 2024-12-19
### Major Refactoring
- 🔄 **Complete removal of MCP (Model Context Protocol) logic**
- Removed all MCP-specific components, tools, and protocol handling
- Eliminated MCP server integration and HTTP server components
- Removed MCP client models, configuration systems, and UI windows
### New TCP-Focused Architecture
- 🚀 **Pure TCP Socket Implementation**
- New `UnityTcpBridge` class for TCP server management
- Basic echo server implementation as starting point
- Async/await patterns for non-blocking operations
- Multi-client connection support with proper resource management
### Core TCP Features
- **Port Management**
- Automatic port discovery and allocation
- Project-specific port persistence
- Smart port conflict resolution
- Cross-platform compatibility
- **Connection Handling**
- TCP listener with automatic client acceptance
- Configurable socket options (keep-alive, timeouts)
- Graceful connection cleanup on shutdown
- Unity lifecycle integration (assembly reload, editor quit)
### Updated Components
- **Renamed Assemblies**: `UnityTcp.*` → `UnityTcp.*`
- **Updated Namespaces**: All classes moved to `UnityTcp.Editor.*` namespace
- **Simplified Helpers**: Kept only TCP-relevant utilities (PortManager, TcpLog)
- **Package Rebranding**: Updated from "Unity MCP" to "Unity TCP Bridge"
### Removed Components
- All MCP protocol handling and message processing
- MCP tool implementations (ManageScript, ManageAsset, etc.)
- MCP UI windows and editor integrations
- HTTP server and MCP server management
- Telemetry and MCP-specific logging
- Configuration builders and MCP client models
### Technical Details
- **Architecture**: Direct TCP socket server with customizable protocol handling
- **Performance**: Lightweight implementation focused on TCP networking
- **Compatibility**: Unity 2021.3+ with Newtonsoft.Json dependency
- **Protocol**: Basic TCP with welcome handshake (easily customizable)
### Migration Guide
This is a breaking change that removes all MCP functionality:
1. **Previous MCP Users**: This package no longer provides MCP integration
2. **TCP Socket Users**: Replace any `UnityTcpBridge` references with `UnityTcpBridge`
3. **Custom Protocols**: Implement your protocol logic in `HandleClientAsync` method
4. **Port Management**: Use `PortManager` for dynamic port allocation needs
### Development Notes
- Codebase reduced by ~80% by removing MCP complexity
- Focus shifted to providing a clean TCP socket foundation
- Easy to extend for custom networking protocols
- Maintains Unity Editor integration for automatic lifecycle management
## Previous Versions
Previous versions (1.x.x) included MCP (Model Context Protocol) integration which has been completely removed in this version.