diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/.codely-bridge-commit b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/.codely-bridge-commit
new file mode 100644
index 0000000..050cd6a
--- /dev/null
+++ b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/.codely-bridge-commit
@@ -0,0 +1 @@
+47f3110000c95eee5cd83c827e0f1f11585f7ae1
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/.gitattributes b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/.gitattributes
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/.gitattributes
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/.gitattributes
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/CHANGELOG.md b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/CHANGELOG.md
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/CHANGELOG.md
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/CHANGELOG.md
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/CHANGELOG.md.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/CHANGELOG.md.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/CHANGELOG.md.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/CHANGELOG.md.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/AssemblyInfo.cs b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/AssemblyInfo.cs
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/AssemblyInfo.cs
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/AssemblyInfo.cs
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/AssemblyInfo.cs.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/AssemblyInfo.cs.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/AssemblyInfo.cs.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/AssemblyInfo.cs.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/ActionRouter.cs b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/ActionRouter.cs
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/ActionRouter.cs
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/ActionRouter.cs
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/ActionRouter.cs.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/ActionRouter.cs.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/ActionRouter.cs.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/ActionRouter.cs.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/AssetListeningGuard.cs b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/AssetListeningGuard.cs
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/AssetListeningGuard.cs
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/AssetListeningGuard.cs
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/AssetListeningGuard.cs.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/AssetListeningGuard.cs.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/AssetListeningGuard.cs.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/AssetListeningGuard.cs.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/AsyncTaskRunner.cs b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/AsyncTaskRunner.cs
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/AsyncTaskRunner.cs
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/AsyncTaskRunner.cs
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/AsyncTaskRunner.cs.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/AsyncTaskRunner.cs.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/AsyncTaskRunner.cs.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/AsyncTaskRunner.cs.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/BackgroundCommandPump.cs b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/BackgroundCommandPump.cs
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/BackgroundCommandPump.cs
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/BackgroundCommandPump.cs
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/BackgroundCommandPump.cs.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/BackgroundCommandPump.cs.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/BackgroundCommandPump.cs.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/BackgroundCommandPump.cs.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/BridgeUpdateRestartPrompt.cs b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/BridgeUpdateRestartPrompt.cs
similarity index 98%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/BridgeUpdateRestartPrompt.cs
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/BridgeUpdateRestartPrompt.cs
index 6761890..411e41b 100644
--- a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/BridgeUpdateRestartPrompt.cs
+++ b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/BridgeUpdateRestartPrompt.cs
@@ -30,6 +30,8 @@ namespace UnityTcp.Editor.Helpers
static BridgeUpdateRestartPrompt()
{
+ if (EditorAutomationGuard.ShouldSkipBridgeAutoStart()) return;
+
EditorApplication.delayCall += TryShowPendingPrompt;
}
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/BridgeUpdateRestartPrompt.cs.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/BridgeUpdateRestartPrompt.cs.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/BridgeUpdateRestartPrompt.cs.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/BridgeUpdateRestartPrompt.cs.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/CommandContext.cs b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/CommandContext.cs
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/CommandContext.cs
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/CommandContext.cs
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/CommandContext.cs.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/CommandContext.cs.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/CommandContext.cs.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/CommandContext.cs.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/CompilationHelper.cs b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/CompilationHelper.cs
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/CompilationHelper.cs
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/CompilationHelper.cs
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/CompilationHelper.cs.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/CompilationHelper.cs.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/CompilationHelper.cs.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/CompilationHelper.cs.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/CoroutineRunner.cs b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/CoroutineRunner.cs
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/CoroutineRunner.cs
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/CoroutineRunner.cs
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/CoroutineRunner.cs.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/CoroutineRunner.cs.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/CoroutineRunner.cs.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/CoroutineRunner.cs.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/DetachedJobs.cs b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/DetachedJobs.cs
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/DetachedJobs.cs
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/DetachedJobs.cs
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/DetachedJobs.cs.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/DetachedJobs.cs.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/DetachedJobs.cs.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/DetachedJobs.cs.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/DialogWatcher.cs b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/DialogWatcher.cs
similarity index 99%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/DialogWatcher.cs
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/DialogWatcher.cs
index c1b1290..79a9718 100644
--- a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/DialogWatcher.cs
+++ b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/DialogWatcher.cs
@@ -113,6 +113,8 @@ namespace UnityTcp.Editor.Helpers
static DialogWatcher()
{
+ if (EditorAutomationGuard.ShouldSkipBridgeAutoStart()) return;
+
// Force main-thread-only static init NOW, on this ([InitializeOnLoad]) thread,
// before any watcher thread exists: the Windows watcher thread reads
// UnityTcpBridge.IsRunning in Notify, and if that were the bridge's first touch its
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/DialogWatcher.cs.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/DialogWatcher.cs.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/DialogWatcher.cs.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/DialogWatcher.cs.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/EditorAutomationGuard.cs b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/EditorAutomationGuard.cs
new file mode 100644
index 0000000..19a39be
--- /dev/null
+++ b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/EditorAutomationGuard.cs
@@ -0,0 +1,34 @@
+using System;
+using UnityEngine;
+using UnityEngine.Rendering;
+
+namespace UnityTcp.Editor.Helpers
+{
+ ///
+ /// Restricts bridge auto-start to the main Editor process and supported automation runs.
+ /// Set to opt in when integration tests need the bridge.
+ ///
+ internal static class EditorAutomationGuard
+ {
+ internal const string AllowBridgeInBatchEnvVar = "UNITY_TCP_ALLOW_BATCH";
+
+ internal static bool IsAutomatedEditorRun()
+ => Application.isBatchMode
+ || SystemInfo.graphicsDeviceType == GraphicsDeviceType.Null;
+
+ internal static bool ShouldSkipBridgeAutoStart()
+ => EditorProcessGuard.ShouldSkipEditorAutoStart()
+ || (IsAutomatedEditorRun()
+ && string.IsNullOrWhiteSpace(
+ Environment.GetEnvironmentVariable(AllowBridgeInBatchEnvVar)));
+
+ internal static bool ShouldSkipBridgeAutoStart(
+ bool isAssetImportWorker,
+ bool isSecondaryEditor,
+ bool isAutomatedEditorRun,
+ bool allowBridgeInBatch)
+ => isAssetImportWorker
+ || isSecondaryEditor
+ || (isAutomatedEditorRun && !allowBridgeInBatch);
+ }
+}
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/EditorAutomationGuard.cs.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/EditorAutomationGuard.cs.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/EditorAutomationGuard.cs.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/EditorAutomationGuard.cs.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/ExecPath.cs b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/ExecPath.cs
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/ExecPath.cs
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/ExecPath.cs
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/ExecPath.cs.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/ExecPath.cs.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/ExecPath.cs.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/ExecPath.cs.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/GameObjectSerializer.cs b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/GameObjectSerializer.cs
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/GameObjectSerializer.cs
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/GameObjectSerializer.cs
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/GameObjectSerializer.cs.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/GameObjectSerializer.cs.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/GameObjectSerializer.cs.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/GameObjectSerializer.cs.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/JobContext.cs b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/JobContext.cs
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/JobContext.cs
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/JobContext.cs
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/JobContext.cs.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/JobContext.cs.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/JobContext.cs.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/JobContext.cs.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/JobControl.cs b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/JobControl.cs
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/JobControl.cs
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/JobControl.cs
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/JobControl.cs.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/JobControl.cs.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/JobControl.cs.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/JobControl.cs.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/JobRegistry.cs b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/JobRegistry.cs
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/JobRegistry.cs
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/JobRegistry.cs
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/JobRegistry.cs.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/JobRegistry.cs.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/JobRegistry.cs.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/JobRegistry.cs.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/JobRunnerBase.cs b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/JobRunnerBase.cs
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/JobRunnerBase.cs
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/JobRunnerBase.cs
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/JobRunnerBase.cs.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/JobRunnerBase.cs.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/JobRunnerBase.cs.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/JobRunnerBase.cs.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/JsonCommandHelper.cs b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/JsonCommandHelper.cs
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/JsonCommandHelper.cs
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/JsonCommandHelper.cs
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/JsonCommandHelper.cs.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/JsonCommandHelper.cs.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/JsonCommandHelper.cs.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/JsonCommandHelper.cs.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/MacModalDialogScanner.cs b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/MacModalDialogScanner.cs
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/MacModalDialogScanner.cs
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/MacModalDialogScanner.cs
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/MacModalDialogScanner.cs.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/MacModalDialogScanner.cs.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/MacModalDialogScanner.cs.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/MacModalDialogScanner.cs.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/MainThreadHelper.cs b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/MainThreadHelper.cs
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/MainThreadHelper.cs
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/MainThreadHelper.cs
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/MainThreadHelper.cs.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/MainThreadHelper.cs.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/MainThreadHelper.cs.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/MainThreadHelper.cs.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/ModalDialogScanner.cs b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/ModalDialogScanner.cs
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/ModalDialogScanner.cs
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/ModalDialogScanner.cs
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/ModalDialogScanner.cs.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/ModalDialogScanner.cs.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/ModalDialogScanner.cs.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/ModalDialogScanner.cs.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/PortManager.cs b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/PortManager.cs
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/PortManager.cs
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/PortManager.cs
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/PortManager.cs.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/PortManager.cs.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/PortManager.cs.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/PortManager.cs.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/Response.cs b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/Response.cs
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/Response.cs
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/Response.cs
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/Response.cs.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/Response.cs.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/Response.cs.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/Response.cs.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/SelectionPayloadBuilder.cs b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/SelectionPayloadBuilder.cs
new file mode 100644
index 0000000..af2235d
--- /dev/null
+++ b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/SelectionPayloadBuilder.cs
@@ -0,0 +1,135 @@
+using System.Linq;
+using Codely.Newtonsoft.Json.Linq;
+using UnityEditor;
+#if UNITY_2021_2_OR_NEWER
+using UnityEditor.SceneManagement;
+#else
+using UnityEditor.Experimental.SceneManagement;
+#endif
+using UnityEngine;
+
+namespace UnityTcp.Editor.Helpers
+{
+ ///
+ /// Builds the standard Unity selection payload shared by
+ /// and
+ /// 's get_selection action,
+ /// keeping the two callers in sync without duplicating logic.
+ ///
+ public static class SelectionPayloadBuilder
+ {
+ ///
+ /// Constructs a describing the current Unity Editor selection.
+ /// The caller is responsible for wrapping the result (e.g. in
+ /// or directly broadcasting it as a notification).
+ ///
+ public static JObject Build()
+ {
+ var assetGUIDs = Selection.assetGUIDs;
+ var assetPaths = assetGUIDs?.Select(AssetDatabase.GUIDToAssetPath).ToArray();
+
+ string activeAssetPath = Selection.activeObject != null
+ ? AssetDatabase.GetAssetPath(Selection.activeObject)
+ : null;
+ string activeAsset = string.IsNullOrEmpty(activeAssetPath)
+ ? null
+ : activeAssetPath.Replace('\\', '/');
+
+ bool isSubAsset = Selection.activeObject != null
+ && AssetDatabase.IsSubAsset(Selection.activeObject);
+ string activeAssetFileId = string.IsNullOrEmpty(activeAsset)
+ ? null
+ : Selection.activeObject.FormatLocalFileId();
+ string activeAssetGuid = string.IsNullOrEmpty(activeAsset)
+ ? null
+ : Selection.activeObject.GetAssetGuid();
+
+ var activeGo = Selection.activeGameObject;
+ var goSource = activeGo != null && activeGo.scene.IsValid()
+ ? PrefabUtility.GetCorrespondingObjectFromSource(activeGo)
+ : null;
+ string sourcePrefabGuid = goSource != null
+ ? AssetDatabase.AssetPathToGUID(AssetDatabase.GetAssetPath(goSource))
+ : null;
+
+ var payload = new
+ {
+ activeObject = Selection.activeObject?.name,
+ activeObjectKind = Selection.activeObject.GetKind(),
+ activeAsset = activeAsset,
+ // Decimal string: Tuanjie fileIDs can exceed JS Number / Int32.
+ activeAssetLocalId = activeAssetFileId,
+ activeAssetGuid = activeAssetGuid,
+ activeSelectedSubAsset = isSubAsset && !string.IsNullOrEmpty(activeAssetFileId)
+ ? (object)new
+ {
+ type = Selection.activeObject.GetType().Name,
+ name = Selection.activeObject.name,
+ fileId = activeAssetFileId,
+ }
+ : null,
+ activeGameObject = activeGo?.name,
+ activeGameObjectScenePath = GetSceneOrPrefabPath(activeGo),
+ // instanceID always refers to the GameObject, never Transform/component.
+ // Decimal string: Unity 6.5 EntityId can exceed JS Number / 2^53.
+ activeInstanceID = activeGo.FormatStableInstanceId() ?? "0",
+ activeGameObjectFileId = activeGo.FormatLocalFileId(),
+ activeGameObjectGuid = activeGo.FormatGlobalObjectGuid(),
+ // Prefab instance children: fileId is the source-prefab local id,
+ // not a scene YAML id. Pair with these to grep the prefab file.
+ activeGameObjectIsPrefabInstanceChild = goSource != null,
+ activeGameObjectSourcePrefabGuid = string.IsNullOrEmpty(sourcePrefabGuid) ? null : sourcePrefabGuid,
+ activeGameObjectSourcePrefabFileId = goSource.FormatLocalFileId(),
+ activeTransform = Selection.activeTransform?.name,
+#if UNITY_2020_1_OR_NEWER
+ count = Selection.count,
+#else
+ count = Selection.objects?.Length ?? 0,
+#endif
+ objects = Selection.objects
+ .Where(obj => obj != null)
+ .Select(obj => new
+ {
+ name = obj.name,
+ type = obj.GetType().FullName,
+ instanceID = obj.FormatStableInstanceId(),
+ })
+ .ToList(),
+ gameObjects = Selection.gameObjects
+ .Where(go => go != null)
+ .Select(go => new
+ {
+ name = go.name,
+ path = go.GetHierarchyPathWithIndex(),
+ instanceID = go.FormatStableInstanceId(),
+ kind = go.GetKind(),
+ fileId = go.FormatLocalFileId(),
+ guid = go.FormatGlobalObjectGuid(),
+ componentNames = go.GetComponentTypeNames(),
+ })
+ .ToList(),
+ assetGUIDs = assetGUIDs,
+ assetPaths = assetPaths,
+ };
+
+ return JObject.FromObject(payload);
+ }
+
+ ///
+ /// Returns the scene or prefab asset path that owns ,
+ /// normalised to forward-slashes. Returns null for null input.
+ ///
+ public static string GetSceneOrPrefabPath(GameObject go)
+ {
+ if (go == null) return null;
+ if (go.scene.IsValid() && !string.IsNullOrEmpty(go.scene.path))
+ return go.scene.path.Replace('\\', '/');
+ string stagePath = InstanceIdExtensions.GetPrefabStageAssetPath(
+ PrefabStageUtility.GetPrefabStage(go));
+ if (!string.IsNullOrEmpty(stagePath))
+ return stagePath.Replace('\\', '/');
+ string assetPath = AssetDatabase.GetAssetPath(go);
+ return string.IsNullOrEmpty(assetPath) ? null : assetPath.Replace('\\', '/');
+ }
+ }
+}
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/SelectionPayloadBuilder.cs.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/SelectionPayloadBuilder.cs.meta
new file mode 100644
index 0000000..be0ebf2
--- /dev/null
+++ b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/SelectionPayloadBuilder.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 00ca19b90d0118744b3dae38cfcd149f
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/ServerPathResolver.cs b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/ServerPathResolver.cs
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/ServerPathResolver.cs
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/ServerPathResolver.cs
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/ServerPathResolver.cs.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/ServerPathResolver.cs.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/ServerPathResolver.cs.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/ServerPathResolver.cs.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/ShaderVariantApi.cs b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/ShaderVariantApi.cs
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/ShaderVariantApi.cs
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/ShaderVariantApi.cs
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/ShaderVariantApi.cs.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/ShaderVariantApi.cs.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/ShaderVariantApi.cs.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/ShaderVariantApi.cs.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/StateComposer.cs b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/StateComposer.cs
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/StateComposer.cs
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/StateComposer.cs
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/StateComposer.cs.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/StateComposer.cs.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/StateComposer.cs.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/StateComposer.cs.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/StepJob.cs b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/StepJob.cs
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/StepJob.cs
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/StepJob.cs
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/StepJob.cs.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/StepJob.cs.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/StepJob.cs.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/StepJob.cs.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/StepJobRunner.cs b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/StepJobRunner.cs
similarity index 97%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/StepJobRunner.cs
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/StepJobRunner.cs
index f379684..5f9d356 100644
--- a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/StepJobRunner.cs
+++ b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/StepJobRunner.cs
@@ -143,9 +143,22 @@ namespace UnityTcp.Editor.Helpers
// Set from any thread when state changed outside the tick (a cross-thread detach);
// consumed by Tick on the main thread, which owns persistence.
private static volatile bool _saveRequested;
+ private static bool _initialized;
static StepJobRunner()
{
+ if (EditorAutomationGuard.ShouldSkipBridgeAutoStart()) return;
+
+ EnsureInitialized();
+ }
+
+ // Main-thread only. Explicit bridge/job starts need restoration too, even
+ // when InitializeOnLoad deliberately skipped auto-start in this domain.
+ internal static void EnsureInitialized()
+ {
+ if (_initialized) return;
+ // Set before Load: a restored job's OnRestored may enroll another job.
+ _initialized = true;
Load();
// Pending markers persist but only step jobs survive the reload; retire the rest so no
// client is left polling a job that no longer exists.
@@ -171,6 +184,7 @@ namespace UnityTcp.Editor.Helpers
bool detached = false)
{
if (job == null) throw new ArgumentNullException(nameof(job));
+ EnsureInitialized();
var ctx = new JobContext(requestId, name, detached);
var entry = new Entry
@@ -490,9 +504,8 @@ namespace UnityTcp.Editor.Helpers
{
Save();
_entries.Clear();
- Load();
- DetachedJobs.ReconcilePending(
- _entries.Where(e => e.Detached).Select(e => e.JobId).ToList());
+ _initialized = false;
+ EnsureInitialized();
}
private static void Load()
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/StepJobRunner.cs.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/StepJobRunner.cs.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/StepJobRunner.cs.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/StepJobRunner.cs.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/TelemetryHelper.cs b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/TelemetryHelper.cs
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/TelemetryHelper.cs
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/TelemetryHelper.cs
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/TelemetryHelper.cs.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/TelemetryHelper.cs.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/TelemetryHelper.cs.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/TelemetryHelper.cs.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/UnityStateDirtyHook.cs b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/UnityStateDirtyHook.cs
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/UnityStateDirtyHook.cs
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/UnityStateDirtyHook.cs
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/UnityStateDirtyHook.cs.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/UnityStateDirtyHook.cs.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/UnityStateDirtyHook.cs.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/UnityStateDirtyHook.cs.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/Vector3Helper.cs b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/Vector3Helper.cs
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/Vector3Helper.cs
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/Vector3Helper.cs
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/Vector3Helper.cs.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/Vector3Helper.cs.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/Vector3Helper.cs.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/Vector3Helper.cs.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/Win32ModalDialogScanner.cs b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/Win32ModalDialogScanner.cs
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/Win32ModalDialogScanner.cs
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/Win32ModalDialogScanner.cs
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/Win32ModalDialogScanner.cs.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/Win32ModalDialogScanner.cs.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/Win32ModalDialogScanner.cs.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/Win32ModalDialogScanner.cs.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/WriteGuard.cs b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/WriteGuard.cs
similarity index 97%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/WriteGuard.cs
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/WriteGuard.cs
index 6e6f8c3..dd386e0 100644
--- a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/WriteGuard.cs
+++ b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/WriteGuard.cs
@@ -55,24 +55,17 @@ namespace UnityTcp.Editor.Helpers
"create",
"modify",
"delete",
- "add_component",
"remove_component",
"set_component_property"
},
["manage_asset"] = new HashSet(StringComparer.OrdinalIgnoreCase)
{
- "import",
"ensure_prefab_variant",
"create",
- "modify",
- "delete",
- "duplicate",
- "move"
+ "modify"
},
["manage_scene"] = new HashSet(StringComparer.OrdinalIgnoreCase)
{
- "ensure_scene_open",
- "ensure_scene_saved",
"create",
"load",
"save"
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/WriteGuard.cs.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/WriteGuard.cs.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Helpers/WriteGuard.cs.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Helpers/WriteGuard.cs.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Icons.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Icons.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Icons.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Icons.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/EditorBusyProxy.cs b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/EditorBusyProxy.cs
new file mode 100644
index 0000000..f3e31e2
--- /dev/null
+++ b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/EditorBusyProxy.cs
@@ -0,0 +1,16 @@
+namespace UnityTcp.Editor.Native
+{
+ // Managed code only enables the feature; native window probes decide when to show.
+ internal static class EditorBusyProxy
+ {
+ internal const bool BusyWindowEnabled = true;
+
+ internal static void Refresh()
+ {
+#if UNITY_EDITOR_WIN
+ try { NativeUnityTcpBridgeAPI.NTB_SetEditorBusyProxyEnabled?.Invoke(BusyWindowEnabled ? 1 : 0); }
+ catch { /* Optional UI must not interrupt bridge startup. */ }
+#endif
+ }
+ }
+}
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/EditorBusyProxy.cs.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/EditorBusyProxy.cs.meta
new file mode 100644
index 0000000..0b8baf8
--- /dev/null
+++ b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/EditorBusyProxy.cs.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: ff8b1598a9bb4fbd8067e7245bc1f68d
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/NativeDllLoader.cs b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/NativeDllLoader.cs
similarity index 95%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/NativeDllLoader.cs
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/NativeDllLoader.cs
index c4aef90..ef3d281 100644
--- a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/NativeDllLoader.cs
+++ b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/NativeDllLoader.cs
@@ -169,6 +169,13 @@ namespace UnityTcp.Editor.Native
static NativeDllLoader()
{
+ if (EditorAutomationGuard.ShouldSkipBridgeAutoStart()) return;
+
+ RegisterCleanupHandlers();
+ }
+
+ private static void RegisterCleanupHandlers()
+ {
#if UNITY_2020_1_OR_NEWER
UnityEditor.PackageManager.Events.registeringPackages -= OnPackagesRegistering;
UnityEditor.PackageManager.Events.registeringPackages += OnPackagesRegistering;
@@ -264,6 +271,8 @@ namespace UnityTcp.Editor.Native
private static void RegisterLogCallback()
{
if (!IsLoaded) return;
+ // Explicit starts need cleanup too, even when bridge auto-start is disabled.
+ RegisterCleanupHandlers();
try
{
_logCallback = (level, message) =>
@@ -351,6 +360,8 @@ namespace UnityTcp.Editor.Native
{
if (_handle == IntPtr.Zero) return;
OnUnload?.Invoke(reason);
+ // Stop/join native workers even when no managed bridge subscribed to OnUnload.
+ NativeUnityTcpBridgeHost.StopServer(reason);
UnregisterLogCallback();
PlatformFree(_handle);
_handle = IntPtr.Zero;
@@ -369,6 +380,7 @@ namespace UnityTcp.Editor.Native
NativeUnityTcpBridgeAPI.NTB_ResumeManagedCommandProcessing = null;
NativeUnityTcpBridgeAPI.NTB_NotifyAll = null;
NativeUnityTcpBridgeAPI.NTB_SetStreamPort = null;
+ NativeUnityTcpBridgeAPI.NTB_SetEditorBusyProxyEnabled = null;
SetLogCallback = null;
SessionState.EraseString(HandleKey);
}
@@ -405,7 +417,7 @@ namespace UnityTcp.Editor.Native
{
if (!CheckAbiVersion()) return false;
- return
+ bool resolved =
Resolve("NTB_StartBridge", ref NativeUnityTcpBridgeAPI.NTB_StartBridge) &&
Resolve("NTB_StopWithReason", ref NativeUnityTcpBridgeAPI.NTB_StopWithReason) &&
Resolve("NTB_Stop", ref NativeUnityTcpBridgeAPI.NTB_Stop) &&
@@ -421,6 +433,13 @@ namespace UnityTcp.Editor.Native
Resolve("NTB_NotifyAll", ref NativeUnityTcpBridgeAPI.NTB_NotifyAll) &&
Resolve("NTB_SetStreamPort", ref NativeUnityTcpBridgeAPI.NTB_SetStreamPort) &&
Resolve("Log_SetCallback", ref SetLogCallback);
+ if (!resolved) return false;
+
+#if UNITY_EDITOR_WIN
+ // The busy-Editor proxy is optional; failure to bind it must not disable commands.
+ ResolveOptional("NTB_SetEditorBusyProxyEnabled", ref NativeUnityTcpBridgeAPI.NTB_SetEditorBusyProxyEnabled);
+#endif
+ return true;
}
private static bool CheckAbiVersion()
@@ -464,6 +483,14 @@ namespace UnityTcp.Editor.Native
return true;
}
+#if UNITY_EDITOR_WIN
+ private static void ResolveOptional(string symbol, ref T del) where T : Delegate
+ {
+ IntPtr ptr = GetProcAddress(_handle, symbol);
+ del = ptr == IntPtr.Zero ? null : Marshal.GetDelegateForFunctionPointer(ptr);
+ }
+#endif
+
private static string PluginPathUnder(string packageRoot)
{
if (string.IsNullOrEmpty(packageRoot)) return null;
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/NativeDllLoader.cs.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/NativeDllLoader.cs.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/NativeDllLoader.cs.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/NativeDllLoader.cs.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/NativeUnityTcpBridgeAPI.cs b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/NativeUnityTcpBridgeAPI.cs
similarity index 95%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/NativeUnityTcpBridgeAPI.cs
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/NativeUnityTcpBridgeAPI.cs
index dceab08..6363892 100644
--- a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/NativeUnityTcpBridgeAPI.cs
+++ b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/NativeUnityTcpBridgeAPI.cs
@@ -61,6 +61,9 @@ namespace UnityTcp.Editor.Native
// NTB_StartBridge — safe to call at any time.
internal delegate void SetStreamPortDelegate(int streamPort);
+ // Optional Windows busy-Editor proxy; unavailable UI must not block commands.
+ internal delegate void SetEditorBusyProxyEnabledDelegate(int enabled);
+
internal static GetAbiVersionDelegate NTB_GetAbiVersion;
internal static StartBridgeDelegate NTB_StartBridge;
internal static StopDelegate NTB_Stop;
@@ -76,6 +79,7 @@ namespace UnityTcp.Editor.Native
internal static ResumeManagedCommandProcessingDelegate NTB_ResumeManagedCommandProcessing;
internal static NotifyAllDelegate NTB_NotifyAll;
internal static SetStreamPortDelegate NTB_SetStreamPort;
+ internal static SetEditorBusyProxyEnabledDelegate NTB_SetEditorBusyProxyEnabled;
#endif
}
}
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/NativeUnityTcpBridgeAPI.cs.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/NativeUnityTcpBridgeAPI.cs.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/NativeUnityTcpBridgeAPI.cs.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/NativeUnityTcpBridgeAPI.cs.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/NativeUnityTcpBridgeHost.cs b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/NativeUnityTcpBridgeHost.cs
similarity index 99%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/NativeUnityTcpBridgeHost.cs
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/NativeUnityTcpBridgeHost.cs
index ef72f6f..868b8bf 100644
--- a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/NativeUnityTcpBridgeHost.cs
+++ b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/NativeUnityTcpBridgeHost.cs
@@ -52,6 +52,7 @@ namespace UnityTcp.Editor.Native
try
{
#if UNITY_EDITOR_WIN || UNITY_EDITOR_OSX || UNITY_EDITOR_LINUX
+ EditorBusyProxy.Refresh();
// After a domain reload the managed side restarts but the native server
// remains bound to its existing port. Probe first so we attach to the
// existing listener instead of relying solely on NTB_StartBridge's idempotency.
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/NativeUnityTcpBridgeHost.cs.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/NativeUnityTcpBridgeHost.cs.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/NativeUnityTcpBridgeHost.cs.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/NativeUnityTcpBridgeHost.cs.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/NativeWindowBridgeAPI.cs b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/NativeWindowBridgeAPI.cs
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/NativeWindowBridgeAPI.cs
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/NativeWindowBridgeAPI.cs
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/NativeWindowBridgeAPI.cs.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/NativeWindowBridgeAPI.cs.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/NativeWindowBridgeAPI.cs.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/NativeWindowBridgeAPI.cs.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/NativeWindowBridgeHost.AddComponent.cs b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/NativeWindowBridgeHost.AddComponent.cs
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/NativeWindowBridgeHost.AddComponent.cs
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/NativeWindowBridgeHost.AddComponent.cs
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/NativeWindowBridgeHost.AddComponent.cs.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/NativeWindowBridgeHost.AddComponent.cs.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/NativeWindowBridgeHost.AddComponent.cs.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/NativeWindowBridgeHost.AddComponent.cs.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/NativeWindowBridgeHost.AdvancedDropdownPopup.cs b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/NativeWindowBridgeHost.AdvancedDropdownPopup.cs
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/NativeWindowBridgeHost.AdvancedDropdownPopup.cs
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/NativeWindowBridgeHost.AdvancedDropdownPopup.cs
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/NativeWindowBridgeHost.AdvancedDropdownPopup.cs.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/NativeWindowBridgeHost.AdvancedDropdownPopup.cs.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/NativeWindowBridgeHost.AdvancedDropdownPopup.cs.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/NativeWindowBridgeHost.AdvancedDropdownPopup.cs.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/NativeWindowBridgeHost.Composite.cs b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/NativeWindowBridgeHost.Composite.cs
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/NativeWindowBridgeHost.Composite.cs
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/NativeWindowBridgeHost.Composite.cs
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/NativeWindowBridgeHost.Composite.cs.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/NativeWindowBridgeHost.Composite.cs.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/NativeWindowBridgeHost.Composite.cs.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/NativeWindowBridgeHost.Composite.cs.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/NativeWindowBridgeHost.Cursor.cs b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/NativeWindowBridgeHost.Cursor.cs
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/NativeWindowBridgeHost.Cursor.cs
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/NativeWindowBridgeHost.Cursor.cs
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/NativeWindowBridgeHost.Cursor.cs.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/NativeWindowBridgeHost.Cursor.cs.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/NativeWindowBridgeHost.Cursor.cs.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/NativeWindowBridgeHost.Cursor.cs.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/NativeWindowBridgeHost.DragAndDrop.cs b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/NativeWindowBridgeHost.DragAndDrop.cs
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/NativeWindowBridgeHost.DragAndDrop.cs
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/NativeWindowBridgeHost.DragAndDrop.cs
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/NativeWindowBridgeHost.DragAndDrop.cs.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/NativeWindowBridgeHost.DragAndDrop.cs.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/NativeWindowBridgeHost.DragAndDrop.cs.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/NativeWindowBridgeHost.DragAndDrop.cs.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/NativeWindowBridgeHost.IconSelector.cs b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/NativeWindowBridgeHost.IconSelector.cs
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/NativeWindowBridgeHost.IconSelector.cs
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/NativeWindowBridgeHost.IconSelector.cs
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/NativeWindowBridgeHost.IconSelector.cs.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/NativeWindowBridgeHost.IconSelector.cs.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/NativeWindowBridgeHost.IconSelector.cs.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/NativeWindowBridgeHost.IconSelector.cs.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/NativeWindowBridgeHost.Json.cs b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/NativeWindowBridgeHost.Json.cs
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/NativeWindowBridgeHost.Json.cs
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/NativeWindowBridgeHost.Json.cs
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/NativeWindowBridgeHost.Json.cs.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/NativeWindowBridgeHost.Json.cs.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/NativeWindowBridgeHost.Json.cs.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/NativeWindowBridgeHost.Json.cs.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/NativeWindowBridgeHost.NewInputSystem.cs b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/NativeWindowBridgeHost.NewInputSystem.cs
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/NativeWindowBridgeHost.NewInputSystem.cs
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/NativeWindowBridgeHost.NewInputSystem.cs
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/NativeWindowBridgeHost.NewInputSystem.cs.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/NativeWindowBridgeHost.NewInputSystem.cs.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/NativeWindowBridgeHost.NewInputSystem.cs.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/NativeWindowBridgeHost.NewInputSystem.cs.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/NativeWindowBridgeHost.ObjectSelector.cs b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/NativeWindowBridgeHost.ObjectSelector.cs
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/NativeWindowBridgeHost.ObjectSelector.cs
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/NativeWindowBridgeHost.ObjectSelector.cs
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/NativeWindowBridgeHost.ObjectSelector.cs.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/NativeWindowBridgeHost.ObjectSelector.cs.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/NativeWindowBridgeHost.ObjectSelector.cs.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/NativeWindowBridgeHost.ObjectSelector.cs.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/NativeWindowBridgeHost.PaneOptions.cs b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/NativeWindowBridgeHost.PaneOptions.cs
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/NativeWindowBridgeHost.PaneOptions.cs
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/NativeWindowBridgeHost.PaneOptions.cs
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/NativeWindowBridgeHost.PaneOptions.cs.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/NativeWindowBridgeHost.PaneOptions.cs.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/NativeWindowBridgeHost.PaneOptions.cs.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/NativeWindowBridgeHost.PaneOptions.cs.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/NativeWindowBridgeHost.Panel.cs b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/NativeWindowBridgeHost.Panel.cs
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/NativeWindowBridgeHost.Panel.cs
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/NativeWindowBridgeHost.Panel.cs
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/NativeWindowBridgeHost.Panel.cs.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/NativeWindowBridgeHost.Panel.cs.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/NativeWindowBridgeHost.Panel.cs.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/NativeWindowBridgeHost.Panel.cs.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/NativeWindowBridgeHost.PopupDock.cs b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/NativeWindowBridgeHost.PopupDock.cs
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/NativeWindowBridgeHost.PopupDock.cs
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/NativeWindowBridgeHost.PopupDock.cs
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/NativeWindowBridgeHost.PopupDock.cs.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/NativeWindowBridgeHost.PopupDock.cs.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/NativeWindowBridgeHost.PopupDock.cs.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/NativeWindowBridgeHost.PopupDock.cs.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/NativeWindowBridgeHost.PopupMenu.cs b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/NativeWindowBridgeHost.PopupMenu.cs
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/NativeWindowBridgeHost.PopupMenu.cs
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/NativeWindowBridgeHost.PopupMenu.cs
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/NativeWindowBridgeHost.PopupMenu.cs.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/NativeWindowBridgeHost.PopupMenu.cs.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/NativeWindowBridgeHost.PopupMenu.cs.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/NativeWindowBridgeHost.PopupMenu.cs.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/NativeWindowBridgeHost.TabDrag.cs b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/NativeWindowBridgeHost.TabDrag.cs
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/NativeWindowBridgeHost.TabDrag.cs
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/NativeWindowBridgeHost.TabDrag.cs
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/NativeWindowBridgeHost.TabDrag.cs.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/NativeWindowBridgeHost.TabDrag.cs.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/NativeWindowBridgeHost.TabDrag.cs.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/NativeWindowBridgeHost.TabDrag.cs.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/NativeWindowBridgeHost.cs b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/NativeWindowBridgeHost.cs
similarity index 99%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/NativeWindowBridgeHost.cs
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/NativeWindowBridgeHost.cs
index 39e894f..b00e9cc 100644
--- a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/NativeWindowBridgeHost.cs
+++ b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/NativeWindowBridgeHost.cs
@@ -68,11 +68,9 @@ namespace UnityTcp.Editor.Native
[UnityEditor.InitializeOnLoadMethod]
private static void OnDomainReload()
{
- // Register cleanup handler for the NEXT domain reload so we can null the
- // native log callback before C# delegates are garbage-collected. Without
- // this the old DLL instance's background threads would call a dangling
- // function pointer and crash.
- AssemblyReloadEvents.beforeAssemblyReload += OnBeforeAssemblyReload;
+ if (EditorAutomationGuard.ShouldSkipBridgeAutoStart()) return;
+
+ EnsureReloadCleanupRegistered();
// Listen for play mode changes to force-repaint GameView immediately
// after exiting play mode, preventing a multi-second frame stall.
@@ -233,6 +231,28 @@ namespace UnityTcp.Editor.Native
private static void OnBeforeAssemblyReload()
{
+#if UNITY_EDITOR_WIN || UNITY_EDITOR_OSX
+ try
+ {
+ CleanupBeforeAssemblyReload();
+ }
+ finally
+ {
+ // Window cleanup must not prevent releasing the native callback.
+ // Clear native first; keep the delegate rooted if that call fails.
+ try
+ {
+ NativeWindowBridgeAPI.NWB_SetLogCallback(null);
+ s_NativeLogCallbackRegistered = false;
+ s_NativeLogCallback = null;
+ }
+ catch (Exception) { }
+ }
+#endif
+ }
+
+ private static void CleanupBeforeAssemblyReload()
+ {
#if UNITY_EDITOR_WIN || UNITY_EDITOR_OSX
// Notify browser that domain reload is imminent
SendDataChannelMessage("{\"type\":\"domain_reload\"}");
@@ -296,16 +316,6 @@ namespace UnityTcp.Editor.Native
s_OffscreenActive = false;
s_OffscreenLoopRegistered = false;
- // Null the log callback — this is the ONLY C# delegate the native
- // side holds. NWB_SetLogCallback is an atomic store, never blocks.
- try
- {
- NativeWindowBridgeAPI.NWB_SetLogCallback(null);
- s_NativeLogCallbackRegistered = false;
- s_NativeLogCallback = null;
- }
- catch (Exception) { }
-
// NOTE: Do NOT call NWB_StopServer or NWB_StopCapture here.
// The native singleton keeps the HTTP server, WebRTC session,
// and offscreen mode alive across domain reload. Benefits:
@@ -1013,6 +1023,9 @@ namespace UnityTcp.Editor.Native
private static void RegisterNativeLogCallback()
{
#if UNITY_EDITOR_WIN || UNITY_EDITOR_OSX
+ // Install cleanup before handing any delegate to native, including
+ // explicit starts where OnDomainReload was skipped by the guard.
+ EnsureReloadCleanupRegistered();
if (s_NativeLogCallbackRegistered) return;
try
{
@@ -1032,6 +1045,12 @@ namespace UnityTcp.Editor.Native
#endif
}
+ private static void EnsureReloadCleanupRegistered()
+ {
+ AssemblyReloadEvents.beforeAssemblyReload -= OnBeforeAssemblyReload;
+ AssemblyReloadEvents.beforeAssemblyReload += OnBeforeAssemblyReload;
+ }
+
///
/// Register EditorApplication.update polling for offscreen capture requests.
///
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/NativeWindowBridgeHost.cs.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/NativeWindowBridgeHost.cs.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/NativeWindowBridgeHost.cs.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/NativeWindowBridgeHost.cs.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/StreamingMaskWindow.cs b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/StreamingMaskWindow.cs
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/StreamingMaskWindow.cs
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/StreamingMaskWindow.cs
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/StreamingMaskWindow.cs.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/StreamingMaskWindow.cs.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Native/StreamingMaskWindow.cs.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Native/StreamingMaskWindow.cs.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Notifier.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Notifier.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Notifier.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Notifier.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Notifier/AgentInputNotifier.cs b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Notifier/AgentInputNotifier.cs
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Notifier/AgentInputNotifier.cs
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Notifier/AgentInputNotifier.cs
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Notifier/AgentInputNotifier.cs.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Notifier/AgentInputNotifier.cs.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Notifier/AgentInputNotifier.cs.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Notifier/AgentInputNotifier.cs.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Notifier/ConsoleLogChangedNotifier.cs b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Notifier/ConsoleLogChangedNotifier.cs
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Notifier/ConsoleLogChangedNotifier.cs
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Notifier/ConsoleLogChangedNotifier.cs
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Notifier/ConsoleLogChangedNotifier.cs.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Notifier/ConsoleLogChangedNotifier.cs.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Notifier/ConsoleLogChangedNotifier.cs.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Notifier/ConsoleLogChangedNotifier.cs.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Notifier/SceneHierarchyNotifier.cs b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Notifier/SceneHierarchyNotifier.cs
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Notifier/SceneHierarchyNotifier.cs
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Notifier/SceneHierarchyNotifier.cs
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Notifier/SceneHierarchyNotifier.cs.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Notifier/SceneHierarchyNotifier.cs.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Notifier/SceneHierarchyNotifier.cs.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Notifier/SceneHierarchyNotifier.cs.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Notifier/SelectionChangedNotifier.cs b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Notifier/SelectionChangedNotifier.cs
new file mode 100644
index 0000000..b0500f2
--- /dev/null
+++ b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Notifier/SelectionChangedNotifier.cs
@@ -0,0 +1,57 @@
+using System;
+using Codely.Newtonsoft.Json.Linq;
+using UnityEditor;
+using UnityTcp.Editor.Helpers;
+
+namespace UnityTcp.Editor.Notifier
+{
+ ///
+ /// Broadcasts the current Editor selection to notifier clients whenever it
+ /// changes. The emitted payload mirrors the structure returned by
+ /// 's get_selection action.
+ ///
+ [InitializeOnLoad]
+ public static class SelectionChangedNotifier
+ {
+ private const string EventType = "selection_changed";
+
+ private static bool _flushScheduled;
+
+ static SelectionChangedNotifier()
+ {
+ if (EditorAutomationGuard.ShouldSkipBridgeAutoStart()) return;
+
+ Selection.selectionChanged += OnSelectionChanged;
+ }
+
+ private static void OnSelectionChanged() => ScheduleFlush();
+
+ private static void ScheduleFlush()
+ {
+ if (_flushScheduled) return;
+ _flushScheduled = true;
+ EditorApplication.delayCall += Flush;
+ }
+
+ private static void Flush()
+ {
+ _flushScheduled = false;
+ try
+ {
+ if (!UnityTcpBridge.IsRunning) return;
+
+ JObject payload = BuildSelectionPayload();
+ if (payload == null) return;
+
+ UnityTcpBridge.NotifyAll(EventType, payload);
+ }
+ catch (Exception e)
+ {
+ try { CodelyLogger.LogError($"[SelectionChangedNotifier] flush failed: {e.Message}"); } catch { }
+ }
+ }
+
+ private static JObject BuildSelectionPayload() => SelectionPayloadBuilder.Build();
+
+ }
+}
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Notifier/SelectionChangedNotifier.cs.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Notifier/SelectionChangedNotifier.cs.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Notifier/SelectionChangedNotifier.cs.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Notifier/SelectionChangedNotifier.cs.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Serialization.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Serialization.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Serialization.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Serialization.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Serialization/UnityTypeConverters.cs b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Serialization/UnityTypeConverters.cs
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Serialization/UnityTypeConverters.cs
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Serialization/UnityTypeConverters.cs
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Serialization/UnityTypeConverters.cs.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Serialization/UnityTypeConverters.cs.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Serialization/UnityTypeConverters.cs.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Serialization/UnityTypeConverters.cs.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Tools.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Tools.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Tools.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Tools.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Tools/ExecuteCSharpScript.cs b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Tools/ExecuteCSharpScript.cs
similarity index 99%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Tools/ExecuteCSharpScript.cs
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Tools/ExecuteCSharpScript.cs
index f05d81a..13fac55 100644
--- a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Tools/ExecuteCSharpScript.cs
+++ b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Tools/ExecuteCSharpScript.cs
@@ -1694,8 +1694,7 @@ namespace UnityTcp.Editor.Tools
// Builds the response returned for a successfully executed one-shot script — whether it
// completed synchronously or (via ScheduleTask/ScheduleCoroutine) on a later frame. `stopwatch`
// was started when the command came in, so elapsed_ms is the real end-to-end time either way.
- // Only the one-shot path reaches this (HandleSessionExecution builds its own response), so
- // session_status is always "oneshot" here.
+ // Only the one-shot path reaches this (HandleSessionExecution builds its own response).
static object BuildScriptSuccessResponse(object result, List logs,
System.Diagnostics.Stopwatch stopwatch, object recordingResponse = null)
{
@@ -1703,9 +1702,7 @@ namespace UnityTcp.Editor.Tools
var data = new Dictionary
{
{ "result", formatted },
- { "return_type", SafeTypeName(result) },
{ "elapsed_ms", stopwatch.ElapsedMilliseconds },
- { "session_status", "oneshot" },
{ "logs", logs },
{ "log_count", logs.Count },
};
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Tools/ExecuteCSharpScript.cs.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Tools/ExecuteCSharpScript.cs.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Tools/ExecuteCSharpScript.cs.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Tools/ExecuteCSharpScript.cs.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Tools/ExecuteCustomTool.cs b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Tools/ExecuteCustomTool.cs
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Tools/ExecuteCustomTool.cs
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Tools/ExecuteCustomTool.cs
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Tools/ExecuteCustomTool.cs.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Tools/ExecuteCustomTool.cs.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Tools/ExecuteCustomTool.cs.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Tools/ExecuteCustomTool.cs.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Tools/ExecuteMenuItem.cs b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Tools/ExecuteMenuItem.cs
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Tools/ExecuteMenuItem.cs
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Tools/ExecuteMenuItem.cs
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Tools/ExecuteMenuItem.cs.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Tools/ExecuteMenuItem.cs.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Tools/ExecuteMenuItem.cs.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Tools/ExecuteMenuItem.cs.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Tools/ExecuteScriptCommand.cs b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Tools/ExecuteScriptCommand.cs
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Tools/ExecuteScriptCommand.cs
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Tools/ExecuteScriptCommand.cs
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Tools/ExecuteScriptCommand.cs.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Tools/ExecuteScriptCommand.cs.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Tools/ExecuteScriptCommand.cs.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Tools/ExecuteScriptCommand.cs.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Tools/Jobs.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Tools/Jobs.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Tools/Jobs.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Tools/Jobs.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Tools/Jobs/EditorStepJobs.cs b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Tools/Jobs/EditorStepJobs.cs
similarity index 98%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Tools/Jobs/EditorStepJobs.cs
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Tools/Jobs/EditorStepJobs.cs
index 94d3d40..ff8d524 100644
--- a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Tools/Jobs/EditorStepJobs.cs
+++ b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Tools/Jobs/EditorStepJobs.cs
@@ -52,9 +52,10 @@ namespace UnityTcp.Editor.Tools.Jobs
{
["status"] = "completed",
["pipeline_kind"] = "compile",
- // Default pipeline calls include the complete post-compile console, so callers no
- // longer need a second unity_console.get. If inclusion was explicitly disabled or
- // the internal read failed, retain the compatibility hint for a manual fallback.
+ // Default pipeline calls include the effective post-compile Console view and
+ // report whether Collapse is active, so callers no longer need a second
+ // unity_console.get. If inclusion was explicitly disabled or the internal read
+ // failed, retain the compatibility hint for a manual fallback.
["requires_console_validation"] = !consoleReadSucceeded,
["console"] = console,
// False means compilation never started while we watched. The counts below are then
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Tools/Jobs/EditorStepJobs.cs.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Tools/Jobs/EditorStepJobs.cs.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Tools/Jobs/EditorStepJobs.cs.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Tools/Jobs/EditorStepJobs.cs.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Tools/Jobs/PackageStepJobs.cs b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Tools/Jobs/PackageStepJobs.cs
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Tools/Jobs/PackageStepJobs.cs
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Tools/Jobs/PackageStepJobs.cs
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Tools/Jobs/PackageStepJobs.cs.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Tools/Jobs/PackageStepJobs.cs.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Tools/Jobs/PackageStepJobs.cs.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Tools/Jobs/PackageStepJobs.cs.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Tools/ManageAsset.cs b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Tools/ManageAsset.cs
similarity index 89%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Tools/ManageAsset.cs
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Tools/ManageAsset.cs
index 23b8e16..5d5d2dd 100644
--- a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Tools/ManageAsset.cs
+++ b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Tools/ManageAsset.cs
@@ -31,12 +31,8 @@ namespace UnityTcp.Editor.Tools
new Dictionary>
{
{ "ensure_prefab_variant", EnsurePrefabVariant },
- { "import", p => ReimportAsset(p["path"]?.ToString(), p["properties"] as JObject) },
{ "create", CreateAsset },
{ "modify", p => ModifyAsset(p["path"]?.ToString(), p["properties"] as JObject) },
- { "delete", p => DeleteAsset(p["path"]?.ToString()) },
- { "duplicate", p => DuplicateAsset(p["path"]?.ToString(), p["destination"]?.ToString()) },
- { "move", p => MoveOrRenameAsset(p["path"]?.ToString(), p["destination"]?.ToString()) },
{ "search", SearchAssets },
{ "get_info", p => GetAssetInfo(
p["path"]?.ToString(),
@@ -97,35 +93,6 @@ namespace UnityTcp.Editor.Tools
// --- Action Implementations ---
- private static object ReimportAsset(string path, JObject properties)
- {
- if (string.IsNullOrEmpty(path))
- return Response.Error("'path' is required for reimport.");
- if (!TryResolveAssetPath(path, out string fullPath, out var pathError))
- return pathError;
- bool ghostDesync;
- if (!AssetExists(fullPath, out ghostDesync))
- return BuildAssetNotFoundResponse($"Asset not found at path: {fullPath}", fullPath, ghostDesync);
-
- try
- {
- if (properties != null && properties.HasValues)
- {
- return Response.Error(
- "Modifying importer properties is not supported. Call import without properties to force reimport."
- );
- }
-
- AssetDatabase.ImportAsset(fullPath, ImportAssetOptions.ForceUpdate);
- // AssetDatabase.Refresh(); // Usually ImportAsset handles refresh
- return Response.Success($"Asset '{fullPath}' reimported.", GetAssetData(fullPath));
- }
- catch (Exception e)
- {
- return Response.Error($"Failed to reimport asset '{fullPath}': {e.Message}");
- }
- }
-
private static object CreateAsset(JObject @params)
{
string path = @params["path"]?.ToString();
@@ -518,146 +485,6 @@ namespace UnityTcp.Editor.Tools
}
}
- private static object DeleteAsset(string path)
- {
- if (string.IsNullOrEmpty(path))
- return Response.Error("'path' is required for delete.");
- if (!TryResolveAssetPath(path, out string fullPath, out var pathError))
- return pathError;
- bool ghostDesync;
- if (!AssetExists(fullPath, out ghostDesync))
- return BuildAssetNotFoundResponse($"Asset not found at path: {fullPath}", fullPath, ghostDesync);
-
- try
- {
- bool success = AssetDatabase.DeleteAsset(fullPath);
- if (success)
- {
- // AssetDatabase.Refresh(); // DeleteAsset usually handles refresh
- return Response.Success($"Asset '{fullPath}' deleted successfully.");
- }
- else
- {
- // This might happen if the file couldn't be deleted (e.g., locked)
- return Response.Error(
- $"Failed to delete asset '{fullPath}'. Check logs or if the file is locked."
- );
- }
- }
- catch (Exception e)
- {
- return Response.Error($"Error deleting asset '{fullPath}': {e.Message}");
- }
- }
-
- private static object DuplicateAsset(string path, string destinationPath)
- {
- if (string.IsNullOrEmpty(path))
- return Response.Error("'path' is required for duplicate.");
-
- if (!TryResolveAssetPath(path, out string sourcePath, out var sourceError))
- return sourceError;
- bool ghostDesync;
- if (!AssetExists(sourcePath, out ghostDesync))
- return BuildAssetNotFoundResponse($"Source asset not found at path: {sourcePath}", sourcePath, ghostDesync);
-
- string destPath;
- if (string.IsNullOrEmpty(destinationPath))
- {
- // Generate a unique path if destination is not provided
- destPath = AssetDatabase.GenerateUniqueAssetPath(sourcePath);
- }
- else
- {
- if (!TryResolveAssetPath(destinationPath, out destPath, out var destError))
- return destError;
- if (AssetExists(destPath))
- return Response.Error($"Asset already exists at destination path: {destPath}");
- // Ensure destination directory exists
- EnsureDirectoryExists(Path.GetDirectoryName(destPath));
- }
-
- try
- {
- bool success = AssetDatabase.CopyAsset(sourcePath, destPath);
- if (success)
- {
- // AssetDatabase.Refresh();
- return Response.Success(
- $"Asset '{sourcePath}' duplicated to '{destPath}'.",
- GetAssetData(destPath)
- );
- }
- else
- {
- return Response.Error(
- $"Failed to duplicate asset from '{sourcePath}' to '{destPath}'."
- );
- }
- }
- catch (Exception e)
- {
- return Response.Error($"Error duplicating asset '{sourcePath}': {e.Message}");
- }
- }
-
- private static object MoveOrRenameAsset(string path, string destinationPath)
- {
- if (string.IsNullOrEmpty(path))
- return Response.Error("'path' is required for move/rename.");
- if (string.IsNullOrEmpty(destinationPath))
- return Response.Error("'destination' path is required for move/rename.");
-
- if (!TryResolveAssetPath(path, out string sourcePath, out var sourceError))
- return sourceError;
- if (!TryResolveAssetPath(destinationPath, out string destPath, out var destError))
- return destError;
-
- bool ghostDesync;
- if (!AssetExists(sourcePath, out ghostDesync))
- return BuildAssetNotFoundResponse($"Source asset not found at path: {sourcePath}", sourcePath, ghostDesync);
- if (AssetExists(destPath))
- return Response.Error(
- $"An asset already exists at the destination path: {destPath}"
- );
-
- // Ensure destination directory exists
- EnsureDirectoryExists(Path.GetDirectoryName(destPath));
-
- try
- {
- // Validate will return an error string if failed, empty string if successful
- string validateError = AssetDatabase.ValidateMoveAsset(sourcePath, destPath);
- if (!string.IsNullOrEmpty(validateError))
- {
- return Response.Error(
- $"Failed to move/rename asset from '{sourcePath}' to '{destPath}': {validateError}"
- );
- }
-
- // MoveAsset returns an empty string on success, or an error message on failure
- string moveError = AssetDatabase.MoveAsset(sourcePath, destPath);
- if (string.IsNullOrEmpty(moveError))
- {
- // AssetDatabase.Refresh(); // MoveAsset usually handles refresh
- return Response.Success(
- $"Asset moved/renamed from '{sourcePath}' to '{destPath}'.",
- GetAssetData(destPath)
- );
- }
- else
- {
- return Response.Error(
- $"Failed to move/rename asset from '{sourcePath}' to '{destPath}': {moveError}"
- );
- }
- }
- catch (Exception e)
- {
- return Response.Error($"Error moving/renaming asset '{sourcePath}': {e.Message}");
- }
- }
-
private static object SearchAssets(JObject @params)
{
string searchPattern = @params["searchPattern"]?.ToString();
@@ -1050,7 +877,7 @@ namespace UnityTcp.Editor.Tools
///
/// Recursively ensures an Assets/ folder chain exists via AssetDatabase.CreateFolder.
///
- private static void EnsureDirectoryExists(string directoryPath)
+ internal static void EnsureDirectoryExists(string directoryPath)
{
if (string.IsNullOrEmpty(directoryPath))
return;
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Tools/ManageAsset.cs.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Tools/ManageAsset.cs.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Tools/ManageAsset.cs.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Tools/ManageAsset.cs.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Tools/ManageBake.cs b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Tools/ManageBake.cs
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Tools/ManageBake.cs
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Tools/ManageBake.cs
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Tools/ManageBake.cs.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Tools/ManageBake.cs.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Tools/ManageBake.cs.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Tools/ManageBake.cs.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Tools/ManageDialog.cs b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Tools/ManageDialog.cs
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Tools/ManageDialog.cs
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Tools/ManageDialog.cs
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Tools/ManageDialog.cs.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Tools/ManageDialog.cs.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Tools/ManageDialog.cs.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Tools/ManageDialog.cs.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Tools/ManageEditor.cs b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Tools/ManageEditor.cs
similarity index 94%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Tools/ManageEditor.cs
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Tools/ManageEditor.cs
index 4b182a0..6f0ebe5 100644
--- a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Tools/ManageEditor.cs
+++ b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Tools/ManageEditor.cs
@@ -498,68 +498,11 @@ namespace UnityTcp.Editor.Tools
return Response.Error($"Error setting active tool: {e.Message}");
}
}
- ///
- /// Returns the hierarchy path of a GameObject (e.g. "Root/Child/Grandchild").
- /// Kept consistent with SelectionChangedNotifier so the `path` field has identical
- /// semantics in get_selection responses and selection_changed notifications.
- ///
- private static string GetGameObjectPath(UnityEngine.GameObject obj)
- {
- if (obj == null) return string.Empty;
-
- var path = obj.name;
- var parent = obj.transform != null ? obj.transform.parent : null;
- while (parent != null)
- {
- path = $"{parent.name}/{path}";
- parent = parent.parent;
- }
- return path;
- }
private static object GetSelection()
{
try
{
- string activeAssetPath = Selection.activeObject != null
- ? AssetDatabase.GetAssetPath(Selection.activeObject)
- : null;
- string activeAsset = string.IsNullOrEmpty(activeAssetPath)
- ? null
- : Path.GetFullPath(activeAssetPath).Replace('\\', '/');
-
- var selectionInfo = new
- {
- activeObject = Selection.activeObject?.name,
- activeAsset = activeAsset,
- activeGameObject = Selection.activeGameObject?.name,
- activeTransform = Selection.activeTransform?.name,
- activeInstanceID = InstanceIdExtensions.ActiveSelectionInstanceId(),
-#if UNITY_2020_1_OR_NEWER
- count = Selection.count,
-#else
- count = Selection.objects?.Length ?? 0,
-#endif
- objects = Selection
- .objects.Select(obj => new
- {
- name = obj?.name,
- type = obj?.GetType().FullName,
- instanceID = obj?.GetStableInstanceId(),
- })
- .ToList(),
- gameObjects = Selection
- .gameObjects.Select(go => new
- {
- name = go?.name,
- path = GetGameObjectPath(go),
- instanceID = go?.GetStableInstanceId(),
- })
- .ToList(),
- assetGUIDs = Selection.assetGUIDs, // GUIDs for selected assets in Project view
- assetPaths = Selection.assetGUIDs?.Select(AssetDatabase.GUIDToAssetPath).ToArray(),
- };
-
- return Response.Success("Retrieved current selection details.", selectionInfo);
+ return Response.Success("Retrieved current selection details.", SelectionPayloadBuilder.Build());
}
catch (Exception e)
{
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Tools/ManageEditor.cs.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Tools/ManageEditor.cs.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Tools/ManageEditor.cs.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Tools/ManageEditor.cs.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Tools/ManageGameObject.cs b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Tools/ManageGameObject.cs
similarity index 96%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Tools/ManageGameObject.cs
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Tools/ManageGameObject.cs
index 1a556f8..e798563 100644
--- a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Tools/ManageGameObject.cs
+++ b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Tools/ManageGameObject.cs
@@ -7,7 +7,11 @@ using Codely.Newtonsoft.Json; // Added for JsonSerializationException
using Codely.Newtonsoft.Json.Linq;
using UnityEditor;
using UnityEditor.Compilation; // For CompilationPipeline
+#if UNITY_2021_2_OR_NEWER
using UnityEditor.SceneManagement;
+#else
+using UnityEditor.Experimental.SceneManagement;
+#endif
using UnityEditorInternal;
using UnityEngine;
using UnityEngine.SceneManagement;
@@ -51,8 +55,7 @@ namespace UnityTcp.Editor.Tools
@params,
ActionHandlers.Keys,
out var action,
- out var resolveError,
- ActionAliases))
+ out var resolveError))
{
return resolveError;
}
@@ -154,7 +157,6 @@ namespace UnityTcp.Editor.Tools
}
else if (
action == "delete"
- || action == "add_component"
|| action == "remove_component"
|| action == "get_components"
) // Added get_components here too
@@ -169,15 +171,9 @@ namespace UnityTcp.Editor.Tools
}
// --- End Prefab Redirection Check ---
- return ActionRouter.Route(@params, ActionHandlers, ActionAliases);
+ return ActionRouter.Route(@params, ActionHandlers);
}
- private static readonly Dictionary ActionAliases =
- new Dictionary
- {
- { "set_component_properties", "set_component_property" },
- };
-
private static readonly Dictionary> ActionHandlers =
new Dictionary>
{
@@ -193,10 +189,8 @@ namespace UnityTcp.Editor.Tools
{ "find", p => FindGameObjects(p, p["target"], SearchMethodOf(p)) },
{ "list_children", p => ListChildren(p, p["target"], SearchMethodOf(p)) },
{ "get_components", GetComponentsAction },
- { "add_component", p => AddComponentToTarget(p, p["target"], SearchMethodOf(p)) },
{ "remove_component", p => RemoveComponentFromTarget(p, p["target"], SearchMethodOf(p)) },
{ "set_component_property", p => SetComponentPropertyOnTarget(p, p["target"], SearchMethodOf(p)) },
- { "select", p => SelectGameObject(p, p["target"], SearchMethodOf(p)) },
};
private static string SearchMethodOf(JObject p)
@@ -558,21 +552,20 @@ namespace UnityTcp.Editor.Tools
finalPrefabPath += ".prefab";
}
+ // Validate the prefab path stays within Assets/ before creating any files.
+ // ManageAsset.TrySanitizeAssetPath uses Path.GetFullPath to reject ".." escapes.
+ if (!ManageAsset.TrySanitizeAssetPath(finalPrefabPath, out string sanitizedPrefabPath, out var prefabPathError))
+ return prefabPathError;
+ finalPrefabPath = sanitizedPrefabPath;
+
try
{
- // Ensure directory exists using the final saving path
- string directoryPath = System.IO.Path.GetDirectoryName(finalPrefabPath);
- if (
- !string.IsNullOrEmpty(directoryPath)
- && !System.IO.Directory.Exists(directoryPath)
- )
- {
- System.IO.Directory.CreateDirectory(directoryPath);
- AssetDatabase.Refresh(); // Refresh asset database to recognize the new folder
- CodelyLogger.Log(
- $"[ManageGameObject.Create] Created directory for prefab: {directoryPath}"
- );
- }
+ // Ensure directory exists using AssetDatabase API so Unity registers
+ // the folder (creates .meta) without needing a manual Refresh().
+ string assetDir = System.IO.Path.GetDirectoryName(finalPrefabPath)?.Replace('\\', '/');
+ if (!string.IsNullOrEmpty(assetDir))
+ ManageAsset.EnsureDirectoryExists(assetDir);
+
// Use SaveAsPrefabAssetAndConnect with the final saving path
finalInstance = PrefabUtility.SaveAsPrefabAssetAndConnect(
newGo,
@@ -967,63 +960,6 @@ namespace UnityTcp.Editor.Tools
}
}
- ///
- /// Selects one or more GameObjects in the Unity Editor.
- /// This sets Selection.activeGameObject (for single) or Selection.objects (for multiple).
- ///
- private static object SelectGameObject(JObject @params, JToken targetToken, string searchMethod)
- {
- if (targetToken == null)
- {
- // Clear selection if no target specified
- Selection.activeGameObject = null;
- Selection.objects = new UnityEngine.Object[0];
- return Response.Success("Selection cleared.", new { selectedCount = 0 });
- }
-
- bool selectAll = @params?["selectAll"]?.ToObject() ?? false;
- List targets = FindObjectsInternal(targetToken, searchMethod, selectAll, @params);
-
- if (targets.Count == 0)
- {
- return Response.Error(
- $"Target GameObject(s) ('{targetToken}') not found using method '{searchMethod ?? "default"}'."
- );
- }
-
- if (targets.Count == 1)
- {
- // Single selection
- Selection.activeGameObject = targets[0];
- return Response.Success(
- $"Selected GameObject '{targets[0].name}'.",
- new
- {
- selectedCount = 1,
- selected = new[]
- {
- new { name = targets[0].name, instanceID = targets[0].GetStableInstanceId() }
- }
- }
- );
- }
- else
- {
- // Multiple selection
- Selection.objects = targets.ToArray();
- Selection.activeGameObject = targets[0]; // First one becomes active
- var selectedInfo = targets.Select(go => new { name = go.name, instanceID = go.GetStableInstanceId() }).ToList();
- return Response.Success(
- $"Selected {targets.Count} GameObjects.",
- new
- {
- selectedCount = targets.Count,
- selected = selectedInfo
- }
- );
- }
- }
-
private static object FindGameObjects(
JObject @params,
JToken targetToken,
@@ -1689,63 +1625,6 @@ namespace UnityTcp.Editor.Tools
}
}
- private static object AddComponentToTarget(
- JObject @params,
- JToken targetToken,
- string searchMethod
- )
- {
- GameObject targetGo = FindObjectInternal(targetToken, searchMethod);
- if (targetGo == null)
- {
- return Response.Error(
- $"Target GameObject ('{targetToken}') not found using method '{searchMethod ?? "default"}'."
- );
- }
-
- string typeName = null;
- JObject properties = null;
-
- // Allow adding component specified directly or via componentsToAdd array (take first)
- if (@params["componentName"] != null)
- {
- typeName = @params["componentName"]?.ToString();
- properties = @params["componentProperties"]?[typeName] as JObject; // Check if props are nested under name
- }
- else if (
- @params["componentsToAdd"] is JArray componentsToAddArray
- && componentsToAddArray.Count > 0
- )
- {
- var compToken = componentsToAddArray.First;
- if (compToken.Type == JTokenType.String)
- typeName = compToken.ToString();
- else if (compToken is JObject compObj)
- {
- typeName = compObj["typeName"]?.ToString();
- properties = compObj["properties"] as JObject;
- }
- }
-
- if (string.IsNullOrEmpty(typeName))
- {
- return Response.Error(
- "Component type name ('componentName' or first element in 'componentsToAdd') is required."
- );
- }
-
- var addResult = AddComponentInternal(targetGo, typeName, properties);
- if (addResult != null)
- return addResult; // Return error
-
- EditorUtility.SetDirty(targetGo);
- // Use the new serializer helper
- return Response.Success(
- $"Component '{typeName}' added to '{targetGo.name}'.",
- Helpers.GameObjectSerializer.GetGameObjectData(targetGo)
- ); // Return updated GO data
- }
-
private static object RemoveComponentFromTarget(
JObject @params,
JToken targetToken,
@@ -2009,15 +1888,12 @@ namespace UnityTcp.Editor.Tools
}
break;
case "by_path":
- // Path is relative to scene root or rootSearchObject
- Transform foundTransform = rootSearchObject
- ? rootSearchObject.transform.Find(searchTerm)
- : GameObject.Find(searchTerm)?.transform;
- if (
- foundTransform != null
- && (searchInactive || foundTransform.gameObject.activeInHierarchy)
- )
- results.Add(foundTransform.gameObject);
+ GameObject foundByPath = FindByHierarchyPath(
+ searchTerm,
+ rootSearchObject,
+ searchInactive);
+ if (foundByPath != null)
+ results.Add(foundByPath);
break;
case "by_tag":
var searchPoolTag = rootSearchObject
@@ -2149,8 +2025,8 @@ namespace UnityTcp.Editor.Tools
break;
}
}
- GameObject objByPath = GameObject.Find(searchTerm);
- if (objByPath != null && (searchInactive || objByPath.activeInHierarchy))
+ GameObject objByPath = FindByHierarchyPath(searchTerm, null, searchInactive);
+ if (objByPath != null)
{
results.Add(objByPath);
break;
@@ -2185,20 +2061,132 @@ namespace UnityTcp.Editor.Tools
return results.Distinct().ToList(); // Ensure uniqueness
}
- // Helper to get all scene objects efficiently
+ // Helper to get all scene objects, including Prefab Stage preview objects.
private static IEnumerable GetAllSceneObjects(bool includeInactive)
{
- // SceneManager.GetActiveScene().GetRootGameObjects() is faster than FindObjectsOfType()
- var rootObjects = SceneManager.GetActiveScene().GetRootGameObjects();
var allObjects = new List();
+ CollectSceneObjects(SceneManager.GetActiveScene(), includeInactive, allObjects);
+ var stage = PrefabStageUtility.GetCurrentPrefabStage();
+ if (stage != null && stage.scene.IsValid()
+ && stage.scene != SceneManager.GetActiveScene())
+ {
+ CollectSceneObjects(stage.scene, includeInactive, allObjects);
+ }
+ return allObjects;
+ }
+
+ private static void CollectSceneObjects(
+ Scene scene,
+ bool includeInactive,
+ List allObjects)
+ {
+ if (!scene.IsValid()) return;
+ var rootObjects = scene.GetRootGameObjects();
foreach (var root in rootObjects)
{
+ if (root == null) continue;
allObjects.AddRange(
root.GetComponentsInChildren(includeInactive)
.Select(t => t.gameObject)
);
}
- return allObjects;
+ }
+
+ private static IEnumerable GetSearchRoots()
+ {
+ var roots = new List();
+ if (SceneManager.GetActiveScene().IsValid())
+ roots.AddRange(SceneManager.GetActiveScene().GetRootGameObjects());
+ var stage = PrefabStageUtility.GetCurrentPrefabStage();
+ if (stage != null && stage.scene.IsValid()
+ && stage.scene != SceneManager.GetActiveScene())
+ {
+ roots.AddRange(stage.scene.GetRootGameObjects());
+ }
+ return roots.Where(go => go != null);
+ }
+
+ ///
+ /// Resolves a hierarchy path that may contain same-name ordinals
+ /// (e.g. Root/Cube[1]/Child). Does not use GameObject.Find, so inactive
+ /// objects and Prefab Stage contents are included.
+ ///
+ private static GameObject FindByHierarchyPath(
+ string path,
+ GameObject rootSearchObject,
+ bool searchInactive)
+ {
+ if (string.IsNullOrEmpty(path)) return null;
+ var segments = path.Replace('\\', '/').Split(new[] { '/' }, StringSplitOptions.RemoveEmptyEntries);
+ if (segments.Length == 0) return null;
+
+ IEnumerable start;
+ if (rootSearchObject != null)
+ {
+ start = new[] { rootSearchObject.transform };
+ }
+ else
+ {
+ start = GetSearchRoots().Select(go => go.transform);
+ }
+
+ IEnumerable current = start;
+ for (int s = 0; s < segments.Length; s++)
+ {
+ string segment = segments[s];
+ string name;
+ int ordinal;
+ if (!InstanceIdExtensions.TryParseHierarchySegment(segment, out name, out ordinal))
+ return null;
+
+ bool firstSegmentFromRoots = s == 0 && rootSearchObject == null;
+ var matches = new List();
+ if (firstSegmentFromRoots)
+ {
+ foreach (var root in current)
+ {
+ if (root != null && root.name == name)
+ matches.Add(root);
+ }
+ }
+ else
+ {
+ foreach (var parent in current)
+ {
+ if (parent == null) continue;
+ for (int i = 0; i < parent.childCount; i++)
+ {
+ var child = parent.GetChild(i);
+ if (child.name == name)
+ matches.Add(child);
+ }
+ }
+ }
+
+ Transform picked = null;
+ if (ordinal >= 0)
+ {
+ if (ordinal < matches.Count)
+ picked = matches[ordinal];
+ }
+ else if (matches.Count == 1)
+ {
+ picked = matches[0];
+ }
+ else if (matches.Count > 1)
+ {
+ // No suffix: generated paths only omit [N] when the name is unique.
+ // Fall back to the first match for older paths.
+ picked = matches[0];
+ }
+
+ if (picked == null) return null;
+ if (!searchInactive && !picked.gameObject.activeInHierarchy) return null;
+ current = new[] { picked };
+ }
+
+ var found = current.FirstOrDefault();
+ return found != null ? found.gameObject : null;
}
///
@@ -3620,6 +3608,9 @@ namespace UnityTcp.Editor.Tools
spriteRenderer.sprite = sprite;
EditorUtility.SetDirty(prefab);
+ // SavePrefabAsset persists in-place prefab changes atomically,
+ // matching the pattern used in ManageAsset.ModifyAsset (L456-458).
+ PrefabUtility.SavePrefabAsset(prefab);
AssetDatabase.SaveAssets();
return new
@@ -3672,7 +3663,6 @@ namespace UnityTcp.Editor.Tools
"create",
"modify",
"delete",
- "add_component",
"remove_component",
"set_component_property",
};
@@ -3684,7 +3674,6 @@ namespace UnityTcp.Editor.Tools
string opId = op["id"]?.ToString() ?? "unknown";
var opAction = op["action"]?.ToString()?.ToLower();
if (string.IsNullOrEmpty(opAction)) continue;
- if (opAction == "set_component_properties") opAction = "set_component_property";
if (!writeOps.Contains(opAction))
{
return Response.Error(
@@ -3704,7 +3693,6 @@ namespace UnityTcp.Editor.Tools
string opId = op["id"]?.ToString() ?? "unknown";
string opAction = op["action"]?.ToString()?.ToLower();
if (string.IsNullOrEmpty(opAction)) continue;
- if (opAction == "set_component_properties") opAction = "set_component_property";
// Only validate deterministic targeting for write ops that can take target/parent.
if (!writeOps.Contains(opAction)) continue;
@@ -3959,7 +3947,6 @@ namespace UnityTcp.Editor.Tools
"create",
"modify",
"delete",
- "add_component",
"remove_component",
"set_component_property",
};
@@ -4007,8 +3994,6 @@ namespace UnityTcp.Editor.Tools
continue;
}
- if (opAction == "set_component_properties") opAction = "set_component_property";
-
if (opAction == "batch" || opAction == "create_batch" || opAction == "edit_batch")
{
return Response.Error($"Op '{opId}' invalid: nested batch is not allowed");
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Tools/ManageGameObject.cs.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Tools/ManageGameObject.cs.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Tools/ManageGameObject.cs.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Tools/ManageGameObject.cs.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Tools/ManageGameView.cs b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Tools/ManageGameView.cs
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Tools/ManageGameView.cs
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Tools/ManageGameView.cs
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Tools/ManageGameView.cs.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Tools/ManageGameView.cs.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Tools/ManageGameView.cs.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Tools/ManageGameView.cs.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Tools/ManageInput.cs b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Tools/ManageInput.cs
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Tools/ManageInput.cs
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Tools/ManageInput.cs
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Tools/ManageInput.cs.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Tools/ManageInput.cs.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Tools/ManageInput.cs.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Tools/ManageInput.cs.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Tools/ManageJob.cs b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Tools/ManageJob.cs
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Tools/ManageJob.cs
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Tools/ManageJob.cs
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Tools/ManageJob.cs.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Tools/ManageJob.cs.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Tools/ManageJob.cs.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Tools/ManageJob.cs.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Tools/ManagePackage.cs b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Tools/ManagePackage.cs
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Tools/ManagePackage.cs
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Tools/ManagePackage.cs
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Tools/ManagePackage.cs.meta b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Tools/ManagePackage.cs.meta
similarity index 100%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Tools/ManagePackage.cs.meta
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Tools/ManagePackage.cs.meta
diff --git a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Tools/ManageScene.cs b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Tools/ManageScene.cs
similarity index 75%
rename from .codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Tools/ManageScene.cs
rename to .codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Tools/ManageScene.cs
index 3316f78..a667fb2 100644
--- a/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-785dea6a/Editor/Bridge/Tools/ManageScene.cs
+++ b/.codely.packages/cn.tuanjie.codely.bridge@1.0.85-47f31100/Editor/Bridge/Tools/ManageScene.cs
@@ -125,6 +125,18 @@ namespace UnityTcp.Editor.Tools
relativeDir = "Scenes"; // Default relative directory
}
+ // Guard against path traversal (e.g. "Assets/../../../etc") by reusing
+ // ManageAsset.TrySanitizeAssetPath which calls Path.GetFullPath and verifies
+ // the canonical path stays under Application.dataPath.
+ if (!string.IsNullOrEmpty(relativeDir))
+ {
+ if (!ManageAsset.TrySanitizeAssetPath(
+ "Assets/" + relativeDir.TrimStart('/'),
+ out _,
+ out string dirErr))
+ return Response.Error(dirErr);
+ }
+
if (!ActionRouter.TryResolve(
new JObject { ["action"] = action },
ValidActions,
@@ -151,17 +163,18 @@ namespace UnityTcp.Editor.Tools
? null
: Path.Combine("Assets", relativeDir, sceneFileName).Replace('\\', '/');
- // Ensure directory exists for 'create'
- if (action == "create" && !string.IsNullOrEmpty(fullPathDir))
+ // Ensure directory exists for 'create' using AssetDatabase API so the
+ // folder gets a .meta file and Unity registers it immediately.
+ if (action == "create" && !string.IsNullOrEmpty(relativeDir))
{
try
{
- Directory.CreateDirectory(fullPathDir);
+ ManageAsset.EnsureDirectoryExists("Assets/" + relativeDir.TrimStart('/'));
}
catch (Exception e)
{
return Response.Error(
- $"Could not create directory '{fullPathDir}': {e.Message}"
+ $"Could not create directory 'Assets/{relativeDir}': {e.Message}"
);
}
}
@@ -174,32 +187,16 @@ namespace UnityTcp.Editor.Tools
private static readonly string[] ValidActions =
{
- "ensure_scene_open",
- "ensure_scene_saved",
"create",
"load",
"save",
"get_hierarchy",
- "get_active",
- "get_build_settings",
};
private static Dictionary> BuildActionHandlers(
string path, string name, string relativePath, string fullPath, int? buildIndex)
=> new Dictionary>
{
- { "ensure_scene_open", _ =>
- {
- if (string.IsNullOrEmpty(path))
- return Response.Error("'path' parameter is required for 'ensure_scene_open' action.");
- string ensureScenePath = path.Replace('\\', '/');
- if (!ensureScenePath.StartsWith("Assets/", StringComparison.OrdinalIgnoreCase))
- ensureScenePath = "Assets/" + ensureScenePath.TrimStart('/');
- if (!HasAllowedSceneExtension(ensureScenePath))
- return Response.Error("'path' must end with '.unity' or '.scene' for scene files.");
- return EnsureSceneOpen(ensureScenePath);
- } },
- { "ensure_scene_saved", _ => EnsureSceneSaved() },
{ "create", _ =>
{
if (string.IsNullOrEmpty(name) || string.IsNullOrEmpty(relativePath))
@@ -226,14 +223,6 @@ namespace UnityTcp.Editor.Tools
try { CodelyLogger.Verbose("[ManageScene] get_hierarchy: exiting"); } catch { }
return gh;
} },
- { "get_active", _ =>
- {
- try { CodelyLogger.Verbose("[ManageScene] get_active: entering"); } catch { }
- var ga = GetActiveSceneInfo();
- try { CodelyLogger.Verbose("[ManageScene] get_active: exiting"); } catch { }
- return ga;
- } },
- { "get_build_settings", _ => GetBuildSettingsScenes() },
};
private static object CreateScene(string fullPath, string relativePath)
@@ -291,8 +280,21 @@ namespace UnityTcp.Editor.Tools
return Response.Error($"Scene file not found at '{relativePath}'.");
}
+ Scene activeScene = EditorSceneManager.GetActiveScene();
+ if (activeScene.path.Equals(relativePath, StringComparison.OrdinalIgnoreCase))
+ {
+ return Response.Success(
+ "Scene already active.",
+ new
+ {
+ path = relativePath,
+ name = Path.GetFileNameWithoutExtension(relativePath),
+ }
+ );
+ }
+
// Check for unsaved changes in the current scene
- if (EditorSceneManager.GetActiveScene().isDirty)
+ if (activeScene.isDirty)
{
// Optionally prompt the user or save automatically before loading
return Response.Error(
@@ -329,8 +331,23 @@ namespace UnityTcp.Editor.Tools
);
}
+ string scenePath = SceneUtility.GetScenePathByBuildIndex(buildIndex);
+ Scene activeScene = EditorSceneManager.GetActiveScene();
+ if (activeScene.path.Equals(scenePath, StringComparison.OrdinalIgnoreCase))
+ {
+ return Response.Success(
+ $"Scene at build index {buildIndex} is already active.",
+ new
+ {
+ path = scenePath,
+ name = Path.GetFileNameWithoutExtension(scenePath),
+ buildIndex = buildIndex,
+ }
+ );
+ }
+
// Check for unsaved changes
- if (EditorSceneManager.GetActiveScene().isDirty)
+ if (activeScene.isDirty)
{
return Response.Error(
"Current scene has unsaved changes. Please save or discard changes before loading a new scene."
@@ -339,7 +356,6 @@ namespace UnityTcp.Editor.Tools
try
{
- string scenePath = SceneUtility.GetScenePathByBuildIndex(buildIndex);
EditorSceneManager.OpenScene(scenePath, OpenSceneMode.Single);
return Response.Success(
$"Scene at build index {buildIndex} ('{scenePath}') loaded successfully.",
@@ -375,10 +391,10 @@ namespace UnityTcp.Editor.Tools
if (!string.IsNullOrEmpty(relativePath) && currentScene.path != relativePath)
{
// Save As...
- // Ensure directory exists
- string dir = Path.GetDirectoryName(fullPath);
- if (!Directory.Exists(dir))
- Directory.CreateDirectory(dir);
+ // Ensure directory exists using AssetDatabase API (gets .meta, no traversal risk).
+ string assetDir = Path.GetDirectoryName(relativePath)?.Replace('\\', '/');
+ if (!string.IsNullOrEmpty(assetDir))
+ ManageAsset.EnsureDirectoryExists(assetDir);
saved = EditorSceneManager.SaveScene(currentScene, relativePath);
finalPath = relativePath;
@@ -393,6 +409,13 @@ namespace UnityTcp.Editor.Tools
"Cannot save an untitled scene without providing a 'name' and 'path'. Use Save As functionality."
);
}
+ if (!currentScene.isDirty)
+ {
+ return Response.Success(
+ $"Scene '{currentScene.name}' already saved.",
+ new { path = currentScene.path, name = currentScene.name }
+ );
+ }
saved = EditorSceneManager.SaveScene(currentScene);
}
@@ -415,63 +438,6 @@ namespace UnityTcp.Editor.Tools
}
}
- private static object GetActiveSceneInfo()
- {
- try
- {
- try { CodelyLogger.Verbose("[ManageScene] get_active: querying EditorSceneManager.GetActiveScene"); } catch { }
- Scene activeScene = EditorSceneManager.GetActiveScene();
- try { CodelyLogger.Verbose($"[ManageScene] get_active: got scene valid={activeScene.IsValid()} loaded={activeScene.isLoaded} name='{activeScene.name}'"); } catch { }
- if (!activeScene.IsValid())
- {
- return Response.Error("No active scene found.");
- }
-
- var sceneInfo = new
- {
- name = activeScene.name,
- path = activeScene.path,
- buildIndex = activeScene.buildIndex, // -1 if not in build settings
- isDirty = activeScene.isDirty,
- isLoaded = activeScene.isLoaded,
- rootCount = activeScene.rootCount,
- };
-
- return Response.Success("Retrieved active scene information.", sceneInfo);
- }
- catch (Exception e)
- {
- try { CodelyLogger.LogError($"[ManageScene] get_active: exception {e.Message}"); } catch { }
- return Response.Error($"Error getting active scene info: {e.Message}");
- }
- }
-
- private static object GetBuildSettingsScenes()
- {
- try
- {
- var scenes = new List