From 786b7ffff9437a526babe880c96098ac49ac879f Mon Sep 17 00:00:00 2001 From: ud18010 Date: Fri, 31 Jul 2026 17:34:04 +0800 Subject: [PATCH] Add Unity Pipeline package support --- .codex/AGENTS.md | 1 + .codex/UNITY-GUIDE.md | 52 + .codex/skills/default/SKILL.md | 8 + .codex/skills/default/agents/openai.yaml | 4 + .codex/skills/unity-pipeline/SKILL.md | 116 ++ .../.attestation.p7m | Bin 0 -> 10926 bytes .../.claude/skills/unity-pipeline/SKILL.md | 116 ++ .../com.unity.pipeline@0.4.0-exp.1/.signature | 1 + .../CHANGELOG.md | 53 + .../CHANGELOG.md.meta | 7 + .../com.unity.pipeline@0.4.0-exp.1/CLAUDE.md | 50 + .../CLAUDE.md.meta | 7 + .../com.unity.pipeline@0.4.0-exp.1/CODEOWNERS | 2 + .../CODEOWNERS.meta | 7 + .../CodeGen.meta | 8 + .../HotReloadInPlaceILPostProcessor.cs | 265 ++++ .../HotReloadInPlaceILPostProcessor.cs.meta | 11 + .../CodeGen/Unity.Pipeline.CodeGen.asmdef | 21 + .../Unity.Pipeline.CodeGen.asmdef.meta | 7 + .../Documentation~/TableOfContents.md | 25 + .../Documentation~/authoring-commands.md | 319 +++++ .../Documentation~/commands/animation.md | 191 +++ .../commands/assets-and-files.md | 150 +++ .../Documentation~/commands/baking.md | 140 ++ .../commands/build-and-compilation.md | 188 +++ .../Documentation~/commands/capture.md | 58 + .../editor-lifecycle-and-observability.md | 115 ++ .../commands/gameobjects-and-components.md | 169 +++ .../Documentation~/commands/materials.md | 55 + .../Documentation~/commands/navigation.md | 32 + .../commands/package-manager.md | 70 + .../Documentation~/commands/prefabs.md | 84 ++ .../commands/project-settings.md | 239 ++++ .../Documentation~/commands/runtime.md | 162 +++ .../Documentation~/commands/scenes.md | 93 ++ .../Documentation~/commands/scripts.md | 55 + .../Documentation~/connectivity.md | 178 +++ .../Documentation~/creating-commands.md | 189 +++ .../Documentation~/hot-reload.md | 145 ++ .../Documentation~/index.md | 267 ++++ .../Documentation~/runtime-setup.md | 60 + .../Documentation~/safety-and-mutations.md | 90 ++ .../Documentation~/testing.md | 95 ++ .../Editor.meta | 8 + .../Editor/Authoring.meta | 8 + .../Editor/Authoring/AuthoringUndoScope.cs | 45 + .../Authoring/AuthoringUndoScope.cs.meta | 11 + .../Editor/Authoring/ObjectResolver.cs | 250 ++++ .../Editor/Authoring/ObjectResolver.cs.meta | 11 + .../Editor/Authoring/ProjectPaths.cs | 145 ++ .../Editor/Authoring/ProjectPaths.cs.meta | 11 + .../Editor/BuildProcessors.meta | 8 + .../PipelineRuntimeBuildProcessor.cs | 266 ++++ .../PipelineRuntimeBuildProcessor.cs.meta | 11 + .../Editor/Commands.meta | 8 + .../Editor/Commands/Animation.meta | 8 + .../Animation/AnimationClipCommands.cs | 423 ++++++ .../Animation/AnimationClipCommands.cs.meta | 2 + .../Animation/AnimatorControllerCommands.cs | 885 +++++++++++++ .../AnimatorControllerCommands.cs.meta | 2 + .../Commands/Animation/TimelineCommands.cs | 637 +++++++++ .../Animation/TimelineCommands.cs.meta | 2 + .../Commands/Animation/TimelineGuard.cs | 52 + .../Commands/Animation/TimelineGuard.cs.meta | 2 + .../Editor/Commands/Assets.meta | 8 + .../Editor/Commands/Assets/AssetCommands.cs | 602 +++++++++ .../Commands/Assets/AssetCommands.cs.meta | 2 + .../Commands/Assets/AssetImportCommands.cs | 654 +++++++++ .../Assets/AssetImportCommands.cs.meta | 2 + .../Commands/Assets/FindAssetsResult.cs | 34 + .../Commands/Assets/FindAssetsResult.cs.meta | 2 + .../Editor/Commands/Assets/FolderCommands.cs | 51 + .../Commands/Assets/FolderCommands.cs.meta | 11 + .../Commands/Assets/TextFileCommands.cs | 126 ++ .../Commands/Assets/TextFileCommands.cs.meta | 2 + .../Editor/Commands/Authoring.meta | 8 + .../Authoring/AuthoringConfigCommands.cs | 29 + .../Authoring/AuthoringConfigCommands.cs.meta | 11 + .../Editor/Commands/AutoTickCommand.cs | 87 ++ .../Editor/Commands/AutoTickCommand.cs.meta | 11 + .../Editor/Commands/Baking.meta | 8 + .../Editor/Commands/Baking/BakeSceneGuard.cs | 42 + .../Commands/Baking/BakeSceneGuard.cs.meta | 11 + .../Commands/Baking/LightingBakeCommands.cs | 640 +++++++++ .../Baking/LightingBakeCommands.cs.meta | 11 + .../Commands/Baking/NavMeshBakeCommands.cs | 424 ++++++ .../Baking/NavMeshBakeCommands.cs.meta | 11 + .../Commands/Baking/OcclusionBakeCommands.cs | 265 ++++ .../Baking/OcclusionBakeCommands.cs.meta | 11 + .../Editor/Commands/Build.meta | 8 + .../Editor/Commands/Build/BuildCommand.cs | 577 ++++++++ .../Commands/Build/BuildCommand.cs.meta | 11 + .../Commands/Build/BuildConfigCommands.cs | 337 +++++ .../Build/BuildConfigCommands.cs.meta | 2 + .../Editor/Commands/Build/BuildModels.cs | 271 ++++ .../Editor/Commands/Build/BuildModels.cs.meta | 11 + .../Build/SwitchBuildTargetCommand.cs | 237 ++++ .../Build/SwitchBuildTargetCommand.cs.meta | 2 + .../Editor/Commands/Capture.meta | 8 + .../Commands/Capture/CaptureCommands.cs | 262 ++++ .../Commands/Capture/CaptureCommands.cs.meta | 11 + .../Commands/CaptureEditorElementCommand.cs | 77 ++ .../CaptureEditorElementCommand.cs.meta | 11 + .../Editor/Commands/EditorStatusCommand.cs | 63 + .../Commands/EditorStatusCommand.cs.meta | 11 + .../Editor/Commands/FocusEditorCommand.cs | 118 ++ .../Commands/FocusEditorCommand.cs.meta | 11 + .../Editor/Commands/GameObjects.meta | 8 + .../Commands/GameObjects/ComponentCommands.cs | 211 +++ .../GameObjects/ComponentCommands.cs.meta | 2 + .../GameObjects/ComponentPropertiesResult.cs | 25 + .../ComponentPropertiesResult.cs.meta | 2 + .../GameObjects/CreateGameObjectsResult.cs | 26 + .../CreateGameObjectsResult.cs.meta | 11 + .../GameObjects/FindGameObjectsResult.cs | 25 + .../GameObjects/FindGameObjectsResult.cs.meta | 2 + .../GameObjects/GameObjectCommands.cs | 533 ++++++++ .../GameObjects/GameObjectCommands.cs.meta | 2 + .../SerializedPropertyConverter.cs | 224 ++++ .../SerializedPropertyConverter.cs.meta | 2 + .../Commands/GameObjects/TypeResolver.cs | 82 ++ .../Commands/GameObjects/TypeResolver.cs.meta | 2 + .../Editor/Commands/Materials.meta | 8 + .../Commands/Materials/MaterialCommands.cs | 405 ++++++ .../Materials/MaterialCommands.cs.meta | 2 + .../Commands/Materials/MaterialResults.cs | 147 ++ .../Materials/MaterialResults.cs.meta | 2 + .../Materials/MaterialValueConverter.cs | 310 +++++ .../Materials/MaterialValueConverter.cs.meta | 2 + .../Commands/Materials/ShaderCommands.cs | 186 +++ .../Commands/Materials/ShaderCommands.cs.meta | 2 + .../Editor/Commands/MenuItemCommand.cs | 243 ++++ .../Editor/Commands/MenuItemCommand.cs.meta | 2 + .../Editor/Commands/Navigation.meta | 8 + .../Commands/Navigation/NavigationCommands.cs | 303 +++++ .../Navigation/NavigationCommands.cs.meta | 11 + .../Editor/Commands/Observability.meta | 8 + .../Commands/Observability/ConsoleCommands.cs | 89 ++ .../Observability/ConsoleCommands.cs.meta | 11 + .../Observability/ConsoleLogBuffer.cs | 113 ++ .../Observability/ConsoleLogBuffer.cs.meta | 11 + .../Observability/PerformanceCommands.cs | 171 +++ .../Observability/PerformanceCommands.cs.meta | 11 + .../Editor/Commands/PackageManager.meta | 8 + .../PackageManager/PackageIdentifier.cs | 161 +++ .../PackageManager/PackageIdentifier.cs.meta | 11 + .../PackageManager/PackageManagerCommand.cs | 644 +++++++++ .../PackageManagerCommand.cs.meta | 11 + .../PackageManager/PackageManifest.cs | 78 ++ .../PackageManager/PackageManifest.cs.meta | 11 + .../Commands/PackageManager/PackageModels.cs | 209 +++ .../PackageManager/PackageModels.cs.meta | 11 + .../Editor/Commands/PlayModeCommands.cs | 55 + .../Editor/Commands/PlayModeCommands.cs.meta | 11 + .../Editor/Commands/Prefabs.meta | 8 + .../Editor/Commands/Prefabs/PrefabCommands.cs | 416 ++++++ .../Commands/Prefabs/PrefabCommands.cs.meta | 2 + .../Editor/Commands/ProjectSettings.meta | 8 + .../ProjectSettings/AudioSettingsCommands.cs | 116 ++ .../AudioSettingsCommands.cs.meta | 11 + .../GraphicsSettingsCommands.cs | 87 ++ .../GraphicsSettingsCommands.cs.meta | 11 + .../ProjectSettings/InputSettingsCommands.cs | 150 +++ .../InputSettingsCommands.cs.meta | 11 + .../PhysicsSettingsCommands.cs | 98 ++ .../PhysicsSettingsCommands.cs.meta | 11 + .../ProjectSettings/PlayerSettingsCommands.cs | 122 ++ .../PlayerSettingsCommands.cs.meta | 11 + .../ProjectSettings/ProjectSettingsAsset.cs | 23 + .../ProjectSettingsAsset.cs.meta | 11 + .../ProjectSettings/ProjectSettingsCommand.cs | 145 ++ .../ProjectSettingsCommand.cs.meta | 11 + .../ProjectSettingsResponse.cs | 65 + .../ProjectSettingsResponse.cs.meta | 11 + .../QualitySettingsCommands.cs | 95 ++ .../QualitySettingsCommands.cs.meta | 11 + .../ProjectSettings/TagsLayersCommands.cs | 143 ++ .../TagsLayersCommands.cs.meta | 11 + .../ProjectSettings/TimeSettingsCommands.cs | 80 ++ .../TimeSettingsCommands.cs.meta | 11 + .../Editor/Commands/RecompileCommand.cs | 113 ++ .../Editor/Commands/RecompileCommand.cs.meta | 11 + .../Editor/Commands/Scenes.meta | 8 + .../Editor/Commands/Scenes/SceneCommands.cs | 395 ++++++ .../Commands/Scenes/SceneCommands.cs.meta | 2 + .../Editor/Commands/Scenes/SceneHierarchy.cs | 82 ++ .../Commands/Scenes/SceneHierarchy.cs.meta | 2 + .../Editor/Commands/ScreenshotCommand.cs | 198 +++ .../Editor/Commands/ScreenshotCommand.cs.meta | 2 + .../Editor/Commands/Scripts.meta | 8 + .../Commands/Scripts/AttachScriptCommand.cs | 138 ++ .../Scripts/AttachScriptCommand.cs.meta | 2 + .../Commands/Scripts/CreateScriptCommand.cs | 163 +++ .../Scripts/CreateScriptCommand.cs.meta | 2 + .../Commands/Scripts/ScriptTypeResolver.cs | 161 +++ .../Scripts/ScriptTypeResolver.cs.meta | 2 + .../Scripts/SerializedFieldCommands.cs | 215 +++ .../Scripts/SerializedFieldCommands.cs.meta | 2 + .../Scripts/SerializedPropertyConverter.cs | 237 ++++ .../SerializedPropertyConverter.cs.meta | 2 + .../Editor/Commands/TestCommands.cs | 219 +++ .../Editor/Commands/TestCommands.cs.meta | 11 + .../Editor/Console.meta | 8 + .../Console/EditorConsoleCaptureBootstrap.cs | 43 + .../EditorConsoleCaptureBootstrap.cs.meta | 2 + .../Editor/EditorPipelineManager.cs | 74 ++ .../Editor/EditorPipelineManager.cs.meta | 11 + .../Editor/EditorPipelineManagerEditor.cs | 63 + .../EditorPipelineManagerEditor.cs.meta | 11 + .../Editor/EditorPipelineServer.cs | 101 ++ .../Editor/EditorPipelineServer.cs.meta | 11 + .../Editor/EditorPipelineStartup.cs | 267 ++++ .../Editor/EditorPipelineStartup.cs.meta | 11 + .../Editor/PipelineTransactionLog.cs | 153 +++ .../Editor/PipelineTransactionLog.cs.meta | 2 + .../Editor/Testing.meta | 8 + .../Editor/Testing/PipelineTestRunner.cs | 804 +++++++++++ .../Editor/Testing/PipelineTestRunner.cs.meta | 11 + .../Editor/Testing/TestResultCollector.cs | 156 +++ .../Testing/TestResultCollector.cs.meta | 11 + .../Editor/TypeCacheCommandDiscovery.cs | 23 + .../Editor/TypeCacheCommandDiscovery.cs.meta | 11 + .../Editor/Unity.Pipeline.Editor.asmdef | 19 + .../Editor/Unity.Pipeline.Editor.asmdef.meta | 7 + .../com.unity.pipeline@0.4.0-exp.1/LICENSE.md | 5 + .../LICENSE.md.meta | 7 + .../com.unity.pipeline@0.4.0-exp.1/README.md | 91 ++ .../README.md.meta | 7 + .../Runtime.meta | 8 + .../Runtime/AssemblyInfo.cs | 6 + .../Runtime/AssemblyInfo.cs.meta | 11 + .../Runtime/Commands.meta | 8 + .../Commands/CaptureRuntimeElementCommand.cs | 143 ++ .../CaptureRuntimeElementCommand.cs.meta | 11 + .../Runtime/Commands/CodeEvalCommand.cs | 129 ++ .../Runtime/Commands/CodeEvalCommand.cs.meta | 11 + .../Runtime/Commands/ConsoleCommand.cs | 45 + .../Runtime/Commands/ConsoleCommand.cs.meta | 2 + .../Runtime/Commands/HotReloadCommands.cs | 563 ++++++++ .../Commands/HotReloadCommands.cs.meta | 11 + .../Commands/RuntimeApplicationCommand.cs | 89 ++ .../RuntimeApplicationCommand.cs.meta | 11 + .../Runtime/Commands/RuntimeInputCommand.cs | 180 +++ .../Commands/RuntimeInputCommand.cs.meta | 11 + .../Runtime/Commands/RuntimeLogCommand.cs | 49 + .../Commands/RuntimeLogCommand.cs.meta | 11 + .../Runtime/Commands/RuntimeStatusCommand.cs | 162 +++ .../Commands/RuntimeStatusCommand.cs.meta | 11 + .../Commands/VisualElementCaptureSupport.cs | 444 +++++++ .../VisualElementCaptureSupport.cs.meta | 11 + .../Runtime/Common.meta | 8 + .../Runtime/Common/BasePipelineServer.cs | 1177 +++++++++++++++++ .../Runtime/Common/BasePipelineServer.cs.meta | 11 + .../Runtime/Common/CliArgAttribute.cs | 51 + .../Runtime/Common/CliArgAttribute.cs.meta | 11 + .../Runtime/Common/CliCommandAttribute.cs | 50 + .../Common/CliCommandAttribute.cs.meta | 11 + .../Runtime/Common/CommandInfo.cs | 64 + .../Runtime/Common/CommandInfo.cs.meta | 11 + .../Runtime/Common/CommandRegistry.cs | 258 ++++ .../Runtime/Common/CommandRegistry.cs.meta | 11 + .../Runtime/Common/Dispatcher.cs | 200 +++ .../Runtime/Common/Dispatcher.cs.meta | 11 + .../Runtime/Common/FilePermissions.cs | 109 ++ .../Runtime/Common/FilePermissions.cs.meta | 11 + .../Runtime/Common/ICommandDiscovery.cs | 18 + .../Runtime/Common/ICommandDiscovery.cs.meta | 11 + .../Runtime/Common/IStructuredCommandInput.cs | 28 + .../Common/IStructuredCommandInput.cs.meta | 11 + .../Runtime/Common/JsonSchemaGenerator.cs | 324 +++++ .../Common/JsonSchemaGenerator.cs.meta | 11 + .../Runtime/Common/MaxLengthStream.cs | 97 ++ .../Runtime/Common/MaxLengthStream.cs.meta | 11 + .../Runtime/Common/ParameterInfo.cs | 55 + .../Runtime/Common/ParameterInfo.cs.meta | 11 + .../Runtime/Common/PipelineUtils.cs | 163 +++ .../Runtime/Common/PipelineUtils.cs.meta | 11 + .../Runtime/Compilation.meta | 8 + .../Runtime/Compilation/EvalCodeCompiler.cs | 327 +++++ .../Compilation/EvalCodeCompiler.cs.meta | 11 + .../Runtime/Compilation/HotReloadCompiler.cs | 804 +++++++++++ .../Compilation/HotReloadCompiler.cs.meta | 11 + .../Compilation/RoslynCompilationService.cs | 356 +++++ .../RoslynCompilationService.cs.meta | 11 + .../Runtime/Console.meta | 8 + .../Runtime/Console/ConsoleLogBuffer.cs | 304 +++++ .../Runtime/Console/ConsoleLogBuffer.cs.meta | 2 + .../Runtime/Console/ConsoleLogCapture.cs | 67 + .../Runtime/Console/ConsoleLogCapture.cs.meta | 2 + .../Runtime/HotReload.meta | 8 + .../HotReload/AccessibilityValidator.cs | 198 +++ .../HotReload/AccessibilityValidator.cs.meta | 11 + .../Runtime/HotReload/HotReloadAttributes.cs | 166 +++ .../HotReload/HotReloadAttributes.cs.meta | 11 + .../Runtime/HotReload/HotReloadHelper.cs | 140 ++ .../Runtime/HotReload/HotReloadHelper.cs.meta | 11 + .../Runtime/HotReload/HotReloadRegistry.cs | 365 +++++ .../HotReload/HotReloadRegistry.cs.meta | 11 + .../HotReload/InPlaceReloadProcessor.cs | 560 ++++++++ .../HotReload/InPlaceReloadProcessor.cs.meta | 11 + .../HotReload/OverrideFileValidator.cs | 136 ++ .../HotReload/OverrideFileValidator.cs.meta | 11 + .../HotReload/SourceCodeTransformer.cs | 266 ++++ .../HotReload/SourceCodeTransformer.cs.meta | 11 + .../Runtime/Models.meta | 8 + .../Runtime/Models/AuthoringResult.cs | 42 + .../Runtime/Models/AuthoringResult.cs.meta | 11 + .../Runtime/Models/BaseResponse.cs | 49 + .../Runtime/Models/BaseResponse.cs.meta | 11 + .../Runtime/Models/CommandExecutionRequest.cs | 93 ++ .../Models/CommandExecutionRequest.cs.meta | 11 + .../Models/CommandExecutionResponse.cs | 68 + .../Models/CommandExecutionResponse.cs.meta | 11 + .../Runtime/Models/ConsoleLogEntry.cs | 46 + .../Runtime/Models/ConsoleLogEntry.cs.meta | 2 + .../Runtime/Models/ConsoleLogResponse.cs | 42 + .../Runtime/Models/ConsoleLogResponse.cs.meta | 2 + .../Runtime/Models/EvalResponse.cs | 92 ++ .../Runtime/Models/EvalResponse.cs.meta | 11 + .../Runtime/Models/InstanceDescriptor.cs | 203 +++ .../Runtime/Models/InstanceDescriptor.cs.meta | 11 + .../Runtime/Models/ObjectRef.cs | 57 + .../Runtime/Models/ObjectRef.cs.meta | 11 + .../Runtime/Models/ObjectRefConverter.cs | 188 +++ .../Runtime/Models/ObjectRefConverter.cs.meta | 11 + .../Models/RuntimeInstanceDescriptor.cs | 203 +++ .../Models/RuntimeInstanceDescriptor.cs.meta | 11 + .../Runtime/Models/StatusResponse.cs | 55 + .../Runtime/Models/StatusResponse.cs.meta | 11 + .../Runtime/Models/TestExecutionResponse.cs | 26 + .../Models/TestExecutionResponse.cs.meta | 11 + .../Runtime/Models/TestResult.cs | 17 + .../Runtime/Models/TestResult.cs.meta | 11 + .../Runtime/Models/TestSummary.cs | 26 + .../Runtime/Models/TestSummary.cs.meta | 11 + .../Runtime/PlayerSupport.meta | 8 + .../PlayerSupport/FrameStatsSampler.cs | 208 +++ .../PlayerSupport/FrameStatsSampler.cs.meta | 11 + .../PlayerSupport/RuntimePipelineConfig.cs | 68 + .../RuntimePipelineConfig.cs.meta | 11 + .../PlayerSupport/RuntimePipelineManager.cs | 368 ++++++ .../RuntimePipelineManager.cs.meta | 11 + .../PlayerSupport/RuntimePipelineServer.cs | 74 ++ .../RuntimePipelineServer.cs.meta | 11 + .../Runtime/Plugins.meta | 8 + .../Runtime/Plugins/CodeAnalysis.meta | 8 + .../Runtime/Plugins/CodeAnalysis/CHECKSUMS | 13 + .../Plugins/CodeAnalysis/CHECKSUMS.meta | 7 + .../Microsoft.CodeAnalysis.CSharp.dll | Bin 0 -> 6098320 bytes .../Microsoft.CodeAnalysis.CSharp.dll.meta | 33 + .../CodeAnalysis/Microsoft.CodeAnalysis.dll | Bin 0 -> 2903440 bytes .../Microsoft.CodeAnalysis.dll.meta | 33 + .../System.Collections.Immutable.dll | Bin 0 -> 252680 bytes .../System.Collections.Immutable.dll.meta | 33 + .../System.Reflection.Metadata.dll | Bin 0 -> 487696 bytes .../System.Reflection.Metadata.dll.meta | 33 + ...System.Runtime.CompilerServices.Unsafe.dll | Bin 0 -> 22184 bytes ...m.Runtime.CompilerServices.Unsafe.dll.meta | 33 + .../Runtime/SecurityTokenManager.cs | 139 ++ .../Runtime/SecurityTokenManager.cs.meta | 11 + .../Runtime/Unity.Pipeline.asmdef | 29 + .../Runtime/Unity.Pipeline.asmdef.meta | 7 + .../Samples~/HotReload.meta | 8 + .../Samples~/HotReload/HotReload_InPlace.meta | 8 + .../HotReload_InPlace/HotReload_InPlace.unity | 502 +++++++ .../HotReload_InPlace.unity.meta | 7 + .../InPlaceHotReloadExample.cs | 83 ++ .../InPlaceHotReloadExample.cs.meta | 2 + .../HotReload/HotReload_WithHelpers.meta | 8 + .../HotReload_WithHelpers/BossController.cs | 25 + .../BossController.cs.meta | 2 + .../HotReload_WithHelpers/BossOverrides.cs | 23 + .../BossOverrides.cs.meta | 11 + .../HotReloadTestManager.cs | 206 +++ .../HotReloadTestManager.cs.meta | 2 + .../HotReload_WithHelpers.unity | 631 +++++++++ .../HotReload_WithHelpers.unity.meta | 7 + .../HotReload_WithHelpers/PlayerController.cs | 122 ++ .../PlayerController.cs.meta | 2 + .../HotReload_WithHelpers/PlayerOverrides.cs | 87 ++ .../PlayerOverrides.cs.meta | 2 + .../HotReload/Unity.Pipeline.Samples.asmdef | 16 + .../Unity.Pipeline.Samples.asmdef.meta | 7 + .../com.unity.pipeline@0.4.0-exp.1/Tests.meta | 8 + .../Tests/Editor.meta | 8 + .../Tests/Editor/Animation.meta | 8 + .../Animation/AnimationClipCommandsTests.cs | 211 +++ .../AnimationClipCommandsTests.cs.meta | 2 + .../AnimatorControllerCommandsTests.cs | 261 ++++ .../AnimatorControllerCommandsTests.cs.meta | 2 + .../Editor/Animation/TimelineCommandsTests.cs | 81 ++ .../Animation/TimelineCommandsTests.cs.meta | 2 + .../Tests/Editor/ApiEndpointsTests.cs | 259 ++++ .../Tests/Editor/ApiEndpointsTests.cs.meta | 11 + .../Tests/Editor/Assets.meta | 8 + .../Tests/Editor/Assets/AssetCommandsTests.cs | 246 ++++ .../Editor/Assets/AssetCommandsTests.cs.meta | 2 + .../Editor/Assets/AssetImportCommandsTests.cs | 103 ++ .../Assets/AssetImportCommandsTests.cs.meta | 2 + .../Assets/ImportSettingsCommandTests.cs | 432 ++++++ .../Assets/ImportSettingsCommandTests.cs.meta | 2 + .../Assets/MaterialAssetCommandsTests.cs | 182 +++ .../Assets/MaterialAssetCommandsTests.cs.meta | 11 + .../PhysicsMaterialAssetCommandsTests.cs | 160 +++ .../PhysicsMaterialAssetCommandsTests.cs.meta | 11 + .../Editor/Assets/TextFileCommandsTests.cs | 108 ++ .../Assets/TextFileCommandsTests.cs.meta | 2 + .../Tests/Editor/Authoring.meta | 8 + .../Editor/Authoring/FolderCommandsTests.cs | 85 ++ .../Authoring/FolderCommandsTests.cs.meta | 11 + .../Authoring/ObjectRefConverterTests.cs | 223 ++++ .../Authoring/ObjectRefConverterTests.cs.meta | 11 + .../Editor/Authoring/ObjectResolverTests.cs | 145 ++ .../Authoring/ObjectResolverTests.cs.meta | 11 + .../Editor/Authoring/ProjectPathsTests.cs | 84 ++ .../Authoring/ProjectPathsTests.cs.meta | 11 + .../Tests/Editor/Baking.meta | 8 + .../Baking/LightingBakeCommandsTests.cs | 199 +++ .../Baking/LightingBakeCommandsTests.cs.meta | 11 + .../Editor/Baking/NavMeshBakeCommandsTests.cs | 125 ++ .../Baking/NavMeshBakeCommandsTests.cs.meta | 11 + .../Baking/OcclusionBakeCommandsTests.cs | 69 + .../Baking/OcclusionBakeCommandsTests.cs.meta | 11 + .../Tests/Editor/BuildConfigCommandsTests.cs | 105 ++ .../Editor/BuildConfigCommandsTests.cs.meta | 11 + .../Tests/Editor/Capture.meta | 8 + .../Editor/Capture/CaptureCommandsTests.cs | 218 +++ .../Capture/CaptureCommandsTests.cs.meta | 11 + .../CaptureVisualElementCommandsTests.cs | 243 ++++ .../CaptureVisualElementCommandsTests.cs.meta | 11 + .../Tests/Editor/CodeEvalCommandTests.cs | 247 ++++ .../Tests/Editor/CodeEvalCommandTests.cs.meta | 11 + .../Tests/Editor/CommandRegistrationTests.cs | 303 +++++ .../Editor/CommandRegistrationTests.cs.meta | 11 + .../Tests/Editor/ConsoleCommandTests.cs | 119 ++ .../Tests/Editor/ConsoleCommandTests.cs.meta | 2 + .../Tests/Editor/ConsoleLogBufferTests.cs | 310 +++++ .../Editor/ConsoleLogBufferTests.cs.meta | 2 + .../Tests/Editor/E2E.meta | 8 + .../Editor/E2E/AgentAuthoringE2ETests.cs | 70 + .../Editor/E2E/AgentAuthoringE2ETests.cs.meta | 11 + .../Tests/Editor/EditorStatusCommandTests.cs | 53 + .../Editor/EditorStatusCommandTests.cs.meta | 11 + .../Tests/Editor/EditorTestUtilities.cs | 40 + .../Tests/Editor/EditorTestUtilities.cs.meta | 11 + .../Tests/Editor/EvalCodeCompilerTests.cs | 43 + .../Editor/EvalCodeCompilerTests.cs.meta | 11 + .../Tests/Editor/FrameStatsSamplerTests.cs | 87 ++ .../Editor/FrameStatsSamplerTests.cs.meta | 11 + .../Tests/Editor/GameObjects.meta | 8 + .../GameObjects/CoercionAndBatchTests.cs | 377 ++++++ .../GameObjects/CoercionAndBatchTests.cs.meta | 11 + .../GameObjects/ComponentCommandsTests.cs | 400 ++++++ .../ComponentCommandsTests.cs.meta | 2 + .../GameObjects/GameObjectCommandsTests.cs | 217 +++ .../GameObjectCommandsTests.cs.meta | 2 + .../Editor/HotReloadAssemblyDirectoryTests.cs | 190 +++ .../HotReloadAssemblyDirectoryTests.cs.meta | 11 + .../Tests/Editor/HotReloadAttributeTests.cs | 109 ++ .../Editor/HotReloadAttributeTests.cs.meta | 11 + .../Tests/Editor/HotReloadBasicTests.cs | 179 +++ .../Tests/Editor/HotReloadBasicTests.cs.meta | 11 + .../Tests/Editor/HotReloadCommandTests.cs | 232 ++++ .../Editor/HotReloadCommandTests.cs.meta | 11 + .../Tests/Editor/HotReloadCompilerTests.cs | 362 +++++ .../Editor/HotReloadCompilerTests.cs.meta | 11 + .../Tests/Editor/HotReloadInPlaceTests.cs | 296 +++++ .../Editor/HotReloadInPlaceTests.cs.meta | 11 + .../Tests/Editor/HotReloadIntegrationTests.cs | 220 +++ .../Editor/HotReloadIntegrationTests.cs.meta | 11 + .../Tests/Editor/HotReloadRegistryTests.cs | 172 +++ .../Editor/HotReloadRegistryTests.cs.meta | 11 + .../Editor/HotReloadVerificationTests.cs | 145 ++ .../Editor/HotReloadVerificationTests.cs.meta | 11 + .../Tests/Editor/InstanceDiscoveryTests.cs | 425 ++++++ .../Editor/InstanceDiscoveryTests.cs.meta | 11 + .../Tests/Editor/LiveServerGuard.cs | 111 ++ .../Tests/Editor/LiveServerGuard.cs.meta | 11 + .../Tests/Editor/LoopbackBindingTests.cs | 47 + .../Tests/Editor/LoopbackBindingTests.cs.meta | 11 + .../Tests/Editor/Materials.meta | 8 + .../Editor/Materials/MaterialCommandsTests.cs | 374 ++++++ .../Materials/MaterialCommandsTests.cs.meta | 2 + .../Editor/Materials/ShaderCommandsTests.cs | 177 +++ .../Materials/ShaderCommandsTests.cs.meta | 2 + .../Tests/Editor/MaxLengthStreamTests.cs | 100 ++ .../Tests/Editor/MaxLengthStreamTests.cs.meta | 11 + .../Tests/Editor/MenuCommandTests.cs | 140 ++ .../Tests/Editor/MenuCommandTests.cs.meta | 2 + .../Tests/Editor/Models.meta | 8 + .../Editor/Models/ObjectRefConverterTests.cs | 56 + .../Models/ObjectRefConverterTests.cs.meta | 11 + .../Tests/Editor/Navigation.meta | 8 + .../Navigation/NavigationCommandsTests.cs | 147 ++ .../NavigationCommandsTests.cs.meta | 11 + .../Tests/Editor/Observability.meta | 8 + .../ObservabilityCommandsTests.cs | 127 ++ .../ObservabilityCommandsTests.cs.meta | 11 + .../Editor/OverrideFileValidatorTests.cs | 102 ++ .../Editor/OverrideFileValidatorTests.cs.meta | 11 + .../Editor/PackageManagerCommandTests.cs | 248 ++++ .../Editor/PackageManagerCommandTests.cs.meta | 11 + .../PipelineRuntimeBuildProcessorTests.cs | 44 + ...PipelineRuntimeBuildProcessorTests.cs.meta | 11 + .../Tests/Editor/PipelineTestServer.cs | 66 + .../Tests/Editor/PipelineTestServer.cs.meta | 11 + .../Editor/PipelineTransactionLogTests.cs | 140 ++ .../PipelineTransactionLogTests.cs.meta | 2 + .../Tests/Editor/PipelineWatchdogTestGuard.cs | 44 + .../Editor/PipelineWatchdogTestGuard.cs.meta | 11 + .../Tests/Editor/PlayModeCommandsTests.cs | 536 ++++++++ .../Editor/PlayModeCommandsTests.cs.meta | 11 + .../Tests/Editor/PlayModeReloadGuard.cs | 61 + .../Tests/Editor/PlayModeReloadGuard.cs.meta | 11 + .../Tests/Editor/Prefabs.meta | 8 + .../Editor/Prefabs/PrefabCommandsTests.cs | 267 ++++ .../Prefabs/PrefabCommandsTests.cs.meta | 2 + .../Editor/ProjectSettingsCommandTests.cs | 111 ++ .../ProjectSettingsCommandTests.cs.meta | 11 + .../ProjectSettingsGroupCommandsTests.cs | 108 ++ .../ProjectSettingsGroupCommandsTests.cs.meta | 11 + .../Tests/Editor/RecompileCommandTests.cs | 74 ++ .../Editor/RecompileCommandTests.cs.meta | 11 + .../Tests/Editor/ReloadPathValidationTests.cs | 157 +++ .../Editor/ReloadPathValidationTests.cs.meta | 11 + .../Tests/Editor/RoslynChecksumTests.cs | 122 ++ .../Tests/Editor/RoslynChecksumTests.cs.meta | 11 + .../Editor/RoslynCompilationServiceTests.cs | 348 +++++ .../RoslynCompilationServiceTests.cs.meta | 11 + .../Editor/RuntimeApplicationCommandTests.cs | 103 ++ .../RuntimeApplicationCommandTests.cs.meta | 11 + .../Tests/Editor/RuntimeInputCommandTests.cs | 88 ++ .../Editor/RuntimeInputCommandTests.cs.meta | 11 + .../Tests/Editor/RuntimeLogCommandTests.cs | 73 + .../Editor/RuntimeLogCommandTests.cs.meta | 11 + .../Tests/Editor/RuntimePipelineBuildTests.cs | 285 ++++ .../Editor/RuntimePipelineBuildTests.cs.meta | 11 + .../Editor/RuntimePipelineManagerTests.cs | 139 ++ .../RuntimePipelineManagerTests.cs.meta | 11 + .../Editor/RuntimePipelineServerTests.cs | 233 ++++ .../Editor/RuntimePipelineServerTests.cs.meta | 11 + .../Tests/Editor/RuntimeStatusCommandTests.cs | 46 + .../Editor/RuntimeStatusCommandTests.cs.meta | 11 + .../Tests/Editor/Scenes.meta | 8 + .../Tests/Editor/Scenes/SceneCommandsTests.cs | 463 +++++++ .../Editor/Scenes/SceneCommandsTests.cs.meta | 2 + .../Tests/Editor/ScreenshotCommandTests.cs | 160 +++ .../Editor/ScreenshotCommandTests.cs.meta | 2 + .../Tests/Editor/Scripts.meta | 8 + .../Editor/Scripts/ScriptCommandsTests.cs | 573 ++++++++ .../Scripts/ScriptCommandsTests.cs.meta | 2 + .../Tests/Editor/SecurityTokenTests.cs | 131 ++ .../Tests/Editor/SecurityTokenTests.cs.meta | 11 + .../Tests/Editor/ServerAuthTests.cs | 103 ++ .../Tests/Editor/ServerAuthTests.cs.meta | 11 + .../Tests/Editor/ServerLifecycle.meta | 8 + .../Editor/ServerLifecycle/DualServerTests.cs | 187 +++ .../ServerLifecycle/DualServerTests.cs.meta | 11 + .../Editor/ServerLifecycle/EndToEndTests.cs | 124 ++ .../ServerLifecycle/EndToEndTests.cs.meta | 11 + .../ServerLifecycle/GlobalServerStateGuard.cs | 53 + .../GlobalServerStateGuard.cs.meta | 11 + .../GlobalServerStateGuardTests.cs | 71 + .../GlobalServerStateGuardTests.cs.meta | 11 + .../ServerLifecycle/PipelineServerTests.cs | 131 ++ .../PipelineServerTests.cs.meta | 11 + .../Tests/Editor/TestCommandsTests.cs | 147 ++ .../Tests/Editor/TestCommandsTests.cs.meta | 11 + .../Tests/Editor/TestEditorPipelineServer.cs | 27 + .../Editor/TestEditorPipelineServer.cs.meta | 11 + .../Editor/Unity.Pipeline.Tests.Editor.asmdef | 28 + .../Unity.Pipeline.Tests.Editor.asmdef.meta | 7 + .../Tests/Runtime.meta | 8 + .../Tests/Runtime/AttachByPathFixture.cs | 22 + .../Tests/Runtime/AttachByPathFixture.cs.meta | 11 + .../Runtime/HotReloadCliIntegrationTests.cs | 448 +++++++ .../HotReloadCliIntegrationTests.cs.meta | 11 + .../Runtime/HotReloadInPlaceEditingTests.cs | 466 +++++++ .../HotReloadInPlaceEditingTests.cs.meta | 11 + .../Tests/Runtime/PipelineClient.cs | 412 ++++++ .../Tests/Runtime/PipelineClient.cs.meta | 11 + .../RuntimeServerPlayModeSmokeTests.cs | 65 + .../RuntimeServerPlayModeSmokeTests.cs.meta | 11 + .../Unity.Pipeline.Tests.Runtime.asmdef | 21 + .../Unity.Pipeline.Tests.Runtime.asmdef.meta | 7 + .../package.json | 1 + .../package.json.meta | 7 + Client/Packages/manifest.json | 1 + Client/Packages/packages-lock.json | 15 +- Client/ProjectSettings/ProjectSettings.asset | 2 +- 590 files changed, 51995 insertions(+), 2 deletions(-) create mode 100644 .codex/AGENTS.md create mode 100644 .codex/UNITY-GUIDE.md create mode 100644 .codex/skills/default/SKILL.md create mode 100644 .codex/skills/default/agents/openai.yaml create mode 100644 .codex/skills/unity-pipeline/SKILL.md create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/.attestation.p7m create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/.claude/skills/unity-pipeline/SKILL.md create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/.signature create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/CHANGELOG.md create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/CHANGELOG.md.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/CLAUDE.md create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/CLAUDE.md.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/CODEOWNERS create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/CODEOWNERS.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/CodeGen.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/CodeGen/HotReloadInPlaceILPostProcessor.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/CodeGen/HotReloadInPlaceILPostProcessor.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/CodeGen/Unity.Pipeline.CodeGen.asmdef create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/CodeGen/Unity.Pipeline.CodeGen.asmdef.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/TableOfContents.md create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/authoring-commands.md create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/commands/animation.md create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/commands/assets-and-files.md create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/commands/baking.md create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/commands/build-and-compilation.md create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/commands/capture.md create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/commands/editor-lifecycle-and-observability.md create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/commands/gameobjects-and-components.md create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/commands/materials.md create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/commands/navigation.md create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/commands/package-manager.md create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/commands/prefabs.md create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/commands/project-settings.md create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/commands/runtime.md create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/commands/scenes.md create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/commands/scripts.md create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/connectivity.md create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/creating-commands.md create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/hot-reload.md create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/index.md create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/runtime-setup.md create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/safety-and-mutations.md create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/testing.md create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Authoring.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Authoring/AuthoringUndoScope.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Authoring/AuthoringUndoScope.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Authoring/ObjectResolver.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Authoring/ObjectResolver.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Authoring/ProjectPaths.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Authoring/ProjectPaths.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/BuildProcessors.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/BuildProcessors/PipelineRuntimeBuildProcessor.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/BuildProcessors/PipelineRuntimeBuildProcessor.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Animation.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Animation/AnimationClipCommands.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Animation/AnimationClipCommands.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Animation/AnimatorControllerCommands.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Animation/AnimatorControllerCommands.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Animation/TimelineCommands.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Animation/TimelineCommands.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Animation/TimelineGuard.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Animation/TimelineGuard.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Assets.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Assets/AssetCommands.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Assets/AssetCommands.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Assets/AssetImportCommands.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Assets/AssetImportCommands.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Assets/FindAssetsResult.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Assets/FindAssetsResult.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Assets/FolderCommands.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Assets/FolderCommands.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Assets/TextFileCommands.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Assets/TextFileCommands.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Authoring.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Authoring/AuthoringConfigCommands.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Authoring/AuthoringConfigCommands.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/AutoTickCommand.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/AutoTickCommand.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Baking.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Baking/BakeSceneGuard.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Baking/BakeSceneGuard.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Baking/LightingBakeCommands.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Baking/LightingBakeCommands.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Baking/NavMeshBakeCommands.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Baking/NavMeshBakeCommands.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Baking/OcclusionBakeCommands.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Baking/OcclusionBakeCommands.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Build.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Build/BuildCommand.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Build/BuildCommand.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Build/BuildConfigCommands.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Build/BuildConfigCommands.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Build/BuildModels.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Build/BuildModels.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Build/SwitchBuildTargetCommand.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Build/SwitchBuildTargetCommand.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Capture.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Capture/CaptureCommands.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Capture/CaptureCommands.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/CaptureEditorElementCommand.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/CaptureEditorElementCommand.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/EditorStatusCommand.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/EditorStatusCommand.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/FocusEditorCommand.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/FocusEditorCommand.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/GameObjects.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/GameObjects/ComponentCommands.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/GameObjects/ComponentCommands.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/GameObjects/ComponentPropertiesResult.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/GameObjects/ComponentPropertiesResult.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/GameObjects/CreateGameObjectsResult.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/GameObjects/CreateGameObjectsResult.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/GameObjects/FindGameObjectsResult.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/GameObjects/FindGameObjectsResult.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/GameObjects/GameObjectCommands.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/GameObjects/GameObjectCommands.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/GameObjects/SerializedPropertyConverter.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/GameObjects/SerializedPropertyConverter.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/GameObjects/TypeResolver.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/GameObjects/TypeResolver.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Materials.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Materials/MaterialCommands.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Materials/MaterialCommands.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Materials/MaterialResults.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Materials/MaterialResults.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Materials/MaterialValueConverter.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Materials/MaterialValueConverter.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Materials/ShaderCommands.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Materials/ShaderCommands.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/MenuItemCommand.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/MenuItemCommand.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Navigation.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Navigation/NavigationCommands.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Navigation/NavigationCommands.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Observability.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Observability/ConsoleCommands.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Observability/ConsoleCommands.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Observability/ConsoleLogBuffer.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Observability/ConsoleLogBuffer.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Observability/PerformanceCommands.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Observability/PerformanceCommands.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/PackageManager.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/PackageManager/PackageIdentifier.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/PackageManager/PackageIdentifier.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/PackageManager/PackageManagerCommand.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/PackageManager/PackageManagerCommand.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/PackageManager/PackageManifest.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/PackageManager/PackageManifest.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/PackageManager/PackageModels.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/PackageManager/PackageModels.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/PlayModeCommands.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/PlayModeCommands.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Prefabs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Prefabs/PrefabCommands.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Prefabs/PrefabCommands.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/AudioSettingsCommands.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/AudioSettingsCommands.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/GraphicsSettingsCommands.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/GraphicsSettingsCommands.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/InputSettingsCommands.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/InputSettingsCommands.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/PhysicsSettingsCommands.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/PhysicsSettingsCommands.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/PlayerSettingsCommands.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/PlayerSettingsCommands.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/ProjectSettingsAsset.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/ProjectSettingsAsset.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/ProjectSettingsCommand.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/ProjectSettingsCommand.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/ProjectSettingsResponse.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/ProjectSettingsResponse.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/QualitySettingsCommands.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/QualitySettingsCommands.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/TagsLayersCommands.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/TagsLayersCommands.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/TimeSettingsCommands.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/TimeSettingsCommands.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/RecompileCommand.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/RecompileCommand.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Scenes.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Scenes/SceneCommands.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Scenes/SceneCommands.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Scenes/SceneHierarchy.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Scenes/SceneHierarchy.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ScreenshotCommand.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ScreenshotCommand.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Scripts.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Scripts/AttachScriptCommand.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Scripts/AttachScriptCommand.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Scripts/CreateScriptCommand.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Scripts/CreateScriptCommand.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Scripts/ScriptTypeResolver.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Scripts/ScriptTypeResolver.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Scripts/SerializedFieldCommands.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Scripts/SerializedFieldCommands.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Scripts/SerializedPropertyConverter.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Scripts/SerializedPropertyConverter.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/TestCommands.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/TestCommands.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Console.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Console/EditorConsoleCaptureBootstrap.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Console/EditorConsoleCaptureBootstrap.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/EditorPipelineManager.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/EditorPipelineManager.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/EditorPipelineManagerEditor.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/EditorPipelineManagerEditor.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/EditorPipelineServer.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/EditorPipelineServer.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/EditorPipelineStartup.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/EditorPipelineStartup.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/PipelineTransactionLog.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/PipelineTransactionLog.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Testing.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Testing/PipelineTestRunner.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Testing/PipelineTestRunner.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Testing/TestResultCollector.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Testing/TestResultCollector.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/TypeCacheCommandDiscovery.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/TypeCacheCommandDiscovery.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Unity.Pipeline.Editor.asmdef create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Unity.Pipeline.Editor.asmdef.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/LICENSE.md create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/LICENSE.md.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/README.md create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/README.md.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/AssemblyInfo.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/AssemblyInfo.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Commands.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Commands/CaptureRuntimeElementCommand.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Commands/CaptureRuntimeElementCommand.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Commands/CodeEvalCommand.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Commands/CodeEvalCommand.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Commands/ConsoleCommand.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Commands/ConsoleCommand.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Commands/HotReloadCommands.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Commands/HotReloadCommands.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Commands/RuntimeApplicationCommand.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Commands/RuntimeApplicationCommand.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Commands/RuntimeInputCommand.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Commands/RuntimeInputCommand.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Commands/RuntimeLogCommand.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Commands/RuntimeLogCommand.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Commands/RuntimeStatusCommand.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Commands/RuntimeStatusCommand.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Commands/VisualElementCaptureSupport.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Commands/VisualElementCaptureSupport.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/BasePipelineServer.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/BasePipelineServer.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/CliArgAttribute.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/CliArgAttribute.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/CliCommandAttribute.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/CliCommandAttribute.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/CommandInfo.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/CommandInfo.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/CommandRegistry.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/CommandRegistry.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/Dispatcher.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/Dispatcher.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/FilePermissions.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/FilePermissions.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/ICommandDiscovery.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/ICommandDiscovery.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/IStructuredCommandInput.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/IStructuredCommandInput.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/JsonSchemaGenerator.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/JsonSchemaGenerator.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/MaxLengthStream.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/MaxLengthStream.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/ParameterInfo.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/ParameterInfo.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/PipelineUtils.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/PipelineUtils.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Compilation.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Compilation/EvalCodeCompiler.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Compilation/EvalCodeCompiler.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Compilation/HotReloadCompiler.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Compilation/HotReloadCompiler.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Compilation/RoslynCompilationService.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Compilation/RoslynCompilationService.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Console.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Console/ConsoleLogBuffer.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Console/ConsoleLogBuffer.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Console/ConsoleLogCapture.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Console/ConsoleLogCapture.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/HotReload.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/HotReload/AccessibilityValidator.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/HotReload/AccessibilityValidator.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/HotReload/HotReloadAttributes.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/HotReload/HotReloadAttributes.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/HotReload/HotReloadHelper.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/HotReload/HotReloadHelper.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/HotReload/HotReloadRegistry.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/HotReload/HotReloadRegistry.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/HotReload/InPlaceReloadProcessor.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/HotReload/InPlaceReloadProcessor.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/HotReload/OverrideFileValidator.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/HotReload/OverrideFileValidator.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/HotReload/SourceCodeTransformer.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/HotReload/SourceCodeTransformer.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/AuthoringResult.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/AuthoringResult.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/BaseResponse.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/BaseResponse.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/CommandExecutionRequest.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/CommandExecutionRequest.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/CommandExecutionResponse.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/CommandExecutionResponse.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/ConsoleLogEntry.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/ConsoleLogEntry.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/ConsoleLogResponse.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/ConsoleLogResponse.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/EvalResponse.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/EvalResponse.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/InstanceDescriptor.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/InstanceDescriptor.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/ObjectRef.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/ObjectRef.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/ObjectRefConverter.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/ObjectRefConverter.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/RuntimeInstanceDescriptor.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/RuntimeInstanceDescriptor.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/StatusResponse.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/StatusResponse.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/TestExecutionResponse.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/TestExecutionResponse.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/TestResult.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/TestResult.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/TestSummary.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/TestSummary.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/PlayerSupport.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/PlayerSupport/FrameStatsSampler.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/PlayerSupport/FrameStatsSampler.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/PlayerSupport/RuntimePipelineConfig.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/PlayerSupport/RuntimePipelineConfig.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/PlayerSupport/RuntimePipelineManager.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/PlayerSupport/RuntimePipelineManager.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/PlayerSupport/RuntimePipelineServer.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/PlayerSupport/RuntimePipelineServer.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Plugins.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Plugins/CodeAnalysis.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Plugins/CodeAnalysis/CHECKSUMS create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Plugins/CodeAnalysis/CHECKSUMS.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Plugins/CodeAnalysis/Microsoft.CodeAnalysis.CSharp.dll create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Plugins/CodeAnalysis/Microsoft.CodeAnalysis.CSharp.dll.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Plugins/CodeAnalysis/Microsoft.CodeAnalysis.dll create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Plugins/CodeAnalysis/Microsoft.CodeAnalysis.dll.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Plugins/CodeAnalysis/System.Collections.Immutable.dll create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Plugins/CodeAnalysis/System.Collections.Immutable.dll.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Plugins/CodeAnalysis/System.Reflection.Metadata.dll create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Plugins/CodeAnalysis/System.Reflection.Metadata.dll.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Plugins/CodeAnalysis/System.Runtime.CompilerServices.Unsafe.dll create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Plugins/CodeAnalysis/System.Runtime.CompilerServices.Unsafe.dll.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/SecurityTokenManager.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/SecurityTokenManager.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Unity.Pipeline.asmdef create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Unity.Pipeline.asmdef.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Samples~/HotReload.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Samples~/HotReload/HotReload_InPlace.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Samples~/HotReload/HotReload_InPlace/HotReload_InPlace.unity create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Samples~/HotReload/HotReload_InPlace/HotReload_InPlace.unity.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Samples~/HotReload/HotReload_InPlace/InPlaceHotReloadExample.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Samples~/HotReload/HotReload_InPlace/InPlaceHotReloadExample.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Samples~/HotReload/HotReload_WithHelpers.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Samples~/HotReload/HotReload_WithHelpers/BossController.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Samples~/HotReload/HotReload_WithHelpers/BossController.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Samples~/HotReload/HotReload_WithHelpers/BossOverrides.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Samples~/HotReload/HotReload_WithHelpers/BossOverrides.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Samples~/HotReload/HotReload_WithHelpers/HotReloadTestManager.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Samples~/HotReload/HotReload_WithHelpers/HotReloadTestManager.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Samples~/HotReload/HotReload_WithHelpers/HotReload_WithHelpers.unity create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Samples~/HotReload/HotReload_WithHelpers/HotReload_WithHelpers.unity.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Samples~/HotReload/HotReload_WithHelpers/PlayerController.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Samples~/HotReload/HotReload_WithHelpers/PlayerController.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Samples~/HotReload/HotReload_WithHelpers/PlayerOverrides.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Samples~/HotReload/HotReload_WithHelpers/PlayerOverrides.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Samples~/HotReload/Unity.Pipeline.Samples.asmdef create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Samples~/HotReload/Unity.Pipeline.Samples.asmdef.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/Animation.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/Animation/AnimationClipCommandsTests.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/Animation/AnimationClipCommandsTests.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/Animation/AnimatorControllerCommandsTests.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/Animation/AnimatorControllerCommandsTests.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/Animation/TimelineCommandsTests.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/Animation/TimelineCommandsTests.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/ApiEndpointsTests.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/ApiEndpointsTests.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/Assets.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/Assets/AssetCommandsTests.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/Assets/AssetCommandsTests.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/Assets/AssetImportCommandsTests.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/Assets/AssetImportCommandsTests.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/Assets/ImportSettingsCommandTests.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/Assets/ImportSettingsCommandTests.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/Assets/MaterialAssetCommandsTests.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/Assets/MaterialAssetCommandsTests.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/Assets/PhysicsMaterialAssetCommandsTests.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/Assets/PhysicsMaterialAssetCommandsTests.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/Assets/TextFileCommandsTests.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/Assets/TextFileCommandsTests.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/Authoring.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/Authoring/FolderCommandsTests.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/Authoring/FolderCommandsTests.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/Authoring/ObjectRefConverterTests.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/Authoring/ObjectRefConverterTests.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/Authoring/ObjectResolverTests.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/Authoring/ObjectResolverTests.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/Authoring/ProjectPathsTests.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/Authoring/ProjectPathsTests.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/Baking.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/Baking/LightingBakeCommandsTests.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/Baking/LightingBakeCommandsTests.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/Baking/NavMeshBakeCommandsTests.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/Baking/NavMeshBakeCommandsTests.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/Baking/OcclusionBakeCommandsTests.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/Baking/OcclusionBakeCommandsTests.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/BuildConfigCommandsTests.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/BuildConfigCommandsTests.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/Capture.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/Capture/CaptureCommandsTests.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/Capture/CaptureCommandsTests.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/CaptureVisualElementCommandsTests.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/CaptureVisualElementCommandsTests.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/CodeEvalCommandTests.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/CodeEvalCommandTests.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/CommandRegistrationTests.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/CommandRegistrationTests.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/ConsoleCommandTests.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/ConsoleCommandTests.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/ConsoleLogBufferTests.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/ConsoleLogBufferTests.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/E2E.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/E2E/AgentAuthoringE2ETests.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/E2E/AgentAuthoringE2ETests.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/EditorStatusCommandTests.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/EditorStatusCommandTests.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/EditorTestUtilities.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/EditorTestUtilities.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/EvalCodeCompilerTests.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/EvalCodeCompilerTests.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/FrameStatsSamplerTests.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/FrameStatsSamplerTests.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/GameObjects.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/GameObjects/CoercionAndBatchTests.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/GameObjects/CoercionAndBatchTests.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/GameObjects/ComponentCommandsTests.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/GameObjects/ComponentCommandsTests.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/GameObjects/GameObjectCommandsTests.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/GameObjects/GameObjectCommandsTests.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/HotReloadAssemblyDirectoryTests.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/HotReloadAssemblyDirectoryTests.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/HotReloadAttributeTests.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/HotReloadAttributeTests.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/HotReloadBasicTests.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/HotReloadBasicTests.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/HotReloadCommandTests.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/HotReloadCommandTests.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/HotReloadCompilerTests.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/HotReloadCompilerTests.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/HotReloadInPlaceTests.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/HotReloadInPlaceTests.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/HotReloadIntegrationTests.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/HotReloadIntegrationTests.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/HotReloadRegistryTests.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/HotReloadRegistryTests.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/HotReloadVerificationTests.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/HotReloadVerificationTests.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/InstanceDiscoveryTests.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/InstanceDiscoveryTests.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/LiveServerGuard.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/LiveServerGuard.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/LoopbackBindingTests.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/LoopbackBindingTests.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/Materials.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/Materials/MaterialCommandsTests.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/Materials/MaterialCommandsTests.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/Materials/ShaderCommandsTests.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/Materials/ShaderCommandsTests.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/MaxLengthStreamTests.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/MaxLengthStreamTests.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/MenuCommandTests.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/MenuCommandTests.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/Models.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/Models/ObjectRefConverterTests.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/Models/ObjectRefConverterTests.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/Navigation.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/Navigation/NavigationCommandsTests.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/Navigation/NavigationCommandsTests.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/Observability.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/Observability/ObservabilityCommandsTests.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/Observability/ObservabilityCommandsTests.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/OverrideFileValidatorTests.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/OverrideFileValidatorTests.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/PackageManagerCommandTests.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/PackageManagerCommandTests.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/PipelineRuntimeBuildProcessorTests.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/PipelineRuntimeBuildProcessorTests.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/PipelineTestServer.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/PipelineTestServer.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/PipelineTransactionLogTests.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/PipelineTransactionLogTests.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/PipelineWatchdogTestGuard.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/PipelineWatchdogTestGuard.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/PlayModeCommandsTests.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/PlayModeCommandsTests.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/PlayModeReloadGuard.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/PlayModeReloadGuard.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/Prefabs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/Prefabs/PrefabCommandsTests.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/Prefabs/PrefabCommandsTests.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/ProjectSettingsCommandTests.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/ProjectSettingsCommandTests.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/ProjectSettingsGroupCommandsTests.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/ProjectSettingsGroupCommandsTests.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/RecompileCommandTests.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/RecompileCommandTests.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/ReloadPathValidationTests.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/ReloadPathValidationTests.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/RoslynChecksumTests.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/RoslynChecksumTests.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/RoslynCompilationServiceTests.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/RoslynCompilationServiceTests.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/RuntimeApplicationCommandTests.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/RuntimeApplicationCommandTests.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/RuntimeInputCommandTests.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/RuntimeInputCommandTests.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/RuntimeLogCommandTests.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/RuntimeLogCommandTests.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/RuntimePipelineBuildTests.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/RuntimePipelineBuildTests.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/RuntimePipelineManagerTests.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/RuntimePipelineManagerTests.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/RuntimePipelineServerTests.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/RuntimePipelineServerTests.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/RuntimeStatusCommandTests.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/RuntimeStatusCommandTests.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/Scenes.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/Scenes/SceneCommandsTests.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/Scenes/SceneCommandsTests.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/ScreenshotCommandTests.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/ScreenshotCommandTests.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/Scripts.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/Scripts/ScriptCommandsTests.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/Scripts/ScriptCommandsTests.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/SecurityTokenTests.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/SecurityTokenTests.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/ServerAuthTests.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/ServerAuthTests.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/ServerLifecycle.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/ServerLifecycle/DualServerTests.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/ServerLifecycle/DualServerTests.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/ServerLifecycle/EndToEndTests.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/ServerLifecycle/EndToEndTests.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/ServerLifecycle/GlobalServerStateGuard.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/ServerLifecycle/GlobalServerStateGuard.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/ServerLifecycle/GlobalServerStateGuardTests.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/ServerLifecycle/GlobalServerStateGuardTests.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/ServerLifecycle/PipelineServerTests.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/ServerLifecycle/PipelineServerTests.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/TestCommandsTests.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/TestCommandsTests.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/TestEditorPipelineServer.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/TestEditorPipelineServer.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/Unity.Pipeline.Tests.Editor.asmdef create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Editor/Unity.Pipeline.Tests.Editor.asmdef.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Runtime.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Runtime/AttachByPathFixture.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Runtime/AttachByPathFixture.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Runtime/HotReloadCliIntegrationTests.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Runtime/HotReloadCliIntegrationTests.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Runtime/HotReloadInPlaceEditingTests.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Runtime/HotReloadInPlaceEditingTests.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Runtime/PipelineClient.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Runtime/PipelineClient.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Runtime/RuntimeServerPlayModeSmokeTests.cs create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Runtime/RuntimeServerPlayModeSmokeTests.cs.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Runtime/Unity.Pipeline.Tests.Runtime.asmdef create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Tests/Runtime/Unity.Pipeline.Tests.Runtime.asmdef.meta create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/package.json create mode 100644 Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/package.json.meta diff --git a/.codex/AGENTS.md b/.codex/AGENTS.md new file mode 100644 index 00000000..220862a3 --- /dev/null +++ b/.codex/AGENTS.md @@ -0,0 +1 @@ +进行 Unity 开发时,必须阅读并遵循UNITY-GUIDE.md。 \ No newline at end of file diff --git a/.codex/UNITY-GUIDE.md b/.codex/UNITY-GUIDE.md new file mode 100644 index 00000000..53782132 --- /dev/null +++ b/.codex/UNITY-GUIDE.md @@ -0,0 +1,52 @@ +# Unity 操作规范 + +本文规定 Agent 进行 Unity 开发时的工具选择、内容操作边界与验证要求。 + +## 1. 核心工具 + +- 统一通过 Unity CLI/Pipeline 与 Unity 交互,不使用 Unity MCP。 +- 与 Unity 交互时必须使用 `unity-pipeline` 技能,并遵循其中的命令、参数、状态轮询和操作流程说明。 +- 存在多个可连接的 Unity Editor 或开发版 Player 时,必须显式指定目标,避免误操作。 +- 使用 `unity command` 查看当前实例支持的命令,不假定所有实例或 Pipeline 版本能力相同。 + +## 2. 操作边界 + +### 可直接编辑 + +- 普通 `.cs` 源码由 Agent 直接创建或修改。 +- Shader、CSV、JSON、Markdown 等纯文本也可直接编辑。 +- 涉及多个脚本或文本文件时,先批量完成修改,再统一让 Unity 刷新和编译,避免逐文件导入及重复的编译与重载。 +- Pipeline 不可达时仅可进行上述纯文本编辑,不得修改序列化资源。若未能完成 Unity 编译、测试或运行验证,须明确说明。 + +### 必须使用 Pipeline + +- 创建或修改场景、Prefab、Material、ScriptableObject、AnimationClip、AnimatorController、Timeline 等由 Unity 管理的序列化内容。 +- 导入图片、模型、音频、插件、DLL 等外部资产。 +- 移动、重命名、复制或删除 `Assets/` 下的既有文件和文件夹。 +- 场景对象操作,包括 GameObject 的创建、删除、层级、Transform、组件及其序列化字段。 +- Unity 工程设置,包括 Build Settings、Tags/Layers、Input、Quality、Graphics、Player Settings 等。 +- 场景、Prefab、材质和视觉效果等项目内容,应在编辑器中制作并持久化,提供必要的可调参数。不得以运行时代码临时创建来替代资产制作。 + +### 禁止直接操作 + + +- 禁止手动创建、复制、修改或删除 `.meta` 文件,尤其不得改写其中的 GUID。 +- 禁止使用文件系统工具复制、移动、重命名或删除 `Assets/` 下的既有资源。 + +- 禁止手动修改 Unity 序列化资源文件,如 `.unity`、`.prefab`、`.mat`、`.asset`、`.controller`、`.anim` 等。 +- 禁止手动修改 Unity 生成内容或本地状态文件,如 `Library/`、`Temp/`、`Logs/`、`UserSettings/`、`*.csproj`、`*.sln` 等。 +- 禁止以字节方式改写二进制资产。 + +## 3. 操作原则 + +- 操作 Unity 对象前先查询并确认目标,仅执行任务所需的最小操作,完成后回读确认。 +- 更改序列化字段、组件类或程序集结构时,必须同步维护相关资源的兼容与脚本绑定。 +- 大范围重新导入、切换构建目标、构建 Player 或批量改写资源必须获得明确授权。 +- 优先使用专用操作及其提供的类型校验、Undo、预览和确认机制。 +- 仅在缺少合适专用操作时,才使用 `eval` 类命令在编辑器中执行 C# 代码。代码应限于任务所需的最小范围,并按需处理 Undo、SerializedObject、AssetDatabase、脏标记和保存流程。 + +## 4. 验证与收尾 + +- 修改代码或资源后,必须通过相关测试或最小场景验证;涉及视觉改动时,还须检查实际画面。 +- 验证时区分历史 Console 日志与本轮新增错误,避免将历史错误归因于当前改动。 +- Scene、Prefab 编辑和 Play Mode 等临时状态结束后,必须按意图保存或放弃修改,并恢复 Editor 状态。 diff --git a/.codex/skills/default/SKILL.md b/.codex/skills/default/SKILL.md new file mode 100644 index 00000000..e9f6a043 --- /dev/null +++ b/.codex/skills/default/SKILL.md @@ -0,0 +1,8 @@ +--- +name: default +description: Project default instructions for Unity development. Use whenever working on Unity code, Unity assets, Unity packages, Unity Editor automation, build configuration, tests, or any other Unity project changes in this repository. +--- + +# Default + +进行 Unity 开发时,必须阅读并遵循 `.codex\UNITY-GUIDE.md`。 \ No newline at end of file diff --git a/.codex/skills/default/agents/openai.yaml b/.codex/skills/default/agents/openai.yaml new file mode 100644 index 00000000..88deb80a --- /dev/null +++ b/.codex/skills/default/agents/openai.yaml @@ -0,0 +1,4 @@ +interface: + display_name: "Default" + short_description: "Read and follow the project Unity guide for Unity development." + default_prompt: "Follow the project Unity development guide." \ No newline at end of file diff --git a/.codex/skills/unity-pipeline/SKILL.md b/.codex/skills/unity-pipeline/SKILL.md new file mode 100644 index 00000000..f008d4b8 --- /dev/null +++ b/.codex/skills/unity-pipeline/SKILL.md @@ -0,0 +1,116 @@ +--- +name: unity-pipeline +description: Drive a running Unity Editor or development Player from the command line via the unity-pipeline package — install the package, keep the editor ticking while unfocused, run the edit→recompile→run_tests loop, evaluate C#, and hot-reload files at runtime. Use when an agent needs to control a live Unity instance, automate Unity tests, recompile scripts headlessly, or apply runtime hot reloads. Assumes the `unity` CLI is on PATH. +--- + +# Unity Pipeline (agent control) + +Invoke commands with `unity command [args]`. Run `unity command` with no name to +list what an instance exposes. Two servers exist: **Editor** (`7800-7849`, auto-starts with +the editor) and **Runtime** (`7900-7949`, only in a dev Player build). See the package +`README.md` "Commands" reference for the full list and parameters. + +## 1. Install & verify + +```bash +unity pipeline install # install into current project (or --project-path) +unity pipeline list # confirm the editor instance + server are reachable +unity command editor_status # confirm the editor server answers +``` + +## 2. Autonomous edit loop (Editor) + +This is the core agent workflow: keep the editor alive, change code, recompile, test. + +```bash +# 1. Keep the editor ticking even when unfocused/minimized. REQUIRED before headless work — +# Unity otherwise throttles or stalls update/compile when it isn't the active app. +unity command set_autotick --enable true + +# 2. Edit C# source files on disk normally. + +# 3. Recompile (async: triggers a domain reload, then poll until done). +unity command recompile +unity command recompile_status # repeat until "completed" or "up_to_date" +# Tolerate connection errors while the domain reload is in flight — that is expected. +# If recompile_status reports failed=true, read its "errors" array and fix before testing. + +# 4. (Optional) List available tests without running them. +unity command list_tests --mode editor # mode: all | editor | playmode + +# 5. Run tests (filter to keep it fast). +unity command run_tests --mode editor --filter MyFixture.MyTest +``` + +`run_tests` modes: `all` | `editor` | `playmode`. `filter_type`: `testName` | `assembly` | +`category`. For long runs use `--async_tests true` and poll `unity command test_status` +(abort with `unity command cancel_tests`). + +> **Known caveat:** when any selected test *fails*, `run_tests` may surface an opaque +> result instead of the failure details. Re-run a narrower `--filter`, or inspect the +> editor's Test Runner / logs to get the real failure. + +## 3. Runtime hot reload + +Change gameplay code in a **running** game with no domain reload. The game must be live: +enter Editor Play Mode (`unity command editor_play`) or run a dev Player. A +`RuntimePipelineManager` in the scene auto-discovers tagged methods on `Awake` (no manual +registration). Mono only — Editor Play Mode and Mono desktop dev builds, not IL2CPP. The token +is auto-injected for local requests. + +### Prefer: in-place — `reload_file` + +Edit the method body directly; no separate file, no boilerplate. + +1. Tag the method `[HotReload]` on the MonoBehaviour. +2. Edit its body on disk. +3. Apply (re-run to iterate): + ```bash + unity command reload_file --filename Assets/Spinner.cs + ``` + Add `--pdb` to make it debuggable — emits a portable PDB mapped to your source so breakpoints in + the original file bind (attach the IDE + enable Editor Attaching; compiles unoptimized): + ```bash + unity command reload_file --filename Assets/Spinner.cs --pdb + ``` + +Constraints: `void` instance methods only; **public** members only; debugging requires `--pdb` +(the default emits no symbols). + +### Alternative: with helper — `reload_file_override` + +Keep the original method; put the tweak in a **separate** override file. + +1. Tag the method `[HotReloadWithOverrides]` and route it via + `HotReloadHelper.ExecuteWithHotReload(this, "Update", OriginalUpdate)` (original body in `OriginalUpdate`). +2. In a **separate file that does not redeclare the target type**, add a `public static` + method tagged `[HotReloadOverrideMethod("BossController.Update")]` taking the instance first. +3. Apply: `unity command reload_file_override --filename Assets/HotReload/BossOverrides.cs` + +Constraints: **public** members only; you cannot break into the override. + +`unity command hotreload_status` shows active overrides. `reload_file_override*` options: `--timeout ` +(default 30000), `--assemblyDir ` (persist DLLs instead of in-memory); +`cleanup_hotreload --assemblyDir ` clears old DLLs. Both commands validate the file up front +and return a clear error on misconfiguration (no override found, target type redeclared, bad signature). + +## 4. Quick C# eval (Runtime) + +```bash +unity command eval "return 2 + 2;" +# Or evaluate a .cs file on disk (contents run through the same path): +unity command eval_file Assets/Scratch.cs +``` + +## Gotchas + +- **`set_autotick` first.** Without it, recompile and tests can hang while the editor is + unfocused. The package's watchdog relies on the tick loop staying alive. +- **Hot reload needs the game running.** `reload_file_override` / `reload_file` apply to a live + game — enter Editor Play Mode (`unity command editor_play`) first, or run a dev Player. +- **Player-only commands need a dev Player.** `log`, `set_timescale`, `runtime_status`, etc. hit + the Runtime server, which does not run in the Editor. +- **Async commands poll.** `recompile`→`recompile_status`, `run_tests --async_tests`→ + `test_status`. Never assume completion from the trigger call's response. +- **Target a specific instance** with `--instance host:port` or `--project-path ` + when more than one is running. diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/.attestation.p7m b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/.attestation.p7m new file mode 100644 index 0000000000000000000000000000000000000000..5dbd010816f5885fa9921b440009c75a9b932ff2 GIT binary patch literal 10926 zcmdUVXH*p1wl3W?Ip>TGk|b6`6D2n}OU^-Pa%jm>p@9|zC99xB$w>)<0Y##cK>-N@ zf(l4ff`BO8#w~64AESZUAp;SB^U(aa z05ty%FbD)A14!_R>@gZ3BrXID0?;75KQ9F3MeT4!Z9$?whj9iXef`{gyg6lHf}GAi zzFrRgoHCpazK*VLfk;k4PB(9Vq>Hbce+c%hpR0qYxP*`?0uJcvNh%xq>LH~?+|5i8 zhI(e+Zqgd(G?YB0+`No5V9w6U8d?IOj&j%tC2FwM`4%}pl~#ROCxnW05$dv@bgDHLDk_jC6GM_VM&_ zaYOn+jnt0EacTZ~96*CPPd*tC9u6)VOo4+vPYgzbK{&Pg!~r7SVCNegvfd#?Rg8ln ziWd1E-kk2_o;{s1BG7s79FIx;ia{Q|G(3}sLL~=DyfZmiMg(q1H7R_vx1A^MlnbT}&~&TeZMh@B3P5w;!n_gnLo& z373?#=}d{;t66c%GHG8%JMcz-99z_~miW?b?xNf(B&PEz)Nm;F0Sy!IEx7-1Z8OHUbKJGy`zLJy(s7E4RBc{RfKS*=$(D)&hMUKPd@ zkUtuRLL>okKnx$>C5jXT0Rd+KUVK6Ud=MTU0T@Kj;_B~@k`WOJ3JMZ-!lt4lHWh`j z^+g0>U<8mK&8Gl?4j~X+FhL|hb9BrNAq9w!BjDl!QTLC|o`OVG0a4|EQQo;ceT?qU zsE)p#V!wwy&g!2@tqwm*>7N<>Gok;;=c9DSX0tFh#D5P8|2G7UNNAPnQrTkvu8L;bcIVEyYVFvj5cMjehGoZoL3iu^C`)&ED4WTSzA0i2VC0$W0{ zg#v^#66K*cfTOZJB z6stDW^`qfabiD!}yQZn^T&EPV|Az@7! zWx#*B=u)96edq(<0NXn9y3AS4qN?7nPBTu#hE6)vk1<nW(yh!Y-A!8QLyLjvH<`)G zZ7(X=aX6lsB)mvg-61mSFiFhIA3%9NBeo zQ47dv1q44Iuc2y6vVk(!Ogu0=bD=us?3XW2zMIB|l)Q^_ZyT#89kUl$xbAEBU)Ol+ zN^|XA@t|SWuujy)oWL0M7Ot*}MAd?(Tw#|Rm+lEu`skyHo=saWkRCeC$mH}@VB8hA z05twR01dhM6Lkrz6l?8Y-qy*r?JIkdRy}_5l_ABV?)l%Lj_yYWV^Np%_|-fDT^JL< zfK6ct2@U1HRsk5tj~ax9W5!=Ij^WtQ$HyOw$v@y02Eaw7f5EMo1olws7;gWA$p3ff zI#Ms9JjhoS+-Nf*ZNX9#r@SqexGWcS1J&`kJ(dT^ExhJBX1%=(=OUQZ)_)a@*kX9i zKC$<5#D&>VpFH2}TU=&KN^cadye^8%sqX3=VFWxvC(?}C1Cf=v(Q)?F#(IysB~7tT z9SF+3N%<%#8%G}$rmZphP7ERjk zTw>isx~3H9>Y%AK3|*%wpU|4wEHcs{J1*7g#|ml`n#PEa?g`&6$DtdNJYdF8Zw-I3 z#3DN1-MUqB2bbKx=&p1_g+2AV#nFd5u-P|N?-}#PT28C0*X2`q->LAri670<=x{o^sx08Iwqaf^KWg%HWn9Gh)eF_3Z&FZggo7;B4iIJ zM)p2_r(v)el)`*4X;7f{!omFJb~u<`Hkz+W8nZIoNM0d!Se-L0Ssle6}fB+xwh*aPLgumFu3EGb>KtC``=Cq33Rl>lvq$ZinSEg^l%tgBz z@J+#nd4K1fbl)1B?z^4s{bN z`+F8U#IAh$VW6~J&T!^{))e2e9Z!CSxyA_d!E0WH@5w`fm?_qK_STzZrE72F^Pfo1 zO6g5_KbFYe|G;5n+1CBh{d0l*B;tYC3w)+3aTc3)TGTD*5l0cN- zL-G;Ed??IhEq!73>Fp9?{81j4#?*N|yXnwM%>m&;|J15U*}~hHQ}0?#Sp-fWCf#3( z3qyI#=RNu^qo7*czDS>9n4t7bBS!nWZiR~CyQ`n*`1)5rGnx|ci%_B~|k! z%JwA1k&rc?-Rfr#yS9FRxu@|{5Y7AopF$;db&&|Cr_vtUn$Ee`lf1hF)Aof&jFdn- z?-c>q-CYsT(1w?ugFdcei6xw~AoJ?RGZ0wPV$CV~o>y`T-+y6a)G+z`-B=BdJ+rg* zw{cf7s$2CA-p#IaJocES7kA4J(%BXqS!6J#!Fn(>ixz-pQNs#qAmTqL1ph*mo>cRB zXb>~N_)Db{;li+^$1VT}5czdL1c7lvpp};*)4#mZUP?IUJAqWR1rN{*`lqmDc^36% zpS^mgV+@Gu#V7eWorn@F0*h(_q8qqtTZa^duG#H06ntAT+%O*nS2hEEb zm~YA7mRUv@`^30|>3Q@@O}W$KxGc)1@0QKzBG?(jIv`1bh0PClXUb=L7xRc1CQqLN zbHd6aq=!iSQbXekOo!*xg9n6{gZem9H7o7-%$fY=Oom8pI7%x<=-T+xvu4_bi$-RR zM7FG)3*MrZ>KtX4%}E63@tvHz>%!}8zdz;P9PZ!$^fo9$O%V3BW)nAs+yUWyTfXiQ z#3?x8^Wyz^E1eO>+8kc)kSdojT^N*0_v>t~RL@E!DOTOM!YfZ47Cxv;m{A>{cfcO z=DI~L#hZ*lpI)5GBNXZc@joI&zJ}cxdU&WleffSJk&uDaPQ+I_jwclKN);;8`%I%3 zHrnb2XE!Q%26(fZ2}g4!qto~)0PQQSJGz%|arjGqPxGF?A$IO1YpflaL`@RWo3}m~ z9`UbNt6HCrlhW5LrFBloWTlprG%Y4|8tnspce>7<9~T|Fh14{E!F`3Do#9i97Qynn zPWs2eRF~WX@-I1R`4)zWt$NUNxSg-!7*)7k^LFnX+gkmt}y%KrWx)Ei7`k%^It?>j74dgzk7zi;!5 zkpe3pB>+iLI7|$X1SBoN#Nq|~OBvd{C}dI|nnni8qgSy!dgLdMCXQTZ)V}%|4?WZ# zSd!uIdXh)~``jyIH!q}-zk?U*U)(FKA9&u(=FM{qzpKUmS)b-j$YU&dA2;%p~Hak38yFp4`!-~xO=PA+3u;Q(cUq!O4r)p#a?QGISSuNN62Bi5idGX{$`t6nHvaBulDLas^kD-Xl~Hw0_Dr^})+Ur$%wM z@A2>s?O8ItqNZDg&mVle%nm0b37_OG>-xw&CnWG`_DtPp-Lshdi=Vh&yQ;i5@!Se9 zv1oh9d)Xw@dhU7T*|qG6XAR4ngL1F-Mw!KXnJ;!IGo_}-;`WRN#`3Y=FDXMx`a^4J zy*%>y-?GCmU%w0MKEII2^HL~BE_ttTL$EeM48ak6_`NN!>e_M!Yg$Gg`V#qsrixx` z*yCQ6P^yB9VDp5vxK{zf`sVxep-ZN9b#BCTTnjl`uck9bso-6y3}K6$xOnwL`J0uJ z92|YOl$qTIuMn%Uk3IavRotW#k0L^tv}U1lBX_>-hm;%>=?pB9P60@N5$Pk>;!jWN z{n>9Du+{J1UvH*daAYz-3^*h%{^n_|`xt3`e2*U<+C7(S`bA_|bEQY`cM6R)o#>CE zb05+4lfDxn5S4LEh>!f6I3Oza9};Ps<9S#jeeRe5|0DnAWCH(bR$+7MD0}}ftNa1G zKS;JYU!yLjv6vO`c zdJXbpFzIsHb?5#rXq?cXeJsVe&~xR_ox=uedq{q(%a)vli`M59xGCCk7*8R6M~!sm zbf!~g_$VQMw0LTCd~=uX(coetHC_mlJE$kdM2?le z^Po3PrFIsyvUcdZ{7R{US8R|T6?4i|db9c)CsD36r9O$FRthGj(J`Bx9slO4!iSdW zba2A~i=N>gPuQ=LvOx(s?)SZ4Pw z$wktnP*x%{R`8yd*;so{k4FyYx)H01lm2q?=spLP#Pu#>S+u>^oxMi4&ZKP;VPUxr zNf1(>xnbe`E&}g+M|GU=fRxkzd~w3kj&f6oCuVF)+z-v6vEts?=Yj>idMx1G{t0+w z&nwOF4mmP~6%m}IGMbow1-$>1aU_nlrX~MGIw=4KgC8T^zlZ*wOsQYc_Y(R*43AzQcVDp~sd%;Asl1_^6rtG`CXVWN3d{urs7I6S-)QoHg zO|wP2Aee7tGL}4jXWwC9!=t{xDpV~Wd1uAp8{}~f#9Q&nzEWUY43Us=8l{gYhz+fD zo^+H`S~gf_EEd&XSaw!*f?;qVd{9ff!Lsi~INa8!q%q6IK0}h({gLM@!r^P3KB*w5 zYR)J3mE&*i%MO~CUN|Fef*wzo#cN!kqot$bA+LjJjC*{WB-2xoMzUJj0wib z_Pk_vwRe*p>89tM%a-31ab=@V*8fr(uK99-difGlXOZ}v!9uEVt1lWoP*Qy>S$x~s zfL$w{d&h|!_WnY*_RL=-;Q0WIZ5|qYAtLJb6m;;y%3iQs3a^jyPuE zl78DQYka>?i)*nuj&Auj8ShA68hE_e8WeMn;o50jmSxdMn%C}|xY!lsAa%e&Xh8E| z_(1htl7J>UWDE0kWQqAY)6}vcp3u^U?-wInd3aCz1BOczd)bbZt<9ue%^p;S=$P=_ z63Lu-r7eb*XAnk#A$9jF4PoAi?AzvFaH4TH%xkMZGEG1gT80`LPWcWe;0%Gn1H_k} zbiK;DF|EwDmv+0Ka4%J&%J|e(f1DAgJ68{g#;f0nh+`z~nC-&+HA$ZvX&EJ4R%*?4 zp%j6D%VAdK_t&0?y$r>@*8db@DL>HAt-;D<1J}LsMfk~T&qUl6iIOUnAouY0R;x{C zzS;<}cR~+4)LyKdC;KjA67I{7D5yRtedSncJ ztZOnQ>M_dOyOJrKN zKLMYAhgr?@$$qZWkKfy9$pV~!o7hTg3Ab<;hup@MF^ksOGbM876@giO)nP0#WbMGI zO_o9_`eoD38(wS`wILhbR4?D#jpE4~QW&1<%%Ll~_%yf7jNZb;_pWOisTx0WVqymllCBV4pT6dVuyQ(gI+YjOku%3xD+c(#eA}1PB zZYm~+v;{wJsA<3N&M1XTd39`9vQQW=B5oTkPnm+MFhMJczMh2m@q4F$!Z~z?o2prG z18jnw$7NtDSz?OKgs&|%3tQ*Q@?540d7JX}rSDUjGwg6#t0g(@w7A6u-VBtpuu%@Y z9DlHuYc*_wJbK? zF{2H^>5X8`XiM7RsI8@He0*tRBoQU3WM5w6$f%OR9C-fXm&kkji%!L2L-7Q&Pa5YD zg^Ul1gFv$s>7*QNwZ><-<2^r+8=h15f67zYpcH_$f9*)5S z=Omg5*9lN?T;Z^5ho1BBsj0vu=(mol+GRt(<+FD@ODd?jNX(PD{oYOFCY#Xqcv&sm zhvQEPKv=H>BmqzyiH0A|4m!kmi7WRJamfSN#zr2t zv4MdfNBTc1uKym!^T%gESY1U7VB10X5Uj-dtpop~n*jphpz@j#)+P&5c6oRFS>zh% zU+*-V5j@GN%)czS5^Gz={Frn1GP9d8=W1bGkk=Dt+ASKbP!XX%RFK^_e}{`X%_dG(o&7!wZ)d zElNK%i;xt5+4T+kx5+5-Oc#kgM8C#D}^I+i#2b)vyN>ASy~$>`mE<0 z$bAbWa*fIL>7ImM6}M*v`=Ev~}@<`)Lo( zL+S^{LcABpWX3-=T)zI@YRI~hu}wGEuMt$1YgTT{H}^0dhQPB;IbaC9)` zUzv0#%*DK@A%OXp5s9_)$$s-1v3;v!cb^CkMuGh(?4&;k2%NYWObTNKu)P5Q`(4e{ zd7u(QEChH=NY%K87y<<_5K7a?n0u2PJm8Vc3_}V(A!#XVqea*$=c6E21!aFaXtUK_}YE;BxC*ckI zt=N$d&*U7L;xVI4K&`vvcHW&SF76{DaL91A6}S%-+3z1lYi&ntVw ztF??%P79G;Z@mUWFfzNh@OkQMsa)N3O;J64N|>x+to)9&@lj`% z{m6RedOpTcd`@`YxKEo--DiizG*Xv%^G>U!H6%URn);>}ZyPt?R|A#J0!`5&gY(gn zkrZBzEzSK2AL+su-t2YL^V?)mUE3& [args]`. Run `unity command` with no name to +list what an instance exposes. Two servers exist: **Editor** (`7800-7849`, auto-starts with +the editor) and **Runtime** (`7900-7949`, only in a dev Player build). See the package +`README.md` "Commands" reference for the full list and parameters. + +## 1. Install & verify + +```bash +unity pipeline install # install into current project (or --project-path) +unity pipeline list # confirm the editor instance + server are reachable +unity command editor_status # confirm the editor server answers +``` + +## 2. Autonomous edit loop (Editor) + +This is the core agent workflow: keep the editor alive, change code, recompile, test. + +```bash +# 1. Keep the editor ticking even when unfocused/minimized. REQUIRED before headless work — +# Unity otherwise throttles or stalls update/compile when it isn't the active app. +unity command set_autotick --enable true + +# 2. Edit C# source files on disk normally. + +# 3. Recompile (async: triggers a domain reload, then poll until done). +unity command recompile +unity command recompile_status # repeat until "completed" or "up_to_date" +# Tolerate connection errors while the domain reload is in flight — that is expected. +# If recompile_status reports failed=true, read its "errors" array and fix before testing. + +# 4. (Optional) List available tests without running them. +unity command list_tests --mode editor # mode: all | editor | playmode + +# 5. Run tests (filter to keep it fast). +unity command run_tests --mode editor --filter MyFixture.MyTest +``` + +`run_tests` modes: `all` | `editor` | `playmode`. `filter_type`: `testName` | `assembly` | +`category`. For long runs use `--async_tests true` and poll `unity command test_status` +(abort with `unity command cancel_tests`). + +> **Known caveat:** when any selected test *fails*, `run_tests` may surface an opaque +> result instead of the failure details. Re-run a narrower `--filter`, or inspect the +> editor's Test Runner / logs to get the real failure. + +## 3. Runtime hot reload + +Change gameplay code in a **running** game with no domain reload. The game must be live: +enter Editor Play Mode (`unity command editor_play`) or run a dev Player. A +`RuntimePipelineManager` in the scene auto-discovers tagged methods on `Awake` (no manual +registration). Mono only — Editor Play Mode and Mono desktop dev builds, not IL2CPP. The token +is auto-injected for local requests. + +### Prefer: in-place — `reload_file` + +Edit the method body directly; no separate file, no boilerplate. + +1. Tag the method `[HotReload]` on the MonoBehaviour. +2. Edit its body on disk. +3. Apply (re-run to iterate): + ```bash + unity command reload_file --filename Assets/Spinner.cs + ``` + Add `--pdb` to make it debuggable — emits a portable PDB mapped to your source so breakpoints in + the original file bind (attach the IDE + enable Editor Attaching; compiles unoptimized): + ```bash + unity command reload_file --filename Assets/Spinner.cs --pdb + ``` + +Constraints: `void` instance methods only; **public** members only; debugging requires `--pdb` +(the default emits no symbols). + +### Alternative: with helper — `reload_file_override` + +Keep the original method; put the tweak in a **separate** override file. + +1. Tag the method `[HotReloadWithOverrides]` and route it via + `HotReloadHelper.ExecuteWithHotReload(this, "Update", OriginalUpdate)` (original body in `OriginalUpdate`). +2. In a **separate file that does not redeclare the target type**, add a `public static` + method tagged `[HotReloadOverrideMethod("BossController.Update")]` taking the instance first. +3. Apply: `unity command reload_file_override --filename Assets/HotReload/BossOverrides.cs` + +Constraints: **public** members only; you cannot break into the override. + +`unity command hotreload_status` shows active overrides. `reload_file_override*` options: `--timeout ` +(default 30000), `--assemblyDir ` (persist DLLs instead of in-memory); +`cleanup_hotreload --assemblyDir ` clears old DLLs. Both commands validate the file up front +and return a clear error on misconfiguration (no override found, target type redeclared, bad signature). + +## 4. Quick C# eval (Runtime) + +```bash +unity command eval "return 2 + 2;" +# Or evaluate a .cs file on disk (contents run through the same path): +unity command eval_file Assets/Scratch.cs +``` + +## Gotchas + +- **`set_autotick` first.** Without it, recompile and tests can hang while the editor is + unfocused. The package's watchdog relies on the tick loop staying alive. +- **Hot reload needs the game running.** `reload_file_override` / `reload_file` apply to a live + game — enter Editor Play Mode (`unity command editor_play`) first, or run a dev Player. +- **Player-only commands need a dev Player.** `log`, `set_timescale`, `runtime_status`, etc. hit + the Runtime server, which does not run in the Editor. +- **Async commands poll.** `recompile`→`recompile_status`, `run_tests --async_tests`→ + `test_status`. Never assume completion from the trigger call's response. +- **Target a specific instance** with `--instance host:port` or `--project-path ` + when more than one is running. diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/.signature b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/.signature new file mode 100644 index 00000000..3e029011 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/.signature @@ -0,0 +1 @@ +{"timestamp":1784898270,"signature":"m1B6AxHNRb3eYS2lmIt0kYUTKJpC60vksUpgeHUJJw2CZquWt5NTve2Qoyqy6rj28gpbtQyivBdokixwRC8tW5lOTj2/FTYzGTL9lRRKJYEeOqH/7f7RbKaydQnwYPkO/KTwDy7ad3tv2abdbvaqtrKSpuBYZfonfz3LFUoTacjds3tU7tZrx7jEyGVEzzha4KrNbFUJtEtHqmePABe4KCGeFo06FaSMxt6PSkJEwdkVJJ0LQaeBvDMAaQ71o63Ue5nPHEbj7TKjcGrmRMDCtsSWLxE2bsVgGX79gclMH2khqJKD6Z2fvsFWd6JUahlKjnDgZ29zkb0Wkrhu3i/GT1IK4zFY0xcs8HjbliTQuqxWhfHVkiSKa3mYntEWOa/xGaoZ9wsm44jP3e2ROCJcjLzPDDa2bWleMk0nIzqwYNvPbfgPF0/3SmrvefA6L2oL8e4DyogrWBOxxUmzxdFKe54SUdu0S0Or8Zua9h68JNoPxIJC+waXkaltmitaFSsr","publicKey":"LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlJQm9qQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FZOEFNSUlCaWdLQ0FZRUFzdUhXYUhsZ0I1cVF4ZEJjTlJKSAordHR4SmoxcVY1NTdvMlZaRE1XaXhYRVBkRTBEMVFkT1JIRXNSS1RscmplUXlERU83ZlNQS0ZwZ1A3MU5TTnJCCkFHM2NFSU45aHNQVDhOVmllZmdWem5QTkVMenFkVmdEbFhpb2VpUnV6OERKWFgvblpmU1JWKytwbk9ySTRibG4KS0twelJlNW14OTc1SjhxZ1FvRktKT0NNRlpHdkJMR2MxSzZZaEIzOHJFODZCZzgzbUovWjBEYkVmQjBxZm13cgo2ZDVFUXFsd0E5Y3JZT1YyV1VpWXprSnBLNmJZNzRZNmM1TmpBcEFKeGNiaTFOaDlRVEhUcU44N0ZtMDF0R1ZwCjVNd1pXSWZuYVRUemEvTGZLelR5U0pka0tldEZMVGdkYXpMYlpzUEE2aHBSK0FJRTJhc0tLTi84UUk1N3UzU2cKL2xyMnZKS1IvU2l5eEN1Q20vQWJkYnJMbXk0WjlSdm1jMGdpclA4T0lLQWxBRWZ2TzV5Z2hSKy8vd1RpTFlzUQp1SllDM0V2UE16ZGdKUzdGR2FscnFLZzlPTCsxVzROY05yNWdveVdSUUJ0cktKaWlTZEJVWmVxb0RvSUY5NHpCCndGbzJJT1JFdXFqcU51M3diMWZIM3p1dGdtalFra3IxVjJhd3hmcExLWlROQWdNQkFBRT0KLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tCg"} \ No newline at end of file diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/CHANGELOG.md b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/CHANGELOG.md new file mode 100644 index 00000000..e4aed298 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/CHANGELOG.md @@ -0,0 +1,53 @@ +# Changelog + +All notable changes to this package will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [0.4.0-exp.1] - 2026-07-23 + +- Persist the pipeline server auth token across editor domain reloads so long-lived clients (MCP/IDE) no longer get `401` after a recompile. (CLI-412) +- `capture_game_view`/`capture_scene_view` with `save_path` now return a path-only result (no base64) so agent tool results stay small; pass `include_inline_image=true` for the old behavior. Add `max_resolution` to cap the inline image size. (AUTHAPI-8) +- Object-reference string handles now accept authoring-root-relative asset paths (e.g. `Materials/Floor.mat`, not just `Assets/Materials/Floor.mat`): a relative string with a file extension is treated as an asset path and normalized under the authoring root, and a failed lookup now reports every strategy tried instead of a misleading hierarchy-path-only error. (AUTHAPI-9) + +## [0.3.1-exp.1] - 2026-07-16 +- Update docs + +## [0.3.0-exp.1] - 2026-07-13 + +- Improve security by ensuring token usage and enforcing read control on the token. +- Fix all upm-pvp warnings. +- Fix Samples installation. +- All server works if the App is minimized (in the RunInBackground). +- Rework all docs. +- Improve connectivity regaridng IPv4 vs IPv6 support. +- Add `eval_file` command: evaluate C# code read from a `.cs` file on disk, as a file-based alternative to `eval` (which takes inline `code`). Both commands run the source through the same evaluation path. +- Add a large set of Editor automation commands for agentic content-pipeline control: + - **Assets & files:** `create_asset`, `import_asset`, `move_asset`, `copy_asset`, `rename_asset`, `delete_asset`, `find_assets`, `create_folder`, `get_import_settings`, `set_import_settings`, `read_text_file`, `write_text_file`. + - **Scenes:** `create_scene`, `open_scene`, `save_scene`, `save_all`, `list_open_scenes`, `set_active_scene`, `get_scene_hierarchy`, `add_scene_to_build`, `remove_scene_from_build`. + - **GameObjects & components:** `create_gameobject`, `create_gameobjects`, `delete_gameobject`, `find_gameobjects`, `rename_gameobject`, `set_parent`, `set_transform`, `set_active`, `set_tag`, `set_layer`, `add_component`, `remove_component`, `get_component_properties`, `set_component_properties`. + - **Prefabs:** `create_prefab`, `create_prefab_variant`, `instantiate_prefab`, `apply_prefab_overrides`, `revert_prefab_overrides`, `unpack_prefab`, `save_prefab_contents`. + - **Scripts & serialized fields:** `create_script`, `attach_script`, `get_serialized_fields`, `set_serialized_field`. + - **Selection & search:** `get_selection`, `set_selection`, `search`. + - **Capture & screenshots:** `screenshot`, `capture_game_view`, `capture_scene_view`, `capture_editor_element`, `capture_runtime_element`. + - **Build:** `build`, `build_status`. + - **Console & diagnostics:** `console`, `clear_console`, `get_console_logs`, `get_performance_stats`. + - **Editor menus & authoring root:** `menu`, `get_authoring_root`, `set_authoring_root`. + - **Materials & shaders:** `get_material_properties`, `set_material_properties`, `get_shader_properties`, `list_shaders`. + - **Animation & Animator:** `create_animation_clip`, `get_animation_clip`, `set_animation_curve`, `remove_animation_curve`, `create_animator_controller`, `get_animator_controller`, `add_animator_layer`, `add_animator_parameter`, `add_animator_state`, `add_animator_transition`. + - **Timeline:** `create_timeline`, `get_timeline`, `add_timeline_track`, `add_timeline_clip`. + - **Lighting:** `bake_lighting`, `cancel_lighting_bake`, `lighting_bake_status`, `clear_baked_lighting`, `get_lighting_settings`, `set_lighting_settings`. + - **NavMesh:** `bake_navmesh`, `bake_navmesh_surfaces`, `cancel_navmesh_bake`, `navmesh_bake_status`, `clear_navmesh`, `get_navmesh_settings`, `set_navmesh_settings`. + - **Occlusion culling:** `bake_occlusion_culling`, `cancel_occlusion_bake`, `occlusion_bake_status`, `clear_occlusion_culling`. +- Update Wrench +- Warn user if Unity Editor is started in non-automated mode. + +## [0.2.0-exp.2] - 2026-06-24 + +- Fix security audit flaws +- First official published version + +## [0.1.0-exp.1] - 2026-06-09 + +### This is the first release of _Unity Pipeline_. diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/CHANGELOG.md.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/CHANGELOG.md.meta new file mode 100644 index 00000000..5411dc56 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/CHANGELOG.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 75cd0dccc034c6543afb4f969beca6af +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/CLAUDE.md b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/CLAUDE.md new file mode 100644 index 00000000..1378c9be --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/CLAUDE.md @@ -0,0 +1,50 @@ +# com.unity.pipeline + +Unity package for **remote-controlling a running Unity Editor (or dev Player) over HTTP**. +A client — CLI, CI, or an agent — connects and executes registered commands: recompile, +run tests, eval C#, hot-reload files, play-mode control, status/heartbeat. + +## Layout (standard UPM package) + +| Folder | Assembly | Notes | +|--------|----------|-------| +| `Runtime/` | `Unity.Pipeline` | Ships in player builds. HTTP server base, command registry, models, runtime commands, hot reload, player server. | +| `Editor/` | `Unity.Pipeline.Editor` | Editor-only. Live server + its owner, settings asset, editor commands, test runner. | +| `CodeGen/` | `Unity.Pipeline.CodeGen` | ILPostProcessor (Mono.Cecil) for in-place hot reload. Root-level by Unity convention (cf. Burst/Entities) — leave as-is. | +| `Tests/Editor/` | `Unity.Pipeline.Tests.Editor` | **EditMode** suite (the main one). | +| `Tests/Runtime/` | `Unity.Pipeline.Tests.Runtime` | **PlayMode** suite. | +| `Samples/` | — | Hot-reload sample scenes. | + +## Architecture entry points + +- **`Runtime/Common/BasePipelineServer.cs`** — shared HTTP listener + routing (`/api/exec`, + `/api/status`, `/api/commands`, …). Subclassed by `Editor/EditorPipelineServer.cs` and + `Runtime/PlayerSupport/RuntimePipelineServer.cs`. +- **`Editor/EditorPipelineStartup.cs`** (`PipelineServerStartup`) — `[InitializeOnLoad]` static + owner of the live editor server; survives domain reloads; auto-enables autotick. +- **`Editor/EditorPipelineManager.cs`** — inspectable settings asset (`Pipeline/Settings...` menu). +- Commands are discovered via `[CliCommand]` attributes. Editor command groups live under + `Editor/Commands/` (Assets, Scenes, GameObjects, Prefabs, Scripts, Build, PackageManager, + ProjectSettings, …); runtime commands under `Runtime/`. +- **`Editor/Authoring/`** — helpers shared by state-changing commands: `AuthoringUndoScope` + (collapses a command's `Undo`-registered mutations into one step) and `ProjectPaths`/`ObjectResolver` + (authoring-root path resolution + object handles). + Destructive/overwriting commands gate on `confirm`/`dry_run` inline (see `delete_asset`). Structured + multi-field command args implement `IStructuredCommandInput` (`Runtime/Common/`). See + `Documentation~/safety-and-mutations.md`, `Documentation~/authoring-commands.md`, and + `Documentation~/creating-commands.md`. + +## Driving & verifying (agents) + +Use the **`unity-pipeline` skill**, which drives the live editor via the `unity` CLI. +Canonical verb is `command`; the auth token is the `evalToken` field inside the port file +`/Library/Pipeline/.unity-pipeline-port`, sent as `Authorization: Bearer `. + +Edit→verify loop: make a logical change (may span several files) → `command recompile` → +poll `command recompile_status` → `command run_tests --filter `. The server keeps the +editor ticking while unfocused, so compiles proceed even when focus is elsewhere. + +## Conventions + +- Private fields (including static): `m_PascalCase`. Consts: `PascalCase`. +- Don't `git commit`/`push` without an explicit request. diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/CLAUDE.md.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/CLAUDE.md.meta new file mode 100644 index 00000000..f7d39303 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/CLAUDE.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 6433e36ff8e1bc44fb3cde740ee86080 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/CODEOWNERS b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/CODEOWNERS new file mode 100644 index 00000000..3c2cce51 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/CODEOWNERS @@ -0,0 +1,2 @@ +# see https://github.com/Unity-Technologies/com.unity.pipeline for more information +* @Unity-Technologies/core-authoring \ No newline at end of file diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/CODEOWNERS.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/CODEOWNERS.meta new file mode 100644 index 00000000..629037eb --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/CODEOWNERS.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: cbc57dbad3c6f114d94ced75a1f9737d +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/CodeGen.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/CodeGen.meta new file mode 100644 index 00000000..1713e89d --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/CodeGen.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8b1d193bfb6e52d44975ae298a3c060a +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/CodeGen/HotReloadInPlaceILPostProcessor.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/CodeGen/HotReloadInPlaceILPostProcessor.cs new file mode 100644 index 00000000..752a2316 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/CodeGen/HotReloadInPlaceILPostProcessor.cs @@ -0,0 +1,265 @@ +using System.Collections.Generic; +using System.IO; +using System.Linq; +using Mono.Cecil; +using Mono.Cecil.Cil; +using Mono.Cecil.Rocks; +using Unity.CompilationPipeline.Common.Diagnostics; +using Unity.CompilationPipeline.Common.ILPostProcessing; + +namespace Unity.Pipeline.CodeGen +{ + /// + /// Weaves a hot-reload dispatch prologue into every method tagged [HotReload] at compile + /// time, so a running method can route to a hot-reloaded override with no domain reload. The + /// injected prologue is the auto-generated equivalent of the helper workflow's + /// HotReloadHelper.ExecuteWithHotReload(...) call: + /// + /// if (HotReloadRegistry.TryInvokeHotReload("Type.Method", this, args)) return; + /// // ... original body ... + /// + /// MVP: instance methods returning void (parameters supported, boxed into object[]). Non-void + /// methods are skipped with a diagnostic (return-value dispatch is deferred). + /// + public class HotReloadInPlaceILPostProcessor : ILPostProcessor + { + private const string RuntimeAssemblyName = "Unity.Pipeline"; + private const string AttributeName = "HotReloadAttribute"; + private const string RegistryTypeFullName = "Unity.Pipeline.HotReload.HotReloadRegistry"; + private const string DispatchMethodName = "TryInvokeHotReload"; + + public override ILPostProcessor GetInstance() => this; + + public override bool WillProcess(ICompiledAssembly compiledAssembly) + { + // Only assemblies that reference the runtime assembly can use [HotReload] or call + // the registry. This naturally excludes the runtime assembly itself (it does not + // reference itself) and the CodeGen assembly (no runtime reference). + return compiledAssembly.References.Any( + r => Path.GetFileNameWithoutExtension(r) == RuntimeAssemblyName); + } + + public override ILPostProcessResult Process(ICompiledAssembly compiledAssembly) + { + var diagnostics = new List(); + + using (var resolver = new PostProcessorAssemblyResolver(compiledAssembly.References)) + using (var assembly = ReadAssembly(compiledAssembly, resolver)) + { + var module = assembly.MainModule; + + var targets = module.GetTypes() + .SelectMany(t => t.Methods) + .Where(m => m.HasBody && m.CustomAttributes.Any(a => a.AttributeType.Name == AttributeName)) + .ToList(); + + if (targets.Count == 0) + return new ILPostProcessResult(null, diagnostics); + + var dispatch = ResolveDispatchMethod(module, resolver, diagnostics); + if (dispatch == null) + return new ILPostProcessResult(null, diagnostics); + + int wovenCount = 0; + foreach (var method in targets) + { + if (method.IsStatic) + { + diagnostics.Add(Warn($"[HotReload] '{method.FullName}' is static and was skipped (instance methods only).")); + continue; + } + + if (method.ReturnType.MetadataType != MetadataType.Void) + { + diagnostics.Add(Warn($"[HotReload] '{method.FullName}' returns a value and was skipped (void methods only for now).")); + continue; + } + + WeaveDispatchPrologue(method, dispatch); + wovenCount++; + } + + if (wovenCount == 0) + return new ILPostProcessResult(null, diagnostics); + + return new ILPostProcessResult(WriteAssembly(assembly), diagnostics); + } + } + + /// + /// Inject, at the very top of the method: + /// if (HotReloadRegistry.TryInvokeHotReload("Type.Method", this, args)) return; + /// + private static void WeaveDispatchPrologue(MethodDefinition method, MethodReference dispatch) + { + var body = method.Body; + body.SimplifyMacros(); + + var il = body.GetILProcessor(); + var first = body.Instructions[0]; + var methodId = $"{method.DeclaringType.Name}.{method.Name}"; + + var prologue = new List + { + Instruction.Create(OpCodes.Ldstr, methodId), + Instruction.Create(OpCodes.Ldarg_0), // this + }; + + // Build the object[] of parameters (null when parameterless). + var ps = method.Parameters; + if (ps.Count == 0) + { + prologue.Add(Instruction.Create(OpCodes.Ldnull)); + } + else + { + prologue.Add(Instruction.Create(OpCodes.Ldc_I4, ps.Count)); + prologue.Add(Instruction.Create(OpCodes.Newarr, method.Module.TypeSystem.Object)); + for (int i = 0; i < ps.Count; i++) + { + prologue.Add(Instruction.Create(OpCodes.Dup)); + prologue.Add(Instruction.Create(OpCodes.Ldc_I4, i)); + prologue.Add(Instruction.Create(OpCodes.Ldarg, ps[i])); + if (ps[i].ParameterType.IsValueType || ps[i].ParameterType.IsGenericParameter) + prologue.Add(Instruction.Create(OpCodes.Box, ps[i].ParameterType)); + prologue.Add(Instruction.Create(OpCodes.Stelem_Ref)); + } + } + + prologue.Add(Instruction.Create(OpCodes.Call, dispatch)); + prologue.Add(Instruction.Create(OpCodes.Brfalse, first)); // no override -> run original body + prologue.Add(Instruction.Create(OpCodes.Ret)); // override ran -> skip body + + foreach (var instr in prologue) + il.InsertBefore(first, instr); + + body.OptimizeMacros(); + } + + /// + /// Resolve HotReloadRegistry.TryInvokeHotReload(string, object, object[]) from the runtime + /// assembly and import it into the target module. + /// + private static MethodReference ResolveDispatchMethod( + ModuleDefinition module, PostProcessorAssemblyResolver resolver, List diagnostics) + { + var runtimeRef = module.AssemblyReferences.FirstOrDefault(a => a.Name == RuntimeAssemblyName); + if (runtimeRef == null) + { + diagnostics.Add(Warn($"Could not find a reference to {RuntimeAssemblyName} while weaving {module.Name}.")); + return null; + } + + var runtime = resolver.Resolve(runtimeRef); + var registry = runtime?.MainModule.GetType(RegistryTypeFullName); + if (registry == null) + { + diagnostics.Add(Warn($"Could not resolve {RegistryTypeFullName} in {RuntimeAssemblyName}.")); + return null; + } + + var method = registry.Methods.FirstOrDefault(m => + m.Name == DispatchMethodName && + m.IsStatic && + !m.HasGenericParameters && + m.Parameters.Count == 3 && + m.Parameters[0].ParameterType.MetadataType == MetadataType.String && + m.Parameters[1].ParameterType.MetadataType == MetadataType.Object); + + if (method == null) + { + diagnostics.Add(Warn($"Could not find non-generic {DispatchMethodName}(string, object, object[]) on {RegistryTypeFullName}.")); + return null; + } + + return module.ImportReference(method); + } + + private static AssemblyDefinition ReadAssembly(ICompiledAssembly compiledAssembly, IAssemblyResolver resolver) + { + var pdb = compiledAssembly.InMemoryAssembly.PdbData; + var hasSymbols = pdb != null && pdb.Length > 0; + + var readerParameters = new ReaderParameters + { + AssemblyResolver = resolver, + ReadingMode = ReadingMode.Immediate, + ReadWrite = true, + ReadSymbols = hasSymbols, + SymbolReaderProvider = hasSymbols ? new PortablePdbReaderProvider() : null, + SymbolStream = hasSymbols ? new MemoryStream(pdb) : null, + }; + + var peStream = new MemoryStream(compiledAssembly.InMemoryAssembly.PeData); + return AssemblyDefinition.ReadAssembly(peStream, readerParameters); + } + + private static InMemoryAssembly WriteAssembly(AssemblyDefinition assembly) + { + var pe = new MemoryStream(); + var pdb = new MemoryStream(); + var writerParameters = new WriterParameters + { + SymbolWriterProvider = new PortablePdbWriterProvider(), + WriteSymbols = true, + SymbolStream = pdb, + }; + + assembly.Write(pe, writerParameters); + return new InMemoryAssembly(pe.ToArray(), pdb.ToArray()); + } + + private static DiagnosticMessage Warn(string message) => new DiagnosticMessage + { + DiagnosticType = DiagnosticType.Warning, + MessageData = "HotReloadInPlace: " + message, + }; + } + + /// + /// Minimal IAssemblyResolver that resolves referenced assemblies from the compiled assembly's + /// reference paths (which are absolute file paths supplied by the compilation pipeline). + /// + internal sealed class PostProcessorAssemblyResolver : IAssemblyResolver + { + private readonly string[] _referencePaths; + private readonly Dictionary _cache = new Dictionary(); + + public PostProcessorAssemblyResolver(string[] referencePaths) + { + _referencePaths = referencePaths; + } + + public AssemblyDefinition Resolve(AssemblyNameReference name) + => Resolve(name, new ReaderParameters(ReadingMode.Deferred)); + + public AssemblyDefinition Resolve(AssemblyNameReference name, ReaderParameters parameters) + { + lock (_cache) + { + if (_cache.TryGetValue(name.Name, out var cached)) + return cached; + + var path = _referencePaths.FirstOrDefault( + r => Path.GetFileNameWithoutExtension(r) == name.Name); + if (path == null || !File.Exists(path)) + return null; + + parameters.AssemblyResolver = this; + var definition = AssemblyDefinition.ReadAssembly(path, parameters); + _cache[name.Name] = definition; + return definition; + } + } + + public void Dispose() + { + lock (_cache) + { + foreach (var def in _cache.Values) + def.Dispose(); + _cache.Clear(); + } + } + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/CodeGen/HotReloadInPlaceILPostProcessor.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/CodeGen/HotReloadInPlaceILPostProcessor.cs.meta new file mode 100644 index 00000000..3bdc2153 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/CodeGen/HotReloadInPlaceILPostProcessor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3eb482c6630e46b98100dd9c13a3f7d3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/CodeGen/Unity.Pipeline.CodeGen.asmdef b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/CodeGen/Unity.Pipeline.CodeGen.asmdef new file mode 100644 index 00000000..535ad309 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/CodeGen/Unity.Pipeline.CodeGen.asmdef @@ -0,0 +1,21 @@ +{ + "name": "Unity.Pipeline.CodeGen", + "rootNamespace": "Unity.Pipeline.CodeGen", + "references": [], + "includePlatforms": [ + "Editor" + ], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": true, + "precompiledReferences": [ + "Mono.Cecil.dll", + "Mono.Cecil.Mdb.dll", + "Mono.Cecil.Pdb.dll", + "Mono.Cecil.Rocks.dll" + ], + "autoReferenced": false, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": true +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/CodeGen/Unity.Pipeline.CodeGen.asmdef.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/CodeGen/Unity.Pipeline.CodeGen.asmdef.meta new file mode 100644 index 00000000..2a94d5b9 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/CodeGen/Unity.Pipeline.CodeGen.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 3d86918fcc1e40b8a17542a4bacf8dbc +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/TableOfContents.md b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/TableOfContents.md new file mode 100644 index 00000000..0d31d469 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/TableOfContents.md @@ -0,0 +1,25 @@ +* [Home](index.md) +* Guides + * [Creating commands](creating-commands.md) + * [Creating authoring commands](authoring-commands.md) + * [Safety & mutations](safety-and-mutations.md) + * [Connectivity](connectivity.md) + * [Runtime connection & setup](runtime-setup.md) + * [Hot reload](hot-reload.md) + * [Tests architecture](testing.md) +* Command reference + * [Asset & file commands](commands/assets-and-files.md) + * [Scene commands](commands/scenes.md) + * [GameObject & component commands](commands/gameobjects-and-components.md) + * [Prefab commands](commands/prefabs.md) + * [Script commands](commands/scripts.md) + * [Animation commands](commands/animation.md) + * [Material & shader commands](commands/materials.md) + * [Baking commands](commands/baking.md) + * [Navigation & selection commands](commands/navigation.md) + * [Capture commands](commands/capture.md) + * [Build, compilation & test commands](commands/build-and-compilation.md) + * [Project settings commands](commands/project-settings.md) + * [Package Manager commands](commands/package-manager.md) + * [Editor lifecycle & observability commands](commands/editor-lifecycle-and-observability.md) + * [Runtime commands](commands/runtime.md) diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/authoring-commands.md b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/authoring-commands.md new file mode 100644 index 00000000..42fc2da2 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/authoring-commands.md @@ -0,0 +1,319 @@ +# Creating authoring commands + +*Authoring commands* are the subset of commands that **create or mutate project content** — assets, +scenes, GameObjects, components — on behalf of an agent. They build on the base command API in +[Creating commands](creating-commands.md); this page covers the four concerns that are specific to +content authoring: + +- **The authoring root** — the sandbox that bare paths resolve against and writes are confined to. +- **`ObjectRef`** — how a command *receives* a reference to an existing object. +- **`AuthoringResult`** — how a command *returns* the identity of an object it created or touched. +- **Undo/redo** — grouping a command's scene mutations into a single, revertible step. + +Together these let one command's output feed the next command's input, so an agent can chain calls +(`create_gameobject` → `add_component` → `set_component_properties` → `create_prefab`) without ever +handling a raw Unity object itself. If you want to support a content type the package doesn't cover +yet (materials, audio, lighting, terrain, …), this is the pattern to follow. + +Read [Creating commands](creating-commands.md) first — this page assumes you know how `[CliCommand]`, +`[CliArg]`, `MainThreadRequired`, and the response envelope work. + +## Authoring vs. management commands + +Not every state-changing command is an *authoring* command. This page — and the [checklist](#checklist-for-a-new-authoring-command) +at the end — applies to commands that **create or mutate project content** (assets, scenes, +GameObjects, components) and hand the agent back an object identity. + +**Management commands** change *configuration* or *drive tooling* rather than author content: +project settings (`Editor/Commands/ProjectSettings/`), builds (`Build/`), and packages +(`PackageManager/`). They are a **different category** and deliberately do +**not** follow the full authoring contract. They share only the cross-cutting safety conventions +(the `confirm`/`dry_run` gate and, where relevant, `ObjectResolver`/`ProjectPaths`) — see +[Safety & mutations](safety-and-mutations.md). + +| Concern | Authoring command | Management command | +|---|---|---| +| Object input | `ObjectRef` → `ObjectResolver.TryResolve` | same, when it references an object (e.g. a scene in the build list) | +| Path input | `ProjectPaths.Resolve` (confined to the authoring root) | as needed; may be unconfined by design (e.g. a build output path) | +| Undo | scene/object mutations wrapped in `AuthoringUndoScope` + registered `Undo` APIs | **none** — settings / AssetDatabase / UPM writes don't participate in Undo, so no scope; note `Not undoable via Ctrl+Z.` in the description instead | +| Destructive gate | `confirm`/`dry_run` where destructive | `confirm`/`dry_run` where destructive (same convention) | +| Return value | `AuthoringResult` via `ObjectResolver.Describe` | a domain model (e.g. `ProjectSettingsResponse`, `PackageMutationResponse`) or a plain result object | +| Failure | **throw** (`ArgumentException` / `InvalidOperationException`) | throw, **or** return a structured `{ success = false, code, error }` object — consistent within the area | + +If you're adding a config/build/package command, follow the management column and the shared safety +conventions; the checklist below is for content-authoring commands. + +## The building blocks + +| Type | Namespace | Role | +|------|-----------|------| +| `ProjectPaths` | `Unity.Pipeline.Editor.Authoring` | Resolve/confine agent-supplied paths to the authoring root. | +| `ObjectRef` | `Unity.Pipeline.Models` | Input handle to an existing object (asset or scene object). | +| `AuthoringResult` | `Unity.Pipeline.Models` | Output identity of an object your command created or acted on. | +| `ObjectResolver` | `Unity.Pipeline.Editor.Authoring` | `TryResolve(ObjectRef …)` (handle → object) and `Describe(object)` (object → `AuthoringResult`). | +| `AuthoringUndoScope` | `Unity.Pipeline.Editor.Authoring` | Collapses all `Undo`-registered mutations in its lifetime into one editor undo step. | + +Authoring commands are Editor-only. Put them under `Editor/Commands//` in the +`Unity.Pipeline.Editor.Commands.` namespace (see `Editor/Commands/Authoring/AuthoringConfigCommands.cs`). + +## The authoring root (`set_authoring_root`) + +Agents pass **bare, relative paths** (`"Materials/Stone"`), not full project paths. `ProjectPaths` +resolves those against a configurable **authoring root** and *confines* every write to it. The root +defaults to `Assets` (full project access); an agent can narrow it to a sub-folder to sandbox itself: + +``` +get_authoring_root → { "root": "Assets" } +set_authoring_root --root Assets/AgentWork +``` + +These are just thin commands over `ProjectPaths.AuthoringRoot` (`Editor/Commands/Authoring/AuthoringConfigCommands.cs`): + +```csharp +[CliCommand("set_authoring_root", "Set the base folder (under Assets/) that bare authoring paths resolve against and are confined to. Use 'Assets' for full project access.")] +public static object SetAuthoringRoot( + [CliArg("root", "Project-relative folder under Assets/, e.g. Assets/AgentWork. Use 'Assets' to allow the whole project.", Required = true)] string root) +{ + // Throws ArgumentException for invalid roots (outside Assets/ or containing ".."); the + // server surfaces that message to the caller. + ProjectPaths.AuthoringRoot = root; + return new { root = ProjectPaths.AuthoringRoot }; +} +``` + +**Every path parameter your command accepts must go through `ProjectPaths.Resolve`.** This is the +sandbox boundary — it rejects `..` traversal and anything that escapes the root, and it lets callers +omit the `Assets/` prefix. Do not build asset paths by string concatenation. + +```csharp +var normalized = ProjectPaths.Resolve(path, out var error); +if (normalized == null) + throw new ArgumentException(error); // e.g. "Path '../secrets' must not contain '..'." +// normalized is now a project-relative path guaranteed to live under the authoring root. +``` + +Resolution rules (`Editor/Authoring/ProjectPaths.cs`): + +- Bare paths (`"Materials/Stone"`) are taken relative to the root → `Assets/AgentWork/Materials/Stone`. +- Explicit `Assets/…` / `Packages/…` paths are used as-is (but still confined to the root). +- Absolute paths must live under the project root and are converted to project-relative. +- `..` anywhere, or a result outside the root, returns `null` + an `error` string. + +## Receiving objects: `ObjectRef` + +When a command needs to act on an object that *already* exists, take an `ObjectRef` parameter. The +agent supplies **one** of several forms; `ObjectResolver.TryResolve` tries them in order — `globalId`, +`path`, `guid` (+ optional `fileId`), `instanceId`, `hierarchyPath` — and hands you the live object: + +```csharp +public static Renderer ResolveRenderer(ObjectRef target) +{ + if (!ObjectResolver.TryResolve(target, out var obj, out var error)) + throw new ArgumentException(error); + + var go = obj as GameObject ?? (obj as Component)?.gameObject; + var renderer = go != null ? go.GetComponent() : null; + if (renderer == null) + throw new ArgumentException($"Object '{target}' has no Renderer."); + return renderer; +} +``` + +Resolve **outside** any undo scope / before mutating, so a bad handle fails before your command +changes anything (see `create_gameobject`, which resolves its `parent` before entering the scope). + +When the handle is a plain string (the usual agent input), a value with a file extension and no +leading `/` — e.g. `"Materials/Floor.mat"` — is taken as an asset path and normalized under the +authoring root, so the `Assets/` prefix is optional (mirroring path-taking commands). A leading `/` +or an extension-less value stays a `hierarchyPath`; a dotted scene name like `"Cube.001"` still +resolves because the `path` branch falls back to a hierarchy lookup. + +## Returning objects: `AuthoringResult` + +Any command that creates or modifies an object should return its identity so the agent can reference +it in a follow-up call. Don't build this by hand — call `ObjectResolver.Describe(obj)`, which fills in +the right fields for the object kind: + +- **Assets** get `assetPath`, `guid`, `fileId`, `type` (+ `globalId`). +- **Scene / loaded objects** get `instanceId`, `hierarchyPath`, `type` (+ `globalId`). + +```csharp +var result = ObjectResolver.Describe(asset) ?? new AuthoringResult { Type = nameof(Material) }; +result.AssetPath = assetPath; // ensure the path is set even if Describe returned a fresh result +return result; +``` + +`AuthoringResult` is **identity only** — no success flag, no message. Success/failure and timing live +in the outer `CommandExecutionResponse` (the server adds them). To report a failure, **throw** +(`ArgumentException` for bad input, `InvalidOperationException` for an operation that failed); the +server converts the exception into a failure envelope. For a batch, return a model that holds an +`AuthoringResult[]` (see `CreateGameObjectsResult`). + +## Undo/redo + +Undo is Unity's native `UnityEditor.Undo`, grouped per command by `AuthoringUndoScope` so a single +call reverts as a single Ctrl+Z step. Register each mutation with the matching `Undo` API **inside** +the scope: + +```csharp +using (new AuthoringUndoScope("Set Material")) +{ + Undo.RecordObject(renderer, "Set Material"); // record BEFORE mutating + renderer.sharedMaterial = material; + EditorSceneManager.MarkSceneDirty(renderer.gameObject.scene); +} +``` + +Which `Undo` call to use: + +| Mutation | Call | +|----------|------| +| New scene object | `Undo.RegisterCreatedObjectUndo(obj, name)` | +| Change fields on an existing object | `Undo.RecordObject(obj, name)` / `RegisterCompleteObjectUndo` (before the change) | +| Add a component | `Undo.AddComponent(go, type)` | +| Reparent | `Undo.SetTransformParent(child, parent, name)` | +| Serialized properties | `SerializedObject` + `so.ApplyModifiedProperties()` (registers undo itself) | + +> **Important caveat.** `AssetDatabase` operations are **not** part of Unity's undo system. Creating a +> folder or asset, importing, `AssetDatabase.CreateAsset`, `SaveAsPrefabAsset`, and file writes are +> **not undone** by Ctrl+Z. `AuthoringUndoScope` only covers scene/object mutations. If your command +> writes to disk, say so in its description and don't rely on undo to clean up — validate up front and +> fail before writing. + +## Worked example — a new content type + +Say the package has no material (rendering) commands and you want to add them. Two commands cover the +whole pattern: one that **creates an asset** (path handling + `AuthoringResult` out, no undo because +it's an `AssetDatabase` op) and one that **mutates a scene object** (`ObjectRef` in + undo). + +```csharp +using System.IO; +using Unity.Pipeline.Commands; +using Unity.Pipeline.Editor.Authoring; +using Unity.Pipeline.Models; +using UnityEditor; +using UnityEditor.SceneManagement; +using UnityEngine; + +namespace Unity.Pipeline.Editor.Commands.Rendering +{ + /// Authoring commands for materials (rendering). + public static class MaterialCommands + { + [CliCommand("create_material", + "Create a Material asset (default shader 'Standard') under the authoring root. " + + "NOTE: asset creation is not undoable via Ctrl+Z.")] + public static AuthoringResult CreateMaterial( + [CliArg("path", "Asset path relative to the authoring root; the Assets/ prefix and the .mat extension are optional. e.g. Materials/Stone", Required = true)] string path, + [CliArg("shader", "Shader name to assign. Defaults to 'Standard'.")] string shader = "Standard") + { + // 1. Resolve + confine the path (the sandbox boundary). + var normalized = ProjectPaths.Resolve(path, out var error); + if (normalized == null) + throw new ArgumentException(error); + if (!normalized.EndsWith(".mat", System.StringComparison.OrdinalIgnoreCase)) + normalized += ".mat"; + + var found = Shader.Find(shader); + if (found == null) + throw new ArgumentException($"Shader '{shader}' was not found."); + + // 2. Do the work (AssetDatabase op — no undo scope; it wouldn't be undoable anyway). + EnsureParentFolder(normalized); + var material = new Material(found); + AssetDatabase.CreateAsset(material, normalized); + AssetDatabase.SaveAssets(); + + // 3. Return the created object's identity so the agent can reference it next. + var result = ObjectResolver.Describe(material) ?? new AuthoringResult { Type = nameof(Material) }; + result.AssetPath = normalized; + return result; + } + + [CliCommand("set_material", "Assign a material asset to a Renderer on a scene GameObject.")] + public static AuthoringResult SetMaterial( + [CliArg("target", "Handle of the GameObject (or Renderer) to modify.", Required = true)] ObjectRef target, + [CliArg("material", "Handle of the material asset to assign (path/guid/globalId).", Required = true)] ObjectRef material) + { + // Resolve both handles up front, before mutating, so a bad handle changes nothing. + var renderer = ResolveRenderer(target); + if (!ObjectResolver.TryResolve(material, out var matObj, out var matError)) + throw new ArgumentException(matError); + if (matObj is not Material mat) + throw new ArgumentException($"'{material}' is not a Material."); + + using (new AuthoringUndoScope("Set Material")) + { + Undo.RecordObject(renderer, "Set Material"); // record BEFORE the change + renderer.sharedMaterial = mat; + EditorSceneManager.MarkSceneDirty(renderer.gameObject.scene); + } + + return ObjectResolver.Describe(renderer); + } + + private static Renderer ResolveRenderer(ObjectRef target) + { + if (!ObjectResolver.TryResolve(target, out var obj, out var error)) + throw new ArgumentException(error); + + var go = obj as GameObject ?? (obj as Component)?.gameObject; + var renderer = go != null ? go.GetComponent() : null; + if (renderer == null) + throw new ArgumentException($"Object '{target}' has no Renderer."); + return renderer; + } + + // Mirrors the shared helper used by the built-in asset commands. + private static void EnsureParentFolder(string assetPath) + { + var parent = Path.GetDirectoryName(assetPath)?.Replace('\\', '/'); + if (string.IsNullOrEmpty(parent) || AssetDatabase.IsValidFolder(parent)) + return; + // Create intermediate folders (see create_folder / CreateFolderRecursive). + Directory.CreateDirectory(ProjectPaths.ProjectRoot + "/" + parent); + AssetDatabase.Refresh(); + } + } +} +``` + +An agent chains them by feeding the first result into the second: + +``` +create_material --path Materials/Stone --shader Standard + → { "assetPath": "Assets/AgentWork/Materials/Stone.mat", "guid": "…", "type": "Material" } + +set_material --target '{"hierarchyPath":"/Ground"}' --material '{"path":"Assets/AgentWork/Materials/Stone.mat"}' + → { "instanceId": …, "hierarchyPath": "/Ground", "type": "MeshRenderer" } +``` + +## Checklist for a new authoring command + +For *content-authoring* commands. Config/build/package commands follow the lighter +[management-command conventions](#authoring-vs-management-commands) instead. + +- [ ] Editor-only, under `Editor/Commands//`, `static` (any accessibility — `public`/`internal`/`private`), tagged `[CliCommand]`. +- [ ] Every path parameter resolved through `ProjectPaths.Resolve` (never concatenated). +- [ ] Existing-object inputs taken as `ObjectRef`, resolved via `ObjectResolver.TryResolve`; resolve **before** mutating. +- [ ] Scene/object mutations wrapped in an `AuthoringUndoScope` and registered with the matching `Undo` API. +- [ ] `AssetDatabase` writes noted as non-undoable in the description; validate before writing. +- [ ] Returns `AuthoringResult` (via `ObjectResolver.Describe`) or a model containing `AuthoringResult[]`. +- [ ] Reports failures by throwing; never build the response envelope yourself. + +## Build & verify + +New commands register automatically after the next recompile (see +[Creating commands → Discovery](creating-commands.md#discovery)). Drive the live editor to verify: + +``` +command recompile +command recompile_status # poll until done +command create_material --path Materials/Stone +``` + +## See also + +- [Creating commands](creating-commands.md) — the base command API this page builds on. +- [Asset & file commands](commands/assets-and-files.md) — reference for the built-in asset commands. +- [GameObject & component commands](commands/gameobjects-and-components.md) — the scene-mutation commands. diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/commands/animation.md b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/commands/animation.md new file mode 100644 index 00000000..e983ada6 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/commands/animation.md @@ -0,0 +1,191 @@ +# Animation commands + +Author animation assets: AnimationClips (and their float curves), AnimatorControllers (parameters, layers, states, transitions), and Timeline assets. Create commands write under the authoring root and follow the shared `confirm`/`dry_run` convention. + +## AnimationClips + +### `create_animation_clip` +Create an empty .anim AnimationClip asset under the authoring root, with an optional frame rate and loop flag. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `path` | yes | `–` | Asset path ending in .anim, relative to the authoring root. The Assets/ prefix is optional. | +| `frameRate` | no | `60` | Sampling frame rate of the clip. | +| `loop` | no | `false` | If true, set the clip's loop-time flag in its AnimationClipSettings. | +| `confirm` | no | `false` | Required (true) only when overwriting an existing asset at the path. | +| `dry_run` | no | `false` | If true, validate inputs and report what would be created without writing anything. | + +**Returns:** `AuthoringResult` + +### `set_animation_curve` +Add or replace a single float curve binding on an AnimationClip (via AnimationUtility.SetEditorCurve). Replacing an existing binding overwrites it rather than duplicating. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `clip` | yes | `–` | Reference to the AnimationClip to edit (path / guid / globalId). | +| `path` | no | `""` | GameObject path relative to the animated root the property lives on. Empty string targets the root. | +| `type` | yes | `–` | Component type the property lives on, e.g. "Transform", "UnityEngine.Light". Resolved via the component TypeResolver. | +| `property` | yes | `–` | Curve property name, e.g. "m_LocalPosition.x", "m_LocalScale.y", "localEulerAnglesRaw.z". | +| `keys` | yes | `–` | Keyframes: `[{ time, value, inTangent?, outTangent?, weightedMode?: "None"\|"In"\|"Out"\|"Both" }]`. Omitted tangents default to 0 (flat); this is NOT Unity's Auto tangent mode. | +| `dry_run` | no | `false` | If true, validate type/property/keys without writing the curve. | + +**Returns:** `SetAnimationCurveResult` + +### `get_animation_clip` +Read an AnimationClip's metadata and all float curve bindings (optionally with keyframes). + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `clip` | yes | `–` | Reference to the AnimationClip to read (path / guid / globalId). | +| `includeKeys` | no | `false` | If true, include each binding's keyframes. | + +**Returns:** `AnimationClipInfo` + +### `remove_animation_curve` +Remove a float curve binding from an AnimationClip (SetEditorCurve(clip, binding, null)). Destructive: requires confirm=true. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `clip` | yes | `–` | Reference to the AnimationClip to edit (path / guid / globalId). | +| `path` | no | `""` | GameObject path relative to the animated root the binding lives on. Empty string targets the root. | +| `type` | yes | `–` | Component type of the binding to remove, e.g. "Transform". Resolved via the component TypeResolver. | +| `property` | yes | `–` | Curve property name to remove, e.g. "m_LocalPosition.x". | +| `confirm` | no | `false` | Must be true to actually remove the binding (destructive guard). | +| `dry_run` | no | `false` | If true, report the binding that would be removed without removing it. | + +**Returns:** `SetAnimationCurveResult` + +## AnimatorControllers + +### `create_animator_controller` +Create an .controller AnimatorController asset (with a default Base Layer) under the authoring root. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `path` | yes | `–` | Asset path ending in .controller, relative to the authoring root. The Assets/ prefix is optional. | +| `confirm` | no | `false` | Required (true) only when overwriting an existing asset at the path. | +| `dry_run` | no | `false` | If true, validate inputs and report what would be created without writing anything. | + +**Returns:** `AuthoringResult` + +### `add_animator_parameter` +Add a parameter (Float | Int | Bool | Trigger) to an AnimatorController. A duplicate name returns code 'duplicate_parameter'. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `controller` | yes | `–` | Reference to the AnimatorController to edit (path / guid / globalId). | +| `name` | yes | `–` | Parameter name. | +| `type` | yes | `–` | Parameter type: Float \| Int \| Bool \| Trigger. | +| `defaultValue` | no | `–` | Default value for Float/Int/Bool (ignored for Trigger). | +| `dry_run` | no | `false` | If true, validate inputs without writing the parameter. | + +**Returns:** `object` + +### `add_animator_layer` +Add a layer to an AnimatorController. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `controller` | yes | `–` | Reference to the AnimatorController to edit (path / guid / globalId). | +| `name` | yes | `–` | Layer name. | +| `weight` | no | `1` | Layer weight. | +| `blendingMode` | no | `Override` | Blending mode: Override \| Additive. | +| `dry_run` | no | `false` | If true, validate inputs without writing the layer. | + +**Returns:** `object` + +### `add_animator_state` +Add a state to a layer, optionally with a motion (AnimationClip or BlendTree) and as the layer default. A layer name with no match returns code 'layer_not_found'. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `controller` | yes | `–` | Reference to the AnimatorController to edit (path / guid / globalId). | +| `layer` | no | `0` | Layer index (int) or name (string). Default 0 (Base Layer). | +| `name` | yes | `–` | State name. | +| `motion` | no | `–` | Optional AnimationClip or BlendTree asset to assign as the state's motion. | +| `isDefault` | no | `false` | If true, set this state as the layer's default state. | +| `position` | no | `–` | Optional [x, y] node position in the graph (cosmetic). | +| `dry_run` | no | `false` | If true, validate inputs without writing the state. | + +**Returns:** `object` + +### `add_animator_transition` +Add a transition between two states (or from AnyState/Entry, to Exit) on a layer, with optional conditions. Validates that the states exist and each condition's parameter exists and its mode matches the parameter type. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `controller` | yes | `–` | Reference to the AnimatorController to edit (path / guid / globalId). | +| `layer` | no | `0` | Layer index (int) or name (string). Default 0 (Base Layer). | +| `fromState` | yes | `–` | Source state name, or the special "AnyState" / "Entry". | +| `toState` | yes | `–` | Destination state name, or the special "Exit". | +| `conditions` | no | `–` | Optional conditions: `[{ parameter, mode: "If"\|"IfNot"\|"Greater"\|"Less"\|"Equals"\|"NotEqual", threshold? }]`. | +| `hasExitTime` | no | `false` | If true, the transition uses exit time. | +| `exitTime` | no | `0` | Normalized exit time (0..1) when hasExitTime is set. | +| `duration` | no | `0.25` | Transition duration in seconds. | +| `hasFixedDuration` | no | `true` | If true, duration is in seconds; otherwise normalized. | +| `dry_run` | no | `false` | If true, validate everything (states, parameters, mode/type) without writing the transition. | + +**Returns:** `object` + +### `get_animator_controller` +Read an AnimatorController's full structure: parameters, layers, states (with motion / default), and transitions (with conditions). + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `controller` | yes | `–` | Reference to the AnimatorController to read (path / guid / globalId). | + +**Returns:** `AnimatorControllerInfo` + +## Timeline + +The Timeline commands require the `com.unity.timeline` package. + +### `create_timeline` +Create a .playable TimelineAsset under the authoring root (optional frame rate). + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `path` | yes | `–` | Asset path ending in .playable, relative to the authoring root. The Assets/ prefix is optional. | +| `frameRate` | no | `60` | Timeline frame rate. | +| `confirm` | no | `false` | Required (true) only when overwriting an existing asset at the path. | +| `dry_run` | no | `false` | If true, validate inputs and report what would be created without writing anything. | + +**Returns:** `object` + +### `add_timeline_track` +Add a track (Animation | Audio | Activation | Control | Playable | Signal | Marker) to a TimelineAsset, optionally nested under a parent group/track. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `timeline` | yes | `–` | Reference to the TimelineAsset to edit (path / guid / globalId). | +| `trackType` | yes | `–` | Track type: Animation \| Audio \| Activation \| Control \| Playable \| Signal \| Marker. | +| `name` | no | `–` | Optional track display name. | +| `parentTrack` | no | `–` | Optional name of an existing group/track to nest the new track under. | +| `dry_run` | no | `false` | If true, validate inputs without writing the track. | + +**Returns:** `object` + +### `add_timeline_clip` +Add a clip to a named track on a TimelineAsset. For Animation tracks pass an AnimationClip asset; for Audio tracks an AudioClip. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `timeline` | yes | `–` | Reference to the TimelineAsset to edit (path / guid / globalId). | +| `track` | yes | `–` | Target track name. | +| `start` | yes | `–` | Clip start time in seconds. | +| `duration` | yes | `–` | Clip duration in seconds. | +| `asset` | no | `–` | Source asset: for Animation tracks an AnimationClip; for Audio tracks an AudioClip. Required for those track types. | +| `dry_run` | no | `false` | If true, validate inputs without writing the clip. | + +**Returns:** `object` + +### `get_timeline` +Read a TimelineAsset's structure: frame rate, duration, and its tracks with their clips. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `timeline` | yes | `–` | Reference to the TimelineAsset to read (path / guid / globalId). | + +**Returns:** `object` + +See [Creating commands](../creating-commands.md) and [Connectivity](../connectivity.md). diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/commands/assets-and-files.md b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/commands/assets-and-files.md new file mode 100644 index 00000000..50ee6f00 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/commands/assets-and-files.md @@ -0,0 +1,150 @@ +# Asset & file commands + +Commands for creating, importing, moving, copying, renaming, deleting and finding project assets, plus folder and text-file operations. Every agent-supplied path is funnelled through the authoring-root sandbox (it rejects `../` and out-of-project writes); destructive or overwriting operations require `confirm=true` and support `dry_run`. AssetDatabase create/move/copy/rename/delete are not part of Unity's Undo system. + +### `create_asset` +Create a new ScriptableObject (or other UnityEngine.Object) asset of the given type at a path under the authoring root. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `path` | yes | – | Asset path relative to the authoring root, including extension (e.g. Data/Config.asset or Materials/Wall.mat). The Assets/ prefix is optional. | +| `type` | yes | – | Fully-qualified or short type name to instantiate (e.g. UnityEngine.Material, MyGame.GameConfig). Must derive from UnityEngine.Object and be creatable. | +| `shader` | no | `–` | Material-only (ignored otherwise): shader name to assign (e.g. Standard, "Universal Render Pipeline/Lit"). When omitted, defaults to "Universal Render Pipeline/Lit" if a Scriptable Render Pipeline is active, otherwise the built-in "Standard" shader (falling back to "Standard" if URP/Lit is unavailable). | +| `confirm` | no | `false` | Required (true) only when overwriting an existing asset at the path. Ignored when the path is empty. | +| `dry_run` | no | `false` | If true, validate inputs and report what would be created without writing anything. | + +**Returns:** `AuthoringResult` +**Notes:** `confirm=true` required to overwrite an existing asset; supports `dry_run`. + +### `import_asset` +Import an external file (e.g. a texture, model, audio clip) into the project by copying it to a path under the authoring root, then importing it. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `source` | yes | – | Absolute filesystem path to the external file to import. | +| `path` | yes | – | Destination asset path relative to the authoring root, including extension. The Assets/ prefix is optional. | +| `confirm` | no | `false` | Required (true) only when overwriting an existing asset at the destination path. | +| `dry_run` | no | `false` | If true, validate inputs and report what would be imported without writing anything. | + +**Returns:** `AuthoringResult` +**Notes:** `confirm=true` required to overwrite an existing asset; supports `dry_run`. + +### `move_asset` +Move (or rename via a new path) an asset to a new location under the authoring root. Preserves the asset's GUID. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `asset` | yes | – | Reference to the asset to move (path / guid / globalId). | +| `destination` | yes | – | Destination asset path relative to the authoring root, including extension. The Assets/ prefix is optional. | +| `dry_run` | no | `false` | If true, validate the move (via AssetDatabase.ValidateMoveAsset) without performing it. | + +**Returns:** `AuthoringResult` +**Notes:** Supports `dry_run`. + +### `copy_asset` +Copy an asset to a new path under the authoring root. The copy gets a fresh GUID. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `asset` | yes | – | Reference to the asset to copy (path / guid / globalId). | +| `destination` | yes | – | Destination asset path relative to the authoring root, including extension. The Assets/ prefix is optional. | +| `confirm` | no | `false` | Required (true) only when overwriting an existing asset at the destination path. | +| `dry_run` | no | `false` | If true, validate inputs and report what would be copied without writing anything. | + +**Returns:** `AuthoringResult` +**Notes:** `confirm=true` required to overwrite an existing asset; supports `dry_run`. + +### `rename_asset` +Rename an asset in place (keeps it in the same folder, keeps its GUID). + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `asset` | yes | – | Reference to the asset to rename (path / guid / globalId). | +| `new_name` | yes | – | New file name WITHOUT a folder path. The extension is preserved if omitted. | +| `dry_run` | no | `false` | If true, validate the rename without performing it. | + +**Returns:** `AuthoringResult` +**Notes:** Supports `dry_run`. + +### `delete_asset` +Delete an asset from the project. Destructive: requires confirm=true. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `asset` | yes | – | Reference to the asset to delete (path / guid / globalId). | +| `confirm` | no | `false` | Must be true to actually delete. Without it the command refuses (destructive guard). | +| `dry_run` | no | `false` | If true, report the asset that would be deleted without deleting it. | + +**Returns:** `AuthoringResult` +**Notes:** Destructive — `confirm=true` required; supports `dry_run`. Not undoable via Unity's Undo. + +### `find_assets` +Find assets by type and/or name and/or label, returning their path, GUID and type. At least one filter is required. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `type` | no | `–` | Type name to filter by (e.g. Material, GameObject, ScriptableObject, MyGame.GameConfig). Resolved to a System.Type and matched against each asset's actual main type. | +| `name` | no | `–` | Name substring to filter by (AssetDatabase name filter). | +| `label` | no | `–` | Asset label to filter by (AssetDatabase 'l:' filter). | +| `search_in` | no | `–` | Folder to scope the search to, relative to the authoring root (default: the authoring root). | +| `limit` | no | `200` | Maximum number of results to return (default 200). | + +**Returns:** `FindAssetsResult` +**Notes:** At least one of `type`, `name`, or `label` is required. + +### `set_import_settings` +Set import settings on an asset's AssetImporter (e.g. a texture's isReadable) and re-import it. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `asset` | yes | – | Reference to the asset whose importer to edit (path / guid / globalId). | +| `settings` | yes | – | JSON object of importer property/field names to values, e.g. {"isReadable": true, "textureType": "NormalMap"}. | +| `dry_run` | no | `false` | If true, validate which settings would apply (and which are unknown) without writing or re-importing. | + +**Returns:** `SetImportSettingsResult` +**Notes:** Supports `dry_run`. Import settings live in the asset's .meta file and are not part of Unity's Undo system. + +### `get_import_settings` +Read an asset's import settings, structured by importer type (texture/model/audio), including the default-platform fields and (for textures/audio) one platform override block. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `asset` | yes | – | Reference to the asset whose importer to read (path / guid / globalId). | +| `platform` | no | `Default` | Platform whose override to read: Default \| Standalone \| iOS \| Android \| WebGL \| tvOS. | + +**Returns:** `GetImportSettingsResult` + +### `create_folder` +Create a folder under the authoring root (creates intermediate folders). + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `path` | yes | – | Folder path relative to the authoring root (default Assets/); the Assets/ prefix is optional. e.g. Gameplay/Enemies or Assets/Gameplay/Enemies | + +**Returns:** `AuthoringResult` + +### `read_text_file` +Read a UTF-8 text file under the authoring root and return its contents. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `path` | yes | – | Text file path relative to the authoring root. The Assets/ prefix is optional. | +| `max_bytes` | no | `1048576` | Reject files larger than this many bytes (default 1048576 = 1 MiB) to avoid huge payloads. | + +**Returns:** `ReadTextFileResult` +**Notes:** `MainThreadRequired = true`. + +### `write_text_file` +Write UTF-8 text to a file under the authoring root, then import it. Overwriting an existing file requires confirm=true. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `path` | yes | – | Text file path relative to the authoring root, including extension. The Assets/ prefix is optional. | +| `contents` | yes | – | The full text content to write (replaces the file). | +| `confirm` | no | `false` | Required (true) only when overwriting an existing file at the path. | +| `dry_run` | no | `false` | If true, validate inputs and report what would be written without writing anything. | + +**Returns:** `AuthoringResult` +**Notes:** `confirm=true` required to overwrite an existing file; supports `dry_run`. Filesystem writes are not part of Unity's Undo system. + +See [Creating commands](../creating-commands.md) and [Connectivity](../connectivity.md). diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/commands/baking.md b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/commands/baking.md new file mode 100644 index 00000000..a7163466 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/commands/baking.md @@ -0,0 +1,140 @@ +# Baking commands + +Bake and clear precomputed scene data: lightmaps, NavMesh, and occlusion culling. Each `bake_*` runs asynchronously (returns immediately) — poll the matching `*_bake_status` until `completed`. The `clear_*` commands are destructive and require `confirm=true`. The `get_*_settings` / `set_*_settings` pairs read and tune the bake parameters. + +## Lighting + +### `bake_lighting` +Trigger an async lightmap bake of the open scene(s) via Lightmapping.BakeAsync(). Returns immediately; poll `lighting_bake_status` until completed. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `confirm` | no | `false` | Recommended (true): a bake overwrites existing lightmap data. Accepted for parity; not required. | +| `dry_run` | no | `false` | If true, validate there is an open bakeable scene and return the current lighting settings without baking. | + +**Returns:** `object` + +### `lighting_bake_status` +Get the status of the last lighting bake: idle | baking | completed. + +**Returns:** `string` + +### `cancel_lighting_bake` +Cancel an in-progress lighting bake (Lightmapping.Cancel()). + +**Returns:** `object` + +### `clear_baked_lighting` +Clear baked lightmap data for the open scene(s). Destructive: requires confirm=true. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `confirm` | no | `false` | Must be true to actually clear (destructive, not undoable via Unity's Undo). | +| `include_disk_cache` | no | `false` | If true, also clear the GI disk cache (Lightmapping.ClearDiskCache()). | +| `dry_run` | no | `false` | If true, report what would be cleared without clearing. | + +**Returns:** `object` + +### `get_lighting_settings` +Read the active LightingSettings (lightmapper, bounces, resolution, directional mode, AO, etc.). + +**Returns:** `LightingSettingsResult` + +### `set_lighting_settings` +Apply a subset of lighting settings to the active LightingSettings. Returns `{ applied[], unknown[] }`. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `settings` | yes | `–` | JSON object with a subset of lighting fields to set (same names/enums as get_lighting_settings). | +| `dry_run` | no | `false` | If true, validate the keys and report applied/unknown without changing anything. | + +**Returns:** `object` + +## NavMesh + +### `bake_navmesh` +Trigger an async legacy NavMesh bake of the open scene(s) via UnityEditor.AI.NavMeshBuilder. Returns immediately; poll `navmesh_bake_status` until completed. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `confirm` | no | `false` | Accepted for parity (a bake overwrites the existing NavMesh); not required. | +| `dry_run` | no | `false` | If true, validate there is an open scene and return current NavMesh settings without baking. | + +**Returns:** `object` + +### `navmesh_bake_status` +Get the status of the last NavMesh bake: idle | baking | completed. + +**Returns:** `string` + +### `cancel_navmesh_bake` +Cancel an in-progress NavMesh bake (NavMeshBuilder.Cancel()). + +**Returns:** `object` + +### `clear_navmesh` +Clear the baked NavMesh for the open scene(s). Destructive: requires confirm=true. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `confirm` | no | `false` | Must be true to actually clear (destructive, not undoable via Unity's Undo). | +| `dry_run` | no | `false` | If true, report what would be cleared without clearing. | + +**Returns:** `object` + +### `get_navmesh_settings` +Read the default agent's legacy NavMesh bake settings (agentRadius/Height/Slope/Climb, minRegionArea, voxelSize). + +**Returns:** `NavMeshSettingsResult` + +### `set_navmesh_settings` +Apply a subset of legacy NavMesh bake settings to the default agent. Returns `{ applied[], unknown[] }`. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `settings` | yes | `–` | JSON object with a subset of NavMesh fields to set (same names as get_navmesh_settings). | +| `dry_run` | no | `false` | If true, validate the keys and report applied/unknown without changing anything. | + +**Returns:** `object` + +### `bake_navmesh_surfaces` +Bake NavMeshSurface components (AI Navigation package). v1 stub: returns package_not_found when the package is absent. + +**Returns:** `object` + +## Occlusion culling + +### `bake_occlusion_culling` +Trigger an async occlusion-culling bake of the open scene(s) via StaticOcclusionCulling.GenerateInBackground(). Returns immediately; poll `occlusion_bake_status` until completed. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `smallest_occluder` | no | `–` | Smallest object that will occlude others (meters). Defaults to Unity's current value. | +| `smallest_hole` | no | `–` | Smallest gap geometry can have that the view can see through (meters). Defaults to Unity's current value. | +| `backface_threshold` | no | `–` | Backface threshold (1-100); lower trims more backfaces. Defaults to Unity's current value. | +| `confirm` | no | `false` | Accepted for parity (a bake overwrites existing occlusion data); not required. | +| `dry_run` | no | `false` | If true, validate there is an open scene and report the parameters that would be used without baking. | + +**Returns:** `object` + +### `occlusion_bake_status` +Get the status of the last occlusion bake: idle | baking | completed. + +**Returns:** `string` + +### `cancel_occlusion_bake` +Cancel an in-progress occlusion bake (StaticOcclusionCulling.Cancel()). + +**Returns:** `object` + +### `clear_occlusion_culling` +Clear baked occlusion-culling data for the open scene(s). Destructive: requires confirm=true. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `confirm` | no | `false` | Must be true to actually clear (destructive, not undoable via Unity's Undo). | +| `dry_run` | no | `false` | If true, report what would be cleared without clearing. | + +**Returns:** `object` + +See [Creating commands](../creating-commands.md) and [Connectivity](../connectivity.md). diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/commands/build-and-compilation.md b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/commands/build-and-compilation.md new file mode 100644 index 00000000..7ae55d4b --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/commands/build-and-compilation.md @@ -0,0 +1,188 @@ +# Build, compilation & test commands + +These commands drive the build/compile/test dev loop, plus build configuration: triggering Player builds and reading the resulting BuildReport, switching the active build target, enumerating targets, reading/writing EditorUserBuildSettings, and listing Build Profiles. Several commands are asynchronous: trigger the operation, then poll a matching `*_status` command until it reports completion. The client must tolerate connection errors during a domain reload (recompile, target switch) or a long blocking build. + +### `build` +Trigger an async Player build and report the full BuildReport. Returns immediately (queued); poll build_status until status is 'completed'. DetailedBuildReport is included by default unless 'options' is supplied. Use dry_run to validate without building. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `target` | no | `–` | BuildTarget name (e.g. StandaloneWindows64). Defaults to the active target. Must be installed. | +| `outputPath` | no | `–` | Output path (absolute, or relative to the project root). Defaults to the last/auto path. | +| `profileName` | no | `–` | Build Profile name to activate before building (Unity 6 only; ignored otherwise). | +| `options` | no | `–` | BuildOptions names. Omit to get just DetailedBuildReport; supplying any disables that default. | +| `scenes` | no | `–` | Scene asset paths to build (e.g. Assets/Scenes/Main.unity). Defaults to EditorBuildSettings. | +| `confirm` | no | `false` | Acknowledge and run the build; without it the call is refused. Use `dry_run` to validate only. | +| `dry_run` | no | `false` | Validate target/outputPath/scenes without building. | + +Supported `options` values (case-insensitive): `Development`, `AllowDebugging`, `ConnectWithProfiler`, `EnableHeadlessMode`, `SymlinkSources`, `BuildAdditionalStreamedScenes`, `CleanBuildCache`, `DetailedBuildReport`. Any unrecognized value is a validation error. + +**Returns:** `object` (transient payloads: `queued` / `busy` / `dry_run` / `error`; the finished report is read via `build_status`). +**Notes:** `MainThreadRequired = false`. Async — validates + queues, returns `queued` immediately, then an editor tick runs the (blocking) build; poll `build_status` until status is `completed`. Only one build at a time (returns `busy` otherwise). Mutating: gated by the `confirm`/`dry_run` convention — pass `confirm=true` for a real build, or `dry_run=true` to validate target/outputPath/scenes without building (nothing is queued on a dry run or on validation failure). + +### `build_status` +Status of the current/most recent build: idle | queued | building | completed, with the full BuildReport (files, packedAssets, buildSteps, errors, warnings) once completed. Retained until the next build. + +No parameters. + +**Returns:** `string` (JSON). `idle` when no build has run; `queued`/`building` (the latter with live `elapsedMs`) while in progress; a full `BuildReportResult` once `completed`. + +`BuildReportResult` fields (returned when `status` is `completed`): + +| Field | Description | +|-------|-------------| +| `status` | Always `completed` here. | +| `buildId` | Id returned by the triggering `build` call. | +| `result` | `Succeeded` \| `Failed` \| `Cancelled` \| `Unknown`. | +| `platform` | Build target the report is for. | +| `outputPath` | Final output location. | +| `totalSizeBytes` | Total build size in bytes. | +| `buildTimeMs` | Total build duration in milliseconds. | +| `buildStartedAt` / `buildEndedAt` | ISO-8601 timestamps (omitted when unset). | +| `totalWarnings` / `totalErrors` | Aggregate counts from the report summary. | +| `files` | Output files (path, role, sizeBytes). Present only on success. | +| `packedAssets` | Packed bundles with per-asset breakdown. Present only on success and requires DetailedBuildReport. | +| `buildSteps` | Per-step name, durationMs, depth, and messages. | +| `errors` / `warnings` | Build issues, each with `message` and best-effort `file`. | + +**Notes:** `MainThreadRequired = false`. Reads a Temp status file off-thread, so polling keeps working while a build holds the main thread. The file also survives the domain reload a build can incur, so the last report is retained until the next build. + +### `switch_build_target` +Switch the active build target (destructive, long-running: triggers a full reimport + domain reload). Requires confirm=true. Returns immediately; poll switch_build_target_status. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `target` | yes | `–` | BuildTarget name to switch to (must be installed; see list_build_targets). | +| `confirm` | no | `false` | Apply the switch. Without it the call is refused. | + +**Returns:** `object` (`switching` / `busy` / `completed` / `error`). Returns `completed` immediately if already on the requested target. +**Notes:** `MainThreadRequired = false`. Async — validates + queues, returns `switching` immediately, then an editor tick performs the (blocking) switch; poll `switch_build_target_status` until `completed`. Only one switch at a time (returns `busy` otherwise). Mutating and confirm-gated: without `confirm=true` the call is refused. The status file survives the domain reload the switch causes, and is reconciled against the active target on the next load. + +### `switch_build_target_status` +Status of the last target switch: idle | switching | completed (with success + activeBuildTarget). + +No parameters. + +**Returns:** `string` (JSON). `idle`, `switching`, or `completed` (with `success` and `activeBuildTarget`, or `errors` on failure). +**Notes:** `MainThreadRequired = false`. Reads a Temp status file off-thread, so it keeps answering while the switch holds the main thread. + +### `list_build_targets` +List the known BuildTarget values with their group and whether build support is installed. + +No parameters. + +**Returns:** `object` (list of `BuildTargetInfo`: `name`, `displayName`, `targetGroup`, `isInstalled`), sorted by group then name. Obsolete and sentinel targets are excluded. +**Notes:** `MainThreadRequired = true`. + +### `get_build_settings` +Read the current build configuration from EditorUserBuildSettings / EditorBuildSettings. + +No parameters. + +**Returns:** `object` (`BuildSettingsResult`). + +`BuildSettingsResult` fields: + +| Field | Description | +|-------|-------------| +| `activeBuildTarget` | Active BuildTarget name. | +| `activeBuildTargetGroup` | Active BuildTargetGroup name. | +| `developmentBuild` | Whether a Development Player is configured. | +| `allowDebugging` | Whether script debugging is allowed. | +| `connectWithProfiler` | Whether the Profiler auto-connects. | +| `buildScriptsOnly` | Whether only scripts are built (skip data). | +| `symlinkSources` | Whether runtime/plugin sources are symlinked. | +| `il2CppCodeGeneration` | `OptimizeSpeed` \| `OptimizeSize` for the active target. | +| `scenes` | Build Settings scene list (each: `path`, `guid`, `enabled`). | + +**Notes:** `MainThreadRequired = true`. + +### `set_build_settings` +Set mutable EditorUserBuildSettings fields. Does NOT manage scenes (use add_scene_to_build / remove_scene_from_build) or switch target (use switch_build_target). Use dry_run to preview. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `settings` | no | `–` | Fields to change; omitted fields are left unchanged. | +| `confirm` | no | `false` | Apply the changes. Without it the call is refused. | +| `dry_run` | no | `false` | Preview the change without applying it. | + +`settings` fields (a structured input DTO; every field is optional — only supplied fields change): + +| Field | Description | +|-------|-------------| +| `developmentBuild` | Build a Development Player (enables the debugger/profiler). | +| `allowDebugging` | Allow script debugging (only effective with developmentBuild=true). | +| `connectWithProfiler` | Auto-connect the Profiler (only effective with developmentBuild=true). | +| `buildScriptsOnly` | Build only the scripts (skip data) for faster iteration. | +| `symlinkSources` | Symlink runtime/plugin sources instead of copying (where supported). | +| `il2CppCodeGeneration` | IL2CPP code generation for the active target: OptimizeSpeed \| OptimizeSize. | + +**Returns:** `object` (`SetBuildSettingsResult`: `success`, `dryRun`, `applied` map of fields that changed, `skipped` map of supplied fields that already matched, `message`). +**Notes:** `MainThreadRequired = true`. Mutating: refused unless `confirm=true` (or `dry_run=true` to preview). Fields already at the requested value are reported under `skipped` rather than re-applied. Fails if no `settings` object is provided. + +### `list_build_profiles` +List Build Profile assets in the project (Unity 6 only). Returns feature_unavailable on earlier versions. + +No parameters. + +**Returns:** `object` (list of `BuildProfileInfo`: `name`, `guid`, `platform`, `isActive`), or `{ error, code = "feature_unavailable" }` on editors older than Unity 6. +**Notes:** `MainThreadRequired = true`. + +### `recompile` +Force a script recompile (works while unfocused/minimized). Poll recompile_status for completion. + +No parameters. + +**Returns:** `object` +**Notes:** `MainThreadRequired = true`. Async — poll `recompile_status` until status is `completed` or `up_to_date`. A successful compile triggers a domain reload, so the triggering request cannot stay open. + +### `recompile_status` +Get the status of the last recompile: idle | triggered | compiling | completed | up_to_date. + +No parameters. + +**Returns:** `string` +**Notes:** `MainThreadRequired = false`. + +### `list_tests` +List all available tests (EditMode and/or PlayMode) without running them. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `mode` | no | `all` | Test mode: all, editor, playmode (default: all) | + +**Returns:** `TestListResponse` +**Notes:** `MainThreadRequired = true`. + +### `run_tests` +Execute Unity tests with filtering options. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `mode` | no | `all` | Test mode: all, editor, playmode (default: all) | +| `filter` | no | `–` | Test name filter pattern (case-insensitive partial match) | +| `filter_type` | no | `testName` | Filter type: testName, assembly, category (default: testName) | +| `include_explicit` | no | `false` | Include tests marked with [Explicit] attribute | +| `async_tests` | no | `false` | Run asynchronously - return immediately, poll /test-status for results | +| `timeout` | no | `300` | Test execution timeout in seconds (default: 300) | + +**Returns:** `TestExecutionResponse` +**Notes:** `MainThreadRequired = true`. Synchronous by default; with `async_tests=true` it returns immediately — poll `test_status` for results. + +### `test_status` +Get status of running async test execution. + +No parameters. + +**Returns:** `string` +**Notes:** `MainThreadRequired = false`. + +### `cancel_tests` +Cancel running test execution. + +No parameters. + +**Returns:** `object` +**Notes:** `MainThreadRequired = true`. + +See [Creating commands](../creating-commands.md) and [Connectivity](../connectivity.md). diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/commands/capture.md b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/commands/capture.md new file mode 100644 index 00000000..9c289c94 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/commands/capture.md @@ -0,0 +1,58 @@ +# Capture commands + +Commands that render a camera, the Scene View, or a UI Toolkit element to a PNG and return it base64-encoded so an agent can "see" the editor (or a running player) without a display. + +### `capture_game_view` +Render a camera to a PNG. Returns it inline as base64, unless `save_path` is set — then the result is **path-only** (no base64) so agent tool results stay small; pass `include_inline_image=true` to get both. + +Parameter interactions: `include_inline_image` is only meaningful together with `save_path` (without one, the inline image is always returned). `max_resolution` only applies when an inline image is actually returned — i.e. no `save_path`, or `save_path` + `include_inline_image=true`; it has **no effect** when `save_path` is set without `include_inline_image=true`. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `width` | no | `1280` | Output width in px (default 1280; capped 4096). | +| `height` | no | `720` | Output height in px (default 720; capped 4096). | +| `camera` | no | `–` | Optional camera name; defaults to Camera.main, else the first enabled camera. | +| `save_path` | no | `–` | Optional project-relative path to write the PNG (e.g. Screenshots/foo.png). When set, the result omits the inline base64 image unless `include_inline_image=true`. | +| `include_inline_image` | no | `false` | Also return the image inline as base64 when `save_path` is set. | +| `max_resolution` | no | `0` | Cap on the inline image's longest edge (e.g. 512), preserving aspect ratio. No effect when `save_path` is set without `include_inline_image=true`. The `save_path` file keeps the requested resolution; a downscaled inline copy is reported via `inlineWidth`/`inlineHeight`. | + +**Returns:** `CaptureResult` + +### `capture_scene_view` +Render the active Scene View to a PNG. Same result contract and parameter interactions as `capture_game_view`: inline base64, or path-only when `save_path` is set (opt back in with `include_inline_image=true`; `max_resolution` has no effect when `save_path` is set without it). + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `width` | no | `1280` | Output width in px (default 1280; capped 4096). | +| `height` | no | `720` | Output height in px (default 720; capped 4096). | +| `save_path` | no | `–` | Optional project-relative path to write the PNG (e.g. Screenshots/foo.png). When set, the result omits the inline base64 image unless `include_inline_image=true`. | +| `include_inline_image` | no | `false` | Also return the image inline as base64 when `save_path` is set. | +| `max_resolution` | no | `0` | Cap on the inline image's longest edge (e.g. 512), preserving aspect ratio. No effect when `save_path` is set without `include_inline_image=true`. The `save_path` file keeps the requested resolution; a downscaled inline copy is reported via `inlineWidth`/`inlineHeight`. | + +**Returns:** `CaptureResult` + +### `capture_editor_element` +Capture a UI Toolkit VisualElement (by selector) from an EditorWindow to a PNG; returns path + base64. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `window` | yes | `–` | EditorWindow type name (e.g. InspectorWindow) or window title to capture from. | +| `selector` | yes | `–` | Element selector: '#name', '.class', a type name (e.g. Button), descendant (space) / child ('>') chains, optional pseudo-states (:checked,:hover,:focus,:active,:enabled,:disabled,:not(...)). | +| `output` | no | `–` | Output PNG path (absolute, or relative to the project root). Defaults to a timestamped file under /Temp/pipeline-screenshots/. | + +**Returns:** `CaptureElementResponse` +**Notes:** `MainThreadRequired = true`. Unity 6000.7+ only. + +### `capture_runtime_element` +Capture a UI Toolkit VisualElement (by selector) from a live runtime panel (UIDocument or PanelRenderer) to a PNG; returns path + base64. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `panel` | no | `–` | Name of the target panel: matches the PanelSettings asset name or the host GameObject name (UIDocument or PanelRenderer). Optional when exactly one panel exists. | +| `selector` | yes | `–` | Element selector: '#name', '.class', a type name (e.g. Button), descendant (space) / child ('>') chains, optional pseudo-states (:checked,:hover,:focus,:active,:enabled,:disabled,:not(...)). | +| `output` | no | `–` | Output PNG path (absolute, or relative to Application.persistentDataPath). Defaults to a timestamped file under Application.persistentDataPath. | + +**Returns:** `CaptureElementResponse` +**Notes:** `MainThreadRequired = true`, `RuntimeOnly`. Unity 6000.7+ only. + +See [Creating commands](../creating-commands.md) and [Connectivity](../connectivity.md). diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/commands/editor-lifecycle-and-observability.md b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/commands/editor-lifecycle-and-observability.md new file mode 100644 index 00000000..a5889b84 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/commands/editor-lifecycle-and-observability.md @@ -0,0 +1,115 @@ +# Editor lifecycle & observability commands + +Commands to control Editor play mode, focus, and menus, and to observe the Editor's state, console, and performance. + +### `editor_play` +Enter Unity Editor play mode. + +No parameters. + +**Returns:** `string` + +### `editor_stop` +Exit Unity Editor play mode. + +No parameters. + +**Returns:** `string` + +### `editor_pause` +Pause Unity Editor play mode. + +No parameters. + +**Returns:** `string` + +### `editor_status` +Get detailed Unity Editor status and state information. + +No parameters. + +**Returns:** `StatusResponse` + +### `editor_focus` +Bring the Unity Editor window to the foreground. + +No parameters. + +**Returns:** `string` +**Notes:** `MainThreadRequired = true`. + +### `menu` +Execute an Editor menu item by path, or list available items when no path is given. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `path` | no | `–` | Menu item path to execute, e.g. "Assets/Reimport All". Omit to list available menu items. | + +**Returns:** `MenuResponse` +**Notes:** `MainThreadRequired = true`. + +### `screenshot` +Capture the Scene or Game view as a PNG and return its file path. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `view` | no | `game` | Which view to capture: 'game' (default) or 'scene' | +| `output` | no | `–` | Output PNG path (absolute, or relative to the project root). Defaults to a timestamped file under /Temp/pipeline-screenshots/. | +| `width` | no | `0` | Output width in pixels. 0 (default) uses the view camera's current width. | +| `height` | no | `0` | Output height in pixels. 0 (default) uses the view camera's current height. | + +**Returns:** `ScreenshotResponse` +**Notes:** `MainThreadRequired = true`. + +### `set_autotick` +Keep the editor ticking while unfocused by forcing EditorApplication.SignalTick at a throttled rate. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `enable` | no | `true` | Enable (true) or disable (false) auto-tick mode | +| `interval_ms` | no | `16` | Minimum milliseconds between forced ticks. 0 = every update (max rate, pegs a CPU core). Default 16 (~60Hz). | + +**Returns:** `string` +**Notes:** `MainThreadRequired = true`. State is static and resets on domain reload (turns itself off after a recompile). + +### `get_console_logs` +Read recently captured Editor console logs (structured). + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `severity` | no | `all` | Filter: all | log | warning | error. 'all' = every entry; 'log' = Log only; 'warning' = Warning only; 'error' = Error/Exception/Assert only. | +| `limit` | no | `100` | Max entries to return (most-recent first), capped at 1000. | + +**Returns:** `object` + +### `clear_console` +Clear the captured log buffer and the Unity Editor console. + +No parameters. + +**Returns:** `object` + +### `get_performance_stats` +Read render, memory, and frame-timing stats (structured, read-only). + +No parameters. + +**Returns:** `PerformanceStats` + +### `get_authoring_root` +Get the base folder (under Assets/) that bare authoring paths resolve against. + +No parameters. + +**Returns:** `object` + +### `set_authoring_root` +Set the base folder (under Assets/) that bare authoring paths resolve against and are confined to. Use 'Assets' for full project access. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `root` | yes | `–` | Project-relative folder under Assets/, e.g. Assets/AgentWork. Use 'Assets' to allow the whole project. | + +**Returns:** `object` + +See [Creating commands](../creating-commands.md) and [Connectivity](../connectivity.md). diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/commands/gameobjects-and-components.md b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/commands/gameobjects-and-components.md new file mode 100644 index 00000000..ca1e4cc0 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/commands/gameobjects-and-components.md @@ -0,0 +1,169 @@ +# GameObject & component commands + +Commands for creating GameObjects, querying the scene hierarchy, mutating the core GameObject/Transform surface, and adding/removing components and editing their serialized properties. Scene mutations are wrapped in Unity's Undo system (so a multi-step action reverts as one collapsible step) and are blocked during Play mode. Objects are referenced by an `ObjectRef` handle (globalId/path/guid/instanceId/hierarchyPath), and results come back as `AuthoringResult` identities you can chain into a follow-up call. + +### `create_gameobject` +Create an empty GameObject or a built-in primitive (cube/sphere/capsule/cylinder/plane/quad) in the active scene. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `name` | no | `–` | Name for the new GameObject. Defaults to 'GameObject' (or the primitive name). | +| `primitive` | no | `–` | Optional primitive type: cube, sphere, capsule, cylinder, plane, quad. Omit for an empty GameObject. | +| `parent` | no | `–` | Optional parent handle (globalId/path/guid/instanceId/hierarchyPath). The new object becomes a child of it. | + +**Returns:** `AuthoringResult` +**Notes:** Undo-able; blocked during Play mode. + +### `create_gameobjects` +Batch-create N empty GameObjects or primitives in one call. Optional positions/rotations/scales are arrays of [x,y,z] (length must equal count). Returns the created identities. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `name` | no | `–` | Base name. With count>1 and no explicit names, objects are suffixed Name1..NameN. | +| `primitive` | no | `–` | Optional primitive type: cube, sphere, capsule, cylinder, plane, quad. Omit for empty GameObjects. | +| `parent` | no | `–` | Optional parent handle. Every created object becomes a child of it. | +| `count` | no | `1` | How many GameObjects to create. Default 1. | +| `positions` | no | `–` | Local positions, one [x,y,z] per object. Length must equal count when supplied. | +| `rotations` | no | `–` | Local Euler rotations (degrees), one [x,y,z] per object. Length must equal count when supplied. | +| `scales` | no | `–` | Local scales, one [x,y,z] per object. Length must equal count when supplied. | + +**Returns:** `CreateGameObjectsResult` +**Notes:** Undo-able (the whole batch reverts as one step); blocked during Play mode. + +### `find_gameobjects` +Find GameObjects in loaded scenes by name, tag, component type, and/or hierarchy path (filters are combined). Returns structured identities. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `name` | no | `–` | Exact name to match. | +| `tag` | no | `–` | Tag to match (e.g. 'Player'). | +| `type` | no | `–` | Component type name to match (e.g. 'Rigidbody', 'UnityEngine.Camera'). | +| `hierarchy_path` | no | `–` | Exact hierarchy path to match (e.g. '/Root/Child'). | +| `include_inactive` | no | `true` | Include inactive GameObjects. Default true. | + +**Returns:** `FindGameObjectsResult` + +### `set_transform` +Set a GameObject's local position/rotation(euler)/scale. Omitted channels are left unchanged. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `target` | yes | – | Handle of the GameObject to modify. | +| `position` | no | `–` | Local position as [x,y,z]. | +| `rotation` | no | `–` | Local rotation as Euler angles [x,y,z] in degrees. | +| `scale` | no | `–` | Local scale as [x,y,z]. | + +**Returns:** `AuthoringResult` +**Notes:** Undo-able; blocked during Play mode. + +### `set_parent` +Reparent a GameObject under a new parent, or detach it to scene root when no parent is given. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `target` | yes | – | Handle of the GameObject to reparent. | +| `parent` | no | `–` | Handle of the new parent. Omit (or empty) to move the object to the scene root. | +| `world_position_stays` | no | `true` | Keep the object's world position when reparenting. Default true. | + +**Returns:** `AuthoringResult` +**Notes:** Undo-able; blocked during Play mode. + +### `set_active` +Set a GameObject's active self-state (activeSelf). + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `target` | yes | – | Handle of the GameObject. | +| `active` | yes | – | Desired active state. | + +**Returns:** `AuthoringResult` +**Notes:** Undo-able; blocked during Play mode. + +### `set_tag` +Set a GameObject's tag (the tag must already exist in the project). + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `target` | yes | – | Handle of the GameObject. | +| `tag` | yes | – | Tag to assign (must exist in the Tag Manager). | + +**Returns:** `AuthoringResult` +**Notes:** Undo-able; blocked during Play mode. + +### `set_layer` +Set a GameObject's layer by name or numeric index (0-31). + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `target` | yes | – | Handle of the GameObject. | +| `layer` | yes | – | Layer name (e.g. 'UI') or numeric index 0-31. | + +**Returns:** `AuthoringResult` +**Notes:** Undo-able; blocked during Play mode. + +### `rename_gameobject` +Rename a GameObject. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `target` | yes | – | Handle of the GameObject. | +| `name` | yes | – | New name. | + +**Returns:** `AuthoringResult` +**Notes:** Undo-able; blocked during Play mode. + +### `delete_gameobject` +Delete a GameObject from the scene (reversible via Undo). + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `target` | yes | – | Handle of the GameObject to delete. | + +**Returns:** `AuthoringResult` +**Notes:** Undo-able; blocked during Play mode. The result describes the object's identity captured before destruction. + +### `add_component` +Add a component (by type name) to a GameObject. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `target` | yes | – | Handle of the GameObject. | +| `type` | yes | – | Component type name (e.g. 'Rigidbody' or 'UnityEngine.Camera'). | + +**Returns:** `AuthoringResult` +**Notes:** Undo-able; blocked during Play mode. + +### `remove_component` +Remove a component from a GameObject. Provide either a component handle (target) or a GameObject handle (target) plus a type name. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `target` | yes | – | Handle of the component to remove, OR of the GameObject when 'type' is given. | +| `type` | no | `–` | Component type name to remove from the target GameObject (omit when 'target' already points at a component). | + +**Returns:** `AuthoringResult` +**Notes:** Undo-able; blocked during Play mode. + +### `get_component_properties` +Get a component's serialized properties as a JSON map. Address the component by handle, or by GameObject handle + type. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `target` | yes | – | Handle of the component, OR of the GameObject when 'type' is given. | +| `type` | no | `–` | Component type name on the target GameObject (omit when 'target' is a component handle). | + +**Returns:** `ComponentPropertiesResult` + +### `set_component_properties` +Set serialized properties on a component (one Undo step). 'properties' maps property name -> value; object references accept an ObjectRef handle. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `target` | yes | – | Handle of the component, OR of the GameObject when 'type' is given. | +| `properties` | yes | – | Map of serialized property name to value. Vectors/colors are arrays; object refs are handle objects. | +| `type` | no | `–` | Component type name on the target GameObject (omit when 'target' is a component handle). | + +**Returns:** `ComponentPropertiesResult` +**Notes:** Undo-able (one Undo step); blocked during Play mode. An unknown property name fails the whole batch (no partial apply). + +See [Creating commands](../creating-commands.md) and [Connectivity](../connectivity.md). diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/commands/materials.md b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/commands/materials.md new file mode 100644 index 00000000..a81d780f --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/commands/materials.md @@ -0,0 +1,55 @@ +# Material & shader commands + +Read and edit material shader properties, and discover/introspect shaders so an agent can pick a valid shader name and property set. + +## Materials + +### `get_material_properties` +Read a material's shader, render queue, enabled keywords, and all shader properties with their current values (Color as [r,g,b,a], Vector as [x,y,z,w], Texture as an object reference). + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `material` | yes | `–` | Reference to the .mat asset (or a loaded material) to read (path / guid / globalId / instanceId). | + +**Returns:** `MaterialPropertiesResult` + +### `set_material_properties` +Set shader properties on a material (Float/Range/Int=number; Color=[r,g,b,a] or "#RRGGBBAA" hex; Vector=[x,y,z,w]; Texture=an object reference or null to clear), optionally reassign the shader, set the render queue, and toggle keywords. Unknown names / type mismatches are reported in `unknown[]`. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `material` | yes | `–` | Reference to the .mat asset (or a loaded material) to edit (path / guid / globalId / instanceId). | +| `shader` | no | `–` | Reassign the material's shader by name (e.g. "Standard", "Universal Render Pipeline/Lit", or a Shader Graph shader name). Applied before properties so new property names resolve against the new shader. | +| `properties` | no | `–` | JSON object of shader property name -> value. Names must include the leading underscore (e.g. _BaseColor). Float/Range/Int=number; Color=[r,g,b,a] or hex string; Vector=[x,y,z,w]; Texture=an object reference {guid/path} or null. | +| `renderQueue` | no | `–` | Explicit render queue, or -1 to inherit from the shader. Omit to leave unchanged. | +| `enableKeywords` | no | `–` | Shader keywords to enable (e.g. _NORMALMAP, _EMISSION). | +| `disableKeywords` | no | `–` | Shader keywords to disable. | +| `confirm` | no | `false` | Reserved for parity; editing an existing material is non-destructive and undoable, so it is not required. | +| `dry_run` | no | `false` | If true, validate the shader, resolve property names and texture refs, and report applied[]/unknown[] without writing anything. | + +**Returns:** `SetMaterialPropertiesResult` + +## Shaders + +### `list_shaders` +Discover available shaders so an agent can pick a valid name for set_material_properties / create_asset. Returns `[{ name, assetPath|null, isBuiltin, isSupported }]`. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `filter` | no | `–` | Case-insensitive substring matched against the shader name (e.g. "URP", "Lit"). | +| `includeBuiltin` | no | `true` | Include built-in/engine shaders (those with no project asset path). | +| `limit` | no | `200` | Maximum number of shaders to return. | + +**Returns:** `object` (list of `ShaderInfo`) + +### `get_shader_properties` +Introspect a shader's declared property list (name, description, type Color|Vector|Float|Range|TexEnv|Int, range, textureDimension, flags). Provide `shader` (by name) OR `material` (read the shader off that material). + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `shader` | no | `–` | Shader name (e.g. "Universal Render Pipeline/Lit"). Provide this OR 'material'. | +| `material` | no | `–` | Reference to a material to read the shader from instead of naming it. Provide this OR 'shader'. | + +**Returns:** `ShaderPropertiesResult` + +See [Creating commands](../creating-commands.md) and [Connectivity](../connectivity.md). diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/commands/navigation.md b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/commands/navigation.md new file mode 100644 index 00000000..fed671f9 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/commands/navigation.md @@ -0,0 +1,32 @@ +# Navigation & selection commands + +Commands to read and drive the Editor selection, and to run Unity Search queries. All commands are read-only or non-destructive and run on the main thread. + +### `get_selection` +Read the current Editor selection as structured object identities. + +No parameters. + +**Returns:** `SelectionResult` + +### `set_selection` +Set the Editor selection to the given assets/scene objects. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `instance_ids` | no | `–` | Scene/loaded object instance IDs to select. | +| `paths` | no | `–` | Asset paths to select (e.g. Assets/Foo.prefab). | + +**Returns:** `SelectionResult` + +### `search` +Run a Unity Search query and return structured results. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `query` | yes | `–` | Unity Search query string, e.g. 't:Material', 'p: my asset', 'h: Main Camera'. | +| `limit` | no | `50` | Max results to return (capped 200). | + +**Returns:** `SearchResult` + +See [Creating commands](../creating-commands.md) and [Connectivity](../connectivity.md). diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/commands/package-manager.md b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/commands/package-manager.md new file mode 100644 index 00000000..d84010e4 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/commands/package-manager.md @@ -0,0 +1,70 @@ +# Package Manager commands + +These commands query and modify the project's UPM package set (list, search, add, remove, resolve, status) over `UnityEditor.PackageManager`. Read-only queries block until the registry responds and return synchronously; mutating commands (`package_add`/`package_remove`) require `confirm=true`, support `dry_run` previews, and are async by default (poll `package_status`) with an optional `wait=true` to block until done. + +### `package_list` +List packages by scope: installed (default) | available (registry) | all (both). Returns the full result synchronously — available/all block until the registry query completes. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `scope` | no | `installed` | Which packages to list: installed (default) | available | all. | +| `include_indirect` | no | `true` | Include indirect (transitive) installed dependencies (applies to scope=installed/all). | +| `offline` | no | `false` | For available/all: query the local cache instead of the registry. | + +**Returns:** `object` +**Notes:** `MainThreadRequired = false`. Synchronous — `available`/`all` start a registry query and block until it completes (up to a 25s timeout); `installed` reads the resolved set inline on the main thread. + +### `package_search` +Search packages available in the registry. Provide a name (e.g. com.unity.foo) or omit to list all. Returns the full result synchronously (blocks until the registry query completes). + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `query` | no | `–` | Package name to search for. Omit/empty to list all available packages. | +| `offline` | no | `false` | Search the local cache only. | + +**Returns:** `object` +**Notes:** `MainThreadRequired = false`. Synchronous — blocks until the registry query completes (up to a 25s timeout). Each result is flagged with whether it is currently installed. + +### `package_add` +Add a UPM package by name@version, git URL, or 'file:' local path. Async by default (returns in_progress; poll package_status); pass wait=true to block until added. A recompile/domain reload follows — poll recompile_status. Requires confirm=true; use dry_run to preview. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `identifier` | yes | `–` | Package to add: 'com.unity.foo@1.2.3', a git URL, or 'file:../Path'. | +| `confirm` | no | `false` | Apply the change. Without it the call is refused. | +| `dry_run` | no | `false` | Preview the change without applying it. | +| `wait` | no | `false` | Block until the operation completes and return the result (synchronous). Default: return immediately and poll package_status. | + +**Returns:** `object` +**Notes:** `MainThreadRequired = false`. Mutating — requires `confirm=true`; `dry_run=true` returns a preview without applying. Async by default (returns `in_progress`; poll `package_status`); with `wait=true` it blocks until completion (up to a 25s timeout). A successful add triggers a recompile/domain reload — poll `recompile_status`. Returns `busy` if another package operation is already in progress. + +### `package_remove` +Remove a UPM package by name. Async by default (returns in_progress; poll package_status); pass wait=true to block until removed. A recompile/domain reload follows — poll recompile_status. Requires confirm=true; use dry_run to preview. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `name` | yes | `–` | Package name to remove (e.g. com.unity.foo). | +| `confirm` | no | `false` | Apply the change. Without it the call is refused. | +| `dry_run` | no | `false` | Preview the change without applying it. | +| `wait` | no | `false` | Block until the operation completes and return the result (synchronous). Default: return immediately and poll package_status. | + +**Returns:** `object` +**Notes:** `MainThreadRequired = false`. Mutating — requires `confirm=true`; `dry_run=true` returns a preview without applying. Async by default (returns `in_progress`; poll `package_status`); with `wait=true` it blocks until completion (up to a 25s timeout). A successful remove triggers a recompile/domain reload — poll `recompile_status`; the reload can drop a synchronous reply, so `package_status` confirms the outcome. Returns `busy` if another package operation is already in progress. + +### `package_resolve` +Resolve/refresh packages from the manifest (re-fetch and re-link). May trigger a recompile/domain reload — poll recompile_status. Its outcome is recorded for package_status. + +No parameters. + +**Returns:** `object` +**Notes:** `MainThreadRequired = true`. Fire-and-forget — `Client.Resolve()` schedules a resolve on a later tick, so the response returns before any reload. May trigger a recompile/domain reload — poll `recompile_status`. Its outcome is recorded in the status file, so `package_status` validates it. + +### `package_status` +Status of the last async package operation (add/remove/resolve): idle | in_progress | completed | failed, with the added package, manifest, and any error. + +No parameters. + +**Returns:** `string` +**Notes:** `MainThreadRequired = false`. Reads a Temp status file that survives the domain reload an add/remove/resolve triggers, so a lost synchronous reply or an interrupted async op is recoverable by polling. Returns `{"status":"idle"}` when no operation has run. + +See [Creating commands](../creating-commands.md) and [Connectivity](../connectivity.md). diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/commands/prefabs.md b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/commands/prefabs.md new file mode 100644 index 00000000..9f5c13aa --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/commands/prefabs.md @@ -0,0 +1,84 @@ +# Prefab commands + +Commands covering the prefab lifecycle an agent needs to build content procedurally: saving a configured GameObject as a prefab asset, instantiating it into a scene, deriving a variant, applying/reverting instance overrides, unpacking, and editing prefab contents through the prefab stage. Asset paths are sandboxed to the authoring root; scene-side mutations are Undo-able, but prefab asset writes are AssetDatabase operations and are not part of Unity's Undo system. + +### `create_prefab` +Save a GameObject as a prefab asset at a project path; the source becomes a connected instance. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `source` | yes | – | Reference to the source GameObject to save as a prefab (globalId/path/guid/instanceId/hierarchyPath). | +| `path` | yes | – | Prefab asset path relative to the authoring root (the Assets/ prefix is optional and the .prefab extension is added if missing). e.g. Prefabs/Enemy or Prefabs/Enemy.prefab | + +**Returns:** `AuthoringResult` +**Notes:** Scene-side effects are Undo-able; the prefab asset write is not undoable. + +### `instantiate_prefab` +Instantiate a prefab asset into a loaded scene and return the created instance. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `prefab` | yes | – | Reference to the prefab asset to instantiate (path/guid/globalId). | +| `scene_path` | no | `–` | Optional path of a loaded scene to instantiate into; defaults to the active scene. | +| `name` | no | `–` | Optional name for the created instance; defaults to the prefab name. | + +**Returns:** `AuthoringResult` +**Notes:** Undo-able. + +### `create_prefab_variant` +Create a prefab variant asset that inherits from a base prefab. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `base` | yes | – | Reference to the base prefab asset (path/guid/globalId). | +| `path` | yes | – | Variant prefab asset path relative to the authoring root (.prefab added if missing). | + +**Returns:** `AuthoringResult` +**Notes:** Prefab asset write is not undoable. + +### `apply_prefab_overrides` +Apply a prefab instance's overrides back to its source prefab asset. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `instance` | yes | – | Reference to a prefab instance GameObject in a scene (instanceId/hierarchyPath/globalId). | + +**Returns:** `AuthoringResult` +**Notes:** Scene-side effects are Undo-able; the asset write is not. The instance's source prefab asset must live under the authoring root. + +### `revert_prefab_overrides` +Revert a prefab instance's overrides so it matches its source prefab asset. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `instance` | yes | – | Reference to a prefab instance GameObject in a scene (instanceId/hierarchyPath/globalId). | + +**Returns:** `AuthoringResult` +**Notes:** Undo-able. + +### `unpack_prefab` +Unpack a prefab instance into plain GameObjects (outermost level or completely). + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `instance` | yes | – | Reference to a prefab instance GameObject in a scene (instanceId/hierarchyPath/globalId). | +| `completely` | no | `false` | If true, unpack all nested prefab levels (Completely); if false, only the outermost level (OutermostRoot). | + +**Returns:** `AuthoringResult` +**Notes:** Undo-able. + +### `save_prefab_contents` +Open a prefab asset in an isolated prefab stage, apply a declarative edit, and save it back (nested-prefab safe). + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `prefab` | yes | – | Reference to the prefab asset to edit (path/guid/globalId). | +| `rename_child` | no | `–` | Optional child name (relative path under the root, e.g. 'Body/Head') to rename. | +| `new_name` | no | `–` | New name for the child identified by rename_child. | +| `set_active_child` | no | `–` | Optional child name (relative path under the root) whose active state to set. | +| `active` | no | `true` | Active state to apply when set_active_child is provided. | + +**Returns:** `AuthoringResult` +**Notes:** Prefab asset write (prefab-stage save) is not part of Unity's Undo system. The prefab asset must live under the authoring root. + +See [Creating commands](../creating-commands.md) and [Connectivity](../connectivity.md). diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/commands/project-settings.md b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/commands/project-settings.md new file mode 100644 index 00000000..142cc4fe --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/commands/project-settings.md @@ -0,0 +1,239 @@ +# Project settings commands + +Read and change a representative slice of Unity's project-wide settings (Audio, Graphics, Input, Physics, Player, Quality, Tags & Layers, Time). `get_*` commands read a group's current values into a `ProjectSettingsResponse`; `set_*` commands mutate them through the shared `confirm`/`dry_run` convention, so `confirm=true` is required to apply and `dry_run=true` previews the change without applying it. Every command in this group is `MainThreadRequired = true`. On a `set_*`, omitted fields are left unchanged, and the group is re-read after the write so the response reflects the resulting state. Settings writes are not undoable via Ctrl+Z. + +### `get_audio_settings` +Read project Audio settings (volume, rolloff scale, doppler factor). + +No parameters. + +**Returns:** `ProjectSettingsResponse` +**Notes:** `MainThreadRequired = true`. + +### `set_audio_settings` +Change project Audio settings. Requires confirm=true; use dry_run to preview. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `settings` | no | `–` | Fields to change; omitted fields are left unchanged (fields below). | +| `confirm` | no | `false` | Apply the change. Without it the call is refused. | +| `dry_run` | no | `false` | Preview the change without applying it. | + +`settings` fields: + +| Field | Required | Default | Description | +|-------|----------|---------|-------------| +| `volume` | no | `–` | Global audio volume (0..1). | +| `rolloffScale` | no | `–` | Global rolloff scale. | +| `dopplerFactor` | no | `–` | Global doppler factor. | + +**Returns:** `ProjectSettingsResponse` +**Notes:** `MainThreadRequired = true`. `confirm=true` required to apply; supports `dry_run`. + +### `get_graphics_settings` +Read GraphicsSettings (default render pipeline). + +No parameters. + +**Returns:** `ProjectSettingsResponse` +**Notes:** `MainThreadRequired = true`. + +### `set_graphics_settings` +Set the default render pipeline asset. Requires confirm=true; use dry_run to preview. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `settings` | no | `–` | Fields to change; omitted fields are left unchanged (fields below). | +| `confirm` | no | `false` | Apply the change. Without it the call is refused. | +| `dry_run` | no | `false` | Preview the change without applying it. | + +`settings` fields: + +| Field | Required | Default | Description | +|-------|----------|---------|-------------| +| `renderPipelineAsset` | no | `–` | Reference (path / guid / globalId) to a RenderPipelineAsset to set as the default. Pass an empty reference (`{}`) to select the built-in pipeline; omit to leave unchanged. | + +**Returns:** `ProjectSettingsResponse` +**Notes:** `MainThreadRequired = true`. `confirm=true` required to apply; supports `dry_run`. + +### `get_input_settings` +Read the legacy Input Manager axes (names and count). + +No parameters. + +**Returns:** `ProjectSettingsResponse` +**Notes:** `MainThreadRequired = true`. + +### `set_input_settings` +Tune a legacy Input Manager axis (sensitivity/gravity/dead) by name. Requires confirm=true; use dry_run to preview. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `settings` | no | `–` | Axis change. 'axis' selects the axis by name; omitted numeric fields are left unchanged (fields below). | +| `confirm` | no | `false` | Apply the change. Without it the call is refused. | +| `dry_run` | no | `false` | Preview the change without applying it. | + +`settings` fields: + +| Field | Required | Default | Description | +|-------|----------|---------|-------------| +| `axis` | yes | – | Name of the axis to modify (e.g. 'Horizontal'). | +| `sensitivity` | no | `–` | New sensitivity. | +| `gravity` | no | `–` | New gravity. | +| `dead` | no | `–` | New dead-zone size. | + +**Returns:** `ProjectSettingsResponse` +**Notes:** `MainThreadRequired = true`. `confirm=true` required to apply; supports `dry_run`. + +### `get_physics_settings` +Read Physics settings (gravity, solver iterations, bounce threshold). + +No parameters. + +**Returns:** `ProjectSettingsResponse` +**Notes:** `MainThreadRequired = true`. + +### `set_physics_settings` +Change Physics settings. Requires confirm=true; use dry_run to preview. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `settings` | no | `–` | Fields to change; omitted fields are left unchanged (fields below). | +| `confirm` | no | `false` | Apply the change. Without it the call is refused. | +| `dry_run` | no | `false` | Preview the change without applying it. | + +`settings` fields: + +| Field | Required | Default | Description | +|-------|----------|---------|-------------| +| `gravityX` | no | `–` | Gravity X component. | +| `gravityY` | no | `–` | Gravity Y component (e.g. -9.81). | +| `gravityZ` | no | `–` | Gravity Z component. | +| `defaultSolverIterations` | no | `–` | Default solver iteration count. | +| `bounceThreshold` | no | `–` | Bounce threshold velocity. | + +**Returns:** `ProjectSettingsResponse` +**Notes:** `MainThreadRequired = true`. `confirm=true` required to apply; supports `dry_run`. + +### `get_player_settings` +Read PlayerSettings (company/product/version, scripting backend, API level). + +No parameters. + +**Returns:** `ProjectSettingsResponse` +**Notes:** `MainThreadRequired = true`. + +### `set_player_settings` +Change PlayerSettings. Requires confirm=true; use dry_run to preview. Scripting backend / API level changes trigger a domain reload. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `settings` | no | `–` | Fields to change; omitted fields are left unchanged (fields below). | +| `confirm` | no | `false` | Apply the change. Without it the call is refused. | +| `dry_run` | no | `false` | Preview the change without applying it. | + +`settings` fields: + +| Field | Required | Default | Description | +|-------|----------|---------|-------------| +| `companyName` | no | `–` | Company name. | +| `productName` | no | `–` | Product name. | +| `bundleVersion` | no | `–` | Bundle/application version string. | +| `scriptingBackend` | no | `–` | Scripting backend (e.g. Mono2x, IL2CPP). Triggers a domain reload. | +| `apiCompatibilityLevel` | no | `–` | API compatibility level (e.g. NET_Standard_2_0, NET_Unity_4_8). Triggers a domain reload. | + +**Returns:** `ProjectSettingsResponse` +**Notes:** `MainThreadRequired = true`. `confirm=true` required to apply; supports `dry_run`. Changing `scriptingBackend` or `apiCompatibilityLevel` triggers a domain reload (`requiresDomainReload`); scripting-backend / API-level changes are read and written against the active build target. + +### `get_quality_settings` +Read QualitySettings (current level, level names, vSync, anti-aliasing). + +No parameters. + +**Returns:** `ProjectSettingsResponse` +**Notes:** `MainThreadRequired = true`. + +### `set_quality_settings` +Change QualitySettings. Requires confirm=true; use dry_run to preview. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `settings` | no | `–` | Fields to change; omitted fields are left unchanged (fields below). | +| `confirm` | no | `false` | Apply the change. Without it the call is refused. | +| `dry_run` | no | `false` | Preview the change without applying it. | + +`settings` fields: + +| Field | Required | Default | Description | +|-------|----------|---------|-------------| +| `level` | no | `–` | Quality level index (see levelNames from get_quality_settings). | +| `vSyncCount` | no | `–` | VSync count (0 = off, 1, 2). | +| `antiAliasing` | no | `–` | MSAA sample count (0, 2, 4, 8). | + +**Returns:** `ProjectSettingsResponse` +**Notes:** `MainThreadRequired = true`. `confirm=true` required to apply; supports `dry_run`. + +### `get_tags_layers` +Read the project's tags and (named) layers. + +No parameters. + +**Returns:** `ProjectSettingsResponse` +**Notes:** `MainThreadRequired = true`. + +### `set_tags_layers` +Add/remove tags and assign user layer names (index 8-31). Requires confirm=true; use dry_run to preview. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `settings` | no | `–` | Tag/layer changes to make (fields below). | +| `confirm` | no | `false` | Apply the change. Without it the call is refused. | +| `dry_run` | no | `false` | Preview the change without applying it. | + +`settings` fields: + +| Field | Required | Default | Description | +|-------|----------|---------|-------------| +| `addTags` | no | `–` | Tag names to add. | +| `removeTags` | no | `–` | Tag names to remove. | +| `setLayers` | no | `–` | User layer assignments (index 8-31); array of layer-assignment objects (fields below). | + +`setLayers[]` (layer-assignment) fields: + +| Field | Required | Default | Description | +|-------|----------|---------|-------------| +| `index` | yes | – | Layer index (8-31 for user layers). | +| `name` | yes | – | Layer name (empty string clears the slot). | + +**Returns:** `ProjectSettingsResponse` +**Notes:** `MainThreadRequired = true`. `confirm=true` required to apply; supports `dry_run`. User layers are indices 8-31 (0-7 are reserved). + +### `get_time_settings` +Read Time settings (fixedDeltaTime, maximumDeltaTime, timeScale). + +No parameters. + +**Returns:** `ProjectSettingsResponse` +**Notes:** `MainThreadRequired = true`. + +### `set_time_settings` +Change Time settings. Requires confirm=true; use dry_run to preview. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `settings` | no | `–` | Fields to change; omitted fields are left unchanged (fields below). | +| `confirm` | no | `false` | Apply the change. Without it the call is refused. | +| `dry_run` | no | `false` | Preview the change without applying it. | + +`settings` fields: + +| Field | Required | Default | Description | +|-------|----------|---------|-------------| +| `fixedDeltaTime` | no | `–` | Fixed timestep in seconds (e.g. 0.02). | +| `maximumDeltaTime` | no | `–` | Maximum allowed timestep in seconds. | +| `timeScale` | no | `–` | Time scale (1 = real-time). | + +**Returns:** `ProjectSettingsResponse` +**Notes:** `MainThreadRequired = true`. `confirm=true` required to apply; supports `dry_run`. + +See [Creating commands](../creating-commands.md) and [Connectivity](../connectivity.md). diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/commands/runtime.md b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/commands/runtime.md new file mode 100644 index 00000000..75d301b4 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/commands/runtime.md @@ -0,0 +1,162 @@ +# Runtime commands + +Commands served by the Player / dev-build server. Many require a Development build running `RuntimePipelineManager` — see [Runtime setup](../runtime-setup.md). Commands marked `RuntimeOnly` are only registered in a player build. + +### `runtime_status` +Get comprehensive runtime application status. + +No parameters. + +**Returns:** `RuntimeStatusResponse` +**Notes:** `MainThreadRequired = true`, `RuntimeOnly`. + +### `quit` +Gracefully quit the Unity application. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `exitCode` | no | `0` | Exit code for the application | + +**Returns:** `string` +**Notes:** `MainThreadRequired = true`, `RuntimeOnly`. + +### `set_target_framerate` +Set the target frame rate for the application. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `frameRate` | yes | `–` | Target frame rate (-1 for platform default, 0 for unlimited) | + +**Returns:** `string` +**Notes:** `MainThreadRequired = true`, `RuntimeOnly`. + +### `set_timescale` +Set the time scale for the application. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `scale` | yes | `–` | Time scale multiplier (0.0 to pause, 1.0 for normal speed) | + +**Returns:** `string` +**Notes:** `MainThreadRequired = true`, `RuntimeOnly`. + +### `simulate_key` +Simulate a keyboard key event (Input System). Drives the running app. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `key` | yes | `–` | Input System Key name, e.g. Space, W, Enter, LeftArrow. | +| `action` | no | `press` | down \| up \| press (down+up). | + +**Returns:** `InputSimulationResponse` +**Notes:** `MainThreadRequired = true`, `RuntimeOnly`. Requires the Input System package (`ENABLE_INPUT_SYSTEM`); reports unavailable otherwise. + +### `simulate_pointer` +Simulate a mouse/pointer event at screen coordinates (Input System). + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `x` | yes | `–` | Screen X in pixels (origin bottom-left). | +| `y` | yes | `–` | Screen Y in pixels (origin bottom-left). | +| `action` | no | `click` | move \| down \| up \| click (down+up). | +| `button` | no | `left` | left \| right \| middle. | + +**Returns:** `InputSimulationResponse` +**Notes:** `MainThreadRequired = true`, `RuntimeOnly`. Requires the Input System package (`ENABLE_INPUT_SYSTEM`); reports unavailable otherwise. + +### `log` +Write a message to Unity console. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `message` | yes | `–` | Message to log to console | +| `level` | no | `info` | Log level: info, warning, error | + +**Returns:** `string` +**Notes:** `MainThreadRequired = true`, `RuntimeOnly`. + +### `console` +Get captured Unity console output (Editor or Player; supports tail, level filtering, and follow via a cursor). + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `tail` | no | `100` | Maximum number of most-recent entries to return | +| `level` | no | `log` | Minimum severity to include: log | warn | error | +| `since` | no | `-1` | Cursor: only return entries newer than this seq. Use the 'cursor' from a previous response to follow. | + +**Returns:** `ConsoleLogResponse` +**Notes:** `MainThreadRequired = false`. Available in both the Editor and player builds. + +### `eval` +Evaluate C# code dynamically using Roslyn compiler. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `code` | yes | `–` | C# code to evaluate | +| `timeout` | no | `5000` | Timeout in milliseconds | + +**Returns:** `EvalResponse` +**Notes:** `MainThreadRequired = true`. Available on both editor and runtime. + +### `eval_file` +Evaluate C# code read from a `.cs` file on disk. A convenience alternative to `eval` for code +too long to pass inline — edit the file, then evaluate it. The resolved source is run through the +same evaluation path as `eval`. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `file` | yes | `–` | Path to a `.cs` file to evaluate | +| `timeout` | no | `5000` | Timeout in milliseconds | + +The `file` is read on the Unity side (relative paths resolve against the Unity process working +directory) and must end in `.cs`. A missing file, a non-`.cs` extension, or an empty file returns +a `Bad Request`. + +**Returns:** `EvalResponse` +**Notes:** `MainThreadRequired = true`. Available on both editor and runtime. + +### `reload_file` +Compile and apply in-place [HotReload] edits from a source file. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `filename` | yes | `–` | Source file containing [HotReload] methods (e.g. Assets/Scripts/Player.cs) | +| `timeout` | no | `30000` | Compilation timeout in milliseconds | +| `assemblyDir` | no | `–` | Directory to save compiled assemblies to disk (optional, default is in-memory only) | +| `pdb` | no | `false` | Emit debug symbols (portable PDB) mapped to the original source so breakpoints bind in your editor. Compiles unoptimized. | + +**Returns:** `HotReloadResponse` +**Notes:** `MainThreadRequired = true`. See [Hot reload](../hot-reload.md). + +### `reload_file_override` +Compile and apply hot reload file changes immediately. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `filename` | yes | `–` | Hot reload source file to compile (e.g. PlayerTweaks.cs) | +| `timeout` | no | `30000` | Compilation timeout in milliseconds | +| `assemblyDir` | no | `–` | Directory to save compiled assemblies to disk (optional, default is in-memory only) | + +**Returns:** `HotReloadResponse` +**Notes:** `MainThreadRequired = true`. See [Hot reload](../hot-reload.md). + +### `hotreload_status` +Show current hot reload registry status and statistics. + +No parameters. + +**Returns:** `HotReloadResponse` +**Notes:** `MainThreadRequired = true`, `RuntimeOnly`. + +### `cleanup_hotreload` +Remove old hot reload DLL versions and clear registry. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `assemblyDir` | yes | `–` | Directory containing assemblies to cleanup | +| `force_domain_reload` | no | `true` | Force Unity domain reload after cleanup | + +**Returns:** `HotReloadResponse` +**Notes:** `MainThreadRequired = true`, `RuntimeOnly`. + +See [Creating commands](../creating-commands.md) and [Connectivity](../connectivity.md). diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/commands/scenes.md b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/commands/scenes.md new file mode 100644 index 00000000..5d5e5af9 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/commands/scenes.md @@ -0,0 +1,93 @@ +# Scene commands + +Commands for creating, opening, saving and inspecting scenes, controlling the active scene, snapshotting a scene's hierarchy, and managing the Build Settings scene list. Mutating scene operations are blocked while the editor is entering or in play mode (they fail with a recoverable error before touching any state); read-only commands are safe in play mode. + +### `create_scene` +Create a new scene and save it to the given path under the authoring root. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `path` | yes | – | Scene path relative to the authoring root (default Assets/); the Assets/ prefix and the .unity extension are optional. e.g. Scenes/Level1 | +| `additive` | no | `false` | Open the new scene additively alongside currently open scenes instead of replacing them. | +| `template` | no | `empty` | Initial contents: 'empty' (default) for a blank scene, or 'default' to seed a Main Camera + Directional Light matching Unity's built-in 3D template. | + +**Returns:** `AuthoringResult` +**Notes:** Blocked during Play mode. + +### `open_scene` +Open an existing scene from the given path. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `path` | yes | – | Scene path relative to the authoring root (default Assets/); the Assets/ prefix and the .unity extension are optional. | +| `additive` | no | `false` | Open additively alongside currently open scenes instead of replacing them. | + +**Returns:** `AuthoringResult` +**Notes:** Blocked during Play mode. + +### `save_scene` +Save an open scene. Saves the active scene when no path is given. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `path` | no | `–` | Path of the open scene to save (authoring-root relative; Assets/ prefix and .unity optional). Omit to save the active scene. | + +**Returns:** `AuthoringResult` +**Notes:** Blocked during Play mode. + +### `save_all` +Save all open scenes that have unsaved changes. + +No parameters. + +**Returns:** `object` +**Notes:** Blocked during Play mode. + +### `list_open_scenes` +List all currently open scenes with their load/active/dirty state. + +No parameters. + +**Returns:** `object` + +### `set_active_scene` +Set which open scene is the active scene (new objects are created in the active scene). + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `path` | yes | – | Path of an already-open scene to make active (authoring-root relative; Assets/ prefix and .unity optional). | + +**Returns:** `AuthoringResult` +**Notes:** Blocked during Play mode. + +### `get_scene_hierarchy` +Return the GameObject tree of an open scene (or the active scene). Each node carries instanceId + hierarchyPath usable by GameObject commands. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `path` | no | `–` | Path of the open scene to snapshot (authoring-root relative; Assets/ prefix and .unity optional). Omit for the active scene. | + +**Returns:** `SceneHierarchy` + +### `add_scene_to_build` +Add a scene to the Build Settings scene list (idempotent). Optionally enable it. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `path` | yes | – | Scene path to add (authoring-root relative; Assets/ prefix and .unity optional). | +| `enabled` | no | `true` | Whether the scene is enabled in the build list. | + +**Returns:** `object` +**Notes:** Blocked during Play mode. + +### `remove_scene_from_build` +Remove a scene from the Build Settings scene list (idempotent). + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `path` | yes | – | Scene path to remove (authoring-root relative; Assets/ prefix and .unity optional). | + +**Returns:** `object` +**Notes:** Blocked during Play mode. + +See [Creating commands](../creating-commands.md) and [Connectivity](../connectivity.md). diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/commands/scripts.md b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/commands/scripts.md new file mode 100644 index 00000000..768404f6 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/commands/scripts.md @@ -0,0 +1,55 @@ +# Script commands + +Commands for creating C# script files, attaching MonoBehaviours to GameObjects, and reading/writing serialized fields. Writing a `.cs` file does not make its type available — Unity must import and compile it (a domain reload) first. The flow is: `create_script` → `recompile` → poll `recompile_status` (until completed/up_to_date) → `attach_script`. + +### `create_script` +Create a new C# script (default base class MonoBehaviour) from a template under the authoring root. NOTE: the type does not exist until a recompile completes — to attach it, call recompile, poll recompile_status, then attach_script. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `name` | yes | – | Class/file name without extension, e.g. PlayerController. Must be a valid C# identifier. | +| `path` | no | `–` | Folder (relative to the authoring root; the Assets/ prefix is optional) to write the .cs into. Defaults to the authoring root. | +| `namespace` | no | `–` | Optional namespace to wrap the class in. Omit for the global namespace. | +| `base_class` | no | `MonoBehaviour` | Base class to derive from. Defaults to MonoBehaviour. | +| `overwrite` | no | `false` | Overwrite the file if it already exists. Defaults to false (an existing file is an error). | + +**Returns:** `AuthoringResult` +**Notes:** Does not trigger a recompile; the created type is not usable until a recompile completes (poll `recompile_status`). + +### `attach_script` +Add a MonoBehaviour to a GameObject by its (compiled) type name OR by its script asset path. Provide exactly one of 'type' or 'script'. If the type isn't compiled yet, returns a recoverable error: recompile, poll recompile_status, then retry. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `target` | yes | – | Reference to the GameObject to add the component to (globalId/path/guid/instanceId/hierarchyPath). | +| `type` | no | `–` | Component type name to add, e.g. PlayerController or Game.Player.PlayerController. Must already be compiled. Mutually exclusive with 'script'. | +| `script` | no | `–` | Script asset path, e.g. 'Assets/Pool/Scripts/CueShooter.cs'. The backing class is resolved via MonoScript.GetClass(), so the class name may differ from the filename. Mutually exclusive with 'type'. | + +**Returns:** `AuthoringResult` +**Notes:** Undo-able. Provide exactly one of `type` or `script`. A not-yet-compiled type returns a recoverable error (recompile, poll `recompile_status`, then retry). + +### `set_serialized_field` +Set a serialized field on a component/asset. Supports primitives, enums, Vector/Color/Rect/Bounds, object references (value = an ObjectRef: asset by guid/fileId/path or scene object by instanceId/hierarchyPath), and array elements via 'name.Array.data[i]' (or 'name.Array.size' to resize). + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `target` | yes | – | Reference to the component or asset to modify (globalId/path/guid/instanceId/hierarchyPath). May be a GameObject when 'component' is given. | +| `field` | yes | – | SerializedProperty path, e.g. 'speed', 'settings.speed', or 'waypoints.Array.data[0]'. | +| `value` | yes | – | JSON value to assign. For object references pass an ObjectRef object (or null to clear). For enums pass the value name. | +| `component` | no | `–` | Component type name on the target GameObject (e.g. 'Rigidbody'). Use when 'target' is a GameObject; omit when 'target' is already a component handle. | + +**Returns:** `AuthoringResult` +**Notes:** Undo-able. + +### `get_serialized_fields` +Read serialized fields of a component/asset. Returns each top-level field's name, type and value (object references are returned as re-usable handles). Pass 'field' to read a single SerializedProperty path. + +| Parameter | Required | Default | Description | +|-----------|----------|---------|-------------| +| `target` | yes | – | Reference to the component or asset to read (globalId/path/guid/instanceId/hierarchyPath). May be a GameObject when 'component' is given. | +| `field` | no | `–` | Optional single SerializedProperty path to read (e.g. 'speed' or 'items.Array.data[0]'). Omit to read all top-level fields. | +| `component` | no | `–` | Component type name on the target GameObject (e.g. 'Rigidbody'). Use when 'target' is a GameObject; omit when 'target' is already a component handle. | + +**Returns:** `object` + +See [Creating commands](../creating-commands.md) and [Connectivity](../connectivity.md). diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/connectivity.md b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/connectivity.md new file mode 100644 index 00000000..5fe389e1 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/connectivity.md @@ -0,0 +1,178 @@ +# Connectivity + +How a client reaches a running Unity instance: the loopback-only HTTP servers, their port ranges, the port descriptor file used for discovery, and the bearer-token authentication every request must carry. + +The rest of this page covers the implementation. If you just want to connect, start with the two sections below. + +## Connecting to a running Editor + +Connections go through the `unity` CLI. Run `unity command` with no command name to connect to a Unity instance and list its available commands: + +```bash +# Auto-discover a Unity instance from the current directory +unity command + +# Connect to a specific project +unity command --project-path /path/to/your/unity/project +``` + +Once connected, run any command by name, e.g. `unity command editor_status`. + +## Connecting to a running Player (game) + +To target a running development Player instead of the Editor, use `--runtime` (by process name) or `--runtime-path` (by the location of the runtime port file). These options go **after** `command` and **before** the command name: + +```bash +# By Player process/executable name +unity command --runtime MyGame.exe runtime_status + +# By the folder/bundle where the runtime port file lives +unity command --runtime-path "C:\Builds\MyGame" runtime_status # Windows: next to the .exe +unity command --runtime-path "/Users/me/Builds/MyGame.app" runtime_status # macOS: the .app bundle +``` + +> The Runtime server only runs in a **development Player build** with the runtime manager enabled — see [Runtime connection & setup](runtime-setup.md). + +## Finding the port in the Unity logs + +The [port descriptor file](#port-descriptor-file) is the primary discovery channel, but the server also reports itself to the Unity log when it starts and stops — useful when you can't read the descriptor file directly. Look for `Pipeline`-prefixed lines. + +- **Runtime (Player)** — logs its port **and** the descriptor file location on start, and a line on stop: + + ``` + Pipeline: Runtime server started successfully on port 7901 + Pipeline: Runtime descriptor written to /path/to/MyGame/.unity-pipeline-runtime-port + Pipeline: Runtime server stopped + ``` + +- **Editor** — logs its port when the server is (re)started from the **Pipeline ▸ Start Server** menu or re-opened by its watchdog (`Pipeline Server started on port 7801`). Its descriptor always lives at the fixed `Library/Pipeline/.unity-pipeline-port` path. + +### Where the logs live + +**Editor log** (`Editor.log`): + +| OS | Path | +|----|------| +| Windows | `C:\Users\\AppData\Local\Unity\Editor\Editor.log` | +| macOS | `~/Library/Logs/Unity/Editor.log` | + +**Player log** (`Player.log`): + +| OS | Path | +|----|------| +| Windows | `C:\Users\\AppData\LocalLow\\\Player.log` | +| macOS | `~/Library/Logs///Player.log` | + +(`` and `` are the project's **Company Name** and **Product Name** from Player Settings.) + +## Loopback-only binding + +Both the Editor and Runtime servers bind to the **IPv4 loopback** (`127.0.0.1`) — plus the `localhost` hostname for compatibility: + +```csharp +if (Socket.OSSupportsIPv4) + m_HttpListener.Prefixes.Add($"http://127.0.0.1:{m_Port}/"); +m_HttpListener.Prefixes.Add($"http://localhost:{m_Port}/"); +``` + +The server is never exposed on a routable interface — it is reachable only from the same machine. + +Clients should connect to **`127.0.0.1`** explicitly rather than `localhost`. Unity's Mono `HttpListener` only reliably serves the IPv4 loopback: a request arriving over the IPv6 loopback (`::1`) is answered with `400` because Mono mis-parses the bracketed `[::1]` host. Since `localhost` resolves to `::1` or `127.0.0.1` non-deterministically (notably on Windows with Node's default DNS order), dialing `localhost` caused intermittent connection failures — dialing `127.0.0.1` avoids the IPv6 path entirely. + +In addition, the server refuses any request that carries an `Origin` header (legitimate CLI/CI clients never send one), which blocks a browser page from reaching the local server and short-circuits CORS preflights. + +## Port ranges + +Each server type picks the first free port in its range (or you can pin one explicitly): + +| Server | Production range | Test range | +|--------|------------------|------------| +| **Editor** | `7800`–`7849` | `7850`–`7899` | +| **Runtime** (Player) | `7900`–`7949` | `7950`–`7999` | + +If no port in the range is free, startup throws (`No available ports in range …`). + +## Port Descriptor File + +When a server starts, it writes a small JSON **instance descriptor** so clients can discover it. This is the only discovery channel — there is no broadcast or registry. + +| Server | Descriptor path | +|--------|-----------------| +| **Editor** | `/Library/Pipeline/.unity-pipeline-port` | +| **Runtime** | `/.unity-pipeline-runtime-port` | + +The Editor descriptor lives under the git-ignored `Library/` folder. The file is created with permissions restricted to the current user (it carries the auth token). The server rewrites it on every heartbeat to refresh `lastHeartbeat`, and deletes it on shutdown. + +The Runtime descriptor is written next to the Player, at `{Application.dataPath}/..`: + +- **Windows / Linux** — beside the executable, e.g. `C:\Builds\MyGame\.unity-pipeline-runtime-port`. +- **macOS** — `Application.dataPath` is `.app/Contents`, so the descriptor lands at the **`.app` bundle root**: `MyGame.app/.unity-pipeline-runtime-port`. (The file is inside the `.app` bundle.) This is why `unity command --runtime-path` takes the `.app` bundle path on macOS — see [Runtime connection & setup](runtime-setup.md). + +> Test servers do **not** write a descriptor (they override `WritesDescriptor => false`) — the test already knows its port, so it never clobbers the live server's file. See [Tests architecture](testing.md). + +### Editor descriptor fields + +```json +{ + "pid": 12345, + "port": 7800, + "projectPath": "/path/to/Project", + "projectName": "Project", + "unityVersion": "6000.x.y", + "mode": "editor", + "startedAt": "2026-06-25T10:00:00Z", + "lastHeartbeat": "2026-06-25T10:05:00Z", + "evalToken": "" +} +``` + +| Field | Meaning | +|-------|---------| +| `pid` | Process id of the Unity Editor. | +| `port` | Port the server is listening on. | +| `projectPath` | Absolute path to the Unity project. | +| `projectName` | Project folder name. | +| `unityVersion` | Editor version string. | +| `mode` | `"editor"` or `"batchmode"`. | +| `startedAt` | When the instance started (UTC). | +| `lastHeartbeat` | Last heartbeat (UTC), refreshed on status calls. | +| `evalToken` | Bearer token for authenticating requests. | + +### Runtime descriptor fields + +The runtime descriptor shares `pid`, `port`, `unityVersion`, `startedAt`, `lastHeartbeat`, and `evalToken`, and adds: + +| Field | Meaning | +|-------|---------| +| `platform` | Unity runtime platform (e.g. `WindowsPlayer`). | +| `buildGuid` | Unique build identifier (`Application.buildGUID`). | +| `workingDirectory` | Directory the Player is running from. | + +(The runtime descriptor carries `platform`/`buildGuid`/`workingDirectory` in place of the editor's `projectPath`/`projectName`/`mode`.) + +## Authentication + +Every request must authenticate with a bearer token: + +``` +Authorization: Bearer +``` + +- The server **generates the token at startup** (`SecurityTokenManager.GetOrCreateToken()` — 256 bits of CSPRNG output, base64-encoded). In the Editor the token is persisted in `SessionState`, so it **survives domain reloads** within an editor session (recompiles, entering play mode) — long-lived clients (MCP sessions, IDE integrations) keep working instead of getting `401` after every reload. It is regenerated only when the Editor **restarts**, or on an explicit rotation (`SecurityTokenManager.ClearCache()` / `RotateToken()`). Player builds use a per-process token. +- The token is published in the descriptor's `evalToken` field. The descriptor is **re-advertised with the live token on every heartbeat**, so the port file never advertises a token the server would reject (e.g. after a reload or rotation). +- The server validates the bearer token on **every** request (before routing) using a constant-time comparison. A missing or wrong token returns `401 Unauthorized`. + +## Discovering and calling an instance + +A client connects by: + +1. Reading the descriptor file (editor: `Library/Pipeline/.unity-pipeline-port`). +2. Taking the `port` and `evalToken` from it. +3. Sending requests to `http://127.0.0.1:/...` with `Authorization: Bearer `. + +Endpoints exposed by the server include `/api/status`, `/api/editor_status`, `/api/commands` (lists available commands), `/api/exec` (POST — runs a command), and `/api/test-status`. + +## See also + +- [Runtime connection & setup](runtime-setup.md) — enabling the server in a Player build. +- [Creating commands](creating-commands.md) — authoring the commands clients call. diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/creating-commands.md b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/creating-commands.md new file mode 100644 index 00000000..8182a542 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/creating-commands.md @@ -0,0 +1,189 @@ +# Creating commands + +A *command* is a `static` method that the Pipeline server can invoke over HTTP. The method's accessibility does not matter — `public`, `internal`, and `private` static methods can all be registered. This page covers the command-authoring API: how to declare a command, describe its parameters, return a result, and have it discovered automatically. + +## The handler + response pattern + +Authoring a command has two halves: + +1. **The handler** — your `static` method, tagged `[CliCommand]`. It does the work and returns a value. +2. **The response** — the server wraps whatever your handler returns in a [`CommandExecutionResponse`](#the-commandexecutionresponse-envelope) and serializes it to JSON for the client. + +You never build the HTTP response yourself. Return a `string`, a number, an anonymous object, a typed model, or `null`; the server takes care of the envelope, timing, and error reporting. + +## Declaring a command + +Tag a `static` method with `[CliCommand]` (the examples below use `public`, but any accessibility works): + +```csharp +[CliCommand("name", "description", MainThreadRequired = true, RuntimeOnly = false)] +public static Handler(...); +``` + +| Argument | Meaning | +|----------|---------| +| `name` | Unique command name used by the client (`unity command `). | +| `description` | Human-readable text shown in help and the `/api/commands` listing. | +| `MainThreadRequired` | Whether the handler must run on Unity's main thread. **Default `true`.** | +| `RuntimeOnly` | Whether the command is hidden from an Editor server's command listing. **Default `false`.** | + +The method **must be `static`**, but its accessibility does not matter: `public`, `internal`, and `private` static methods can all be registered. `CommandRegistry` invokes handlers through reflection, so a `private` handler runs exactly like a `public` one. Only a non-static (instance) method fails to register — `CommandRegistry` skips it and logs a warning. + +### Describing parameters + +Tag each parameter with `[CliArg]`: + +```csharp +[CliArg("name", "description", Required = false, DefaultValue = null)] +``` + +| Property | Meaning | +|----------|---------| +| `name` | Parameter name as it appears in client arguments (`--name value`). | +| `description` | Human-readable description for help text. | +| `Required` | Whether the parameter must be supplied. Defaults to `false` — but if the parameter has no C# default value it is treated as required. | +| `DefaultValue` | Value used when the client omits the parameter (a C# default value takes precedence). | + +`[CliArg]` is optional metadata. A parameter without it still works: its name defaults to the C# parameter name and `Required` defaults to "does this parameter lack a C# default value?". + +## Worked example 1 — returning a string + +A command can return a plain `string`. The server places it in the response `result` field. + +```csharp +using Unity.Pipeline.Commands; +using UnityEditor; +using UnityEngine; + +public static class PlayModeCommands +{ + [CliCommand("editor_play", "Enter Unity Editor play mode")] + public static string EnterPlayMode() + { + if (EditorApplication.isPlaying) + return "Already in play mode"; + + EditorApplication.isPlaying = true; + return "Entered play mode"; + } +} +``` + +Calling `editor_play` yields a `CommandExecutionResponse` whose `result` is `"Entered play mode"`. + +## Worked example 2 — returning a response model + +For richer results, return a model. Returning a type that extends `CommandExecutionResponse` (like `EvalResponse`) lets you populate response fields directly; you can also return any plain serializable model (like `AuthoringResult`) and let the server wrap it. + +```csharp +using Unity.Pipeline.Commands; +using Unity.Pipeline.Models; +using Unity.Pipeline.Compilation; + +public static class CodeEvalCommand +{ + [CliCommand("eval", "Evaluate C# code dynamically using Roslyn compiler", MainThreadRequired = true)] + public static EvalResponse EvaluateCode( + [CliArg("code", "C# code to evaluate", Required = true)] string code, + [CliArg("timeout", "Timeout in milliseconds")] int timeout = 5000) + { + if (string.IsNullOrWhiteSpace(code)) + return EvalResponse.EvalFailure("Bad Request", "Code parameter is required and cannot be empty"); + + var result = EvalCodeCompiler.CompileAndExecuteOnMainThread(code, timeout, null); + return result ?? EvalResponse.EvalFailure("Unknown Error", "Compilation returned null result"); + } +} +``` + +`EvalResponse` adds `output` and `diagnostics` on top of the standard envelope. Another common shape is a domain model such as `AuthoringResult` — the canonical identity (asset path, GUID, instance id, hierarchy path) of an object a command created, returned so the client can reference it in a follow-up call. + +## Structured (multi-field) parameters + +When a command needs a structured argument with several fields, don't spread them across many `[CliArg]` parameters — declare a small DTO that implements `IStructuredCommandInput` and take it as a single parameter. The type is advertised to clients as a nested JSON **object** schema in `GET /api/commands` (instead of collapsing to `string`), and the value is deserialized automatically via Newtonsoft — no extra wiring. + +```csharp +[CliCommand("set_time_settings", "Change Time settings. Requires confirm=true; use dry_run to preview.")] +public static ProjectSettingsResponse Set( + [CliArg("settings", "Fields to change; omitted fields are left unchanged.")] TimeSettingsInput settings = null, + [CliArg("confirm", "Apply the change. Without it the call is refused.")] bool confirm = false, + [CliArg("dry_run", "Preview the change without applying it.")] bool dryRun = false) +{ /* ... */ } + +public class TimeSettingsInput : IStructuredCommandInput +{ + [CliArg("fixedDeltaTime", "Fixed timestep in seconds (e.g. 0.02).")] + public float? FixedDeltaTime { get; set; } + + [CliArg("timeScale", "Time scale (1 = real-time).")] + public float? TimeScale { get; set; } +} +``` + +`JsonSchemaGenerator` reflects over the type's public, writable fields and properties to emit `{ "type": "object", "properties": { ... } }`, recursing into nested `IStructuredCommandInput` members and arrays/lists of them. Member metadata mirrors command parameters: + +- `[CliArg(name, description, Required = ...)]` controls the property name, description, and whether it appears in the schema's `required` array. +- Without a `[CliArg]`, the member (or its Newtonsoft `[JsonProperty]`) name is used and it is optional. Use nullable types (`float?`) for "omitted = leave unchanged" semantics. +- `[JsonIgnore]` members are omitted from the schema. + +`[CliArg]` is valid on parameters, fields, and properties, so the same attribute annotates DTO members. Most commands that take an `IStructuredCommandInput` are mutations — pair the DTO with `confirm`/`dry_run` and follow the [safety conventions](safety-and-mutations.md) (inline gate + `AuthoringUndoScope`). + +## The `CommandExecutionResponse` envelope + +Whatever your handler returns, the client receives a `CommandExecutionResponse`: + +| Field | Type | Meaning | +|-------|------|---------| +| `success` | `bool` | Whether the command ran without throwing. | +| `command` | `string` | The command name. | +| `result` | `object` | Your handler's return value (a string, model, anonymous object, or `null`). | +| `executionTimeMs` | `long?` | How long the command took. | +| `error` | `string` | Error summary when `success` is `false`. | + +If your handler throws, the server catches it and returns a failure envelope with `success = false` and the exception message in `error` — you do not need to catch-and-wrap yourself unless you want a tailored message. + +## `MainThreadRequired` + +- **Default: `true`.** Most Unity APIs (scene, GameObject, asset, play-mode access) must run on the main thread. The server marshals these handlers onto the main thread via its dispatcher. +- **Set `false` only** for handlers that are thread-safe and read-only / pollable (e.g. a status or buffer-read command). These run on a background thread so they never block the main thread or deadlock against a busy editor. + +When in doubt, leave it `true`. + +## `RuntimeOnly` + +- **Default: `false`** — the command is advertised in an Editor server's `/api/commands` listing. +- **Set `true`** to hide a command from the Editor command listing. It remains **executable**; it is simply not advertised when a client is connected to an Editor (Runtime/Player servers still list it). Use this for commands that only make sense against a running Player. + +## Discovery + +Commands are discovered by `CommandRegistry`, which scans for `[CliCommand]`-tagged methods through a pluggable `ICommandDiscovery`: + +- In the **Editor**, `TypeCacheCommandDiscovery` provides fast `TypeCache`-based discovery. +- In a **Player**, the registry falls back to reflection over loaded assemblies. + +Results are cached until the next domain reload. **A newly added command becomes available after the next recompile** — no registration call is needed; just declare it and recompile. + +## Minimal custom command template + +```csharp +using Unity.Pipeline.Commands; + +public static class MyCommands +{ + [CliCommand("my_command", "What this command does")] + public static object MyCommand( + [CliArg("text", "Some input", Required = true)] string text, + [CliArg("count", "How many times")] int count = 1) + { + // Do work on the main thread (MainThreadRequired defaults to true). + return new { echoed = text, count }; // anonymous object → response.result + } +} +``` + +Recompile, then invoke it from your client (`unity command my_command --text hello --count 3`). + +## See also + +- [Command reference](commands/runtime.md) +- [Connectivity](connectivity.md) — how clients reach the server and authenticate. diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/hot-reload.md b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/hot-reload.md new file mode 100644 index 00000000..71d4c9aa --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/hot-reload.md @@ -0,0 +1,145 @@ +# Hot reload + +Apply edited C# to running code without restarting Play Mode or rebuilding the Player. Two flavors are supported: **in-place** reload of a tagged method body, and **override** reload that routes a method through a separately-compiled replacement. + +Hot reload runs in **Editor Play Mode and Mono standalone development builds only** — not IL2CPP. Like code eval, it is gated behind `#if UNITY_EDITOR || (UNITY_STANDALONE && DEBUG)`. + +## Flavor 1 — in-place (`reload_file`) + +Tag the method you want to be reloadable with `[HotReload]`, then edit its body and apply the file. The running instance picks up the new body. + +```csharp +using Unity.Pipeline.HotReload; +using UnityEngine; + +public class Spinner : MonoBehaviour +{ + public float rotationSpeed = 90f; + + [HotReload] + void Update() + { + transform.Rotate(Vector3.up, rotationSpeed * Time.deltaTime); + } +} +``` + +Edit the body of `Update`, then apply it: + +```bash +unity command reload_file "/Spinner.cs" + +# Emit debug symbols so breakpoints bind (compiles unoptimized): +unity command reload_file "/Spinner.cs" --pdb +``` + +`reload_file` parameters: + +| Arg | Default | Meaning | +|-----|---------|---------| +| `filename` | *(required)* | Source file containing `[HotReload]` methods. | +| `timeout` | `30000` | Compilation timeout (ms). | +| `assemblyDir` | `null` | Optional directory to also save the compiled assembly to disk (default: in-memory only). | +| `pdb` | `false` | Emit a portable PDB mapped to the original source so debugger breakpoints bind. Compiles unoptimized. | + +**Constraints (in-place):** the `[HotReload]` method must be a **`void` instance method** that is **`public`**, and reload works on **Mono only**. The CodeGen ILPostProcessor skips static methods and value-returning methods at build time (with a warning), so only matching methods are weaved for dispatch. + +## Flavor 2 — override (`reload_file_override`) + +When you want to swap behavior from a *separate* file (leaving the original untouched), tag the method with `[HotReloadWithOverrides]` and route it through `HotReloadHelper.ExecuteWithHotReload`: + +```csharp +using Unity.Pipeline.HotReload; +using UnityEngine; + +public class BossController : MonoBehaviour +{ + [HotReloadWithOverrides] + void Update() + { + HotReloadHelper.ExecuteWithHotReload(this, "Update", OriginalUpdate); + } + + public void OriginalUpdate() + { + transform.Rotate(45 * Time.deltaTime, 0, 0); + } +} +``` + +Put the tweaked behavior in a **separate file** as a **`public static` method** tagged `[HotReloadOverrideMethod("Type.Method")]`. The override **takes the target instance as its first parameter**: + +```csharp +// BossOverrides.cs — a separate file +using Unity.Pipeline.HotReload; +using UnityEngine; + +public static class BossOverrides +{ + [HotReloadOverrideMethod("BossController.Update")] + public static void TweakedUpdate(BossController instance) + { + instance.transform.Rotate(0, 90 * Time.deltaTime, 0); // new behaviour + } +} +``` + +Apply the override file: + +```bash +unity command reload_file_override "/BossOverrides.cs" +``` + +`reload_file_override` parameters: + +| Arg | Default | Meaning | +|-----|---------|---------| +| `filename` | *(required)* | The override source file to compile. | +| `timeout` | `30000` | Compilation timeout (ms). | +| `assemblyDir` | `null` | Optional directory to also save the compiled assembly to disk (default: in-memory only). | + +The override method's signature must be `public static Name( instance, ...)` — return type and trailing parameters matching the original. Do **not** redeclare the target type in the override file (a common cause of "signature mismatch"). Until an override is applied, `ExecuteWithHotReload` calls `OriginalUpdate`; once applied, dispatch routes to the override. + +`ExecuteWithHotReload` has matching overloads for both value-returning (`Func`) and void (`Action`) originals: + +```csharp +public static object ExecuteWithHotReload(T instance, string methodName, Func originalMethod, params object[] parameters); +public static void ExecuteWithHotReload(T instance, string methodName, Action originalMethod, params object[] parameters); +``` + +## Supporting commands + +- `hotreload_status` — show registry stats (which methods have overrides registered). +- `cleanup_hotreload` — remove old hot-reload assemblies and clear the registry. + +## Architecture + +The pipeline that turns an edited source file into running code: + +1. **Compile (Roslyn, in-memory).** `RoslynCompilationService.Compile` parses and compiles the source to a `DynamicallyLinkedLibrary` entirely in memory — IL bytes in one `MemoryStream`, and (when `pdb`/`EmitDebugInformation` is requested) a **portable PDB** in another. **Nothing is written to disk** by default. When emitting debug info it compiles unoptimized (`OptimizationLevel.Debug`) so sequence points survive and breakpoints can bind. + +2. **Load into the running AppDomain.** The IL (and optional PDB) bytes are loaded via `PipelineUtils.LoadFromBytes`, which selects the load mechanism by Unity version: + + ```csharp + public static Assembly LoadFromBytes(byte[] bytes, byte[] pdb = null) + { + #if UNITY_6000_5_OR_NEWER + return UnityEngine.Assemblies.CurrentAssemblies.LoadFromBytes(bytes, pdb); + #else + return System.Reflection.Assembly.Load(bytes, pdb); + #endif + } + ``` + + On Unity 6000.5+ it uses Unity's `CurrentAssemblies.LoadFromBytes`; on older versions it falls back to `Assembly.Load(bytes, pdb)`. Either way the freshly compiled code becomes a **sibling assembly** loaded next to the original in the live AppDomain. + +3. **Dispatch.** Calls are routed through `HotReloadRegistry`. The registry keys dispatch on `TypeName.MethodName`; when an override is registered for that id, `TryInvokeHotReload` invokes it with the instance as the first argument (marshaling to the main thread via the injected `Dispatcher` if the override requires it). If no override is registered, the original code runs. + +4. **In-place weaving (CodeGen).** For the in-place flavor, the **`HotReloadInPlaceILPostProcessor`** (built on Mono.Cecil, in the `Unity.Pipeline.CodeGen` assembly) weaves a dispatch prologue into every `[HotReload]` method **at build/compile time**. That prologue checks the registry for a reloaded body and calls it instead of the original — which is how an edited `[HotReload]` body takes effect without changing the call sites. The post-processor enforces the void-instance-method constraint, skipping (with a warning) any static or value-returning `[HotReload]` method. + +Because hot reload depends on Mono's ability to load a sibling assembly and dispatch into it, it is limited to **Editor Play Mode and Mono standalone dev builds — not IL2CPP**. + +## See also + +- [Runtime connection & setup](runtime-setup.md) — enabling hot reload in a Player build. +- [Command reference](commands/runtime.md) diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/index.md b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/index.md new file mode 100644 index 00000000..bc2e27f6 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/index.md @@ -0,0 +1,267 @@ +# Pipeline Documentation + +`com.unity.pipeline` lets a client — CLI, CI, or an agent — drive a running Unity Editor (or a +development Player) over a local HTTP API by executing registered commands. This is the documentation +index; the [README](../README.md) has the full narrative overview, install steps, and CLI walkthrough. + +## Guides + +| Page | What it covers | +|------|----------------| +| [Creating commands](creating-commands.md) | The command-authoring API: `[CliCommand]`/`[CliArg]`, the handler + response pattern, and the `MainThreadRequired` / `RuntimeOnly` flags. | +| [Creating authoring commands](authoring-commands.md) | Building content-authoring commands: the authoring root sandbox, `ObjectRef` in / `AuthoringResult` out, and undo grouping — with a worked example for a new content type. | +| [Safety & mutations](safety-and-mutations.md) | Conventions shared by state-changing commands: the `confirm`/`dry_run` gate, Undo grouping via `AuthoringUndoScope`, and the path sandbox. | +| [Connectivity](connectivity.md) | How servers bind localhost, the port ranges, the port/descriptor file, and the bearer-token auth workflow. | +| [Runtime connection & setup](runtime-setup.md) | Running the server in a development Player via `RuntimePipelineManager` and the dev-build gating. | +| [Hot reload](hot-reload.md) | The two hot-reload flavors (in-place and override) with examples, plus the Roslyn / in-memory-assembly architecture. | +| [Tests architecture](testing.md) | Writing command tests via `PipelineClient` (over HTTP) and via direct command calls. | + +## Command reference + +| Page | Commands | +|------|----------| +| [Asset & file commands](commands/assets-and-files.md) | Create / import / move / copy / rename / delete / find assets, import settings, folders, text files. | +| [Scene commands](commands/scenes.md) | Create / open / save scenes, build-settings list, hierarchy, active scene. | +| [GameObject & component commands](commands/gameobjects-and-components.md) | Create / find / transform / parent / tag / layer GameObjects; add / remove / read / set components. | +| [Prefab commands](commands/prefabs.md) | Create, instantiate, variant, apply / revert overrides, unpack, edit prefab contents. | +| [Script commands](commands/scripts.md) | Create and attach scripts; get / set serialized fields. | +| [Animation commands](commands/animation.md) | Create AnimationClips (+ curves), AnimatorControllers (parameters / layers / states / transitions), and Timeline assets. | +| [Material & shader commands](commands/materials.md) | Read / set material shader properties and keywords; list and introspect shaders. | +| [Baking commands](commands/baking.md) | Bake / clear lighting, NavMesh, and occlusion culling (async — poll the matching `*_bake_status`). | +| [Navigation & selection commands](commands/navigation.md) | Read / set the Editor selection; run Unity Search queries. | +| [Capture commands](commands/capture.md) | Screenshot the game / scene view and capture UI Toolkit visual elements. | +| [Build, compilation & test commands](commands/build-and-compilation.md) | Build the Player, switch build target, read/write build settings, list targets/profiles, recompile scripts, and run tests (async — poll the matching `*_status`). | +| [Project settings commands](commands/project-settings.md) | Read / change Audio, Graphics, Input, Physics, Player, Quality, Tags & Layers, and Time settings (`get_*`/`set_*`, gated by `confirm`/`dry_run`). | +| [Package Manager commands](commands/package-manager.md) | List / search / add / remove / resolve UPM packages and poll operation status. | +| [Editor lifecycle & observability commands](commands/editor-lifecycle-and-observability.md) | Play / stop / pause, focus, menus, screenshots, console logs, performance stats, authoring root. | +| [Runtime commands](commands/runtime.md) | Player-side commands: status, quit, frame rate, time scale, log, console, eval, hot reload. | + +## Command index + +Every available command, grouped by area. Each name links to its full reference (parameters + return type). + +### Asset & file commands + +| Command | Description | +|---------|-------------| +| [`create_asset`](commands/assets-and-files.md#create_asset) | Create a ScriptableObject / Object asset at a path. | +| [`import_asset`](commands/assets-and-files.md#import_asset) | Import an external file into the project. | +| [`move_asset`](commands/assets-and-files.md#move_asset) | Move / rename an asset (keeps its GUID). | +| [`copy_asset`](commands/assets-and-files.md#copy_asset) | Copy an asset (fresh GUID). | +| [`rename_asset`](commands/assets-and-files.md#rename_asset) | Rename an asset in place. | +| [`delete_asset`](commands/assets-and-files.md#delete_asset) | Delete an asset (needs confirm). | +| [`find_assets`](commands/assets-and-files.md#find_assets) | Find assets by type / name / label. | +| [`set_import_settings`](commands/assets-and-files.md#set_import_settings) | Set an asset's importer settings and re-import. | +| [`get_import_settings`](commands/assets-and-files.md#get_import_settings) | Read an asset's importer settings. | +| [`create_folder`](commands/assets-and-files.md#create_folder) | Create a folder under the authoring root. | +| [`read_text_file`](commands/assets-and-files.md#read_text_file) | Read a UTF-8 text file. | +| [`write_text_file`](commands/assets-and-files.md#write_text_file) | Write a UTF-8 text file, then import it. | + +### Scene commands + +| Command | Description | +|---------|-------------| +| [`create_scene`](commands/scenes.md#create_scene) | Create and save a new scene. | +| [`open_scene`](commands/scenes.md#open_scene) | Open an existing scene. | +| [`save_scene`](commands/scenes.md#save_scene) | Save an open scene. | +| [`save_all`](commands/scenes.md#save_all) | Save all dirty open scenes. | +| [`list_open_scenes`](commands/scenes.md#list_open_scenes) | List open scenes and their state. | +| [`set_active_scene`](commands/scenes.md#set_active_scene) | Set which open scene is active. | +| [`get_scene_hierarchy`](commands/scenes.md#get_scene_hierarchy) | Return a scene's GameObject tree. | +| [`add_scene_to_build`](commands/scenes.md#add_scene_to_build) | Add a scene to Build Settings. | +| [`remove_scene_from_build`](commands/scenes.md#remove_scene_from_build) | Remove a scene from Build Settings. | + +### GameObject & component commands + +| Command | Description | +|---------|-------------| +| [`create_gameobject`](commands/gameobjects-and-components.md#create_gameobject) | Create a GameObject or primitive. | +| [`create_gameobjects`](commands/gameobjects-and-components.md#create_gameobjects) | Batch-create GameObjects / primitives. | +| [`find_gameobjects`](commands/gameobjects-and-components.md#find_gameobjects) | Find GameObjects by name / tag / component / path. | +| [`set_transform`](commands/gameobjects-and-components.md#set_transform) | Set local position / rotation / scale. | +| [`set_parent`](commands/gameobjects-and-components.md#set_parent) | Reparent a GameObject (or detach to root). | +| [`set_active`](commands/gameobjects-and-components.md#set_active) | Set a GameObject's active state. | +| [`set_tag`](commands/gameobjects-and-components.md#set_tag) | Set a GameObject's tag. | +| [`set_layer`](commands/gameobjects-and-components.md#set_layer) | Set a GameObject's layer. | +| [`rename_gameobject`](commands/gameobjects-and-components.md#rename_gameobject) | Rename a GameObject. | +| [`delete_gameobject`](commands/gameobjects-and-components.md#delete_gameobject) | Delete a GameObject (undoable). | +| [`add_component`](commands/gameobjects-and-components.md#add_component) | Add a component by type name. | +| [`remove_component`](commands/gameobjects-and-components.md#remove_component) | Remove a component. | +| [`get_component_properties`](commands/gameobjects-and-components.md#get_component_properties) | Read a component's serialized properties. | +| [`set_component_properties`](commands/gameobjects-and-components.md#set_component_properties) | Set a component's serialized properties. | + +### Prefab commands + +| Command | Description | +|---------|-------------| +| [`create_prefab`](commands/prefabs.md#create_prefab) | Save a GameObject as a prefab. | +| [`instantiate_prefab`](commands/prefabs.md#instantiate_prefab) | Instantiate a prefab into a scene. | +| [`create_prefab_variant`](commands/prefabs.md#create_prefab_variant) | Create a prefab variant. | +| [`apply_prefab_overrides`](commands/prefabs.md#apply_prefab_overrides) | Apply instance overrides to the source. | +| [`revert_prefab_overrides`](commands/prefabs.md#revert_prefab_overrides) | Revert instance overrides. | +| [`unpack_prefab`](commands/prefabs.md#unpack_prefab) | Unpack a prefab instance. | +| [`save_prefab_contents`](commands/prefabs.md#save_prefab_contents) | Edit a prefab in an isolated stage and save. | + +### Script commands + +| Command | Description | +|---------|-------------| +| [`create_script`](commands/scripts.md#create_script) | Create a C# script from a template. | +| [`attach_script`](commands/scripts.md#attach_script) | Attach a MonoBehaviour by type / asset. | +| [`set_serialized_field`](commands/scripts.md#set_serialized_field) | Set a serialized field on a component / asset. | +| [`get_serialized_fields`](commands/scripts.md#get_serialized_fields) | Read serialized fields. | + +### Animation commands + +| Command | Description | +|---------|-------------| +| [`create_animation_clip`](commands/animation.md#create_animation_clip) | Create an empty .anim AnimationClip. | +| [`set_animation_curve`](commands/animation.md#set_animation_curve) | Add / replace a float curve on a clip. | +| [`get_animation_clip`](commands/animation.md#get_animation_clip) | Read a clip's curves and metadata. | +| [`remove_animation_curve`](commands/animation.md#remove_animation_curve) | Remove a curve binding (needs confirm). | +| [`create_animator_controller`](commands/animation.md#create_animator_controller) | Create an .controller AnimatorController. | +| [`add_animator_parameter`](commands/animation.md#add_animator_parameter) | Add a parameter to a controller. | +| [`add_animator_layer`](commands/animation.md#add_animator_layer) | Add a layer to a controller. | +| [`add_animator_state`](commands/animation.md#add_animator_state) | Add a state to a layer. | +| [`add_animator_transition`](commands/animation.md#add_animator_transition) | Add a transition between states. | +| [`get_animator_controller`](commands/animation.md#get_animator_controller) | Read a controller's full structure. | +| [`create_timeline`](commands/animation.md#create_timeline) | Create a .playable Timeline asset. | +| [`add_timeline_track`](commands/animation.md#add_timeline_track) | Add a track to a Timeline. | +| [`add_timeline_clip`](commands/animation.md#add_timeline_clip) | Add a clip to a Timeline track. | +| [`get_timeline`](commands/animation.md#get_timeline) | Read a Timeline's structure. | + +### Material & shader commands + +| Command | Description | +|---------|-------------| +| [`get_material_properties`](commands/materials.md#get_material_properties) | Read a material's shader and properties. | +| [`set_material_properties`](commands/materials.md#set_material_properties) | Set material shader properties / keywords. | +| [`list_shaders`](commands/materials.md#list_shaders) | Discover available shaders. | +| [`get_shader_properties`](commands/materials.md#get_shader_properties) | Introspect a shader's property list. | + +### Baking commands + +| Command | Description | +|---------|-------------| +| [`bake_lighting`](commands/baking.md#bake_lighting) | Async lightmap bake (poll `lighting_bake_status`). | +| [`lighting_bake_status`](commands/baking.md#lighting_bake_status) | Status of the last lighting bake. | +| [`cancel_lighting_bake`](commands/baking.md#cancel_lighting_bake) | Cancel an in-progress lighting bake. | +| [`clear_baked_lighting`](commands/baking.md#clear_baked_lighting) | Clear baked lightmaps (needs confirm). | +| [`get_lighting_settings`](commands/baking.md#get_lighting_settings) | Read the active LightingSettings. | +| [`set_lighting_settings`](commands/baking.md#set_lighting_settings) | Apply a subset of lighting settings. | +| [`bake_navmesh`](commands/baking.md#bake_navmesh) | Async legacy NavMesh bake (poll `navmesh_bake_status`). | +| [`navmesh_bake_status`](commands/baking.md#navmesh_bake_status) | Status of the last NavMesh bake. | +| [`cancel_navmesh_bake`](commands/baking.md#cancel_navmesh_bake) | Cancel an in-progress NavMesh bake. | +| [`clear_navmesh`](commands/baking.md#clear_navmesh) | Clear the baked NavMesh (needs confirm). | +| [`get_navmesh_settings`](commands/baking.md#get_navmesh_settings) | Read legacy NavMesh bake settings. | +| [`set_navmesh_settings`](commands/baking.md#set_navmesh_settings) | Apply a subset of NavMesh settings. | +| [`bake_navmesh_surfaces`](commands/baking.md#bake_navmesh_surfaces) | Bake NavMeshSurface components (AI Navigation). | +| [`bake_occlusion_culling`](commands/baking.md#bake_occlusion_culling) | Async occlusion bake (poll `occlusion_bake_status`). | +| [`occlusion_bake_status`](commands/baking.md#occlusion_bake_status) | Status of the last occlusion bake. | +| [`cancel_occlusion_bake`](commands/baking.md#cancel_occlusion_bake) | Cancel an in-progress occlusion bake. | +| [`clear_occlusion_culling`](commands/baking.md#clear_occlusion_culling) | Clear baked occlusion data (needs confirm). | + +### Navigation & selection commands + +| Command | Description | +|---------|-------------| +| [`get_selection`](commands/navigation.md#get_selection) | Read the current Editor selection. | +| [`set_selection`](commands/navigation.md#set_selection) | Set the Editor selection. | +| [`search`](commands/navigation.md#search) | Run a Unity Search query. | + +### Capture commands + +| Command | Description | +|---------|-------------| +| [`capture_game_view`](commands/capture.md#capture_game_view) | Render a camera to a PNG (base64). | +| [`capture_scene_view`](commands/capture.md#capture_scene_view) | Render the Scene View to a PNG (base64). | +| [`capture_editor_element`](commands/capture.md#capture_editor_element) | Capture a UI Toolkit element from an EditorWindow (6000.7+). | +| [`capture_runtime_element`](commands/capture.md#capture_runtime_element) | Capture a UI Toolkit element from a runtime panel (6000.7+). | + +### Build, compilation & test commands + +| Command | Description | +|---------|-------------| +| [`build`](commands/build-and-compilation.md#build) | Async Player build (poll `build_status`). | +| [`build_status`](commands/build-and-compilation.md#build_status) | Status / report of the current build. | +| [`switch_build_target`](commands/build-and-compilation.md#switch_build_target) | Switch the active build target (needs confirm). | +| [`switch_build_target_status`](commands/build-and-compilation.md#switch_build_target_status) | Status of the last target switch. | +| [`list_build_targets`](commands/build-and-compilation.md#list_build_targets) | List known build targets. | +| [`get_build_settings`](commands/build-and-compilation.md#get_build_settings) | Read build configuration. | +| [`set_build_settings`](commands/build-and-compilation.md#set_build_settings) | Set build configuration fields. | +| [`list_build_profiles`](commands/build-and-compilation.md#list_build_profiles) | List Build Profile assets (Unity 6). | +| [`recompile`](commands/build-and-compilation.md#recompile) | Force a script recompile (poll `recompile_status`). | +| [`recompile_status`](commands/build-and-compilation.md#recompile_status) | Status of the last recompile. | +| [`list_tests`](commands/build-and-compilation.md#list_tests) | List available tests without running. | +| [`run_tests`](commands/build-and-compilation.md#run_tests) | Run Unity tests with filters. | +| [`test_status`](commands/build-and-compilation.md#test_status) | Status of async test execution. | +| [`cancel_tests`](commands/build-and-compilation.md#cancel_tests) | Cancel running tests. | + +### Project settings commands + +| Command | Description | +|---------|-------------| +| [`get_audio_settings`](commands/project-settings.md#get_audio_settings) | Read Audio settings. | +| [`set_audio_settings`](commands/project-settings.md#set_audio_settings) | Change Audio settings (needs confirm). | +| [`get_graphics_settings`](commands/project-settings.md#get_graphics_settings) | Read Graphics settings. | +| [`set_graphics_settings`](commands/project-settings.md#set_graphics_settings) | Set the default render pipeline (needs confirm). | +| [`get_input_settings`](commands/project-settings.md#get_input_settings) | Read legacy Input Manager axes. | +| [`set_input_settings`](commands/project-settings.md#set_input_settings) | Tune a legacy input axis (needs confirm). | +| [`get_physics_settings`](commands/project-settings.md#get_physics_settings) | Read Physics settings. | +| [`set_physics_settings`](commands/project-settings.md#set_physics_settings) | Change Physics settings (needs confirm). | +| [`get_player_settings`](commands/project-settings.md#get_player_settings) | Read PlayerSettings. | +| [`set_player_settings`](commands/project-settings.md#set_player_settings) | Change PlayerSettings (needs confirm). | +| [`get_quality_settings`](commands/project-settings.md#get_quality_settings) | Read QualitySettings. | +| [`set_quality_settings`](commands/project-settings.md#set_quality_settings) | Change QualitySettings (needs confirm). | +| [`get_tags_layers`](commands/project-settings.md#get_tags_layers) | Read tags and layers. | +| [`set_tags_layers`](commands/project-settings.md#set_tags_layers) | Add / remove tags, name layers (needs confirm). | +| [`get_time_settings`](commands/project-settings.md#get_time_settings) | Read Time settings. | +| [`set_time_settings`](commands/project-settings.md#set_time_settings) | Change Time settings (needs confirm). | + +### Package Manager commands + +| Command | Description | +|---------|-------------| +| [`package_list`](commands/package-manager.md#package_list) | List packages by scope. | +| [`package_search`](commands/package-manager.md#package_search) | Search the registry. | +| [`package_add`](commands/package-manager.md#package_add) | Add a UPM package (needs confirm). | +| [`package_remove`](commands/package-manager.md#package_remove) | Remove a UPM package (needs confirm). | +| [`package_resolve`](commands/package-manager.md#package_resolve) | Resolve / refresh packages. | +| [`package_status`](commands/package-manager.md#package_status) | Status of the last package operation. | + +### Editor lifecycle & observability commands + +| Command | Description | +|---------|-------------| +| [`editor_play`](commands/editor-lifecycle-and-observability.md#editor_play) | Enter play mode. | +| [`editor_stop`](commands/editor-lifecycle-and-observability.md#editor_stop) | Exit play mode. | +| [`editor_pause`](commands/editor-lifecycle-and-observability.md#editor_pause) | Pause play mode. | +| [`editor_status`](commands/editor-lifecycle-and-observability.md#editor_status) | Detailed Editor status. | +| [`editor_focus`](commands/editor-lifecycle-and-observability.md#editor_focus) | Bring the Editor to the foreground. | +| [`menu`](commands/editor-lifecycle-and-observability.md#menu) | Execute (or list) Editor menu items. | +| [`screenshot`](commands/editor-lifecycle-and-observability.md#screenshot) | Capture Scene / Game view to a PNG file. | +| [`set_autotick`](commands/editor-lifecycle-and-observability.md#set_autotick) | Keep the editor ticking while unfocused. | +| [`get_console_logs`](commands/editor-lifecycle-and-observability.md#get_console_logs) | Read captured Editor console logs. | +| [`clear_console`](commands/editor-lifecycle-and-observability.md#clear_console) | Clear the console / log buffer. | +| [`get_performance_stats`](commands/editor-lifecycle-and-observability.md#get_performance_stats) | Read render / memory / frame stats. | +| [`get_authoring_root`](commands/editor-lifecycle-and-observability.md#get_authoring_root) | Get the authoring-root folder. | +| [`set_authoring_root`](commands/editor-lifecycle-and-observability.md#set_authoring_root) | Set the authoring-root folder. | + +### Runtime commands + +| Command | Description | +|---------|-------------| +| [`runtime_status`](commands/runtime.md#runtime_status) | Runtime application status. | +| [`quit`](commands/runtime.md#quit) | Quit the application. | +| [`set_target_framerate`](commands/runtime.md#set_target_framerate) | Set the target frame rate. | +| [`set_timescale`](commands/runtime.md#set_timescale) | Set the time scale. | +| [`simulate_key`](commands/runtime.md#simulate_key) | Simulate a keyboard event (Input System). | +| [`simulate_pointer`](commands/runtime.md#simulate_pointer) | Simulate a pointer event (Input System). | +| [`log`](commands/runtime.md#log) | Write a message to the Unity console. | +| [`console`](commands/runtime.md#console) | Read captured console output. | +| [`eval`](commands/runtime.md#eval) | Evaluate C# via Roslyn. | +| [`eval_file`](commands/runtime.md#eval_file) | Evaluate C# from a .cs file. | +| [`reload_file`](commands/runtime.md#reload_file) | Apply in-place [HotReload] edits from a file. | +| [`reload_file_override`](commands/runtime.md#reload_file_override) | Compile & apply override hot reload. | +| [`hotreload_status`](commands/runtime.md#hotreload_status) | Hot reload registry status. | +| [`cleanup_hotreload`](commands/runtime.md#cleanup_hotreload) | Clear old hot reload DLLs / registry. | diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/runtime-setup.md b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/runtime-setup.md new file mode 100644 index 00000000..040ebdd1 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/runtime-setup.md @@ -0,0 +1,60 @@ +# Runtime connection & setup + +How to run the Pipeline server inside a built Player so a client can drive it the same way it drives the Editor. The runtime server only exists in **development builds**, so setup is mostly about building correctly. + +## The `RuntimePipelineManager` component + +The runtime server is owned by a `RuntimePipelineManager` MonoBehaviour. Add it to a scene via the component menu: + +> **Add Component → Pipeline → Runtime Pipeline Manager** + +It is `[DisallowMultipleComponent]` and survives scene loads (`DontDestroyOnLoad`); only one instance should exist. Its `Update` pumps the server's dispatcher each frame (a Player has no `EditorApplication.update` to do this) and drives the listener watchdog. + +### Inspector fields + +| Field | Default | Meaning | +|-------|---------|---------| +| `enableInBuilds` | `false` | Master switch. The server only starts when this is `true`. **Off by default for safety.** | +| `autoStart` | `true` | Start the server automatically in `Start()` (requires `enableInBuilds`). | +| `port` | `0` | Listen port. `0` = auto-assign from `7900`–`7949`. | +| `requestTimeoutMs` | `30000` | Per-request timeout. | +| `enableAuditLogging` | `true` | Log remote requests for auditing. | +| `maxWorkItemsPerFrame` | `10` | Dispatcher work items processed per frame. | + +If `autoStart` is off you can start/stop manually with `StartServer()` / `StopServer()`. + +## Development-build gating + +The runtime server, code evaluation, and hot reload are all gated behind a compile-time guard: + +```csharp +#if UNITY_EDITOR || (UNITY_STANDALONE && DEBUG) +``` + +`DEBUG` is defined for **standalone Development Builds** only. In a non-development (release) build the compilation/eval/hot-reload code is compiled out entirely, so it cannot run — even if `enableInBuilds` is `true`. To use the runtime server in a Player you therefore need **both**: + +1. A **Development Build** (defines `DEBUG`), built for a **standalone** target (Windows/macOS/Linux). +2. `enableInBuilds = true` on the `RuntimePipelineManager`. + +## Step-by-step: enable in a dev build + +1. Add a **Runtime Pipeline Manager** component to a GameObject in your startup scene (component menu *Pipeline → Runtime Pipeline Manager*). +2. Tick **`enableInBuilds`** on that component. Leave `autoStart` on and `port` at `0` (auto). +3. Open **File → Build Settings** and enable **Development Build** for a **Standalone** platform. +4. Build and run the Player. +5. On start, the manager creates a `RuntimePipelineServer`, which binds the first free port in `7900`–`7949` and writes the runtime descriptor `.unity-pipeline-runtime-port` (with `port` and `evalToken`). +6. Connect a client using that port and token. + +## Security + +The runtime server applies the same protections as the editor server (see [Connectivity](connectivity.md)): + +- It binds the **IPv4 loopback** (`http://127.0.0.1:/`, plus the `localhost` hostname), so it is reachable only from the same machine and never exposed on a routable interface. Clients should connect to `127.0.0.1` explicitly — see [Loopback-only binding](connectivity.md#loopback-only-binding) for why `localhost` can resolve to the IPv6 loopback (`::1`), which Unity's Mono `HttpListener` cannot serve. +- Every request must present `Authorization: Bearer `; the token is generated at startup and published in the runtime descriptor. + +Because the server exposes code evaluation and hot reload, only enable it in development/QA builds — never in a production build without additional safeguards. + +## See also + +- [Connectivity](connectivity.md) — ports, descriptor file, and auth in detail. +- [Hot reload](hot-reload.md) — applying live code changes to a running Player. diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/safety-and-mutations.md b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/safety-and-mutations.md new file mode 100644 index 00000000..8acfd216 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/safety-and-mutations.md @@ -0,0 +1,90 @@ +# Safety & mutations + +Mutating commands — asset writes, project-settings changes, package/build changes — +share two conventions so command authors and clients know what to expect: a `confirm`/`dry_run` gate +on destructive or overwriting operations, and Undo grouping via `AuthoringUndoScope`. Commands that +resolve caller-supplied asset paths confine them with `ProjectPaths` (see +[Creating authoring commands](authoring-commands.md)). The helpers live in `Editor/Authoring/`. + +### The confirm / dry_run convention + +Destructive or overwriting commands expose two boolean `[CliArg]`s — `confirm` and `dry_run` — and +gate their own mutation on them. There is no central dispatcher; each command applies the same simple +rules inline: + +- **`dry_run == true`** → validate and describe the intended change, mutate nothing, return a preview. + This wins even if `confirm` is also true. +- **`confirm == false`** (and not a dry run) → refuse without mutating. Return the failure the way the + command reports its other errors — `throw new ArgumentException(...)` for the throwing style (e.g. + `delete_asset`, `clear_baked_lighting`), or a structured error object for commands that return + structured results (e.g. `build`, which returns `{ success = false, status = "error", message = "…" }`). +- **otherwise** (`confirm == true`, not a dry run) → perform the mutation. Group *scene/object* + mutations in an `AuthoringUndoScope` (see below). Asset/settings/package writes are **not** part of + Unity's Undo, so they run directly — say so in the command description ("Not undoable via Ctrl+Z."). + +```csharp +[CliCommand("clear_baked_lighting", "Clear baked lightmap data for the open scene(s). Destructive: requires confirm=true (use dry_run to preview). Not undoable via Ctrl+Z.")] +public static object ClearBakedLighting( + [CliArg("confirm", "Apply the clear. Without it the call is refused.")] bool confirm = false, + [CliArg("dry_run", "Preview what would be cleared without clearing it.")] bool dryRun = false) +{ + // …resolve the open scene(s)… + if (dryRun) + return new { status = "dry_run", wouldClear = true }; + if (!confirm) + throw new ArgumentException("Refusing to clear baked lighting. Pass confirm=true to apply, or dry_run=true to preview."); + + // Clearing baked GI is not part of Unity's Undo — no AuthoringUndoScope. + Lightmapping.Clear(); + + return new { cleared = true }; +} +``` + +Purely additive, non-destructive commands (e.g. `create_folder`, `add_animator_parameter`) +do not take `confirm`/`dry_run`; they just perform the mutation directly. + +### Undo grouping + +Scene/object mutations are grouped with `AuthoringUndoScope` so a multi-step command reverts as a +single Ctrl+Z step. It increments Unity's current Undo group on construction and calls +`Undo.CollapseUndoOperations` on dispose, collapsing everything the body registers — via +`Undo.RecordObject`, `Undo.RegisterCreatedObjectUndo`, and similar — into one named step. The command +opts into Undo by calling those APIs inside the scope. See +[Creating authoring commands](authoring-commands.md) for the full pattern and the per-mutation `Undo` +API table. + +> **Caveat.** Some operations are not part of Unity's Undo system. `AssetDatabase` operations, UPM +> package changes, and settings backed by native assets may not be undoable; for those the collapse is +> simply a no-op and Ctrl+Z will not revert the change. Don't rely on Undo to clean up such writes — +> validate up front and fail before writing. + +### Path confinement + +Commands that accept a caller-supplied asset path resolve it through `ProjectPaths.Resolve`, which +normalizes the path, rejects `..` traversal, and confines it to the configurable authoring root +(default `Assets`) so agent-supplied paths cannot escape the project. It returns a project-relative +path, or `null` with an `error` string when the path escapes the root. + +```csharp +var normalized = ProjectPaths.Resolve(path, out var error); +if (normalized == null) + throw new ArgumentException(error); +// normalized is project-relative and guaranteed to live under the authoring root. +``` + +See [Creating authoring commands](authoring-commands.md) for the full path-handling rules and the +`set_authoring_root` / `get_authoring_root` commands that adjust the root. + +### For command authors + +To make a mutating command safe: + +1. If the operation is destructive or overwrites existing content, add `confirm` and `dry_run` boolean + `[CliArg]`s and gate on them inline (preview on `dry_run`, refuse on `!confirm`). +2. Group scene/object mutations in `using (new AuthoringUndoScope(""))` and register Undo + operations inside it where the mutation is undoable. +3. Resolve any caller-supplied asset path through `ProjectPaths.Resolve` before touching the filesystem + — ideally during validation, so a bad path fails before anything is applied. + +See [Creating commands](creating-commands.md) and [Creating authoring commands](authoring-commands.md). diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/testing.md b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/testing.md new file mode 100644 index 00000000..5825b2f7 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Documentation~/testing.md @@ -0,0 +1,95 @@ +# Tests architecture + +How the package's tests exercise commands. There are two complementary styles — **ViaClient** (over real HTTP, end-to-end) and **CommandDirect** (calling the static command method straight) — backed by a small set of shared test helpers. + +## Two test styles + +### ViaClient — exercise the full HTTP path + +Spin up an isolated `PipelineTestServer` and call `server.Execute(command, params)`. This goes over HTTP through the same routing, parameter coercion, and threading the real server uses — it tests the command *as a client sees it*. + +```csharp +[Test] +public void SetTransform_ViaClient_ArrayParams_Apply() +{ + var go = Track(new GameObject("Xform219_Arrays")); + + using (var server = new PipelineTestServer()) + { + var response = server.Execute("set_transform", new + { + target = new { instanceId = PipelineUtils.GetObjectId(go) }, + position = new[] { 1f, 2f, 3f }, + rotation = new[] { 0f, 90f, 0f }, + scale = new[] { 2f, 2f, 2f } + }); + + Assert.IsTrue(response.IsSuccess, $"set_transform should succeed: {response.Error}"); + Assert.AreEqual(new Vector3(1, 2, 3), go.transform.localPosition); + } +} +``` + +The test server is isolated: it uses the **test editor port range `7850`–`7899`** and **writes no descriptor**, so it never disturbs the live editor server (which uses `7800`–`7849`). `Execute` pumps the server's own dispatcher while the HTTP call is in flight, so `MainThreadRequired` commands complete even from a plain `[Test]` that blocks the main thread — no deadlock. + +### CommandDirect — call the static method directly + +Call the command's static method with typed arguments. This is synchronous, with **no server, HTTP, or dispatcher** involved — fast and ideal for unit-testing command logic and parameter handling. + +```csharp +[Test] +public void SetTransform_Direct_TypedArrays_Apply() +{ + var go = Track(new GameObject("Xform219_Direct")); + + GameObjectCommands.SetTransform(RefTo(go), + position: new[] { 1f, 2f, 3f }, + rotation: new[] { 0f, 90f, 0f }, + scale: new[] { 2f, 2f, 2f }); + + Assert.AreEqual(new Vector3(1, 2, 3), go.transform.localPosition); + Assert.AreEqual(new Vector3(2, 2, 2), go.transform.localScale); +} +``` + +Use **CommandDirect** to verify a command's behavior with strongly-typed inputs; use **ViaClient** to additionally verify wire-level concerns (JSON coercion, required-parameter validation, threading). + +## Shared helpers + +| Helper | Role | +|--------|------| +| `PipelineTestServer` | Disposable wrapper that starts an isolated `TestEditorPipelineServer`, wires up a `PipelineClient`, and exposes `Execute(command, parameters, timeoutMs = 30000)`. Pumps the server dispatcher during each call to avoid main-thread deadlock. | +| `TestEditorPipelineServer` | `EditorPipelineServer` subclass for tests. Overrides `WritesDescriptor => false`, `GetPortRange() => (7850, 7899)`, and `GetToken()` (from `SecurityTokenManager`) so it is fully isolated from the live server. | +| `PipelineClient` | Test-side HTTP client. Constructed from a URL+token or a server/manager instance. Key methods: `ExecuteCommandAsync` (`/api/exec`), `GetStatusAsync` (`/api/status`), `PostJsonAsync`. Returns a `PipelineResponse` (`IsSuccess`, `StatusCode`, `Error`, `JsonResponse`, `IsCommandSuccess`). | +| `EditorTestUtilities` | Async helpers for editor state, e.g. `WaitFor(Func condition, timeoutMs)` to poll a condition without busy-waiting. | +| `LiveServerGuard` | Assembly-level `ITestAction` that asserts the **live editor server survives the test run**. | + +### `PipelineTestServer` setup + +```csharp +public PipelineTestServer() +{ + m_Server = new TestEditorPipelineServer(); + m_Server.Start(); // auto-assigns a port in 7850-7899; writes no descriptor + m_Client = new PipelineClient($"http://localhost:{m_Server.Port}", SecurityTokenManager.GetOrCreateToken()); +} +``` + +Wrap it in a `using` (it is disposable) so the isolated server is stopped at the end of the test. + +### `LiveServerGuard` + +Applied once at assembly scope (`[assembly: LiveServerGuard]`), it runs before and after **every** test in the editor suite. If a live editor server was advertising its descriptor before a test, the guard asserts afterwards that the test did not disturb it — the descriptor still exists, the port is unchanged, and the server is still listening: + +```csharp +Assert.IsNotNull(after, $"'{test.Name}' deleted the live pipeline server descriptor"); +Assert.AreEqual(m_Before.Port, after.Port, $"'{test.Name}' changed the port"); +Assert.IsTrue(IsListening(after.Port, after.EvalToken), $"'{test.Name}' left the server not responding"); +``` + +This is what makes it safe to "dogfood" — run the test suite against the very editor you are driving — without a test clobbering the live server. Tests that intentionally start/stop the live server are marked `[Explicit]` and must hand it back intact. + +## See also + +- [Creating commands](creating-commands.md) — the command API these tests exercise. +- [Connectivity](connectivity.md) — ports, descriptor, and auth (the test server deliberately skips the descriptor). diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor.meta new file mode 100644 index 00000000..ac21aa23 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5144d7ecd5530424ab66f205802d8c9e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Authoring.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Authoring.meta new file mode 100644 index 00000000..266f5869 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Authoring.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 113bc2bcfe487eb469aa654e6718f78b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Authoring/AuthoringUndoScope.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Authoring/AuthoringUndoScope.cs new file mode 100644 index 00000000..65fb5254 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Authoring/AuthoringUndoScope.cs @@ -0,0 +1,45 @@ +using System; +using UnityEditor; + +namespace Unity.Pipeline.Editor.Authoring +{ + /// + /// + /// Groups all Undo operations registered during its lifetime into a single, collapsible Editor + /// Undo step, so a multi-step agent action reverts as one. Register mutations inside the scope + /// with Undo.RegisterCreatedObjectUndo / RegisterCompleteObjectUndo / etc. + /// + /// + /// + /// using (new AuthoringUndoScope("Create Enemy")) + /// { + /// var go = new GameObject("Enemy"); + /// Undo.RegisterCreatedObjectUndo(go, "Create Enemy"); + /// // ... further registered mutations collapse into the same step + /// } + /// + /// + /// + /// NOTE: minimal seed for the shared safety policy (CAT-2509). AssetDatabase operations + /// (folder/asset creation, import) are NOT part of Unity's Undo system, so this scope only + /// affects scene/object mutations. + /// + /// + public sealed class AuthoringUndoScope : IDisposable + { + private readonly int m_Group; + + public AuthoringUndoScope(string name) + { + Undo.IncrementCurrentGroup(); + m_Group = Undo.GetCurrentGroup(); + if (!string.IsNullOrEmpty(name)) + Undo.SetCurrentGroupName(name); + } + + public void Dispose() + { + Undo.CollapseUndoOperations(m_Group); + } + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Authoring/AuthoringUndoScope.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Authoring/AuthoringUndoScope.cs.meta new file mode 100644 index 00000000..a0ef9b15 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Authoring/AuthoringUndoScope.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6ef72626627670a4eadfccdab20cd9ba +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Authoring/ObjectResolver.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Authoring/ObjectResolver.cs new file mode 100644 index 00000000..6dfccac4 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Authoring/ObjectResolver.cs @@ -0,0 +1,250 @@ +using Unity.Pipeline.Models; +using UnityEditor; +using UnityEngine; +using UnityEngine.SceneManagement; +using Object = UnityEngine.Object; + +namespace Unity.Pipeline.Editor.Authoring +{ + /// + /// Resolves an agent-supplied handle to a live UnityEngine.Object, and + /// describes any object back into a canonical identity. + /// Backed by GlobalObjectId, which addresses both assets (GUID + fileId) and scene objects. + /// + public static class ObjectResolver + { + /// + /// Try to resolve a handle to a loaded object. Returns false with an + /// when the handle is empty or does not resolve. + /// + public static bool TryResolve(ObjectRef handle, out Object obj, out string error) + { + obj = null; + error = null; + + if (handle == null || handle.IsEmpty) + { + error = "Empty object reference."; + return false; + } + + // 1. Canonical GlobalObjectId. + if (!string.IsNullOrEmpty(handle.GlobalId)) + { + if (!GlobalObjectId.TryParse(handle.GlobalId, out var gid)) + { + error = $"Invalid globalId '{handle.GlobalId}'."; + return false; + } + + obj = GlobalObjectId.GlobalObjectIdentifierToObjectSlow(gid); + if (obj != null) + return true; + + error = $"globalId '{handle.GlobalId}' did not resolve to a loaded object."; + return false; + } + + // 2. Asset path. Explicit "Assets/"/"Packages/"-rooted paths load as-is; a bare relative + // path (e.g. "Materials/Floor.mat") is normalized under the authoring root first. If it + // does not resolve to an asset, fall back to a hierarchy lookup so dotted GameObject names + // (e.g. "Cube.001") still resolve, and report every strategy that was tried. + if (!string.IsNullOrEmpty(handle.Path)) + { + var raw = handle.Path; + var explicitlyRooted = IsExplicitlyRooted(raw); + var assetPath = raw; + if (!explicitlyRooted) + { + var resolved = ProjectPaths.Resolve(raw, out _); + if (!string.IsNullOrEmpty(resolved)) + assetPath = resolved; + } + + obj = AssetDatabase.LoadMainAssetAtPath(assetPath); + if (obj != null) + return true; + + if (explicitlyRooted) + { + error = $"No asset at path '{raw}'."; + return false; + } + + // A bare relative string may actually be a scene hierarchy path with a dotted name. + var go = FindByHierarchyPath(raw); + if (go != null) + { + obj = go; + return true; + } + + error = $"Could not resolve '{raw}': no asset at '{assetPath}', no GameObject at hierarchy path '{raw}'."; + return false; + } + + // 3. GUID (+ optional fileId for sub-assets). + if (!string.IsNullOrEmpty(handle.Guid)) + { + var path = AssetDatabase.GUIDToAssetPath(handle.Guid); + if (string.IsNullOrEmpty(path)) + { + error = $"Unknown GUID '{handle.Guid}'."; + return false; + } + + if (handle.FileId.HasValue) + { + foreach (var candidate in AssetDatabase.LoadAllAssetsAtPath(path)) + { + if (candidate != null && + AssetDatabase.TryGetGUIDAndLocalFileIdentifier(candidate, out _, out long localId) && + localId == handle.FileId.Value) + { + obj = candidate; + return true; + } + } + + error = $"No sub-asset with fileId {handle.FileId} in '{path}'."; + return false; + } + + obj = AssetDatabase.LoadMainAssetAtPath(path); + if (obj != null) + return true; + + error = $"Could not load asset '{path}'."; + return false; + } + + // 4. Instance id (loaded/scene object). + if (handle.InstanceId.HasValue) + { + obj = PipelineUtils.IdToObject(handle.InstanceId.Value); + if (obj != null) + return true; + + error = $"No loaded object with instanceId {handle.InstanceId}."; + return false; + } + + // 5. Scene hierarchy path. + if (!string.IsNullOrEmpty(handle.HierarchyPath)) + { + var go = FindByHierarchyPath(handle.HierarchyPath); + if (go != null) + { + obj = go; + return true; + } + + error = $"No GameObject at hierarchy path '{handle.HierarchyPath}'."; + return false; + } + + error = "Empty object reference."; + return false; + } + + /// + /// Produce the canonical identity for an object (assets get path/guid/fileId; loaded objects + /// get instanceId/hierarchyPath). Returns null for a null object. + /// + public static AuthoringResult Describe(Object obj) + { + if (obj == null) + return null; + + var result = new AuthoringResult { Type = obj.GetType().Name }; + + var assetPath = AssetDatabase.GetAssetPath(obj); + if (!string.IsNullOrEmpty(assetPath)) + { + result.AssetPath = assetPath; + if (AssetDatabase.TryGetGUIDAndLocalFileIdentifier(obj, out var guid, out long localId)) + { + result.Guid = guid; + result.FileId = localId; + } + } + else + { + result.InstanceId = PipelineUtils.GetObjectId(obj); + var go = obj as GameObject ?? (obj as Component)?.gameObject; + if (go != null) + result.HierarchyPath = GetHierarchyPath(go); + } + + // Not every object has a global id (e.g. transient objects); ignore failures. + try + { + result.GlobalId = GlobalObjectId.GetGlobalObjectIdSlow(obj).ToString(); + } + catch + { + // leave GlobalId null + } + + return result; + } + + /// True when a path is explicitly rooted at "Assets/" or "Packages/" (or is exactly one of those). + private static bool IsExplicitlyRooted(string path) => + path == "Assets" || path == "Packages" + || path.StartsWith("Assets/", System.StringComparison.Ordinal) + || path.StartsWith("Packages/", System.StringComparison.Ordinal); + + private static GameObject FindByHierarchyPath(string path) + { + var parts = path.Trim('/').Split('/'); + if (parts.Length == 0 || string.IsNullOrEmpty(parts[0])) + return null; + + for (int s = 0; s < SceneManager.sceneCount; s++) + { + var scene = SceneManager.GetSceneAt(s); + if (!scene.isLoaded) + continue; + + foreach (var root in scene.GetRootGameObjects()) + { + if (root.name != parts[0]) + continue; + + var current = root.transform; + var matched = true; + for (int i = 1; i < parts.Length; i++) + { + var child = current.Find(parts[i]); + if (child == null) + { + matched = false; + break; + } + + current = child; + } + + if (matched) + return current.gameObject; + } + } + + return null; + } + + private static string GetHierarchyPath(GameObject go) + { + var sb = new System.Text.StringBuilder(go.name); + var parent = go.transform.parent; + while (parent != null) + { + sb.Insert(0, parent.name + "/"); + parent = parent.parent; + } + + return "/" + sb; + } + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Authoring/ObjectResolver.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Authoring/ObjectResolver.cs.meta new file mode 100644 index 00000000..a33169d2 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Authoring/ObjectResolver.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 26becd8c305c973488fa15b9ea058a00 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Authoring/ProjectPaths.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Authoring/ProjectPaths.cs new file mode 100644 index 00000000..64b9d486 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Authoring/ProjectPaths.cs @@ -0,0 +1,145 @@ +using System; +using System.IO; +using System.Linq; +using UnityEditor; +using UnityEngine; + +namespace Unity.Pipeline.Editor.Authoring +{ + /// + /// Project-path handling for authoring commands. + /// + /// - Paths resolve relative to the configurable (default "Assets"), + /// so callers can pass bare paths ("Gameplay/Enemies") without repeating the "Assets/" prefix. + /// - Explicit "Assets/..." (or "Packages/...") paths are treated as project-relative as-is. + /// - Every resolved path is confined to (the sandbox). With the + /// default root ("Assets") that means full Assets access; set a sub-folder to confine an agent. + /// - "../" traversal and writes outside the project root are always rejected. + /// + /// NOTE: minimal seed for the shared safety policy (CAT-2509). + /// + public static class ProjectPaths + { + private const string DefaultRoot = "Assets"; + + // Per-project EditorPrefs key so the root doesn't leak across projects on the same machine. + private static string PrefKey => $"Unity.Pipeline.AuthoringRoot:{Application.dataPath}"; + + /// Absolute path to the project root (the folder that contains Assets/). + public static string ProjectRoot => Path.GetDirectoryName(Application.dataPath); + + /// + /// Base folder (project-relative, under Assets/) that bare paths resolve against and that all + /// authoring writes are confined to. Defaults to "Assets". Persisted per project via EditorPrefs. + /// Setting an invalid value (outside Assets/ or containing "..") throws. + /// + public static string AuthoringRoot + { + get + { + var root = EditorPrefs.GetString(PrefKey, DefaultRoot); + return string.IsNullOrEmpty(root) ? DefaultRoot : root; + } + set + { + var normalized = NormalizeRoot(value, out var error); + if (normalized == null) + throw new ArgumentException(error); + EditorPrefs.SetString(PrefKey, normalized); + } + } + + /// Reset the authoring root to the default ("Assets"). + public static void ResetAuthoringRoot() => EditorPrefs.DeleteKey(PrefKey); + + /// + /// Resolve an agent-supplied path to a normalized, project-relative path confined to + /// . Bare paths are taken relative to the root; explicit + /// "Assets/..." paths and absolute paths under the project are honored. Returns null with an + /// when the path escapes the root or the project. + /// + public static string Resolve(string path, out string error) + { + error = null; + if (string.IsNullOrWhiteSpace(path)) + { + error = "Path is required."; + return null; + } + + var root = AuthoringRoot; + var normalized = path.Replace('\\', '/').Trim(); + + // Absolute path: must live under the project root; convert to project-relative. + if (Path.IsPathRooted(normalized)) + { + var full = Path.GetFullPath(normalized).Replace('\\', '/'); + var projectRoot = ProjectRoot.Replace('\\', '/').TrimEnd('/'); + if (!full.Equals(projectRoot, StringComparison.OrdinalIgnoreCase) && + !full.StartsWith(projectRoot + "/", StringComparison.OrdinalIgnoreCase)) + { + error = $"Path '{path}' is outside the project root '{projectRoot}'."; + return null; + } + + normalized = full.Length > projectRoot.Length ? full.Substring(projectRoot.Length + 1) : string.Empty; + } + + normalized = normalized.TrimStart('/'); + + if (normalized.Split('/').Contains("..")) + { + error = $"Path '{path}' must not contain '..'."; + return null; + } + + // Explicit project-relative paths ("Assets/..." / "Packages/...") are used as-is; anything + // else is a bare path taken relative to the authoring root. + var isProjectRelative = + normalized == "Assets" || normalized.StartsWith("Assets/", StringComparison.Ordinal) || + normalized == "Packages" || normalized.StartsWith("Packages/", StringComparison.Ordinal); + + var resolved = (isProjectRelative ? normalized : CombineUnder(root, normalized)).TrimEnd('/'); + + // Confine to the authoring root (default "Assets" => full Assets access). + if (!(resolved == root || resolved.StartsWith(root + "/", StringComparison.Ordinal))) + { + error = $"Path '{path}' resolves to '{resolved}', which is outside the authoring root '{root}'."; + return null; + } + + return resolved; + } + + private static string CombineUnder(string root, string relative) + { + relative = relative.TrimStart('/'); + return string.IsNullOrEmpty(relative) ? root : $"{root}/{relative}"; + } + + private static string NormalizeRoot(string value, out string error) + { + error = null; + if (string.IsNullOrWhiteSpace(value)) + { + error = "Authoring root is required."; + return null; + } + + var normalized = value.Replace('\\', '/').Trim().TrimStart('/').TrimEnd('/'); + if (normalized.Split('/').Contains("..")) + { + error = $"Authoring root '{value}' must not contain '..'."; + return null; + } + + if (!(normalized == "Assets" || normalized.StartsWith("Assets/", StringComparison.Ordinal))) + { + error = $"Authoring root '{value}' must be under the project's Assets/ folder."; + return null; + } + + return normalized; + } + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Authoring/ProjectPaths.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Authoring/ProjectPaths.cs.meta new file mode 100644 index 00000000..528dcdfb --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Authoring/ProjectPaths.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 462c39b6cec1060408ca75a32bf31d89 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/BuildProcessors.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/BuildProcessors.meta new file mode 100644 index 00000000..b17ac39c --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/BuildProcessors.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6a4d02bf29da41d499ea151c638ee920 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/BuildProcessors/PipelineRuntimeBuildProcessor.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/BuildProcessors/PipelineRuntimeBuildProcessor.cs new file mode 100644 index 00000000..c29c037f --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/BuildProcessors/PipelineRuntimeBuildProcessor.cs @@ -0,0 +1,266 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Security.Cryptography; +using System.Text; +using UnityEngine; +using UnityEditor; +using UnityEditor.Build; +using UnityEditor.Build.Reporting; +using UnityEngine.SceneManagement; +using UnityEditor.SceneManagement; + +namespace Unity.Pipeline.Editor.BuildProcessors +{ + /// + /// Build processor for runtime Pipeline support. Two responsibilities: + /// - Validates RuntimePipelineManager components in build scenes (security settings) before + /// allowing builds with runtime Pipeline enabled. + /// - Bakes the project's hot reload scope (Assets + loaded package locations) into the manager + /// in each build scene. A running Player cannot resolve the project layout, so the absolute + /// roots it is allowed to hot reload from must be captured at build time. + /// Components control their behavior directly without conditional compilation. + /// +#if UNITY_6000_3_OR_NEWER + public class PipelineRuntimeBuildProcessor : IPreprocessBuildWithContext, IProcessSceneWithReport +#else + public class PipelineRuntimeBuildProcessor : IPreprocessBuildWithReport, IProcessSceneWithReport +#endif + { + public int callbackOrder => 0; + +#if UNITY_6000_3_OR_NEWER + public void OnPreprocessBuild(BuildCallbackContext ctx) +#else + public void OnPreprocessBuild(BuildReport report) +#endif + { + // Integrity gate: fail the build if a bundled Roslyn DLL was swapped or modified. + VerifyBundledChecksums(); + + // Note: this opens and closes scene which invalidate all managers. + // Find RuntimePipelineManager components in build scenes + var managers = FindRuntimeManagersInBuildScenes(); + + if (managers.Count == 0) + { + Debug.LogWarning("Pipeline: No RuntimePipelineManager components found in build scenes. Pipeline will be disabled in Player builds."); + return; + } + + if (managers.Count > 1) + { + var sceneNames = string.Join(", ", managers.Select(m => m.gameObject.scene.name + "/" + m.gameObject.name)); + Debug.LogWarning($"Pipeline: Multiple RuntimePipelineManager components found in build: {sceneNames}. Only the first enabled component will be used."); + } + + // Find enabled managers + var enabledManagers = managers.Where(m => m.enableInBuilds).ToList(); + + if (enabledManagers.Count == 0) + { + Debug.LogWarning("Pipeline: RuntimePipelineManager components found, but all have enableInBuilds = false. Pipeline will be disabled in Player builds."); + return; + } + + if (enabledManagers.Count > 1) + { + var enabledNames = string.Join(", ", enabledManagers.Select(m => m.gameObject.scene.name + "/" + m.gameObject.name)); + Debug.LogWarning($"Pipeline: Multiple enabled RuntimePipelineManager components found: {enabledNames}. Using the first one."); + } + + var activeManager = enabledManagers[0]; + + // Validate the active manager configuration + var validationResult = activeManager.ValidateConfiguration(); + + if (!validationResult.IsValid) + { + throw new BuildFailedException($"Pipeline: Runtime configuration validation failed for {activeManager.gameObject.scene.name}/{activeManager.gameObject.name}: {validationResult.Message}"); + } + + if (validationResult.Level == "warning") + { + Debug.LogWarning($"Pipeline: Runtime configuration warning for {activeManager.gameObject.scene.name}/{activeManager.gameObject.name}: {validationResult.Message}"); + + if (!EditorUserBuildSettings.development) + { + Debug.LogWarning("Pipeline: Security warnings detected in release build. Consider reviewing configuration."); + } + } + + Debug.Log($"Pipeline: Runtime server ENABLED in build for {activeManager.gameObject.scene.name}/{activeManager.gameObject.name}"); + } + + /// + /// Find all RuntimePipelineManager components in scenes that will be included in the build. + /// + private List FindRuntimeManagersInBuildScenes() + { + var managers = new List(); + + var buildScenes = EditorBuildSettings.scenes.Where(s => s.enabled).ToArray(); + + foreach (var buildScene in buildScenes) + { + var scene = EditorSceneManager.OpenScene(buildScene.path, OpenSceneMode.Additive); + + var sceneManagers = scene.GetRootGameObjects() + .SelectMany(go => go.GetComponentsInChildren(true)) + .ToArray(); + managers.AddRange(sceneManagers); + } + return managers; + } + + /// + /// Bake the project's hot reload roots into the RuntimePipelineManager of each build scene. + /// Edits the temporary build copy of the scene, so the user's saved scene is untouched. + /// + public void OnProcessScene(Scene scene, BuildReport report) + { + // report is null when this runs on entering Play Mode; only bake during real builds. + if (report == null) + { + return; + } + + var roots = CollectProjectRoots(); + + foreach (var go in scene.GetRootGameObjects()) + { + foreach (var manager in go.GetComponentsInChildren(true)) + { + manager.SetAllowedReloadRoots(roots); + } + } + } + + /// + /// Absolute roots considered in-scope for runtime hot reload: the project's Assets folder + /// plus the resolved location of every package loaded into the project (a local package may + /// live anywhere on disk, not only under Packages). + /// + public static List CollectProjectRoots() + { + var roots = new List { Path.GetFullPath(Application.dataPath) }; + + foreach (var package in UnityEditor.PackageManager.PackageInfo.GetAllRegisteredPackages()) + { + if (!string.IsNullOrEmpty(package.resolvedPath)) + { + roots.Add(Path.GetFullPath(package.resolvedPath)); + } + } + + return roots; + } + + // Relative location of the bundled Roslyn DLLs + their integrity manifest within the package. + private const string CodeAnalysisRelDir = "Runtime/Plugins/CodeAnalysis"; + private const string ChecksumsFileName = "CHECKSUMS"; + + /// + /// Verify the bundled Roslyn DLLs against the committed CHECKSUMS manifest, locating them + /// relative to this package on disk. Throws on any + /// mismatch so a tampered/swapped DLL cannot be built into a player. + /// + public static void VerifyBundledChecksums() + { + var packageInfo = UnityEditor.PackageManager.PackageInfo.FindForAssembly( + typeof(PipelineRuntimeBuildProcessor).Assembly); + + if (packageInfo == null || string.IsNullOrEmpty(packageInfo.resolvedPath)) + { + throw new BuildFailedException( + "Pipeline: could not locate the com.unity.pipeline package on disk to verify " + + "bundled Roslyn DLL integrity. Aborting build."); + } + + var codeAnalysisDir = Path.Combine(packageInfo.resolvedPath, CodeAnalysisRelDir); + var checksumsPath = Path.Combine(codeAnalysisDir, ChecksumsFileName); + + var error = VerifyChecksums(codeAnalysisDir, checksumsPath); + if (error != null) + { + throw new BuildFailedException($"Pipeline: bundled Roslyn DLL integrity check failed. {error}"); + } + } + + /// + /// Core, side-effect-free integrity check (so it is directly unit-testable). Returns null + /// when every DLL listed in exists under + /// with a matching SHA-256 and no unlisted DLL is present; + /// otherwise returns a human-readable error describing the first problem found. + /// + public static string VerifyChecksums(string codeAnalysisDir, string checksumsPath) + { + if (!Directory.Exists(codeAnalysisDir)) + return $"DLL directory not found: {codeAnalysisDir}"; + if (!File.Exists(checksumsPath)) + return $"CHECKSUMS manifest not found: {checksumsPath}"; + + var expected = ParseChecksums(checksumsPath); + if (expected.Count == 0) + return $"CHECKSUMS manifest has no entries: {checksumsPath}"; + + // Every listed DLL must exist and match. + foreach (var entry in expected) + { + var dllPath = Path.Combine(codeAnalysisDir, entry.Key); + if (!File.Exists(dllPath)) + return $"listed DLL is missing: {entry.Key}"; + + var actual = ComputeSha256(dllPath); + if (!string.Equals(actual, entry.Value, StringComparison.OrdinalIgnoreCase)) + return $"hash mismatch for {entry.Key} (expected {entry.Value}, got {actual})"; + } + + // No unlisted DLL may sit alongside them (guards against an injected extra assembly). + foreach (var dllPath in Directory.GetFiles(codeAnalysisDir, "*.dll")) + { + var name = Path.GetFileName(dllPath); + if (!expected.ContainsKey(name)) + return $"unexpected DLL not listed in CHECKSUMS: {name}"; + } + + return null; + } + + /// SHA-256 of a file as a lowercase hex string. + public static string ComputeSha256(string filePath) + { + using (var sha = SHA256.Create()) + using (var stream = File.OpenRead(filePath)) + { + var hash = sha.ComputeHash(stream); + var sb = new StringBuilder(hash.Length * 2); + foreach (var b in hash) + sb.Append(b.ToString("x2")); + return sb.ToString(); + } + } + + // Parse " # comment" lines, skipping blanks and '#' comment lines. + private static Dictionary ParseChecksums(string checksumsPath) + { + var result = new Dictionary(StringComparer.OrdinalIgnoreCase); + + foreach (var raw in File.ReadAllLines(checksumsPath)) + { + var line = raw.Trim(); + if (line.Length == 0 || line.StartsWith("#")) + continue; + + var tokens = line.Split(new[] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries); + if (tokens.Length < 2) + continue; + + result[tokens[1]] = tokens[0]; + } + + return result; + } + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/BuildProcessors/PipelineRuntimeBuildProcessor.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/BuildProcessors/PipelineRuntimeBuildProcessor.cs.meta new file mode 100644 index 00000000..acd03295 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/BuildProcessors/PipelineRuntimeBuildProcessor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 50df0b5c45692fb4a81122ca6eec4709 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands.meta new file mode 100644 index 00000000..0316bec0 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e52bfc361c2ed7846a3c4c69b24828c5 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Animation.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Animation.meta new file mode 100644 index 00000000..e98352ae --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Animation.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 881bcacc155b44229761a2e2b2917fae +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Animation/AnimationClipCommands.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Animation/AnimationClipCommands.cs new file mode 100644 index 00000000..067cb5a8 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Animation/AnimationClipCommands.cs @@ -0,0 +1,423 @@ +using System; +using System.Collections.Generic; +using System.IO; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using Unity.Pipeline.Commands; +using Unity.Pipeline.Editor.Authoring; +using Unity.Pipeline.Editor.Commands.GameObjects; +using Unity.Pipeline.Models; +using UnityEditor; +using UnityEngine; + +namespace Unity.Pipeline.Editor.Commands.Animation +{ + /// + /// Group A of CLI-214: author assets and their float curves. + /// + /// These sit on the CLI-190 authoring foundation, so: + /// - every agent-supplied asset path is funnelled through + /// (sandboxed to the authoring root), + /// - an existing clip is addressed with an resolved by + /// and re-confined to the authoring root, + /// - destructive/overwriting operations require an explicit confirm argument and every + /// command supports dry_run. + /// + /// NOTE: AnimationClip sub-object edits (curves, clip settings) are NOT covered by Unity's Undo, + /// so changes are persisted with + + /// rather than wrapped in an . Only float curves are supported in + /// v1 (object-reference / PPtr curves are out of scope). + /// + public static class AnimationClipCommands + { + [CliCommand("create_animation_clip", + "Create an empty .anim AnimationClip asset under the authoring root, with an optional frame rate and loop flag.", + MainThreadRequired = true)] + public static AuthoringResult CreateAnimationClip( + [CliArg("path", "Asset path ending in .anim, relative to the authoring root. The Assets/ prefix is optional.", Required = true)] string path, + [CliArg("frameRate", "Sampling frame rate of the clip (default 60).")] float frameRate = 60f, + [CliArg("loop", "If true, set the clip's loop-time flag in its AnimationClipSettings (default false).")] bool loop = false, + [CliArg("confirm", "Required (true) only when overwriting an existing asset at the path.")] bool confirm = false, + [CliArg("dry_run", "If true, validate inputs and report what would be created without writing anything.")] bool dryRun = false) + { + var normalized = ProjectPaths.Resolve(path, out var error); + if (normalized == null) + throw new ArgumentException(error); + + if (!string.Equals(Path.GetExtension(normalized), ".anim", StringComparison.OrdinalIgnoreCase)) + throw new ArgumentException($"Animation clip path '{normalized}' must end in .anim."); + + if (frameRate <= 0f) + throw new ArgumentException($"frameRate must be positive (got {frameRate})."); + + var exists = AssetDatabase.LoadMainAssetAtPath(normalized) != null; + if (exists && !confirm) + throw new ArgumentException($"An asset already exists at '{normalized}'. Pass confirm=true to overwrite it."); + + if (dryRun) + return new AuthoringResult { AssetPath = normalized, Type = nameof(AnimationClip) }; + + EnsureParentFolder(normalized); + + var clip = new AnimationClip { frameRate = frameRate }; + + var settings = AnimationUtility.GetAnimationClipSettings(clip); + settings.loopTime = loop; + AnimationUtility.SetAnimationClipSettings(clip, settings); + + // CreateAsset does not reliably overwrite, so remove an existing asset first (the confirm + // guard above gates that one already exists). + if (exists) + AssetDatabase.DeleteAsset(normalized); + + AssetDatabase.CreateAsset(clip, normalized); + EditorUtility.SetDirty(clip); + AssetDatabase.SaveAssets(); + AssetDatabase.ImportAsset(normalized); + + var loaded = AssetDatabase.LoadMainAssetAtPath(normalized); + var result = ObjectResolver.Describe(loaded) ?? new AuthoringResult { Type = nameof(AnimationClip) }; + result.AssetPath = normalized; + return result; + } + + [CliCommand("set_animation_curve", + "Add or replace a single float curve binding on an AnimationClip (via AnimationUtility.SetEditorCurve). " + + "Replacing an existing binding overwrites it rather than duplicating.", + MainThreadRequired = true)] + public static SetAnimationCurveResult SetAnimationCurve( + [CliArg("clip", "Reference to the AnimationClip to edit (path / guid / globalId).", Required = true)] ObjectRef clip, + [CliArg("path", "GameObject path relative to the animated root the property lives on. Empty string (default) targets the root.")] string path = "", + [CliArg("type", "Component type the property lives on, e.g. \"Transform\", \"UnityEngine.Light\". Resolved via the component TypeResolver.", Required = true)] string type = null, + [CliArg("property", "Curve property name, e.g. \"m_LocalPosition.x\", \"m_LocalScale.y\", \"localEulerAnglesRaw.z\".", Required = true)] string property = null, + [CliArg("keys", "Keyframes: [{ time, value, inTangent?, outTangent?, weightedMode?: \"None\"|\"In\"|\"Out\"|\"Both\" }]. Omitted tangents default to 0 (flat); this is NOT Unity's Auto tangent mode.", Required = true)] JArray keys = null, + [CliArg("dry_run", "If true, validate type/property/keys without writing the curve.")] bool dryRun = false) + { + var (clipAsset, clipPath) = ResolveClip(clip); + var componentType = ResolveCurveType(type); + if (string.IsNullOrWhiteSpace(property)) + throw new ArgumentException("property is required."); + + var bindingPath = path ?? string.Empty; + var curve = BuildCurve(keys, out var keyCount); + + var result = new SetAnimationCurveResult + { + AssetPath = clipPath, + Type = nameof(AnimationClip), + Binding = new CurveBinding { Path = bindingPath, Type = componentType.Name, Property = property }, + KeyCount = keyCount + }; + + if (dryRun) + return result; + + var binding = EditorCurveBinding.FloatCurve(bindingPath, componentType, property); + AnimationUtility.SetEditorCurve(clipAsset, binding, curve); + + EditorUtility.SetDirty(clipAsset); + AssetDatabase.SaveAssets(); + + var described = ObjectResolver.Describe(clipAsset); + if (described != null) + { + result.Guid = described.Guid; + result.FileId = described.FileId; + result.GlobalId = described.GlobalId; + } + + return result; + } + + [CliCommand("get_animation_clip", + "Read an AnimationClip's metadata and all float curve bindings (optionally with keyframes).", + MainThreadRequired = true)] + public static AnimationClipInfo GetAnimationClip( + [CliArg("clip", "Reference to the AnimationClip to read (path / guid / globalId).", Required = true)] ObjectRef clip, + [CliArg("includeKeys", "If true, include each binding's keyframes (default false).")] bool includeKeys = false) + { + var (clipAsset, clipPath) = ResolveClip(clip); + + var settings = AnimationUtility.GetAnimationClipSettings(clipAsset); + var info = new AnimationClipInfo + { + AssetPath = clipPath, + FrameRate = clipAsset.frameRate, + Length = clipAsset.length, + Loop = settings.loopTime + }; + + foreach (var binding in AnimationUtility.GetCurveBindings(clipAsset)) + { + var curve = AnimationUtility.GetEditorCurve(clipAsset, binding); + var keyCount = curve?.length ?? 0; + + var entry = new CurveBindingInfo + { + Path = binding.path, + Type = binding.type != null ? binding.type.Name : null, + Property = binding.propertyName, + KeyCount = keyCount + }; + + if (includeKeys && curve != null) + { + entry.Keys = new List(keyCount); + foreach (var key in curve.keys) + { + entry.Keys.Add(new KeyframeInfo + { + Time = key.time, + Value = key.value, + InTangent = key.inTangent, + OutTangent = key.outTangent + }); + } + } + + info.Bindings.Add(entry); + } + + return info; + } + + [CliCommand("remove_animation_curve", + "Remove a float curve binding from an AnimationClip (SetEditorCurve(clip, binding, null)). Destructive: requires confirm=true.", + MainThreadRequired = true)] + public static SetAnimationCurveResult RemoveAnimationCurve( + [CliArg("clip", "Reference to the AnimationClip to edit (path / guid / globalId).", Required = true)] ObjectRef clip, + [CliArg("path", "GameObject path relative to the animated root the binding lives on. Empty string (default) targets the root.")] string path = "", + [CliArg("type", "Component type of the binding to remove, e.g. \"Transform\". Resolved via the component TypeResolver.", Required = true)] string type = null, + [CliArg("property", "Curve property name to remove, e.g. \"m_LocalPosition.x\".", Required = true)] string property = null, + [CliArg("confirm", "Must be true to actually remove the binding (destructive guard).")] bool confirm = false, + [CliArg("dry_run", "If true, report the binding that would be removed without removing it.")] bool dryRun = false) + { + var (clipAsset, clipPath) = ResolveClip(clip); + var componentType = ResolveCurveType(type); + if (string.IsNullOrWhiteSpace(property)) + throw new ArgumentException("property is required."); + + var bindingPath = path ?? string.Empty; + var binding = EditorCurveBinding.FloatCurve(bindingPath, componentType, property); + var existing = AnimationUtility.GetEditorCurve(clipAsset, binding); + if (existing == null) + throw new ArgumentException( + $"No curve binding for path='{bindingPath}', type='{componentType.Name}', property='{property}' on '{clipPath}'."); + + var keyCount = existing.length; + var result = new SetAnimationCurveResult + { + AssetPath = clipPath, + Type = nameof(AnimationClip), + Binding = new CurveBinding { Path = bindingPath, Type = componentType.Name, Property = property }, + KeyCount = keyCount + }; + + if (dryRun) + return result; + + if (!confirm) + throw new ArgumentException( + $"Refusing to remove curve '{property}' from '{clipPath}'. Pass confirm=true (destructive, not undoable via Unity's Undo)."); + + AnimationUtility.SetEditorCurve(clipAsset, binding, null); + EditorUtility.SetDirty(clipAsset); + AssetDatabase.SaveAssets(); + + return result; + } + + /// + /// Resolve a clip handle to a loaded and its sandbox-confined asset + /// path, rejecting handles that don't point at an on-disk AnimationClip or that escape the root. + /// + private static (AnimationClip clip, string path) ResolveClip(ObjectRef clip) + { + if (clip == null || clip.IsEmpty) + throw new ArgumentException("clip is required."); + + if (!ObjectResolver.TryResolve(clip, out var obj, out var error)) + throw new ArgumentException(error); + + if (!(obj is AnimationClip clipAsset)) + throw new ArgumentException($"Reference '{clip}' resolved to a {obj.GetType().Name}, not an AnimationClip."); + + var assetPath = AssetDatabase.GetAssetPath(clipAsset); + if (string.IsNullOrEmpty(assetPath)) + throw new ArgumentException($"Reference '{clip}' does not point at an on-disk AnimationClip."); + + var confined = ProjectPaths.Resolve(assetPath, out var confineError); + if (confined == null) + throw new ArgumentException( + $"Clip '{assetPath}' is outside the authoring root '{ProjectPaths.AuthoringRoot}': {confineError}"); + + return (clipAsset, confined); + } + + /// + /// Resolve a curve-binding component type. Reuses the component , + /// which only accepts subclasses (curves bind to component properties). + /// + private static Type ResolveCurveType(string type) + { + if (string.IsNullOrWhiteSpace(type)) + throw new ArgumentException("type is required."); + + var resolved = TypeResolver.ResolveComponentType(type); + if (resolved == null) + throw new ArgumentException( + $"Could not resolve component type '{type}'. Use a short name (e.g. Transform) or a fully-qualified name (e.g. UnityEngine.Light)."); + + return resolved; + } + + /// Build an from the agent-supplied keyframe array. + private static AnimationCurve BuildCurve(JArray keys, out int keyCount) + { + if (keys == null || keys.Count == 0) + throw new ArgumentException("keys must be a non-empty array of { time, value, ... }."); + + var keyframes = new List(keys.Count); + foreach (var token in keys) + { + if (!(token is JObject keyObj)) + throw new ArgumentException("Each key must be an object: { time, value, inTangent?, outTangent?, weightedMode? }."); + + if (keyObj["time"] == null || keyObj["value"] == null) + throw new ArgumentException("Each key requires a 'time' and a 'value'."); + + var time = keyObj["time"].ToObject(); + var value = keyObj["value"].ToObject(); + var inTangent = keyObj["inTangent"]?.ToObject() ?? 0f; + var outTangent = keyObj["outTangent"]?.ToObject() ?? 0f; + + var keyframe = new Keyframe(time, value, inTangent, outTangent); + + var weightedToken = keyObj["weightedMode"]; + if (weightedToken != null && weightedToken.Type != JTokenType.Null) + { + var name = weightedToken.ToObject(); + if (!Enum.TryParse(name, ignoreCase: true, out var weightedMode)) + throw new ArgumentException($"Unknown weightedMode '{name}'. Use None | In | Out | Both."); + keyframe.weightedMode = weightedMode; + } + + keyframes.Add(keyframe); + } + + keyCount = keyframes.Count; + return new AnimationCurve(keyframes.ToArray()); + } + + /// Create the asset's parent folder chain if it does not yet exist. + private static void EnsureParentFolder(string assetPath) + { + var parent = Path.GetDirectoryName(assetPath)?.Replace('\\', '/'); + if (string.IsNullOrEmpty(parent) || AssetDatabase.IsValidFolder(parent)) + return; + + CreateFolderRecursive(parent); + } + + private static void CreateFolderRecursive(string assetsPath) + { + if (AssetDatabase.IsValidFolder(assetsPath)) + return; + + var parent = Path.GetDirectoryName(assetsPath)?.Replace('\\', '/'); + var name = Path.GetFileName(assetsPath); + if (string.IsNullOrEmpty(parent) || string.IsNullOrEmpty(name)) + throw new ArgumentException($"Invalid folder path '{assetsPath}'."); + + if (!AssetDatabase.IsValidFolder(parent)) + CreateFolderRecursive(parent); + + AssetDatabase.CreateFolder(parent, name); + } + } + + /// + /// Result of set_animation_curve / remove_animation_curve: the clip identity extended + /// with the affected binding and its key count. + /// + [Serializable] + public class SetAnimationCurveResult : AuthoringResult + { + [JsonProperty("binding")] + public CurveBinding Binding { get; set; } + + [JsonProperty("keyCount")] + public int KeyCount { get; set; } + } + + /// A curve binding's address: GameObject path, component type, and property name. + [Serializable] + public class CurveBinding + { + [JsonProperty("path")] + public string Path { get; set; } + + [JsonProperty("type")] + public string Type { get; set; } + + [JsonProperty("property")] + public string Property { get; set; } + } + + /// Result of get_animation_clip: clip metadata and its curve bindings. + [Serializable] + public class AnimationClipInfo + { + [JsonProperty("assetPath")] + public string AssetPath { get; set; } + + [JsonProperty("frameRate")] + public float FrameRate { get; set; } + + [JsonProperty("length")] + public float Length { get; set; } + + [JsonProperty("loop")] + public bool Loop { get; set; } + + [JsonProperty("bindings")] + public List Bindings { get; set; } = new List(); + } + + /// A single curve binding in , optionally with its keys. + [Serializable] + public class CurveBindingInfo + { + [JsonProperty("path")] + public string Path { get; set; } + + [JsonProperty("type")] + public string Type { get; set; } + + [JsonProperty("property")] + public string Property { get; set; } + + [JsonProperty("keyCount")] + public int KeyCount { get; set; } + + [JsonProperty("keys", NullValueHandling = NullValueHandling.Ignore)] + public List Keys { get; set; } + } + + /// A single keyframe in a curve binding. + [Serializable] + public class KeyframeInfo + { + [JsonProperty("time")] + public float Time { get; set; } + + [JsonProperty("value")] + public float Value { get; set; } + + [JsonProperty("inTangent")] + public float InTangent { get; set; } + + [JsonProperty("outTangent")] + public float OutTangent { get; set; } + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Animation/AnimationClipCommands.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Animation/AnimationClipCommands.cs.meta new file mode 100644 index 00000000..c5d610e2 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Animation/AnimationClipCommands.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 764503eaf79a41668748014af111eaf2 diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Animation/AnimatorControllerCommands.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Animation/AnimatorControllerCommands.cs new file mode 100644 index 00000000..86b1b64d --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Animation/AnimatorControllerCommands.cs @@ -0,0 +1,885 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using Unity.Pipeline.Commands; +using Unity.Pipeline.Editor.Authoring; +using Unity.Pipeline.Models; +using UnityEditor; +using UnityEditor.Animations; +using UnityEngine; + +namespace Unity.Pipeline.Editor.Commands.Animation +{ + /// + /// Group B of CLI-214: author assets — layers, parameters, states + /// and transitions. Built on UnityEditor.Animations, which is part of the Editor (no extra + /// package), so the types are referenced directly. + /// + /// Like the animation-clip commands, paths/handles are sandbox-confined via + /// / , and every command supports + /// dry_run. Some AnimatorController API calls register Undo internally, but sub-object edits + /// are not reliably undoable, so changes are persisted with + + /// . + /// + /// Out of scope (v1): BlendTree authoring (assigning an EXISTING BlendTree as a state motion is + /// allowed), StateMachineBehaviours, sub-state machines, and humanoid/avatar configuration. + /// + public static class AnimatorControllerCommands + { + [CliCommand("create_animator_controller", + "Create an .controller AnimatorController asset (with a default Base Layer) under the authoring root.", + MainThreadRequired = true)] + public static AuthoringResult CreateAnimatorController( + [CliArg("path", "Asset path ending in .controller, relative to the authoring root. The Assets/ prefix is optional.", Required = true)] string path, + [CliArg("confirm", "Required (true) only when overwriting an existing asset at the path.")] bool confirm = false, + [CliArg("dry_run", "If true, validate inputs and report what would be created without writing anything.")] bool dryRun = false) + { + var normalized = ProjectPaths.Resolve(path, out var error); + if (normalized == null) + throw new ArgumentException(error); + + if (!string.Equals(Path.GetExtension(normalized), ".controller", StringComparison.OrdinalIgnoreCase)) + throw new ArgumentException($"Animator controller path '{normalized}' must end in .controller."); + + var exists = AssetDatabase.LoadMainAssetAtPath(normalized) != null; + if (exists && !confirm) + throw new ArgumentException($"An asset already exists at '{normalized}'. Pass confirm=true to overwrite it."); + + if (dryRun) + return new AuthoringResult { AssetPath = normalized, Type = nameof(AnimatorController) }; + + EnsureParentFolder(normalized); + + if (exists) + AssetDatabase.DeleteAsset(normalized); + + // CreateAnimatorControllerAtPath creates the asset on disk WITH a default "Base Layer". + var controller = AnimatorController.CreateAnimatorControllerAtPath(normalized); + EditorUtility.SetDirty(controller); + AssetDatabase.SaveAssets(); + + var loaded = AssetDatabase.LoadMainAssetAtPath(normalized); + var result = ObjectResolver.Describe(loaded) ?? new AuthoringResult { Type = nameof(AnimatorController) }; + result.AssetPath = normalized; + return result; + } + + [CliCommand("add_animator_parameter", + "Add a parameter (Float | Int | Bool | Trigger) to an AnimatorController. A duplicate name returns code 'duplicate_parameter'.", + MainThreadRequired = true)] + public static object AddAnimatorParameter( + [CliArg("controller", "Reference to the AnimatorController to edit (path / guid / globalId).", Required = true)] ObjectRef controller, + [CliArg("name", "Parameter name.", Required = true)] string name, + [CliArg("type", "Parameter type: Float | Int | Bool | Trigger.", Required = true)] string type = null, + [CliArg("defaultValue", "Default value for Float/Int/Bool (ignored for Trigger).")] JToken defaultValue = null, + [CliArg("dry_run", "If true, validate inputs without writing the parameter.")] bool dryRun = false) + { + var (ctrl, ctrlPath) = ResolveController(controller); + if (string.IsNullOrWhiteSpace(name)) + throw new ArgumentException("name is required."); + + var paramType = ParseParameterType(type); + + if (ctrl.parameters.Any(p => p.name == name)) + return ErrorResult.PackageStyle("duplicate_parameter", $"A parameter named '{name}' already exists on '{ctrlPath}'."); + + // Resolve (and validate) the default value up front so dry_run also fails on a bad value. + float defFloat = 0f; + int defInt = 0; + bool defBool = false; + switch (paramType) + { + case AnimatorControllerParameterType.Float: + if (defaultValue != null && defaultValue.Type != JTokenType.Null) defFloat = defaultValue.ToObject(); + break; + case AnimatorControllerParameterType.Int: + if (defaultValue != null && defaultValue.Type != JTokenType.Null) defInt = defaultValue.ToObject(); + break; + case AnimatorControllerParameterType.Bool: + if (defaultValue != null && defaultValue.Type != JTokenType.Null) defBool = defaultValue.ToObject(); + break; + } + + var result = new AddParameterResult + { + AssetPath = ctrlPath, + Type = nameof(AnimatorController), + Parameter = new ParameterInfo + { + Name = name, + ParamType = paramType.ToString(), + DefaultValue = DefaultValueToken(paramType, defFloat, defInt, defBool) + } + }; + + if (dryRun) + return result; + + var parameter = new AnimatorControllerParameter + { + name = name, + type = paramType, + defaultFloat = defFloat, + defaultInt = defInt, + defaultBool = defBool + }; + ctrl.AddParameter(parameter); + + Persist(ctrl); + FillIdentity(result, ctrl); + return result; + } + + [CliCommand("add_animator_layer", + "Add a layer to an AnimatorController.", + MainThreadRequired = true)] + public static object AddAnimatorLayer( + [CliArg("controller", "Reference to the AnimatorController to edit (path / guid / globalId).", Required = true)] ObjectRef controller, + [CliArg("name", "Layer name.", Required = true)] string name, + [CliArg("weight", "Layer weight (default 1).")] float weight = 1f, + [CliArg("blendingMode", "Blending mode: Override | Additive (default Override).")] string blendingMode = "Override", + [CliArg("dry_run", "If true, validate inputs without writing the layer.")] bool dryRun = false) + { + var (ctrl, ctrlPath) = ResolveController(controller); + if (string.IsNullOrWhiteSpace(name)) + throw new ArgumentException("name is required."); + + if (!Enum.TryParse(blendingMode, ignoreCase: true, out var mode)) + throw new ArgumentException($"Unknown blendingMode '{blendingMode}'. Use Override | Additive."); + + var index = ctrl.layers.Length; + var result = new AddLayerResult + { + AssetPath = ctrlPath, + Type = nameof(AnimatorController), + Layer = new LayerSummary { Name = name, Index = index, Weight = weight } + }; + + if (dryRun) + return result; + + // AddLayer(name) appends a layer with a fresh state machine. We then set its weight/blending + // by writing the layer array back (AnimatorControllerLayer is a value-like wrapper, so the + // edited copy must be reassigned). + ctrl.AddLayer(name); + var layers = ctrl.layers; + layers[index].defaultWeight = weight; + layers[index].blendingMode = mode; + ctrl.layers = layers; + + Persist(ctrl); + FillIdentity(result, ctrl); + return result; + } + + [CliCommand("add_animator_state", + "Add a state to a layer, optionally with a motion (AnimationClip or BlendTree) and as the layer default. " + + "A layer name with no match returns code 'layer_not_found'.", + MainThreadRequired = true)] + public static object AddAnimatorState( + [CliArg("controller", "Reference to the AnimatorController to edit (path / guid / globalId).", Required = true)] ObjectRef controller, + [CliArg("layer", "Layer index (int) or name (string). Default 0 (Base Layer).")] JToken layer = null, + [CliArg("name", "State name.", Required = true)] string name = null, + [CliArg("motion", "Optional AnimationClip or BlendTree asset to assign as the state's motion.")] ObjectRef motion = null, + [CliArg("isDefault", "If true, set this state as the layer's default state.")] bool isDefault = false, + [CliArg("position", "Optional [x, y] node position in the graph (cosmetic).")] JArray position = null, + [CliArg("dry_run", "If true, validate inputs without writing the state.")] bool dryRun = false) + { + var (ctrl, ctrlPath) = ResolveController(controller); + if (string.IsNullOrWhiteSpace(name)) + throw new ArgumentException("name is required."); + + if (!TryResolveLayer(ctrl, layer, out var layerIndex, out var layerError)) + return ErrorResult.PackageStyle("layer_not_found", layerError); + + // Resolve an optional motion. Only AnimationClip / Motion (BlendTree derives from Motion) are + // valid. A handle that doesn't resolve to a Motion is a clear error. + UnityEngine.Motion resolvedMotion = null; + if (motion != null && !motion.IsEmpty) + { + if (!ObjectResolver.TryResolve(motion, out var motionObj, out var motionError)) + throw new ArgumentException($"Could not resolve motion: {motionError}"); + resolvedMotion = motionObj as UnityEngine.Motion; + if (resolvedMotion == null) + throw new ArgumentException($"Motion reference '{motion}' resolved to a {motionObj.GetType().Name}, not an AnimationClip or BlendTree."); + + // Re-confine the motion to the authoring root: a restricted root must not be bypassed by + // referencing an AnimationClip/BlendTree that lives outside the sandbox. + ConfineToAuthoringRoot(resolvedMotion, "Motion", motion); + } + + Vector3? nodePosition = null; + if (position != null && position.Count > 0) + { + if (position.Count < 2) + throw new ArgumentException("position must be [x, y]."); + nodePosition = new Vector3(position[0].ToObject(), position[1].ToObject(), 0f); + } + + var result = new AddStateResult + { + AssetPath = ctrlPath, + Type = nameof(AnimatorController), + State = new StateSummary + { + Name = name, + Layer = layerIndex, + HasMotion = resolvedMotion != null, + IsDefault = isDefault + } + }; + + if (dryRun) + return result; + + var stateMachine = ctrl.layers[layerIndex].stateMachine; + var state = nodePosition.HasValue + ? stateMachine.AddState(name, nodePosition.Value) + : stateMachine.AddState(name); + + if (resolvedMotion != null) + state.motion = resolvedMotion; + + if (isDefault) + stateMachine.defaultState = state; + + Persist(ctrl); + FillIdentity(result, ctrl); + return result; + } + + [CliCommand("add_animator_transition", + "Add a transition between two states (or from AnyState/Entry, to Exit) on a layer, with optional conditions. " + + "Validates that the states exist and each condition's parameter exists and its mode matches the parameter type.", + MainThreadRequired = true)] + public static object AddAnimatorTransition( + [CliArg("controller", "Reference to the AnimatorController to edit (path / guid / globalId).", Required = true)] ObjectRef controller, + [CliArg("layer", "Layer index (int) or name (string). Default 0 (Base Layer).")] JToken layer = null, + [CliArg("fromState", "Source state name, or the special \"AnyState\" / \"Entry\".", Required = true)] string fromState = null, + [CliArg("toState", "Destination state name, or the special \"Exit\".", Required = true)] string toState = null, + [CliArg("conditions", "Optional conditions: [{ parameter, mode: \"If\"|\"IfNot\"|\"Greater\"|\"Less\"|\"Equals\"|\"NotEqual\", threshold? }].")] JArray conditions = null, + [CliArg("hasExitTime", "If true, the transition uses exit time (default false).")] bool hasExitTime = false, + [CliArg("exitTime", "Normalized exit time (0..1) when hasExitTime is set.")] float exitTime = 0f, + [CliArg("duration", "Transition duration in seconds (default 0.25).")] float duration = 0.25f, + [CliArg("hasFixedDuration", "If true, duration is in seconds; otherwise normalized (default true).")] bool hasFixedDuration = true, + [CliArg("dry_run", "If true, validate everything (states, parameters, mode/type) without writing the transition.")] bool dryRun = false) + { + var (ctrl, ctrlPath) = ResolveController(controller); + if (string.IsNullOrWhiteSpace(fromState)) + throw new ArgumentException("fromState is required."); + if (string.IsNullOrWhiteSpace(toState)) + throw new ArgumentException("toState is required."); + + // exitTime is normalized (0..1) and only meaningful with hasExitTime; duration must be + // non-negative. Reject out-of-range values up front (writing nothing) rather than letting + // Unity clamp them unpredictably. + if (hasExitTime && (exitTime < 0f || exitTime > 1f)) + throw new ArgumentException($"exitTime must be in [0, 1] when hasExitTime is set (got {exitTime})."); + if (duration < 0f) + throw new ArgumentException($"duration must be >= 0 (got {duration})."); + + if (!TryResolveLayer(ctrl, layer, out var layerIndex, out var layerError)) + return ErrorResult.PackageStyle("layer_not_found", layerError); + + var stateMachine = ctrl.layers[layerIndex].stateMachine; + + const string AnyState = "AnyState"; + const string Entry = "Entry"; + const string Exit = "Exit"; + + var fromIsAny = string.Equals(fromState, AnyState, StringComparison.OrdinalIgnoreCase); + var fromIsEntry = string.Equals(fromState, Entry, StringComparison.OrdinalIgnoreCase); + var toIsExit = string.Equals(toState, Exit, StringComparison.OrdinalIgnoreCase); + + // Resolve the source state (unless it's AnyState/Entry, which are nodes on the machine). + AnimatorState fromAnimState = null; + if (!fromIsAny && !fromIsEntry) + { + fromAnimState = FindState(stateMachine, fromState); + if (fromAnimState == null) + throw new ArgumentException($"Source state '{fromState}' not found in layer {layerIndex}."); + } + + // Resolve the destination state (unless it's Exit). + AnimatorState toAnimState = null; + if (!toIsExit) + { + toAnimState = FindState(stateMachine, toState); + if (toAnimState == null) + throw new ArgumentException($"Destination state '{toState}' not found in layer {layerIndex}."); + } + + // Entry transitions cannot carry conditions/exit-time the same way; restrict combinations the + // engine forbids so an agent gets a clear error rather than a malformed transition. + if (fromIsEntry && toIsExit) + throw new ArgumentException("A transition from Entry directly to Exit is not supported."); + + // Validate conditions BEFORE creating anything (so a bad condition writes nothing). + var parsedConditions = ParseConditions(conditions, ctrl); + + var result = new AddTransitionResult + { + AssetPath = ctrlPath, + Type = nameof(AnimatorController), + Transition = new TransitionSummary + { + From = fromState, + To = toState, + ConditionCount = parsedConditions.Count + } + }; + + if (dryRun) + return result; + + // Create the transition node matching the from/to kinds. + AnimatorStateTransition stateTransition = null; + AnimatorTransition entryTransition = null; + + if (fromIsEntry) + { + // Entry -> state. Entry transitions are plain AnimatorTransition (no exit time/duration). + entryTransition = stateMachine.AddEntryTransition(toAnimState); + } + else if (fromIsAny) + { + stateTransition = toIsExit ? null : stateMachine.AddAnyStateTransition(toAnimState); + if (stateTransition == null) + throw new ArgumentException("An AnyState transition to Exit is not supported."); + } + else + { + stateTransition = toIsExit + ? fromAnimState.AddExitTransition() + : fromAnimState.AddTransition(toAnimState); + } + + if (stateTransition != null) + { + stateTransition.hasExitTime = hasExitTime; + stateTransition.exitTime = exitTime; + stateTransition.hasFixedDuration = hasFixedDuration; + stateTransition.duration = duration; + foreach (var c in parsedConditions) + stateTransition.AddCondition(c.Mode, c.Threshold, c.Parameter); + } + else if (entryTransition != null) + { + foreach (var c in parsedConditions) + entryTransition.AddCondition(c.Mode, c.Threshold, c.Parameter); + } + + Persist(ctrl); + FillIdentity(result, ctrl); + return result; + } + + [CliCommand("get_animator_controller", + "Read an AnimatorController's full structure: parameters, layers, states (with motion / default), and transitions (with conditions).", + MainThreadRequired = true)] + public static AnimatorControllerInfo GetAnimatorController( + [CliArg("controller", "Reference to the AnimatorController to read (path / guid / globalId).", Required = true)] ObjectRef controller) + { + var (ctrl, ctrlPath) = ResolveController(controller); + + var info = new AnimatorControllerInfo { AssetPath = ctrlPath }; + + foreach (var p in ctrl.parameters) + { + info.Parameters.Add(new ParameterInfo + { + Name = p.name, + ParamType = p.type.ToString(), + DefaultValue = DefaultValueToken(p.type, p.defaultFloat, p.defaultInt, p.defaultBool) + }); + } + + for (int i = 0; i < ctrl.layers.Length; i++) + { + var layer = ctrl.layers[i]; + var sm = layer.stateMachine; + + var layerInfo = new LayerInfo + { + Name = layer.name, + Index = i, + DefaultState = sm != null && sm.defaultState != null ? sm.defaultState.name : null + }; + + if (sm != null) + { + foreach (var childState in sm.states) + { + var state = childState.state; + layerInfo.States.Add(new StateInfo + { + Name = state.name, + Motion = state.motion != null ? state.motion.name : null, + IsDefault = sm.defaultState == state + }); + + foreach (var t in state.transitions) + layerInfo.Transitions.Add(DescribeTransition(state.name, t)); + } + + foreach (var t in sm.anyStateTransitions) + layerInfo.Transitions.Add(DescribeTransition("AnyState", t)); + } + + info.Layers.Add(layerInfo); + } + + return info; + } + + // ---- helpers ---- + + private static TransitionInfo DescribeTransition(string from, AnimatorStateTransition t) + { + var to = t.isExit ? "Exit" : (t.destinationState != null ? t.destinationState.name : null); + var ti = new TransitionInfo + { + From = from, + To = to, + HasExitTime = t.hasExitTime, + Duration = t.duration + }; + foreach (var c in t.conditions) + { + ti.Conditions.Add(new ConditionInfo + { + Parameter = c.parameter, + Mode = c.mode.ToString(), + Threshold = c.threshold + }); + } + return ti; + } + + private static AnimatorState FindState(AnimatorStateMachine sm, string name) + { + if (sm == null) + return null; + foreach (var childState in sm.states) + { + if (childState.state != null && childState.state.name == name) + return childState.state; + } + return null; + } + + private struct ParsedCondition + { + public string Parameter; + public AnimatorConditionMode Mode; + public float Threshold; + } + + /// + /// Parse and validate the conditions array against the controller's parameters: each parameter + /// must exist and its type must be compatible with the condition mode (If/IfNot for Bool/Trigger; + /// numeric Greater/Less/Equals/NotEqual for Float/Int). Throws (writing nothing) on any mismatch. + /// + private static List ParseConditions(JArray conditions, AnimatorController ctrl) + { + var parsed = new List(); + if (conditions == null) + return parsed; + + foreach (var token in conditions) + { + if (!(token is JObject obj)) + throw new ArgumentException("Each condition must be an object: { parameter, mode, threshold? }."); + + var parameterName = obj["parameter"]?.ToObject(); + var modeName = obj["mode"]?.ToObject(); + if (string.IsNullOrWhiteSpace(parameterName)) + throw new ArgumentException("Each condition requires a 'parameter'."); + if (string.IsNullOrWhiteSpace(modeName)) + throw new ArgumentException($"Condition for parameter '{parameterName}' requires a 'mode'."); + + var param = ctrl.parameters.FirstOrDefault(p => p.name == parameterName); + if (param == null) + throw new ArgumentException($"Condition references parameter '{parameterName}', which does not exist on the controller."); + + if (!Enum.TryParse(modeName, ignoreCase: true, out var mode)) + throw new ArgumentException($"Unknown condition mode '{modeName}' for parameter '{parameterName}'. Use If | IfNot | Greater | Less | Equals | NotEqual."); + + ValidateModeForType(parameterName, param.type, mode); + + var threshold = obj["threshold"]?.ToObject() ?? 0f; + + parsed.Add(new ParsedCondition { Parameter = parameterName, Mode = mode, Threshold = threshold }); + } + + return parsed; + } + + /// + /// Enforce that a condition mode matches its parameter type: Bool/Trigger only accept If/IfNot; + /// Float/Int only accept the numeric modes (Greater/Less/Equals/NotEqual). Unity's editor follows + /// the same rule; we reject mismatches up front with an actionable message. + /// + private static void ValidateModeForType(string parameterName, AnimatorControllerParameterType type, AnimatorConditionMode mode) + { + var isBoolLike = type == AnimatorControllerParameterType.Bool || type == AnimatorControllerParameterType.Trigger; + var isNumeric = type == AnimatorControllerParameterType.Float || type == AnimatorControllerParameterType.Int; + + var boolMode = mode == AnimatorConditionMode.If || mode == AnimatorConditionMode.IfNot; + + if (isBoolLike && !boolMode) + throw new ArgumentException( + $"Condition mode '{mode}' is not valid for {type} parameter '{parameterName}'. Bool/Trigger parameters use If or IfNot."); + + if (isNumeric && boolMode) + throw new ArgumentException( + $"Condition mode '{mode}' is not valid for {type} parameter '{parameterName}'. Float/Int parameters use Greater, Less, Equals or NotEqual."); + } + + private static AnimatorControllerParameterType ParseParameterType(string type) + { + if (string.IsNullOrWhiteSpace(type)) + throw new ArgumentException("type is required."); + if (!Enum.TryParse(type, ignoreCase: true, out var parsed)) + throw new ArgumentException($"Unknown parameter type '{type}'. Use Float | Int | Bool | Trigger."); + return parsed; + } + + private static JToken DefaultValueToken(AnimatorControllerParameterType type, float f, int i, bool b) + { + switch (type) + { + case AnimatorControllerParameterType.Float: return new JValue(f); + case AnimatorControllerParameterType.Int: return new JValue(i); + case AnimatorControllerParameterType.Bool: return new JValue(b); + default: return JValue.CreateNull(); // Trigger has no default value + } + } + + /// + /// Resolve a layer selector (int index or string name; null/absent => 0). Returns false with an + /// error when a name doesn't match any layer (the caller surfaces 'layer_not_found'). + /// + private static bool TryResolveLayer(AnimatorController ctrl, JToken layer, out int index, out string error) + { + index = 0; + error = null; + + if (layer == null || layer.Type == JTokenType.Null) + return true; // default Base Layer + + if (layer.Type == JTokenType.Integer || layer.Type == JTokenType.Float) + { + // The layer index is an int. A float is accepted only when it is integer-valued + // (e.g. 1.0); a fractional value like 0.9 is rejected rather than silently rounded. + if (layer.Type == JTokenType.Float) + { + var asDouble = layer.ToObject(); + if (asDouble != Math.Floor(asDouble)) + { + error = $"Layer index must be an integer; got {asDouble}."; + return false; + } + index = (int)asDouble; + } + else + { + index = layer.ToObject(); + } + + if (index < 0 || index >= ctrl.layers.Length) + { + error = $"Layer index {index} is out of range (controller has {ctrl.layers.Length} layer(s))."; + return false; + } + return true; + } + + var name = layer.ToObject(); + if (string.IsNullOrWhiteSpace(name)) + return true; + + // A numeric string is treated as an index. + if (int.TryParse(name, out var asIndex)) + { + if (asIndex < 0 || asIndex >= ctrl.layers.Length) + { + error = $"Layer index {asIndex} is out of range (controller has {ctrl.layers.Length} layer(s))."; + return false; + } + index = asIndex; + return true; + } + + for (int i = 0; i < ctrl.layers.Length; i++) + { + if (ctrl.layers[i].name == name) + { + index = i; + return true; + } + } + + error = $"No layer named '{name}' on the controller. Add it first with add_animator_layer."; + return false; + } + + /// + /// Reject an on-disk asset reference that resolves outside the authoring root. Mirrors the + /// confinement applied to the controller itself so a restricted root can't be sidestepped by + /// pointing at (e.g.) an AnimationClip/BlendTree elsewhere in the project. + /// + private static void ConfineToAuthoringRoot(UnityEngine.Object asset, string label, ObjectRef reference) + { + var assetPath = AssetDatabase.GetAssetPath(asset); + if (string.IsNullOrEmpty(assetPath)) + throw new ArgumentException($"{label} reference '{reference}' does not point at an on-disk asset."); + + var confined = ProjectPaths.Resolve(assetPath, out var confineError); + if (confined == null) + throw new ArgumentException( + $"{label} '{assetPath}' is outside the authoring root '{ProjectPaths.AuthoringRoot}': {confineError}"); + } + + private static (AnimatorController controller, string path) ResolveController(ObjectRef controller) + { + if (controller == null || controller.IsEmpty) + throw new ArgumentException("controller is required."); + + if (!ObjectResolver.TryResolve(controller, out var obj, out var error)) + throw new ArgumentException(error); + + if (!(obj is AnimatorController ctrl)) + throw new ArgumentException($"Reference '{controller}' resolved to a {obj.GetType().Name}, not an AnimatorController."); + + var assetPath = AssetDatabase.GetAssetPath(ctrl); + if (string.IsNullOrEmpty(assetPath)) + throw new ArgumentException($"Reference '{controller}' does not point at an on-disk AnimatorController."); + + var confined = ProjectPaths.Resolve(assetPath, out var confineError); + if (confined == null) + throw new ArgumentException( + $"Controller '{assetPath}' is outside the authoring root '{ProjectPaths.AuthoringRoot}': {confineError}"); + + return (ctrl, confined); + } + + private static void Persist(AnimatorController ctrl) + { + EditorUtility.SetDirty(ctrl); + AssetDatabase.SaveAssets(); + } + + private static void FillIdentity(AuthoringResult result, AnimatorController ctrl) + { + var described = ObjectResolver.Describe(ctrl); + if (described == null) + return; + result.Guid = described.Guid; + result.FileId = described.FileId; + result.GlobalId = described.GlobalId; + } + + private static void EnsureParentFolder(string assetPath) + { + var parent = Path.GetDirectoryName(assetPath)?.Replace('\\', '/'); + if (string.IsNullOrEmpty(parent) || AssetDatabase.IsValidFolder(parent)) + return; + CreateFolderRecursive(parent); + } + + private static void CreateFolderRecursive(string assetsPath) + { + if (AssetDatabase.IsValidFolder(assetsPath)) + return; + + var parent = Path.GetDirectoryName(assetsPath)?.Replace('\\', '/'); + var name = Path.GetFileName(assetsPath); + if (string.IsNullOrEmpty(parent) || string.IsNullOrEmpty(name)) + throw new ArgumentException($"Invalid folder path '{assetsPath}'."); + + if (!AssetDatabase.IsValidFolder(parent)) + CreateFolderRecursive(parent); + + AssetDatabase.CreateFolder(parent, name); + } + } + + // ---- result models ---- + + /// A structured, non-throwing error envelope ({ error, code }) returned at HTTP 200. + [Serializable] + public class ErrorResult + { + [JsonProperty("error")] + public string Error { get; set; } + + [JsonProperty("code")] + public string Code { get; set; } + + public static ErrorResult PackageStyle(string code, string error) => new ErrorResult { Code = code, Error = error }; + } + + [Serializable] + public class ParameterInfo + { + [JsonProperty("name")] + public string Name { get; set; } + + [JsonProperty("type")] + public string ParamType { get; set; } + + [JsonProperty("defaultValue")] + public JToken DefaultValue { get; set; } + } + + [Serializable] + public class AddParameterResult : AuthoringResult + { + [JsonProperty("parameter")] + public ParameterInfo Parameter { get; set; } + } + + [Serializable] + public class LayerSummary + { + [JsonProperty("name")] + public string Name { get; set; } + + [JsonProperty("index")] + public int Index { get; set; } + + [JsonProperty("weight")] + public float Weight { get; set; } + } + + [Serializable] + public class AddLayerResult : AuthoringResult + { + [JsonProperty("layer")] + public LayerSummary Layer { get; set; } + } + + [Serializable] + public class StateSummary + { + [JsonProperty("name")] + public string Name { get; set; } + + [JsonProperty("layer")] + public int Layer { get; set; } + + [JsonProperty("hasMotion")] + public bool HasMotion { get; set; } + + [JsonProperty("isDefault")] + public bool IsDefault { get; set; } + } + + [Serializable] + public class AddStateResult : AuthoringResult + { + [JsonProperty("state")] + public StateSummary State { get; set; } + } + + [Serializable] + public class TransitionSummary + { + [JsonProperty("from")] + public string From { get; set; } + + [JsonProperty("to")] + public string To { get; set; } + + [JsonProperty("conditionCount")] + public int ConditionCount { get; set; } + } + + [Serializable] + public class AddTransitionResult : AuthoringResult + { + [JsonProperty("transition")] + public TransitionSummary Transition { get; set; } + } + + [Serializable] + public class AnimatorControllerInfo + { + [JsonProperty("assetPath")] + public string AssetPath { get; set; } + + [JsonProperty("parameters")] + public List Parameters { get; set; } = new List(); + + [JsonProperty("layers")] + public List Layers { get; set; } = new List(); + } + + [Serializable] + public class LayerInfo + { + [JsonProperty("name")] + public string Name { get; set; } + + [JsonProperty("index")] + public int Index { get; set; } + + [JsonProperty("defaultState")] + public string DefaultState { get; set; } + + [JsonProperty("states")] + public List States { get; set; } = new List(); + + [JsonProperty("transitions")] + public List Transitions { get; set; } = new List(); + } + + [Serializable] + public class StateInfo + { + [JsonProperty("name")] + public string Name { get; set; } + + [JsonProperty("motion")] + public string Motion { get; set; } + + [JsonProperty("isDefault")] + public bool IsDefault { get; set; } + } + + [Serializable] + public class TransitionInfo + { + [JsonProperty("from")] + public string From { get; set; } + + [JsonProperty("to")] + public string To { get; set; } + + [JsonProperty("conditions")] + public List Conditions { get; set; } = new List(); + + [JsonProperty("hasExitTime")] + public bool HasExitTime { get; set; } + + [JsonProperty("duration")] + public float Duration { get; set; } + } + + [Serializable] + public class ConditionInfo + { + [JsonProperty("parameter")] + public string Parameter { get; set; } + + [JsonProperty("mode")] + public string Mode { get; set; } + + [JsonProperty("threshold")] + public float Threshold { get; set; } + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Animation/AnimatorControllerCommands.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Animation/AnimatorControllerCommands.cs.meta new file mode 100644 index 00000000..403e7499 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Animation/AnimatorControllerCommands.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 426c006ffb43461e94ab3dde2caed7be diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Animation/TimelineCommands.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Animation/TimelineCommands.cs new file mode 100644 index 00000000..61d152f2 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Animation/TimelineCommands.cs @@ -0,0 +1,637 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Reflection; +using Newtonsoft.Json; +using Unity.Pipeline.Commands; +using Unity.Pipeline.Editor.Authoring; +using Unity.Pipeline.Models; +using UnityEditor; +using UnityEngine; +using Object = UnityEngine.Object; + +namespace Unity.Pipeline.Editor.Commands.Animation +{ + /// + /// Group C of CLI-214: author TimelineAssets (tracks + clips). Timeline ships in the OPTIONAL + /// com.unity.timeline package, so the Editor assembly does NOT reference Unity.Timeline + /// (that would break compilation when the package is absent). Every command: + /// + /// 1. runs ; if Timeline is absent it returns a structured + /// { error, code: "package_not_found" } at HTTP 200 (no exception thrown), and + /// 2. reaches the Timeline API entirely through reflection. + /// + /// Type names used (all in Unity.Timeline): UnityEngine.Timeline.TimelineAsset, + /// TrackAsset, TimelineClip, and the concrete track types + /// (AnimationTrack, AudioTrack, ActivationTrack, ControlTrack, + /// PlayableTrack, SignalTrack, MarkerTrack). + /// + /// Out of scope (v1): markers, signal emitters/receivers, custom playable tracks, and track bindings + /// to scene objects. + /// + public static class TimelineCommands + { + private const string Asm = "Unity.Timeline"; + + // Friendly track-type name => concrete TrackAsset subclass full name. + private static readonly Dictionary TrackTypeNames = new Dictionary(StringComparer.OrdinalIgnoreCase) + { + { "Animation", "UnityEngine.Timeline.AnimationTrack" }, + { "Audio", "UnityEngine.Timeline.AudioTrack" }, + { "Activation", "UnityEngine.Timeline.ActivationTrack" }, + { "Control", "UnityEngine.Timeline.ControlTrack" }, + { "Playable", "UnityEngine.Timeline.PlayableTrack" }, + { "Signal", "UnityEngine.Timeline.SignalTrack" }, + { "Marker", "UnityEngine.Timeline.MarkerTrack" }, + }; + + [CliCommand("create_timeline", + "Create a .playable TimelineAsset under the authoring root (optional frame rate). Requires the com.unity.timeline package.", + MainThreadRequired = true)] + public static object CreateTimeline( + [CliArg("path", "Asset path ending in .playable, relative to the authoring root. The Assets/ prefix is optional.", Required = true)] string path, + [CliArg("frameRate", "Timeline frame rate (default 60).")] float frameRate = 60f, + [CliArg("confirm", "Required (true) only when overwriting an existing asset at the path.")] bool confirm = false, + [CliArg("dry_run", "If true, validate inputs and report what would be created without writing anything.")] bool dryRun = false) + { + if (!TimelineGuard.IsInstalled()) + return TimelineGuard.NotInstalledError(); + + var normalized = ProjectPaths.Resolve(path, out var error); + if (normalized == null) + throw new ArgumentException(error); + + if (!string.Equals(Path.GetExtension(normalized), ".playable", StringComparison.OrdinalIgnoreCase)) + throw new ArgumentException($"Timeline path '{normalized}' must end in .playable."); + + if (frameRate <= 0f) + throw new ArgumentException($"frameRate must be positive (got {frameRate})."); + + var exists = AssetDatabase.LoadMainAssetAtPath(normalized) != null; + if (exists && !confirm) + throw new ArgumentException($"An asset already exists at '{normalized}'. Pass confirm=true to overwrite it."); + + if (dryRun) + return new AuthoringResult { AssetPath = normalized, Type = "TimelineAsset" }; + + EnsureParentFolder(normalized); + + var timelineType = TimelineGuard.ResolveTimelineAssetType(); + var timeline = ScriptableObject.CreateInstance(timelineType); + SetFrameRate(timeline, timelineType, frameRate); + + if (exists) + AssetDatabase.DeleteAsset(normalized); + + AssetDatabase.CreateAsset(timeline, normalized); + EditorUtility.SetDirty(timeline); + AssetDatabase.SaveAssets(); + AssetDatabase.ImportAsset(normalized); + + var loaded = AssetDatabase.LoadMainAssetAtPath(normalized); + var result = ObjectResolver.Describe(loaded) ?? new AuthoringResult { Type = "TimelineAsset" }; + result.AssetPath = normalized; + return result; + } + + [CliCommand("add_timeline_track", + "Add a track (Animation | Audio | Activation | Control | Playable | Signal | Marker) to a TimelineAsset, optionally nested under a parent group/track. Requires the com.unity.timeline package.", + MainThreadRequired = true)] + public static object AddTimelineTrack( + [CliArg("timeline", "Reference to the TimelineAsset to edit (path / guid / globalId).", Required = true)] ObjectRef timeline, + [CliArg("trackType", "Track type: Animation | Audio | Activation | Control | Playable | Signal | Marker.", Required = true)] string trackType = null, + [CliArg("name", "Optional track display name.")] string name = null, + [CliArg("parentTrack", "Optional name of an existing group/track to nest the new track under.")] string parentTrack = null, + [CliArg("dry_run", "If true, validate inputs without writing the track.")] bool dryRun = false) + { + if (!TimelineGuard.IsInstalled()) + return TimelineGuard.NotInstalledError(); + + var (asset, assetPath, timelineType) = ResolveTimeline(timeline); + + if (string.IsNullOrWhiteSpace(trackType) || !TrackTypeNames.TryGetValue(trackType, out var trackTypeFullName)) + throw new ArgumentException($"Unknown trackType '{trackType}'. Use Animation | Audio | Activation | Control | Playable | Signal | Marker."); + + var concreteTrackType = Type.GetType($"{trackTypeFullName}, {Asm}", throwOnError: false); + if (concreteTrackType == null) + throw new ArgumentException($"Track type '{trackTypeFullName}' is not available in this version of {TimelineGuard.PackageId}."); + + var trackName = string.IsNullOrEmpty(name) ? trackType : name; + + // Resolve an optional parent track by name BEFORE any write so a bad parent fails clean. + object parent = null; + if (!string.IsNullOrEmpty(parentTrack)) + { + parent = FindTrackByName(asset, timelineType, parentTrack); + if (parent == null) + throw new ArgumentException($"Parent track '{parentTrack}' not found on the timeline."); + } + + var result = new AddTimelineTrackResult + { + AssetPath = assetPath, + Type = "TimelineAsset", + Track = new TimelineTrackSummary { Name = trackName, TrackType = trackType } + }; + + if (dryRun) + return result; + + // TrackAsset CreateTrack(Type type, TrackAsset parent, string name) + var createTrack = timelineType.GetMethod("CreateTrack", new[] { typeof(Type), GetTrackAssetType(), typeof(string) }); + if (createTrack == null) + throw new InvalidOperationException("TimelineAsset.CreateTrack(Type, TrackAsset, string) not found via reflection."); + + createTrack.Invoke(asset, new object[] { concreteTrackType, parent, trackName }); + + EditorUtility.SetDirty(asset); + AssetDatabase.SaveAssets(); + + FillIdentity(result, asset); + return result; + } + + [CliCommand("add_timeline_clip", + "Add a clip to a named track on a TimelineAsset. For Animation tracks pass an AnimationClip asset; for Audio tracks an AudioClip. Requires the com.unity.timeline package.", + MainThreadRequired = true)] + public static object AddTimelineClip( + [CliArg("timeline", "Reference to the TimelineAsset to edit (path / guid / globalId).", Required = true)] ObjectRef timeline, + [CliArg("track", "Target track name.", Required = true)] string track = null, + [CliArg("start", "Clip start time in seconds.", Required = true)] float start = 0f, + [CliArg("duration", "Clip duration in seconds.", Required = true)] float duration = 0f, + [CliArg("asset", "Source asset: for Animation tracks an AnimationClip; for Audio tracks an AudioClip. Required for those track types.")] ObjectRef asset = null, + [CliArg("dry_run", "If true, validate inputs without writing the clip.")] bool dryRun = false) + { + if (!TimelineGuard.IsInstalled()) + return TimelineGuard.NotInstalledError(); + + var (timelineAsset, assetPath, timelineType) = ResolveTimeline(timeline); + + if (string.IsNullOrWhiteSpace(track)) + throw new ArgumentException("track is required."); + if (duration <= 0f) + throw new ArgumentException($"duration must be positive (got {duration})."); + if (start < 0f) + throw new ArgumentException($"start must be >= 0 (got {start})."); + + var trackObj = FindTrackByName(timelineAsset, timelineType, track); + if (trackObj == null) + throw new ArgumentException($"Track '{track}' not found on the timeline."); + + // Resolve the optional clip-source asset BEFORE any write. + Object sourceAsset = null; + if (asset != null && !asset.IsEmpty) + { + if (!ObjectResolver.TryResolve(asset, out var srcObj, out var srcError)) + throw new ArgumentException($"Could not resolve clip asset: {srcError}"); + sourceAsset = srcObj; + + // Re-confine the clip source to the authoring root: a restricted root must not be + // bypassed by referencing an AnimationClip/AudioClip that lives outside the sandbox. + var sourcePath = AssetDatabase.GetAssetPath(sourceAsset); + if (string.IsNullOrEmpty(sourcePath)) + throw new ArgumentException($"Clip asset reference '{asset}' does not point at an on-disk asset."); + + var confinedSource = ProjectPaths.Resolve(sourcePath, out var sourceConfineError); + if (confinedSource == null) + throw new ArgumentException( + $"Clip asset '{sourcePath}' is outside the authoring root '{ProjectPaths.AuthoringRoot}': {sourceConfineError}"); + } + + var result = new AddTimelineClipResult + { + AssetPath = assetPath, + Type = "TimelineAsset", + Clip = new TimelineClipSummary { Track = track, Start = start, Duration = duration } + }; + + if (dryRun) + { + // Even in dry_run, validate that a clip can be created for this track/asset combination so + // a missing-required-asset case fails fast and writes nothing. + ValidateClipCreatable(trackObj, sourceAsset); + return result; + } + + var clip = CreateClip(trackObj, sourceAsset); + if (clip == null) + throw new InvalidOperationException($"Failed to create a clip on track '{track}'."); + + SetClipTiming(clip, start, duration); + + EditorUtility.SetDirty(timelineAsset); + AssetDatabase.SaveAssets(); + + FillIdentity(result, timelineAsset); + return result; + } + + [CliCommand("get_timeline", + "Read a TimelineAsset's structure: frame rate, duration, and its tracks with their clips. Requires the com.unity.timeline package.", + MainThreadRequired = true)] + public static object GetTimeline( + [CliArg("timeline", "Reference to the TimelineAsset to read (path / guid / globalId).", Required = true)] ObjectRef timeline) + { + if (!TimelineGuard.IsInstalled()) + return TimelineGuard.NotInstalledError(); + + var (asset, assetPath, timelineType) = ResolveTimeline(timeline); + + var info = new TimelineInfo + { + AssetPath = assetPath, + FrameRate = GetFrameRate(asset, timelineType), + Duration = GetDouble(asset, timelineType, "duration") + }; + + foreach (var trackObj in GetOutputTracks(asset, timelineType)) + { + if (trackObj == null) + continue; + + var trackType = trackObj.GetType(); + var trackInfo = new TimelineTrackInfo + { + Name = GetName(trackObj), + TrackType = FriendlyTrackType(trackType) + }; + + foreach (var clipObj in GetClips(trackObj)) + { + if (clipObj == null) + continue; + var clipType = clipObj.GetType(); + var clipAsset = GetMember(clipObj, clipType, "asset") as Object; + trackInfo.Clips.Add(new TimelineClipInfo + { + Start = GetDoubleMember(clipObj, clipType, "start"), + Duration = GetDoubleMember(clipObj, clipType, "duration"), + Asset = clipAsset != null ? AssetDatabase.GetAssetPath(clipAsset) : null + }); + } + + info.Tracks.Add(trackInfo); + } + + return info; + } + + // ---- reflection helpers ---- + + private static Type GetTrackAssetType() + { + var t = Type.GetType($"UnityEngine.Timeline.TrackAsset, {Asm}", throwOnError: false); + if (t == null) + throw new InvalidOperationException("UnityEngine.Timeline.TrackAsset type not found."); + return t; + } + + private static (Object asset, string path, Type timelineType) ResolveTimeline(ObjectRef timeline) + { + if (timeline == null || timeline.IsEmpty) + throw new ArgumentException("timeline is required."); + + if (!ObjectResolver.TryResolve(timeline, out var obj, out var error)) + throw new ArgumentException(error); + + var timelineType = TimelineGuard.ResolveTimelineAssetType(); + if (timelineType == null || !timelineType.IsInstanceOfType(obj)) + throw new ArgumentException($"Reference '{timeline}' resolved to a {obj.GetType().Name}, not a TimelineAsset."); + + var assetPath = AssetDatabase.GetAssetPath(obj); + if (string.IsNullOrEmpty(assetPath)) + throw new ArgumentException($"Reference '{timeline}' does not point at an on-disk TimelineAsset."); + + var confined = ProjectPaths.Resolve(assetPath, out var confineError); + if (confined == null) + throw new ArgumentException( + $"Timeline '{assetPath}' is outside the authoring root '{ProjectPaths.AuthoringRoot}': {confineError}"); + + return (obj, confined, timelineType); + } + + /// + /// Set the timeline frame rate, preferring the current editorSettings.frameRate (double) + /// and falling back to the obsolete editorSettings.fps (float) on older package versions. + /// + private static void SetFrameRate(object timeline, Type timelineType, float frameRate) + { + var editorSettings = GetMember(timeline, timelineType, "editorSettings"); + if (editorSettings == null) + return; + + var settingsType = editorSettings.GetType(); + + var frameRateProp = settingsType.GetProperty("frameRate", BindingFlags.Public | BindingFlags.Instance); + if (frameRateProp != null && frameRateProp.CanWrite) + { + frameRateProp.SetValue(editorSettings, (double)frameRate); + return; + } + + var fpsProp = settingsType.GetProperty("fps", BindingFlags.Public | BindingFlags.Instance); + if (fpsProp != null && fpsProp.CanWrite) + fpsProp.SetValue(editorSettings, frameRate); + } + + private static double GetFrameRate(object timeline, Type timelineType) + { + var editorSettings = GetMember(timeline, timelineType, "editorSettings"); + if (editorSettings == null) + return 0d; + + var settingsType = editorSettings.GetType(); + + var frameRateProp = settingsType.GetProperty("frameRate", BindingFlags.Public | BindingFlags.Instance); + if (frameRateProp != null && frameRateProp.CanRead) + return Convert.ToDouble(frameRateProp.GetValue(editorSettings)); + + var fpsProp = settingsType.GetProperty("fps", BindingFlags.Public | BindingFlags.Instance); + if (fpsProp != null && fpsProp.CanRead) + return Convert.ToDouble(fpsProp.GetValue(editorSettings)); + + return 0d; + } + + private static IEnumerable GetOutputTracks(object timeline, Type timelineType) + { + var method = timelineType.GetMethod("GetOutputTracks", Type.EmptyTypes); + if (method == null) + yield break; + + var enumerable = method.Invoke(timeline, null) as IEnumerable; + if (enumerable == null) + yield break; + + foreach (var item in enumerable) + yield return item; + } + + private static object FindTrackByName(object timeline, Type timelineType, string name) + { + foreach (var track in GetOutputTracks(timeline, timelineType)) + { + if (track != null && GetName(track) == name) + return track; + } + return null; + } + + private static IEnumerable GetClips(object track) + { + var method = track.GetType().GetMethod("GetClips", Type.EmptyTypes); + if (method == null) + yield break; + + var enumerable = method.Invoke(track, null) as IEnumerable; + if (enumerable == null) + yield break; + + foreach (var item in enumerable) + yield return item; + } + + /// + /// Find a CreateClip overload on the track that accepts the given source asset's type + /// (e.g. AnimationTrack.CreateClip(AnimationClip), AudioTrack.CreateClip(AudioClip)). Returns + /// null when no asset is given (caller then uses CreateDefaultClip). + /// + private static MethodInfo FindCreateClipForAsset(Type trackType, Object sourceAsset) + { + if (sourceAsset == null) + return null; + + var assetType = sourceAsset.GetType(); + MethodInfo best = null; + foreach (var m in trackType.GetMethods(BindingFlags.Public | BindingFlags.Instance)) + { + if (m.Name != "CreateClip") + continue; + if (m.IsGenericMethodDefinition) + continue; + var ps = m.GetParameters(); + if (ps.Length != 1) + continue; + if (ps[0].ParameterType.IsAssignableFrom(assetType)) + { + // Prefer an exact match over a UnityEngine.Object-typed overload. + if (ps[0].ParameterType == assetType) + return m; + best = best ?? m; + } + } + return best; + } + + private static void ValidateClipCreatable(object track, Object sourceAsset) + { + var trackType = track.GetType(); + var isAnimation = trackType.FullName == "UnityEngine.Timeline.AnimationTrack"; + var isAudio = trackType.FullName == "UnityEngine.Timeline.AudioTrack"; + + if ((isAnimation || isAudio) && sourceAsset == null) + throw new ArgumentException($"Track type '{FriendlyTrackType(trackType)}' requires an 'asset' (AnimationClip / AudioClip) to create a clip."); + + if (sourceAsset != null && FindCreateClipForAsset(trackType, sourceAsset) == null) + throw new ArgumentException( + $"Track type '{FriendlyTrackType(trackType)}' has no CreateClip overload accepting a {sourceAsset.GetType().Name}."); + } + + private static object CreateClip(object track, Object sourceAsset) + { + var trackType = track.GetType(); + + if (sourceAsset != null) + { + var createClip = FindCreateClipForAsset(trackType, sourceAsset); + if (createClip == null) + throw new ArgumentException( + $"Track type '{FriendlyTrackType(trackType)}' has no CreateClip overload accepting a {sourceAsset.GetType().Name}."); + return createClip.Invoke(track, new object[] { sourceAsset }); + } + + var isAnimation = trackType.FullName == "UnityEngine.Timeline.AnimationTrack"; + var isAudio = trackType.FullName == "UnityEngine.Timeline.AudioTrack"; + if (isAnimation || isAudio) + throw new ArgumentException($"Track type '{FriendlyTrackType(trackType)}' requires an 'asset' (AnimationClip / AudioClip) to create a clip."); + + // For tracks that don't take a source asset, create a default (empty) clip. + var createDefault = trackType.GetMethod("CreateDefaultClip", Type.EmptyTypes); + if (createDefault != null) + return createDefault.Invoke(track, null); + + throw new InvalidOperationException($"No CreateClip / CreateDefaultClip available on '{trackType.Name}'."); + } + + private static void SetClipTiming(object clip, double start, double duration) + { + var clipType = clip.GetType(); + SetDoubleMember(clip, clipType, "start", start); + SetDoubleMember(clip, clipType, "duration", duration); + } + + private static string FriendlyTrackType(Type trackType) + { + foreach (var pair in TrackTypeNames) + { + if (pair.Value == trackType.FullName) + return pair.Key; + } + // Strip the trailing "Track" suffix for any unmapped subclass. + var n = trackType.Name; + return n.EndsWith("Track", StringComparison.Ordinal) ? n.Substring(0, n.Length - "Track".Length) : n; + } + + private static string GetName(object obj) + { + var prop = obj.GetType().GetProperty("name", BindingFlags.Public | BindingFlags.Instance); + return prop?.GetValue(obj) as string; + } + + private static object GetMember(object obj, Type type, string name) + { + var prop = type.GetProperty(name, BindingFlags.Public | BindingFlags.Instance); + if (prop != null) + return prop.GetValue(obj); + var field = type.GetField(name, BindingFlags.Public | BindingFlags.Instance); + return field?.GetValue(obj); + } + + private static double GetDouble(object obj, Type type, string name) + { + var value = GetMember(obj, type, name); + return value == null ? 0d : Convert.ToDouble(value); + } + + private static double GetDoubleMember(object obj, Type type, string name) => GetDouble(obj, type, name); + + private static void SetDoubleMember(object obj, Type type, string name, double value) + { + var prop = type.GetProperty(name, BindingFlags.Public | BindingFlags.Instance); + if (prop != null && prop.CanWrite) + { + prop.SetValue(obj, value); + return; + } + var field = type.GetField(name, BindingFlags.Public | BindingFlags.Instance); + field?.SetValue(obj, value); + } + + private static void FillIdentity(AuthoringResult result, Object asset) + { + var described = ObjectResolver.Describe(asset); + if (described == null) + return; + result.Guid = described.Guid; + result.FileId = described.FileId; + result.GlobalId = described.GlobalId; + } + + private static void EnsureParentFolder(string assetPath) + { + var parent = Path.GetDirectoryName(assetPath)?.Replace('\\', '/'); + if (string.IsNullOrEmpty(parent) || AssetDatabase.IsValidFolder(parent)) + return; + CreateFolderRecursive(parent); + } + + private static void CreateFolderRecursive(string assetsPath) + { + if (AssetDatabase.IsValidFolder(assetsPath)) + return; + + var parent = Path.GetDirectoryName(assetsPath)?.Replace('\\', '/'); + var name = Path.GetFileName(assetsPath); + if (string.IsNullOrEmpty(parent) || string.IsNullOrEmpty(name)) + throw new ArgumentException($"Invalid folder path '{assetsPath}'."); + + if (!AssetDatabase.IsValidFolder(parent)) + CreateFolderRecursive(parent); + + AssetDatabase.CreateFolder(parent, name); + } + } + + // ---- result models ---- + + [Serializable] + public class TimelineTrackSummary + { + [JsonProperty("name")] + public string Name { get; set; } + + [JsonProperty("type")] + public string TrackType { get; set; } + } + + [Serializable] + public class AddTimelineTrackResult : AuthoringResult + { + [JsonProperty("track")] + public TimelineTrackSummary Track { get; set; } + } + + [Serializable] + public class TimelineClipSummary + { + [JsonProperty("track")] + public string Track { get; set; } + + [JsonProperty("start")] + public float Start { get; set; } + + [JsonProperty("duration")] + public float Duration { get; set; } + } + + [Serializable] + public class AddTimelineClipResult : AuthoringResult + { + [JsonProperty("clip")] + public TimelineClipSummary Clip { get; set; } + } + + [Serializable] + public class TimelineInfo + { + [JsonProperty("assetPath")] + public string AssetPath { get; set; } + + [JsonProperty("frameRate")] + public double FrameRate { get; set; } + + [JsonProperty("duration")] + public double Duration { get; set; } + + [JsonProperty("tracks")] + public List Tracks { get; set; } = new List(); + } + + [Serializable] + public class TimelineTrackInfo + { + [JsonProperty("name")] + public string Name { get; set; } + + [JsonProperty("type")] + public string TrackType { get; set; } + + [JsonProperty("clips")] + public List Clips { get; set; } = new List(); + } + + [Serializable] + public class TimelineClipInfo + { + [JsonProperty("start")] + public double Start { get; set; } + + [JsonProperty("duration")] + public double Duration { get; set; } + + [JsonProperty("asset")] + public string Asset { get; set; } + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Animation/TimelineCommands.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Animation/TimelineCommands.cs.meta new file mode 100644 index 00000000..538c4fc7 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Animation/TimelineCommands.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: dcf5399fb1544ee3a5b069c535bcd002 diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Animation/TimelineGuard.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Animation/TimelineGuard.cs new file mode 100644 index 00000000..d4f7ef9c --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Animation/TimelineGuard.cs @@ -0,0 +1,52 @@ +using System; + +namespace Unity.Pipeline.Editor.Commands.Animation +{ + /// + /// Presence guard for the optional com.unity.timeline package (CLI-214, Group C). + /// + /// The Editor assembly deliberately does NOT reference Unity.Timeline (an asmdef reference + /// would break compilation in any project that doesn't have the package installed). Instead, the + /// Timeline commands reach the package via reflection, and this guard reports whether the package's + /// core type is loadable — the optional-package guard pattern for commands backed by a package that + /// may not be present. + /// + /// The guard caches its result for the lifetime of the domain; a package add/remove triggers a + /// domain reload, which resets the cache. + /// + public static class TimelineGuard + { + /// The package id, surfaced in the not-installed error message. + public const string PackageId = "com.unity.timeline"; + + /// Assembly-qualified name of the package's root asset type. + public const string TimelineAssetTypeName = "UnityEngine.Timeline.TimelineAsset, Unity.Timeline"; + + private static bool? s_Installed; + + /// + /// True when the Timeline package is installed (its TimelineAsset type resolves). + /// + public static bool IsInstalled() + { + if (s_Installed.HasValue) + return s_Installed.Value; + + s_Installed = ResolveTimelineAssetType() != null; + return s_Installed.Value; + } + + /// + /// The UnityEngine.Timeline.TimelineAsset , or null if the package is + /// absent. Callers use this as the entry point for further reflection. + /// + public static Type ResolveTimelineAssetType() => Type.GetType(TimelineAssetTypeName, throwOnError: false); + + /// + /// The structured "package not installed" error (HTTP 200, no exception) that every Timeline + /// command returns when is false. + /// + public static ErrorResult NotInstalledError() => + ErrorResult.PackageStyle("package_not_found", $"{PackageId} is not installed"); + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Animation/TimelineGuard.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Animation/TimelineGuard.cs.meta new file mode 100644 index 00000000..607fca66 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Animation/TimelineGuard.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: f3f8120d06814b2c86d46503ac132022 diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Assets.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Assets.meta new file mode 100644 index 00000000..23d44dc8 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Assets.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 39163f849a3aebd47a3f718fdc0224f9 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Assets/AssetCommands.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Assets/AssetCommands.cs new file mode 100644 index 00000000..4bf2e8f4 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Assets/AssetCommands.cs @@ -0,0 +1,602 @@ +using System; +using System.IO; +using System.Reflection; +using Unity.Pipeline.Commands; +using Unity.Pipeline.Editor.Authoring; +using Unity.Pipeline.Models; +using UnityEditor; +using UnityEngine; +using Object = UnityEngine.Object; +#if UNITY_6000_0_OR_NEWER +using PipelinePhysicsMaterial = UnityEngine.PhysicsMaterial; +#else +using PipelinePhysicsMaterial = UnityEngine.PhysicMaterial; +#endif + +namespace Unity.Pipeline.Editor.Commands.Assets +{ + /// + /// Asset lifecycle authoring commands (CLI-191): create / import / move / copy / rename / delete + /// project assets. They sit on top of the CLI-190 authoring foundation, so: + /// + /// - every agent-supplied path is funnelled through (sandboxed + /// to the authoring root; rejects "../" and out-of-project writes), + /// - results are returned as the canonical envelope so an agent can + /// reference the asset in a follow-up call, + /// - existing assets are addressed with an resolved by + /// . + /// + /// NOTE: AssetDatabase create/move/copy/rename/delete are NOT part of Unity's Undo system, so + /// would have no effect here — these operations are intentionally + /// not wrapped in an undo scope, and destructive/overwriting operations instead require an explicit + /// confirm argument (and support dry_run) so an agent cannot silently lose data. + /// + public static class AssetCommands + { + [CliCommand("create_asset", "Create a new ScriptableObject (or other UnityEngine.Object) asset of the given type at a path under the authoring root.")] + public static AuthoringResult CreateAsset( + [CliArg("path", "Asset path relative to the authoring root, including extension (e.g. Data/Config.asset or Materials/Wall.mat). The Assets/ prefix is optional.", Required = true)] string path, + [CliArg("type", "Fully-qualified or short type name to instantiate (e.g. UnityEngine.Material, MyGame.GameConfig). Must derive from UnityEngine.Object and be creatable.", Required = true)] string type, + [CliArg("shader", "Material-only (ignored otherwise): shader name to assign (e.g. Standard, \"Universal Render Pipeline/Lit\"). When omitted, defaults to \"Universal Render Pipeline/Lit\" if a Scriptable Render Pipeline is active, otherwise the built-in \"Standard\" shader (falling back to \"Standard\" if URP/Lit is unavailable).")] string shader = null, + [CliArg("confirm", "Required (true) only when overwriting an existing asset at the path. Ignored when the path is empty.")] bool confirm = false, + [CliArg("dry_run", "If true, validate inputs and report what would be created without writing anything.")] bool dryRun = false) + { + var normalized = ProjectPaths.Resolve(path, out var error); + if (normalized == null) + throw new ArgumentException(error); + + if (string.IsNullOrEmpty(Path.GetExtension(normalized))) + throw new ArgumentException($"Asset path '{normalized}' must include a file extension (e.g. .asset, .mat)."); + + var resolvedType = ResolveType(type); + if (resolvedType == null) + throw new ArgumentException($"Could not resolve type '{type}'. Use a fully-qualified name (e.g. UnityEngine.Material)."); + if (!typeof(Object).IsAssignableFrom(resolvedType)) + throw new ArgumentException($"Type '{resolvedType.FullName}' does not derive from UnityEngine.Object."); + + // CLI-222: Unity 6 renamed PhysicMaterial -> PhysicsMaterial, but the on-disk asset + // extension is still ".physicMaterial". AssetDatabase.CreateAsset rejects a + // ".physicsMaterial" file ("should not be used to create a file of type 'physicsMaterial'"), + // so accept either spelling from the agent and normalize to the extension Unity writes. + if (typeof(PipelinePhysicsMaterial).IsAssignableFrom(resolvedType) && + normalized.EndsWith(".physicsMaterial", StringComparison.OrdinalIgnoreCase)) + { + normalized = normalized.Substring(0, normalized.Length - ".physicsMaterial".Length) + ".physicMaterial"; + } + + var exists = AssetDatabase.LoadMainAssetAtPath(normalized) != null; + if (exists && !confirm) + throw new ArgumentException($"An asset already exists at '{normalized}'. Pass confirm=true to overwrite it."); + + // CLI-221: for a Material, resolve (and thereby validate) the shader up front so dry_run + // also fails fast on an unknown shader — dry_run is documented as "validate inputs". + Shader materialShader = null; + if (typeof(Material).IsAssignableFrom(resolvedType)) + materialShader = ResolveShader(shader); + + if (dryRun) + return new AuthoringResult { AssetPath = normalized, Type = resolvedType.Name }; + + EnsureParentFolder(normalized); + + Object asset; + if (typeof(ScriptableObject).IsAssignableFrom(resolvedType)) + { + asset = ScriptableObject.CreateInstance(resolvedType); + } + else if (typeof(Material).IsAssignableFrom(resolvedType)) + { + // CLI-221: Material has no public parameterless ctor (Activator.CreateInstance produces + // an invalid Material with a null shader), so construct it explicitly from the shader + // resolved (and validated) above. The `shader` arg is Material-specific and ignored for + // every other type. + asset = new Material(materialShader); + } + else if (typeof(PipelinePhysicsMaterial).IsAssignableFrom(resolvedType)) + { + // CLI-222: PhysicsMaterial has a public parameterless ctor, but create it explicitly so + // we can stamp the documented sensible defaults rather than relying on engine defaults. + asset = new PipelinePhysicsMaterial + { + dynamicFriction = 0.6f, + staticFriction = 0.6f, + bounciness = 0f, + }; + } + else + { + // Other UnityEngine.Object subclasses with a public parameterless ctor. + // Activator.CreateInstance throws for abstract types or types without an accessible + // parameterless ctor — surface that as an actionable ArgumentException. + try + { + asset = Activator.CreateInstance(resolvedType) as Object; + } + catch (Exception ex) + { + throw new ArgumentException( + $"Type '{resolvedType.FullName}' could not be instantiated (it may be abstract or lack a public parameterless constructor): {ex.Message}"); + } + } + + if (asset == null) + throw new ArgumentException($"Type '{resolvedType.FullName}' could not be instantiated as a creatable asset."); + + // AssetDatabase.CreateAsset does not reliably overwrite an existing asset at the path, so + // explicitly delete it first. The confirm guard above gates that an asset already exists. + if (exists) + AssetDatabase.DeleteAsset(normalized); + + AssetDatabase.CreateAsset(asset, normalized); + AssetDatabase.SaveAssets(); + AssetDatabase.ImportAsset(normalized); + + var loaded = AssetDatabase.LoadMainAssetAtPath(normalized); + var result = ObjectResolver.Describe(loaded) ?? new AuthoringResult { Type = resolvedType.Name }; + result.AssetPath = normalized; + return result; + } + + [CliCommand("import_asset", "Import an external file (e.g. a texture, model, audio clip) into the project by copying it to a path under the authoring root, then importing it.")] + public static AuthoringResult ImportAsset( + [CliArg("source", "Absolute filesystem path to the external file to import.", Required = true)] string source, + [CliArg("path", "Destination asset path relative to the authoring root, including extension. The Assets/ prefix is optional.", Required = true)] string path, + [CliArg("confirm", "Required (true) only when overwriting an existing asset at the destination path.")] bool confirm = false, + [CliArg("dry_run", "If true, validate inputs and report what would be imported without writing anything.")] bool dryRun = false) + { + if (string.IsNullOrWhiteSpace(source)) + throw new ArgumentException("source is required."); + if (!File.Exists(source)) + throw new ArgumentException($"Source file '{source}' does not exist."); + + var normalized = ProjectPaths.Resolve(path, out var error); + if (normalized == null) + throw new ArgumentException(error); + + var exists = AssetDatabase.LoadMainAssetAtPath(normalized) != null || File.Exists(ToAbsolute(normalized)); + if (exists && !confirm) + throw new ArgumentException($"An asset already exists at '{normalized}'. Pass confirm=true to overwrite it."); + + if (dryRun) + return new AuthoringResult { AssetPath = normalized, Type = "ImportedAsset" }; + + EnsureParentFolder(normalized); + File.Copy(source, ToAbsolute(normalized), overwrite: true); + AssetDatabase.ImportAsset(normalized, ImportAssetOptions.ForceUpdate); + + var loaded = AssetDatabase.LoadMainAssetAtPath(normalized); + var result = ObjectResolver.Describe(loaded) ?? new AuthoringResult(); + result.AssetPath = normalized; + return result; + } + + [CliCommand("move_asset", "Move (or rename via a new path) an asset to a new location under the authoring root. Preserves the asset's GUID.")] + public static AuthoringResult MoveAsset( + [CliArg("asset", "Reference to the asset to move (path / guid / globalId).", Required = true)] ObjectRef asset, + [CliArg("destination", "Destination asset path relative to the authoring root, including extension. The Assets/ prefix is optional.", Required = true)] string destination, + [CliArg("dry_run", "If true, validate the move (via AssetDatabase.ValidateMoveAsset) without performing it.")] bool dryRun = false) + { + var sourcePath = ResolveAssetPath(asset); + + var dest = ProjectPaths.Resolve(destination, out var error); + if (dest == null) + throw new ArgumentException(error); + + // For a real move, create the destination's parent folder *before* validating: Unity's + // ValidateMoveAsset reports failure ("move as a subdirectory") when the target folder + // doesn't exist yet. Dry-run must not create folders, so it validates against the current + // project state only. + if (!dryRun) + EnsureParentFolder(dest); + + var validation = AssetDatabase.ValidateMoveAsset(sourcePath, dest); + if (!string.IsNullOrEmpty(validation)) + throw new ArgumentException($"Cannot move '{sourcePath}' to '{dest}': {validation}"); + + if (dryRun) + return new AuthoringResult { AssetPath = dest, Type = AssetDatabase.GetMainAssetTypeAtPath(sourcePath)?.Name }; + + var moveError = AssetDatabase.MoveAsset(sourcePath, dest); + if (!string.IsNullOrEmpty(moveError)) + throw new ArgumentException($"Failed to move '{sourcePath}' to '{dest}': {moveError}"); + + var loaded = AssetDatabase.LoadMainAssetAtPath(dest); + var result = ObjectResolver.Describe(loaded) ?? new AuthoringResult(); + result.AssetPath = dest; + return result; + } + + [CliCommand("copy_asset", "Copy an asset to a new path under the authoring root. The copy gets a fresh GUID.")] + public static AuthoringResult CopyAsset( + [CliArg("asset", "Reference to the asset to copy (path / guid / globalId).", Required = true)] ObjectRef asset, + [CliArg("destination", "Destination asset path relative to the authoring root, including extension. The Assets/ prefix is optional.", Required = true)] string destination, + [CliArg("confirm", "Required (true) only when overwriting an existing asset at the destination path.")] bool confirm = false, + [CliArg("dry_run", "If true, validate inputs and report what would be copied without writing anything.")] bool dryRun = false) + { + var sourcePath = ResolveAssetPath(asset); + + var dest = ProjectPaths.Resolve(destination, out var error); + if (dest == null) + throw new ArgumentException(error); + + var exists = AssetDatabase.LoadMainAssetAtPath(dest) != null; + if (exists && !confirm) + throw new ArgumentException($"An asset already exists at '{dest}'. Pass confirm=true to overwrite it."); + + if (dryRun) + return new AuthoringResult { AssetPath = dest, Type = AssetDatabase.GetMainAssetTypeAtPath(sourcePath)?.Name }; + + EnsureParentFolder(dest); + + // AssetDatabase.CopyAsset fails if the destination already exists, so delete it first when + // the caller has confirmed an overwrite (the confirm guard above gates that). + if (exists) + AssetDatabase.DeleteAsset(dest); + + if (!AssetDatabase.CopyAsset(sourcePath, dest)) + throw new ArgumentException($"Failed to copy '{sourcePath}' to '{dest}'."); + + var loaded = AssetDatabase.LoadMainAssetAtPath(dest); + var result = ObjectResolver.Describe(loaded) ?? new AuthoringResult(); + result.AssetPath = dest; + return result; + } + + [CliCommand("rename_asset", "Rename an asset in place (keeps it in the same folder, keeps its GUID).")] + public static AuthoringResult RenameAsset( + [CliArg("asset", "Reference to the asset to rename (path / guid / globalId).", Required = true)] ObjectRef asset, + [CliArg("new_name", "New file name WITHOUT a folder path. The extension is preserved if omitted.", Required = true)] string newName, + [CliArg("dry_run", "If true, validate the rename without performing it.")] bool dryRun = false) + { + if (string.IsNullOrWhiteSpace(newName)) + throw new ArgumentException("new_name is required."); + if (newName.Contains("/") || newName.Contains("\\")) + throw new ArgumentException("new_name must be a file name only, not a path. Use move_asset to relocate an asset."); + + var sourcePath = ResolveAssetPath(asset); + + // Preserve the original extension when the agent omits one (AssetDatabase.RenameAsset expects no extension). + var bareName = Path.GetFileNameWithoutExtension(newName); + var extension = Path.GetExtension(sourcePath); + var folder = Path.GetDirectoryName(sourcePath)?.Replace('\\', '/'); + var destPath = $"{folder}/{bareName}{extension}"; + + if (AssetDatabase.LoadMainAssetAtPath(destPath) != null) + throw new ArgumentException($"An asset already exists at '{destPath}'."); + + if (dryRun) + return new AuthoringResult { AssetPath = destPath, Type = AssetDatabase.GetMainAssetTypeAtPath(sourcePath)?.Name }; + + var renameError = AssetDatabase.RenameAsset(sourcePath, bareName); + if (!string.IsNullOrEmpty(renameError)) + throw new ArgumentException($"Failed to rename '{sourcePath}': {renameError}"); + + var loaded = AssetDatabase.LoadMainAssetAtPath(destPath); + var result = ObjectResolver.Describe(loaded) ?? new AuthoringResult(); + result.AssetPath = destPath; + return result; + } + + [CliCommand("delete_asset", "Delete an asset from the project. Destructive: requires confirm=true.")] + public static AuthoringResult DeleteAsset( + [CliArg("asset", "Reference to the asset to delete (path / guid / globalId).", Required = true)] ObjectRef asset, + [CliArg("confirm", "Must be true to actually delete. Without it the command refuses (destructive guard).")] bool confirm = false, + [CliArg("dry_run", "If true, report the asset that would be deleted without deleting it.")] bool dryRun = false) + { + var sourcePath = ResolveAssetPath(asset); + + // Capture the identity before deletion so the agent gets a record of what was removed. + var loaded = AssetDatabase.LoadMainAssetAtPath(sourcePath); + var result = ObjectResolver.Describe(loaded) ?? new AuthoringResult { Type = AssetDatabase.GetMainAssetTypeAtPath(sourcePath)?.Name }; + result.AssetPath = sourcePath; + + if (dryRun) + return result; + + if (!confirm) + throw new ArgumentException($"Refusing to delete '{sourcePath}'. Pass confirm=true to delete it (destructive, not undoable via Unity's Undo)."); + + if (!AssetDatabase.DeleteAsset(sourcePath)) + throw new ArgumentException($"Failed to delete '{sourcePath}'."); + + return result; + } + + [CliCommand("find_assets", "Find assets by type and/or name and/or label, returning their path, GUID and type. At least one filter is required.")] + public static FindAssetsResult FindAssets( + [CliArg("type", "Type name to filter by (e.g. Material, GameObject, ScriptableObject, MyGame.GameConfig). Resolved to a System.Type and matched against each asset's actual main type.")] string type = null, + [CliArg("name", "Name substring to filter by (AssetDatabase name filter).")] string name = null, + [CliArg("label", "Asset label to filter by (AssetDatabase 'l:' filter).")] string label = null, + [CliArg("search_in", "Folder to scope the search to, relative to the authoring root (default: the authoring root).")] string searchIn = null, + [CliArg("limit", "Maximum number of results to return (default 200).")] int limit = 200) + { + if (string.IsNullOrWhiteSpace(type) && string.IsNullOrWhiteSpace(name) && string.IsNullOrWhiteSpace(label)) + throw new ArgumentException("At least one of type, name, or label is required."); + + // The type filter is applied by post-filtering on each asset's actual loaded type rather + // than via AssetDatabase's "t:" token: "t:" does NOT reliably match freshly-created/custom + // ScriptableObject assets (it can return 0 even for "t:ScriptableObject"), though it works + // for built-in types. Name/label searches do work, so build the query from those only. + var filterParts = new System.Collections.Generic.List(); + if (!string.IsNullOrWhiteSpace(name)) + filterParts.Add(name.Trim()); + if (!string.IsNullOrWhiteSpace(label)) + filterParts.Add($"l:{label.Trim()}"); + var filter = string.Join(" ", filterParts); + + // Default the search scope to the authoring root (not the whole project) so an agent only + // ever discovers assets within its sandbox unless an explicit scope is given. + var scopeError = (string)null; + var scope = !string.IsNullOrWhiteSpace(searchIn) + ? ProjectPaths.Resolve(searchIn, out scopeError) + : ProjectPaths.AuthoringRoot; + if (scope == null) + throw new ArgumentException(scopeError); + var searchFolders = new[] { scope }; + + // Resolve the type filter up front so an unresolvable name fails fast with a clear message. + Type typeFilter = null; + if (!string.IsNullOrWhiteSpace(type)) + { + typeFilter = ResolveTypeName(type.Trim()); + if (typeFilter == null) + throw new ArgumentException( + $"Could not resolve type '{type}'. Use a short name (e.g. Material) or a fully-qualified name (e.g. MyGame.GameConfig)."); + } + + // An empty name/label filter enumerates every asset under the search folders. + var guids = AssetDatabase.FindAssets(filter ?? string.Empty, searchFolders); + + var result = new FindAssetsResult { Filter = filter }; + foreach (var guid in guids) + { + var assetPath = AssetDatabase.GUIDToAssetPath(guid); + if (string.IsNullOrEmpty(assetPath)) + continue; + + var mainType = AssetDatabase.GetMainAssetTypeAtPath(assetPath); + if (typeFilter != null && (mainType == null || !typeFilter.IsAssignableFrom(mainType))) + continue; + + if (result.Assets.Count >= limit) + { + result.Truncated = true; + break; + } + + result.Assets.Add(new AuthoringResult + { + AssetPath = assetPath, + Guid = guid, + Type = mainType?.Name + }); + } + + result.Count = result.Assets.Count; + return result; + } + + /// + /// Resolve a user-supplied type name (short or fully-qualified) to a by + /// scanning non-dynamic loaded assemblies. Returns null when no match is found. + /// + private static Type ResolveTypeName(string typeName) + { + var direct = Type.GetType(typeName, throwOnError: false); + if (direct != null) + return direct; + + var physicsMaterialType = ResolvePhysicsMaterialTypeName(typeName); + if (physicsMaterialType != null) + return physicsMaterialType; + + foreach (var assembly in PipelineUtils.GetLoadedAssemblies()) + { + if (assembly.IsDynamic) + continue; + + var byFullName = assembly.GetType(typeName, throwOnError: false); + if (byFullName != null) + return byFullName; + } + + foreach (var assembly in PipelineUtils.GetLoadedAssemblies()) + { + if (assembly.IsDynamic) + continue; + + Type[] types; + try + { + types = assembly.GetTypes(); + } + catch (ReflectionTypeLoadException ex) + { + types = ex.Types; + } + + foreach (var candidate in types) + { + if (candidate != null && candidate.Name == typeName) + return candidate; + } + } + + return null; + } + + /// + /// Resolve an to a project-relative asset path, rejecting handles that + /// do not resolve to an on-disk asset (scene objects have no asset path). The resolved path is + /// confined to the authoring root so a GUID/globalId handle cannot make a destructive command + /// (delete/move/copy/rename) operate on an asset outside the sandbox. + /// + private static string ResolveAssetPath(ObjectRef asset) + { + var assetPath = ObjectResolver.TryResolve(asset, out var obj, out var error) + ? AssetDatabase.GetAssetPath(obj) + : null; + + // Fallback: a path reference that points at an asset which exists on disk (a GUID is + // registered) but whose object cannot be loaded — e.g. a just-moved asset whose object + // isn't reloadable this frame, or an asset with an unresolved/broken script. We can still + // operate on it by path, so honor the path rather than failing the whole command. + if (string.IsNullOrEmpty(assetPath) && !string.IsNullOrEmpty(asset?.Path)) + { + var candidate = ProjectPaths.Resolve(asset.Path, out _); + if (candidate != null && !string.IsNullOrEmpty(AssetDatabase.AssetPathToGUID(candidate))) + assetPath = candidate; + } + + if (string.IsNullOrEmpty(assetPath)) + throw new ArgumentException(error ?? $"Reference '{asset}' does not point at an on-disk asset."); + + // Confine to the authoring root. ProjectPaths.Resolve treats explicit "Assets/..." paths as + // project-relative and rejects anything outside the configured root. + var confined = ProjectPaths.Resolve(assetPath, out var confineError); + if (confined == null) + throw new ArgumentException( + $"Asset '{assetPath}' is outside the authoring root '{ProjectPaths.AuthoringRoot}': {confineError}"); + + return confined; + } + + /// Create the asset's parent folder chain if it does not yet exist. + private static void EnsureParentFolder(string assetPath) + { + var parent = Path.GetDirectoryName(assetPath)?.Replace('\\', '/'); + if (string.IsNullOrEmpty(parent) || AssetDatabase.IsValidFolder(parent)) + return; + + CreateFolderRecursive(parent); + } + + private static void CreateFolderRecursive(string assetsPath) + { + if (AssetDatabase.IsValidFolder(assetsPath)) + return; + + var parent = Path.GetDirectoryName(assetsPath)?.Replace('\\', '/'); + var name = Path.GetFileName(assetsPath); + if (string.IsNullOrEmpty(parent) || string.IsNullOrEmpty(name)) + throw new ArgumentException($"Invalid folder path '{assetsPath}'."); + + if (!AssetDatabase.IsValidFolder(parent)) + CreateFolderRecursive(parent); + + AssetDatabase.CreateFolder(parent, name); + } + + /// Convert a project-relative asset path to an absolute filesystem path. + private static string ToAbsolute(string projectRelative) + { + return $"{ProjectPaths.ProjectRoot.Replace('\\', '/')}/{projectRelative}"; + } + + /// + /// CLI-221: resolve the shader to assign to a newly-created . + /// - An explicit must resolve via ; + /// a miss is a clear, actionable error (no null Material / null-ref downstream). + /// - When omitted, default to the active render pipeline's lit shader: "Universal Render + /// Pipeline/Lit" when an SRP asset is active, else built-in "Standard". If that default + /// can't be found, fall back to "Standard"; if even that is missing, error clearly. + /// + private static Shader ResolveShader(string shaderName) + { + if (!string.IsNullOrWhiteSpace(shaderName)) + { + var requested = Shader.Find(shaderName.Trim()); + if (requested == null) + throw new ArgumentException($"Shader '{shaderName}' not found."); + return requested; + } + + var usingSrp = UnityEngine.Rendering.GraphicsSettings.currentRenderPipeline != null; + var defaultName = usingSrp ? "Universal Render Pipeline/Lit" : "Standard"; + + var defaultShader = Shader.Find(defaultName); + if (defaultShader != null) + return defaultShader; + + // Fall back to the built-in Standard shader (always present in the Built-in RP, and a sane + // last resort even under an SRP project that lacks the URP/Lit shader). + var standard = Shader.Find("Standard"); + if (standard != null) + return standard; + + throw new ArgumentException( + $"Could not resolve a default shader ('{defaultName}' or 'Standard'). Pass an explicit shader= argument."); + } + + /// + /// Resolve a user-supplied type name to a . Tries the name as-is (covers + /// fully-qualified names), then scans loaded assemblies for an exact full-name or short-name + /// match (covers "Material" or a user type given without its namespace). + /// + private static Type ResolveType(string typeName) + { + if (string.IsNullOrWhiteSpace(typeName)) + return null; + + // Trim once up front so every resolution path below (special-case + assembly/type scans) + // sees the same normalized name — leading/trailing whitespace must not be accepted for one + // type and rejected for another. + typeName = typeName.Trim(); + + // CLI-222: in Unity 6 the type is UnityEngine.PhysicsMaterial (renamed from PhysicMaterial). + // A short name "PhysicsMaterial" resolves fine, but the legacy short name "PhysicMaterial" + // matches the obsolete forwarder/alias inconsistently across versions — normalize BOTH the + // current and legacy names (short or fully-qualified) to the real type up front so callers + // can use either spelling. + if (typeName == "PhysicsMaterial" || typeName == "PhysicMaterial" + || typeName == "UnityEngine.PhysicsMaterial" || typeName == "UnityEngine.PhysicMaterial") + { + return typeof(PipelinePhysicsMaterial); + } + + var direct = Type.GetType(typeName, throwOnError: false); + if (direct != null) + return direct; + + foreach (var assembly in PipelineUtils.GetLoadedAssemblies()) + { + var byFullName = assembly.GetType(typeName, throwOnError: false); + if (byFullName != null) + return byFullName; + } + + // Fall back to a short-name match across all loaded types. + foreach (var assembly in PipelineUtils.GetLoadedAssemblies()) + { + Type[] types; + try + { + types = assembly.GetTypes(); + } + catch (ReflectionTypeLoadException ex) + { + types = ex.Types; + } + + foreach (var candidate in types) + { + if (candidate != null && candidate.Name == typeName) + return candidate; + } + } + + return null; + } + + private static Type ResolvePhysicsMaterialTypeName(string typeName) + { + if (typeName == "PhysicsMaterial" || typeName == "PhysicMaterial" + || typeName == "UnityEngine.PhysicsMaterial" || typeName == "UnityEngine.PhysicMaterial") + { + return typeof(PipelinePhysicsMaterial); + } + + return null; + } + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Assets/AssetCommands.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Assets/AssetCommands.cs.meta new file mode 100644 index 00000000..6afcc352 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Assets/AssetCommands.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 47b49bf20465486fb6ffdf6c03775b16 diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Assets/AssetImportCommands.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Assets/AssetImportCommands.cs new file mode 100644 index 00000000..e6741dd7 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Assets/AssetImportCommands.cs @@ -0,0 +1,654 @@ +using System; +using System.Collections.Generic; +using System.Reflection; +using Newtonsoft.Json.Linq; +using Unity.Pipeline.Commands; +using Unity.Pipeline.Editor.Authoring; +using Unity.Pipeline.Models; +using UnityEditor; + +namespace Unity.Pipeline.Editor.Commands.Assets +{ + /// + /// + /// Import-settings authoring commands (CLI-191 + CLI-212). Reads and edits the + /// for an asset. + /// + /// + /// + /// set_import_settings sets named members on the importer from a JSON object and re-imports. + /// For the Default platform it sets top-level public properties/fields via reflection (works + /// across every importer kind). For a real platform on a / + /// , keys are applied onto the platform-override struct + /// ( / ) which + /// is unreachable by top-level reflection. has no per-platform overrides. + /// + /// + /// + /// get_import_settings reads the importer state structured by importer type (texture / model / + /// audio), including the default-platform fields and, for textures/audio, one platform override block. + /// + /// + /// + /// Unknown keys are reported back rather than silently ignored, so an agent gets actionable feedback. + /// + /// + /// + /// NOTE: import settings live in the asset's .meta file via the importer; this is an AssetDatabase + /// operation and is not part of Unity's Undo system. SaveAndReimport is not destructive to the + /// source file, so no confirm is required. + /// + /// + public static class AssetImportCommands + { + // Caller-facing platform names accepted by both commands. "Default" means the default platform + // (top-level importer properties / default sample settings); the rest are real build platforms. + private static readonly HashSet s_SupportedPlatforms = new HashSet(StringComparer.OrdinalIgnoreCase) + { + "Default", "Standalone", "iOS", "Android", "WebGL", "tvOS" + }; + + [CliCommand("set_import_settings", "Set import settings on an asset's AssetImporter (default platform top-level properties, or a texture/audio per-platform override) and re-import it.")] + public static SetImportSettingsResult SetImportSettings( + [CliArg("asset", "Reference to the asset whose importer to edit (path / guid / globalId).", Required = true)] ObjectRef asset, + [CliArg("settings", "JSON object of importer property/field names to values, e.g. {\"isReadable\": true, \"textureType\": \"NormalMap\"}. For platform != Default on a texture/audio importer, keys map onto the platform-settings struct (e.g. maxTextureSize, format, compressionFormat, quality, and overridden).", Required = true)] JObject settings, + [CliArg("platform", "Target platform: Default | Standalone | iOS | Android | WebGL | tvOS. Defaults to Default (top-level importer properties). A real platform writes a per-platform override (textures/audio only).")] string platform = "Default", + [CliArg("dry_run", "If true, validate which settings would apply (and which are unknown) without writing or re-importing.")] bool dryRun = false) + { + var importer = ResolveImporter(asset, out var assetPath); + + if (settings == null || settings.Count == 0) + throw new ArgumentException("settings must be a non-empty JSON object."); + + if (!s_SupportedPlatforms.Contains(platform)) + throw new ArgumentException( + Serialize(new ErrorResult { Code = "unknown_platform", Message = $"Unknown platform '{platform}'. Supported: {string.Join(", ", s_SupportedPlatforms)}." })); + + var canonicalPlatform = Canonical(platform); + var isDefault = string.Equals(canonicalPlatform, "Default", StringComparison.OrdinalIgnoreCase); + + var result = new SetImportSettingsResult + { + AssetPath = assetPath, + ImporterType = importer.GetType().Name, + Platform = canonicalPlatform + }; + + // Strip the server-injected token before iterating: it is never an importer setting. + var keys = new List(); + foreach (var pair in settings) + { + if (pair.Key == "token") + continue; + keys.Add(pair.Key); + } + if (keys.Count == 0) + throw new ArgumentException("settings must be a non-empty JSON object."); + + if (isDefault) + { + ApplyDefaultPlatform(importer, settings, keys, result, write: !dryRun); + } + else + { + switch (importer) + { + case TextureImporter texture: + ApplyTexturePlatform(texture, settings, keys, canonicalPlatform, result, write: !dryRun); + break; + case AudioImporter audio: + ApplyAudioPlatform(audio, settings, keys, canonicalPlatform, result, write: !dryRun); + break; + case ModelImporter _: + throw new ArgumentException( + Serialize(new ErrorResult { Code = "no_platform_overrides", Message = "ModelImporter has no per-platform overrides; use platform=Default." })); + default: + throw new ArgumentException( + Serialize(new ErrorResult { Code = "no_platform_overrides", Message = $"Importer '{result.ImporterType}' has no per-platform overrides; use platform=Default." })); + } + } + + if (result.Unknown.Count > 0 && result.Applied.Count == 0) + throw new ArgumentException($"None of the supplied settings could be applied to '{result.ImporterType}' (unknown key or invalid value): {string.Join(", ", result.Unknown)}."); + + if (dryRun) + return result; + + importer.SaveAndReimport(); + return result; + } + + [CliCommand("get_import_settings", "Read an asset's import settings, structured by importer type (texture/model/audio), including the default-platform fields and (for textures/audio) one platform override block.")] + public static GetImportSettingsResult GetImportSettings( + [CliArg("asset", "Reference to the asset whose importer to read (path / guid / globalId).", Required = true)] ObjectRef asset, + [CliArg("platform", "Platform whose override to read: Default | Standalone | iOS | Android | WebGL | tvOS. Defaults to Default.")] string platform = "Default") + { + var importer = ResolveImporter(asset, out var assetPath); + + if (!s_SupportedPlatforms.Contains(platform)) + throw new ArgumentException( + Serialize(new ErrorResult { Code = "unknown_platform", Message = $"Unknown platform '{platform}'. Supported: {string.Join(", ", s_SupportedPlatforms)}." })); + + var canonicalPlatform = Canonical(platform); + var isDefault = string.Equals(canonicalPlatform, "Default", StringComparison.OrdinalIgnoreCase); + + var result = new GetImportSettingsResult + { + AssetPath = assetPath, + ImporterType = importer.GetType().Name, + Platform = canonicalPlatform + }; + + switch (importer) + { + case TextureImporter texture: + result.Settings = ReadTextureDefaults(texture); + result.PlatformOverride = ReadTexturePlatformOverride(texture, canonicalPlatform, isDefault); + break; + case ModelImporter model: + result.Settings = ReadModelDefaults(model); + result.PlatformOverride = null; // ModelImporter has no per-platform overrides. + break; + case AudioImporter audio: + result.Settings = ReadAudioDefaults(audio); + result.PlatformOverride = ReadAudioPlatformOverride(audio, canonicalPlatform, isDefault); + break; + default: + // Non-import asset (e.g. a ScriptableObject via NativeFormatImporter): return a + // minimal settings block rather than throwing. + result.Settings = new Dictionary + { + ["userData"] = importer.userData, + ["assetBundleName"] = importer.assetBundleName + }; + result.PlatformOverride = null; + break; + } + + return result; + } + + // ------------------------------------------------------------------ resolution / helpers + + /// + /// Resolve an to its , confined to the + /// authoring root. Throws an actionable on any failure. + /// + private static AssetImporter ResolveImporter(ObjectRef asset, out string assetPath) + { + if (!ObjectResolver.TryResolve(asset, out var obj, out var error)) + throw new ArgumentException(error); + + assetPath = AssetDatabase.GetAssetPath(obj); + if (string.IsNullOrEmpty(assetPath)) + throw new ArgumentException($"Reference '{asset}' does not point at an on-disk asset."); + + // Confine to the authoring root so a GUID/globalId handle cannot reach an asset outside the + // sandbox. + assetPath = ProjectPaths.Resolve(assetPath, out var confineError); + if (assetPath == null) + throw new ArgumentException( + $"Asset '{asset}' is outside the authoring root '{ProjectPaths.AuthoringRoot}': {confineError}"); + + var importer = AssetImporter.GetAtPath(assetPath); + if (importer == null) + throw new ArgumentException($"No AssetImporter found for '{assetPath}'."); + + return importer; + } + + /// Normalize a caller platform name to its canonical capitalization (e.g. "ios" -> "iOS"). + private static string Canonical(string platform) + { + foreach (var supported in s_SupportedPlatforms) + { + if (string.Equals(supported, platform, StringComparison.OrdinalIgnoreCase)) + return supported; + } + return platform; + } + + /// + /// Map a caller-facing platform name to the build-platform string Unity's importer APIs expect. + /// Most match 1:1; iOS is "iPhone" to those APIs. + /// + private static string UnityPlatformName(string canonicalPlatform) + { + return string.Equals(canonicalPlatform, "iOS", StringComparison.OrdinalIgnoreCase) ? "iPhone" : canonicalPlatform; + } + + // ------------------------------------------------------------------ default-platform reflection + + private static void ApplyDefaultPlatform(AssetImporter importer, JObject settings, List keys, SetImportSettingsResult result, bool write) + { + var importerType = importer.GetType(); + const BindingFlags flags = BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase; + + foreach (var key in keys) + { + // In dry_run we only validate the member exists and the value converts — never mutate the + // (possibly cached) importer instance, so a dry run leaves no trace. + var applied = TryApplyMember(importer, importerType, flags, key, settings[key], write); + if (applied) + result.Applied.Add(key); + else + result.Unknown.Add(key); + } + } + + /// + /// Set a single named property or field on the target from a JSON token. Returns false when no + /// writable member with that name exists or the value cannot be converted to the member type. + /// Enum members accept the value name (case-insensitive) as well as numeric values. + /// + private static bool TryApplyMember(object target, Type type, BindingFlags flags, string memberName, JToken value, bool write) + { + var property = type.GetProperty(memberName, flags); + if (property != null && property.CanWrite && property.GetIndexParameters().Length == 0) + { + return TryConvertAndSet(property.PropertyType, value, + converted => { if (write) property.SetValue(target, converted); }); + } + + var field = type.GetField(memberName, flags); + if (field != null) + { + return TryConvertAndSet(field.FieldType, value, + converted => { if (write) field.SetValue(target, converted); }); + } + + return false; + } + + /// + /// Convert a JSON token to (with case-insensitive enum-name support) + /// and, on success, invoke . Returns false when the value cannot convert. + /// + private static bool TryConvertAndSet(Type targetType, JToken value, Action set) + { + try + { + if (!TryConvert(targetType, value, out var converted)) + return false; + set(converted); + return true; + } + catch + { + return false; + } + } + + /// + /// Convert a JSON token to a CLR value. Enums accept their value name (case-insensitive) or an + /// integral value; everything else defers to Newtonsoft's . + /// + private static bool TryConvert(Type targetType, JToken value, out object converted) + { + converted = null; + var underlying = Nullable.GetUnderlyingType(targetType) ?? targetType; + + if (underlying.IsEnum) + { + if (value.Type == JTokenType.String) + { + var name = value.Value(); + if (string.IsNullOrEmpty(name)) + return false; + try + { + converted = Enum.Parse(underlying, name, ignoreCase: true); + return true; + } + catch + { + return false; + } + } + + if (value.Type == JTokenType.Integer) + { + converted = Enum.ToObject(underlying, value.Value()); + return true; + } + + return false; + } + + converted = value.ToObject(targetType); + return true; + } + + // ------------------------------------------------------------------ texture platform overrides + + private static void ApplyTexturePlatform(TextureImporter texture, JObject settings, List keys, string canonicalPlatform, SetImportSettingsResult result, bool write) + { + var unityPlatform = UnityPlatformName(canonicalPlatform); + // Boxed struct so reflection SetValue mutates the local copy; written back via SetPlatformTextureSettings. + object boxed = texture.GetPlatformTextureSettings(unityPlatform); + var type = typeof(TextureImporterPlatformSettings); + const BindingFlags flags = BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase; + + // Only treat "overridden" as explicitly provided when the caller passes a valid boolean. + // A non-boolean value is caught by TrySetBoolMember (reported to unknown[]), so we must + // not suppress the default overridden=true in that case or the override is silently skipped. + var explicitOverridden = settings.TryGetValue("overridden", StringComparison.OrdinalIgnoreCase, out var overriddenTok) + && overriddenTok.Type == JTokenType.Boolean; + + foreach (var key in keys) + { + if (string.Equals(key, "overridden", StringComparison.OrdinalIgnoreCase)) + { + // Handled explicitly below; still report it as applied. + if (TrySetBoolMember(type, flags, boxed, "overridden", settings[key], write)) + result.Applied.Add(key); + else + result.Unknown.Add(key); + continue; + } + + if (TryApplyMember(boxed, type, flags, key, settings[key], write)) + result.Applied.Add(key); + else + result.Unknown.Add(key); + } + + // Default the override on (the caller intends to set platform-specific values) unless they + // explicitly passed overridden:false (in which case the value they passed is already in the + // boxed copy from the loop above). + if (!explicitOverridden) + SetBool(type, flags, boxed, "overridden", true); + + if (write && result.Applied.Count > 0) + { + var settingsStruct = (TextureImporterPlatformSettings)boxed; + settingsStruct.name = unityPlatform; + texture.SetPlatformTextureSettings(settingsStruct); + } + } + + /// + /// Set a named boolean member from a JSON token. Returns false when the token is not a boolean or + /// no settable bool member with that name exists, so a non-existent member is reported as unknown + /// rather than falsely applied. In =false (dry-run) mode the member is only + /// probed for existence, never mutated. + /// + private static bool TrySetBoolMember(Type type, BindingFlags flags, object boxed, string member, JToken token, bool write) + { + if (token.Type != JTokenType.Boolean) + return false; + if (!write) + return BoolMemberExists(type, flags, member); + return SetBool(type, flags, boxed, member, token.Value()); + } + + /// True when a settable boolean property or field with that name exists on the type. + private static bool BoolMemberExists(Type type, BindingFlags flags, string member) + { + var property = type.GetProperty(member, flags); + if (property != null && property.CanWrite && property.PropertyType == typeof(bool) + && property.GetIndexParameters().Length == 0) + return true; + + var field = type.GetField(member, flags); + return field != null && field.FieldType == typeof(bool); + } + + /// + /// Write a boolean property or field (matching 's property-then-field + /// resolution so a bool implemented as a property is also honored). Returns false — without + /// mutating anything — when no settable bool member with that name exists. + /// + private static bool SetBool(Type type, BindingFlags flags, object boxed, string member, bool value) + { + var property = type.GetProperty(member, flags); + if (property != null && property.CanWrite && property.PropertyType == typeof(bool) + && property.GetIndexParameters().Length == 0) + { + property.SetValue(boxed, value); + return true; + } + + var field = type.GetField(member, flags); + if (field != null && field.FieldType == typeof(bool)) + { + field.SetValue(boxed, value); + return true; + } + + return false; + } + + private static Dictionary ReadTextureDefaults(TextureImporter texture) + { + return new Dictionary + { + ["textureType"] = texture.textureType.ToString(), + ["textureShape"] = texture.textureShape.ToString(), + ["sRGBTexture"] = texture.sRGBTexture, + ["alphaSource"] = texture.alphaSource.ToString(), + ["alphaIsTransparency"] = texture.alphaIsTransparency, + ["isReadable"] = texture.isReadable, + ["streamingMipmaps"] = texture.streamingMipmaps, + ["mipmapEnabled"] = texture.mipmapEnabled, + ["wrapMode"] = texture.wrapMode.ToString(), + ["filterMode"] = texture.filterMode.ToString(), + ["anisoLevel"] = texture.anisoLevel, + ["spriteImportMode"] = texture.spriteImportMode.ToString(), + ["spritePixelsPerUnit"] = texture.spritePixelsPerUnit, + ["npotScale"] = texture.npotScale.ToString(), + ["maxTextureSize"] = texture.maxTextureSize + }; + } + + private static Dictionary ReadTexturePlatformOverride(TextureImporter texture, string canonicalPlatform, bool isDefault) + { + var settings = isDefault + ? texture.GetDefaultPlatformTextureSettings() + : texture.GetPlatformTextureSettings(UnityPlatformName(canonicalPlatform)); + + return new Dictionary + { + ["overridden"] = !isDefault && settings.overridden, + ["maxTextureSize"] = settings.maxTextureSize, + ["resizeAlgorithm"] = settings.resizeAlgorithm.ToString(), + ["format"] = settings.format.ToString(), + ["textureCompression"] = settings.textureCompression.ToString(), + ["compressionQuality"] = settings.compressionQuality, + ["crunchedCompression"] = settings.crunchedCompression, + ["androidETC2FallbackOverride"] = settings.androidETC2FallbackOverride.ToString() + }; + } + + // ------------------------------------------------------------------ audio platform overrides + + private static void ApplyAudioPlatform(AudioImporter audio, JObject settings, List keys, string canonicalPlatform, SetImportSettingsResult result, bool write) + { + var unityPlatform = UnityPlatformName(canonicalPlatform); + + // overridden:false clears the override entirely (and ignores any other keys). + if (settings.TryGetValue("overridden", StringComparison.OrdinalIgnoreCase, out var overriddenToken) + && overriddenToken.Type == JTokenType.Boolean + && !overriddenToken.Value()) + { + result.Applied.Add("overridden"); + if (write) + audio.ClearSampleSettingOverride(unityPlatform); + return; + } + + object boxed = audio.GetOverrideSampleSettings(unityPlatform); + var type = typeof(AudioImporterSampleSettings); + const BindingFlags flags = BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase; + + foreach (var key in keys) + { + if (string.Equals(key, "overridden", StringComparison.OrdinalIgnoreCase)) + { + // Only accept a boolean; anything else is a misuse and goes to unknown[]. + if (settings[key].Type == JTokenType.Boolean) + result.Applied.Add(key); + else + result.Unknown.Add(key); + continue; + } + + if (TryApplyMember(boxed, type, flags, key, settings[key], write)) + result.Applied.Add(key); + else + result.Unknown.Add(key); + } + + if (write && result.Applied.Count > 0) + { + var settingsStruct = (AudioImporterSampleSettings)boxed; + audio.SetOverrideSampleSettings(unityPlatform, settingsStruct); + } + } + + private static Dictionary ReadAudioDefaults(AudioImporter audio) + { + var sample = audio.defaultSampleSettings; + return new Dictionary + { + ["forceToMono"] = audio.forceToMono, + ["loadInBackground"] = audio.loadInBackground, + ["ambisonic"] = audio.ambisonic, + ["loadType"] = sample.loadType.ToString(), + ["compressionFormat"] = sample.compressionFormat.ToString(), + ["quality"] = sample.quality, + ["sampleRateSetting"] = sample.sampleRateSetting.ToString(), + ["sampleRateOverride"] = sample.sampleRateOverride + }; + } + + private static Dictionary ReadAudioPlatformOverride(AudioImporter audio, string canonicalPlatform, bool isDefault) + { + if (isDefault) + { + var sample = audio.defaultSampleSettings; + return new Dictionary + { + ["overridden"] = false, + ["loadType"] = sample.loadType.ToString(), + ["compressionFormat"] = sample.compressionFormat.ToString(), + ["quality"] = sample.quality, + ["sampleRateSetting"] = sample.sampleRateSetting.ToString(), + ["sampleRateOverride"] = sample.sampleRateOverride + }; + } + + var unityPlatform = UnityPlatformName(canonicalPlatform); + var overridden = audio.ContainsSampleSettingsOverride(unityPlatform); + var settings = audio.GetOverrideSampleSettings(unityPlatform); + return new Dictionary + { + ["overridden"] = overridden, + ["loadType"] = settings.loadType.ToString(), + ["compressionFormat"] = settings.compressionFormat.ToString(), + ["quality"] = settings.quality, + ["sampleRateSetting"] = settings.sampleRateSetting.ToString(), + ["sampleRateOverride"] = settings.sampleRateOverride + }; + } + + // ------------------------------------------------------------------ model defaults (no overrides) + + private static Dictionary ReadModelDefaults(ModelImporter model) + { + return new Dictionary + { + // Meshes + ["globalScale"] = model.globalScale, + ["useFileScale"] = model.useFileScale, + ["meshCompression"] = model.meshCompression.ToString(), + ["isReadable"] = model.isReadable, + ["meshOptimizationFlags"] = model.meshOptimizationFlags.ToString(), + ["weldVertices"] = model.weldVertices, + ["indexFormat"] = model.indexFormat.ToString(), + ["keepQuads"] = model.keepQuads, + // Normals / Tangents + ["importNormals"] = model.importNormals.ToString(), + ["normalCalculationMode"] = model.normalCalculationMode.ToString(), + ["normalSmoothingAngle"] = model.normalSmoothingAngle, + ["importTangents"] = model.importTangents.ToString(), + ["importBlendShapes"] = model.importBlendShapes, + // Geometry + ["importCameras"] = model.importCameras, + ["importLights"] = model.importLights, + ["swapUVChannels"] = model.swapUVChannels, + ["generateSecondaryUV"] = model.generateSecondaryUV, + // Materials + ["materialImportMode"] = model.materialImportMode.ToString(), + ["materialLocation"] = model.materialLocation.ToString(), + // Animation + ["importAnimation"] = model.importAnimation, + ["animationType"] = model.animationType.ToString(), + ["importConstraints"] = model.importConstraints, + ["importVisibility"] = model.importVisibility + }; + } + + private static string Serialize(object value) + { + return Newtonsoft.Json.JsonConvert.SerializeObject(value); + } + } + + /// + /// Result of set_import_settings: target platform plus which keys were applied vs. unknown. + /// + [Serializable] + public class SetImportSettingsResult + { + [Newtonsoft.Json.JsonProperty("assetPath")] + public string AssetPath { get; set; } + + [Newtonsoft.Json.JsonProperty("importerType")] + public string ImporterType { get; set; } + + [Newtonsoft.Json.JsonProperty("platform")] + public string Platform { get; set; } + + [Newtonsoft.Json.JsonProperty("applied")] + public List Applied { get; set; } = new List(); + + [Newtonsoft.Json.JsonProperty("unknown")] + public List Unknown { get; set; } = new List(); + } + + /// + /// Result of get_import_settings: the importer type, default-platform settings, and (for + /// textures/audio) one platform-override block. platformOverride is null for ModelImporter and + /// non-import assets. + /// + [Serializable] + public class GetImportSettingsResult + { + [Newtonsoft.Json.JsonProperty("assetPath")] + public string AssetPath { get; set; } + + [Newtonsoft.Json.JsonProperty("importerType")] + public string ImporterType { get; set; } + + [Newtonsoft.Json.JsonProperty("settings")] + public Dictionary Settings { get; set; } + + [Newtonsoft.Json.JsonProperty("platform")] + public string Platform { get; set; } + + [Newtonsoft.Json.JsonProperty("platformOverride")] + public Dictionary PlatformOverride { get; set; } + } + + /// Structured error payload serialized into the thrown ArgumentException message. + [Serializable] + public class ErrorResult + { + [Newtonsoft.Json.JsonProperty("code")] + public string Code { get; set; } + + [Newtonsoft.Json.JsonProperty("message")] + public string Message { get; set; } + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Assets/AssetImportCommands.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Assets/AssetImportCommands.cs.meta new file mode 100644 index 00000000..f1ef29b3 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Assets/AssetImportCommands.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: cb5b302104dc446d8d94f33252087062 diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Assets/FindAssetsResult.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Assets/FindAssetsResult.cs new file mode 100644 index 00000000..18c9cc53 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Assets/FindAssetsResult.cs @@ -0,0 +1,34 @@ +using System.Collections.Generic; +using Newtonsoft.Json; +using Unity.Pipeline.Models; + +namespace Unity.Pipeline.Editor.Commands.Assets +{ + /// + /// Structured result for the find_assets command (CLI-191): a list of matched assets, each + /// described as the canonical (path / GUID / type) so an agent can + /// feed any entry straight back into another command as an . + /// + /// Lives in the Editor command assembly (rather than Runtime/Models) because find_assets is an + /// Editor-only command and the foundation Runtime/Models are shared/frozen for parallel work. + /// + [System.Serializable] + public class FindAssetsResult + { + /// The AssetDatabase filter string that was executed (for diagnostics). + [JsonProperty("filter")] + public string Filter { get; set; } + + /// Number of assets returned (after the limit is applied). + [JsonProperty("count")] + public int Count { get; set; } + + /// True when the result was capped by the limit argument. + [JsonProperty("truncated")] + public bool Truncated { get; set; } + + /// The matched assets, each with path / GUID / type. + [JsonProperty("assets")] + public List Assets { get; set; } = new List(); + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Assets/FindAssetsResult.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Assets/FindAssetsResult.cs.meta new file mode 100644 index 00000000..c9166401 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Assets/FindAssetsResult.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 7ff032cead554b7f97cd2467a83abd35 diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Assets/FolderCommands.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Assets/FolderCommands.cs new file mode 100644 index 00000000..4d162401 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Assets/FolderCommands.cs @@ -0,0 +1,51 @@ +using System; +using System.IO; +using Unity.Pipeline.Commands; +using Unity.Pipeline.Editor.Authoring; +using Unity.Pipeline.Models; +using UnityEditor; + +namespace Unity.Pipeline.Editor.Commands.Assets +{ + /// + /// Asset-folder authoring commands. Reference exemplar for the authoring foundation (CLI-190): + /// it validates input through the project-path sandbox () and returns + /// the canonical envelope so an agent can reference the created + /// folder in follow-up calls. + /// + public static class FolderCommands + { + [CliCommand("create_folder", "Create a folder under the authoring root (creates intermediate folders).")] + public static AuthoringResult CreateFolder( + [CliArg("path", "Folder path relative to the authoring root (default Assets/); the Assets/ prefix is optional. e.g. Gameplay/Enemies or Assets/Gameplay/Enemies", Required = true)] string path) + { + var normalized = ProjectPaths.Resolve(path, out var error); + if (normalized == null) + throw new ArgumentException(error); + + CreateFolderRecursive(normalized); + AssetDatabase.Refresh(); + + var folder = AssetDatabase.LoadAssetAtPath(normalized); + var result = ObjectResolver.Describe(folder) ?? new AuthoringResult { Type = "DefaultAsset" }; + result.AssetPath = normalized; + return result; + } + + private static void CreateFolderRecursive(string assetsPath) + { + if (AssetDatabase.IsValidFolder(assetsPath)) + return; + + var parent = Path.GetDirectoryName(assetsPath)?.Replace('\\', '/'); + var name = Path.GetFileName(assetsPath); + if (string.IsNullOrEmpty(parent) || string.IsNullOrEmpty(name)) + throw new ArgumentException($"Invalid folder path '{assetsPath}'."); + + if (!AssetDatabase.IsValidFolder(parent)) + CreateFolderRecursive(parent); + + AssetDatabase.CreateFolder(parent, name); + } + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Assets/FolderCommands.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Assets/FolderCommands.cs.meta new file mode 100644 index 00000000..25bacd03 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Assets/FolderCommands.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b78420627d9cd1e43835d9088975e691 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Assets/TextFileCommands.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Assets/TextFileCommands.cs new file mode 100644 index 00000000..365a9a5f --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Assets/TextFileCommands.cs @@ -0,0 +1,126 @@ +using System; +using System.IO; +using Newtonsoft.Json; +using Unity.Pipeline.Commands; +using Unity.Pipeline.Editor.Authoring; +using Unity.Pipeline.Models; +using UnityEditor; + +namespace Unity.Pipeline.Editor.Commands.Assets +{ + /// + /// Text-file authoring commands (CLI-191): read and write UTF-8 text files inside the authoring + /// sandbox. Useful for editing data assets that are plain text (JSON/CSV/.txt/.cs/.shader, etc.). + /// + /// Every path is funnelled through , so reads/writes are confined + /// to the authoring root and "../"/out-of-project paths are rejected. Writing imports the file back + /// into the AssetDatabase so Unity picks up the change. + /// + /// NOTE: writing is potentially destructive (it can overwrite an existing file), so overwriting an + /// existing file requires an explicit confirm argument; dry_run is supported. + /// Filesystem writes are not part of Unity's Undo system. + /// + public static class TextFileCommands + { + [CliCommand("read_text_file", "Read a UTF-8 text file under the authoring root and return its contents.", MainThreadRequired = true)] + public static ReadTextFileResult ReadTextFile( + [CliArg("path", "Text file path relative to the authoring root. The Assets/ prefix is optional.", Required = true)] string path, + [CliArg("max_bytes", "Reject files larger than this many bytes (default 1048576 = 1 MiB) to avoid huge payloads.")] int maxBytes = 1024 * 1024) + { + var normalized = ProjectPaths.Resolve(path, out var error); + if (normalized == null) + throw new ArgumentException(error); + + var absolute = ToAbsolute(normalized); + if (!File.Exists(absolute)) + throw new ArgumentException($"No file at '{normalized}'."); + + var length = new FileInfo(absolute).Length; + if (length > maxBytes) + throw new ArgumentException($"File '{normalized}' is {length} bytes, which exceeds max_bytes={maxBytes}."); + + return new ReadTextFileResult + { + AssetPath = normalized, + Bytes = (int)length, + Contents = File.ReadAllText(absolute) + }; + } + + [CliCommand("write_text_file", "Write UTF-8 text to a file under the authoring root, then import it. Overwriting an existing file requires confirm=true.")] + public static AuthoringResult WriteTextFile( + [CliArg("path", "Text file path relative to the authoring root, including extension. The Assets/ prefix is optional.", Required = true)] string path, + [CliArg("contents", "The full text content to write (replaces the file).", Required = true)] string contents, + [CliArg("confirm", "Required (true) only when overwriting an existing file at the path.")] bool confirm = false, + [CliArg("dry_run", "If true, validate inputs and report what would be written without writing anything.")] bool dryRun = false) + { + var normalized = ProjectPaths.Resolve(path, out var error); + if (normalized == null) + throw new ArgumentException(error); + + if (contents == null) + throw new ArgumentException("contents is required (use an empty string to write an empty file)."); + + var absolute = ToAbsolute(normalized); + var exists = File.Exists(absolute); + if (exists && !confirm) + throw new ArgumentException($"A file already exists at '{normalized}'. Pass confirm=true to overwrite it."); + + if (dryRun) + return new AuthoringResult { AssetPath = normalized, Type = "TextAsset" }; + + EnsureParentFolder(normalized); + File.WriteAllText(absolute, contents); + AssetDatabase.ImportAsset(normalized, ImportAssetOptions.ForceUpdate); + + var loaded = AssetDatabase.LoadMainAssetAtPath(normalized); + var result = ObjectResolver.Describe(loaded) ?? new AuthoringResult { Type = "TextAsset" }; + result.AssetPath = normalized; + return result; + } + + private static void EnsureParentFolder(string assetPath) + { + var parent = Path.GetDirectoryName(assetPath)?.Replace('\\', '/'); + if (string.IsNullOrEmpty(parent) || AssetDatabase.IsValidFolder(parent)) + return; + + CreateFolderRecursive(parent); + } + + private static void CreateFolderRecursive(string assetsPath) + { + if (AssetDatabase.IsValidFolder(assetsPath)) + return; + + var parent = Path.GetDirectoryName(assetsPath)?.Replace('\\', '/'); + var name = Path.GetFileName(assetsPath); + if (string.IsNullOrEmpty(parent) || string.IsNullOrEmpty(name)) + throw new ArgumentException($"Invalid folder path '{assetsPath}'."); + + if (!AssetDatabase.IsValidFolder(parent)) + CreateFolderRecursive(parent); + + AssetDatabase.CreateFolder(parent, name); + } + + private static string ToAbsolute(string projectRelative) + { + return $"{ProjectPaths.ProjectRoot.Replace('\\', '/')}/{projectRelative}"; + } + } + + /// Result of read_text_file: the file contents plus its identity and size. + [Serializable] + public class ReadTextFileResult + { + [JsonProperty("assetPath")] + public string AssetPath { get; set; } + + [JsonProperty("bytes")] + public int Bytes { get; set; } + + [JsonProperty("contents")] + public string Contents { get; set; } + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Assets/TextFileCommands.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Assets/TextFileCommands.cs.meta new file mode 100644 index 00000000..b8375b84 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Assets/TextFileCommands.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: f57a6d794d1e4c40976f65ec3774b8ed diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Authoring.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Authoring.meta new file mode 100644 index 00000000..6184fe61 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Authoring.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7512e3b6952430f4b8fb5c67dd22f13f +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Authoring/AuthoringConfigCommands.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Authoring/AuthoringConfigCommands.cs new file mode 100644 index 00000000..e941eea7 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Authoring/AuthoringConfigCommands.cs @@ -0,0 +1,29 @@ +using Unity.Pipeline.Commands; +using Unity.Pipeline.Editor.Authoring; + +namespace Unity.Pipeline.Editor.Commands.Authoring +{ + /// + /// Commands to inspect and configure the authoring root — the base folder (under Assets/) that + /// bare authoring paths resolve against and that authoring writes are confined to. Persisted + /// per project; the default is "Assets" (full Assets access). + /// + public static class AuthoringConfigCommands + { + [CliCommand("get_authoring_root", "Get the base folder (under Assets/) that bare authoring paths resolve against.")] + public static object GetAuthoringRoot() + { + return new { root = ProjectPaths.AuthoringRoot }; + } + + [CliCommand("set_authoring_root", "Set the base folder (under Assets/) that bare authoring paths resolve against and are confined to. Use 'Assets' for full project access.")] + public static object SetAuthoringRoot( + [CliArg("root", "Project-relative folder under Assets/, e.g. Assets/AgentWork. Use 'Assets' to allow the whole project.", Required = true)] string root) + { + // Throws ArgumentException for invalid roots (outside Assets/ or containing ".."); the + // server surfaces that message to the caller. + ProjectPaths.AuthoringRoot = root; + return new { root = ProjectPaths.AuthoringRoot }; + } + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Authoring/AuthoringConfigCommands.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Authoring/AuthoringConfigCommands.cs.meta new file mode 100644 index 00000000..76c13ef8 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Authoring/AuthoringConfigCommands.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c4429604fb18e8347a2e2efdefc49663 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/AutoTickCommand.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/AutoTickCommand.cs new file mode 100644 index 00000000..0801f308 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/AutoTickCommand.cs @@ -0,0 +1,87 @@ +using System; +using System.Reflection; +using Unity.Pipeline.Commands; +using UnityEditor; + +namespace Unity.Pipeline.Editor.Commands +{ + /// + /// Opt-in mode that keeps the Unity Editor ticking at full rate even when its window is + /// unfocused. Unity throttles EditorApplication.update when the editor is in the background, + /// which can stall long-running work (HTTP commands, async test runs) driven from the CLI. + /// + /// When enabled, this forces EditorApplication.SignalTick() on every update, which schedules + /// the next tick immediately and keeps the loop spinning. It is off by default and changes + /// nothing in normal package behavior. Cross-platform: no native/OS calls. + /// + /// Note: state is static and resets on domain reload, so auto-tick turns itself off after a + /// recompile; re-enable it if needed. Forcing full-rate ticks uses CPU like a focused editor. + /// + public static class AutoTickCommand + { + private static bool s_Enabled; + private static Action s_SignalTick; + private static EditorApplication.CallbackFunction s_Pump; + private static readonly System.Diagnostics.Stopwatch s_Stopwatch = new System.Diagnostics.Stopwatch(); + private static long s_IntervalMs; + + [CliCommand("set_autotick", "Keep the editor ticking while unfocused by forcing EditorApplication.SignalTick at a throttled rate", MainThreadRequired = true)] + public static string SetAutoTick( + [CliArg("enable", "Enable (true) or disable (false) auto-tick mode")] bool enable = true, + [CliArg("interval_ms", "Minimum milliseconds between forced ticks. 0 = every update (max rate, pegs a CPU core). Default 16 (~60Hz).")] int intervalMs = 16) + { + if (enable && s_Enabled) + { + s_IntervalMs = Math.Max(0, intervalMs); + return $"Auto-tick already enabled (interval updated to {s_IntervalMs}ms)"; + } + if (!enable && !s_Enabled) + return "Auto-tick already disabled"; + + if (enable) + { + if (s_SignalTick == null) + { + var method = typeof(EditorApplication).GetMethod( + "SignalTick", + BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public); + + if (method == null) + return "Error: EditorApplication.SignalTick not found (internal API may have changed)"; + + try + { + s_SignalTick = (Action)Delegate.CreateDelegate(typeof(Action), method); + } + catch (Exception ex) + { + return $"Error: could not bind EditorApplication.SignalTick: {ex.Message}"; + } + } + + s_IntervalMs = Math.Max(0, intervalMs); + s_Stopwatch.Restart(); + s_Pump = () => + { + if (s_IntervalMs <= 0 || s_Stopwatch.ElapsedMilliseconds >= s_IntervalMs) + { + s_Stopwatch.Restart(); + s_SignalTick(); + } + }; + EditorApplication.update += s_Pump; + s_Enabled = true; + return $"Auto-tick enabled (interval {s_IntervalMs}ms)"; + } + + if (s_Pump != null) + { + EditorApplication.update -= s_Pump; + s_Pump = null; + } + s_Stopwatch.Stop(); + s_Enabled = false; + return "Auto-tick disabled"; + } + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/AutoTickCommand.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/AutoTickCommand.cs.meta new file mode 100644 index 00000000..1b29ec1c --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/AutoTickCommand.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 76bae7b5ceb53dd498f891ed7f1e0d19 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Baking.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Baking.meta new file mode 100644 index 00000000..131b0325 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Baking.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 758dc2e598a448e5b80e66443fede0d9 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Baking/BakeSceneGuard.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Baking/BakeSceneGuard.cs new file mode 100644 index 00000000..41227768 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Baking/BakeSceneGuard.cs @@ -0,0 +1,42 @@ +using System.Linq; +using UnityEngine.SceneManagement; + +namespace Unity.Pipeline.Editor.Commands.Baking +{ + /// + /// Shared helpers for the CLI-215 bake commands (lighting / NavMesh / occlusion). All three bakes + /// act on the currently open scene(s) — there is no per-asset target — so before triggering + /// any bake we verify at least one open, saved scene exists. A bake against no open/saved scene is + /// rejected up front with the documented { code: "no_scene" } result (returned, not thrown, + /// to match the CLI-215 spec), and nothing is started. + /// + internal static class BakeSceneGuard + { + /// The structured "no_scene" error payload returned by a trigger with no bakeable scene. + internal static object NoSceneResult() + { + return new + { + code = "no_scene", + message = "No open, saved scene to bake. Open a scene first (open_scene) and ensure it is saved to disk." + }; + } + + /// + /// True when there is at least one open, loaded scene that has been saved to disk (a non-empty + /// path). An untitled/never-saved scene has an empty and cannot host a + /// bake (its data has nowhere to live), so it does not count. + /// + internal static bool HasBakeableScene() + { + return OpenScenes().Any(s => s.isLoaded && !string.IsNullOrEmpty(s.path)); + } + + /// Enumerate every open scene by index. + internal static System.Collections.Generic.IEnumerable OpenScenes() + { + for (int i = 0; i < SceneManager.sceneCount; i++) + yield return SceneManager.GetSceneAt(i); + } + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Baking/BakeSceneGuard.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Baking/BakeSceneGuard.cs.meta new file mode 100644 index 00000000..40ddf756 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Baking/BakeSceneGuard.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: cf05be2261cb475c9cf3d7fccbf65ff5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Baking/LightingBakeCommands.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Baking/LightingBakeCommands.cs new file mode 100644 index 00000000..0a428efa --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Baking/LightingBakeCommands.cs @@ -0,0 +1,640 @@ +using System; +using System.IO; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using Unity.Pipeline.Commands; +using UnityEditor; +using UnityEngine; + +namespace Unity.Pipeline.Editor.Commands.Baking +{ + /// + /// CLI-215 Group A — Lightmapping bake commands. Trigger an async lightmap bake of the open + /// scene(s), poll its status, cancel it, clear baked data, and read/configure the active + /// . + /// + /// Why async (trigger-then-poll, mirroring ): a full lightmap bake runs + /// for seconds-to-minutes. kicks the bake off and returns + /// immediately; bake_lighting therefore returns { status: "baking", bakeId } right + /// away and the caller polls lighting_bake_status until it reports completed. + /// + /// In-flight state is held in static fields and is domain-reload aware: a bake can survive (or + /// resume across) a domain reload, so on reload reconciles our recorded + /// state against the live flag and a small status file under + /// Temp/ (which persists across the reload, mirroring RecompileCommand). Completion is detected via + /// the callback and, defensively, by polling + /// flipping false in . + /// + [InitializeOnLoad] + public static class LightingBakeCommands + { + const string StatusFile = "Temp/pipeline_lighting_bake_status.json"; + + static readonly object s_Lock = new object(); + + // True between trigger and the completion callback / isRunning flipping false. + static bool s_Tracking; + static string s_BakeId; + static DateTime s_StartedUtc; + + static LightingBakeCommands() + { + // Reconcile any in-flight bake recorded before a domain reload, then keep watching. + OnReload(); + Lightmapping.bakeCompleted += OnBakeCompleted; + EditorApplication.update += OnUpdate; + } + + #region bake_lighting + + [CliCommand("bake_lighting", "Trigger an async lightmap bake of the open scene(s) via Lightmapping.BakeAsync(). Returns immediately; poll lighting_bake_status until completed.")] + public static object BakeLighting( + [CliArg("confirm", "Recommended (true): a bake overwrites existing lightmap data. Accepted for parity; not required.")] bool confirm = false, + [CliArg("dry_run", "If true, validate there is an open bakeable scene and return the current lighting settings without baking.")] bool dryRun = false) + { + if (!BakeSceneGuard.HasBakeableScene()) + return BakeSceneGuard.NoSceneResult(); + + // Reconcile before the in-progress check so a stale flag from a finished/cancelled bake + // doesn't wrongly report bake_in_progress. + OnUpdate(); + + if (Lightmapping.isRunning) + return new { code = "bake_in_progress", message = "A lighting bake is already running. Poll lighting_bake_status." }; + + if (dryRun) + return new { status = "dry_run", wouldBake = true, settings = ReadLightingSettings() }; + + var bakeId = Guid.NewGuid().ToString("N"); + lock (s_Lock) + { + s_Tracking = true; + s_BakeId = bakeId; + s_StartedUtc = DateTime.UtcNow; + } + + WriteStatus(new LightingBakeStatus + { + Status = "baking", + BakeId = bakeId, + IsBaking = true, + StartedUtcTicks = s_StartedUtc.Ticks + }); + + // BakeAsync returns false if the bake could not be started (e.g. another job in flight). + if (!Lightmapping.BakeAsync()) + { + lock (s_Lock) { s_Tracking = false; } + WriteStatus(new LightingBakeStatus { Status = "idle" }); + return new { code = "bake_in_progress", message = "Lightmapping.BakeAsync() refused to start (a bake may already be running)." }; + } + + return new { status = "baking", bakeId }; + } + + [CliCommand("lighting_bake_status", "Get the status of the last lighting bake: idle | baking | completed.", MainThreadRequired = false)] + public static string LightingBakeStatus() + { + if (File.Exists(StatusFile)) + return File.ReadAllText(StatusFile); + return "{\"status\":\"idle\"}"; + } + + [CliCommand("cancel_lighting_bake", "Cancel an in-progress lighting bake (Lightmapping.Cancel()).")] + public static object CancelLightingBake() + { + var wasRunning = Lightmapping.isRunning; + if (wasRunning) + Lightmapping.Cancel(); + + lock (s_Lock) + { + if (s_Tracking) + { + var ms = (int)Math.Max(0, (DateTime.UtcNow - s_StartedUtc).TotalMilliseconds); + WriteStatus(new LightingBakeStatus + { + Status = "completed", + Result = "cancelled", + BakeId = s_BakeId, + BakeTimeMs = ms + }); + s_Tracking = false; + } + } + + return new { cancelled = wasRunning }; + } + + [CliCommand("clear_baked_lighting", "Clear baked lightmap data for the open scene(s). Destructive: requires confirm=true.")] + public static object ClearBakedLighting( + [CliArg("confirm", "Must be true to actually clear (destructive, not undoable via Unity's Undo).")] bool confirm = false, + [CliArg("include_disk_cache", "If true, also clear the GI disk cache (Lightmapping.ClearDiskCache()).")] bool includeDiskCache = false, + [CliArg("dry_run", "If true, report what would be cleared without clearing.")] bool dryRun = false) + { + if (!confirm) + throw new ArgumentException("Refusing to clear baked lighting. Pass confirm=true (destructive, not undoable via Unity's Undo)."); + + if (dryRun) + return new { status = "dry_run", wouldClear = true, includeDiskCache }; + + Lightmapping.Clear(); + if (includeDiskCache) + Lightmapping.ClearDiskCache(); + + return new { cleared = true, includeDiskCache }; + } + + #endregion + + #region settings + + [CliCommand("get_lighting_settings", "Read the active LightingSettings (lightmapper, bounces, resolution, directional mode, AO, etc.).")] + public static LightingSettingsResult GetLightingSettings() + { + return ReadLightingSettings(); + } + + [CliCommand("set_lighting_settings", "Apply a subset of lighting settings to the active LightingSettings. Returns { applied[], unknown[] }.")] + public static object SetLightingSettings( + [CliArg("settings", "JSON object with a subset of lighting fields to set (same names/enums as get_lighting_settings).", Required = true)] JObject settings, + [CliArg("dry_run", "If true, validate the keys and report applied/unknown without changing anything.")] bool dryRun = false) + { + if (settings == null) + throw new ArgumentException("settings is required (a JSON object of lighting fields to set)."); + + // In dry_run we must not create or assign a LightingSettings asset (no writes). When no + // settings exist yet, validate the requested keys against a transient throwaway instance + // that is never assigned, so applied/unknown is still reported without persisting anything. + var ls = ActiveLightingSettings(allowCreate: !dryRun, out var source); + LightingSettings transient = null; + if (ls == null) + { + transient = new LightingSettings { name = "PipelineLightingSettings (dry-run)" }; + ls = transient; + source = "none"; + } + + var applied = new System.Collections.Generic.List(); + var unknown = new System.Collections.Generic.List(); + + foreach (var prop in settings.Properties()) + { + if (TryApply(ls, prop.Name, prop.Value, dryRun)) + applied.Add(prop.Name); + else + unknown.Add(prop.Name); + } + + if (!dryRun && applied.Count > 0) + EditorUtility.SetDirty(ls); + + // The transient dry-run instance is never assigned anywhere; destroy it so it doesn't leak. + if (transient != null) + UnityEngine.Object.DestroyImmediate(transient); + + return new + { + applied = applied.ToArray(), + unknown = unknown.ToArray(), + settingsSource = source, + dryRun + }; + } + + #endregion + + #region completion / reload bookkeeping + + static void OnBakeCompleted() + { + lock (s_Lock) + { + if (!s_Tracking) + return; + Finish("succeeded"); + } + } + + /// + /// Defensive completion detector: if we are tracking a bake but Lightmapping reports it is no + /// longer running and the completion callback didn't fire (e.g. a cancel, or a bake that ended + /// during a frame we didn't get the callback), finalize the status here. + /// + static void OnUpdate() + { + lock (s_Lock) + { + if (s_Tracking && !Lightmapping.isRunning) + Finish("succeeded"); + } + } + + // Must be called under s_Lock. + static void Finish(string result) + { + var ms = (int)Math.Max(0, (DateTime.UtcNow - s_StartedUtc).TotalMilliseconds); + var status = new LightingBakeStatus + { + Status = "completed", + Result = result, + BakeId = s_BakeId, + BakeTimeMs = ms, + Stats = result == "succeeded" ? CollectStats() : null + }; + WriteStatus(status); + s_Tracking = false; + } + + /// + /// Reconcile recorded in-flight state after a domain reload. The status file under Temp/ survives + /// the reload; if it said "baking" but Lightmapping is no longer running, the bake finished while + /// the domain was being reloaded, so mark it completed. If it is still running, resume tracking. + /// + static void OnReload() + { + if (!File.Exists(StatusFile)) + return; + + LightingBakeStatus prior; + try + { + prior = JsonConvert.DeserializeObject(File.ReadAllText(StatusFile)); + } + catch + { + return; + } + + if (prior == null || prior.Status != "baking") + return; + + lock (s_Lock) + { + s_BakeId = prior.BakeId; + s_StartedUtc = prior.StartedUtcTicks > 0 ? new DateTime(prior.StartedUtcTicks, DateTimeKind.Utc) : DateTime.UtcNow; + + if (Lightmapping.isRunning) + { + s_Tracking = true; // resume; OnUpdate/OnBakeCompleted will finalize. + } + else + { + s_Tracking = true; + Finish("succeeded"); // ended during the reload window. + } + } + } + + #endregion + + #region settings read/write helpers + + /// + /// The active for the open scene. When the scene has no explicit + /// LightingSettings asset assigned, Unity falls back to a hidden per-scene default that + /// / + /// still exposes; we read/write that. records which we used. + /// + /// When none is available and is true, a new settings asset is + /// created and assigned so a real (non-dry_run) set has a target. When + /// is false (dry_run), this returns null rather than creating/assigning anything, so the + /// dry_run "no writes" contract holds. + /// + static LightingSettings ActiveLightingSettings(bool allowCreate, out string source) + { + // Lightmapping.lightingSettings returns the active scene's settings (assigned asset or the + // scene's embedded/default settings). It throws if there is genuinely none; guard for that. + try + { + var ls = Lightmapping.lightingSettings; + if (ls != null) + { + source = AssetDatabase.Contains(ls) ? "asset" : "scene-default"; + return ls; + } + } + catch + { + // fall through to (optionally) creating one + } + + if (!allowCreate) + { + source = "none"; + return null; + } + + // No settings available: create and assign one so set_lighting_settings has a target. + var created = new LightingSettings { name = "PipelineLightingSettings" }; + Lightmapping.lightingSettings = created; + source = "created"; + return created; + } + + static LightingSettingsResult ReadLightingSettings() + { + LightingSettings ls; + try + { + ls = Lightmapping.lightingSettings; + } + catch + { + ls = null; + } + + if (ls == null) + return new LightingSettingsResult { Available = false }; + + return new LightingSettingsResult + { + Available = true, + Lightmapper = ls.lightmapper.ToString(), + BakedGI = ls.bakedGI, + RealtimeGI = ls.realtimeGI, + DirectSampleCount = ls.directSampleCount, + IndirectSampleCount = ls.indirectSampleCount, + EnvironmentSampleCount = ls.environmentSampleCount, + Bounces = ls.maxBounces, + LightmapResolution = ls.lightmapResolution, + LightmapPadding = ls.lightmapPadding, + MaxLightmapSize = ls.lightmapMaxSize, + LightmapCompression = ls.lightmapCompression.ToString(), + // Unity 6000 serialises directionalityMode as a flags enum whose .ToString() can + // produce compound strings (e.g. "Single, Dual") for values that span multiple bits. + // Map to the two-value contract the spec guarantees: 0 → NonDirectional, else → Directional. + DirectionalMode = (int)ls.directionalityMode == 0 ? "NonDirectional" : "Directional", + Ao = ls.ao, + AoMaxDistance = ls.aoMaxDistance, + FilteringMode = ls.filteringMode.ToString() + }; + } + + /// + /// Apply one settings key/value to the LightingSettings. Returns false for unrecognized keys so + /// the caller can report them as unknown[]. Enum-valued fields accept their string names + /// (case-insensitive). In dry-run mode we still validate (parse) the value but do not assign. + /// + static bool TryApply(LightingSettings ls, string key, JToken value, bool dryRun) + { + switch (key) + { + case "lightmapper": + return SetEnum(value, dryRun, v => ls.lightmapper = v); + case "bakedGI": + if (!dryRun) ls.bakedGI = value.Value(); + return true; + case "realtimeGI": + if (!dryRun) ls.realtimeGI = value.Value(); + return true; + case "directSampleCount": + if (!dryRun) ls.directSampleCount = value.Value(); + return true; + case "indirectSampleCount": + if (!dryRun) ls.indirectSampleCount = value.Value(); + return true; + case "environmentSampleCount": + if (!dryRun) ls.environmentSampleCount = value.Value(); + return true; + case "bounces": + if (!dryRun) ls.maxBounces = value.Value(); + return true; + case "lightmapResolution": + if (!dryRun) ls.lightmapResolution = value.Value(); + return true; + case "lightmapPadding": + if (!dryRun) ls.lightmapPadding = value.Value(); + return true; + case "maxLightmapSize": + if (!dryRun) ls.lightmapMaxSize = value.Value(); + return true; + case "lightmapCompression": + return SetEnum(value, dryRun, v => ls.lightmapCompression = v); + case "directionalMode": + // Accept the two spec names ("NonDirectional", "Directional") and also Unity's + // internal name ("CombinedDirectional") for back-compat. Integer values pass through + // as-is so callers can target any raw enum slot Unity exposes. + if (value.Type == JTokenType.Integer) + { + if (!dryRun) ls.directionalityMode = (LightmapsMode)value.Value(); + return true; + } + var modeStr = value.Value() ?? string.Empty; + if (modeStr.Equals("NonDirectional", StringComparison.OrdinalIgnoreCase)) + { + if (!dryRun) ls.directionalityMode = (LightmapsMode)0; + return true; + } + if (modeStr.Equals("Directional", StringComparison.OrdinalIgnoreCase) || + modeStr.Equals("CombinedDirectional", StringComparison.OrdinalIgnoreCase)) + { + if (!dryRun) ls.directionalityMode = (LightmapsMode)1; + return true; + } + throw new ArgumentException( + $"Value '{modeStr}' is not valid for directionalMode. Valid: NonDirectional, Directional."); + case "ao": + if (!dryRun) ls.ao = value.Value(); + return true; + case "aoMaxDistance": + if (!dryRun) ls.aoMaxDistance = value.Value(); + return true; + case "filteringMode": + return SetEnum(value, dryRun, v => ls.filteringMode = v); + default: + return false; + } + } + + static bool SetEnum(JToken value, bool dryRun, Action assign) where TEnum : struct + { + // Accept either the enum's string name (case-insensitive) or its integer value. + if (value.Type == JTokenType.Integer) + { + var iv = value.Value(); + if (!Enum.IsDefined(typeof(TEnum), iv)) + throw new ArgumentException($"Value '{iv}' is not valid for {typeof(TEnum).Name}."); + if (!dryRun) assign((TEnum)Enum.ToObject(typeof(TEnum), iv)); + return true; + } + + var name = value.Value(); + if (!Enum.TryParse(name, ignoreCase: true, out var parsed)) + throw new ArgumentException( + $"Value '{name}' is not valid for {typeof(TEnum).Name}. Valid: {string.Join(", ", Enum.GetNames(typeof(TEnum)))}."); + if (!dryRun) assign(parsed); + return true; + } + + #endregion + + #region stats + + /// + /// Collect post-bake lightmap statistics from : the + /// number of baked lightmaps, their total texture size in bytes (color maps), the atlas size, + /// the active lightmap resolution, and the baked light-probe count. + /// + static LightingBakeStats CollectStats() + { + var stats = new LightingBakeStats(); + + var maps = LightmapSettings.lightmaps; + if (maps != null) + { + stats.LightmapCount = maps.Length; + long total = 0; + int atlas = 0; + foreach (var data in maps) + { + var tex = data?.lightmapColor; + if (tex == null) + continue; + atlas = Mathf.Max(atlas, Mathf.Max(tex.width, tex.height)); + total += EstimateTextureBytes(tex); + } + stats.TotalLightmapSizeBytes = total; + stats.AtlasSize = atlas; + } + + try + { + stats.LightmapResolution = Lightmapping.lightingSettings != null + ? Lightmapping.lightingSettings.lightmapResolution + : 0f; + } + catch + { + stats.LightmapResolution = 0f; + } + + var probes = LightmapSettings.lightProbes; + stats.BakedProbeCount = probes != null ? probes.count : 0; + + return stats; + } + + /// Rough byte estimate for a baked lightmap texture (4 bytes/pixel; good enough for a size signal). + static long EstimateTextureBytes(Texture tex) + { + return (long)tex.width * tex.height * 4; + } + + #endregion + + static void WriteStatus(LightingBakeStatus status) + { + try + { + File.WriteAllText(StatusFile, JsonConvert.SerializeObject(status)); + } + catch (Exception ex) + { + Debug.LogError($"[LightingBake] Failed to write status file: {ex.Message}"); + } + } + } + + /// Status/result payload for bake_lighting / lighting_bake_status. + [Serializable] + public class LightingBakeStatus + { + [JsonProperty("status")] + public string Status { get; set; } + + [JsonProperty("bakeId")] + public string BakeId { get; set; } + + [JsonProperty("result", NullValueHandling = NullValueHandling.Ignore)] + public string Result { get; set; } + + [JsonProperty("isBaking")] + public bool IsBaking { get; set; } + + [JsonProperty("bakeTimeMs")] + public int BakeTimeMs { get; set; } + + [JsonProperty("stats", NullValueHandling = NullValueHandling.Ignore)] + public LightingBakeStats Stats { get; set; } + + // Internal bookkeeping so a bake can be reconciled across a domain reload. Not part of the + // documented schema, but harmless to expose. + [JsonProperty("startedUtcTicks")] + public long StartedUtcTicks { get; set; } + } + + /// Post-bake lightmap statistics (CLI-215 acceptance: lightmapCount >= 1, bakeTimeMs > 0). + [Serializable] + public class LightingBakeStats + { + [JsonProperty("lightmapCount")] + public int LightmapCount { get; set; } + + [JsonProperty("totalLightmapSizeBytes")] + public long TotalLightmapSizeBytes { get; set; } + + [JsonProperty("atlasSize")] + public int AtlasSize { get; set; } + + [JsonProperty("lightmapResolution")] + public float LightmapResolution { get; set; } + + [JsonProperty("bakedProbeCount")] + public int BakedProbeCount { get; set; } + } + + /// Result of get_lighting_settings (and the dry-run payload of bake_lighting). + [Serializable] + public class LightingSettingsResult + { + /// False when no LightingSettings could be read for the active scene. + [JsonProperty("available")] + public bool Available { get; set; } + + [JsonProperty("lightmapper", NullValueHandling = NullValueHandling.Ignore)] + public string Lightmapper { get; set; } + + [JsonProperty("bakedGI")] + public bool BakedGI { get; set; } + + [JsonProperty("realtimeGI")] + public bool RealtimeGI { get; set; } + + [JsonProperty("directSampleCount")] + public int DirectSampleCount { get; set; } + + [JsonProperty("indirectSampleCount")] + public int IndirectSampleCount { get; set; } + + [JsonProperty("environmentSampleCount")] + public int EnvironmentSampleCount { get; set; } + + [JsonProperty("bounces")] + public int Bounces { get; set; } + + [JsonProperty("lightmapResolution")] + public float LightmapResolution { get; set; } + + [JsonProperty("lightmapPadding")] + public int LightmapPadding { get; set; } + + [JsonProperty("maxLightmapSize")] + public int MaxLightmapSize { get; set; } + + [JsonProperty("lightmapCompression", NullValueHandling = NullValueHandling.Ignore)] + public string LightmapCompression { get; set; } + + [JsonProperty("directionalMode", NullValueHandling = NullValueHandling.Ignore)] + public string DirectionalMode { get; set; } + + [JsonProperty("ao")] + public bool Ao { get; set; } + + [JsonProperty("aoMaxDistance")] + public float AoMaxDistance { get; set; } + + [JsonProperty("filteringMode", NullValueHandling = NullValueHandling.Ignore)] + public string FilteringMode { get; set; } + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Baking/LightingBakeCommands.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Baking/LightingBakeCommands.cs.meta new file mode 100644 index 00000000..e8d6736c --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Baking/LightingBakeCommands.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: dd7529c9d1f14ff98b9eb3e9a1e8ba5b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Baking/NavMeshBakeCommands.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Baking/NavMeshBakeCommands.cs new file mode 100644 index 00000000..6b557334 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Baking/NavMeshBakeCommands.cs @@ -0,0 +1,424 @@ +using System; +using System.Collections.Generic; +using System.IO; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using Unity.Pipeline.Commands; +using UnityEditor; +using UnityEditor.AI; +using UnityEngine; + +// CLI-215 deliberately targets the built-in legacy UnityEditor.AI.NavMeshBuilder (see class doc). It is +// [Obsolete] in Unity 6000.x (the modern path is the com.unity.ai.navigation package), but is the +// intentional v1 baker here, so suppress CS0618 file-wide rather than migrate. +#pragma warning disable CS0618 + +namespace Unity.Pipeline.Editor.Commands.Baking +{ + /// + /// CLI-215 Group B — NavMesh bake commands, targeting the built-in legacy baker + /// (always available; bakes a single scene NavMesh from + /// the Navigation-static geometry of the open scene). Trigger an async build, poll its status, + /// cancel it, clear the baked NavMesh, and read/configure the default agent's bake settings. + /// + /// The newer AI Navigation package (com.unity.ai.navigation, NavMeshSurface + /// components) is OUT for v1 — we do NOT add an asmdef reference to it. bake_navmesh_surfaces + /// is a guarded stub that probes for the package by reflection and returns + /// { code: "package_not_found" } when it is absent (full support is a follow-up). + /// + /// Async pattern mirrors / : trigger + /// returns immediately, completion is detected by flipping + /// false (polled in ), and in-flight state is held in static + /// fields reconciled against a Temp/ status file across domain reloads. + /// + [InitializeOnLoad] + public static class NavMeshBakeCommands + { + const string StatusFile = "Temp/pipeline_navmesh_bake_status.json"; + + // The serialized NavMesh bake-settings live on the Navigation window's settings object, keyed by + // these property names (stable across 2019+ / Unity 6). + const string PropAgentRadius = "m_BuildSettings.agentRadius"; + const string PropAgentHeight = "m_BuildSettings.agentHeight"; + const string PropAgentSlope = "m_BuildSettings.agentSlope"; + const string PropAgentClimb = "m_BuildSettings.agentClimb"; + const string PropMinRegionArea = "m_BuildSettings.minRegionArea"; + const string PropManualCellSize = "m_BuildSettings.manualCellSize"; + const string PropCellSize = "m_BuildSettings.cellSize"; + + static readonly object s_Lock = new object(); + static bool s_Tracking; + static string s_BakeId; + static DateTime s_StartedUtc; + + static NavMeshBakeCommands() + { + OnReload(); + EditorApplication.update += OnUpdate; + } + + #region bake_navmesh + + [CliCommand("bake_navmesh", "Trigger an async legacy NavMesh bake of the open scene(s) via UnityEditor.AI.NavMeshBuilder. Returns immediately; poll navmesh_bake_status until completed.")] + public static object BakeNavMesh( + [CliArg("confirm", "Accepted for parity (a bake overwrites the existing NavMesh); not required.")] bool confirm = false, + [CliArg("dry_run", "If true, validate there is an open scene and return current NavMesh settings without baking.")] bool dryRun = false) + { + if (!BakeSceneGuard.HasBakeableScene()) + return BakeSceneGuard.NoSceneResult(); + + OnUpdate(); // reconcile a possibly-stale tracking flag first. + + if (NavMeshBuilder.isRunning) + return new { code = "bake_in_progress", message = "A NavMesh bake is already running. Poll navmesh_bake_status." }; + + if (dryRun) + return new { status = "dry_run", wouldBake = true, settings = ReadNavMeshSettings() }; + + var bakeId = Guid.NewGuid().ToString("N"); + lock (s_Lock) + { + s_Tracking = true; + s_BakeId = bakeId; + s_StartedUtc = DateTime.UtcNow; + } + + WriteStatus(new NavMeshBakeStatus + { + Status = "baking", + BakeId = bakeId, + StartedUtcTicks = s_StartedUtc.Ticks + }); + + NavMeshBuilder.BuildNavMeshAsync(); + return new { status = "baking", bakeId }; + } + + [CliCommand("navmesh_bake_status", "Get the status of the last NavMesh bake: idle | baking | completed.", MainThreadRequired = false)] + public static string NavMeshBakeStatus() + { + if (File.Exists(StatusFile)) + return File.ReadAllText(StatusFile); + return "{\"status\":\"idle\"}"; + } + + [CliCommand("cancel_navmesh_bake", "Cancel an in-progress NavMesh bake (NavMeshBuilder.Cancel()).")] + public static object CancelNavMeshBake() + { + var wasRunning = NavMeshBuilder.isRunning; + if (wasRunning) + NavMeshBuilder.Cancel(); + + lock (s_Lock) + { + if (s_Tracking) + { + var ms = (int)Math.Max(0, (DateTime.UtcNow - s_StartedUtc).TotalMilliseconds); + WriteStatus(new NavMeshBakeStatus + { + Status = "completed", + Result = "cancelled", + BakeId = s_BakeId, + BakeTimeMs = ms + }); + s_Tracking = false; + } + } + + return new { cancelled = wasRunning }; + } + + [CliCommand("clear_navmesh", "Clear the baked NavMesh for the open scene(s). Destructive: requires confirm=true.")] + public static object ClearNavMesh( + [CliArg("confirm", "Must be true to actually clear (destructive, not undoable via Unity's Undo).")] bool confirm = false, + [CliArg("dry_run", "If true, report what would be cleared without clearing.")] bool dryRun = false) + { + if (!confirm) + throw new ArgumentException("Refusing to clear the NavMesh. Pass confirm=true (destructive, not undoable via Unity's Undo)."); + + if (dryRun) + return new { status = "dry_run", wouldClear = true }; + + NavMeshBuilder.ClearAllNavMeshes(); + return new { cleared = true }; + } + + #endregion + + #region settings + + [CliCommand("get_navmesh_settings", "Read the default agent's legacy NavMesh bake settings (agentRadius/Height/Slope/Climb, minRegionArea, voxelSize).")] + public static NavMeshSettingsResult GetNavMeshSettings() + { + return ReadNavMeshSettings(); + } + + [CliCommand("set_navmesh_settings", "Apply a subset of legacy NavMesh bake settings to the default agent. Returns { applied[], unknown[] }.")] + public static object SetNavMeshSettings( + [CliArg("settings", "JSON object with a subset of NavMesh fields to set (same names as get_navmesh_settings).", Required = true)] JObject settings, + [CliArg("dry_run", "If true, validate the keys and report applied/unknown without changing anything.")] bool dryRun = false) + { + if (settings == null) + throw new ArgumentException("settings is required (a JSON object of NavMesh fields to set)."); + + // NavMeshBuilder.navMeshSettingsObject is a UnityEngine.Object (the Navigation window's + // settings holder); wrap it in a SerializedObject to read/write the m_BuildSettings fields. + var settingsObject = NavMeshBuilder.navMeshSettingsObject; + if (settingsObject == null) + return new { code = "settings_unavailable", message = "Could not access the legacy NavMesh settings object." }; + + var so = new SerializedObject(settingsObject); + so.Update(); + + var applied = new List(); + var unknown = new List(); + + foreach (var prop in settings.Properties()) + { + if (TryApply(so, prop.Name, prop.Value, dryRun)) + applied.Add(prop.Name); + else + unknown.Add(prop.Name); + } + + if (!dryRun && applied.Count > 0) + so.ApplyModifiedPropertiesWithoutUndo(); + + return new { applied = applied.ToArray(), unknown = unknown.ToArray(), dryRun }; + } + + /// + /// Guarded stub for the AI Navigation package (com.unity.ai.navigation) NavMeshSurface + /// bake path. We never reference that assembly, so probe for the type by reflection; absent → the + /// documented package_not_found result. Full multi-surface baking is a follow-up. + /// + [CliCommand("bake_navmesh_surfaces", "Bake NavMeshSurface components (AI Navigation package). v1 stub: returns package_not_found when the package is absent.")] + public static object BakeNavMeshSurfaces() + { + var surfaceType = Type.GetType("Unity.AI.Navigation.NavMeshSurface, Unity.AI.Navigation") + ?? Type.GetType("UnityEngine.AI.NavMeshSurface, Unity.AI.Navigation"); + + if (surfaceType == null) + return new + { + code = "package_not_found", + message = "The AI Navigation package (com.unity.ai.navigation) is not installed. " + + "NavMeshSurface-based baking is out of scope for v1; use bake_navmesh for the built-in baker." + }; + + return new + { + code = "not_implemented", + message = "AI Navigation package detected, but NavMeshSurface baking is not implemented in v1 (follow-up). Use bake_navmesh." + }; + } + + #endregion + + #region completion / reload bookkeeping + + static void OnUpdate() + { + lock (s_Lock) + { + if (s_Tracking && !NavMeshBuilder.isRunning) + Finish("succeeded"); + } + } + + // Must be called under s_Lock. + static void Finish(string result) + { + var ms = (int)Math.Max(0, (DateTime.UtcNow - s_StartedUtc).TotalMilliseconds); + WriteStatus(new NavMeshBakeStatus + { + Status = "completed", + Result = result, + BakeId = s_BakeId, + BakeTimeMs = ms + }); + s_Tracking = false; + } + + static void OnReload() + { + if (!File.Exists(StatusFile)) + return; + + NavMeshBakeStatus prior; + try + { + prior = JsonConvert.DeserializeObject(File.ReadAllText(StatusFile)); + } + catch + { + return; + } + + if (prior == null || prior.Status != "baking") + return; + + lock (s_Lock) + { + s_BakeId = prior.BakeId; + s_StartedUtc = prior.StartedUtcTicks > 0 ? new DateTime(prior.StartedUtcTicks, DateTimeKind.Utc) : DateTime.UtcNow; + s_Tracking = true; + if (!NavMeshBuilder.isRunning) + Finish("succeeded"); + } + } + + #endregion + + #region settings read/write helpers + + static NavMeshSettingsResult ReadNavMeshSettings() + { + var settingsObject = NavMeshBuilder.navMeshSettingsObject; + if (settingsObject == null) + return new NavMeshSettingsResult { Available = false }; + + var so = new SerializedObject(settingsObject); + so.Update(); + var manual = FindBool(so, PropManualCellSize, false); + return new NavMeshSettingsResult + { + Available = true, + AgentRadius = FindFloat(so, PropAgentRadius, 0.5f), + AgentHeight = FindFloat(so, PropAgentHeight, 2f), + AgentSlope = FindFloat(so, PropAgentSlope, 45f), + AgentClimb = FindFloat(so, PropAgentClimb, 0.4f), + MinRegionArea = FindFloat(so, PropMinRegionArea, 2f), + VoxelSize = FindFloat(so, PropCellSize, 0f), + ManualVoxelSize = manual + }; + } + + static bool TryApply(SerializedObject so, string key, JToken value, bool dryRun) + { + switch (key) + { + case "agentRadius": + return SetFloat(so, PropAgentRadius, value, dryRun); + case "agentHeight": + return SetFloat(so, PropAgentHeight, value, dryRun); + case "agentSlope": + return SetFloat(so, PropAgentSlope, value, dryRun); + case "agentClimb": + return SetFloat(so, PropAgentClimb, value, dryRun); + case "minRegionArea": + return SetFloat(so, PropMinRegionArea, value, dryRun); + case "voxelSize": + // Setting an explicit voxel size implies manual override on. + { + var ok = SetFloat(so, PropCellSize, value, dryRun); + if (ok && !dryRun) + { + var manual = so.FindProperty(PropManualCellSize); + if (manual != null) manual.boolValue = true; + } + return ok; + } + case "manualVoxelSize": + return SetBool(so, PropManualCellSize, value, dryRun); + default: + return false; + } + } + + static bool SetFloat(SerializedObject so, string propPath, JToken value, bool dryRun) + { + var prop = so.FindProperty(propPath); + if (prop == null) + return false; + var f = value.Value(); + if (!dryRun) prop.floatValue = f; + return true; + } + + static bool SetBool(SerializedObject so, string propPath, JToken value, bool dryRun) + { + var prop = so.FindProperty(propPath); + if (prop == null) + return false; + var b = value.Value(); + if (!dryRun) prop.boolValue = b; + return true; + } + + static float FindFloat(SerializedObject so, string propPath, float fallback) + { + var prop = so.FindProperty(propPath); + return prop != null ? prop.floatValue : fallback; + } + + static bool FindBool(SerializedObject so, string propPath, bool fallback) + { + var prop = so.FindProperty(propPath); + return prop != null ? prop.boolValue : fallback; + } + + #endregion + + static void WriteStatus(NavMeshBakeStatus status) + { + try + { + File.WriteAllText(StatusFile, JsonConvert.SerializeObject(status)); + } + catch (Exception ex) + { + Debug.LogError($"[NavMeshBake] Failed to write status file: {ex.Message}"); + } + } + } + + /// Status/result payload for bake_navmesh / navmesh_bake_status. + [Serializable] + public class NavMeshBakeStatus + { + [JsonProperty("status")] + public string Status { get; set; } + + [JsonProperty("bakeId")] + public string BakeId { get; set; } + + [JsonProperty("result", NullValueHandling = NullValueHandling.Ignore)] + public string Result { get; set; } + + [JsonProperty("bakeTimeMs")] + public int BakeTimeMs { get; set; } + + [JsonProperty("startedUtcTicks")] + public long StartedUtcTicks { get; set; } + } + + /// Result of get_navmesh_settings (default-agent legacy bake settings). + [Serializable] + public class NavMeshSettingsResult + { + [JsonProperty("available")] + public bool Available { get; set; } + + [JsonProperty("agentRadius")] + public float AgentRadius { get; set; } + + [JsonProperty("agentHeight")] + public float AgentHeight { get; set; } + + [JsonProperty("agentSlope")] + public float AgentSlope { get; set; } + + [JsonProperty("agentClimb")] + public float AgentClimb { get; set; } + + [JsonProperty("minRegionArea")] + public float MinRegionArea { get; set; } + + [JsonProperty("voxelSize")] + public float VoxelSize { get; set; } + + [JsonProperty("manualVoxelSize")] + public bool ManualVoxelSize { get; set; } + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Baking/NavMeshBakeCommands.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Baking/NavMeshBakeCommands.cs.meta new file mode 100644 index 00000000..a3be55d0 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Baking/NavMeshBakeCommands.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5173e39c97c44308ad4b80462eaf7982 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Baking/OcclusionBakeCommands.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Baking/OcclusionBakeCommands.cs new file mode 100644 index 00000000..d255a94e --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Baking/OcclusionBakeCommands.cs @@ -0,0 +1,265 @@ +using System; +using System.IO; +using Newtonsoft.Json; +using Unity.Pipeline.Commands; +using UnityEditor; +using UnityEngine; + +namespace Unity.Pipeline.Editor.Commands.Baking +{ + /// + /// CLI-215 Group C — Occlusion Culling bake commands. Trigger an async occlusion bake of the open + /// scene(s) via , poll its status, cancel + /// it, and clear the baked occlusion data. + /// + /// Async pattern mirrors / : trigger + /// returns immediately; completion is detected by + /// flipping false (polled in ); in-flight state is held in + /// static fields and reconciled against a Temp/ status file across domain reloads. + /// + [InitializeOnLoad] + public static class OcclusionBakeCommands + { + const string StatusFile = "Temp/pipeline_occlusion_bake_status.json"; + + // Sentinel for "argument omitted" on the float bake parameters. float.NaN is not a + // compile-time constant (so it can't be a default parameter value), but float.MinValue is, and + // it is not a plausible real value for any of these positive bake parameters. + const float Unset = float.MinValue; + + static readonly object s_Lock = new object(); + static bool s_Tracking; + static string s_BakeId; + static DateTime s_StartedUtc; + + static OcclusionBakeCommands() + { + OnReload(); + EditorApplication.update += OnUpdate; + } + + #region bake_occlusion_culling + + [CliCommand("bake_occlusion_culling", "Trigger an async occlusion-culling bake of the open scene(s) via StaticOcclusionCulling.GenerateInBackground(). Returns immediately; poll occlusion_bake_status until completed.")] + public static object BakeOcclusionCulling( + [CliArg("smallest_occluder", "Smallest object that will occlude others (meters). Defaults to Unity's current value.")] float smallestOccluder = Unset, + [CliArg("smallest_hole", "Smallest gap geometry can have that the view can see through (meters). Defaults to Unity's current value.")] float smallestHole = Unset, + [CliArg("backface_threshold", "Backface threshold (1-100); lower trims more backfaces. Defaults to Unity's current value.")] float backfaceThreshold = Unset, + [CliArg("confirm", "Accepted for parity (a bake overwrites existing occlusion data); not required.")] bool confirm = false, + [CliArg("dry_run", "If true, validate there is an open scene and report the parameters that would be used without baking.")] bool dryRun = false) + { + if (!BakeSceneGuard.HasBakeableScene()) + return BakeSceneGuard.NoSceneResult(); + + OnUpdate(); // reconcile any stale tracking flag first. + + if (StaticOcclusionCulling.isRunning) + return new { code = "bake_in_progress", message = "An occlusion bake is already running. Poll occlusion_bake_status." }; + + // Validate explicitly provided values before resolving. An omitted arg is the Unset + // sentinel (float.MinValue); NaN is never <= Unset, so a NaN arg is treated as provided + // and rejected here. smallest_occluder / smallest_hole must be positive; backface_threshold + // is documented as 1-100. + if (!IsOmitted(smallestOccluder) && !(smallestOccluder > 0f)) + throw new ArgumentException($"smallest_occluder must be greater than 0 (got {smallestOccluder})."); + if (!IsOmitted(smallestHole) && !(smallestHole > 0f)) + throw new ArgumentException($"smallest_hole must be greater than 0 (got {smallestHole})."); + if (!IsOmitted(backfaceThreshold) && !(backfaceThreshold >= 1f && backfaceThreshold <= 100f)) + throw new ArgumentException($"backface_threshold must be between 1 and 100 (got {backfaceThreshold})."); + + // Resolve effective parameters: an omitted arg (the Unset sentinel) keeps Unity's current value. + var occluder = IsOmitted(smallestOccluder) ? StaticOcclusionCulling.smallestOccluder : smallestOccluder; + var hole = IsOmitted(smallestHole) ? StaticOcclusionCulling.smallestHole : smallestHole; + var backface = IsOmitted(backfaceThreshold) ? StaticOcclusionCulling.backfaceThreshold : backfaceThreshold; + + if (dryRun) + { + return new + { + status = "dry_run", + wouldBake = true, + parameters = new { smallestOccluder = occluder, smallestHole = hole, backfaceThreshold = backface } + }; + } + + // Apply the (possibly overridden) bake parameters before generating. + StaticOcclusionCulling.smallestOccluder = occluder; + StaticOcclusionCulling.smallestHole = hole; + StaticOcclusionCulling.backfaceThreshold = backface; + + var bakeId = Guid.NewGuid().ToString("N"); + lock (s_Lock) + { + s_Tracking = true; + s_BakeId = bakeId; + s_StartedUtc = DateTime.UtcNow; + } + + WriteStatus(new OcclusionBakeStatus + { + Status = "baking", + BakeId = bakeId, + StartedUtcTicks = s_StartedUtc.Ticks + }); + + StaticOcclusionCulling.GenerateInBackground(); + return new { status = "baking", bakeId }; + } + + [CliCommand("occlusion_bake_status", "Get the status of the last occlusion bake: idle | baking | completed.", MainThreadRequired = false)] + public static string OcclusionBakeStatus() + { + if (File.Exists(StatusFile)) + return File.ReadAllText(StatusFile); + return "{\"status\":\"idle\"}"; + } + + [CliCommand("cancel_occlusion_bake", "Cancel an in-progress occlusion bake (StaticOcclusionCulling.Cancel()).")] + public static object CancelOcclusionBake() + { + var wasRunning = StaticOcclusionCulling.isRunning; + if (wasRunning) + StaticOcclusionCulling.Cancel(); + + lock (s_Lock) + { + if (s_Tracking) + { + var ms = (int)Math.Max(0, (DateTime.UtcNow - s_StartedUtc).TotalMilliseconds); + WriteStatus(new OcclusionBakeStatus + { + Status = "completed", + Result = "cancelled", + BakeId = s_BakeId, + BakeTimeMs = ms + }); + s_Tracking = false; + } + } + + return new { cancelled = wasRunning }; + } + + [CliCommand("clear_occlusion_culling", "Clear baked occlusion-culling data for the open scene(s). Destructive: requires confirm=true.")] + public static object ClearOcclusionCulling( + [CliArg("confirm", "Must be true to actually clear (destructive, not undoable via Unity's Undo).")] bool confirm = false, + [CliArg("dry_run", "If true, report what would be cleared without clearing.")] bool dryRun = false) + { + if (!confirm) + throw new ArgumentException("Refusing to clear occlusion culling data. Pass confirm=true (destructive, not undoable via Unity's Undo)."); + + if (dryRun) + return new { status = "dry_run", wouldClear = true }; + + StaticOcclusionCulling.Clear(); + return new { cleared = true }; + } + + // True when the caller omitted a float bake arg (left it at the Unset sentinel). NaN is never + // <= Unset, so NaN counts as provided and is caught by the range validation above. + static bool IsOmitted(float value) => value <= Unset; + + #endregion + + #region completion / reload bookkeeping + + static void OnUpdate() + { + lock (s_Lock) + { + if (s_Tracking && !StaticOcclusionCulling.isRunning) + Finish("succeeded"); + } + } + + // Must be called under s_Lock. + static void Finish(string result) + { + var ms = (int)Math.Max(0, (DateTime.UtcNow - s_StartedUtc).TotalMilliseconds); + WriteStatus(new OcclusionBakeStatus + { + Status = "completed", + Result = result, + BakeId = s_BakeId, + BakeTimeMs = ms, + Stats = result == "succeeded" + ? new OcclusionBakeStats { UmbraDataSizeBytes = StaticOcclusionCulling.umbraDataSize } + : null + }); + s_Tracking = false; + } + + static void OnReload() + { + if (!File.Exists(StatusFile)) + return; + + OcclusionBakeStatus prior; + try + { + prior = JsonConvert.DeserializeObject(File.ReadAllText(StatusFile)); + } + catch + { + return; + } + + if (prior == null || prior.Status != "baking") + return; + + lock (s_Lock) + { + s_BakeId = prior.BakeId; + s_StartedUtc = prior.StartedUtcTicks > 0 ? new DateTime(prior.StartedUtcTicks, DateTimeKind.Utc) : DateTime.UtcNow; + s_Tracking = true; + if (!StaticOcclusionCulling.isRunning) + Finish("succeeded"); + } + } + + #endregion + + static void WriteStatus(OcclusionBakeStatus status) + { + try + { + File.WriteAllText(StatusFile, JsonConvert.SerializeObject(status)); + } + catch (Exception ex) + { + Debug.LogError($"[OcclusionBake] Failed to write status file: {ex.Message}"); + } + } + } + + /// Status/result payload for bake_occlusion_culling / occlusion_bake_status. + [Serializable] + public class OcclusionBakeStatus + { + [JsonProperty("status")] + public string Status { get; set; } + + [JsonProperty("bakeId")] + public string BakeId { get; set; } + + [JsonProperty("result", NullValueHandling = NullValueHandling.Ignore)] + public string Result { get; set; } + + [JsonProperty("bakeTimeMs")] + public int BakeTimeMs { get; set; } + + [JsonProperty("stats", NullValueHandling = NullValueHandling.Ignore)] + public OcclusionBakeStats Stats { get; set; } + + [JsonProperty("startedUtcTicks")] + public long StartedUtcTicks { get; set; } + } + + /// Post-bake occlusion statistics (umbra data size in bytes). + [Serializable] + public class OcclusionBakeStats + { + [JsonProperty("umbraDataSizeBytes")] + public long UmbraDataSizeBytes { get; set; } + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Baking/OcclusionBakeCommands.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Baking/OcclusionBakeCommands.cs.meta new file mode 100644 index 00000000..eb800ab8 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Baking/OcclusionBakeCommands.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 00b06ed57bce4c0bb281527e016889dd +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Build.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Build.meta new file mode 100644 index 00000000..aff88155 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Build.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: bdb8ef5b0513b0d488ac3be1a9a77185 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Build/BuildCommand.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Build/BuildCommand.cs new file mode 100644 index 00000000..51a74d8d --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Build/BuildCommand.cs @@ -0,0 +1,577 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using Unity.Pipeline.Commands; +using Unity.Pipeline.Editor.Authoring; +using UnityEditor; +using UnityEditor.Build; +using UnityEditor.Build.Reporting; +using UnityEngine; + +namespace Unity.Pipeline.Editor.Commands.Build +{ + /// + /// Triggers a Player build and reports the full (CLI-204). Fills out the + /// original build/build_status stub (CLI-127) with the complete param contract and the + /// structured report shape so build failures can be diagnosed without the Editor UI. + /// + /// Why this is async (trigger-then-poll, mirroring / + /// ): + /// runs synchronously and freezes the main thread for the whole build (seconds to minutes). If + /// build ran it inline it would block the server's (serial) request loop and the call could + /// never return. Instead build validates + queues and returns queued immediately; an + /// hook runs the build on the next tick. Poll build_status + /// until status == "completed". + /// + /// build_status is deliberately MainThreadRequired = false: while the build holds the + /// main thread, any main-thread command (e.g. editor_status) would hang, but build_status only reads + /// a Temp status file off-thread, so polling keeps working throughout the build. The status file also + /// survives the domain reload a build can incur, so the last report is retained until the next build. + /// + [InitializeOnLoad] + public static class BuildCommand + { + const string StatusFile = "Temp/pipeline_build_status.json"; + + // BuildOptions that callers may pass by name (the supported set from the ticket). Parsed + // case-insensitively; anything outside this set is a validation error rather than silently + // tolerated, so a typo surfaces instead of changing the build shape. + static readonly Dictionary s_SupportedOptions = + new Dictionary(StringComparer.OrdinalIgnoreCase) + { + ["Development"] = BuildOptions.Development, + ["AllowDebugging"] = BuildOptions.AllowDebugging, + ["ConnectWithProfiler"] = BuildOptions.ConnectWithProfiler, + // EnableHeadlessMode is obsolete in Unity 6 (superseded by StandaloneBuildSubtarget.Server) + // but still functions and is part of this command's documented option set (CLI-204), so we + // keep accepting it and suppress only the deprecation warning here. +#pragma warning disable 618 + ["EnableHeadlessMode"] = BuildOptions.EnableHeadlessMode, +#pragma warning restore 618 + ["SymlinkSources"] = BuildOptions.SymlinkSources, + ["BuildAdditionalStreamedScenes"] = BuildOptions.BuildAdditionalStreamedScenes, + ["CleanBuildCache"] = BuildOptions.CleanBuildCache, + ["DetailedBuildReport"] = BuildOptions.DetailedBuildReport, + }; + + static readonly object s_Lock = new object(); + static bool s_Pending; + static bool s_Building; + + // Queued request, captured under s_Lock by build() and consumed by the update pump. + static BuildTarget s_PendingTarget; + static string s_PendingOutput; + static BuildOptions s_PendingOptions; + static string[] s_PendingScenes; + static string s_PendingProfile; + static string s_PendingBuildId; + + static BuildCommand() + { + EditorApplication.update += OnUpdate; + } + + [CliCommand("build", + "Trigger an async Player build and report the full BuildReport. Returns immediately (queued); " + + "poll build_status until status is 'completed'. DetailedBuildReport is included by default unless " + + "'options' is supplied. Use dry_run to validate without building.", + MainThreadRequired = false)] + public static object Build( + [CliArg("target", "BuildTarget name (e.g. StandaloneWindows64). Defaults to the active target. Must be installed.")] string target = "", + [CliArg("outputPath", "Output path (absolute, or relative to the project root). Defaults to the last/auto path.")] string outputPath = "", + [CliArg("profileName", "Build Profile name to activate before building (Unity 6 only; ignored otherwise).")] string profileName = "", + [CliArg("options", "BuildOptions names. Omit to get just DetailedBuildReport; supplying any disables that default.")] string[] options = null, + [CliArg("scenes", "Scene asset paths to build (e.g. Assets/Scenes/Main.unity). Defaults to EditorBuildSettings.")] string[] scenes = null, + [CliArg("confirm", "Acknowledge and run the build; without it the call is refused. Use dry_run to validate only.")] bool confirm = false, + [CliArg("dry_run", "Validate target/outputPath/scenes without building.")] bool dryRun = false) + { + // Validation + queueing both touch Unity APIs, so run them on the main thread. When invoked + // off-thread (the normal HTTP path) this marshals through the server dispatcher; in-process + // (tests, no server) it runs inline. + return RunOnMain(() => ValidateAndQueue(target, outputPath, profileName, options, scenes, confirm, dryRun)); + } + + static object ValidateAndQueue(string targetArg, string outputArg, string profileName, + string[] optionArgs, string[] sceneArgs, bool confirm, bool dryRun) + { + lock (s_Lock) + { + if (!dryRun && (s_Building || s_Pending)) + return new { status = "busy", success = false, message = "A build is already queued or in progress. Poll build_status." }; + } + + var errors = new List(); + + // ---- target ---- + var target = EditorUserBuildSettings.activeBuildTarget; + if (!string.IsNullOrWhiteSpace(targetArg)) + { + if (!TryParseTarget(targetArg, out target)) + errors.Add(Invalid("target", $"Unknown BuildTarget '{targetArg}'. Use a name from list_build_targets.")); + else if (!BuildPipeline.IsBuildTargetSupported(BuildPipeline.GetBuildTargetGroup(target), target)) + errors.Add(Invalid("target", $"Build target '{target}' is not installed (isInstalled=false in list_build_targets).")); + } + + // ---- options ---- + var options = BuildOptions.None; + if (optionArgs != null && optionArgs.Length > 0) + { + foreach (var name in optionArgs) + { + if (string.IsNullOrWhiteSpace(name)) + continue; + if (s_SupportedOptions.TryGetValue(name.Trim(), out var opt)) + options |= opt; + else + errors.Add(Invalid("options", $"Unsupported BuildOptions value '{name}'.")); + } + } + else + { + // Strongly recommended: without it BuildReport.packedAssets is empty. + options = BuildOptions.DetailedBuildReport; + } + + // ---- scenes ---- + var scenes = (sceneArgs != null && sceneArgs.Length > 0) + ? sceneArgs + : EditorBuildSettings.scenes.Where(s => s.enabled).Select(s => s.path).ToArray(); + + if (sceneArgs != null) + { + foreach (var scene in sceneArgs) + { + if (string.IsNullOrWhiteSpace(scene) || string.IsNullOrEmpty(AssetDatabase.AssetPathToGUID(scene))) + errors.Add(Invalid("scenes", $"No scene asset at '{scene}'.")); + } + } + + // ---- output path ---- + // Non-mutating writability check: resolve the path and confirm an existing ancestor + // directory exists (so the build's output folder can be created). BuildPipeline.BuildPlayer + // creates the leaf directory itself, so we never create anything here — a dry run stays pure. + string outputPath = null; + try + { + outputPath = ResolveOutput(outputArg, target); + if (!HasExistingAncestor(outputPath)) + errors.Add(Invalid("outputPath", $"No existing parent directory for '{outputPath}'.")); + } + catch (Exception ex) + { + errors.Add(Invalid("outputPath", $"Output path is invalid: {ex.Message}")); + } + + if (dryRun) + { + return new + { + status = "dry_run", + valid = errors.Count == 0, + validationErrors = errors + }; + } + + if (errors.Count > 0) + { + // Fail immediately — do not queue (acceptance criteria 5). + return new { status = "error", success = false, validationErrors = errors, message = "Build configuration is invalid; nothing was queued." }; + } + + if (!confirm) + return new + { + status = "error", + success = false, + message = "Refused: this triggers a player build. Pass confirm=true to build, or dry_run=true to validate without building." + }; + + var buildId = NewBuildId(); + + lock (s_Lock) + { + s_PendingTarget = target; + s_PendingOutput = outputPath; + s_PendingOptions = options; + s_PendingScenes = scenes; + s_PendingProfile = profileName; + s_PendingBuildId = buildId; + s_Pending = true; + } + + WriteStatusJson(new { status = "queued", buildId, message = "Build queued. Poll build_status until status is 'completed'." }); + + return new { status = "queued", buildId }; + } + + [CliCommand("build_status", + "Status of the current/most recent build: idle | queued | building | completed, with the full " + + "BuildReport (files, packedAssets, buildSteps, errors, warnings) once completed. Retained until the next build.", + MainThreadRequired = false)] + public static string BuildStatus() + { + if (!File.Exists(StatusFile)) + return "{\"status\":\"idle\"}"; + + var text = File.ReadAllText(StatusFile); + + // While building, recompute elapsedMs at read time so polling shows live progress. + try + { + var doc = JObject.Parse(text); + if ((string)doc["status"] == "building") + { + long elapsed = 0; + var startedStr = (string)doc["buildStartedAt"]; + if (!string.IsNullOrEmpty(startedStr) && + DateTime.TryParse(startedStr, null, System.Globalization.DateTimeStyles.RoundtripKind, out var started)) + { + elapsed = (long)Math.Max(0, (DateTime.UtcNow - started.ToUniversalTime()).TotalMilliseconds); + } + + return JsonConvert.SerializeObject(new + { + status = "building", + buildId = (string)doc["buildId"], + elapsedMs = elapsed + }); + } + } + catch + { + // Malformed file — fall through and return it verbatim. + } + + return text; + } + + /// + /// Main-thread pump: picks up a queued request and runs the (blocking) build. Guarded so a build + /// runs at most once at a time. + /// + static void OnUpdate() + { + BuildTarget target; + string output; + BuildOptions options; + string[] scenes; + string profile; + string buildId; + + lock (s_Lock) + { + if (!s_Pending || s_Building) + return; + s_Pending = false; + s_Building = true; + target = s_PendingTarget; + output = s_PendingOutput; + options = s_PendingOptions; + scenes = s_PendingScenes; + profile = s_PendingProfile; + buildId = s_PendingBuildId; + } + + try + { + RunBuild(buildId, target, output, options, scenes, profile); + } + catch (Exception ex) + { + WriteStatusJson(new + { + status = "completed", + buildId, + result = "Failed", + totalSizeBytes = 0, + errors = new[] { new { message = $"Build failed to start: {ex.Message}" } }, + warnings = Array.Empty() + }); + } + finally + { + lock (s_Lock) { s_Building = false; } + } + } + + static void RunBuild(string buildId, BuildTarget target, string outputPath, BuildOptions options, + string[] scenes, string profileName) + { + var startedAt = DateTime.UtcNow; + WriteStatusJson(new + { + status = "building", + buildId, + buildStartedAt = startedAt.ToString("o"), + platform = target.ToString(), + outputPath + }); + + // Best-effort Build Profile activation (Unity 6 only). Never fails the build. + if (!string.IsNullOrWhiteSpace(profileName)) + TryActivateBuildProfile(profileName); + + var buildOptions = new BuildPlayerOptions + { + scenes = scenes, + locationPathName = outputPath, + target = target, + targetGroup = BuildPipeline.GetBuildTargetGroup(target), + options = options + }; + + var report = BuildPipeline.BuildPlayer(buildOptions); + WriteStatusJson(Project(buildId, report)); + } + + // ---- BuildReport projection ------------------------------------------------------------ + + static BuildReportResult Project(string buildId, BuildReport report) + { + var summary = report.summary; + var success = summary.result == BuildResult.Succeeded; + var started = summary.buildStartedAt; + var ended = started + summary.totalTime; + + var result = new BuildReportResult + { + Status = "completed", + BuildId = buildId, + Result = summary.result.ToString(), + Platform = summary.platform.ToString(), + OutputPath = summary.outputPath, + TotalSizeBytes = (long)summary.totalSize, + BuildTimeMs = (long)summary.totalTime.TotalMilliseconds, + BuildStartedAt = started.ToUniversalTime().ToString("o"), + BuildEndedAt = ended.ToUniversalTime().ToString("o"), + TotalWarnings = summary.totalWarnings, + TotalErrors = summary.totalErrors, + BuildSteps = ProjectSteps(report, out var errors, out var warnings), + Errors = errors, + Warnings = warnings + }; + + // Files / packed assets are only meaningful on success (and packedAssets needs DetailedBuildReport). + if (success) + { + result.Files = ProjectFiles(report); + result.PackedAssets = ProjectPackedAssets(report); + } + + return result; + } + + static List ProjectFiles(BuildReport report) + { + var files = new List(); + try + { + foreach (var f in report.GetFiles()) + files.Add(new BuildFileEntry { Path = f.path, Role = f.role, SizeBytes = (long)f.size }); + } + catch (Exception ex) + { + Debug.LogWarning($"[pipeline] build file projection failed: {ex.Message}"); + } + return files; + } + + static List ProjectPackedAssets(BuildReport report) + { + var packed = new List(); + if (report.packedAssets == null) + return packed; + + foreach (var bundle in report.packedAssets) + { + var entry = new PackedAssetEntry + { + BundlePath = bundle.shortPath, + OverheadBytes = (long)bundle.overhead, + Contents = new List() + }; + + if (bundle.contents != null) + { + foreach (var c in bundle.contents) + { + entry.Contents.Add(new PackedAssetContent + { + AssetPath = c.sourceAssetPath, + Type = c.type != null ? c.type.Name : null, + Guid = c.sourceAssetGUID.ToString(), + SizeBytes = (long)c.packedSize + }); + } + } + + packed.Add(entry); + } + return packed; + } + + static List ProjectSteps(BuildReport report, + out List errors, out List warnings) + { + errors = new List(); + warnings = new List(); + + var steps = new List(); + if (report.steps == null) + return steps; + + foreach (var step in report.steps) + { + var entry = new BuildStepEntry + { + Name = step.name, + DurationMs = (long)step.duration.TotalMilliseconds, + Depth = (int)step.depth, + Messages = new List() + }; + + if (step.messages != null) + { + foreach (var m in step.messages) + { + entry.Messages.Add(new BuildStepMessageEntry { Type = MapLogType(m.type), Content = m.content }); + + if (m.type == LogType.Error || m.type == LogType.Assert || m.type == LogType.Exception) + errors.Add(BuildIssue.From(m.content)); + else if (m.type == LogType.Warning) + warnings.Add(BuildIssue.From(m.content)); + } + } + + steps.Add(entry); + } + return steps; + } + + static string MapLogType(LogType type) + { + switch (type) + { + case LogType.Warning: return "Warning"; + case LogType.Error: + case LogType.Assert: + case LogType.Exception: return "Error"; + default: return "Log"; + } + } + + // ---- Helpers --------------------------------------------------------------------------- + + /// Case-insensitive parse of a enum name. + static bool TryParseTarget(string name, out BuildTarget target) + { + try + { + target = (BuildTarget)Enum.Parse(typeof(BuildTarget), name.Trim(), ignoreCase: true); + return Enum.IsDefined(typeof(BuildTarget), target); + } + catch + { + target = EditorUserBuildSettings.activeBuildTarget; + return false; + } + } + + static object Invalid(string field, string message) => new { field, message }; + + static string NewBuildId() => "build_" + Guid.NewGuid().ToString("N").Substring(0, 12); + + static string ResolveOutput(string output, BuildTarget target) + { + var projectRoot = ProjectPaths.ProjectRoot; + + if (!string.IsNullOrWhiteSpace(output)) + return Path.IsPathRooted(output) ? output : Path.GetFullPath(Path.Combine(projectRoot, output)); + + var product = string.IsNullOrEmpty(PlayerSettings.productName) ? "Player" : PlayerSettings.productName; + return Path.Combine(projectRoot, "Builds", target.ToString(), product + ExtensionFor(target)); + } + + /// True if some ancestor directory of already exists — a cheap, + /// non-mutating check that the build output folder is creatable. + static bool HasExistingAncestor(string path) + { + var dir = Path.GetDirectoryName(path); + while (!string.IsNullOrEmpty(dir)) + { + if (Directory.Exists(dir)) + return true; + dir = Path.GetDirectoryName(dir); + } + return false; + } + + static string ExtensionFor(BuildTarget target) + { + switch (target) + { + case BuildTarget.StandaloneWindows: + case BuildTarget.StandaloneWindows64: + return ".exe"; + case BuildTarget.StandaloneOSX: + return ".app"; + case BuildTarget.Android: + return ".apk"; + default: + return string.Empty; // Linux standalone, dedicated server, etc. + } + } + + /// + /// Best-effort: activate a Build Profile by name via reflection so the assembly still compiles on + /// Unity versions without the Build Profile API. Any failure is logged and ignored — the build + /// proceeds with the current configuration. + /// + static void TryActivateBuildProfile(string profileName) + { + try + { + var info = BuildProfiles.FindByName(profileName); + if (info == null) + { + Debug.LogWarning($"[pipeline] build: profile '{profileName}' not found; building with current settings."); + return; + } + if (!BuildProfiles.TrySetActive(info)) + Debug.LogWarning($"[pipeline] build: could not activate profile '{profileName}'; building with current settings."); + } + catch (Exception ex) + { + Debug.LogWarning($"[pipeline] build: profile activation failed ({ex.Message}); building with current settings."); + } + } + + /// + /// Run on the Unity main thread. Off-thread (the HTTP path) it marshals + /// through the live server's dispatcher; on the main thread (a direct in-process/test call, or no + /// server running) it runs inline. Mirrors . + /// + static T RunOnMain(Func fn) + { + var dispatcher = PipelineServerStartup.Server?.Dispatcher; + if (dispatcher != null && dispatcher.IsInitialized && !dispatcher.IsMainThread()) + return dispatcher.Invoke(fn); + return fn(); + } + + static void WriteStatusJson(object status) + { + try + { + File.WriteAllText(StatusFile, JsonConvert.SerializeObject(status)); + } + catch (Exception ex) + { + Debug.LogError($"[Build] Failed to write status file: {ex.Message}"); + } + } + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Build/BuildCommand.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Build/BuildCommand.cs.meta new file mode 100644 index 00000000..39abf764 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Build/BuildCommand.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6e718f193c77f724ea4de47fe8a2a3cb +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Build/BuildConfigCommands.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Build/BuildConfigCommands.cs new file mode 100644 index 00000000..2cb27174 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Build/BuildConfigCommands.cs @@ -0,0 +1,337 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using Unity.Pipeline.Commands; +using UnityEditor; +using UnityEditor.Build; +using UnityEngine; + +namespace Unity.Pipeline.Editor.Commands.Build +{ + /// + /// Read/inspect build configuration for agents (CLI-204): enumerate targets, read/write the mutable + /// EditorUserBuildSettings fields, and list Build Profile assets. Scene-list management and + /// target switching are intentionally elsewhere (add_scene_to_build/remove_scene_from_build + /// from CLI-189, and switch_build_target). + /// + public static class BuildConfigCommands + { + [CliCommand("list_build_targets", + "List the known BuildTarget values with their group and whether build support is installed.", + MainThreadRequired = true)] + public static object ListBuildTargets() + { + var targets = new List(); + var seen = new HashSet(); + + foreach (BuildTarget value in Enum.GetValues(typeof(BuildTarget))) + { + // Exclude NoTarget / internal sentinels (negative) and deprecated/obsolete values. + if ((int)value <= 0) + continue; + + var name = value.ToString(); + if (!seen.Add(name)) + continue; + + var field = typeof(BuildTarget).GetField(name); + if (field != null && field.GetCustomAttribute() != null) + continue; + + BuildTargetGroup group; + try { group = BuildPipeline.GetBuildTargetGroup(value); } + catch { continue; } + + bool installed; + try { installed = BuildPipeline.IsBuildTargetSupported(group, value); } + catch { installed = false; } + + targets.Add(new BuildTargetInfo + { + Name = name, + DisplayName = DisplayNameFor(value), + TargetGroup = group.ToString(), + IsInstalled = installed + }); + } + + return targets.OrderBy(t => t.TargetGroup).ThenBy(t => t.Name).ToList(); + } + + [CliCommand("get_build_settings", + "Read the current build configuration from EditorUserBuildSettings / EditorBuildSettings.", + MainThreadRequired = true)] + public static object GetBuildSettings() + { + var target = EditorUserBuildSettings.activeBuildTarget; + var group = BuildPipeline.GetBuildTargetGroup(target); + + return new BuildSettingsResult + { + ActiveBuildTarget = target.ToString(), + ActiveBuildTargetGroup = group.ToString(), + DevelopmentBuild = EditorUserBuildSettings.development, + AllowDebugging = EditorUserBuildSettings.allowDebugging, + ConnectWithProfiler = EditorUserBuildSettings.connectProfiler, + BuildScriptsOnly = EditorUserBuildSettings.buildScriptsOnly, + SymlinkSources = EditorUserBuildSettings.symlinkSources, + Il2CppCodeGeneration = ReadIl2CppCodeGeneration(group), + Scenes = EditorBuildSettings.scenes.Select(s => new BuildSceneEntry + { + Path = s.path, + Guid = s.guid.ToString(), + Enabled = s.enabled + }).ToList() + }; + } + + [CliCommand("set_build_settings", + "Set mutable EditorUserBuildSettings fields. Does NOT manage scenes (use add_scene_to_build / " + + "remove_scene_from_build) or switch target (use switch_build_target). Use dry_run to preview.", + MainThreadRequired = true)] + public static object SetBuildSettings( + [CliArg("settings", "Fields to change; omitted fields are left unchanged.")] SetBuildSettingsInput settings = null, + [CliArg("confirm", "Apply the changes. Without it the call is refused.")] bool confirm = false, + [CliArg("dry_run", "Preview the change without applying it.")] bool dryRun = false) + { + if (settings == null) + return SetBuildSettingsResult.Fail("No 'settings' object provided."); + + if (!dryRun && !confirm) + return SetBuildSettingsResult.Fail( + "Refused: this operation mutates the project. Re-run with confirm=true to apply, or dry_run=true to preview the change."); + var result = new SetBuildSettingsResult { DryRun = dryRun, Success = true }; + var group = BuildPipeline.GetBuildTargetGroup(EditorUserBuildSettings.activeBuildTarget); + + // For each supplied field: change it (recording in Applied) only if it differs from the + // current value; otherwise record it in Skipped as a no-op. + Plan(result, "developmentBuild", settings.DevelopmentBuild, EditorUserBuildSettings.development, + v => EditorUserBuildSettings.development = v, dryRun); + Plan(result, "allowDebugging", settings.AllowDebugging, EditorUserBuildSettings.allowDebugging, + v => EditorUserBuildSettings.allowDebugging = v, dryRun); + Plan(result, "connectWithProfiler", settings.ConnectWithProfiler, EditorUserBuildSettings.connectProfiler, + v => EditorUserBuildSettings.connectProfiler = v, dryRun); + Plan(result, "buildScriptsOnly", settings.BuildScriptsOnly, EditorUserBuildSettings.buildScriptsOnly, + v => EditorUserBuildSettings.buildScriptsOnly = v, dryRun); + Plan(result, "symlinkSources", settings.SymlinkSources, EditorUserBuildSettings.symlinkSources, + v => EditorUserBuildSettings.symlinkSources = v, dryRun); + + if (!string.IsNullOrWhiteSpace(settings.Il2CppCodeGeneration)) + { + if (!TryParseIl2Cpp(settings.Il2CppCodeGeneration, out var requested)) + return SetBuildSettingsResult.Fail($"Invalid il2CppCodeGeneration '{settings.Il2CppCodeGeneration}'. Use OptimizeSpeed | OptimizeSize."); + + var current = ReadIl2CppCodeGeneration(group); + if (!string.Equals(current, requested.ToString(), StringComparison.Ordinal)) + { + if (!dryRun) + PlayerSettings.SetIl2CppCodeGeneration(NamedBuildTarget.FromBuildTargetGroup(group), requested); + result.Applied["il2CppCodeGeneration"] = requested.ToString(); + } + else + { + result.Skipped["il2CppCodeGeneration"] = current; + } + } + + result.Message = dryRun + ? $"Dry run — {result.Applied.Count} field(s) would change, {result.Skipped.Count} unchanged." + : $"Applied {result.Applied.Count} field(s); {result.Skipped.Count} unchanged."; + return result; + } + + [CliCommand("list_build_profiles", + "List Build Profile assets in the project (Unity 6 only). Returns feature_unavailable on earlier versions.", + MainThreadRequired = true)] + public static object ListBuildProfiles() + { + if (!BuildProfiles.IsSupported) + return new { error = "Build Profiles require Unity 6 (6000.0) or later", code = "feature_unavailable" }; + + return BuildProfiles.List(); + } + + // ---- Helpers --------------------------------------------------------------------------- + + static void Plan(SetBuildSettingsResult result, string name, bool? requested, bool current, + Action set, bool dryRun) + { + if (!requested.HasValue) + return; + + if (requested.Value != current) + { + if (!dryRun) + set(requested.Value); + result.Applied[name] = requested.Value; + } + else + { + result.Skipped[name] = current; + } + } + + static string ReadIl2CppCodeGeneration(BuildTargetGroup group) + { + try + { + return PlayerSettings.GetIl2CppCodeGeneration(NamedBuildTarget.FromBuildTargetGroup(group)).ToString(); + } + catch + { + return Il2CppCodeGeneration.OptimizeSpeed.ToString(); + } + } + + static bool TryParseIl2Cpp(string value, out Il2CppCodeGeneration parsed) + { + return Enum.TryParse(value.Trim(), ignoreCase: true, out parsed) + && Enum.IsDefined(typeof(Il2CppCodeGeneration), parsed); + } + + /// Friendly label for common targets; falls back to the enum name. + static string DisplayNameFor(BuildTarget target) + { + switch (target) + { + case BuildTarget.StandaloneWindows: return "Windows (32-bit)"; + case BuildTarget.StandaloneWindows64: return "Windows 64-bit"; + case BuildTarget.StandaloneOSX: return "macOS"; + case BuildTarget.StandaloneLinux64: return "Linux 64-bit"; + case BuildTarget.Android: return "Android"; + case BuildTarget.iOS: return "iOS"; + case BuildTarget.tvOS: return "tvOS"; + case BuildTarget.WebGL: return "WebGL"; + case BuildTarget.WSAPlayer: return "Universal Windows Platform"; + case BuildTarget.PS4: return "PlayStation 4"; + case BuildTarget.PS5: return "PlayStation 5"; + case BuildTarget.XboxOne: return "Xbox One"; + case BuildTarget.Switch: return "Nintendo Switch"; + default: return target.ToString(); + } + } + } + + /// + /// Reflection shim over the Unity 6 Build Profile API (UnityEditor.Build.Profile.BuildProfile), + /// so this assembly compiles and runs on older editors without the type. Used by + /// list_build_profiles and by build's optional profileName activation. + /// + internal static class BuildProfiles + { + const string TypeName = "UnityEditor.Build.Profile.BuildProfile, UnityEditor.CoreModule"; + + static readonly Type s_Type = ResolveType(); + + public static bool IsSupported => s_Type != null; + + static Type ResolveType() + { + var t = Type.GetType(TypeName); + if (t != null) + return t; + + // Fall back to a full-assembly scan — the assembly-qualified name can vary across versions. + foreach (var asm in PipelineUtils.GetLoadedAssemblies()) + { + t = asm.GetType("UnityEditor.Build.Profile.BuildProfile"); + if (t != null) + return t; + } + return null; + } + + public static List List() + { + var list = new List(); + if (s_Type == null) + return list; + + var active = GetActive(); + foreach (var guid in AssetDatabase.FindAssets("t:BuildProfile")) + { + var path = AssetDatabase.GUIDToAssetPath(guid); + var asset = AssetDatabase.LoadAssetAtPath(path, s_Type); + if (asset == null) + continue; + + list.Add(new BuildProfileInfo + { + Name = System.IO.Path.GetFileNameWithoutExtension(path), + Guid = guid, + Platform = ReadPlatform(asset), + IsActive = active != null && ReferenceEquals(active, asset) + }); + } + return list; + } + + public static BuildProfileInfo FindByName(string name) + { + return List().FirstOrDefault(p => string.Equals(p.Name, name, StringComparison.OrdinalIgnoreCase)); + } + + /// Activate the named profile via the API's static setter; returns false if unavailable. + public static bool TrySetActive(BuildProfileInfo info) + { + if (s_Type == null || info == null) + return false; + + var path = AssetDatabase.GUIDToAssetPath(info.Guid); + var asset = AssetDatabase.LoadAssetAtPath(path, s_Type); + if (asset == null) + return false; + + // Unity 6 exposes a static settable 'activeProfile' (and/or a SetActiveBuildProfile method). + var prop = s_Type.GetProperty("activeProfile", BindingFlags.Public | BindingFlags.Static); + if (prop != null && prop.CanWrite) + { + prop.SetValue(null, asset); + return true; + } + + var method = s_Type.GetMethod("SetActiveBuildProfile", BindingFlags.Public | BindingFlags.Static); + if (method != null) + { + method.Invoke(null, new[] { asset }); + return true; + } + + return false; + } + + static UnityEngine.Object GetActive() + { + try + { + var prop = s_Type.GetProperty("activeProfile", BindingFlags.Public | BindingFlags.Static); + if (prop != null) + return prop.GetValue(null) as UnityEngine.Object; + + var method = s_Type.GetMethod("GetActiveBuildProfile", BindingFlags.Public | BindingFlags.Static); + if (method != null) + return method.Invoke(null, null) as UnityEngine.Object; + } + catch { /* best effort */ } + return null; + } + + static string ReadPlatform(UnityEngine.Object asset) + { + try + { + // Public property first, then the serialized backing field. + var prop = s_Type.GetProperty("buildTarget", BindingFlags.Public | BindingFlags.Instance); + if (prop != null) + return prop.GetValue(asset)?.ToString() ?? string.Empty; + + var field = s_Type.GetField("m_BuildTarget", BindingFlags.NonPublic | BindingFlags.Instance); + if (field != null) + return field.GetValue(asset)?.ToString() ?? string.Empty; + } + catch { /* best effort */ } + return string.Empty; + } + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Build/BuildConfigCommands.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Build/BuildConfigCommands.cs.meta new file mode 100644 index 00000000..e1445786 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Build/BuildConfigCommands.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: e65c0b78842b492d8f9363ec749bc370 diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Build/BuildModels.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Build/BuildModels.cs new file mode 100644 index 00000000..f585f349 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Build/BuildModels.cs @@ -0,0 +1,271 @@ +using System; +using System.Collections.Generic; +using System.Text.RegularExpressions; +using Newtonsoft.Json; +using Unity.Pipeline.Commands; + +namespace Unity.Pipeline.Editor.Commands.Build +{ + /// + /// One entry of list_build_targets (CLI-204): a BuildTarget enum value with the + /// information an agent needs to choose a valid target without guessing — its group and whether the + /// platform's build support is actually installed in this editor. + /// + [Serializable] + public class BuildTargetInfo + { + /// BuildTarget enum name, e.g. "StandaloneWindows64". + [JsonProperty("name")] public string Name { get; set; } + + /// Friendly label, e.g. "Windows 64-bit". + [JsonProperty("displayName")] public string DisplayName { get; set; } + + /// BuildTargetGroup enum name, e.g. "Standalone". + [JsonProperty("targetGroup")] public string TargetGroup { get; set; } + + /// BuildPipeline.IsBuildTargetSupported(group, target) — module installed and usable. + [JsonProperty("isInstalled")] public bool IsInstalled { get; set; } + } + + /// One scene in the Build Settings scene list, projected for get_build_settings. + [Serializable] + public class BuildSceneEntry + { + [JsonProperty("path")] public string Path { get; set; } + [JsonProperty("guid")] public string Guid { get; set; } + [JsonProperty("enabled")] public bool Enabled { get; set; } + } + + /// + /// Result of get_build_settings (CLI-204): the current build configuration read from + /// EditorUserBuildSettings / EditorBuildSettings plus the active target's IL2CPP code + /// generation mode. Scene-list management lives in add_scene_to_build / + /// remove_scene_from_build (CLI-189); this only reports the list. + /// + [Serializable] + public class BuildSettingsResult + { + [JsonProperty("activeBuildTarget")] public string ActiveBuildTarget { get; set; } + [JsonProperty("activeBuildTargetGroup")] public string ActiveBuildTargetGroup { get; set; } + [JsonProperty("developmentBuild")] public bool DevelopmentBuild { get; set; } + [JsonProperty("allowDebugging")] public bool AllowDebugging { get; set; } + [JsonProperty("connectWithProfiler")] public bool ConnectWithProfiler { get; set; } + [JsonProperty("buildScriptsOnly")] public bool BuildScriptsOnly { get; set; } + [JsonProperty("symlinkSources")] public bool SymlinkSources { get; set; } + + /// "OptimizeSpeed" | "OptimizeSize" for the active build target. + [JsonProperty("il2CppCodeGeneration")] public string Il2CppCodeGeneration { get; set; } + + [JsonProperty("scenes")] public List Scenes { get; set; } + } + + /// + /// Mutable build-settings fields for set_build_settings (CLI-204). Every field is nullable; + /// only the ones the caller supplies are changed. Note that and + /// only take effect when is also on. + /// + public class SetBuildSettingsInput : IStructuredCommandInput + { + [CliArg("developmentBuild", "Build a Development Player (enables the debugger/profiler).")] + public bool? DevelopmentBuild { get; set; } + + [CliArg("allowDebugging", "Allow script debugging (only effective with developmentBuild=true).")] + public bool? AllowDebugging { get; set; } + + [CliArg("connectWithProfiler", "Auto-connect the Profiler (only effective with developmentBuild=true).")] + public bool? ConnectWithProfiler { get; set; } + + [CliArg("buildScriptsOnly", "Build only the scripts (skip data) for faster iteration.")] + public bool? BuildScriptsOnly { get; set; } + + [CliArg("symlinkSources", "Symlink runtime/plugin sources instead of copying (where supported).")] + public bool? SymlinkSources { get; set; } + + [CliArg("il2CppCodeGeneration", "IL2CPP code generation for the active target: OptimizeSpeed | OptimizeSize.")] + public string Il2CppCodeGeneration { get; set; } + } + + /// + /// Result of set_build_settings (CLI-204): the fields that were actually changed + /// () versus the supplied fields that already had the requested value + /// (). A dry run reports the same set it would + /// write, without changing anything. + /// + [Serializable] + public class SetBuildSettingsResult + { + [JsonProperty("success")] public bool Success { get; set; } + [JsonProperty("dryRun")] public bool DryRun { get; set; } + + /// Field name → new value, for each field that changed (or would change on a dry run). + [JsonProperty("applied")] public Dictionary Applied { get; set; } = new Dictionary(); + + /// Field name → current value, for supplied fields that already matched (no-ops). + [JsonProperty("skipped")] public Dictionary Skipped { get; set; } = new Dictionary(); + + [JsonProperty("message")] public string Message { get; set; } + + public static SetBuildSettingsResult Fail(string message) => + new SetBuildSettingsResult { Success = false, Message = message }; + } + + /// One Build Profile asset, projected for list_build_profiles (Unity 6 only). + [Serializable] + public class BuildProfileInfo + { + [JsonProperty("name")] public string Name { get; set; } + [JsonProperty("guid")] public string Guid { get; set; } + + /// The profile's build target name (best-effort; may be empty if unreadable). + [JsonProperty("platform")] public string Platform { get; set; } + + [JsonProperty("isActive")] public bool IsActive { get; set; } + } + + /// One output file produced by the build (a row of BuildReport.GetFiles()). + [Serializable] + public class BuildFileEntry + { + [JsonProperty("path")] public string Path { get; set; } + + /// BuildFile.role verbatim, e.g. "MainData", "AssetBundle", "BootConfig". + [JsonProperty("role")] public string Role { get; set; } + + [JsonProperty("sizeBytes")] public long SizeBytes { get; set; } + } + + /// One asset packed into a build bundle/file (a row of a PackedAssets entry). + [Serializable] + public class PackedAssetContent + { + [JsonProperty("assetPath")] public string AssetPath { get; set; } + [JsonProperty("type")] public string Type { get; set; } + [JsonProperty("guid")] public string Guid { get; set; } + [JsonProperty("sizeBytes")] public long SizeBytes { get; set; } + } + + /// A packed bundle/file with its per-asset size breakdown (requires DetailedBuildReport). + [Serializable] + public class PackedAssetEntry + { + [JsonProperty("bundlePath")] public string BundlePath { get; set; } + [JsonProperty("overheadBytes")] public long OverheadBytes { get; set; } + [JsonProperty("contents")] public List Contents { get; set; } + } + + /// One message emitted during a build step. + [Serializable] + public class BuildStepMessageEntry + { + /// "Log" | "Warning" | "Error" (mapped from LogType). + [JsonProperty("type")] public string Type { get; set; } + [JsonProperty("content")] public string Content { get; set; } + } + + /// One step of the build (a row of BuildReport.steps). + [Serializable] + public class BuildStepEntry + { + [JsonProperty("name")] public string Name { get; set; } + [JsonProperty("durationMs")] public long DurationMs { get; set; } + [JsonProperty("depth")] public int Depth { get; set; } + [JsonProperty("messages")] public List Messages { get; set; } + } + + /// A build error/warning surfaced in build_status, with best-effort source file. + [Serializable] + public class BuildIssue + { + [JsonProperty("message")] public string Message { get; set; } + + /// Source file when the message carries a "File.cs(line,col): ..." prefix; omitted otherwise. + [JsonProperty("file", NullValueHandling = NullValueHandling.Ignore)] public string File { get; set; } + + /// Build a , reusing for file extraction. + public static BuildIssue From(string content) + { + var parsed = BuildMessage.Parse("info", content); + return new BuildIssue + { + Message = parsed.Message, + File = string.IsNullOrEmpty(parsed.File) ? null : parsed.File + }; + } + } + + /// + /// Full build_status result for a finished build (CLI-204) — a JSON-friendly projection of + /// UnityEditor.Build.Reporting.BuildReport. Optional collections are omitted when null + /// (), so a failed build can carry errors/steps without empty + /// file/asset arrays. Transient states (queued/building/idle/dry_run) are reported as small, + /// purpose-built payloads, not this type. + /// + [Serializable] + public class BuildReportResult + { + [JsonProperty("status")] public string Status { get; set; } + [JsonProperty("buildId")] public string BuildId { get; set; } + + /// "Succeeded" | "Failed" | "Cancelled" | "Unknown". + [JsonProperty("result")] public string Result { get; set; } + + [JsonProperty("platform")] public string Platform { get; set; } + [JsonProperty("outputPath")] public string OutputPath { get; set; } + [JsonProperty("totalSizeBytes")] public long TotalSizeBytes { get; set; } + [JsonProperty("buildTimeMs")] public long BuildTimeMs { get; set; } + + [JsonProperty("buildStartedAt", NullValueHandling = NullValueHandling.Ignore)] public string BuildStartedAt { get; set; } + [JsonProperty("buildEndedAt", NullValueHandling = NullValueHandling.Ignore)] public string BuildEndedAt { get; set; } + + [JsonProperty("totalWarnings")] public int TotalWarnings { get; set; } + [JsonProperty("totalErrors")] public int TotalErrors { get; set; } + + [JsonProperty("files", NullValueHandling = NullValueHandling.Ignore)] public List Files { get; set; } + [JsonProperty("packedAssets", NullValueHandling = NullValueHandling.Ignore)] public List PackedAssets { get; set; } + [JsonProperty("buildSteps", NullValueHandling = NullValueHandling.Ignore)] public List BuildSteps { get; set; } + + [JsonProperty("errors")] public List Errors { get; set; } = new List(); + [JsonProperty("warnings")] public List Warnings { get; set; } = new List(); + } + + /// + /// A single build error/warning with best-effort file/line parsed from the message content. + /// Retained from the original build stub (CLI-127): it is the shared parser used to extract a + /// source location from a raw build-step message and is exercised directly by the test suite. + /// + [Serializable] + public class BuildMessage + { + [JsonProperty("severity")] public string Severity { get; set; } + [JsonProperty("file")] public string File { get; set; } + [JsonProperty("line")] public int Line { get; set; } + [JsonProperty("message")] public string Message { get; set; } + + // Matches the standard compiler/build message prefix "Path/To/File.cs(line,col): rest". + static readonly Regex s_LocationPattern = new Regex(@"^(?.*?)\((?\d+),\d+\):\s*(?.*)$", RegexOptions.Singleline); + + /// + /// Build a from a raw build-step message, extracting file/line when + /// the content carries the standard "File.cs(line,col): ..." prefix; otherwise the whole content + /// is kept as the message with no file/line. + /// + public static BuildMessage Parse(string severity, string content) + { + var msg = new BuildMessage { Severity = severity, Message = content ?? string.Empty }; + + if (!string.IsNullOrEmpty(content)) + { + var match = s_LocationPattern.Match(content); + if (match.Success) + { + msg.File = match.Groups["file"].Value.Trim(); + if (int.TryParse(match.Groups["line"].Value, out var line)) + msg.Line = line; + msg.Message = match.Groups["rest"].Value.Trim(); + } + } + + return msg; + } + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Build/BuildModels.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Build/BuildModels.cs.meta new file mode 100644 index 00000000..46f86061 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Build/BuildModels.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 37afada24be667e489d7e90a62f2ca1d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Build/SwitchBuildTargetCommand.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Build/SwitchBuildTargetCommand.cs new file mode 100644 index 00000000..af0b8933 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Build/SwitchBuildTargetCommand.cs @@ -0,0 +1,237 @@ +using System; +using System.IO; +using Newtonsoft.Json; +using Unity.Pipeline.Commands; +using UnityEditor; +using UnityEngine; + +namespace Unity.Pipeline.Editor.Commands.Build +{ + /// + /// Switches the active build target (CLI-204). is + /// synchronous, blocks the main thread, and triggers a full asset reimport + domain reload for the new + /// platform — minutes on a large project. So this follows the trigger-then-poll pattern: the command + /// validates and queues the switch, returns switching immediately, and an + /// tick performs the switch. The switch is confirm-gated + /// (destructive and long-running) and is not part of Unity's Undo. + /// + /// The status is persisted to a Temp file that survives the domain reload the switch causes; on the + /// next load reconciles a left-over switching record + /// against the now-active target. switch_build_target_status reads the file off the main thread, + /// so it keeps answering while the switch holds the main thread. + /// + [InitializeOnLoad] + public static class SwitchBuildTargetCommand + { + const string StatusFile = "Temp/pipeline_switch_target_status.json"; + + static readonly object s_Lock = new object(); + static bool s_Pending; + static bool s_Switching; + static BuildTarget s_PendingTarget; + static BuildTarget s_FromTarget; + + static SwitchBuildTargetCommand() + { + EditorApplication.update += OnUpdate; + RecoverInterruptedOperation(); + } + + [CliCommand("switch_build_target", + "Switch the active build target (destructive, long-running: triggers a full reimport + domain " + + "reload). Requires confirm=true. Returns immediately; poll switch_build_target_status.", + MainThreadRequired = false)] + public static object SwitchBuildTarget( + [CliArg("target", "BuildTarget name to switch to (must be installed; see list_build_targets).", Required = true)] string target = "", + [CliArg("confirm", "Apply the switch. Without it the call is refused.")] bool confirm = false) + { + return RunOnMain(() => ValidateAndQueue(target, confirm)); + } + + static object ValidateAndQueue(string targetArg, bool confirm) + { + if (string.IsNullOrWhiteSpace(targetArg)) + return new { status = "error", success = false, message = "A 'target' is required." }; + + if (!TryParseTarget(targetArg, out var target)) + return new { status = "error", success = false, message = $"Unknown BuildTarget '{targetArg}'. Use a name from list_build_targets." }; + + var group = BuildPipeline.GetBuildTargetGroup(target); + if (!BuildPipeline.IsBuildTargetSupported(group, target)) + return new { status = "error", success = false, message = $"Build target '{target}' is not installed (isInstalled=false in list_build_targets)." }; + + var from = EditorUserBuildSettings.activeBuildTarget; + if (target == from) + return new { status = "completed", success = true, activeBuildTarget = from.ToString(), message = $"Already on build target '{from}'." }; + + lock (s_Lock) + { + if (s_Pending || s_Switching) + return new { status = "busy", success = false, message = "A target switch is already queued or in progress. Poll switch_build_target_status." }; + } + + // Confirm gate. The queue below only sets pending state; the switch runs on the next tick. + if (!confirm) + return new + { + status = "error", + success = false, + message = "Refused: switching the build target triggers a full reimport + domain reload. Pass confirm=true to apply." + }; + + lock (s_Lock) + { + s_FromTarget = from; + s_PendingTarget = target; + s_Pending = true; + } + WriteStatusJson(new + { + status = "switching", + fromTarget = from.ToString(), + toTarget = target.ToString(), + startedAt = DateTime.UtcNow.ToString("o") + }); + + return new { status = "switching", fromTarget = from.ToString(), toTarget = target.ToString() }; + } + + [CliCommand("switch_build_target_status", + "Status of the last target switch: idle | switching | completed (with success + activeBuildTarget).", + MainThreadRequired = false)] + public static string SwitchBuildTargetStatus() + { + if (File.Exists(StatusFile)) + return File.ReadAllText(StatusFile); + return "{\"status\":\"idle\"}"; + } + + /// Main-thread pump: performs the queued switch. Blocks the main thread until it returns. + static void OnUpdate() + { + BuildTarget target; + BuildTarget from; + lock (s_Lock) + { + if (!s_Pending || s_Switching) + return; + s_Pending = false; + s_Switching = true; + target = s_PendingTarget; + from = s_FromTarget; + } + + try + { + var group = BuildPipeline.GetBuildTargetGroup(target); + + // Synchronous and may trigger a domain reload on success — in which case the code below + // never runs and RecoverInterruptedOperation finalizes the status after the reload. + // (SwitchActiveBuildTarget moved from BuildPipeline to EditorUserBuildSettings in Unity 6.) + var ok = EditorUserBuildSettings.SwitchActiveBuildTarget(group, target); + + if (ok) + WriteStatusJson(new + { + status = "completed", + success = true, + activeBuildTarget = EditorUserBuildSettings.activeBuildTarget.ToString() + }); + else + WriteStatusJson(new + { + status = "completed", + success = false, + target = target.ToString(), + errors = new[] { new { message = $"Failed to switch build target to '{target}'." } } + }); + } + catch (Exception ex) + { + WriteStatusJson(new + { + status = "completed", + success = false, + target = target.ToString(), + errors = new[] { new { message = $"Switch to '{target}' threw: {ex.Message}" } } + }); + } + finally + { + lock (s_Lock) { s_Switching = false; } + } + } + + /// + /// On load, settle a status file left at "switching" by the domain reload a successful switch + /// causes: if the active target now matches the requested one, the switch completed; otherwise it + /// did not take effect. + /// + static void RecoverInterruptedOperation() + { + try + { + if (!File.Exists(StatusFile)) + return; + + var doc = Newtonsoft.Json.Linq.JObject.Parse(File.ReadAllText(StatusFile)); + if ((string)doc["status"] != "switching") + return; + + var toTarget = (string)doc["toTarget"]; + var active = EditorUserBuildSettings.activeBuildTarget.ToString(); + + if (string.Equals(active, toTarget, StringComparison.Ordinal)) + WriteStatusJson(new { status = "completed", success = true, activeBuildTarget = active }); + else + WriteStatusJson(new + { + status = "completed", + success = false, + target = toTarget, + errors = new[] { new { message = $"Switch did not take effect; active build target is '{active}'." } } + }); + } + catch (Exception ex) + { + Debug.LogWarning($"[pipeline] switch_build_target status recovery failed: {ex.Message}"); + } + } + + // ---- Helpers --------------------------------------------------------------------------- + + static bool TryParseTarget(string name, out BuildTarget target) + { + try + { + target = (BuildTarget)Enum.Parse(typeof(BuildTarget), name.Trim(), ignoreCase: true); + return Enum.IsDefined(typeof(BuildTarget), target); + } + catch + { + target = EditorUserBuildSettings.activeBuildTarget; + return false; + } + } + + static T RunOnMain(Func fn) + { + var dispatcher = PipelineServerStartup.Server?.Dispatcher; + if (dispatcher != null && dispatcher.IsInitialized && !dispatcher.IsMainThread()) + return dispatcher.Invoke(fn); + return fn(); + } + + static void WriteStatusJson(object status) + { + try + { + File.WriteAllText(StatusFile, JsonConvert.SerializeObject(status)); + } + catch (Exception ex) + { + Debug.LogError($"[SwitchBuildTarget] Failed to write status file: {ex.Message}"); + } + } + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Build/SwitchBuildTargetCommand.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Build/SwitchBuildTargetCommand.cs.meta new file mode 100644 index 00000000..ccb7ec17 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Build/SwitchBuildTargetCommand.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 5b3d3b7a26bf4a5c8f5522cbfdd0574b diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Capture.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Capture.meta new file mode 100644 index 00000000..34a04a32 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Capture.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 87f4434ff2c6ed6419e6982345ffe0ef +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Capture/CaptureCommands.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Capture/CaptureCommands.cs new file mode 100644 index 00000000..cea22f35 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Capture/CaptureCommands.cs @@ -0,0 +1,262 @@ +using System; +using System.IO; +using System.Linq; +using Newtonsoft.Json; +using Unity.Pipeline.Commands; +using Unity.Pipeline.Editor.Authoring; +using UnityEditor; +using UnityEngine; +using UnityEngine.Rendering; +using Object = UnityEngine.Object; + +namespace Unity.Pipeline.Editor.Commands.Capture +{ + /// + /// Visual-feedback commands (CLI-199): render a camera or the Scene View to a PNG and return it + /// base64-encoded, so an agent can "see" the editor without a display. Optionally writes the PNG + /// under the project (sandboxed via ) and refreshes the AssetDatabase. + /// + /// Captures require a GPU; in batchmode/headless the device type is + /// and the commands throw so callers get a clear message + /// instead of an empty image. + /// + public static class CaptureCommands + { + private const int MaxDimension = 4096; + + [CliCommand("capture_game_view", "Render a camera to a PNG. Returns it inline as base64, unless save_path is set (path-only result; pass include_inline_image=true to get both).")] + public static CaptureResult CaptureGameView( + [CliArg("width", "Output width in px (default 1280; capped 4096).")] int width = 1280, + [CliArg("height", "Output height in px (default 720; capped 4096).")] int height = 720, + [CliArg("camera", "Optional camera name; defaults to Camera.main, else the first enabled camera.")] string camera = null, + [CliArg("save_path", "Optional project-relative path to write the PNG (e.g. Screenshots/foo.png). When set, the result omits the inline base64 image unless include_inline_image=true.")] string savePath = null, + [CliArg("include_inline_image", "Also return the image inline as base64 when save_path is set (default false: path-only result). Only meaningful together with save_path.")] bool includeInlineImage = false, + [CliArg("max_resolution", "Cap on the inline image's longest edge (e.g. 512). Only applies when an inline image is returned (no save_path, or save_path + include_inline_image=true); the save_path file keeps the requested resolution.")] int maxResolution = 0) + { + GuardHasGpu(); + + var cam = ResolveCamera(camera); + if (cam == null) + throw new ArgumentException("No camera found to capture."); + + return Capture(cam, width, height, $"camera:{cam.name}", savePath, includeInlineImage, maxResolution); + } + + [CliCommand("capture_scene_view", "Render the active Scene View to a PNG. Returns it inline as base64, unless save_path is set (path-only result; pass include_inline_image=true to get both).")] + public static CaptureResult CaptureSceneView( + [CliArg("width", "Output width in px (default 1280; capped 4096).")] int width = 1280, + [CliArg("height", "Output height in px (default 720; capped 4096).")] int height = 720, + [CliArg("save_path", "Optional project-relative path to write the PNG (e.g. Screenshots/foo.png). When set, the result omits the inline base64 image unless include_inline_image=true.")] string savePath = null, + [CliArg("include_inline_image", "Also return the image inline as base64 when save_path is set (default false: path-only result). Only meaningful together with save_path.")] bool includeInlineImage = false, + [CliArg("max_resolution", "Cap on the inline image's longest edge (e.g. 512). Only applies when an inline image is returned (no save_path, or save_path + include_inline_image=true); the save_path file keeps the requested resolution.")] int maxResolution = 0) + { + GuardHasGpu(); + + var sv = SceneView.lastActiveSceneView; + if (sv == null || sv.camera == null) + throw new ArgumentException("No active Scene View to capture."); + + return Capture(sv.camera, width, height, "sceneView", savePath, includeInlineImage, maxResolution); + } + + /// + /// Shared capture core. Renders at the requested (clamped) size and writes the file when + /// is set. The image is inlined as base64 only when there is no + /// file, or on — a save_path result is otherwise + /// path-only, so agent tool results stay small (AUTHAPI-8). + /// caps the inline image's longest edge (no-op when no inline image is returned); the saved + /// file keeps the requested resolution. + /// + private static CaptureResult Capture(Camera cam, int width, int height, string source, + string savePath, bool includeInlineImage, int maxResolution) + { + var w = Mathf.Clamp(width, 1, MaxDimension); + var h = Mathf.Clamp(height, 1, MaxDimension); + + var wantsFile = !string.IsNullOrEmpty(savePath); + var wantsInline = !wantsFile || includeInlineImage; + + // Without a file the inline image is the only artifact: the cap applies to the render itself. + if (!wantsFile && maxResolution > 0) + (w, h) = ClampToLongEdge(w, h, maxResolution); + + var png = EncodeCameraToPng(cam, w, h); + var savedPath = WriteIfRequested(png, savePath); + + string base64 = null; + int? inlineW = null, inlineH = null; + if (wantsInline) + { + var inlinePng = png; + if (wantsFile && maxResolution > 0 && maxResolution < Mathf.Max(w, h)) + { + // Re-render small for the inline copy; the file already has the full resolution. + var (iw, ih) = ClampToLongEdge(w, h, maxResolution); + inlinePng = EncodeCameraToPng(cam, iw, ih); + inlineW = iw; + inlineH = ih; + } + base64 = Convert.ToBase64String(inlinePng); + } + + return new CaptureResult + { + Width = w, + Height = h, + Encoding = "png", + Base64 = base64, + Bytes = png.Length, + Source = source, + SavedPath = savedPath, + InlineWidth = inlineW, + InlineHeight = inlineH + }; + } + + /// Scale (w, h) down so the longest edge is at most , preserving aspect. + private static (int w, int h) ClampToLongEdge(int w, int h, int maxEdge) + { + var longest = Mathf.Max(w, h); + if (maxEdge <= 0 || longest <= maxEdge) + return (w, h); + + var scale = (float)maxEdge / longest; + return (Mathf.Max(1, Mathf.RoundToInt(w * scale)), Mathf.Max(1, Mathf.RoundToInt(h * scale))); + } + + /// Throw when no GPU is available (batchmode/headless), where a render would be blank. + private static void GuardHasGpu() + { + if (SystemInfo.graphicsDeviceType == GraphicsDeviceType.Null) + throw new InvalidOperationException("No GPU available (batchmode/headless); cannot capture."); + } + + /// + /// Resolve the camera to capture: by name (if provided), else , + /// else the first enabled camera. Returns null when nothing matches. + /// + private static Camera ResolveCamera(string name) + { + if (!string.IsNullOrEmpty(name)) + { + // Camera.allCameras only includes enabled cameras; also scan all loaded cameras so a + // disabled-but-named camera can still be targeted explicitly. + var byName = Camera.allCameras.FirstOrDefault(c => c.name == name) + ?? PipelineUtils.FindObjectsByType().FirstOrDefault(c => c.name == name); + return byName; + } + + if (Camera.main != null) + return Camera.main; + + return Camera.allCameras.FirstOrDefault(); + } + + /// + /// Render off-screen into a temporary RenderTexture and encode the + /// result to PNG bytes. The camera's target texture and the active RenderTexture are restored + /// in a finally block so capturing never leaves global render state dirty. + /// + private static byte[] EncodeCameraToPng(Camera cam, int w, int h) + { + var rt = RenderTexture.GetTemporary(w, h, 24); + var prevTarget = cam.targetTexture; + var prevActive = RenderTexture.active; + try + { + cam.targetTexture = rt; + cam.Render(); + RenderTexture.active = rt; + + var tex = new Texture2D(w, h, TextureFormat.RGB24, false); + try + { + tex.ReadPixels(new Rect(0, 0, w, h), 0, 0); + tex.Apply(); + return ImageConversion.EncodeToPNG(tex); + } + finally + { + Object.DestroyImmediate(tex); + } + } + finally + { + cam.targetTexture = prevTarget; + RenderTexture.active = prevActive; + RenderTexture.ReleaseTemporary(rt); + } + } + + /// + /// When is set, validate it through the project-path sandbox, + /// write the PNG to its absolute filesystem location, refresh the AssetDatabase, and return + /// the resolved project-relative asset path. Returns null when no path was requested. + /// + private static string WriteIfRequested(byte[] png, string savePath) + { + if (string.IsNullOrEmpty(savePath)) + return null; + + var resolved = ProjectPaths.Resolve(savePath, out var err); + if (resolved == null) + throw new ArgumentException(err); + + // ProjectPaths.Resolve returns a project-relative path; combine it with the project root + // (the folder that contains Assets/) to get the absolute file to write. + var absolute = Path.Combine(ProjectPaths.ProjectRoot, resolved); + var directory = Path.GetDirectoryName(absolute); + if (!string.IsNullOrEmpty(directory)) + Directory.CreateDirectory(directory); + + File.WriteAllBytes(absolute, png); + AssetDatabase.Refresh(); + return resolved; + } + } + + /// + /// Result of a capture command: the rendered dimensions, the source, the project-relative path + /// the PNG was written to (null when not saved), and the base64 payload — omitted from the JSON + /// when a save_path result is path-only (AUTHAPI-8). + /// + [Serializable] + public class CaptureResult + { + /// Rendered width in pixels (after clamping). + [JsonProperty("width")] + public int Width { get; set; } + + /// Rendered height in pixels (after clamping). + [JsonProperty("height")] + public int Height { get; set; } + + /// Image encoding; always "png". + [JsonProperty("encoding")] + public string Encoding { get; set; } + + /// Base64-encoded PNG bytes; null (omitted) when save_path is set without include_inline_image. + [JsonProperty("base64", NullValueHandling = NullValueHandling.Ignore)] + public string Base64 { get; set; } + + /// Length of the raw PNG byte array. + [JsonProperty("bytes")] + public int Bytes { get; set; } + + /// What was captured, e.g. "camera:Main Camera" or "sceneView". + [JsonProperty("source")] + public string Source { get; set; } + + /// Project-relative path the PNG was also written to, or null. + [JsonProperty("savedPath")] + public string SavedPath { get; set; } + + /// Inline image width when max_resolution downscaled it below the saved file's; omitted otherwise. + [JsonProperty("inlineWidth", NullValueHandling = NullValueHandling.Ignore)] + public int? InlineWidth { get; set; } + + /// Inline image height when max_resolution downscaled it below the saved file's; omitted otherwise. + [JsonProperty("inlineHeight", NullValueHandling = NullValueHandling.Ignore)] + public int? InlineHeight { get; set; } + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Capture/CaptureCommands.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Capture/CaptureCommands.cs.meta new file mode 100644 index 00000000..bb1dd0e9 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Capture/CaptureCommands.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3247a78c799021c4094dd3f7e3717aeb +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/CaptureEditorElementCommand.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/CaptureEditorElementCommand.cs new file mode 100644 index 00000000..0b53583c --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/CaptureEditorElementCommand.cs @@ -0,0 +1,77 @@ +#if UNITY_6000_7_OR_NEWER +using System.IO; +using System.Linq; +using Unity.Pipeline.Commands; +using Unity.Pipeline.Runtime.Commands; +using UnityEditor; +using UnityEngine; +using UnityEngine.UIElements; + +namespace Unity.Pipeline.Editor.Commands +{ + /// + /// Captures a UI Toolkit from an to a PNG + /// and returns it base64-encoded (and writes it to disk). The element is located by a USS-like + /// selector within the window's . + /// + /// Selection, capture, and encoding are shared with the runtime command via + /// ; this command only resolves the target window. + /// + public static class CaptureEditorElementCommand + { + [CliCommand("capture_editor_element", + "Capture a UI Toolkit VisualElement (by selector) from an EditorWindow to a PNG; returns path + base64.", + MainThreadRequired = true)] + public static CaptureElementResponse CaptureEditorElement( + [CliArg("window", "EditorWindow type name (e.g. InspectorWindow) or window title to capture from.", Required = true)] string window = "", + [CliArg("selector", "Element selector: '#name', '.class', a type name (e.g. Button), descendant (space) / child ('>') chains, optional pseudo-states (:checked,:hover,:focus,:active,:enabled,:disabled,:not(...)).", Required = true)] string selector = "", + [CliArg("output", "Output PNG path (absolute, or relative to the project root). Defaults to a timestamped file under /Temp/pipeline-screenshots/.")] string output = "") + { + if (string.IsNullOrWhiteSpace(window)) + return CaptureElementResponse.Fail("A 'window' (EditorWindow type name or title) is required."); + if (string.IsNullOrWhiteSpace(selector)) + return CaptureElementResponse.Fail("A 'selector' is required."); + + var target = ResolveWindow(window); + if (target == null) + return CaptureElementResponse.Fail( + $"No open EditorWindow matched '{window}' (by type name or title). Open the window first."); + + var root = target.rootVisualElement; + if (root == null) + return CaptureElementResponse.Fail($"EditorWindow '{window}' has no rootVisualElement."); + + var element = VisualElementCaptureSupport.ResolveElement(root, selector); + if (element == null) + return CaptureElementResponse.Fail( + $"No element matched selector '{selector}' in window '{window}'."); + + var projectRoot = Path.GetDirectoryName(Application.dataPath); + var defaultDir = Path.Combine(projectRoot, "Temp", "pipeline-screenshots"); + return VisualElementCaptureSupport.CaptureAndRespond( + element, selector, $"window:{window}", output, + relativeBaseDir: projectRoot, defaultDir: defaultDir, prefix: "element"); + } + + /// + /// Find an open EditorWindow whose runtime type name or title matches . + /// Uses Resources.FindObjectsOfTypeAll so hidden/utility windows are included too, but + /// prefers a match whose root is actually attached to a panel — FindObjectsOfTypeAll can + /// also return stale/backup window instances whose rootVisualElement has no panel (and + /// therefore cannot be captured). + /// + static EditorWindow ResolveWindow(string window) + { + var windows = Resources.FindObjectsOfTypeAll(); + + bool Matches(EditorWindow w) => + w.GetType().Name == window || + (w.titleContent != null && w.titleContent.text == window); + + return windows.FirstOrDefault(w => Matches(w) + && w.rootVisualElement != null && w.rootVisualElement.panel != null) + ?? windows.FirstOrDefault(Matches); + } + } +} +#endif diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/CaptureEditorElementCommand.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/CaptureEditorElementCommand.cs.meta new file mode 100644 index 00000000..1b875f33 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/CaptureEditorElementCommand.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d09a03ff1d920b24080d933c3191e192 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/EditorStatusCommand.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/EditorStatusCommand.cs new file mode 100644 index 00000000..326addbe --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/EditorStatusCommand.cs @@ -0,0 +1,63 @@ +using System; +using System.IO; +using Unity.Pipeline.Commands; +using Unity.Pipeline.Models; +using UnityEditor; +using UnityEngine; + +namespace Unity.Pipeline.Editor.Commands +{ + /// + /// Command to get detailed Editor status information. + /// Returns rich Editor state including compilation, play mode, and project details. + /// Accessible via "unity request editor_status" and "/api/editor_status" endpoint. + /// + public static class EditorStatusCommand + { + [CliCommand("editor_status", "Get detailed Unity Editor status and state information")] + public static StatusResponse GetEditorStatus() + { + return new StatusResponse + { + Status = GetOverallStatus(), + Compiling = EditorApplication.isCompiling, + DomainReloadInProgress = EditorApplication.isUpdating, + PlayMode = GetPlayModeStatus(), + LastHeartbeat = DateTime.UtcNow, + ProjectPath = Path.GetDirectoryName(Application.dataPath), + UnityVersion = Application.unityVersion + }; + } + + /// + /// Get overall Editor status based on current state. + /// + private static string GetOverallStatus() + { + if (EditorApplication.isCompiling) + return "compiling"; + + if (EditorApplication.isUpdating) + return "reloading"; + + if (EditorApplication.isPlaying || EditorApplication.isPaused) + return "playing"; + + return "ready"; + } + + /// + /// Get current play mode status. + /// + private static string GetPlayModeStatus() + { + if (EditorApplication.isPaused) + return "paused"; + + if (EditorApplication.isPlaying) + return "playing"; + + return "stopped"; + } + } +} \ No newline at end of file diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/EditorStatusCommand.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/EditorStatusCommand.cs.meta new file mode 100644 index 00000000..5699589f --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/EditorStatusCommand.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 953fb97ec3dd48e4aa2ed9607c412f44 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/FocusEditorCommand.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/FocusEditorCommand.cs new file mode 100644 index 00000000..3de15aec --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/FocusEditorCommand.cs @@ -0,0 +1,118 @@ +using System; +using System.Reflection; +using Unity.Pipeline.Commands; +using UnityEditor; +using UnityEngine; + +namespace Unity.Pipeline.Editor.Commands +{ + /// + /// Brings the Unity Editor application to the foreground (and restores it if minimized) by + /// focusing the main window's HostView. + /// + /// ContainerWindow / HostView / GUIView are internal, so this uses reflection. GUIView.Focus() + /// maps to the native MonoGUIView::Focus, which activates the OS window. Useful for headless + /// automation: the editor throttles/defers some work (notably script compilation) while + /// unfocused, so a client can call this to bring it forward first. + /// + public static class FocusEditorCommand + { + const BindingFlags k_All = BindingFlags.Static | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic; + + static Type s_ContainerWindowType; + static Type s_HostViewType; + static MethodInfo s_IsMainWindow; + static MethodInfo s_GuiViewFocus; + static bool s_Resolved; + + [CliCommand("editor_focus", "Bring the Unity Editor window to the foreground", MainThreadRequired = true)] + public static string FocusEditor() + { + if (!ResolveReflection(out var error)) + return error; + + try + { + object mainWindow = null; + foreach (var w in Resources.FindObjectsOfTypeAll(s_ContainerWindowType)) + { + if ((bool)s_IsMainWindow.Invoke(w, null)) { mainWindow = w; break; } + } + if (mainWindow == null) + return "Error: main editor window not found"; + + var rootView = GetRootView(mainWindow); + if (rootView == null) + return "Error: main window has no root view"; + + var host = FindHostView(rootView); + if (host == null) + return "Error: no HostView found in main window"; + + s_GuiViewFocus.Invoke(host, null); + return $"Editor focused via {host.GetType().Name}"; + } + catch (Exception ex) + { + return $"Error: failed to focus editor: {ex.Message}"; + } + } + + static bool ResolveReflection(out string error) + { + error = null; + if (s_Resolved) return true; + + var asm = typeof(EditorWindow).Assembly; + s_ContainerWindowType = asm.GetType("UnityEditor.ContainerWindow"); + s_HostViewType = asm.GetType("UnityEditor.HostView"); + var guiViewType = asm.GetType("UnityEditor.GUIView"); + + if (s_ContainerWindowType == null || s_HostViewType == null || guiViewType == null) + { + error = "Error: internal editor window types not found (Unity version mismatch?)"; + return false; + } + + s_IsMainWindow = s_ContainerWindowType.GetMethod("IsMainWindow", k_All); + s_GuiViewFocus = guiViewType.GetMethod("Focus", k_All, null, Type.EmptyTypes, null); + + if (s_IsMainWindow == null || s_GuiViewFocus == null) + { + error = "Error: ContainerWindow.IsMainWindow or GUIView.Focus not found (internal API changed?)"; + return false; + } + + s_Resolved = true; + return true; + } + + static object GetRootView(object mainWindow) + { + var prop = s_ContainerWindowType.GetProperty("rootView", k_All); + if (prop != null) + return prop.GetValue(mainWindow); + return s_ContainerWindowType.GetField("m_RootView", k_All)?.GetValue(mainWindow); + } + + static object FindHostView(object rootView) + { + if (s_HostViewType.IsInstanceOfType(rootView)) + return rootView; + + if (!(rootView.GetType().GetProperty("allChildren", k_All)?.GetValue(rootView) is Array allChildren)) + return null; + + // Prefer a DockArea (an actual docked panel) over the Toolbar, but any HostView works + // to bring the main window — and thus the application — to the foreground. + object firstHost = null; + foreach (var c in allChildren) + { + if (c == null || !s_HostViewType.IsInstanceOfType(c)) continue; + if (firstHost == null) firstHost = c; + if (c.GetType().Name == "DockArea") return c; + } + return firstHost; + } + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/FocusEditorCommand.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/FocusEditorCommand.cs.meta new file mode 100644 index 00000000..77c9f412 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/FocusEditorCommand.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f146c518ed01a1b4a9be8a546cdfbde5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/GameObjects.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/GameObjects.meta new file mode 100644 index 00000000..ccc362e2 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/GameObjects.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c2281ed89e8a4db9a14ec523905221f9 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/GameObjects/ComponentCommands.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/GameObjects/ComponentCommands.cs new file mode 100644 index 00000000..30416bc3 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/GameObjects/ComponentCommands.cs @@ -0,0 +1,211 @@ +using System; +using System.Collections.Generic; +using Newtonsoft.Json.Linq; +using Unity.Pipeline.Commands; +using Unity.Pipeline.Editor.Authoring; +using Unity.Pipeline.Models; +using UnityEditor; +using UnityEngine; + +namespace Unity.Pipeline.Editor.Commands.GameObjects +{ + /// + /// Component authoring commands (CLI-192): add/remove a component on a GameObject and get/set its + /// serialized properties. + /// + /// WHY property get/set goes exclusively through / + /// : it is the only mutation path that dirties the object, records + /// prefab overrides, and registers a single Undo step (via + + /// ) the way the Inspector does. Direct + /// reflection on backing fields would silently desync the Editor. Component types are resolved by + /// name across all loaded assemblies () so agents can use short or + /// fully-qualified names. + /// + public static class ComponentCommands + { + /// + /// Add a component (resolved by type name) to a GameObject. Registered with + /// via the non-generic overload so the addition + /// is reversible. Returns the new component's identity so its properties can be set next. + /// + [CliCommand("add_component", "Add a component (by type name) to a GameObject.")] + public static AuthoringResult AddComponent( + [CliArg("target", "Handle of the GameObject.", Required = true)] ObjectRef target, + [CliArg("type", "Component type name (e.g. 'Rigidbody' or 'UnityEngine.Camera').", Required = true)] string type) + { + var go = GameObjectCommands.ResolveGameObject(target, "target"); + var componentType = TypeResolver.ResolveComponentType(type); + if (componentType == null) + throw new ArgumentException($"Could not resolve component type '{type}'."); + + using (new AuthoringUndoScope("Add Component")) + { + var component = Undo.AddComponent(go, componentType); + if (component == null) + throw new InvalidOperationException( + $"Failed to add component '{componentType.Name}' to '{go.name}' (it may be disallowed on this GameObject)."); + + GameObjectCommands.MarkDirty(go); + return ObjectResolver.Describe(component); + } + } + + /// + /// Remove a component from a GameObject. The component is addressed directly by handle (an + /// resolving to a Component), or by GameObject handle plus a type name. + /// Uses so the removal is reversible. + /// + [CliCommand("remove_component", + "Remove a component from a GameObject. Provide either a component handle (target) or a GameObject handle (target) plus a type name.")] + public static AuthoringResult RemoveComponent( + [CliArg("target", "Handle of the component to remove, OR of the GameObject when 'type' is given.", Required = true)] ObjectRef target, + [CliArg("type", "Component type name to remove from the target GameObject (omit when 'target' already points at a component).")] string type = null) + { + var component = ResolveComponent(target, type); + var go = component.gameObject; + var described = ObjectResolver.Describe(component); + + using (new AuthoringUndoScope("Remove Component")) + { + Undo.DestroyObjectImmediate(component); + GameObjectCommands.MarkDirty(go); + } + + return described; + } + + /// + /// Read the serialized properties of a component as a JSON map. Iterates the visible serialized + /// surface (skipping the script reference) and converts each property with + /// . + /// + [CliCommand("get_component_properties", + "Get a component's serialized properties as a JSON map. Address the component by handle, or by GameObject handle + type.")] + public static ComponentPropertiesResult GetComponentProperties( + [CliArg("target", "Handle of the component, OR of the GameObject when 'type' is given.", Required = true)] ObjectRef target, + [CliArg("type", "Component type name on the target GameObject (omit when 'target' is a component handle).")] string type = null) + { + var component = ResolveComponent(target, type); + var so = new SerializedObject(component); + + var properties = new Dictionary(); + var iterator = so.GetIterator(); + var enterChildren = true; + while (iterator.NextVisible(enterChildren)) + { + enterChildren = false; // only iterate top-level visible properties + if (iterator.name == "m_Script") + continue; + + try + { + properties[iterator.name] = SerializedPropertyConverter.Read(iterator.Copy()); + } + catch (Exception ex) + { + properties[iterator.name] = new JValue($""); + } + } + + return new ComponentPropertiesResult + { + Component = ObjectResolver.Describe(component), + Properties = properties + }; + } + + /// + /// Set one or more serialized properties on a component. Each entry in + /// maps a property path (e.g. "m_Mass" or "myField") to a JSON value. The whole batch is one + /// Undo step: snapshots the component, every property is written + /// through , and + /// commits + dirties as one operation. + /// An unknown property name fails the whole batch with a clear error (no partial apply). + /// + [CliCommand("set_component_properties", + "Set serialized properties on a component (one Undo step). 'properties' maps property name -> value; object references accept an ObjectRef handle.")] + public static ComponentPropertiesResult SetComponentProperties( + [CliArg("target", "Handle of the component, OR of the GameObject when 'type' is given.", Required = true)] ObjectRef target, + [CliArg("properties", "Map of serialized property name to value. Vectors/colors are arrays; object refs are handle objects.", Required = true)] JObject properties, + [CliArg("type", "Component type name on the target GameObject (omit when 'target' is a component handle).")] string type = null) + { + if (properties == null || properties.Count == 0) + throw new ArgumentException("'properties' must contain at least one property to set."); + + var component = ResolveComponent(target, type); + + using (new AuthoringUndoScope("Set Component Properties")) + { + Undo.RecordObject(component, "Set Component Properties"); + var so = new SerializedObject(component); + + foreach (var pair in properties) + { + var property = so.FindProperty(pair.Key); + if (property == null) + throw new ArgumentException( + $"Component '{component.GetType().Name}' has no serialized property '{pair.Key}'."); + + SerializedPropertyConverter.Write(property, pair.Value); + } + + // Applies the changes, registers Undo, and dirties the object/scene. + so.ApplyModifiedProperties(); + GameObjectCommands.MarkDirty(component.gameObject); + } + + // Re-read so the caller sees the committed values. + return GetComponentProperties(target, type); + } + + #region Helpers + + /// + /// Resolve a component either directly (the handle points at a Component) or by GameObject + /// handle + type name. Throws a descriptive error when neither resolves. + /// + private static Component ResolveComponent(ObjectRef handle, string type) + { + if (!ObjectResolver.TryResolve(handle, out var obj, out var error)) + throw new ArgumentException($"Could not resolve 'target': {error}"); + + // The handle already points at a specific Component: honour it directly so we never + // mutate/remove the wrong instance when the GameObject has several components of the same + // type. A 'type' here is only a constraint to validate against, NOT a reason to re-fetch + // GetComponent(type) (which returns the first match and would ignore the handle). + if (obj is Component directComponent) + { + if (!string.IsNullOrEmpty(type)) + { + var requestedType = TypeResolver.ResolveComponentType(type); + if (requestedType == null) + throw new ArgumentException($"Could not resolve component type '{type}'."); + if (!requestedType.IsInstanceOfType(directComponent)) + throw new ArgumentException( + $"'target' resolves to a {directComponent.GetType().Name}, which is not a '{requestedType.Name}'."); + } + + return directComponent; + } + + var go = obj as GameObject; + if (go == null) + throw new ArgumentException($"'target' did not resolve to a GameObject or Component (got {obj.GetType().Name})."); + + if (string.IsNullOrEmpty(type)) + throw new ArgumentException("'type' is required when 'target' is a GameObject."); + + var componentType = TypeResolver.ResolveComponentType(type); + if (componentType == null) + throw new ArgumentException($"Could not resolve component type '{type}'."); + + var component = go.GetComponent(componentType); + if (component == null) + throw new ArgumentException($"GameObject '{go.name}' has no component of type '{componentType.Name}'."); + + return component; + } + + #endregion + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/GameObjects/ComponentCommands.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/GameObjects/ComponentCommands.cs.meta new file mode 100644 index 00000000..37d0ba69 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/GameObjects/ComponentCommands.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 1a7470ef26f8497595bcbdb84ceb96dc diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/GameObjects/ComponentPropertiesResult.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/GameObjects/ComponentPropertiesResult.cs new file mode 100644 index 00000000..185daa98 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/GameObjects/ComponentPropertiesResult.cs @@ -0,0 +1,25 @@ +using System.Collections.Generic; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using Unity.Pipeline.Models; + +namespace Unity.Pipeline.Editor.Commands.GameObjects +{ + /// + /// Structured result for get_component_properties / set_component_properties. + /// WHY it pairs the component identity with the property map: the caller gets back both the + /// canonical handle (to reference the component again) and the + /// current serialized values in one round trip, which also makes set return the committed state + /// for a read-after-write check. + /// + public sealed class ComponentPropertiesResult + { + /// Canonical identity of the component the properties belong to. + [JsonProperty("component")] + public AuthoringResult Component { get; set; } + + /// Map of serialized property name to its JSON value. + [JsonProperty("properties")] + public Dictionary Properties { get; set; } = new Dictionary(); + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/GameObjects/ComponentPropertiesResult.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/GameObjects/ComponentPropertiesResult.cs.meta new file mode 100644 index 00000000..9a9f83cd --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/GameObjects/ComponentPropertiesResult.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: e87b3f2873ff4bac9229a28242917ac0 diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/GameObjects/CreateGameObjectsResult.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/GameObjects/CreateGameObjectsResult.cs new file mode 100644 index 00000000..76c4387f --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/GameObjects/CreateGameObjectsResult.cs @@ -0,0 +1,26 @@ +using System.Collections.Generic; +using Newtonsoft.Json; +using Unity.Pipeline.Models; + +namespace Unity.Pipeline.Editor.Commands.GameObjects +{ + /// + /// Structured result for the batch create_gameobjects command (CLI-223). WHY a dedicated + /// envelope rather than a bare array: it carries the created alongside the + /// list so an agent can confirm the whole batch landed in one round-trip without inspecting array + /// length, and mirrors so the GameObject command surface stays + /// consistent. Each entry is the same canonical identity returned by + /// the single-object create_gameobject, so any created object can be fed straight back as an + /// in a follow-up call. + /// + public sealed class CreateGameObjectsResult + { + /// Number of GameObjects created in the batch. + [JsonProperty("count")] + public int Count { get; set; } + + /// Canonical identities of the created GameObjects, in creation order. + [JsonProperty("gameObjects")] + public List GameObjects { get; set; } = new List(); + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/GameObjects/CreateGameObjectsResult.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/GameObjects/CreateGameObjectsResult.cs.meta new file mode 100644 index 00000000..d78945ba --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/GameObjects/CreateGameObjectsResult.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 671f5065c22d6474b80053b6da5a84ef +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/GameObjects/FindGameObjectsResult.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/GameObjects/FindGameObjectsResult.cs new file mode 100644 index 00000000..98ef8745 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/GameObjects/FindGameObjectsResult.cs @@ -0,0 +1,25 @@ +using System.Collections.Generic; +using Newtonsoft.Json; +using Unity.Pipeline.Models; + +namespace Unity.Pipeline.Editor.Commands.GameObjects +{ + /// + /// Structured result for find_gameobjects. WHY a dedicated envelope rather than a bare + /// array: it carries the match alongside the list so an agent can branch on + /// "found / not found / ambiguous" without inspecting array length, and leaves room to add query + /// metadata later without breaking the shape. Each entry is the same canonical + /// identity returned by the single-object commands, so a result can + /// be fed straight back as an in a follow-up call. + /// + public sealed class FindGameObjectsResult + { + /// Number of GameObjects that matched the query. + [JsonProperty("count")] + public int Count { get; set; } + + /// Canonical identities of the matching GameObjects. + [JsonProperty("gameObjects")] + public List GameObjects { get; set; } = new List(); + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/GameObjects/FindGameObjectsResult.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/GameObjects/FindGameObjectsResult.cs.meta new file mode 100644 index 00000000..23d924c7 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/GameObjects/FindGameObjectsResult.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 1d12bf4a53c14a839c26a91e8ec68292 diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/GameObjects/GameObjectCommands.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/GameObjects/GameObjectCommands.cs new file mode 100644 index 00000000..68196aaf --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/GameObjects/GameObjectCommands.cs @@ -0,0 +1,533 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Unity.Pipeline.Commands; +using Unity.Pipeline.Editor.Authoring; +using Unity.Pipeline.Models; +using UnityEditor; +using UnityEditor.SceneManagement; +using UnityEngine; +using UnityEngine.SceneManagement; +using Object = UnityEngine.Object; + +namespace Unity.Pipeline.Editor.Commands.GameObjects +{ + /// + /// GameObject authoring commands (CLI-192): creating GameObjects, querying the scene hierarchy, + /// and mutating the core GameObject/Transform surface (parenting, transform, active state, tag, + /// layer, name, deletion). + /// + /// WHY these go through the same conventions as the rest of the authoring foundation: + /// every mutation is wrapped in an and registered with Unity's + /// Undo system so an agent's multi-step action reverts as a single collapsible step. Each + /// mutated object is marked dirty (and its scene flagged dirty) so the change survives a Save and + /// is visible to the rest of the Editor. Results come back as the canonical + /// envelope (via ) so the + /// agent can address the same object in a follow-up call. + /// + public static class GameObjectCommands + { + /// + /// Create an empty GameObject or a built-in primitive in the active scene. + /// + /// Creation goes through for primitives (so the + /// matching mesh + collider are attached exactly as the Editor would) and a plain + /// new GameObject for the empty case. The object is registered with + /// so it can be reverted, and an optional parent + /// is resolved by handle so a whole hierarchy can be built in one sequence of calls. + /// + [CliCommand("create_gameobject", + "Create an empty GameObject or a built-in primitive (cube/sphere/capsule/cylinder/plane/quad) in the active scene.")] + public static AuthoringResult CreateGameObject( + [CliArg("name", "Name for the new GameObject. Defaults to 'GameObject' (or the primitive name).")] string name = null, + [CliArg("primitive", "Optional primitive type: cube, sphere, capsule, cylinder, plane, quad. Omit for an empty GameObject.")] string primitive = null, + [CliArg("parent", "Optional parent handle (globalId/path/guid/instanceId/hierarchyPath). The new object becomes a child of it.")] ObjectRef parent = null) + { + // Resolve the parent once, outside the scope, so a bad handle fails before any creation. + var parentTransform = ResolveParentTransform(parent); + + using (new AuthoringUndoScope("Create GameObject")) + { + var go = CreateOne(primitive, name, parentTransform); + MarkDirty(go); + return ObjectResolver.Describe(go); + } + } + + /// + /// Create N GameObjects (empty or a primitive) in one server round-trip (CLI-223). + /// + /// WHY a separate plural command rather than overloading : the + /// single command's contract — one call returns one — is relied + /// on by existing callers and tests, so it is left untouched. This plural command is the batch + /// surface and returns a envelope (count + per-item + /// identities). When > 1 and no explicit name array is supplied, + /// each object is suffixed Name1..NameN so they remain individually addressable. + /// + /// Per-index // + /// are arrays of [x,y,z] vectors. When a vectors array is supplied its length MUST equal + /// (a mismatch is a validation error). Omitted channels leave the + /// object at its creation default (origin / identity / unit scale). The whole batch is wrapped + /// in ONE so it reverts as a single Undo step. + /// + [CliCommand("create_gameobjects", + "Batch-create N empty GameObjects or primitives in one call. Optional positions/rotations/scales are arrays of [x,y,z] (length must equal count). Returns the created identities.")] + public static CreateGameObjectsResult CreateGameObjects( + [CliArg("name", "Base name. With count>1 and no explicit names, objects are suffixed Name1..NameN.")] string name = null, + [CliArg("primitive", "Optional primitive type: cube, sphere, capsule, cylinder, plane, quad. Omit for empty GameObjects.")] string primitive = null, + [CliArg("parent", "Optional parent handle. Every created object becomes a child of it.")] ObjectRef parent = null, + [CliArg("count", "How many GameObjects to create. Default 1.")] int count = 1, + [CliArg("positions", "Local positions, one [x,y,z] per object. Length must equal count when supplied.")] float[][] positions = null, + [CliArg("rotations", "Local Euler rotations (degrees), one [x,y,z] per object. Length must equal count when supplied.")] float[][] rotations = null, + [CliArg("scales", "Local scales, one [x,y,z] per object. Length must equal count when supplied.")] float[][] scales = null) + { + if (count < 1) + throw new ArgumentException($"'count' must be at least 1, got {count}."); + + ValidateVectorArray(positions, count, "positions"); + ValidateVectorArray(rotations, count, "rotations"); + ValidateVectorArray(scales, count, "scales"); + + // Resolve the parent once, outside the scope, so a bad handle fails before any creation. + var parentTransform = ResolveParentTransform(parent); + + var result = new CreateGameObjectsResult(); + using (new AuthoringUndoScope("Create GameObjects")) + { + for (int i = 0; i < count; i++) + { + // count==1 keeps the bare name (no "1" suffix) so a single-item batch reads + // naturally; count>1 suffixes 1..N for individual addressability. + var itemName = count > 1 && !string.IsNullOrEmpty(name) ? name + (i + 1) : name; + var go = CreateOne(primitive, itemName, parentTransform); + + // Index the arg name so a null/mis-shaped entry names the offending element + // (a JSON array may contain a null entry even when its length matches count). + if (positions != null) + go.transform.localPosition = ToVector3(positions[i], $"positions[{i}]"); + if (rotations != null) + go.transform.localEulerAngles = ToVector3(rotations[i], $"rotations[{i}]"); + if (scales != null) + go.transform.localScale = ToVector3(scales[i], $"scales[{i}]"); + + MarkDirty(go); + result.GameObjects.Add(ObjectResolver.Describe(go)); + } + } + + result.Count = result.GameObjects.Count; + return result; + } + + /// + /// Find GameObjects in the loaded scenes by name, tag, component type, and/or hierarchy path. + /// All supplied filters are combined (AND). Returns the canonical identity of each match so an + /// agent can act on the results without a second lookup. + /// + /// This is intentionally a structured query rather than a single-object resolve: agents need + /// to discover what exists before they can reference it, and the result set carries the same + /// identities used everywhere else. + /// + [CliCommand("find_gameobjects", + "Find GameObjects in loaded scenes by name, tag, component type, and/or hierarchy path (filters are combined). Returns structured identities.")] + public static FindGameObjectsResult FindGameObjects( + [CliArg("name", "Exact name to match.")] string name = null, + [CliArg("tag", "Tag to match (e.g. 'Player').")] string tag = null, + [CliArg("type", "Component type name to match (e.g. 'Rigidbody', 'UnityEngine.Camera').")] string type = null, + [CliArg("hierarchy_path", "Exact hierarchy path to match (e.g. '/Root/Child').")] string hierarchyPath = null, + [CliArg("include_inactive", "Include inactive GameObjects. Default true.")] bool includeInactive = true) + { + Type componentType = null; + if (!string.IsNullOrEmpty(type)) + { + componentType = TypeResolver.ResolveComponentType(type); + if (componentType == null) + throw new ArgumentException($"Could not resolve component type '{type}'."); + } + + // Resolve the hierarchy filter once so it is comparable to each object's computed path. + var hierarchyFilter = string.IsNullOrEmpty(hierarchyPath) ? null : NormalizeHierarchyPath(hierarchyPath); + + // Validate the tag up front: comparing against an undefined tag (CompareTag / .tag) would + // log a Unity error per object. An unknown tag simply yields no matches. + if (!string.IsNullOrEmpty(tag) && !InternalEditorTagExists(tag)) + return new FindGameObjectsResult { Count = 0, GameObjects = new List() }; + + var matches = new List(); + foreach (var go in EnumerateSceneGameObjects(includeInactive)) + { + if (!string.IsNullOrEmpty(name) && go.name != name) + continue; + + if (!string.IsNullOrEmpty(tag) && go.tag != tag) + continue; + + if (componentType != null && go.GetComponent(componentType) == null) + continue; + + if (hierarchyFilter != null && GetHierarchyPath(go) != hierarchyFilter) + continue; + + var described = ObjectResolver.Describe(go); + if (described != null) + matches.Add(described); + } + + return new FindGameObjectsResult { Count = matches.Count, GameObjects = matches }; + } + + /// + /// Set the local transform (position, rotation in Euler degrees, scale) of a GameObject. + /// Any omitted channel is left unchanged. Goes through + /// on the Transform so the change is reversible and recorded as a prefab override where relevant. + /// + [CliCommand("set_transform", + "Set a GameObject's local position/rotation(euler)/scale. Omitted channels are left unchanged.")] + public static AuthoringResult SetTransform( + [CliArg("target", "Handle of the GameObject to modify.", Required = true)] ObjectRef target, + [CliArg("position", "Local position as [x,y,z].")] float[] position = null, + [CliArg("rotation", "Local rotation as Euler angles [x,y,z] in degrees.")] float[] rotation = null, + [CliArg("scale", "Local scale as [x,y,z].")] float[] scale = null) + { + var go = ResolveGameObject(target, "target"); + using (new AuthoringUndoScope("Set Transform")) + { + var transform = go.transform; + Undo.RegisterCompleteObjectUndo(transform, "Set Transform"); + + if (position != null) + transform.localPosition = ToVector3(position, "position"); + if (rotation != null) + transform.localEulerAngles = ToVector3(rotation, "rotation"); + if (scale != null) + transform.localScale = ToVector3(scale, "scale"); + + MarkDirty(go); + return ObjectResolver.Describe(go); + } + } + + /// + /// Reparent a GameObject (or clear its parent so it becomes a scene root). Uses + /// so the reparent — including the sibling-index change — + /// is a single undoable operation. World position is preserved by default to match the + /// Editor's drag-to-reparent behavior. + /// + [CliCommand("set_parent", + "Reparent a GameObject under a new parent, or detach it to scene root when no parent is given.")] + public static AuthoringResult SetParent( + [CliArg("target", "Handle of the GameObject to reparent.", Required = true)] ObjectRef target, + [CliArg("parent", "Handle of the new parent. Omit (or empty) to move the object to the scene root.")] ObjectRef parent = null, + [CliArg("world_position_stays", "Keep the object's world position when reparenting. Default true.")] bool worldPositionStays = true) + { + var go = ResolveGameObject(target, "target"); + Transform parentTransform = null; + if (parent != null && !parent.IsEmpty) + parentTransform = ResolveGameObject(parent, "parent").transform; + + using (new AuthoringUndoScope("Set Parent")) + { + Undo.SetTransformParent(go.transform, parentTransform, worldPositionStays, "Set Parent"); + MarkDirty(go); + return ObjectResolver.Describe(go); + } + } + + /// Set a GameObject's active self-state. + [CliCommand("set_active", "Set a GameObject's active self-state (activeSelf).")] + public static AuthoringResult SetActive( + [CliArg("target", "Handle of the GameObject.", Required = true)] ObjectRef target, + [CliArg("active", "Desired active state.", Required = true)] bool active) + { + var go = ResolveGameObject(target, "target"); + using (new AuthoringUndoScope("Set Active")) + { + Undo.RegisterCompleteObjectUndo(go, "Set Active"); + go.SetActive(active); + MarkDirty(go); + return ObjectResolver.Describe(go); + } + } + + /// + /// Set a GameObject's tag. The tag must already exist in the project's Tag Manager; an unknown + /// tag surfaces a clear error rather than silently creating one (tag creation is a project + /// settings mutation outside this command's scope). + /// + [CliCommand("set_tag", "Set a GameObject's tag (the tag must already exist in the project).")] + public static AuthoringResult SetTag( + [CliArg("target", "Handle of the GameObject.", Required = true)] ObjectRef target, + [CliArg("tag", "Tag to assign (must exist in the Tag Manager).", Required = true)] string tag) + { + var go = ResolveGameObject(target, "target"); + if (!InternalEditorTagExists(tag)) + throw new ArgumentException($"Tag '{tag}' does not exist in the project. Add it via the Tag Manager first."); + + using (new AuthoringUndoScope("Set Tag")) + { + Undo.RegisterCompleteObjectUndo(go, "Set Tag"); + go.tag = tag; + MarkDirty(go); + return ObjectResolver.Describe(go); + } + } + + /// + /// Set a GameObject's layer by name or numeric index. A name is resolved via + /// ; an out-of-range index or unknown name is rejected. + /// + [CliCommand("set_layer", "Set a GameObject's layer by name or numeric index (0-31).")] + public static AuthoringResult SetLayer( + [CliArg("target", "Handle of the GameObject.", Required = true)] ObjectRef target, + [CliArg("layer", "Layer name (e.g. 'UI') or numeric index 0-31.", Required = true)] string layer) + { + var go = ResolveGameObject(target, "target"); + var layerIndex = ResolveLayer(layer); + + using (new AuthoringUndoScope("Set Layer")) + { + Undo.RegisterCompleteObjectUndo(go, "Set Layer"); + go.layer = layerIndex; + MarkDirty(go); + return ObjectResolver.Describe(go); + } + } + + /// Rename a GameObject. + [CliCommand("rename_gameobject", "Rename a GameObject.")] + public static AuthoringResult RenameGameObject( + [CliArg("target", "Handle of the GameObject.", Required = true)] ObjectRef target, + [CliArg("name", "New name.", Required = true)] string name) + { + if (string.IsNullOrEmpty(name)) + throw new ArgumentException("New name must not be empty."); + + var go = ResolveGameObject(target, "target"); + using (new AuthoringUndoScope("Rename GameObject")) + { + Undo.RegisterCompleteObjectUndo(go, "Rename GameObject"); + go.name = name; + MarkDirty(go); + return ObjectResolver.Describe(go); + } + } + + /// + /// Delete a GameObject from the scene. Uses so the + /// deletion is reversible. The result describes the object's identity captured *before* + /// destruction (the live object is gone afterwards). + /// + [CliCommand("delete_gameobject", "Delete a GameObject from the scene (reversible via Undo).")] + public static AuthoringResult DeleteGameObject( + [CliArg("target", "Handle of the GameObject to delete.", Required = true)] ObjectRef target) + { + var go = ResolveGameObject(target, "target"); + // Capture identity before destruction; the live object is invalid afterwards. + var described = ObjectResolver.Describe(go); + var scene = go.scene; + + using (new AuthoringUndoScope("Delete GameObject")) + { + Undo.DestroyObjectImmediate(go); + if (scene.IsValid()) + EditorSceneManager.MarkSceneDirty(scene); + } + + return described; + } + + #region Helpers + + /// + /// Resolve an to a GameObject. Accepts either a GameObject handle or a + /// Component handle (in which case its owning GameObject is used), matching how agents tend to + /// hold references. Throws a descriptive error rather than returning null so the command + /// surfaces a clear message to the caller. + /// + internal static GameObject ResolveGameObject(ObjectRef handle, string argName) + { + if (!ObjectResolver.TryResolve(handle, out var obj, out var error)) + throw new ArgumentException($"Could not resolve '{argName}': {error}"); + + var go = obj as GameObject ?? (obj as Component)?.gameObject; + if (go == null) + throw new ArgumentException($"'{argName}' did not resolve to a GameObject (got {obj.GetType().Name})."); + + return go; + } + + /// Mark a GameObject and its scene dirty so changes persist and the Editor refreshes. + internal static void MarkDirty(GameObject go) + { + EditorUtility.SetDirty(go); + if (go.scene.IsValid()) + EditorSceneManager.MarkSceneDirty(go.scene); + } + + /// + /// Create a single GameObject (empty or a primitive), apply an optional name, register it for + /// Undo, and parent it under when given. Shared by the + /// single and the batch so both + /// build objects identically. MUST be called inside an . + /// + private static GameObject CreateOne(string primitive, string name, Transform parentTransform) + { + GameObject go; + if (!string.IsNullOrEmpty(primitive)) + { + if (!TryParsePrimitive(primitive, out var primitiveType)) + throw new ArgumentException( + $"Unknown primitive '{primitive}'. Expected one of: cube, sphere, capsule, cylinder, plane, quad."); + + go = GameObject.CreatePrimitive(primitiveType); + } + else + { + go = new GameObject(); + } + + if (!string.IsNullOrEmpty(name)) + go.name = name; + + Undo.RegisterCreatedObjectUndo(go, "Create GameObject"); + + if (parentTransform != null) + Undo.SetTransformParent(go.transform, parentTransform, "Create GameObject"); + + return go; + } + + /// + /// Resolve an optional parent handle to its Transform, or null when no parent is supplied. + /// Resolved before any creation so an invalid handle fails fast (and a batch creates nothing). + /// + private static Transform ResolveParentTransform(ObjectRef parent) + { + if (parent == null || parent.IsEmpty) + return null; + return ResolveGameObject(parent, "parent").transform; + } + + /// + /// Validate a per-item vectors array (positions/rotations/scales) up front, before any object is + /// created. When supplied it must have exactly one entry per object, and every entry must be a + /// non-null [x,y,z] triple (a JSON array can carry a null element even when its length matches + /// count). A bad array is an agent error surfaced as an naming + /// the offending index, so a batch applies fully or creates nothing rather than throwing an + /// NRE part-way through. + /// + private static void ValidateVectorArray(float[][] vectors, int count, string argName) + { + if (vectors == null) + return; + + if (vectors.Length != count) + throw new ArgumentException( + $"'{argName}' has {vectors.Length} entries but count is {count}; they must match."); + + for (int i = 0; i < vectors.Length; i++) + { + if (vectors[i] == null) + throw new ArgumentException($"'{argName}[{i}]' must be an [x,y,z] array but was null."); + if (vectors[i].Length != 3) + throw new ArgumentException( + $"'{argName}[{i}]' must have exactly 3 components [x,y,z], got {vectors[i].Length}."); + } + } + + private static bool TryParsePrimitive(string value, out PrimitiveType primitiveType) + { + switch (value.Trim().ToLowerInvariant()) + { + case "cube": primitiveType = PrimitiveType.Cube; return true; + case "sphere": primitiveType = PrimitiveType.Sphere; return true; + case "capsule": primitiveType = PrimitiveType.Capsule; return true; + case "cylinder": primitiveType = PrimitiveType.Cylinder; return true; + case "plane": primitiveType = PrimitiveType.Plane; return true; + case "quad": primitiveType = PrimitiveType.Quad; return true; + default: primitiveType = default; return false; + } + } + + private static Vector3 ToVector3(float[] values, string argName) + { + if (values == null) + throw new ArgumentException($"'{argName}' must be an [x,y,z] array but was null."); + if (values.Length != 3) + throw new ArgumentException($"'{argName}' must have exactly 3 components [x,y,z], got {values.Length}."); + return new Vector3(values[0], values[1], values[2]); + } + + private static int ResolveLayer(string layer) + { + if (int.TryParse(layer, out var index)) + { + if (index < 0 || index > 31) + throw new ArgumentException($"Layer index {index} is out of range (0-31)."); + return index; + } + + var named = LayerMask.NameToLayer(layer); + if (named < 0) + throw new ArgumentException($"Layer '{layer}' does not exist in the project."); + return named; + } + + private static bool InternalEditorTagExists(string tag) + { + return UnityEditorInternal.InternalEditorUtility.tags.Contains(tag); + } + + private static IEnumerable EnumerateSceneGameObjects(bool includeInactive) + { + for (int s = 0; s < SceneManager.sceneCount; s++) + { + var scene = SceneManager.GetSceneAt(s); + if (!scene.isLoaded) + continue; + + foreach (var root in scene.GetRootGameObjects()) + { + foreach (var go in EnumerateRecursive(root, includeInactive)) + yield return go; + } + } + } + + private static IEnumerable EnumerateRecursive(GameObject go, bool includeInactive) + { + if (!includeInactive && !go.activeInHierarchy) + yield break; + + yield return go; + + var transform = go.transform; + for (int i = 0; i < transform.childCount; i++) + { + foreach (var child in EnumerateRecursive(transform.GetChild(i).gameObject, includeInactive)) + yield return child; + } + } + + private static string GetHierarchyPath(GameObject go) + { + var sb = new System.Text.StringBuilder(go.name); + var parent = go.transform.parent; + while (parent != null) + { + sb.Insert(0, parent.name + "/"); + parent = parent.parent; + } + + return "/" + sb; + } + + private static string NormalizeHierarchyPath(string path) + { + var trimmed = "/" + path.Trim().Trim('/'); + return trimmed; + } + + #endregion + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/GameObjects/GameObjectCommands.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/GameObjects/GameObjectCommands.cs.meta new file mode 100644 index 00000000..eb0a58bc --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/GameObjects/GameObjectCommands.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: a1aac051d9234c78b4918a8dd366514a diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/GameObjects/SerializedPropertyConverter.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/GameObjects/SerializedPropertyConverter.cs new file mode 100644 index 00000000..5225659c --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/GameObjects/SerializedPropertyConverter.cs @@ -0,0 +1,224 @@ +using System; +using Newtonsoft.Json.Linq; +using Unity.Pipeline.Editor.Authoring; +using Unity.Pipeline.Models; +using UnityEditor; +using UnityEngine; +using Object = UnityEngine.Object; + +namespace Unity.Pipeline.Editor.Commands.GameObjects +{ + /// + /// Reads and writes a single from/to a JSON value. + /// + /// WHY everything goes through SerializedProperty rather than reflection on the C# field: it is + /// the only path that correctly participates in dirtying, prefab override tracking, and Undo + /// (when the change is applied via ). + /// Reflection would bypass all three and leave the Editor's view stale. + /// + /// Supported surface: primitives (bool/int/long/float/double/string), enums (by name or index), + /// //, , and + /// object references (assigned from an handle resolved by + /// ). + /// + internal static class SerializedPropertyConverter + { + /// + /// Read a property into a JSON-friendly value (primitive, string, or small array/object for + /// vector/color types). Unsupported property kinds return a short type descriptor string so a + /// get_component_properties dump never throws on an exotic field. + /// + public static JToken Read(SerializedProperty property) + { + // Array/list fields surface as Generic with isArray=true; return their elements as a JSON + // array so a get/set round-trips. (String also reports isArray, hence the exclusion.) + if (property.isArray && property.propertyType != SerializedPropertyType.String) + { + var elements = new JArray(); + for (int i = 0; i < property.arraySize; i++) + elements.Add(Read(property.GetArrayElementAtIndex(i))); + return elements; + } + + switch (property.propertyType) + { + case SerializedPropertyType.Boolean: + return new JValue(property.boolValue); + case SerializedPropertyType.Integer: + return new JValue(property.longValue); + case SerializedPropertyType.Float: + return new JValue(property.doubleValue); + case SerializedPropertyType.String: + return new JValue(property.stringValue); + case SerializedPropertyType.Enum: + // enumValueIndex indexes enumNames; guard against -1 (mixed/unknown). + return property.enumValueIndex >= 0 && property.enumValueIndex < property.enumNames.Length + ? new JValue(property.enumNames[property.enumValueIndex]) + : new JValue(property.intValue); + case SerializedPropertyType.Vector2: + return ToArray(property.vector2Value.x, property.vector2Value.y); + case SerializedPropertyType.Vector3: + return ToArray(property.vector3Value.x, property.vector3Value.y, property.vector3Value.z); + case SerializedPropertyType.Vector4: + return ToArray(property.vector4Value.x, property.vector4Value.y, property.vector4Value.z, property.vector4Value.w); + case SerializedPropertyType.Color: + var c = property.colorValue; + return ToArray(c.r, c.g, c.b, c.a); + case SerializedPropertyType.ObjectReference: + return property.objectReferenceValue != null + ? JToken.FromObject(ObjectResolver.Describe(property.objectReferenceValue)) + : JValue.CreateNull(); + default: + // Bounds, Quaternion, AnimationCurve, etc. are out of MVP scope: surface a hint. + return new JValue($""); + } + } + + /// + /// Write a JSON value into a property. Throws with a clear + /// message on a type mismatch so set_component_properties reports exactly which field/value + /// failed. Object references are resolved from an -shaped JSON object + /// (or a bare string treated as an asset path / globalId). + /// + public static void Write(SerializedProperty property, JToken value) + { + // Array/list fields (Generic + isArray) are written from a JSON array: resize, then recurse + // per element so arrays of primitives AND object references (e.g. MeshRenderer.m_Materials) + // both work. (String also reports isArray, hence the exclusion.) + if (property.isArray && property.propertyType != SerializedPropertyType.String) + { + if (!(value is JArray array)) + throw new ArgumentException( + $"Property '{property.name}' is an array; provide a JSON array of elements."); + + property.arraySize = array.Count; + for (int i = 0; i < array.Count; i++) + Write(property.GetArrayElementAtIndex(i), array[i]); + return; + } + + switch (property.propertyType) + { + case SerializedPropertyType.Boolean: + property.boolValue = value.ToObject(); + break; + case SerializedPropertyType.Integer: + property.longValue = value.ToObject(); + break; + case SerializedPropertyType.Float: + property.doubleValue = value.ToObject(); + break; + case SerializedPropertyType.String: + property.stringValue = value.Type == JTokenType.Null ? string.Empty : value.ToObject(); + break; + case SerializedPropertyType.Enum: + WriteEnum(property, value); + break; + case SerializedPropertyType.Vector2: + { + var a = ToFloats(value, 2, property.name); + property.vector2Value = new Vector2(a[0], a[1]); + break; + } + case SerializedPropertyType.Vector3: + { + var a = ToFloats(value, 3, property.name); + property.vector3Value = new Vector3(a[0], a[1], a[2]); + break; + } + case SerializedPropertyType.Vector4: + { + var a = ToFloats(value, 4, property.name); + property.vector4Value = new Vector4(a[0], a[1], a[2], a[3]); + break; + } + case SerializedPropertyType.Color: + { + var a = ToFloats(value, 4, property.name); + property.colorValue = new Color(a[0], a[1], a[2], a[3]); + break; + } + case SerializedPropertyType.ObjectReference: + property.objectReferenceValue = ResolveObjectReference(value, property.name); + break; + default: + throw new ArgumentException( + $"Property '{property.name}' has unsupported type '{property.propertyType}' for set."); + } + } + + private static void WriteEnum(SerializedProperty property, JToken value) + { + // Accept either the enum constant name or its index/value. + if (value.Type == JTokenType.String) + { + var name = value.ToObject(); + var index = Array.IndexOf(property.enumNames, name); + if (index < 0) + { + // Fall back to display names (Editor humanized form), then error. + index = Array.IndexOf(property.enumDisplayNames, name); + if (index < 0) + throw new ArgumentException( + $"Enum value '{name}' is not valid for property '{property.name}'. Valid: [{string.Join(", ", property.enumNames)}]."); + } + + property.enumValueIndex = index; + } + else + { + // A numeric value is the enum's underlying integer, NOT an index into enumNames: + // those only coincide when declaration order matches the constant values. Mirror Read, + // which falls back to property.intValue, so round-tripping a numeric enum is stable. + property.intValue = value.ToObject(); + } + } + + private static Object ResolveObjectReference(JToken value, string propertyName) + { + // An explicit null clears the reference; anything else MUST resolve — never silently no-op + // (a handle that doesn't resolve used to be dropped, so the command reported success while + // assigning nothing). + if (value == null || value.Type == JTokenType.Null) + return null; + + // Route every shape (string handle, handle object, or bare-integer instanceId) through + // ObjectRefConverter so path / guid / globalId / instanceId forms all parse identically. + var handle = value.ToObject(); + if (handle == null || handle.IsEmpty) + throw new ArgumentException( + $"Property '{propertyName}': '{value}' is not a recognized object reference handle. " + + "Provide a path, guid, globalId, or instanceId (or null to clear)."); + + if (!ObjectResolver.TryResolve(handle, out var obj, out var error)) + throw new ArgumentException($"Could not resolve object reference for '{propertyName}': {error}"); + + return obj; + } + + private static float[] ToFloats(JToken value, int expected, string propertyName) + { + if (value is JArray array) + { + if (array.Count != expected) + throw new ArgumentException( + $"Property '{propertyName}' expects {expected} components, got {array.Count}."); + var result = new float[expected]; + for (int i = 0; i < expected; i++) + result[i] = array[i].ToObject(); + return result; + } + + throw new ArgumentException( + $"Property '{propertyName}' expects an array of {expected} numbers."); + } + + private static JArray ToArray(params float[] values) + { + var array = new JArray(); + foreach (var v in values) + array.Add(v); + return array; + } + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/GameObjects/SerializedPropertyConverter.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/GameObjects/SerializedPropertyConverter.cs.meta new file mode 100644 index 00000000..b42d4073 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/GameObjects/SerializedPropertyConverter.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 85f605c1109e40898fe47ff1e2a8a4d0 diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/GameObjects/TypeResolver.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/GameObjects/TypeResolver.cs new file mode 100644 index 00000000..5bddcca6 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/GameObjects/TypeResolver.cs @@ -0,0 +1,82 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using UnityEngine; + +namespace Unity.Pipeline.Editor.Commands.GameObjects +{ + /// + /// Resolves a -derived from an + /// agent-supplied name. WHY this is non-trivial: agents pass either a short name ("Rigidbody") + /// or a fully-qualified one ("UnityEngine.Camera"), and the type may live in any loaded assembly + /// (UnityEngine modules, user assemblies, packages). We therefore try, in order: an exact + /// fully-qualified , then a scan of all loaded assemblies for a + /// full-name match, then a short-name match. Only subclasses are accepted + /// so the result is always valid for AddComponent/GetComponent. + /// + public static class TypeResolver + { + /// + /// Resolve a component type by name, or return null if no unambiguous + /// subclass matches. A short name that matches multiple types in different namespaces is + /// treated as ambiguous and returns null (the caller should ask for a fully-qualified name). + /// + public static Type ResolveComponentType(string typeName) + { + if (string.IsNullOrWhiteSpace(typeName)) + return null; + + typeName = typeName.Trim(); + + // 1. Exact, assembly-qualified or fully-qualified lookup. + var direct = Type.GetType(typeName, throwOnError: false, ignoreCase: false); + if (IsComponent(direct)) + return direct; + + var assemblies = PipelineUtils.GetLoadedAssemblies(); + + // 2. Full-name match across loaded assemblies. + var fullNameMatches = new List(); + // 3. Short-name match (collected in the same pass) as a fallback. + var shortNameMatches = new List(); + + foreach (var assembly in assemblies) + { + Type[] types; + try + { + types = assembly.GetTypes(); + } + catch (System.Reflection.ReflectionTypeLoadException ex) + { + types = ex.Types.Where(t => t != null).ToArray(); + } + + foreach (var type in types) + { + if (!IsComponent(type)) + continue; + + if (string.Equals(type.FullName, typeName, StringComparison.Ordinal)) + fullNameMatches.Add(type); + else if (string.Equals(type.Name, typeName, StringComparison.Ordinal)) + shortNameMatches.Add(type); + } + } + + if (fullNameMatches.Count == 1) + return fullNameMatches[0]; + if (fullNameMatches.Count > 1) + return null; // genuinely ambiguous full names (rare) — caller must disambiguate. + + // Distinct in case the same type is reachable through multiple assembly references. + var distinctShort = shortNameMatches.Distinct().ToList(); + return distinctShort.Count == 1 ? distinctShort[0] : null; + } + + private static bool IsComponent(Type type) + { + return type != null && typeof(Component).IsAssignableFrom(type) && !type.IsAbstract; + } + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/GameObjects/TypeResolver.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/GameObjects/TypeResolver.cs.meta new file mode 100644 index 00000000..57792669 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/GameObjects/TypeResolver.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: f033287d429f4957bfcfd6795f731b48 diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Materials.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Materials.meta new file mode 100644 index 00000000..64b68572 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Materials.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 4841c84bba2a471eb3fb429f79e3b118 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Materials/MaterialCommands.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Materials/MaterialCommands.cs new file mode 100644 index 00000000..3c714374 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Materials/MaterialCommands.cs @@ -0,0 +1,405 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Newtonsoft.Json.Linq; +using Unity.Pipeline.Commands; +using Unity.Pipeline.Editor.Authoring; +using Unity.Pipeline.Models; +using UnityEditor; +using UnityEngine; +using UnityEngine.Rendering; +using Object = UnityEngine.Object; + +namespace Unity.Pipeline.Editor.Commands.Materials +{ + /// + /// Materials authoring commands (CLI-213): read and write a material's shader, shader properties + /// (floats, colors, vectors, textures, ints), keywords, and render queue. + /// + /// These sit on the CLI-190 authoring foundation: + /// - the material is addressed with an resolved by + /// and confined to the authoring root (a GUID/globalId handle can't edit a material outside the sandbox), + /// - texture property values are s likewise confined to the root, + /// - writes are wrapped in an with + /// (material property changes ARE covered by Undo.RecordObject, unlike AssetDatabase ops), then + /// + persist them, + /// - unknown property names and type mismatches are reported in unknown[] rather than failing + /// the whole call (as long as at least one input applied). + /// + /// Material CREATION already exists in create_asset (CLI-221); this command set is the + /// read/write surface on top of an existing material. + /// + public static class MaterialCommands + { + [CliCommand("get_material_properties", + "Read a material's shader, render queue, enabled keywords, and all shader properties with their current values (Color as [r,g,b,a], Vector as [x,y,z,w], Texture as an object reference).")] + public static MaterialPropertiesResult GetMaterialProperties( + [CliArg("material", "Reference to the .mat asset (or a loaded material) to read (path / guid / globalId / instanceId).", Required = true)] ObjectRef material) + { + var mat = ResolveMaterial(material, out var assetPath); + + var result = new MaterialPropertiesResult + { + AssetPath = assetPath, + Shader = mat.shader != null ? mat.shader.name : null, + // rawRenderQueue is -1 when the material inherits from the shader and a positive + // integer when explicitly overridden — returning the raw value preserves the + // round-trip contract with set_material_properties renderQueue:-1 (inherit). + RenderQueue = GetRawRenderQueue(mat), + EnabledKeywords = GetEnabledKeywords(mat), + }; + + var shader = mat.shader; + if (shader != null) + { + // Enumerate the shader's declared properties via the Shader instance APIs (single index + // space, matching get_shader_properties), so name/type/range-limits always line up. + int count = shader.GetPropertyCount(); + for (int i = 0; i < count; i++) + { + var name = shader.GetPropertyName(i); + var propType = shader.GetPropertyType(i); + + var entry = new MaterialPropertyValue + { + Name = name, + Type = PublicValueType(propType), + Value = MaterialValueConverter.ReadValue(mat, name, propType), + }; + + if (propType == ShaderPropertyType.Range) + { + var limits = shader.GetPropertyRangeLimits(i); + entry.Range = new MaterialRange + { + Min = limits.x, + Max = limits.y, + }; + } + + result.Properties.Add(entry); + } + } + + return result; + } + + [CliCommand("set_material_properties", + "Set shader properties on a material (Float/Range/Int=number; Color=[r,g,b,a] or \"#RRGGBBAA\" hex; Vector=[x,y,z,w]; Texture=an object reference or null to clear), optionally reassign the shader, set the render queue, and toggle keywords. Unknown names / type mismatches are reported in unknown[].")] + public static SetMaterialPropertiesResult SetMaterialProperties( + [CliArg("material", "Reference to the .mat asset (or a loaded material) to edit (path / guid / globalId / instanceId).", Required = true)] ObjectRef material, + [CliArg("shader", "Reassign the material's shader by name (e.g. \"Standard\", \"Universal Render Pipeline/Lit\", or a Shader Graph shader name). Applied before properties so new property names resolve against the new shader.")] string shader = null, + [CliArg("properties", "JSON object of shader property name -> value. Names must include the leading underscore (e.g. _BaseColor). Float/Range/Int=number; Color=[r,g,b,a] or hex string; Vector=[x,y,z,w]; Texture=an object reference {guid/path} or null.")] JObject properties = null, + [CliArg("renderQueue", "Explicit render queue, or -1 to inherit from the shader. Omit to leave unchanged.")] int? renderQueue = null, + [CliArg("enableKeywords", "Shader keywords to enable (e.g. _NORMALMAP, _EMISSION).")] string[] enableKeywords = null, + [CliArg("disableKeywords", "Shader keywords to disable.")] string[] disableKeywords = null, + [CliArg("confirm", "Reserved for parity; editing an existing material is non-destructive and undoable, so it is not required.")] bool confirm = false, + [CliArg("dry_run", "If true, validate the shader, resolve property names and texture refs, and report applied[]/unknown[] without writing anything.")] bool dryRun = false) + { + var mat = ResolveMaterial(material, out var assetPath); + + // Resolve the (optional) replacement shader UP FRONT so dry_run validates it too, and a + // shader_not_found writes nothing (acceptance #9). Shader.Find only finds compiled/included + // shaders — surface that in the hint. + Shader newShader = null; + if (shader != null) + { + newShader = Shader.Find(shader); + if (newShader == null) + throw new ShaderNotFoundException( + $"Shader '{shader}' not found. Shader.Find only resolves shaders that are compiled/included in the build (or referenced by a material/scene). Use list_shaders to discover valid names."); + } + + var result = new SetMaterialPropertiesResult(); + + // ---- dry_run: validate against the would-be shader, never mutate ---------------------- + if (dryRun) + { + var effectiveShader = newShader ?? mat.shader; + ValidateProperties(effectiveShader, properties, result); + if (renderQueue.HasValue) + result.Applied.Add("renderQueue"); + AddKeywordTokens(result.Applied, enableKeywords, disableKeywords); + + GuardAtLeastOneApplied(result, shaderReassigned: newShader != null); + + CopyIdentity(mat, assetPath, result); + result.Shader = effectiveShader != null ? effectiveShader.name : null; + return result; + } + + // ---- apply -------------------------------------------------------------------------- + using (new AuthoringUndoScope("Set Material Properties")) + { + // Material property/shader/keyword/renderQueue changes are all covered by Undo.RecordObject. + Undo.RecordObject(mat, "Set Material Properties"); + + if (newShader != null) + mat.shader = newShader; + + if (properties != null) + { + foreach (var pair in properties) + { + if (pair.Key == "token") // injected by the server; never a material property. + continue; + + var name = pair.Key; + if (!mat.HasProperty(name)) + { + result.Unknown.Add($"{name}: unknown property (not declared by shader '{(mat.shader != null ? mat.shader.name : "")}')"); + continue; + } + + var propType = GetPropertyType(mat.shader, name); + if (propType == null) + { + // HasProperty was true but the type couldn't be read off the shader (e.g. a + // built-in property like unity_Lightmaps not declared in the shader's list). + result.Unknown.Add($"{name}: property is not a settable shader property on '{(mat.shader != null ? mat.shader.name : "")}'"); + continue; + } + + try + { + MaterialValueConverter.ApplyValue(mat, name, propType.Value, pair.Value); + result.Applied.Add(name); + } + catch (MaterialPropertyTypeMismatch mismatch) + { + result.Unknown.Add(mismatch.Message); + } + } + } + + if (renderQueue.HasValue) + { + mat.renderQueue = renderQueue.Value; + result.Applied.Add("renderQueue"); + } + + ApplyKeywords(mat, enableKeywords, disableKeywords, result.Applied); + + GuardAtLeastOneApplied(result, shaderReassigned: newShader != null); + + EditorUtility.SetDirty(mat); + if (!string.IsNullOrEmpty(assetPath)) + AssetDatabase.SaveAssetIfDirty(mat); + } + + CopyIdentity(mat, assetPath, result); + result.Shader = mat.shader != null ? mat.shader.name : null; + return result; + } + + private static int GetRawRenderQueue(Material mat) + { + var serialized = new SerializedObject(mat); + var customRenderQueue = serialized.FindProperty("m_CustomRenderQueue"); + return customRenderQueue != null ? customRenderQueue.intValue : mat.renderQueue; + } + + /// + /// Resolve an to a , confining any on-disk asset to + /// the authoring root. Returns the project-relative asset path (null for a non-asset/in-memory + /// material). Throws a clear on miss / wrong type / out-of-root. + /// + internal static Material ResolveMaterial(ObjectRef material, out string assetPath) + { + if (material == null || material.IsEmpty) + throw new ArgumentException("'material' is required."); + + if (!ObjectResolver.TryResolve(material, out var obj, out var error)) + throw new ArgumentException($"Could not resolve material: {error}"); + + if (!(obj is Material mat)) + throw new ArgumentException($"Reference '{material}' resolved to a {obj.GetType().Name}, not a Material."); + + assetPath = AssetDatabase.GetAssetPath(mat); + if (!string.IsNullOrEmpty(assetPath)) + { + var confined = ProjectPaths.Resolve(assetPath, out var confineError); + if (confined == null) + throw new ArgumentException( + $"Material '{assetPath}' is outside the authoring root '{ProjectPaths.AuthoringRoot}': {confineError}"); + assetPath = confined; + } + + return mat; + } + + /// + /// Read the material's enabled keyword set. Uses + /// (LocalKeyword[]) which is the supported API on the package's min Unity version (Unity 6 / + /// 6000.0); the legacy shaderKeywords string[] is deprecated. + /// + private static List GetEnabledKeywords(Material mat) + { + var keywords = new List(); + foreach (var keyword in mat.enabledKeywords) + keywords.Add(keyword.name); + keywords.Sort(StringComparer.Ordinal); + return keywords; + } + + private static void ApplyKeywords(Material mat, string[] enable, string[] disable, List applied) + { + // Use the LocalKeyword API (Unity 2022.1+) so that Enable/Disable and the + // enabledKeywords reader are talking to the same keyword table. The legacy + // string-based EnableKeyword(string) affects global keywords, whereas + // mat.enabledKeywords returns LocalKeyword[], so they would disagree on round-trip. + if (enable != null) + { + foreach (var keyword in enable) + { + if (string.IsNullOrWhiteSpace(keyword) || mat.shader == null) + continue; + mat.EnableKeyword(new LocalKeyword(mat.shader, keyword)); + applied.Add($"+keyword:{keyword}"); + } + } + + if (disable != null) + { + foreach (var keyword in disable) + { + if (string.IsNullOrWhiteSpace(keyword) || mat.shader == null) + continue; + mat.DisableKeyword(new LocalKeyword(mat.shader, keyword)); + applied.Add($"-keyword:{keyword}"); + } + } + } + + private static void AddKeywordTokens(List applied, string[] enable, string[] disable) + { + if (enable != null) + foreach (var keyword in enable.Where(k => !string.IsNullOrWhiteSpace(k))) + applied.Add($"+keyword:{keyword}"); + if (disable != null) + foreach (var keyword in disable.Where(k => !string.IsNullOrWhiteSpace(k))) + applied.Add($"-keyword:{keyword}"); + } + + /// + /// dry_run validation: classify each supplied property as applicable (name resolves AND value + /// shape matches the declared type) or unknown, WITHOUT mutating the material. + /// + private static void ValidateProperties(Shader shader, JObject properties, SetMaterialPropertiesResult result) + { + if (properties == null) + return; + + foreach (var pair in properties) + { + if (pair.Key == "token") + continue; + + var name = pair.Key; + var propType = shader != null ? GetPropertyType(shader, name) : null; + if (propType == null) + { + result.Unknown.Add($"{name}: unknown property (not declared by shader '{(shader != null ? shader.name : "")}')"); + continue; + } + + // Validate the value shape against the type by attempting a conversion on a throwaway + // material instance — never the caller's material (dry_run must leave no trace). + Material probe = null; + try + { + probe = new Material(shader); + MaterialValueConverter.ApplyValue(probe, name, propType.Value, pair.Value); + result.Applied.Add(name); + } + catch (MaterialPropertyTypeMismatch mismatch) + { + result.Unknown.Add(mismatch.Message); + } + finally + { + if (probe != null) + Object.DestroyImmediate(probe); + } + } + } + + /// + /// Look up a property's by name on a shader. + /// Returns null when the shader has no property with that exact name (case-sensitive; names include + /// the leading underscore). + /// + internal static ShaderPropertyType? GetPropertyType(Shader shader, string name) + { + if (shader == null) + return null; + int count = shader.GetPropertyCount(); + for (int i = 0; i < count; i++) + { + if (shader.GetPropertyName(i) == name) + return shader.GetPropertyType(i); + } + return null; + } + + private static void GuardAtLeastOneApplied(SetMaterialPropertiesResult result, bool shaderReassigned) + { + // A shader reassignment is itself a successful change, so it satisfies the "at least one + // thing applied" guard even when every supplied property is unknown for the new shader. + if (!shaderReassigned && result.Applied.Count == 0 && result.Unknown.Count > 0) + throw new ArgumentException( + $"None of the supplied inputs could be applied (unknown property name or type mismatch): {string.Join("; ", result.Unknown)}."); + } + + private static void CopyIdentity(Material mat, string assetPath, SetMaterialPropertiesResult result) + { + var identity = ObjectResolver.Describe(mat); + if (identity != null) + { + result.GlobalId = identity.GlobalId; + result.Guid = identity.Guid; + result.FileId = identity.FileId; + result.InstanceId = identity.InstanceId; + result.HierarchyPath = identity.HierarchyPath; + result.Type = identity.Type; + } + else + { + result.Type = nameof(Material); + } + + // Prefer the confined asset path computed by ResolveMaterial. + if (!string.IsNullOrEmpty(assetPath)) + result.AssetPath = assetPath; + } + + /// Map a to the value-shape label used by get_material_properties. + private static string PublicValueType(ShaderPropertyType type) + { + switch (type) + { + case ShaderPropertyType.Color: return "Color"; + case ShaderPropertyType.Vector: return "Vector"; + case ShaderPropertyType.Float: return "Float"; + case ShaderPropertyType.Range: return "Range"; + case ShaderPropertyType.Texture: return "Texture"; + case ShaderPropertyType.Int: return "Int"; + default: return type.ToString(); + } + } + } + + /// + /// Thrown when a requested shader name does not resolve via . Carries the + /// stable shader_not_found code (also prefixed onto the message, since the server propagates + /// only the exception message over the wire) so a client can distinguish it from other failures. + /// + public sealed class ShaderNotFoundException : Exception + { + public const string CodeValue = "shader_not_found"; + + public string Code => CodeValue; + + public ShaderNotFoundException(string message) : base($"[{CodeValue}] {message}") { } + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Materials/MaterialCommands.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Materials/MaterialCommands.cs.meta new file mode 100644 index 00000000..b68b4f07 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Materials/MaterialCommands.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: a14c4a97ac9e4d61b904de30d1016d92 diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Materials/MaterialResults.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Materials/MaterialResults.cs new file mode 100644 index 00000000..b1e9fd89 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Materials/MaterialResults.cs @@ -0,0 +1,147 @@ +using System; +using System.Collections.Generic; +using Newtonsoft.Json; +using Unity.Pipeline.Models; + +namespace Unity.Pipeline.Editor.Commands.Materials +{ + /// + /// Result of get_material_properties (CLI-213): the material's shader, render queue, enabled + /// keywords, and the full list of shader properties with their current values. + /// + [Serializable] + public class MaterialPropertiesResult + { + [JsonProperty("assetPath")] + public string AssetPath { get; set; } + + /// Shader name, e.g. "Universal Render Pipeline/Lit". + [JsonProperty("shader")] + public string Shader { get; set; } + + /// Render queue; -1 means "inherit from shader". + [JsonProperty("renderQueue")] + public int RenderQueue { get; set; } + + [JsonProperty("enabledKeywords")] + public List EnabledKeywords { get; set; } = new List(); + + [JsonProperty("properties")] + public List Properties { get; set; } = new List(); + } + + /// A single shader property of a material with its current value. + [Serializable] + public class MaterialPropertyValue + { + [JsonProperty("name")] + public string Name { get; set; } + + /// "Float" | "Range" | "Color" | "Vector" | "Texture" | "Int". + [JsonProperty("type")] + public string Type { get; set; } + + /// + /// number | [r,g,b,a] | [x,y,z,w] | { texture: ObjectRef } | null, per the property type. + /// + [JsonProperty("value")] + public object Value { get; set; } + + /// Min/max for a Range property; null otherwise. + [JsonProperty("range", NullValueHandling = NullValueHandling.Ignore)] + public MaterialRange Range { get; set; } + } + + /// Inclusive min/max bounds of a Range shader property. + [Serializable] + public class MaterialRange + { + [JsonProperty("min")] + public float Min { get; set; } + + [JsonProperty("max")] + public float Max { get; set; } + } + + /// + /// Result of set_material_properties (CLI-213): the canonical + /// identity of the edited material, extended with which properties applied vs. were unknown (with a + /// reason), and the material's (possibly reassigned) shader name. + /// + [Serializable] + public class SetMaterialPropertiesResult : AuthoringResult + { + /// Shader name after any reassignment. + [JsonProperty("shader")] + public string Shader { get; set; } + + /// Property names (and keyword/renderQueue tokens) that were applied. + [JsonProperty("applied")] + public List Applied { get; set; } = new List(); + + /// + /// Inputs that could not be applied, each as "name: reason" (unknown property name, or a type + /// mismatch like "_Metallic: expected Float, got array"). + /// + [JsonProperty("unknown")] + public List Unknown { get; set; } = new List(); + } + + /// A single discovered shader entry from list_shaders. + [Serializable] + public class ShaderInfo + { + [JsonProperty("name")] + public string Name { get; set; } + + /// Project asset path for a project shader; null for a built-in/engine shader. + [JsonProperty("assetPath")] + public string AssetPath { get; set; } + + [JsonProperty("isBuiltin")] + public bool IsBuiltin { get; set; } + + /// Reflects Shader.isSupported for the active render pipeline. + [JsonProperty("isSupported")] + public bool IsSupported { get; set; } + } + + /// Result of get_shader_properties (CLI-213): a shader's declared property list. + [Serializable] + public class ShaderPropertiesResult + { + [JsonProperty("shader")] + public string Shader { get; set; } + + [JsonProperty("properties")] + public List Properties { get; set; } = new List(); + } + + /// A single declared shader property, introspected via ShaderUtil. + [Serializable] + public class ShaderPropertyInfo + { + [JsonProperty("name")] + public string Name { get; set; } + + /// ShaderUtil property description (the UI label). + [JsonProperty("description")] + public string Description { get; set; } + + /// "Color" | "Vector" | "Float" | "Range" | "TexEnv" | "Int". + [JsonProperty("type")] + public string Type { get; set; } + + /// Min/max for a Range property; null otherwise. + [JsonProperty("range", NullValueHandling = NullValueHandling.Ignore)] + public MaterialRange Range { get; set; } + + /// "Tex2D" | "Cube" | "Tex3D" | "Tex2DArray" for a TexEnv property; null otherwise. + [JsonProperty("textureDimension", NullValueHandling = NullValueHandling.Ignore)] + public string TextureDimension { get; set; } + + /// Property flags, e.g. "HideInInspector", "Normal", "HDR", "NoScaleOffset". + [JsonProperty("flags")] + public List Flags { get; set; } = new List(); + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Materials/MaterialResults.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Materials/MaterialResults.cs.meta new file mode 100644 index 00000000..db85ad6b --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Materials/MaterialResults.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 52b9d1506e9b4a95982ff554d70179b3 diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Materials/MaterialValueConverter.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Materials/MaterialValueConverter.cs new file mode 100644 index 00000000..ae4d5f22 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Materials/MaterialValueConverter.cs @@ -0,0 +1,310 @@ +using System; +using System.Globalization; +using Newtonsoft.Json.Linq; +using Unity.Pipeline.Editor.Authoring; +using Unity.Pipeline.Models; +using UnityEditor; +using UnityEngine; +using UnityEngine.Rendering; +using Object = UnityEngine.Object; + +namespace Unity.Pipeline.Editor.Commands.Materials +{ + /// + /// Bridges agent-supplied JSON values and a 's shader properties for the + /// get_material_properties / set_material_properties commands (CLI-213). + /// + /// Value encoding by shader property type: + /// - Float / Range / Int : a JSON number + /// - Color : [r, g, b, a] (floats 0–1) or a "#RRGGBB"/"#RRGGBBAA" hex string + /// - Vector : [x, y, z, w] + /// - Texture (TexEnv) : an object (resolved + confined to the authoring + /// root), or null to clear + /// + /// Reads return the same shapes (Color as [r,g,b,a], Vector as [x,y,z,w], Texture as + /// { texture: ObjectRef } or null) so a read round-trips back through a write. + /// + internal static class MaterialValueConverter + { + /// + /// Read a single shader property's current value off the material into a plain object suitable + /// for JSON serialization. The shape matches the . + /// + public static object ReadValue(Material material, string propertyName, ShaderPropertyType type) + { + switch (type) + { + case ShaderPropertyType.Color: + { + var c = material.GetColor(propertyName); + return new[] { c.r, c.g, c.b, c.a }; + } + case ShaderPropertyType.Vector: + { + var v = material.GetVector(propertyName); + return new[] { v.x, v.y, v.z, v.w }; + } + case ShaderPropertyType.Float: + case ShaderPropertyType.Range: + return material.GetFloat(propertyName); + case ShaderPropertyType.Int: + return material.GetInteger(propertyName); + case ShaderPropertyType.Texture: + { + var tex = material.GetTexture(propertyName); + // A re-usable handle for the assigned texture, or null when no texture is bound. + var handle = ObjectResolver.Describe(tex); + return handle == null ? null : new { texture = handle }; + } + default: + return null; + } + } + + /// + /// Apply a JSON value to a single shader property on the material, converting by the shader's + /// declared property type. Throws when the supplied + /// JSON shape does not match the property's type (so the caller can record it in + /// unknown[] with a reason). Texture refs are resolved via + /// and confined to the authoring root; an out-of-root or unresolved ref throws + /// (a hard failure — never silently dropped). + /// + public static void ApplyValue(Material material, string propertyName, ShaderPropertyType type, JToken value) + { + switch (type) + { + case ShaderPropertyType.Float: + material.SetFloat(propertyName, ToFloat(propertyName, "Float", value)); + break; + + case ShaderPropertyType.Range: + material.SetFloat(propertyName, ToFloat(propertyName, "Range", value)); + break; + + case ShaderPropertyType.Int: + // Unity 6: Material.SetInteger is the typed setter for an Int shader property. + material.SetInteger(propertyName, ToInt(propertyName, value)); + break; + + case ShaderPropertyType.Color: + material.SetColor(propertyName, ToColor(propertyName, value)); + break; + + case ShaderPropertyType.Vector: + material.SetVector(propertyName, ToVector4(propertyName, value)); + break; + + case ShaderPropertyType.Texture: + material.SetTexture(propertyName, ToTexture(propertyName, value)); + break; + + default: + throw new MaterialPropertyTypeMismatch( + $"{propertyName}: unsupported shader property type '{type}'."); + } + } + + private static float ToFloat(string property, string typeLabel, JToken value) + { + if (value == null || value.Type == JTokenType.Null) + throw new MaterialPropertyTypeMismatch($"{property}: expected {typeLabel}, got null."); + if (value.Type != JTokenType.Integer && value.Type != JTokenType.Float) + throw new MaterialPropertyTypeMismatch( + $"{property}: expected {typeLabel} (a number), got {Describe(value)}."); + return value.ToObject(); + } + + private static int ToInt(string property, JToken value) + { + if (value == null || value.Type == JTokenType.Null) + throw new MaterialPropertyTypeMismatch($"{property}: expected Int, got null."); + if (value.Type != JTokenType.Integer && value.Type != JTokenType.Float) + throw new MaterialPropertyTypeMismatch( + $"{property}: expected Int (a number), got {Describe(value)}."); + // Reject fractional JSON numbers (e.g. 1.5) rather than silently rounding/truncating. + // An Int shader property must receive a whole number. + var asDouble = value.ToObject(); + if (asDouble != Math.Truncate(asDouble)) + throw new MaterialPropertyTypeMismatch( + $"{property}: expected Int (a whole number), got the non-integer value {value}."); + return value.ToObject(); + } + + /// + /// Parse a Color from either [r,g,b,a] (3 or 4 floats) or a hex string + /// ("#RRGGBB" / "#RRGGBBAA", leading '#' optional). Default alpha is 1.0. + /// + private static Color ToColor(string property, JToken value) + { + if (value is JArray arr) + { + if (arr.Count != 3 && arr.Count != 4) + throw new MaterialPropertyTypeMismatch( + $"{property}: expected Color as [r,g,b,a] (or [r,g,b]), got an array of length {arr.Count}."); + // Route each component through ToFloat so non-numeric/null elements surface as a clean + // MaterialPropertyTypeMismatch rather than throwing and failing the whole command. + float r = ToFloat(property, "Color", arr[0]); + float g = ToFloat(property, "Color", arr[1]); + float b = ToFloat(property, "Color", arr[2]); + float a = arr.Count == 4 ? ToFloat(property, "Color", arr[3]) : 1f; + return new Color(r, g, b, a); + } + + if (value != null && value.Type == JTokenType.String) + { + if (TryParseHexColor(value.ToObject(), out var color)) + return color; + throw new MaterialPropertyTypeMismatch( + $"{property}: expected Color as [r,g,b,a] or a '#RRGGBB'/'#RRGGBBAA' hex string, got '{value}'."); + } + + throw new MaterialPropertyTypeMismatch( + $"{property}: expected Color as [r,g,b,a] or a hex string, got {Describe(value)}."); + } + + private static Vector4 ToVector4(string property, JToken value) + { + if (!(value is JArray arr)) + throw new MaterialPropertyTypeMismatch( + $"{property}: expected Vector as [x,y,z,w], got {Describe(value)}."); + if (arr.Count == 0 || arr.Count > 4) + throw new MaterialPropertyTypeMismatch( + $"{property}: expected Vector as [x,y,z,w] (1–4 numbers), got an array of length {arr.Count}."); + + // Missing trailing components default to 0 (matches Unity's Vector4 component default), + // so [x,y,z] and [x,y] are accepted as shorthand for a 4-component vector. + // Route each present component through ToFloat so non-numeric/null elements surface as a + // clean MaterialPropertyTypeMismatch rather than throwing and failing the whole command. + float x = arr.Count > 0 ? ToFloat(property, "Vector", arr[0]) : 0f; + float y = arr.Count > 1 ? ToFloat(property, "Vector", arr[1]) : 0f; + float z = arr.Count > 2 ? ToFloat(property, "Vector", arr[2]) : 0f; + float w = arr.Count > 3 ? ToFloat(property, "Vector", arr[3]) : 0f; + return new Vector4(x, y, z, w); + } + + /// + /// Resolve a texture property value: an explicit null clears it, otherwise the value must + /// be an that resolves to a confined to the + /// authoring root. A non-texture object, an out-of-root asset, or an unresolved handle is a hard + /// failure (never silently dropped). + /// + private static Texture ToTexture(string property, JToken value) + { + if (value == null || value.Type == JTokenType.Null) + return null; + + // ReadValue returns textures as { "texture": } so a get->set round-trip works. + // Accept both that wrapper form and a bare ObjectRef supplied directly by the caller. + JToken refToken = value; + if (value is JObject wrapper && wrapper.ContainsKey("texture")) + refToken = wrapper["texture"]; + + ObjectRef handle; + try + { + handle = refToken.ToObject(); + } + catch (Exception) + { + throw new MaterialPropertyTypeMismatch( + $"{property}: expected Texture as an object reference {{guid/path/...}} or null, got {Describe(value)}."); + } + + if (handle == null || handle.IsEmpty) + throw new MaterialPropertyTypeMismatch( + $"{property}: expected Texture as an object reference {{guid/path/...}} or null, got {Describe(value)}."); + + if (!ObjectResolver.TryResolve(handle, out var obj, out var error)) + throw new ArgumentException($"{property}: could not resolve texture reference: {error}"); + + if (!(obj is Texture texture)) + throw new MaterialPropertyTypeMismatch( + $"{property}: expected Texture, got a {obj.GetType().Name}."); + + // Confine to the authoring root: a GUID/globalId/path handle must bind a texture that lives + // on disk under the sandbox. An in-memory/scene Texture has an empty asset path; allowing it + // would bypass the root confinement, so reject any ref that doesn't resolve to a persisted + // asset. Mirrors AssetCommands.ResolveAssetPath's confinement. + var assetPath = AssetDatabase.GetAssetPath(texture); + if (string.IsNullOrEmpty(assetPath)) + throw new ArgumentException( + $"{property}: texture reference does not resolve to an on-disk asset under the authoring root '{ProjectPaths.AuthoringRoot}'; in-memory or scene textures are not allowed."); + + var confined = ProjectPaths.Resolve(assetPath, out var confineError); + if (confined == null) + throw new ArgumentException( + $"{property}: texture '{assetPath}' is outside the authoring root '{ProjectPaths.AuthoringRoot}': {confineError}"); + + return texture; + } + + /// + /// Parse a hex color string ("#RRGGBB", "#RRGGBBAA", or without the leading '#'). Returns false + /// for any malformed input. Channels are 0–255 mapped to 0–1; default alpha is 1.0. + /// + public static bool TryParseHexColor(string hex, out Color color) + { + color = Color.white; + if (string.IsNullOrWhiteSpace(hex)) + return false; + + var s = hex.Trim(); + if (s.StartsWith("#", StringComparison.Ordinal)) + s = s.Substring(1); + + if (s.Length != 6 && s.Length != 8) + return false; + + if (!byte.TryParse(s.Substring(0, 2), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out var r) || + !byte.TryParse(s.Substring(2, 2), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out var g) || + !byte.TryParse(s.Substring(4, 2), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out var b)) + return false; + + byte a = 255; + if (s.Length == 8 && + !byte.TryParse(s.Substring(6, 2), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out a)) + return false; + + color = new Color(r / 255f, g / 255f, b / 255f, a / 255f); + return true; + } + + /// Map a to the public type label used in results. + public static string TypeLabel(ShaderPropertyType type) + { + switch (type) + { + case ShaderPropertyType.Color: return "Color"; + case ShaderPropertyType.Vector: return "Vector"; + case ShaderPropertyType.Float: return "Float"; + case ShaderPropertyType.Range: return "Range"; + case ShaderPropertyType.Texture: return "TexEnv"; + case ShaderPropertyType.Int: return "Int"; + default: return type.ToString(); + } + } + + private static string Describe(JToken value) + { + if (value == null) + return "null"; + switch (value.Type) + { + case JTokenType.Array: return "array"; + case JTokenType.Object: return "object"; + case JTokenType.Null: return "null"; + default: return value.Type.ToString().ToLowerInvariant(); + } + } + } + + /// + /// Thrown when a supplied value's JSON shape does not match the shader property's declared type. + /// The command catches this and records the property in unknown[] with the message as the + /// reason, rather than failing the whole call. + /// + internal sealed class MaterialPropertyTypeMismatch : Exception + { + public MaterialPropertyTypeMismatch(string message) : base(message) { } + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Materials/MaterialValueConverter.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Materials/MaterialValueConverter.cs.meta new file mode 100644 index 00000000..4445fb6a --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Materials/MaterialValueConverter.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: fc8956be3c264ccb8096787d7146f330 diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Materials/ShaderCommands.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Materials/ShaderCommands.cs new file mode 100644 index 00000000..0f37c7d5 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Materials/ShaderCommands.cs @@ -0,0 +1,186 @@ +using System; +using System.Collections.Generic; +using Unity.Pipeline.Commands; +using Unity.Pipeline.Editor.Authoring; +using Unity.Pipeline.Models; +using UnityEditor; +using UnityEngine; +using UnityEngine.Rendering; + +namespace Unity.Pipeline.Editor.Commands.Materials +{ + /// + /// Shader discovery / introspection commands (CLI-213): list_shaders so an agent can pick a + /// valid shader name, and get_shader_properties so it knows a shader's settable property + /// names / types / ranges / texture dimensions / flags before authoring a material. + /// + /// Property introspection uses instance APIs exclusively: + /// GetPropertyCount, GetPropertyName, GetPropertyType, + /// GetPropertyDescription, GetPropertyRangeLimits, + /// GetPropertyTextureDimension, and GetPropertyFlags. The reported type set is + /// : Color, Vector, Float, Range, Texture, Int. + /// + public static class ShaderCommands + { + [CliCommand("list_shaders", + "Discover available shaders so an agent can pick a valid name for set_material_properties / create_asset. Returns [{ name, assetPath|null, isBuiltin, isSupported }].")] + public static List ListShaders( + [CliArg("filter", "Case-insensitive substring matched against the shader name (e.g. \"URP\", \"Lit\").")] string filter = null, + [CliArg("includeBuiltin", "Include built-in/engine shaders (those with no project asset path). Default true.")] bool includeBuiltin = true, + [CliArg("limit", "Maximum number of shaders to return (default 200).")] int limit = 200) + { + if (limit <= 0) + limit = 200; + + var results = new List(); + var seen = new HashSet(StringComparer.Ordinal); + + // AssetDatabase.FindAssets("t:Shader") enumerates project + package shaders (each with an + // asset path); ShaderUtil.GetAllShaderInfo() additionally surfaces built-in engine shaders + // that have no asset path (e.g. "Standard", "Sprites/Default"). Merge both, dedup by name. + foreach (var guid in AssetDatabase.FindAssets("t:Shader")) + { + var path = AssetDatabase.GUIDToAssetPath(guid); + if (string.IsNullOrEmpty(path)) + continue; + var shader = AssetDatabase.LoadAssetAtPath(path); + if (shader == null) + continue; + + if (!seen.Add(shader.name)) + continue; + + if (!PassesFilter(shader.name, filter)) + continue; + + results.Add(new ShaderInfo + { + Name = shader.name, + AssetPath = path, + IsBuiltin = false, + IsSupported = shader.isSupported, + }); + + if (results.Count >= limit) + return results; + } + + if (includeBuiltin) + { + // GetAllShaderInfo() enumerates every shader the editor knows about, including built-in + // engine shaders that have no project/package asset path. Any name NOT already added by + // the FindAssets("t:Shader") pass above is a built-in (assetPath null). `info.supported` + // already reflects Shader::IsSupported(), so we don't re-run Shader.Find per entry. + foreach (var info in ShaderUtil.GetAllShaderInfo()) + { + if (!seen.Add(info.name)) + continue; + + if (!PassesFilter(info.name, filter)) + continue; + + results.Add(new ShaderInfo + { + Name = info.name, + AssetPath = null, + IsBuiltin = true, + IsSupported = info.supported, + }); + + if (results.Count >= limit) + break; + } + } + + return results; + } + + [CliCommand("get_shader_properties", + "Introspect a shader's declared property list (name, description, type Color|Vector|Float|Range|TexEnv|Int, range, textureDimension, flags). Provide 'shader' (by name) OR 'material' (read the shader off that material).")] + public static ShaderPropertiesResult GetShaderProperties( + [CliArg("shader", "Shader name (e.g. \"Universal Render Pipeline/Lit\"). Provide this OR 'material'.")] string shader = null, + [CliArg("material", "Reference to a material to read the shader from instead of naming it. Provide this OR 'shader'.")] ObjectRef material = null) + { + Shader resolved; + + if (!string.IsNullOrWhiteSpace(shader)) + { + resolved = Shader.Find(shader); + if (resolved == null) + throw new ShaderNotFoundException( + $"Shader '{shader}' not found. Shader.Find only resolves shaders that are compiled/included in the build (or referenced by a material/scene). Use list_shaders to discover valid names."); + } + else if (material != null && !material.IsEmpty) + { + var mat = MaterialCommands.ResolveMaterial(material, out _); + resolved = mat.shader; + if (resolved == null) + throw new ArgumentException($"Material '{material}' has no shader assigned."); + } + else + { + throw new ArgumentException("Provide either 'shader' (a shader name) or 'material' (a material reference)."); + } + + var result = new ShaderPropertiesResult { Shader = resolved.name }; + + int count = resolved.GetPropertyCount(); + for (int i = 0; i < count; i++) + { + var propType = resolved.GetPropertyType(i); + var entry = new ShaderPropertyInfo + { + Name = resolved.GetPropertyName(i), + Description = resolved.GetPropertyDescription(i), + Type = MaterialValueConverter.TypeLabel(propType), + Flags = DescribeFlags(resolved.GetPropertyFlags(i)), + }; + + if (propType == ShaderPropertyType.Range) + { + var limits = resolved.GetPropertyRangeLimits(i); + entry.Range = new MaterialRange + { + Min = limits.x, + Max = limits.y, + }; + } + + if (propType == ShaderPropertyType.Texture) + entry.TextureDimension = resolved.GetPropertyTextureDimension(i).ToString(); + + result.Properties.Add(entry); + } + + return result; + } + + private static bool PassesFilter(string name, string filter) + { + if (string.IsNullOrWhiteSpace(filter)) + return true; + return name.IndexOf(filter, StringComparison.OrdinalIgnoreCase) >= 0; + } + + /// + /// Decompose a bitmask into its individual flag names (the + /// enum is a [Flags] type). None is reported as an empty list rather than ["None"]. + /// + private static List DescribeFlags(ShaderPropertyFlags flags) + { + var list = new List(); + if (flags == ShaderPropertyFlags.None) + return list; + + foreach (ShaderPropertyFlags flag in Enum.GetValues(typeof(ShaderPropertyFlags))) + { + if (flag == ShaderPropertyFlags.None) + continue; + if ((flags & flag) == flag) + list.Add(flag.ToString()); + } + + return list; + } + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Materials/ShaderCommands.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Materials/ShaderCommands.cs.meta new file mode 100644 index 00000000..0c5e23bb --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Materials/ShaderCommands.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 1007e4472d7b4216a6a866f8aaba76c7 diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/MenuItemCommand.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/MenuItemCommand.cs new file mode 100644 index 00000000..704872ea --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/MenuItemCommand.cs @@ -0,0 +1,243 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using Newtonsoft.Json; +using Unity.Pipeline.Commands; +using UnityEditor; + +namespace Unity.Pipeline.Editor.Commands +{ + /// + /// Executes an Editor menu item by its path (e.g. "Assets/Reimport All"), or — when called with + /// no path — lists the available menu items. Backs the unity menu CLI command (CLI-110): + /// unity menu lists options, unity menu "<path>" executes one. The CLI only + /// forwards the request; all logic lives here, per the two-commands design. + /// + /// Named MenuItemCommand (not MenuCommand) to avoid colliding with the built-in + /// type, which would make unqualified references ambiguous + /// in any file that also imports UnityEditor. + /// + /// Execution wraps , which returns false + /// when the item could not be invoked — either because the path does not exist or because the + /// item is currently disabled (its validation function returned false). The API does not + /// distinguish those cases, so a failure is reported as "not found or disabled"; the CLI maps a + /// failed result to its "menu item does not exist" exit code. + /// + /// Listing reflects the actual Editor menu via the internal + /// UnityEditor.Menu.GetMenuItems API (accessed by reflection, mirroring + /// ). Unlike scanning [MenuItem] attributes, this also + /// covers menus Unity defines natively (much of GameObject/…, Assets/Create/…, + /// File/…, etc.), which carry no attribute and would otherwise be missed. + /// + /// Note: some menu items are heavy, show a modal confirmation, or trigger a domain reload/quit + /// (which tears the server down before it can reply). That is the nature of the invoked item; + /// such cases are a known limitation of driving arbitrary menus over a request/response call. + /// + public static class MenuItemCommand + { + [CliCommand("menu", "Execute an Editor menu item by path, or list available items when no path is given", MainThreadRequired = true)] + public static MenuResponse ExecuteMenu( + [CliArg("path", "Menu item path to execute, e.g. \"Assets/Reimport All\". Omit to list available menu items.")] string path = "") + { + // No path → discovery mode: return the available menu items instead of executing. + if (string.IsNullOrWhiteSpace(path)) + { + List items; + try + { + items = DiscoverMenuItems(); + } + catch (Exception ex) + { + return MenuResponse.Fail(null, $"Failed to list menu items: {ex.Message}"); + } + + return new MenuResponse + { + Success = true, + Items = items, + Message = $"{items.Count} menu item(s) available." + }; + } + + bool executed; + try + { + executed = EditorApplication.ExecuteMenuItem(path); + } + catch (Exception ex) + { + return MenuResponse.Fail(path, $"Failed to execute menu item '{path}': {ex.Message}"); + } + + if (!executed) + return MenuResponse.Fail(path, $"Menu item '{path}' was not found or is currently disabled."); + + return new MenuResponse + { + Success = true, + Path = path, + Message = $"Executed menu item '{path}'" + }; + } + + const BindingFlags k_All = BindingFlags.Static | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic; + + // Reflection handles for the internal UnityEditor.Menu.GetMenuItems(string, bool, bool) API, + // which returns an array of internal UnityEditor.ScriptingMenuItem. Resolved once and cached; + // we read each item's `path` and `isSeparator` member (property or field, depending on the + // Unity version). See FocusEditorCommand for the same reflect-into-internal-API approach. + static MethodInfo s_GetMenuItems; + static Func s_GetPath; + static Func s_GetIsSeparator; + static bool s_Resolved; + + static void EnsureReflection() + { + if (s_Resolved) + return; + s_Resolved = true; + + var editorAsm = typeof(EditorApplication).Assembly; + + var menuType = editorAsm.GetType("UnityEditor.Menu"); + s_GetMenuItems = menuType?.GetMethod( + "GetMenuItems", k_All, null, new[] { typeof(string), typeof(bool), typeof(bool) }, null); + + var itemType = editorAsm.GetType("UnityEditor.ScriptingMenuItem"); + s_GetPath = BuildAccessor(itemType, "path", "m_Path"); + s_GetIsSeparator = BuildAccessor(itemType, "isSeparator", "m_IsSeparator"); + } + + /// + /// Build a getter for a member that may be exposed as a property or a backing field, so the + /// reflection survives the internal type's shape changing across Unity versions. + /// + static Func BuildAccessor(Type type, string propertyName, string fieldName) + { + var prop = type?.GetProperty(propertyName, k_All); + if (prop != null) + return o => (T)prop.GetValue(o); + + var field = type?.GetField(propertyName, k_All) ?? type?.GetField(fieldName, k_All); + if (field != null) + return o => (T)field.GetValue(o); + + return null; + } + + // Standard top-level Editor menus. Unity defines these natively (no [MenuItem]), so they are + // not discoverable from attributes; we seed them so their native children are enumerated. + static readonly string[] k_NativeRoots = + { + "File", "Edit", "Assets", "GameObject", "Component", "Window", "Help" + }; + + /// + /// Collect the distinct menu paths from the live Editor menu. Menu.GetMenuItems returns + /// the full (recursive) set of items under a given root — including ones Unity defines + /// natively — but it does not enumerate the roots themselves, and no internal API does. So we + /// union the native roots above with the first path segment of every [MenuItem] (which + /// surfaces custom/package roots), then expand each root through the internal API. The items + /// always come from the live menu, so native entries are included. + /// + static List DiscoverMenuItems() + { + EnsureReflection(); + + if (s_GetMenuItems == null || s_GetPath == null) + throw new InvalidOperationException( + "UnityEditor.Menu.GetMenuItems is unavailable in this Unity version."); + + var paths = new SortedSet(StringComparer.Ordinal); + foreach (var root in CollectRoots()) + CollectItemsUnder(root, paths); + + return paths.ToList(); + } + + /// + /// The top-level menu names to expand: the native roots, plus the first segment of every + /// attributed menu item (covering custom/package menus). Component context menus + /// (CONTEXT/…) are excluded, as they are not part of the main menu bar. + /// + static IEnumerable CollectRoots() + { + var roots = new SortedSet(StringComparer.Ordinal); + foreach (var r in k_NativeRoots) + roots.Add(r); + + foreach (var method in TypeCache.GetMethodsWithAttribute()) + { + foreach (var attr in method.GetCustomAttributes(typeof(MenuItem), false).Cast()) + { + if (attr.validate || string.IsNullOrEmpty(attr.menuItem)) + continue; + + var slash = attr.menuItem.IndexOf('/'); + var root = slash > 0 ? attr.menuItem.Substring(0, slash) : attr.menuItem; + if (root.StartsWith("CONTEXT", StringComparison.Ordinal)) + continue; + + roots.Add(root); + } + } + + return roots; + } + + /// + /// Append every non-separator menu path under to + /// . A root that isn't present in this Editor simply contributes + /// nothing (the API returns an empty array). + /// + static void CollectItemsUnder(string root, SortedSet paths) + { + if (!(s_GetMenuItems.Invoke(null, new object[] { root, false, false }) is Array items)) + return; + + foreach (var item in items) + { + if (item == null) + continue; + if (s_GetIsSeparator != null && s_GetIsSeparator(item)) + continue; + + var path = s_GetPath(item); + if (string.IsNullOrEmpty(path)) + continue; + + paths.Add(path); + } + } + } + + /// + /// Result of the menu command. On execution, false means the item + /// could not be invoked (not found or disabled). In list mode, holds the + /// available menu paths. + /// + [Serializable] + public class MenuResponse + { + [JsonProperty("success")] + public bool Success { get; set; } + + [JsonProperty("path")] + public string Path { get; set; } + + [JsonProperty("items")] + public List Items { get; set; } + + [JsonProperty("message")] + public string Message { get; set; } + + public static MenuResponse Fail(string path, string message) => new MenuResponse + { + Success = false, + Path = path, + Message = message + }; + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/MenuItemCommand.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/MenuItemCommand.cs.meta new file mode 100644 index 00000000..92571afd --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/MenuItemCommand.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: f48719fc11d44809a97c890b8317c0d7 diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Navigation.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Navigation.meta new file mode 100644 index 00000000..2dcfd0de --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Navigation.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 31cd60e0286e77f4cb5baaaa7a3d6377 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Navigation/NavigationCommands.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Navigation/NavigationCommands.cs new file mode 100644 index 00000000..b917ab9f --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Navigation/NavigationCommands.cs @@ -0,0 +1,303 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Newtonsoft.Json; +using Unity.Pipeline.Commands; +using Unity.Pipeline.Editor.Authoring; +using Unity.Pipeline.Models; +using UnityEditor; +using UnityEditor.Search; +using UnityEngine; +using Object = UnityEngine.Object; + +namespace Unity.Pipeline.Editor.Commands.Navigation +{ + /// + /// Navigation and targeting commands (CLI-200): read and drive the Editor selection, and run + /// Unity Search queries — both returning the canonical object + /// identity (via ) so an agent can reference results in a + /// follow-up call. All commands are read-only or non-destructive (set_selection only changes the + /// Editor selection, which carries no undo/safety policy), and run on the main thread. + /// + public static class NavigationCommands + { + private const int MaxSearchResults = 200; + + [CliCommand("get_selection", "Read the current Editor selection as structured object identities.")] + public static SelectionResult GetSelection() + { + return DescribeSelection(null); + } + + /// + /// Set the Editor selection from instance ids and/or asset paths. + /// + /// We accept simple / rather than full + /// [] handles because nested-object parameter schemas (arrays of objects) + /// are pending CAT-2508. Once that lands this can take an [] and route + /// each through for the full handle surface. + /// + /// + [CliCommand("set_selection", "Set the Editor selection to the given assets/scene objects.")] + public static SelectionResult SetSelection( + [CliArg("instance_ids", "Scene/loaded object instance IDs to select.")] ObjectId[] instanceIds = null, + [CliArg("paths", "Asset paths to select (e.g. Assets/Foo.prefab).")] string[] paths = null) + { + var resolved = new List(); + var unresolved = new List(); + + if (instanceIds != null) + { + foreach (var id in instanceIds) + { + var obj = PipelineUtils.IdToObject(id); + if (obj != null) + resolved.Add(obj); + else + unresolved.Add($"instanceId:{id}"); + } + } + + if (paths != null) + { + foreach (var path in paths) + { + var obj = string.IsNullOrEmpty(path) ? null : AssetDatabase.LoadMainAssetAtPath(path); + if (obj != null) + resolved.Add(obj); + else if (path == null) + unresolved.Add(""); + else if (path.Length == 0) + unresolved.Add(""); + else + unresolved.Add(path); + } + } + + var hadInputs = (instanceIds != null && instanceIds.Length > 0) || + (paths != null && paths.Length > 0); + + // Inputs were given but none resolved: that's a hard error, not a silent clear. + if (resolved.Count == 0 && hadInputs) + throw new ArgumentException($"No objects resolved from the given inputs. Unresolved: {string.Join(", ", unresolved)}"); + + // No inputs at all is a valid request to clear the selection. + var objects = resolved.ToArray(); + Selection.objects = objects; + Selection.activeObject = resolved.FirstOrDefault(); + + return DescribeSelection(unresolved.ToArray()); + } + + [CliCommand("search", "Run a Unity Search query and return structured results.")] + public static SearchResult Search( + [CliArg("query", "Unity Search query string, e.g. 't:Material', 'p: my asset', 'h: Main Camera'.", Required = true)] string query, + [CliArg("limit", "Max results to return (capped 200).")] int limit = 50) + { + if (string.IsNullOrEmpty(query)) + throw new ArgumentException("query must be a non-empty Unity Search query string."); + + var clamped = Mathf.Clamp(limit, 0, MaxSearchResults); + + // A non-positive limit can't return any rows; skip the potentially expensive request. + if (clamped <= 0) + { + return new SearchResult + { + Query = query, + Count = 0, + Results = Array.Empty() + }; + } + + var results = new List(); + + ISearchList list = null; + try + { + // Synchronous request returns the items already resolved on the main thread. + list = SearchService.Request(query, SearchFlags.Synchronous); + + foreach (var item in list) + { + if (results.Count >= clamped) + break; + if (item == null) + continue; + + // One malformed item must not fail the whole call. + try + { + results.Add(MapItem(item)); + } + catch + { + // skip the unmappable item + } + } + } + catch (Exception ex) + { + throw new InvalidOperationException($"Unity Search query '{query}' failed: {ex.Message}", ex); + } + finally + { + // The Synchronous Request overload returns an ISearchList that owns a SearchContext; + // dispose it when present so we don't leak the context. + (list as IDisposable)?.Dispose(); + } + + return new SearchResult + { + Query = query, + Count = results.Count, + Results = results.ToArray() + }; + } + + private static SearchResultItem MapItem(SearchItem item) + { + string label; + try + { + label = item.GetLabel(item.context, true); + } + catch + { + label = null; + } + + if (string.IsNullOrEmpty(label)) + label = item.label ?? item.id; + + string description = null; + try + { + description = item.GetDescription(item.context, true); + } + catch + { + // leave description null + } + + string path = null; + try + { + var obj = item.ToObject(); + if (obj != null) + { + var assetPath = AssetDatabase.GetAssetPath(obj); + if (!string.IsNullOrEmpty(assetPath)) + path = assetPath; + } + } + catch + { + // leave path null + } + + return new SearchResultItem + { + Id = item.id, + Label = label, + Description = description, + Provider = item.provider?.id, + Path = path + }; + } + + /// + /// Snapshot the current as canonical identities, optionally tagging on + /// the list from a set_selection call. + /// + private static SelectionResult DescribeSelection(string[] unresolved) + { + var objects = Selection.objects ?? Array.Empty(); + var described = objects + .Select(ObjectResolver.Describe) + .Where(r => r != null) + .ToArray(); + + return new SelectionResult + { + Count = described.Length, + Active = ObjectResolver.Describe(Selection.activeObject), + Objects = described, + Unresolved = unresolved + }; + } + } + + /// + /// Structured snapshot of the Editor selection: the active object plus every selected object, + /// each as a canonical identity. is only + /// populated by set_selection (inputs that did not resolve to a loaded object/asset). + /// + [Serializable] + public class SelectionResult + { + /// Number of selected objects (excludes nulls). + [JsonProperty("count")] + public int Count { get; set; } + + /// The active selection object, or null when the selection is empty. + [JsonProperty("active")] + public AuthoringResult Active { get; set; } + + /// Every selected object as a canonical identity (nulls skipped). + [JsonProperty("objects")] + public AuthoringResult[] Objects { get; set; } + + /// Inputs that did not resolve (set_selection only); null for get_selection. + [JsonProperty("unresolved")] + public string[] Unresolved { get; set; } + } + + /// + /// Structured result of a Unity Search query: the echoed query, the returned count, and the + /// mapped rows (capped at the requested limit). + /// + [Serializable] + public class SearchResult + { + /// The query that was executed (echoed back). + [JsonProperty("query")] + public string Query { get; set; } + + /// Number of results returned (after the limit cap). + [JsonProperty("count")] + public int Count { get; set; } + + /// The mapped search result rows. + [JsonProperty("results")] + public SearchResultItem[] Results { get; set; } + } + + /// + /// One Unity Search result, flattened to portable fields. is populated only + /// when the item resolves to an asset object. + /// + [Serializable] + public class SearchResultItem + { + /// Provider-specific item id (e.g. an asset path or scene object id). + [JsonProperty("id")] + public string Id { get; set; } + + /// Display label for the item. + [JsonProperty("label")] + public string Label { get; set; } + + /// Longer description, when the provider supplies one (may be null). + [JsonProperty("description")] + public string Description { get; set; } + + /// Id of the search provider that produced this item (e.g. "asset", "scene"). + [JsonProperty("provider")] + public string Provider { get; set; } + + /// Project-relative asset path, when the item resolves to an asset (else null). + [JsonProperty("path")] + public string Path { get; set; } + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Navigation/NavigationCommands.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Navigation/NavigationCommands.cs.meta new file mode 100644 index 00000000..353e826e --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Navigation/NavigationCommands.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a16797feca5bc694cac48b892634bb7a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Observability.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Observability.meta new file mode 100644 index 00000000..e92c7b42 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Observability.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7a7cc3922a14b4741a17d985bb6be540 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Observability/ConsoleCommands.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Observability/ConsoleCommands.cs new file mode 100644 index 00000000..510fe76b --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Observability/ConsoleCommands.cs @@ -0,0 +1,89 @@ +using System; +using System.Collections.Generic; +using System.Reflection; +using Unity.Pipeline.Commands; + +namespace Unity.Pipeline.Editor.Commands.Observability +{ + /// + /// Read-only observability commands over the captured Editor console (CLI-198). Logs are captured + /// continuously by ; these commands let an agent read them back as + /// structured data and clear the buffer (and the Unity console) between runs. + /// + public static class ConsoleCommands + { + [CliCommand("get_console_logs", "Read recently captured Editor console logs (structured).")] + public static object GetConsoleLogs( + [CliArg("severity", "Filter: all | log | warning | error. 'all' = every entry; 'log' = Log only; 'warning' = Warning only; 'error' = Error/Exception/Assert only.")] string severity = "all", + [CliArg("limit", "Max entries to return (most-recent first), capped at 1000.")] int limit = 100) + { + // Snapshot is oldest-first; filter by tier, then take the most-recent `limit` entries + // and present them newest-first. + var snapshot = ConsoleLogBuffer.Snapshot(); + var filtered = new List(snapshot.Count); + foreach (var entry in snapshot) + { + if (MatchesSeverity(entry.Type, severity)) + filtered.Add(entry); + } + + var clampedLimit = Math.Min(Math.Max(limit, 1), ConsoleLogBuffer.MaxEntries); + + var logs = new List(Math.Min(clampedLimit, filtered.Count)); + for (var i = filtered.Count - 1; i >= 0 && logs.Count < clampedLimit; i--) + logs.Add(filtered[i]); + + return new + { + total = filtered.Count, + returned = logs.Count, + logs + }; + } + + [CliCommand("clear_console", "Clear the captured log buffer and the Unity Editor console.")] + public static object ClearConsole() + { + ConsoleLogBuffer.Clear(); + + // Best-effort: also clear Unity's own console window. UnityEditor.LogEntries is internal, + // so reach it via reflection and swallow any failure (API is not part of the public contract). + // LogEntries.Clear is a static, non-public method, so include NonPublic in the binding flags — + // GetMethod("Clear") with no flags only finds public methods and would silently return null. + try + { + Type.GetType("UnityEditor.LogEntries,UnityEditor") + ?.GetMethod("Clear", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static) + ?.Invoke(null, null); + } + catch + { + // Ignore — clearing the Editor console is auxiliary; the buffer is already cleared. + } + + return new { cleared = true }; + } + + /// + /// Map a Unity name onto the requested severity tier. + /// The tiers are distinct: "all" matches every entry; "log" matches Log only; + /// "warning" matches Warning only; "error" matches Error/Exception/Assert only. + /// Any unknown value falls back to "all" (matches everything). + /// + private static bool MatchesSeverity(string type, string severity) + { + switch (severity?.ToLowerInvariant()) + { + case "log": + return type == "Log"; + case "warning": + return type == "Warning"; + case "error": + return type == "Error" || type == "Exception" || type == "Assert"; + case "all": + default: + return true; + } + } + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Observability/ConsoleCommands.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Observability/ConsoleCommands.cs.meta new file mode 100644 index 00000000..9b739831 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Observability/ConsoleCommands.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b7dd929510db8d248b64b05361bfabb6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Observability/ConsoleLogBuffer.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Observability/ConsoleLogBuffer.cs new file mode 100644 index 00000000..62fe5adc --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Observability/ConsoleLogBuffer.cs @@ -0,0 +1,113 @@ +using System; +using System.Collections.Generic; +using Newtonsoft.Json; +using UnityEditor; +using UnityEngine; + +namespace Unity.Pipeline.Editor.Commands.Observability +{ + /// + /// A single captured Editor console entry. Returned (most-recent-first) by the + /// get_console_logs command so an agent can read structured log output without scraping + /// the Editor UI. Mirrors the fields Unity surfaces on . + /// + [Serializable] + public class ConsoleLogEntryDto + { + /// Unity name, e.g. "Log", "Warning", "Error", "Exception", "Assert". + [JsonProperty("type")] + public string Type { get; set; } + + /// The logged message text. + [JsonProperty("message")] + public string Message { get; set; } + + /// Captured stack trace, if Unity provided one for the entry. + [JsonProperty("stackTrace")] + public string StackTrace { get; set; } + + /// Capture time in UTC, ISO-8601 round-trip ("o") format. + [JsonProperty("timestampUtc")] + public string TimestampUtc { get; set; } + } + + /// + /// Captures Editor console output into a bounded, thread-safe ring buffer so it can be read back + /// structurally over the pipeline (CLI-198). Subscribes to + /// on load — the threaded variant is used + /// because Unity may raise log callbacks off the main thread, and the handler is fully lock-guarded. + /// + /// The buffer holds at most entries; the oldest is dropped when full. + /// + public static class ConsoleLogBuffer + { + /// Maximum number of entries retained; oldest entries are dropped past this. + public const int MaxEntries = 1000; + + private static readonly object m_Lock = new object(); + private static readonly Queue m_Entries = new Queue(MaxEntries); + + /// + /// Subscribe to Unity's threaded log callback as soon as the Editor domain loads, so capture + /// is live before any command runs. Idempotent across domain reloads (handler is removed + /// first to avoid double-subscription if Init somehow runs twice). + /// + [InitializeOnLoadMethod] + private static void Init() + { + Application.logMessageReceivedThreaded -= OnLogMessageThreaded; + Application.logMessageReceivedThreaded += OnLogMessageThreaded; + } + + private static void OnLogMessageThreaded(string condition, string stackTrace, LogType type) + { + var entry = new ConsoleLogEntryDto + { + Type = type.ToString(), + Message = condition, + StackTrace = stackTrace, + TimestampUtc = DateTime.UtcNow.ToString("o") + }; + + lock (m_Lock) + { + if (m_Entries.Count >= MaxEntries) + m_Entries.Dequeue(); + m_Entries.Enqueue(entry); + } + } + + /// + /// Take a point-in-time copy of the buffer in chronological (oldest-first) order. The copy is + /// detached from the live buffer, so callers can filter/reverse it without holding the lock. + /// + public static IReadOnlyList Snapshot() + { + lock (m_Lock) + { + return new List(m_Entries); + } + } + + /// Number of entries currently retained in the buffer. + public static int Count + { + get + { + lock (m_Lock) + { + return m_Entries.Count; + } + } + } + + /// Drop all captured entries. + public static void Clear() + { + lock (m_Lock) + { + m_Entries.Clear(); + } + } + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Observability/ConsoleLogBuffer.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Observability/ConsoleLogBuffer.cs.meta new file mode 100644 index 00000000..d77e6a52 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Observability/ConsoleLogBuffer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d212c06f2c819e04c892f7e41520f975 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Observability/PerformanceCommands.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Observability/PerformanceCommands.cs new file mode 100644 index 00000000..12ab002d --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Observability/PerformanceCommands.cs @@ -0,0 +1,171 @@ +using System; +using Newtonsoft.Json; +using Unity.Pipeline.Commands; +using UnityEditor; +using UnityEngine; +using UnityEngine.Profiling; + +namespace Unity.Pipeline.Editor.Commands.Observability +{ + /// + /// Render statistics for the most recently rendered Editor frame, read from + /// . These reflect the last frame the Editor drew (Game/Scene view), not + /// an averaged measurement — treat them as a snapshot. + /// + [Serializable] + public class RenderStats + { + /// Draw calls issued for the last rendered frame. + [JsonProperty("drawCalls")] + public int DrawCalls { get; set; } + + /// Total batches (dynamic + static + instanced) for the last rendered frame. + [JsonProperty("batches")] + public int Batches { get; set; } + + /// SetPass calls (shader pass switches) for the last rendered frame. + [JsonProperty("setPassCalls")] + public int SetPassCalls { get; set; } + + /// Triangles submitted for the last rendered frame. + [JsonProperty("triangles")] + public int Triangles { get; set; } + + /// Vertices submitted for the last rendered frame. + [JsonProperty("vertices")] + public int Vertices { get; set; } + } + + /// + /// Process memory usage read from . Values are in bytes and are always + /// available at runtime regardless of whether the Profiler window is open. + /// + [Serializable] + public class MemoryStats + { + /// Total memory currently allocated by Unity (bytes). + [JsonProperty("totalAllocatedBytes")] + public long TotalAllocatedBytes { get; set; } + + /// Total memory reserved by Unity (bytes). + [JsonProperty("totalReservedBytes")] + public long TotalReservedBytes { get; set; } + + /// Mono managed heap memory in use (bytes). + [JsonProperty("monoUsedBytes")] + public long MonoUsedBytes { get; set; } + + /// Mono managed heap size reserved (bytes). + [JsonProperty("monoHeapBytes")] + public long MonoHeapBytes { get; set; } + } + + /// + /// Latest CPU/GPU frame timing from . The Frame Timing Manager + /// must have a timing captured for to be true; when unavailable the + /// timing fields are left at zero. + /// + [Serializable] + public class FrameTimingStats + { + /// True when a frame timing was captured and the milliseconds fields are meaningful. + [JsonProperty("available")] + public bool Available { get; set; } + + /// Total CPU frame time in milliseconds. + [JsonProperty("cpuFrameTimeMs")] + public double CpuFrameTimeMs { get; set; } + + /// Total GPU frame time in milliseconds. + [JsonProperty("gpuFrameTimeMs")] + public double GpuFrameTimeMs { get; set; } + + /// CPU main-thread frame time in milliseconds. + [JsonProperty("cpuMainThreadFrameTimeMs")] + public double CpuMainThreadFrameTimeMs { get; set; } + } + + /// + /// Composite performance snapshot returned by get_performance_stats: render counters, + /// process memory, and the latest frame timing. + /// + [Serializable] + public class PerformanceStats + { + /// Render counters for the last rendered Editor frame. + [JsonProperty("render")] + public RenderStats Render { get; set; } + + /// Process memory usage at capture time. + [JsonProperty("memory")] + public MemoryStats Memory { get; set; } + + /// Latest CPU/GPU frame timing, if one was captured. + [JsonProperty("frameTiming")] + public FrameTimingStats FrameTiming { get; set; } + } + + /// + /// Read-only telemetry command (CLI-198) that snapshots render, memory, and frame-timing stats so + /// an agent can reason about Editor performance without opening the Profiler or Stats overlay. + /// + public static class PerformanceCommands + { + [CliCommand("get_performance_stats", "Read render, memory, and frame-timing stats (structured, read-only).")] + public static PerformanceStats GetPerformanceStats() + { + return new PerformanceStats + { + Render = new RenderStats + { + // UnityStats reflects the last frame rendered by the Editor (Game/Scene view). + DrawCalls = UnityStats.drawCalls, + Batches = UnityStats.dynamicBatches + UnityStats.staticBatches + UnityStats.instancedBatches, + SetPassCalls = UnityStats.setPassCalls, + Triangles = UnityStats.triangles, + Vertices = UnityStats.vertices + }, + Memory = new MemoryStats + { + TotalAllocatedBytes = Profiler.GetTotalAllocatedMemoryLong(), + TotalReservedBytes = Profiler.GetTotalReservedMemoryLong(), + MonoUsedBytes = Profiler.GetMonoUsedSizeLong(), + MonoHeapBytes = Profiler.GetMonoHeapSizeLong() + }, + FrameTiming = CaptureFrameTiming() + }; + } + + /// + /// Capture the latest CPU/GPU frame timing. The Frame Timing Manager only yields data once a + /// timing has been captured (and platform support exists), so any failure or empty result is + /// reported as = false rather than throwing. + /// + private static FrameTimingStats CaptureFrameTiming() + { + try + { + FrameTimingManager.CaptureFrameTimings(); + + var timings = new FrameTiming[1]; + uint received = FrameTimingManager.GetLatestTimings(1, timings); + if (received > 0) + { + return new FrameTimingStats + { + Available = true, + CpuFrameTimeMs = timings[0].cpuFrameTime, + GpuFrameTimeMs = timings[0].gpuFrameTime, + CpuMainThreadFrameTimeMs = timings[0].cpuMainThreadFrameTime + }; + } + } + catch + { + // Frame timing is platform-dependent and may be unsupported; report as unavailable. + } + + return new FrameTimingStats { Available = false }; + } + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Observability/PerformanceCommands.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Observability/PerformanceCommands.cs.meta new file mode 100644 index 00000000..1a6dec82 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Observability/PerformanceCommands.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ae9262a38e20733409c3a084cb810bdc +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/PackageManager.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/PackageManager.meta new file mode 100644 index 00000000..c9a1dc1a --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/PackageManager.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: fdbdf731f3ad41fca20634ebcf5f4d7e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: \ No newline at end of file diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/PackageManager/PackageIdentifier.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/PackageManager/PackageIdentifier.cs new file mode 100644 index 00000000..7e325713 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/PackageManager/PackageIdentifier.cs @@ -0,0 +1,161 @@ +using System; + +namespace Unity.Pipeline.Editor.Commands.PackageManager +{ + /// Where an added package comes from, derived from its identifier string (CLI-203). + public enum PackageSourceKind + { + /// Could not be classified (e.g. empty input). + Unknown, + + /// A registry package name, optionally pinned: com.unity.foo or com.unity.foo@1.2.3. + Registry, + + /// A git URL: https://…​.git, git+…, ssh://…, git@host:…, optionally #revision. + Git, + + /// A local package reference: file:../RelativePath or file:/abs/path. + Local + } + + /// A parsed UPM package_add identifier — the normalized string handed to + /// Client.Add plus the pieces extracted for plan/audit text. + public sealed class ParsedPackageId + { + /// How the package will be resolved by UPM. + public PackageSourceKind Kind { get; set; } + + /// The identifier passed verbatim to UnityEditor.PackageManager.Client.Add. + public string Identifier { get; set; } + + /// Registry package name (Registry only); null otherwise. + public string Name { get; set; } + + /// Registry version or git revision when given; null otherwise. + public string Version { get; set; } + + /// Human-readable summary for plan/audit text. + public string Description { get; set; } + } + + /// + /// Pure, editor-independent classification of a package_add identifier into a registry name, + /// git URL, or local path (CLI-203). Kept free of any Unity API so the add-path's input handling is + /// unit-testable without a live editor; the command layer feeds the result to + /// UnityEditor.PackageManager.Client.Add. + /// + public static class PackageIdentifier + { + /// Classify an identifier without parsing out its parts. + public static PackageSourceKind Classify(string identifier) + { + if (string.IsNullOrWhiteSpace(identifier)) + return PackageSourceKind.Unknown; + + var id = identifier.Trim(); + + if (StartsWith(id, "file:")) + return PackageSourceKind.Local; + + // Explicit git forms and any URL scheme (UPM treats http(s) identifiers as git URLs). + if (StartsWith(id, "git+") || StartsWith(id, "ssh://") || id.StartsWith("git@", StringComparison.Ordinal)) + return PackageSourceKind.Git; + if (StartsWith(id, "http://") || StartsWith(id, "https://") || id.Contains("://")) + return PackageSourceKind.Git; + + // A bare "owner/repo.git" (no scheme) is still a git reference. Strip an optional + // "#revision" before testing the suffix. + var core = id; + var hash = core.IndexOf('#'); + if (hash >= 0) + core = core.Substring(0, hash); + if (core.EndsWith(".git", StringComparison.OrdinalIgnoreCase)) + return PackageSourceKind.Git; + + return PackageSourceKind.Registry; + } + + /// + /// Classify and split . Returns false with + /// set for empty/unclassifiable input. + /// + public static bool TryParse(string identifier, out ParsedPackageId parsed, out string error) + { + parsed = null; + error = null; + + if (string.IsNullOrWhiteSpace(identifier)) + { + error = "Package identifier is empty. Provide a name (com.unity.foo[@version]), a git URL, or a file: path."; + return false; + } + + var id = identifier.Trim(); + switch (Classify(id)) + { + case PackageSourceKind.Local: + parsed = new ParsedPackageId + { + Kind = PackageSourceKind.Local, + Identifier = id, + Description = $"local package '{id}'" + }; + return true; + + case PackageSourceKind.Git: + { + string revision = null; + var hash = id.IndexOf('#'); + if (hash >= 0 && hash < id.Length - 1) + revision = id.Substring(hash + 1); + parsed = new ParsedPackageId + { + Kind = PackageSourceKind.Git, + Identifier = id, + Version = revision, + Description = revision != null ? $"git package '{id}' @ {revision}" : $"git package '{id}'" + }; + return true; + } + + case PackageSourceKind.Registry: + { + var name = id; + string version = null; + + // Split on the version separator '@'. Use the last '@' so npm-scoped names + // ("@scope/pkg@1.0.0") still split on the version, not the leading scope marker. + var at = id.LastIndexOf('@'); + if (at > 0) + { + name = id.Substring(0, at); + version = id.Substring(at + 1); + } + + if (string.IsNullOrWhiteSpace(name)) + { + error = $"Package name is empty in '{identifier}'."; + return false; + } + + parsed = new ParsedPackageId + { + Kind = PackageSourceKind.Registry, + Identifier = id, + Name = name, + Version = version, + Description = version != null ? $"'{name}' @ {version}" : $"'{name}' (latest compatible)" + }; + return true; + } + + default: + error = $"Could not classify package identifier '{identifier}'."; + return false; + } + } + + private static bool StartsWith(string value, string prefix) => + value.StartsWith(prefix, StringComparison.OrdinalIgnoreCase); + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/PackageManager/PackageIdentifier.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/PackageManager/PackageIdentifier.cs.meta new file mode 100644 index 00000000..2e8ec865 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/PackageManager/PackageIdentifier.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b95405e8a4f04c93acbdd564a74f8cc2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/PackageManager/PackageManagerCommand.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/PackageManager/PackageManagerCommand.cs new file mode 100644 index 00000000..edd3a131 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/PackageManager/PackageManagerCommand.cs @@ -0,0 +1,644 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Threading; +using Newtonsoft.Json; +using Unity.Pipeline.Commands; +using UnityEditor; +using UnityEditor.PackageManager; +using UnityEditor.PackageManager.Requests; +using UnityEngine; +using PackageInfo = UnityEditor.PackageManager.PackageInfo; + +namespace Unity.Pipeline.Editor.Commands.PackageManager +{ + /// + /// UPM package management over the Client API (CLI-203): list / search / add / remove / resolve. + /// + /// Threading: UPM operations are asynchronous (the only + /// progresses while the editor ticks) and their members are main-thread only. Commands that wait on a + /// request therefore run off the main thread (MainThreadRequired = false) and marshal every + /// UPM touch back onto the main thread via the server dispatcher (), so they + /// can block without freezing the editor. + /// + /// Command surface: + /// - package_list (installed scope) reads the resolved set inline; available/all + /// and package_search query the registry and wait for it — all return synchronously. + /// - package_add/package_remove mutate the manifest and trigger a domain reload + /// that tears down the in-flight request and the HTTP connection. They are dual-mode: + /// + /// async (default) — kick the op off, return in_progress immediately, and let + /// an poller finalize a Temp status file. Poll + /// package_status until completed/failed, then recompile_status. This + /// keeps the (single-request) server responsive and survives the reload. + /// synchronous (wait=true) — block until the request completes and return the + /// full result. The result is captured in one main-thread hop the moment the request completes + /// (before the compile-triggered reload). Reliable for add; for remove the reload can fire fast + /// enough to drop the reply — the status file still settles, so package_status confirms it. + /// + /// Both write the status file, so a lost reply (or a reload mid-wait) is recoverable via + /// package_status; settles an in_progress + /// file on the next load. + /// - package_resolve records its status too, so package_status validates it. + /// + /// Mutating commands (add / remove) follow the shared confirm/dry_run convention. + /// UPM operations are not part of Unity's Undo. + /// + [InitializeOnLoad] + public static class PackageManagerCommand + { + const string StatusFile = "Temp/pipeline_package_status.json"; + + // Bound on a synchronous wait, kept under the CLI's default request timeout so a stuck operation + // surfaces as a clean error rather than a dropped connection. + const int WaitTimeoutSeconds = 25; + const int PollIntervalMs = 50; + + static readonly object s_Lock = new object(); + + // The in-flight mutating request (add/remove) and how to project its result. s_InProgress is a + // plain flag (read off-thread by IsBusy) so the busy check never touches main-thread-only Request + // members. Both are reset by a domain reload; RecoverInterruptedOperation settles the status file. + static volatile bool s_InProgress; + static Request s_Request; + static string s_Operation; + static string s_Argument; + static Func s_ReadPackage; + + static PackageManagerCommand() + { + RecoverInterruptedOperation(); + } + + // ---- List / search (synchronous) ------------------------------------------------------- + + [CliCommand("package_list", + "List packages by scope: installed (default) | available (registry) | all (both). Returns the full " + + "result synchronously — available/all block until the registry query completes.", + MainThreadRequired = false)] + public static object PackageList( + [CliArg("scope", "Which packages to list: installed (default) | available | all.")] string scope = "installed", + [CliArg("include_indirect", "Include indirect (transitive) installed dependencies (applies to scope=installed/all).")] + bool includeIndirect = true, + [CliArg("offline", "For available/all: query the local cache instead of the registry.")] bool offline = false) + { + switch ((scope ?? "installed").Trim().ToLowerInvariant()) + { + case "installed": + return RunOnMain(() => ListInstalled(includeIndirect)); + case "available": + return ListFromRegistry("available", includeIndirect, offline); + case "all": + return ListFromRegistry("all", includeIndirect, offline); + default: + return new PackageListResponse + { + Success = false, + Scope = scope, + Message = $"Unknown scope '{scope}'. Use installed | available | all." + }; + } + } + + /// + /// Installed scope: reflects the resolved + /// set without a registry round-trip. Runs on the main thread (via ). + /// + static PackageListResponse ListInstalled(bool includeIndirect) + { + var summaries = new List(); + foreach (var p in PackageInfo.GetAllRegisteredPackages()) + { + if (includeIndirect || p.isDirectDependency) + summaries.Add(Map(p, isInstalled: true)); + } + + return new PackageListResponse + { + Success = true, + Scope = "installed", + Count = summaries.Count, + Packages = summaries, + Manifest = SafeReadManifest(), + Message = $"{summaries.Count} installed package(s)." + }; + } + + /// + /// available / all scope: these need the registry, so a Client.SearchAll request is + /// started on the main thread and awaited here (on the command's background thread). For + /// all, the installed set is merged in (and marked) so callers see one unified list. + /// + static object ListFromRegistry(string scope, bool includeIndirect, bool offline) + { + var request = RunOnMain(() => Client.SearchAll(offline)); + + if (!WaitForCompletion(request, out var waitError)) + return new PackageListResponse { Success = false, Scope = scope, Message = waitError }; + + return RunOnMain(() => + { + if (request.Status != StatusCode.Success) + return new PackageListResponse + { + Success = false, + Scope = scope, + Message = $"Registry query failed: {request.Error?.message ?? "unknown error"}" + }; + + var packages = BuildScopedList(scope, request.Result, includeIndirect); + return new PackageListResponse + { + Success = true, + Scope = scope, + Count = packages.Count, + Packages = packages, + Manifest = SafeReadManifest(), + Message = $"{packages.Count} package(s)." + }; + }); + } + + /// + /// Combine the registry search result with the installed set per : + /// available returns every registry package (flagged whether it is installed); + /// all returns installed packages (resolved info) plus the registry packages that are + /// not installed. + /// + static List BuildScopedList(string scope, PackageInfo[] available, bool includeIndirect) + { + var installed = new Dictionary(); + foreach (var p in PackageInfo.GetAllRegisteredPackages()) + installed[p.name] = p; + + var result = new List(); + + if (scope == "available") + { + foreach (var p in available ?? Array.Empty()) + result.Add(Map(p, isInstalled: installed.ContainsKey(p.name))); + return result; + } + + // scope == "all": installed entries first (with their resolved info), then registry-only ones. + var seen = new HashSet(); + foreach (var entry in installed.Values) + { + if (!includeIndirect && !entry.isDirectDependency) + continue; + result.Add(Map(entry, isInstalled: true)); + seen.Add(entry.name); + } + foreach (var p in available ?? Array.Empty()) + { + if (!seen.Contains(p.name)) + result.Add(Map(p, isInstalled: false)); + } + return result; + } + + [CliCommand("package_search", + "Search packages available in the registry. Provide a name (e.g. com.unity.foo) or omit to list all. " + + "Returns the full result synchronously (blocks until the registry query completes).", + MainThreadRequired = false)] + public static object PackageSearch( + [CliArg("query", "Package name to search for. Omit/empty to list all available packages.")] string query = "", + [CliArg("offline", "Search the local cache only.")] bool offline = false) + { + var trimmed = (query ?? string.Empty).Trim(); + + var request = RunOnMain(() => string.IsNullOrEmpty(trimmed) + ? Client.SearchAll(offline) + : Client.Search(trimmed, offline)); + + if (!WaitForCompletion(request, out var waitError)) + return new PackageSearchResponse { Success = false, Query = trimmed, Message = waitError }; + + return RunOnMain(() => + { + if (request.Status != StatusCode.Success) + return new PackageSearchResponse + { + Success = false, + Query = trimmed, + Message = $"Search failed: {request.Error?.message ?? "unknown error"}" + }; + + var packages = MapMarkingInstalled(request.Result); + return new PackageSearchResponse + { + Success = true, + Query = trimmed, + Count = packages.Count, + Packages = packages, + Message = $"{packages.Count} package(s)." + }; + }); + } + + // ---- Mutating operations (dual-mode, CAT-2509 gated) ----------------------------------- + + [CliCommand("package_add", + "Add a UPM package by name@version, git URL, or 'file:' local path. Async by default (returns " + + "in_progress; poll package_status); pass wait=true to block until added. A recompile/domain reload " + + "follows — poll recompile_status. Requires confirm=true; use dry_run to preview.", + MainThreadRequired = false)] + public static object PackageAdd( + [CliArg("identifier", "Package to add: 'com.unity.foo@1.2.3', a git URL, or 'file:../Path'.", Required = true)] string identifier = "", + [CliArg("confirm", "Apply the change. Without it the call is refused.")] bool confirm = false, + [CliArg("dry_run", "Preview the change without applying it.")] bool dryRun = false, + [CliArg("wait", "Block until the operation completes and return the result (synchronous). Default: return immediately and poll package_status.")] bool wait = false) + { + if (!PackageIdentifier.TryParse(identifier, out var parsed, out var parseError)) + return PackageMutationResponse.Failed("add", identifier, parseError); + + if (IsBusy()) + return PackageMutationResponse.Busy("add"); + + return ExecuteMutation( + operation: "add", + commandName: "package_add", + argument: parsed.Identifier, + planText: $"Add package {parsed.Description} [{parsed.Kind}]", + confirm: confirm, + dryRun: dryRun, + wait: wait, + start: () => Client.Add(parsed.Identifier), + readPackage: req => + { + var added = (req as AddRequest)?.Result; + return added != null ? Map(added, isInstalled: true) : null; + }); + } + + [CliCommand("package_remove", + "Remove a UPM package by name. Async by default (returns in_progress; poll package_status); pass " + + "wait=true to block until removed. A recompile/domain reload follows — poll recompile_status. " + + "Requires confirm=true; use dry_run to preview.", + MainThreadRequired = false)] + public static object PackageRemove( + [CliArg("name", "Package name to remove (e.g. com.unity.foo).", Required = true)] string name = "", + [CliArg("confirm", "Apply the change. Without it the call is refused.")] bool confirm = false, + [CliArg("dry_run", "Preview the change without applying it.")] bool dryRun = false, + [CliArg("wait", "Block until the operation completes and return the result (synchronous). Default: return immediately and poll package_status.")] bool wait = false) + { + if (string.IsNullOrWhiteSpace(name)) + return PackageMutationResponse.Failed("remove", name, "A package name is required."); + + var packageName = name.Trim(); + + if (IsBusy()) + return PackageMutationResponse.Busy("remove"); + + return ExecuteMutation( + operation: "remove", + commandName: "package_remove", + argument: packageName, + planText: $"Remove package '{packageName}'", + confirm: confirm, + dryRun: dryRun, + wait: wait, + start: () => Client.Remove(packageName), + readPackage: null); + } + + [CliCommand("package_resolve", + "Resolve/refresh packages from the manifest (re-fetch and re-link). May trigger a recompile/domain " + + "reload — poll recompile_status. Its outcome is recorded for package_status.", + MainThreadRequired = true)] + public static object PackageResolve() + { + WriteStatus(new PackageStatus + { + Status = "in_progress", + Operation = "resolve", + StartedAt = NowIso(), + Message = "Resolving packages..." + }); + + try + { + // Client.Resolve() is fire-and-forget (returns void) and schedules a resolve on a later + // tick, so the response flushes before any reload — no request to wait on. + Client.Resolve(); + } + catch (Exception ex) + { + var failed = new PackageStatus + { + Status = "failed", + Operation = "resolve", + Success = false, + Error = ex.Message, + Manifest = SafeReadManifest(), + CompletedAt = NowIso(), + Message = $"Resolve failed: {ex.Message}" + }; + WriteStatus(failed); + return PackageMutationResponse.Failed("resolve", null, failed.Error); + } + + var done = new PackageStatus + { + Status = "completed", + Operation = "resolve", + Success = true, + RequiresRecompile = true, + Manifest = SafeReadManifest(), + CompletedAt = NowIso(), + Message = "Resolve requested. If assemblies changed, a domain reload follows — poll recompile_status." + }; + WriteStatus(done); + return ToMutationResponse(done, plan: null); + } + + // ---- Status ---------------------------------------------------------------------------- + + [CliCommand("package_status", + "Status of the last async package operation (add/remove/resolve): idle | in_progress | completed | " + + "failed, with the added package, manifest, and any error.", + MainThreadRequired = false)] + public static string GetPackageStatus() + { + if (File.Exists(StatusFile)) + return File.ReadAllText(StatusFile); + return "{\"status\":\"idle\"}"; + } + + // ---- Mutation execution ---------------------------------------------------------------- + + /// + /// Gate (confirm / dry-run) and kick off the mutating op, then + /// either return in_progress (async, default) or block until completion (). + /// Either way the operation is tracked and a status file is written, so the result is recoverable + /// via package_status even if the domain reload severs a synchronous reply. + /// + static object ExecuteMutation( + string operation, string commandName, string argument, string planText, + bool confirm, bool dryRun, bool wait, + Func start, Func readPackage) + { + if (dryRun) + return PackageMutationResponse.DryRunPreview(operation, argument, planText, $"Dry run — {planText}"); + if (!confirm) + return PackageMutationResponse.Rejected(operation, argument, + "Refused: this changes project packages. Re-run with confirm=true to apply, or dry_run=true to preview."); + + // UPM operations are not part of Unity's Undo system, so there is no undo scope here. + var request = RunOnMain(() => + { + var r = start(); + // async mode finalizes via the update-loop poller; sync mode finalizes itself. + BeginTracking(operation, argument, r, readPackage, subscribePoll: !wait); + return r; + }); + + if (request == null) + return PackageMutationResponse.Failed(operation, argument, "Operation was confirmed but failed to start."); + + if (!wait) + return PackageMutationResponse.InProgress(operation, argument, planText); + + // Synchronous: poll until complete, capturing status + result atomically on the main thread + // (a reload can only fire between ticks, so the snapshot can't be interleaved). + var deadline = DateTime.UtcNow.AddSeconds(WaitTimeoutSeconds); + while (true) + { + var status = RunOnMain(TryFinalize); + if (status != null) + return ToMutationResponse(status, planText); + + if (DateTime.UtcNow > deadline) + { + // Hand off to the update-loop poller so package_status still settles after we bail. + RunOnMain(() => { SubscribePoll(); return null; }); + return PackageMutationResponse.Failed(operation, argument, + $"Timed out after {WaitTimeoutSeconds}s; the operation may still be in progress — poll package_status."); + } + + Thread.Sleep(PollIntervalMs); + } + } + + /// Record the in-flight op, write the in_progress status, and (async only) start polling. + static void BeginTracking(string operation, string argument, Request request, + Func readPackage, bool subscribePoll) + { + lock (s_Lock) + { + s_Request = request; + s_Operation = operation; + s_Argument = argument; + s_ReadPackage = readPackage; + s_InProgress = true; + } + + WriteStatus(new PackageStatus + { + Status = "in_progress", + Operation = operation, + Argument = argument, + StartedAt = NowIso(), + Message = $"{operation} in progress. Poll package_status." + }); + + if (subscribePoll) + SubscribePoll(); + } + + static void SubscribePoll() + { + EditorApplication.update -= Poll; + EditorApplication.update += Poll; + } + + /// Update-loop poller for async mode (and a timed-out sync wait): finalize when done. + static void Poll() => TryFinalize(); + + /// + /// If the tracked request has completed, write its final status, clear tracking, and return the + /// status; otherwise return null. Main-thread only (reads Request members); guarded so the sync + /// waiter and the update-loop poller can't double-finalize. + /// + static PackageStatus TryFinalize() + { + lock (s_Lock) + { + var request = s_Request; + if (request == null) + { + EditorApplication.update -= Poll; + return null; + } + if (!request.IsCompleted) + return null; + + var status = BuildStatus(s_Operation, s_Argument, request, s_ReadPackage); + WriteStatus(status); + + s_Request = null; + s_Operation = null; + s_Argument = null; + s_ReadPackage = null; + s_InProgress = false; + EditorApplication.update -= Poll; + return status; + } + } + + static PackageStatus BuildStatus(string operation, string argument, Request request, + Func readPackage) + { + var status = new PackageStatus + { + Operation = operation, + Argument = argument, + CompletedAt = NowIso(), + Manifest = SafeReadManifest() + }; + + if (request.Status == StatusCode.Success) + { + status.Status = "completed"; + status.Success = true; + status.RequiresRecompile = true; + try { status.Package = readPackage?.Invoke(request); } + catch (Exception ex) { Debug.LogWarning($"[pipeline] package result projection failed: {ex.Message}"); } + status.Message = $"{operation} completed."; + } + else + { + status.Status = "failed"; + status.Success = false; + status.Error = request.Error?.message ?? "Unknown package manager error."; + status.Message = $"{operation} failed: {status.Error}"; + } + + return status; + } + + static PackageMutationResponse ToMutationResponse(PackageStatus s, string plan) => new PackageMutationResponse + { + Success = s.Success, + Operation = s.Operation, + Argument = s.Argument, + Status = s.Status, + Applied = s.Success, + Plan = plan, + Package = s.Package, + Manifest = s.Manifest, + RequiresRecompile = s.RequiresRecompile, + Message = s.Message + }; + + /// + /// On load, settle a status file left at "in_progress" by a domain reload (the expected outcome of + /// a successful add/remove). The manifest change that triggered the reload has taken effect, so + /// the op is recorded completed; the follow-on recompile is observed via recompile_status. + /// + static void RecoverInterruptedOperation() + { + try + { + if (!File.Exists(StatusFile)) + return; + + var status = JsonConvert.DeserializeObject(File.ReadAllText(StatusFile)); + if (status == null || status.Status != "in_progress") + return; + + status.Status = "completed"; + status.Success = true; + status.RequiresRecompile = true; + status.CompletedAt = NowIso(); + status.Manifest = SafeReadManifest(); + status.Message = $"{status.Operation} completed (domain reload). Manifest updated; poll recompile_status for the recompile."; + WriteStatus(status); + } + catch (Exception ex) + { + Debug.LogWarning($"[pipeline] package status recovery failed: {ex.Message}"); + } + } + + // ---- Helpers --------------------------------------------------------------------------- + + static bool IsBusy() => s_InProgress; + + /// + /// Block until completes, polling its (main-thread-only) state via + /// while this thread sleeps between checks. Returns false with + /// set on timeout. Used by the read-only registry queries. + /// + static bool WaitForCompletion(Request request, out string error) + { + error = null; + var deadline = DateTime.UtcNow.AddSeconds(WaitTimeoutSeconds); + while (!RunOnMain(() => request.IsCompleted)) + { + if (DateTime.UtcNow > deadline) + { + error = $"Timed out after {WaitTimeoutSeconds}s waiting for the package manager."; + return false; + } + Thread.Sleep(PollIntervalMs); + } + return true; + } + + /// + /// Run on the Unity main thread. When invoked off-thread (the normal case + /// for the waiting commands), it marshals through the live server's dispatcher; when already on + /// the main thread (e.g. a direct in-process/test call, or no server running) it runs inline. + /// + static T RunOnMain(Func fn) + { + var dispatcher = PipelineServerStartup.Server?.Dispatcher; + if (dispatcher != null && dispatcher.IsInitialized && !dispatcher.IsMainThread()) + return dispatcher.Invoke(fn); + return fn(); + } + + static Dictionary SafeReadManifest() => + PackageManifest.TryRead(out var deps, out _) ? deps : null; + + static PackageSummary Map(PackageInfo p, bool isInstalled = false) => new PackageSummary + { + Name = p.name, + Version = p.version, + DisplayName = p.displayName, + Source = p.source.ToString(), + ResolvedPath = p.resolvedPath, + IsDirectDependency = p.isDirectDependency, + IsInstalled = isInstalled + }; + + /// Map registry results, flagging which are currently installed. + static List MapMarkingInstalled(IEnumerable packages) + { + var installed = new HashSet(); + foreach (var p in PackageInfo.GetAllRegisteredPackages()) + installed.Add(p.name); + + var list = new List(); + if (packages != null) + foreach (var p in packages) + list.Add(Map(p, installed.Contains(p.name))); + return list; + } + + static string NowIso() => DateTime.UtcNow.ToString("o"); + + static void WriteStatus(PackageStatus status) + { + try + { + File.WriteAllText(StatusFile, JsonConvert.SerializeObject(status)); + } + catch (Exception ex) + { + Debug.LogError($"[Package] Failed to write status file: {ex.Message}"); + } + } + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/PackageManager/PackageManagerCommand.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/PackageManager/PackageManagerCommand.cs.meta new file mode 100644 index 00000000..d322b20c --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/PackageManager/PackageManagerCommand.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 248529bee7274235a46b64bf3f03da11 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/PackageManager/PackageManifest.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/PackageManager/PackageManifest.cs new file mode 100644 index 00000000..76210b1b --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/PackageManager/PackageManifest.cs @@ -0,0 +1,78 @@ +using System; +using System.Collections.Generic; +using System.IO; +using Newtonsoft.Json.Linq; +using UnityEngine; + +namespace Unity.Pipeline.Editor.Commands.PackageManager +{ + /// + /// Reads the project's UPM manifest (Packages/manifest.json) dependencies as a flat + /// name → version map, satisfying CLI-203's "return manifest state". The JSON parsing is split into + /// a pure seam so it is unit-testable without a live project; + /// resolves the project path and is main-thread only (it reads + /// ). + /// + public static class PackageManifest + { + /// Project-relative path to the UPM manifest. + public const string RelativePath = "Packages/manifest.json"; + + /// Absolute path to the manifest for the current project. Main thread only. + public static string ManifestPath + { + get + { + var projectRoot = Path.GetDirectoryName(Application.dataPath); + return Path.Combine(projectRoot, "Packages", "manifest.json"); + } + } + + /// + /// Parse the dependencies object of a manifest.json document into a name → version map. + /// Returns an empty map for null/empty input or a manifest without dependencies. + /// + public static Dictionary ReadDependencies(string manifestJson) + { + var result = new Dictionary(); + if (string.IsNullOrWhiteSpace(manifestJson)) + return result; + + var root = JObject.Parse(manifestJson); + if (root["dependencies"] is JObject deps) + { + foreach (var kv in deps) + result[kv.Key] = kv.Value?.ToString(); + } + + return result; + } + + /// + /// Read the current project's manifest dependencies. Returns false with + /// set when the manifest is missing or unreadable. + /// + public static bool TryRead(out Dictionary dependencies, out string error) + { + dependencies = null; + error = null; + try + { + var path = ManifestPath; + if (!File.Exists(path)) + { + error = $"manifest not found at {path}"; + return false; + } + + dependencies = ReadDependencies(File.ReadAllText(path)); + return true; + } + catch (Exception ex) + { + error = ex.Message; + return false; + } + } + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/PackageManager/PackageManifest.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/PackageManager/PackageManifest.cs.meta new file mode 100644 index 00000000..8608bd45 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/PackageManager/PackageManifest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0401cb232d5143bbb185ac248086a09f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/PackageManager/PackageModels.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/PackageManager/PackageModels.cs new file mode 100644 index 00000000..fbedf315 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/PackageManager/PackageModels.cs @@ -0,0 +1,209 @@ +using System; +using System.Collections.Generic; +using Newtonsoft.Json; + +namespace Unity.Pipeline.Editor.Commands.PackageManager +{ + /// + /// One package in a list/search/add result — a JSON-friendly projection of + /// UnityEditor.PackageManager.PackageInfo (CLI-203). + /// + [Serializable] + public class PackageSummary + { + [JsonProperty("name")] public string Name { get; set; } + [JsonProperty("version")] public string Version { get; set; } + [JsonProperty("displayName")] public string DisplayName { get; set; } + + /// Resolved source: Registry, Embedded, Local, Git, BuiltIn, LocalTarball, Unknown. + [JsonProperty("source")] public string Source { get; set; } + + [JsonProperty("resolvedPath")] public string ResolvedPath { get; set; } + + /// True when the package is a direct manifest dependency (vs. a transitive one). + [JsonProperty("isDirectDependency")] public bool IsDirectDependency { get; set; } + + /// True when the package is currently installed/resolved in the project (vs. only + /// available in the registry). Always true for an installed-scope listing. + [JsonProperty("isInstalled")] public bool IsInstalled { get; set; } + } + + /// + /// Synchronous result of package_list (CLI-203). The command returns the full result in one + /// call for every scope — installed reads the resolved set inline; available/all + /// run a registry query and block until it completes — so listing never uses the trigger-then-poll + /// path that the mutating commands do. + /// + [Serializable] + public class PackageListResponse + { + [JsonProperty("success")] public bool Success { get; set; } + + /// The scope that was listed: installed | available | all. + [JsonProperty("scope")] public string Scope { get; set; } + + [JsonProperty("count")] public int Count { get; set; } + + /// The packages in the requested scope. + [JsonProperty("packages")] public List Packages { get; set; } + + /// Manifest dependencies (name → version). + [JsonProperty("manifest")] public Dictionary Manifest { get; set; } + + [JsonProperty("message")] public string Message { get; set; } + } + + /// + /// Synchronous result of package_search (CLI-203). Like package_list, the registry + /// query is awaited inside the command, so the matches are returned in one call. Each entry carries + /// so callers can tell which results are already installed. + /// + [Serializable] + public class PackageSearchResponse + { + [JsonProperty("success")] public bool Success { get; set; } + + /// The search query (empty when listing all available packages). + [JsonProperty("query")] public string Query { get; set; } + + [JsonProperty("count")] public int Count { get; set; } + + /// The matching packages available in the registry. + [JsonProperty("packages")] public List Packages { get; set; } + + [JsonProperty("message")] public string Message { get; set; } + } + + /// + /// Persisted status of the last async mutating operation (add / remove / resolve), written to a Temp + /// status file that survives the domain reload an add/remove/resolve triggers (CLI-203). Read back + /// verbatim by package_status so a caller can poll an async op — or validate one whose + /// synchronous reply was lost to the reload. + /// + [Serializable] + public class PackageStatus + { + /// idle | in_progress | completed | failed. + [JsonProperty("status")] public string Status { get; set; } + + /// add | remove | resolve. + [JsonProperty("operation")] public string Operation { get; set; } + + /// The operation's subject (identifier/name), when applicable. + [JsonProperty("argument")] public string Argument { get; set; } + + [JsonProperty("success")] public bool Success { get; set; } + + [JsonProperty("error")] public string Error { get; set; } + + [JsonProperty("message")] public string Message { get; set; } + + /// The operation triggers a recompile/domain reload; poll recompile_status. + [JsonProperty("requiresRecompile")] public bool RequiresRecompile { get; set; } + + /// The added package (add only); null for remove/resolve. + [JsonProperty("package")] public PackageSummary Package { get; set; } + + /// Manifest dependencies (name → version) after the operation. + [JsonProperty("manifest")] public Dictionary Manifest { get; set; } + + [JsonProperty("startedAt")] public string StartedAt { get; set; } + [JsonProperty("completedAt")] public string CompletedAt { get; set; } + } + + /// + /// Result of a mutating package command — package_add / package_remove / + /// package_resolve (CLI-203). These are dual-mode: by default the call returns + /// in_progress immediately (poll package_status); with wait=true it blocks and + /// this carries the final completed/failed outcome. It reports the confirm/dry_run + /// gate via / . A successful add/remove + /// leaves a recompile/domain reload in flight () — poll + /// recompile_status to wait for the editor to be ready. + /// + [Serializable] + public class PackageMutationResponse + { + [JsonProperty("success")] public bool Success { get; set; } + + /// add | remove | resolve. + [JsonProperty("operation")] public string Operation { get; set; } + + /// The operation's subject (identifier/name), when applicable. + [JsonProperty("argument")] public string Argument { get; set; } + + /// in_progress | completed | dry_run | rejected | failed | busy. + [JsonProperty("status")] public string Status { get; set; } + + /// True only when the operation actually mutated the project. + [JsonProperty("applied")] public bool Applied { get; set; } + + [JsonProperty("dryRun")] public bool DryRun { get; set; } + + /// Human-readable description of the intended/performed change. + [JsonProperty("plan")] public string Plan { get; set; } + + /// The operation leaves a recompile/domain reload in flight; poll recompile_status. + [JsonProperty("requiresRecompile")] public bool RequiresRecompile { get; set; } + + /// The added package (add only); null for remove/resolve. + [JsonProperty("package")] public PackageSummary Package { get; set; } + + /// Manifest dependencies (name → version) after the operation. + [JsonProperty("manifest")] public Dictionary Manifest { get; set; } + + [JsonProperty("message")] public string Message { get; set; } + + public static PackageMutationResponse InProgress(string operation, string argument, string plan) => + new PackageMutationResponse + { + Success = true, + Operation = operation, + Argument = argument, + Status = "in_progress", + Applied = true, + Plan = plan, + Message = $"{operation} started. Poll package_status until status is 'completed' or 'failed'." + }; + + public static PackageMutationResponse Busy(string operation) => + new PackageMutationResponse + { + Success = false, + Operation = operation, + Status = "busy", + Message = "Another package operation is in progress. Poll package_status, then retry." + }; + + public static PackageMutationResponse DryRunPreview(string operation, string argument, string plan, string message) => + new PackageMutationResponse + { + Success = true, + Operation = operation, + Argument = argument, + Status = "dry_run", + DryRun = true, + Plan = plan, + Message = message + }; + + public static PackageMutationResponse Rejected(string operation, string argument, string message) => + new PackageMutationResponse + { + Success = false, + Operation = operation, + Argument = argument, + Status = "rejected", + Message = message + }; + + public static PackageMutationResponse Failed(string operation, string argument, string message) => + new PackageMutationResponse + { + Success = false, + Operation = operation, + Argument = argument, + Status = "failed", + Message = message + }; + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/PackageManager/PackageModels.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/PackageManager/PackageModels.cs.meta new file mode 100644 index 00000000..01d45bd6 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/PackageManager/PackageModels.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8fa665b51bbb4f2d8543fc02de12c377 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/PlayModeCommands.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/PlayModeCommands.cs new file mode 100644 index 00000000..82dcb4e9 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/PlayModeCommands.cs @@ -0,0 +1,55 @@ +using Unity.Pipeline.Commands; +using UnityEditor; +using UnityEngine; + +namespace Unity.Pipeline.Editor.Commands +{ + /// + /// Commands for controlling Unity Editor play mode state. + /// Enables automation workflows to control Editor play/stop/pause from CLI tools. + /// + public static class PlayModeCommands + { + // TODO Pipeline: should all commands have name with namespace: editor.play build.generate instead of using _ + + [CliCommand("editor_play", "Enter Unity Editor play mode")] + public static string EnterPlayMode() + { + if (EditorApplication.isPlaying) + { + Debug.LogWarning("Editor is already in play mode"); + return "Already in play mode"; + } + + EditorApplication.isPlaying = true; + return "Entered play mode"; + } + + [CliCommand("editor_stop", "Exit Unity Editor play mode")] + public static string ExitPlayMode() + { + if (!EditorApplication.isPlaying) + { + Debug.LogWarning("Editor is already in edit mode"); + return "Already in edit mode"; + } + + EditorApplication.isPlaying = false; + return "Exited play mode"; + } + + [CliCommand("editor_pause", "Pause Unity Editor play mode")] + public static string PausePlayMode() + { + if (!EditorApplication.isPlaying) + { + Debug.LogWarning("Cannot pause - Editor is not in play mode"); + return "Cannot pause - not in play mode"; + } + + EditorApplication.isPaused = !EditorApplication.isPaused; + string state = EditorApplication.isPaused ? "paused" : "unpaused"; + return $"Play mode {state}"; + } + } +} \ No newline at end of file diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/PlayModeCommands.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/PlayModeCommands.cs.meta new file mode 100644 index 00000000..2eecf4be --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/PlayModeCommands.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c86c7028f3fb8f24691d8a3a207f53ff +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Prefabs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Prefabs.meta new file mode 100644 index 00000000..23a327d5 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Prefabs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1e6ed0649e884a59b7403a2f28a87644 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Prefabs/PrefabCommands.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Prefabs/PrefabCommands.cs new file mode 100644 index 00000000..3498a46e --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Prefabs/PrefabCommands.cs @@ -0,0 +1,416 @@ +using System; +using System.IO; +using Unity.Pipeline.Commands; +using Unity.Pipeline.Editor.Authoring; +using Unity.Pipeline.Models; +using UnityEditor; +using UnityEditor.SceneManagement; +using UnityEngine; +using UnityEngine.SceneManagement; +using Object = UnityEngine.Object; + +namespace Unity.Pipeline.Editor.Commands.Prefabs +{ + /// + /// Prefab authoring commands (CLI-194). These cover the prefab lifecycle an agent needs to + /// build content procedurally: saving a configured GameObject as a prefab asset, instantiating + /// it into a scene, deriving a variant, applying/reverting instance overrides, unpacking, and + /// editing prefab contents through the prefab stage. + /// + /// Authoring conventions (CLI-190): + /// - Asset paths flow through so writes are sandboxed to the + /// authoring root and "../" traversal is rejected. + /// - Existing objects are referenced by and resolved with + /// ; results are returned as . + /// - Scene/object mutations (instantiation, override apply/revert, unpack) are wrapped in an + /// so they revert as one Editor undo step. + /// + /// IMPORTANT about undo coverage: prefab ASSET writes (, + /// variant creation, and prefab-stage save) are AssetDatabase operations and are NOT part of + /// Unity's Undo system, so the undo scope only reverts the scene-side effects. This mirrors the + /// note in and . + /// + /// Nested-prefab safety: structural edits to a prefab asset go through the prefab stage + /// ( / / + /// ) rather than mutating the asset root directly, + /// which preserves nested-prefab links instead of flattening them. + /// + public static class PrefabCommands + { + /// + /// Save a source GameObject (typically a scene object) as a prefab asset. The source becomes + /// a connected instance of the new prefab (interactionMode: AutomatedAction). + /// + [CliCommand("create_prefab", "Save a GameObject as a prefab asset at a project path; the source becomes a connected instance.")] + public static AuthoringResult CreatePrefab( + [CliArg("source", "Reference to the source GameObject to save as a prefab (globalId/path/guid/instanceId/hierarchyPath).", Required = true)] ObjectRef source, + [CliArg("path", "Prefab asset path relative to the authoring root (the Assets/ prefix is optional and the .prefab extension is added if missing). e.g. Prefabs/Enemy or Prefabs/Enemy.prefab", Required = true)] string path) + { + var go = ResolveGameObject(source, "source"); + + var assetPath = ResolvePrefabPath(path); + EnsureParentFolder(assetPath); + + GameObject saved; + using (new AuthoringUndoScope("Create Prefab")) + { + // ConnectToInstance leaves the source as an instance of the saved prefab so the agent + // can keep editing it; SaveAsPrefabAsset itself is an AssetDatabase op (not undoable). + saved = PrefabUtility.SaveAsPrefabAssetAndConnect(go, assetPath, InteractionMode.AutomatedAction, out var success); + if (!success || saved == null) + throw new InvalidOperationException($"Failed to save prefab at '{assetPath}'."); + } + + AssetDatabase.SaveAssets(); + var asset = AssetDatabase.LoadAssetAtPath(assetPath); + var result = ObjectResolver.Describe(asset) ?? new AuthoringResult { Type = nameof(GameObject) }; + result.AssetPath = assetPath; + return result; + } + + /// + /// Instantiate a prefab asset into the active (or specified) loaded scene and return the + /// scene instance's identity. + /// + [CliCommand("instantiate_prefab", "Instantiate a prefab asset into a loaded scene and return the created instance.")] + public static AuthoringResult InstantiatePrefab( + [CliArg("prefab", "Reference to the prefab asset to instantiate (path/guid/globalId).", Required = true)] ObjectRef prefab, + [CliArg("scene_path", "Optional path of a loaded scene to instantiate into; defaults to the active scene.")] string scenePath = null, + [CliArg("name", "Optional name for the created instance; defaults to the prefab name.")] string name = null) + { + var prefabAsset = ResolvePrefabAsset(prefab, "prefab"); + + var scene = ResolveTargetScene(scenePath); + if (!scene.IsValid() || !scene.isLoaded) + throw new InvalidOperationException("No valid loaded scene to instantiate into."); + + AuthoringResult result; + using (new AuthoringUndoScope("Instantiate Prefab")) + { + var instance = (GameObject)PrefabUtility.InstantiatePrefab(prefabAsset, scene); + if (instance == null) + throw new InvalidOperationException($"Failed to instantiate prefab '{AssetDatabase.GetAssetPath(prefabAsset)}'."); + + if (!string.IsNullOrEmpty(name)) + instance.name = name; + + Undo.RegisterCreatedObjectUndo(instance, "Instantiate Prefab"); + EditorSceneManager.MarkSceneDirty(scene); + + result = ObjectResolver.Describe(instance) ?? new AuthoringResult { Type = nameof(GameObject) }; + } + + return result; + } + + /// + /// Create a prefab variant asset from a base prefab. The variant inherits the base and can + /// override it. Implemented by instantiating the base, saving the instance as a new prefab + /// asset (which becomes a variant because its root is a base-prefab instance), then removing + /// the temporary scene instance. + /// + [CliCommand("create_prefab_variant", "Create a prefab variant asset that inherits from a base prefab.")] + public static AuthoringResult CreatePrefabVariant( + [CliArg("base", "Reference to the base prefab asset (path/guid/globalId).", Required = true)] ObjectRef basePrefab, + [CliArg("path", "Variant prefab asset path relative to the authoring root (.prefab added if missing).", Required = true)] string path) + { + var basePrefabAsset = ResolvePrefabAsset(basePrefab, "base"); + + var assetPath = ResolvePrefabPath(path); + EnsureParentFolder(assetPath); + + // Author the variant from a throwaway instance of the base (saving an instance of a prefab + // as a new prefab yields a variant). The temporary instance is created in an isolated + // preview scene and the instance + scene are torn down in the finally, so the user's active + // scene is never touched, dirtied, or subjected to object lifecycle callbacks. + var previewScene = EditorSceneManager.NewPreviewScene(); + GameObject instance = null; + GameObject variant; + try + { + instance = (GameObject)PrefabUtility.InstantiatePrefab(basePrefabAsset, previewScene); + if (instance == null) + throw new InvalidOperationException("Failed to instantiate base prefab for variant creation."); + + variant = PrefabUtility.SaveAsPrefabAsset(instance, assetPath, out var success); + if (!success || variant == null) + throw new InvalidOperationException($"Failed to save prefab variant at '{assetPath}'."); + } + finally + { + if (instance != null) + Object.DestroyImmediate(instance); + EditorSceneManager.ClosePreviewScene(previewScene); + } + + AssetDatabase.SaveAssets(); + var asset = AssetDatabase.LoadAssetAtPath(assetPath); + var result = ObjectResolver.Describe(asset) ?? new AuthoringResult { Type = nameof(GameObject) }; + result.AssetPath = assetPath; + return result; + } + + /// + /// Apply a prefab instance's overrides back to its source prefab asset. By default applies + /// the whole instance; the asset is updated on disk. + /// + [CliCommand("apply_prefab_overrides", "Apply a prefab instance's overrides back to its source prefab asset.")] + public static AuthoringResult ApplyPrefabOverrides( + [CliArg("instance", "Reference to a prefab instance GameObject in a scene (instanceId/hierarchyPath/globalId).", Required = true)] ObjectRef instance) + { + var go = ResolveGameObject(instance, "instance"); + var root = PrefabUtility.GetOutermostPrefabInstanceRoot(go); + if (root == null) + throw new ArgumentException($"Object '{instance}' is not part of a prefab instance."); + + var assetPath = PrefabUtility.GetPrefabAssetPathOfNearestInstanceRoot(root); + // Applying overrides writes back to the source prefab asset, so confine it to the + // authoring root and reject instances whose source lives outside the sandbox. + ConfineToAuthoringRoot(assetPath, "instance's source prefab asset"); + + using (new AuthoringUndoScope("Apply Prefab Overrides")) + { + Undo.RegisterFullObjectHierarchyUndo(root, "Apply Prefab Overrides"); + PrefabUtility.ApplyPrefabInstance(root, InteractionMode.AutomatedAction); + EditorSceneManager.MarkSceneDirty(root.scene); + } + + AssetDatabase.SaveAssets(); + + var asset = AssetDatabase.LoadAssetAtPath(assetPath); + var result = ObjectResolver.Describe(asset) ?? new AuthoringResult { Type = nameof(GameObject) }; + if (!string.IsNullOrEmpty(assetPath)) + result.AssetPath = assetPath; + return result; + } + + /// + /// Revert a prefab instance's overrides, restoring it to match its source prefab asset. + /// + [CliCommand("revert_prefab_overrides", "Revert a prefab instance's overrides so it matches its source prefab asset.")] + public static AuthoringResult RevertPrefabOverrides( + [CliArg("instance", "Reference to a prefab instance GameObject in a scene (instanceId/hierarchyPath/globalId).", Required = true)] ObjectRef instance) + { + var go = ResolveGameObject(instance, "instance"); + var root = PrefabUtility.GetOutermostPrefabInstanceRoot(go); + if (root == null) + throw new ArgumentException($"Object '{instance}' is not part of a prefab instance."); + + using (new AuthoringUndoScope("Revert Prefab Overrides")) + { + Undo.RegisterFullObjectHierarchyUndo(root, "Revert Prefab Overrides"); + PrefabUtility.RevertPrefabInstance(root, InteractionMode.AutomatedAction); + EditorSceneManager.MarkSceneDirty(root.scene); + } + + var result = ObjectResolver.Describe(root) ?? new AuthoringResult { Type = nameof(GameObject) }; + return result; + } + + /// + /// Unpack a prefab instance, turning it (and optionally its nested instances) back into plain + /// GameObjects. chooses between + /// (one level) and + /// (all nested levels). + /// + [CliCommand("unpack_prefab", "Unpack a prefab instance into plain GameObjects (outermost level or completely).")] + public static AuthoringResult UnpackPrefab( + [CliArg("instance", "Reference to a prefab instance GameObject in a scene (instanceId/hierarchyPath/globalId).", Required = true)] ObjectRef instance, + [CliArg("completely", "If true, unpack all nested prefab levels (Completely); if false, only the outermost level (OutermostRoot).", DefaultValue = false)] bool completely = false) + { + var go = ResolveGameObject(instance, "instance"); + var root = PrefabUtility.GetOutermostPrefabInstanceRoot(go); + if (root == null) + throw new ArgumentException($"Object '{instance}' is not part of a prefab instance."); + + var mode = completely ? PrefabUnpackMode.Completely : PrefabUnpackMode.OutermostRoot; + + using (new AuthoringUndoScope("Unpack Prefab")) + { + PrefabUtility.UnpackPrefabInstance(root, mode, InteractionMode.AutomatedAction); + EditorSceneManager.MarkSceneDirty(root.scene); + } + + var result = ObjectResolver.Describe(root) ?? new AuthoringResult { Type = nameof(GameObject) }; + return result; + } + + /// + /// Edit a prefab asset's contents safely through the prefab stage. Loads the prefab into an + /// isolated, editable copy, optionally renames a child or reparents/adds nothing structural by + /// default, then saves and unloads. This is the nested-prefab-safe path: it never mutates the + /// asset root in-place, so nested prefab links are preserved. + /// + /// The MVP supports a small, declarative set of edits expressed as arguments so an agent can + /// drive common changes without an embedded script: + /// - + : toggle a child's activeSelf. + /// - + : rename a child. + /// A no-op call (no edit args) simply round-trips the asset through the stage, which is a useful + /// integrity check that the open/edit/close cycle does not corrupt the asset. + /// + [CliCommand("save_prefab_contents", "Open a prefab asset in an isolated prefab stage, apply a declarative edit, and save it back (nested-prefab safe).")] + public static AuthoringResult SavePrefabContents( + [CliArg("prefab", "Reference to the prefab asset to edit (path/guid/globalId).", Required = true)] ObjectRef prefab, + [CliArg("rename_child", "Optional child name (relative path under the root, e.g. 'Body/Head') to rename.")] string renameChild = null, + [CliArg("new_name", "New name for the child identified by rename_child.")] string newName = null, + [CliArg("set_active_child", "Optional child name (relative path under the root) whose active state to set.")] string setActiveChild = null, + [CliArg("active", "Active state to apply when set_active_child is provided.", DefaultValue = true)] bool active = true) + { + var prefabAsset = ResolvePrefabAsset(prefab, "prefab"); + var assetPath = AssetDatabase.GetAssetPath(prefabAsset); + if (string.IsNullOrEmpty(assetPath)) + throw new ArgumentException($"'{prefab}' does not resolve to a prefab asset on disk."); + // This command writes the prefab asset back to disk, so confine it to the authoring root. + ConfineToAuthoringRoot(assetPath, "prefab asset"); + + // LoadPrefabContents gives an isolated, fully-editable copy of the prefab (with nested + // prefabs intact). All edits happen on this copy; SaveAsPrefabAsset writes it back without + // flattening nested prefabs. Always unload to avoid leaking the temporary scene. + var contentsRoot = PrefabUtility.LoadPrefabContents(assetPath); + try + { + if (!string.IsNullOrEmpty(renameChild)) + { + var child = FindChild(contentsRoot.transform, renameChild); + if (child == null) + throw new ArgumentException($"No child '{renameChild}' under prefab root '{contentsRoot.name}'."); + if (string.IsNullOrEmpty(newName)) + throw new ArgumentException("new_name is required when rename_child is provided."); + child.name = newName; + } + + if (!string.IsNullOrEmpty(setActiveChild)) + { + var child = FindChild(contentsRoot.transform, setActiveChild); + if (child == null) + throw new ArgumentException($"No child '{setActiveChild}' under prefab root '{contentsRoot.name}'."); + child.gameObject.SetActive(active); + } + + PrefabUtility.SaveAsPrefabAsset(contentsRoot, assetPath, out var success); + if (!success) + throw new InvalidOperationException($"Failed to save prefab contents to '{assetPath}'."); + } + finally + { + PrefabUtility.UnloadPrefabContents(contentsRoot); + } + + AssetDatabase.SaveAssets(); + var asset = AssetDatabase.LoadAssetAtPath(assetPath); + var result = ObjectResolver.Describe(asset) ?? new AuthoringResult { Type = nameof(GameObject) }; + result.AssetPath = assetPath; + return result; + } + + #region Helpers + + /// Resolve an to a GameObject (a component ref maps to its GameObject). + private static GameObject ResolveGameObject(ObjectRef handle, string argName) + { + if (!ObjectResolver.TryResolve(handle, out var obj, out var error)) + throw new ArgumentException($"Could not resolve {argName}: {error}"); + + var go = obj as GameObject ?? (obj as Component)?.gameObject; + if (go == null) + throw new ArgumentException($"{argName} '{handle}' does not resolve to a GameObject (got {obj.GetType().Name})."); + return go; + } + + /// Resolve an to a prefab asset GameObject on disk. + private static GameObject ResolvePrefabAsset(ObjectRef handle, string argName) + { + if (!ObjectResolver.TryResolve(handle, out var obj, out var error)) + throw new ArgumentException($"Could not resolve {argName}: {error}"); + + var go = obj as GameObject; + if (go == null) + throw new ArgumentException($"{argName} '{handle}' does not resolve to a prefab GameObject (got {obj.GetType().Name})."); + + var assetPath = AssetDatabase.GetAssetPath(go); + if (string.IsNullOrEmpty(assetPath) || !assetPath.EndsWith(".prefab", StringComparison.OrdinalIgnoreCase)) + throw new ArgumentException($"{argName} '{handle}' is not a prefab asset."); + return go; + } + + /// Sandbox + normalize a prefab asset path, ensuring the .prefab extension. + private static string ResolvePrefabPath(string path) + { + var resolved = ProjectPaths.Resolve(path, out var error); + if (resolved == null) + throw new ArgumentException(error); + + if (!resolved.EndsWith(".prefab", StringComparison.OrdinalIgnoreCase)) + resolved += ".prefab"; + return resolved; + } + + /// + /// Confine an existing asset path (one discovered from a resolved object, not user-supplied) + /// to the authoring root, rejecting writes outside the sandbox. Runs the path through + /// , which honors explicit "Assets/..." paths as-is and + /// errors when they escape the root. describes the path for the error. + /// + private static void ConfineToAuthoringRoot(string assetPath, string what) + { + if (ProjectPaths.Resolve(assetPath, out var error) == null) + throw new ArgumentException($"The {what} ('{assetPath}') is outside the authoring root: {error}"); + } + + /// Create the parent folder chain for an asset path if it does not yet exist. + private static void EnsureParentFolder(string assetPath) + { + var parent = Path.GetDirectoryName(assetPath)?.Replace('\\', '/'); + if (string.IsNullOrEmpty(parent) || AssetDatabase.IsValidFolder(parent)) + return; + CreateFolderRecursive(parent); + AssetDatabase.Refresh(); + } + + private static void CreateFolderRecursive(string folderPath) + { + if (AssetDatabase.IsValidFolder(folderPath)) + return; + + var parent = Path.GetDirectoryName(folderPath)?.Replace('\\', '/'); + var name = Path.GetFileName(folderPath); + if (string.IsNullOrEmpty(parent) || string.IsNullOrEmpty(name)) + throw new ArgumentException($"Invalid folder path '{folderPath}'."); + + if (!AssetDatabase.IsValidFolder(parent)) + CreateFolderRecursive(parent); + + AssetDatabase.CreateFolder(parent, name); + } + + /// Resolve the scene to instantiate into: a named loaded scene, or the active scene. + private static Scene ResolveTargetScene(string scenePath) + { + if (string.IsNullOrEmpty(scenePath)) + return SceneManager.GetActiveScene(); + + for (int i = 0; i < SceneManager.sceneCount; i++) + { + var scene = SceneManager.GetSceneAt(i); + if (scene.isLoaded && + (string.Equals(scene.path, scenePath, StringComparison.OrdinalIgnoreCase) || + string.Equals(scene.name, scenePath, StringComparison.OrdinalIgnoreCase))) + { + return scene; + } + } + + throw new ArgumentException($"No loaded scene matching '{scenePath}'."); + } + + /// Find a descendant by a '/'-separated relative path under a root transform. + private static Transform FindChild(Transform root, string relativePath) + { + // Transform.Find already supports '/'-separated paths for descendants. Normalize Windows-style + // '\' separators to '/' first (mirrors ProjectPaths.Resolve) so paths like 'Body\Head' work. + return root.Find(relativePath.Replace('\\', '/').Trim('/')); + } + + #endregion + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Prefabs/PrefabCommands.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Prefabs/PrefabCommands.cs.meta new file mode 100644 index 00000000..e0167245 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Prefabs/PrefabCommands.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: f7c0d242da0d4deb9c5138d8966c51e2 diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings.meta new file mode 100644 index 00000000..6a5e0441 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8fe6d0edfccd2e8429890cf65cb7417c +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/AudioSettingsCommands.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/AudioSettingsCommands.cs new file mode 100644 index 00000000..494feebe --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/AudioSettingsCommands.cs @@ -0,0 +1,116 @@ +using System.Collections.Generic; +using Unity.Pipeline.Commands; +using UnityEditor; +using UnityEngine; + +namespace Unity.Pipeline.Editor.Commands.ProjectSettings +{ + /// + /// Get/set the project Audio settings (CLI-202). The AudioManager has no scripting API, so this + /// reads/writes its serialized properties (global volume, rolloff scale, doppler factor) via + /// . Properties absent in a given Unity version are skipped. + /// + public static class AudioSettingsCommands + { + const string Group = "audio"; + const string AssetPath = "ProjectSettings/AudioManager.asset"; + + // Serialized property name -> response/plan label. + const string VolumeProp = "m_Volume"; + const string RolloffProp = "Rolloff Scale"; + const string DopplerProp = "Doppler Factor"; + + [CliCommand("get_audio_settings", "Read project Audio settings (volume, rolloff scale, doppler factor).", MainThreadRequired = true)] + public static ProjectSettingsResponse Get() => ProjectSettingsCommand.Get(Group, Read); + + [CliCommand("set_audio_settings", "Change project Audio settings. Requires confirm=true; use dry_run to preview. Not undoable via Ctrl+Z.", MainThreadRequired = true)] + public static ProjectSettingsResponse Set( + [CliArg("settings", "Fields to change; omitted fields are left unchanged.")] AudioSettingsInput settings = null, + [CliArg("confirm", "Apply the change. Without it the call is refused.")] bool confirm = false, + [CliArg("dry_run", "Preview the change without applying it.")] bool dryRun = false) + { + if (settings == null) + return ProjectSettingsResponse.Fail(Group, "No 'settings' object provided."); + + var so = ProjectSettingsAsset.Load(AssetPath); + var changes = new List(); + AddFloatChange(so, VolumeProp, "volume", settings.Volume, changes); + AddFloatChange(so, RolloffProp, "rolloffScale", settings.RolloffScale, changes); + AddFloatChange(so, DopplerProp, "dopplerFactor", settings.DopplerFactor, changes); + + if (changes.Count == 0) + return NoChanges(); + + var planText = "Set audio settings: " + string.Join("; ", changes); + + void Apply() + { + var obj = ProjectSettingsAsset.Load(AssetPath); + SetFloat(obj, VolumeProp, settings.Volume); + SetFloat(obj, RolloffProp, settings.RolloffScale); + SetFloat(obj, DopplerProp, settings.DopplerFactor); + obj.ApplyModifiedProperties(); + AssetDatabase.SaveAssets(); + } + + return ProjectSettingsCommand.Apply(Group, confirm, dryRun, settings, () => planText, Apply, Read); + } + + static ProjectSettingsResponse NoChanges() + { + var response = ProjectSettingsCommand.Get(Group, Read); + response.Message = "No changes specified; nothing to apply."; + return response; + } + + static Dictionary Read() + { + var so = ProjectSettingsAsset.Load(AssetPath); + var values = new Dictionary(); + AddFloat(so, VolumeProp, "volume", values); + AddFloat(so, RolloffProp, "rolloffScale", values); + AddFloat(so, DopplerProp, "dopplerFactor", values); + return values; + } + + static void AddFloat(SerializedObject so, string prop, string label, Dictionary values) + { + var p = so.FindProperty(prop); + if (p != null) + values[label] = p.floatValue; + } + + static void AddFloatChange(SerializedObject so, string prop, string label, float? newValue, List changes) + { + if (!newValue.HasValue) + return; + var p = so.FindProperty(prop); + if (p == null) + return; // not present in this Unity version + if (!Mathf.Approximately(p.floatValue, newValue.Value)) + changes.Add($"{label} {p.floatValue} -> {newValue.Value}"); + } + + static void SetFloat(SerializedObject so, string prop, float? value) + { + if (!value.HasValue) + return; + var p = so.FindProperty(prop); + if (p != null) + p.floatValue = value.Value; + } + } + + /// Audio settings to change. Null/omitted fields are left unchanged. + public class AudioSettingsInput : IStructuredCommandInput + { + [CliArg("volume", "Global audio volume (0..1).")] + public float? Volume { get; set; } + + [CliArg("rolloffScale", "Global rolloff scale.")] + public float? RolloffScale { get; set; } + + [CliArg("dopplerFactor", "Global doppler factor.")] + public float? DopplerFactor { get; set; } + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/AudioSettingsCommands.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/AudioSettingsCommands.cs.meta new file mode 100644 index 00000000..ebc81077 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/AudioSettingsCommands.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1a7abd0c1722ba34dae96408746d2c9a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/GraphicsSettingsCommands.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/GraphicsSettingsCommands.cs new file mode 100644 index 00000000..8b8a306a --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/GraphicsSettingsCommands.cs @@ -0,0 +1,87 @@ +using System.Collections.Generic; +using Unity.Pipeline.Commands; +using Unity.Pipeline.Editor.Authoring; +using Unity.Pipeline.Models; +using UnityEditor; +using UnityEngine.Rendering; + +namespace Unity.Pipeline.Editor.Commands.ProjectSettings +{ + /// + /// Get/set the project's default render pipeline (CLI-202). The settable field is a handle to a + /// ; an empty reference selects the built-in pipeline (no SRP). + /// + public static class GraphicsSettingsCommands + { + const string Group = "graphics"; + + [CliCommand("get_graphics_settings", "Read GraphicsSettings (default render pipeline).", MainThreadRequired = true)] + public static ProjectSettingsResponse Get() => ProjectSettingsCommand.Get(Group, Read); + + [CliCommand("set_graphics_settings", "Set the default render pipeline asset. Requires confirm=true; use dry_run to preview. Not undoable via Ctrl+Z.", MainThreadRequired = true)] + public static ProjectSettingsResponse Set( + [CliArg("settings", "Fields to change; omitted fields are left unchanged.")] GraphicsSettingsInput settings = null, + [CliArg("confirm", "Apply the change. Without it the call is refused.")] bool confirm = false, + [CliArg("dry_run", "Preview the change without applying it.")] bool dryRun = false) + { + if (settings == null) + return ProjectSettingsResponse.Fail(Group, "No 'settings' object provided."); + + // omitted (null) = leave unchanged; an empty reference = built-in pipeline; otherwise a + // handle to a RenderPipelineAsset resolved through the shared ObjectResolver. + if (settings.RenderPipelineAsset == null) + return NoChanges(); + + RenderPipelineAsset asset = null; + if (!settings.RenderPipelineAsset.IsEmpty) + { + if (!ObjectResolver.TryResolve(settings.RenderPipelineAsset, out var obj, out var resolveError)) + return ProjectSettingsResponse.Fail(Group, resolveError); + asset = obj as RenderPipelineAsset; + if (asset == null) + return ProjectSettingsResponse.Fail(Group, $"'{settings.RenderPipelineAsset}' is not a RenderPipelineAsset."); + } + + var current = GraphicsSettings.defaultRenderPipeline; + if (current == asset) + return NoChanges(); + + var currentName = current != null ? current.name : ""; + var newName = asset != null ? asset.name : ""; + var planText = $"Set defaultRenderPipeline {currentName} -> {newName}"; + + void Apply() + { + GraphicsSettings.defaultRenderPipeline = asset; + AssetDatabase.SaveAssets(); + } + + return ProjectSettingsCommand.Apply(Group, confirm, dryRun, settings, () => planText, Apply, Read); + } + + static ProjectSettingsResponse NoChanges() + { + var response = ProjectSettingsCommand.Get(Group, Read); + response.Message = "No changes specified; nothing to apply."; + return response; + } + + static Dictionary Read() + { + var srp = GraphicsSettings.defaultRenderPipeline; + return new Dictionary + { + ["defaultRenderPipeline"] = srp != null ? srp.name : null, + ["defaultRenderPipelinePath"] = srp != null ? AssetDatabase.GetAssetPath(srp) : null, + ["usingScriptableRenderPipeline"] = srp != null + }; + } + } + + /// Graphics settings to change. Null/omitted fields are left unchanged. + public class GraphicsSettingsInput : IStructuredCommandInput + { + [CliArg("renderPipelineAsset", "Reference (path / guid / globalId) to a RenderPipelineAsset to set as the default. Pass an empty reference ({}) to select the built-in pipeline; omit to leave unchanged.")] + public ObjectRef RenderPipelineAsset { get; set; } + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/GraphicsSettingsCommands.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/GraphicsSettingsCommands.cs.meta new file mode 100644 index 00000000..f14c08db --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/GraphicsSettingsCommands.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5095c024b3a03e94996b73e4e42c4e4c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/InputSettingsCommands.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/InputSettingsCommands.cs new file mode 100644 index 00000000..7b54215a --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/InputSettingsCommands.cs @@ -0,0 +1,150 @@ +using System.Collections.Generic; +using Unity.Pipeline.Commands; +using UnityEditor; +using UnityEngine; + +namespace Unity.Pipeline.Editor.Commands.ProjectSettings +{ + /// + /// Get/set the legacy Input Manager (CLI-202). The InputManager has no scripting API, so this + /// reads/writes ProjectSettings/InputManager.asset via serialized properties: + /// get lists the configured axis names; set tunes a named axis's + /// sensitivity/gravity/dead values. + /// + /// "Input (legacy / Input System where feasible)" per the ticket: the legacy InputManager is + /// always present, so it is the portable target. Projects on the new Input System package store + /// their config in a separate input-actions asset, which would be a follow-up. + /// + public static class InputSettingsCommands + { + const string Group = "input"; + const string AssetPath = "ProjectSettings/InputManager.asset"; + + [CliCommand("get_input_settings", "Read the legacy Input Manager axes (names and count).", MainThreadRequired = true)] + public static ProjectSettingsResponse Get() => ProjectSettingsCommand.Get(Group, Read); + + [CliCommand("set_input_settings", "Tune a legacy Input Manager axis (sensitivity/gravity/dead) by name. Requires confirm=true; use dry_run to preview. Not undoable via Ctrl+Z.", MainThreadRequired = true)] + public static ProjectSettingsResponse Set( + [CliArg("settings", "Axis change. 'axis' selects the axis by name; omitted numeric fields are left unchanged.")] InputAxisInput settings = null, + [CliArg("confirm", "Apply the change. Without it the call is refused.")] bool confirm = false, + [CliArg("dry_run", "Preview the change without applying it.")] bool dryRun = false) + { + if (settings == null) + return ProjectSettingsResponse.Fail(Group, "No 'settings' object provided."); + if (string.IsNullOrEmpty(settings.Axis)) + return ProjectSettingsResponse.Fail(Group, "'axis' is required."); + + var so = ProjectSettingsAsset.Load(AssetPath); + var axes = so.FindProperty("m_Axes"); + var index = FindAxisIndex(axes, settings.Axis); + if (index < 0) + return ProjectSettingsResponse.Fail(Group, $"No axis named '{settings.Axis}'."); + + var axis = axes.GetArrayElementAtIndex(index); + var changes = new List(); + AddFloatChange(axis, "sensitivity", settings.Sensitivity, changes); + AddFloatChange(axis, "gravity", settings.Gravity, changes); + AddFloatChange(axis, "dead", settings.Dead, changes); + + if (changes.Count == 0) + return NoChanges(); + + var planText = $"Set input axis '{settings.Axis}': " + string.Join("; ", changes); + + void Apply() + { + var obj = ProjectSettingsAsset.Load(AssetPath); + var arr = obj.FindProperty("m_Axes"); + var idx = FindAxisIndex(arr, settings.Axis); + if (idx < 0) + return; + + var ax = arr.GetArrayElementAtIndex(idx); + SetFloat(ax, "sensitivity", settings.Sensitivity); + SetFloat(ax, "gravity", settings.Gravity); + SetFloat(ax, "dead", settings.Dead); + obj.ApplyModifiedProperties(); + AssetDatabase.SaveAssets(); + } + + return ProjectSettingsCommand.Apply(Group, confirm, dryRun, settings, () => planText, Apply, Read); + } + + static ProjectSettingsResponse NoChanges() + { + var response = ProjectSettingsCommand.Get(Group, Read); + response.Message = "No changes specified; nothing to apply."; + return response; + } + + static int FindAxisIndex(SerializedProperty axes, string name) + { + if (axes == null) + return -1; + for (var i = 0; i < axes.arraySize; i++) + { + var nameProp = axes.GetArrayElementAtIndex(i).FindPropertyRelative("m_Name"); + if (nameProp != null && nameProp.stringValue == name) + return i; + } + return -1; + } + + static void AddFloatChange(SerializedProperty axis, string prop, float? newValue, List changes) + { + if (!newValue.HasValue) + return; + var p = axis.FindPropertyRelative(prop); + if (p == null) + return; + if (!Mathf.Approximately(p.floatValue, newValue.Value)) + changes.Add($"{prop} {p.floatValue} -> {newValue.Value}"); + } + + static void SetFloat(SerializedProperty axis, string prop, float? value) + { + if (!value.HasValue) + return; + var p = axis.FindPropertyRelative(prop); + if (p != null) + p.floatValue = value.Value; + } + + static Dictionary Read() + { + var so = ProjectSettingsAsset.Load(AssetPath); + var axes = so.FindProperty("m_Axes"); + var names = new List(); + if (axes != null) + { + for (var i = 0; i < axes.arraySize; i++) + { + var nameProp = axes.GetArrayElementAtIndex(i).FindPropertyRelative("m_Name"); + names.Add(nameProp != null ? nameProp.stringValue : null); + } + } + + return new Dictionary + { + ["axisCount"] = names.Count, + ["axes"] = names + }; + } + } + + /// Selects a legacy input axis by name and the numeric fields to change (omitted = unchanged). + public class InputAxisInput : IStructuredCommandInput + { + [CliArg("axis", "Name of the axis to modify (e.g. 'Horizontal').", Required = true)] + public string Axis { get; set; } + + [CliArg("sensitivity", "New sensitivity.")] + public float? Sensitivity { get; set; } + + [CliArg("gravity", "New gravity.")] + public float? Gravity { get; set; } + + [CliArg("dead", "New dead-zone size.")] + public float? Dead { get; set; } + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/InputSettingsCommands.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/InputSettingsCommands.cs.meta new file mode 100644 index 00000000..582c4a0a --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/InputSettingsCommands.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 27a9903daaf869948aa6dd45e9735f6f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/PhysicsSettingsCommands.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/PhysicsSettingsCommands.cs new file mode 100644 index 00000000..196ec85a --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/PhysicsSettingsCommands.cs @@ -0,0 +1,98 @@ +using System.Collections.Generic; +using Unity.Pipeline.Commands; +using UnityEditor; +using UnityEngine; + +namespace Unity.Pipeline.Editor.Commands.ProjectSettings +{ + /// + /// Get/set a representative slice of 3D settings (CLI-202): gravity (by + /// component), default solver iterations, and the bounce threshold. + /// + public static class PhysicsSettingsCommands + { + const string Group = "physics"; + + [CliCommand("get_physics_settings", "Read Physics settings (gravity, solver iterations, bounce threshold).", MainThreadRequired = true)] + public static ProjectSettingsResponse Get() => ProjectSettingsCommand.Get(Group, Read); + + [CliCommand("set_physics_settings", "Change Physics settings. Requires confirm=true; use dry_run to preview. Not undoable via Ctrl+Z.", MainThreadRequired = true)] + public static ProjectSettingsResponse Set( + [CliArg("settings", "Fields to change; omitted fields are left unchanged.")] PhysicsSettingsInput settings = null, + [CliArg("confirm", "Apply the change. Without it the call is refused.")] bool confirm = false, + [CliArg("dry_run", "Preview the change without applying it.")] bool dryRun = false) + { + if (settings == null) + return ProjectSettingsResponse.Fail(Group, "No 'settings' object provided."); + + var changes = new List(); + + var gravity = Physics.gravity; + var newGravity = gravity; + if (settings.GravityX.HasValue) newGravity.x = settings.GravityX.Value; + if (settings.GravityY.HasValue) newGravity.y = settings.GravityY.Value; + if (settings.GravityZ.HasValue) newGravity.z = settings.GravityZ.Value; + if (newGravity != gravity) + changes.Add($"gravity {gravity} -> {newGravity}"); + + if (settings.DefaultSolverIterations.HasValue && settings.DefaultSolverIterations.Value != Physics.defaultSolverIterations) + changes.Add($"defaultSolverIterations {Physics.defaultSolverIterations} -> {settings.DefaultSolverIterations.Value}"); + if (settings.BounceThreshold.HasValue && !Mathf.Approximately(settings.BounceThreshold.Value, Physics.bounceThreshold)) + changes.Add($"bounceThreshold {Physics.bounceThreshold} -> {settings.BounceThreshold.Value}"); + + if (changes.Count == 0) + return NoChanges(); + + var planText = "Set physics settings: " + string.Join("; ", changes); + + void Apply() + { + Physics.gravity = newGravity; + if (settings.DefaultSolverIterations.HasValue) Physics.defaultSolverIterations = settings.DefaultSolverIterations.Value; + if (settings.BounceThreshold.HasValue) Physics.bounceThreshold = settings.BounceThreshold.Value; + AssetDatabase.SaveAssets(); + } + + return ProjectSettingsCommand.Apply(Group, confirm, dryRun, settings, () => planText, Apply, Read); + } + + static ProjectSettingsResponse NoChanges() + { + var response = ProjectSettingsCommand.Get(Group, Read); + response.Message = "No changes specified; nothing to apply."; + return response; + } + + static Dictionary Read() + { + var g = Physics.gravity; + return new Dictionary + { + ["gravityX"] = g.x, + ["gravityY"] = g.y, + ["gravityZ"] = g.z, + ["defaultSolverIterations"] = Physics.defaultSolverIterations, + ["bounceThreshold"] = Physics.bounceThreshold + }; + } + } + + /// Physics settings to change. Null/omitted fields are left unchanged. + public class PhysicsSettingsInput : IStructuredCommandInput + { + [CliArg("gravityX", "Gravity X component.")] + public float? GravityX { get; set; } + + [CliArg("gravityY", "Gravity Y component (e.g. -9.81).")] + public float? GravityY { get; set; } + + [CliArg("gravityZ", "Gravity Z component.")] + public float? GravityZ { get; set; } + + [CliArg("defaultSolverIterations", "Default solver iteration count.")] + public int? DefaultSolverIterations { get; set; } + + [CliArg("bounceThreshold", "Bounce threshold velocity.")] + public float? BounceThreshold { get; set; } + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/PhysicsSettingsCommands.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/PhysicsSettingsCommands.cs.meta new file mode 100644 index 00000000..6ce0c1b3 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/PhysicsSettingsCommands.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 06de808693ce8c24891baa1026490d3d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/PlayerSettingsCommands.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/PlayerSettingsCommands.cs new file mode 100644 index 00000000..827a1328 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/PlayerSettingsCommands.cs @@ -0,0 +1,122 @@ +using System.Collections.Generic; +using Unity.Pipeline.Commands; +using UnityEditor; +using UnityEditor.Build; + +namespace Unity.Pipeline.Editor.Commands.ProjectSettings +{ + /// + /// Get/set a representative slice of (CLI-202): identity + /// (company/product/version) and the two domain-reload-triggering toggles — scripting backend and + /// API compatibility level. Scripting-backend / API-level changes are read and written against the + /// active build target's . + /// + /// Icons and splash are intentionally out of this MVP set: they take Texture2D assets, not + /// scalar JSON, so they need a dedicated asset-reference convention. + /// + public static class PlayerSettingsCommands + { + const string Group = "player"; + + [CliCommand("get_player_settings", "Read PlayerSettings (company/product/version, scripting backend, API level).", MainThreadRequired = true)] + public static ProjectSettingsResponse Get() => ProjectSettingsCommand.Get(Group, Read); + + [CliCommand("set_player_settings", "Change PlayerSettings. Requires confirm=true; use dry_run to preview. Not undoable via Ctrl+Z. Scripting backend / API level changes trigger a domain reload.", MainThreadRequired = true)] + public static ProjectSettingsResponse Set( + [CliArg("settings", "Fields to change; omitted fields are left unchanged.")] PlayerSettingsInput settings = null, + [CliArg("confirm", "Apply the change. Without it the call is refused.")] bool confirm = false, + [CliArg("dry_run", "Preview the change without applying it.")] bool dryRun = false) + { + if (settings == null) + return ProjectSettingsResponse.Fail(Group, "No 'settings' object provided."); + + var target = NamedBuildTarget.FromBuildTargetGroup(EditorUserBuildSettings.selectedBuildTargetGroup); + var changes = new List(); + var reload = false; + + if (settings.CompanyName != null && settings.CompanyName != PlayerSettings.companyName) + changes.Add($"companyName '{PlayerSettings.companyName}' -> '{settings.CompanyName}'"); + if (settings.ProductName != null && settings.ProductName != PlayerSettings.productName) + changes.Add($"productName '{PlayerSettings.productName}' -> '{settings.ProductName}'"); + if (settings.BundleVersion != null && settings.BundleVersion != PlayerSettings.bundleVersion) + changes.Add($"bundleVersion '{PlayerSettings.bundleVersion}' -> '{settings.BundleVersion}'"); + + if (settings.ScriptingBackend.HasValue) + { + var current = PlayerSettings.GetScriptingBackend(target); + if (settings.ScriptingBackend.Value != current) + { + changes.Add($"scriptingBackend {current} -> {settings.ScriptingBackend.Value} (domain reload)"); + reload = true; + } + } + + if (settings.ApiCompatibilityLevel.HasValue) + { + var current = PlayerSettings.GetApiCompatibilityLevel(target); + if (settings.ApiCompatibilityLevel.Value != current) + { + changes.Add($"apiCompatibilityLevel {current} -> {settings.ApiCompatibilityLevel.Value} (domain reload)"); + reload = true; + } + } + + if (changes.Count == 0) + return NoChanges(); + + var planText = "Set player settings: " + string.Join("; ", changes); + + void Apply() + { + if (settings.CompanyName != null) PlayerSettings.companyName = settings.CompanyName; + if (settings.ProductName != null) PlayerSettings.productName = settings.ProductName; + if (settings.BundleVersion != null) PlayerSettings.bundleVersion = settings.BundleVersion; + if (settings.ScriptingBackend.HasValue) PlayerSettings.SetScriptingBackend(target, settings.ScriptingBackend.Value); + if (settings.ApiCompatibilityLevel.HasValue) PlayerSettings.SetApiCompatibilityLevel(target, settings.ApiCompatibilityLevel.Value); + AssetDatabase.SaveAssets(); + } + + return ProjectSettingsCommand.Apply(Group, confirm, dryRun, settings, () => planText, Apply, Read, requiresDomainReload: reload); + } + + static ProjectSettingsResponse NoChanges() + { + var response = ProjectSettingsCommand.Get(Group, Read); + response.Message = "No changes specified; nothing to apply."; + return response; + } + + static Dictionary Read() + { + var target = NamedBuildTarget.FromBuildTargetGroup(EditorUserBuildSettings.selectedBuildTargetGroup); + return new Dictionary + { + ["companyName"] = PlayerSettings.companyName, + ["productName"] = PlayerSettings.productName, + ["bundleVersion"] = PlayerSettings.bundleVersion, + ["buildTarget"] = target.TargetName, + ["scriptingBackend"] = PlayerSettings.GetScriptingBackend(target).ToString(), + ["apiCompatibilityLevel"] = PlayerSettings.GetApiCompatibilityLevel(target).ToString() + }; + } + } + + /// Player settings to change. Null/omitted fields are left unchanged. + public class PlayerSettingsInput : IStructuredCommandInput + { + [CliArg("companyName", "Company name.")] + public string CompanyName { get; set; } + + [CliArg("productName", "Product name.")] + public string ProductName { get; set; } + + [CliArg("bundleVersion", "Bundle/application version string.")] + public string BundleVersion { get; set; } + + [CliArg("scriptingBackend", "Scripting backend (e.g. Mono2x, IL2CPP). Triggers a domain reload.")] + public ScriptingImplementation? ScriptingBackend { get; set; } + + [CliArg("apiCompatibilityLevel", "API compatibility level (e.g. NET_Standard_2_0, NET_Unity_4_8). Triggers a domain reload.")] + public ApiCompatibilityLevel? ApiCompatibilityLevel { get; set; } + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/PlayerSettingsCommands.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/PlayerSettingsCommands.cs.meta new file mode 100644 index 00000000..1ef2ad2b --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/PlayerSettingsCommands.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4fcf409834ac0bf4bb18a7b7fadad8dd +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/ProjectSettingsAsset.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/ProjectSettingsAsset.cs new file mode 100644 index 00000000..0c8bcb5a --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/ProjectSettingsAsset.cs @@ -0,0 +1,23 @@ +using System; +using UnityEditor; + +namespace Unity.Pipeline.Editor.Commands.ProjectSettings +{ + /// + /// Loads a for a singleton settings asset under + /// ProjectSettings/ (e.g. InputManager.asset, TagManager.asset, + /// AudioManager.asset) that has no first-class scripting API. Used by the settings-group + /// commands that must read/write those managers via serialized properties. + /// + internal static class ProjectSettingsAsset + { + public static SerializedObject Load(string assetPath) + { + var objects = AssetDatabase.LoadAllAssetsAtPath(assetPath); + if (objects == null || objects.Length == 0 || objects[0] == null) + throw new InvalidOperationException($"Could not load settings asset at '{assetPath}'."); + + return new SerializedObject(objects[0]); + } + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/ProjectSettingsAsset.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/ProjectSettingsAsset.cs.meta new file mode 100644 index 00000000..5f9d9338 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/ProjectSettingsAsset.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5646d5f43f10f344ab42eecab65f08c8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/ProjectSettingsCommand.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/ProjectSettingsCommand.cs new file mode 100644 index 00000000..519a953e --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/ProjectSettingsCommand.cs @@ -0,0 +1,145 @@ +using System; +using System.Collections.Generic; +using UnityEngine; + +namespace Unity.Pipeline.Editor.Commands.ProjectSettings +{ + /// + /// Shared plumbing the per-group project-settings commands (CLI-202) wrap, so each group's + /// get/set handler stays thin and the policy is applied uniformly: + /// + /// — read a group's values into a . + /// — gate a write with the confirm/dry_run convention and + /// apply it (project-settings writes are not part of Unity's Undo), then re-read the group so the response + /// reflects the post-change state, and surface domain-reload / reimport signals. + /// + /// + /// Group handlers supply two callbacks: readValues (snapshot the group's current values) + /// and, for writes, apply (perform the mutation) plus a plan describing the intended + /// effect. All run on the main thread (these commands are MainThreadRequired = true). + /// + public static class ProjectSettingsCommand + { + /// + /// Read-only path: build a success response carrying the group's current values. + /// + public static ProjectSettingsResponse Get(string group, Func> readValues) + { + if (readValues == null) + throw new ArgumentNullException(nameof(readValues)); + + if (!TryReadValues(readValues, out var values, out var readError)) + return ProjectSettingsResponse.Fail(group, $"Failed to read {group} settings: {readError}"); + + return new ProjectSettingsResponse + { + Success = true, + Group = group, + Values = values, + Message = $"Read {group} settings." + }; + } + + /// + /// Write path: gate the change with the confirm/dry_run convention and apply it + /// (project-settings writes are not undoable via Ctrl+Z), then re-read the + /// group. / declare + /// side effects of this specific change (Unity defers them, so the response returns first); + /// they are reported for an applied change and for a dry-run preview alike, and suppressed when + /// the operation is refused or fails. + /// + public static ProjectSettingsResponse Apply( + string group, + bool confirm, + bool dryRun, + object auditParams, + Func plan, + Action apply, + Func> readValues, + bool requiresDomainReload = false, + bool requiresReimport = false) + { + if (plan == null) + throw new ArgumentNullException(nameof(plan)); + if (apply == null) + throw new ArgumentNullException(nameof(apply)); + if (readValues == null) + throw new ArgumentNullException(nameof(readValues)); + + string planText; + try + { + planText = plan(); + } + catch (Exception ex) + { + return ProjectSettingsResponse.Fail(group, $"Failed to compute the operation preview: {ex.Message}"); + } + + // Inline confirm / dry_run gate + Undo grouping (the codebase-wide mutating convention). + var response = new ProjectSettingsResponse { Group = group }; + if (dryRun) + { + response.Success = true; + response.DryRun = true; + response.Applied = false; + response.Message = $"Dry run — no changes made. Intended effect: {planText}"; + } + else if (!confirm) + { + response.Success = false; + response.Applied = false; + response.Message = + "Refused: this operation mutates the project. Re-run with confirm=true to apply, " + + "or dry_run=true to preview the change."; + } + else + { + try + { + apply(); + response.Success = true; + response.Applied = true; + response.Message = planText; + } + catch (Exception ex) + { + response.Success = false; + response.Applied = false; + response.Message = $"Operation failed: {ex.Message}"; + } + } + + // Side-effect signals are only meaningful when the operation went through (applied) or was + // previewed (dry run); suppress them for a refusal or failure. + response.RequiresDomainReload = response.Success && requiresDomainReload; + response.RequiresReimport = response.Success && requiresReimport; + + // Re-read so the caller sees the resulting (or, for a dry run / refusal, the unchanged) + // state. A read failure must not mask the write outcome, so it is non-fatal here. + if (TryReadValues(readValues, out var values, out var readError)) + response.Values = values; + else + Debug.LogWarning($"[pipeline] Read-back of {group} settings failed: {readError}"); + + return response; + } + + private static bool TryReadValues(Func> readValues, + out Dictionary values, out string error) + { + try + { + values = readValues() ?? new Dictionary(); + error = null; + return true; + } + catch (Exception ex) + { + values = null; + error = ex.Message; + return false; + } + } + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/ProjectSettingsCommand.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/ProjectSettingsCommand.cs.meta new file mode 100644 index 00000000..87ad6797 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/ProjectSettingsCommand.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 00e8d8eb6857c9d40babc72bb711b9c4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/ProjectSettingsResponse.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/ProjectSettingsResponse.cs new file mode 100644 index 00000000..1842bde4 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/ProjectSettingsResponse.cs @@ -0,0 +1,65 @@ +using System; +using System.Collections.Generic; +using Newtonsoft.Json; + +namespace Unity.Pipeline.Editor.Commands.ProjectSettings +{ + /// + /// + /// Shared response for the project-settings get/set commands (CLI-202). One type backs every + /// settings group (PlayerSettings, Quality, Graphics, Physics, Time, Input, Tags & Layers, + /// Audio) so agents get a uniform shape across them. + /// + /// + /// carries the current settings for the group as a flat + /// name → value map — returned by a get, and re-read after a set so the caller can + /// confirm the change without a second round-trip. + /// + /// Writes follow the shared confirm/dry_run convention, so + /// / mirror its semantics: a change only mutates when + /// it actually ran (not a preview, not refused). and + /// flag side effects an agent must wait out — e.g. switching the + /// scripting backend or API level triggers a domain reload; some graphics/texture changes trigger + /// an asset reimport. They describe the operation, so a dry_run still reports them. + /// + [Serializable] + public class ProjectSettingsResponse + { + [JsonProperty("success")] + public bool Success { get; set; } + + /// Settings group this response is for (e.g. "player", "quality", "time"). + [JsonProperty("group")] + public string Group { get; set; } + + /// True only when a write actually mutated the project (false for get/dry-run/refused/failed). + [JsonProperty("applied")] + public bool Applied { get; set; } + + /// True when a write was a preview only (no mutation). + [JsonProperty("dryRun")] + public bool DryRun { get; set; } + + /// The operation triggers a domain reload; the agent should wait for the editor to settle. + [JsonProperty("requiresDomainReload")] + public bool RequiresDomainReload { get; set; } + + /// The operation triggers an asset reimport; the agent should wait for it to finish. + [JsonProperty("requiresReimport")] + public bool RequiresReimport { get; set; } + + /// Current settings for the group as a name → value map. + [JsonProperty("values")] + public Dictionary Values { get; set; } + + [JsonProperty("message")] + public string Message { get; set; } + + public static ProjectSettingsResponse Fail(string group, string message) => new ProjectSettingsResponse + { + Success = false, + Group = group, + Message = message + }; + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/ProjectSettingsResponse.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/ProjectSettingsResponse.cs.meta new file mode 100644 index 00000000..200fa823 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/ProjectSettingsResponse.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8f8c1356c54a05248b34aff8e0490c0c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/QualitySettingsCommands.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/QualitySettingsCommands.cs new file mode 100644 index 00000000..8bac9b56 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/QualitySettingsCommands.cs @@ -0,0 +1,95 @@ +using System.Collections.Generic; +using Unity.Pipeline.Commands; +using UnityEditor; +using UnityEngine; + +namespace Unity.Pipeline.Editor.Commands.ProjectSettings +{ + /// + /// Get/set (CLI-202): the active quality level plus a couple of + /// representative per-level toggles (vSync, anti-aliasing). Level changes apply expensive changes + /// so the switch takes full effect. + /// + public static class QualitySettingsCommands + { + const string Group = "quality"; + + [CliCommand("get_quality_settings", "Read QualitySettings (current level, level names, vSync, anti-aliasing).", MainThreadRequired = true)] + public static ProjectSettingsResponse Get() => ProjectSettingsCommand.Get(Group, Read); + + [CliCommand("set_quality_settings", "Change QualitySettings. Requires confirm=true; use dry_run to preview. Not undoable via Ctrl+Z.", MainThreadRequired = true)] + public static ProjectSettingsResponse Set( + [CliArg("settings", "Fields to change; omitted fields are left unchanged.")] QualitySettingsInput settings = null, + [CliArg("confirm", "Apply the change. Without it the call is refused.")] bool confirm = false, + [CliArg("dry_run", "Preview the change without applying it.")] bool dryRun = false) + { + if (settings == null) + return ProjectSettingsResponse.Fail(Group, "No 'settings' object provided."); + + var names = QualitySettings.names; + var changes = new List(); + + if (settings.Level.HasValue) + { + if (settings.Level.Value < 0 || settings.Level.Value >= names.Length) + return ProjectSettingsResponse.Fail(Group, $"level {settings.Level.Value} out of range (0..{names.Length - 1})."); + if (settings.Level.Value != QualitySettings.GetQualityLevel()) + changes.Add($"level {QualitySettings.GetQualityLevel()} -> {settings.Level.Value}"); + } + + if (settings.VSyncCount.HasValue && settings.VSyncCount.Value != QualitySettings.vSyncCount) + changes.Add($"vSyncCount {QualitySettings.vSyncCount} -> {settings.VSyncCount.Value}"); + if (settings.AntiAliasing.HasValue && settings.AntiAliasing.Value != QualitySettings.antiAliasing) + changes.Add($"antiAliasing {QualitySettings.antiAliasing} -> {settings.AntiAliasing.Value}"); + + if (changes.Count == 0) + return NoChanges(); + + var planText = "Set quality settings: " + string.Join("; ", changes); + + void Apply() + { + if (settings.Level.HasValue) QualitySettings.SetQualityLevel(settings.Level.Value, true); + if (settings.VSyncCount.HasValue) QualitySettings.vSyncCount = settings.VSyncCount.Value; + if (settings.AntiAliasing.HasValue) QualitySettings.antiAliasing = settings.AntiAliasing.Value; + AssetDatabase.SaveAssets(); + } + + return ProjectSettingsCommand.Apply(Group, confirm, dryRun, settings, () => planText, Apply, Read); + } + + static ProjectSettingsResponse NoChanges() + { + var response = ProjectSettingsCommand.Get(Group, Read); + response.Message = "No changes specified; nothing to apply."; + return response; + } + + static Dictionary Read() + { + var names = QualitySettings.names; + var level = QualitySettings.GetQualityLevel(); + return new Dictionary + { + ["level"] = level, + ["levelName"] = (level >= 0 && level < names.Length) ? names[level] : null, + ["levelNames"] = names, + ["vSyncCount"] = QualitySettings.vSyncCount, + ["antiAliasing"] = QualitySettings.antiAliasing + }; + } + } + + /// Quality settings to change. Null/omitted fields are left unchanged. + public class QualitySettingsInput : IStructuredCommandInput + { + [CliArg("level", "Quality level index (see levelNames from get_quality_settings).")] + public int? Level { get; set; } + + [CliArg("vSyncCount", "VSync count (0 = off, 1, 2).")] + public int? VSyncCount { get; set; } + + [CliArg("antiAliasing", "MSAA sample count (0, 2, 4, 8).")] + public int? AntiAliasing { get; set; } + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/QualitySettingsCommands.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/QualitySettingsCommands.cs.meta new file mode 100644 index 00000000..359020a6 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/QualitySettingsCommands.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b4bc1a976dcac514796a70fd1b91a2be +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/TagsLayersCommands.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/TagsLayersCommands.cs new file mode 100644 index 00000000..cd773782 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/TagsLayersCommands.cs @@ -0,0 +1,143 @@ +using System.Collections.Generic; +using Unity.Pipeline.Commands; +using UnityEditor; +using UnityEditorInternal; + +namespace Unity.Pipeline.Editor.Commands.ProjectSettings +{ + /// + /// Get/set project tags and layers (CLI-202). Tags use the + /// add/remove API; user layers (indices 8..31; 0..7 are + /// reserved) are assigned via the TagManager's serialized layers array. + /// + public static class TagsLayersCommands + { + const string Group = "tags_layers"; + const string TagManagerPath = "ProjectSettings/TagManager.asset"; + const int FirstUserLayer = 8; + const int LastUserLayer = 31; + + [CliCommand("get_tags_layers", "Read the project's tags and (named) layers.", MainThreadRequired = true)] + public static ProjectSettingsResponse Get() => ProjectSettingsCommand.Get(Group, Read); + + [CliCommand("set_tags_layers", "Add/remove tags and assign user layer names (index 8-31). Requires confirm=true; use dry_run to preview. Not undoable via Ctrl+Z.", MainThreadRequired = true)] + public static ProjectSettingsResponse Set( + [CliArg("settings", "Tag/layer changes to make.")] TagsLayersInput settings = null, + [CliArg("confirm", "Apply the change. Without it the call is refused.")] bool confirm = false, + [CliArg("dry_run", "Preview the change without applying it.")] bool dryRun = false) + { + if (settings == null) + return ProjectSettingsResponse.Fail(Group, "No 'settings' object provided."); + + if (settings.SetLayers != null) + { + foreach (var layer in settings.SetLayers) + { + if (layer == null) + continue; + if (layer.Index < FirstUserLayer || layer.Index > LastUserLayer) + return ProjectSettingsResponse.Fail(Group, + $"layer index {layer.Index} is reserved or out of range; user layers are {FirstUserLayer}..{LastUserLayer}."); + } + } + + var existingTags = new HashSet(InternalEditorUtility.tags); + var existingLayers = InternalEditorUtility.layers; + var changes = new List(); + + if (settings.AddTags != null) + foreach (var tag in settings.AddTags) + if (!string.IsNullOrEmpty(tag) && !existingTags.Contains(tag)) + changes.Add($"add tag '{tag}'"); + + if (settings.RemoveTags != null) + foreach (var tag in settings.RemoveTags) + if (!string.IsNullOrEmpty(tag) && existingTags.Contains(tag)) + changes.Add($"remove tag '{tag}'"); + + if (settings.SetLayers != null) + foreach (var layer in settings.SetLayers) + if (layer != null) + { + var desired = layer.Name ?? string.Empty; + var current = (existingLayers != null && layer.Index >= 0 && layer.Index < existingLayers.Length) + ? (existingLayers[layer.Index] ?? string.Empty) + : string.Empty; + if (current != desired) + changes.Add($"layer[{layer.Index}] = '{desired}'"); + } + + if (changes.Count == 0) + return NoChanges(); + + var planText = "Set tags/layers: " + string.Join("; ", changes); + + void Apply() + { + // Remove before add so a remove+re-add in one call behaves predictably. + if (settings.RemoveTags != null) + foreach (var tag in settings.RemoveTags) + if (!string.IsNullOrEmpty(tag)) + InternalEditorUtility.RemoveTag(tag); + + if (settings.AddTags != null) + foreach (var tag in settings.AddTags) + if (!string.IsNullOrEmpty(tag)) + InternalEditorUtility.AddTag(tag); + + if (settings.SetLayers != null && settings.SetLayers.Length > 0) + { + var so = ProjectSettingsAsset.Load(TagManagerPath); + var layersProp = so.FindProperty("layers"); + foreach (var layer in settings.SetLayers) + { + if (layer == null) + continue; + layersProp.GetArrayElementAtIndex(layer.Index).stringValue = layer.Name ?? string.Empty; + } + so.ApplyModifiedProperties(); + } + + AssetDatabase.SaveAssets(); + } + + return ProjectSettingsCommand.Apply(Group, confirm, dryRun, settings, () => planText, Apply, Read); + } + + static ProjectSettingsResponse NoChanges() + { + var response = ProjectSettingsCommand.Get(Group, Read); + response.Message = "No changes specified; nothing to apply."; + return response; + } + + static Dictionary Read() => new Dictionary + { + ["tags"] = InternalEditorUtility.tags, + ["layers"] = InternalEditorUtility.layers + }; + } + + /// Tag/layer changes. All fields optional; omitted ones make no change. + public class TagsLayersInput : IStructuredCommandInput + { + [CliArg("addTags", "Tag names to add.")] + public string[] AddTags { get; set; } + + [CliArg("removeTags", "Tag names to remove.")] + public string[] RemoveTags { get; set; } + + [CliArg("setLayers", "User layer assignments (index 8-31).")] + public LayerAssignment[] SetLayers { get; set; } + } + + /// Assigns a name to a single user layer slot. + public class LayerAssignment : IStructuredCommandInput + { + [CliArg("index", "Layer index (8-31 for user layers).", Required = true)] + public int Index { get; set; } + + [CliArg("name", "Layer name (empty string clears the slot).", Required = true)] + public string Name { get; set; } + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/TagsLayersCommands.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/TagsLayersCommands.cs.meta new file mode 100644 index 00000000..c68e6471 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/TagsLayersCommands.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2c6cb0f1d0a407f498fc141814f2d329 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/TimeSettingsCommands.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/TimeSettingsCommands.cs new file mode 100644 index 00000000..749a2a4a --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/TimeSettingsCommands.cs @@ -0,0 +1,80 @@ +using System.Collections.Generic; +using Unity.Pipeline.Commands; +using UnityEditor; +using UnityEngine; + +namespace Unity.Pipeline.Editor.Commands.ProjectSettings +{ + /// + /// Get/set the project Time settings (CLI-202): fixed timestep, maximum allowed timestep, and the + /// time scale. + /// + public static class TimeSettingsCommands + { + const string Group = "time"; + + [CliCommand("get_time_settings", "Read Time settings (fixedDeltaTime, maximumDeltaTime, timeScale).", MainThreadRequired = true)] + public static ProjectSettingsResponse Get() => ProjectSettingsCommand.Get(Group, Read); + + [CliCommand("set_time_settings", "Change Time settings. Requires confirm=true; use dry_run to preview. Not undoable via Ctrl+Z.", MainThreadRequired = true)] + public static ProjectSettingsResponse Set( + [CliArg("settings", "Fields to change; omitted fields are left unchanged.")] TimeSettingsInput settings = null, + [CliArg("confirm", "Apply the change. Without it the call is refused.")] bool confirm = false, + [CliArg("dry_run", "Preview the change without applying it.")] bool dryRun = false) + { + if (settings == null) + return ProjectSettingsResponse.Fail(Group, "No 'settings' object provided."); + + var changes = new List(); + + if (settings.FixedDeltaTime.HasValue && !Mathf.Approximately(settings.FixedDeltaTime.Value, Time.fixedDeltaTime)) + changes.Add($"fixedDeltaTime {Time.fixedDeltaTime} -> {settings.FixedDeltaTime.Value}"); + if (settings.MaximumDeltaTime.HasValue && !Mathf.Approximately(settings.MaximumDeltaTime.Value, Time.maximumDeltaTime)) + changes.Add($"maximumDeltaTime {Time.maximumDeltaTime} -> {settings.MaximumDeltaTime.Value}"); + if (settings.TimeScale.HasValue && !Mathf.Approximately(settings.TimeScale.Value, Time.timeScale)) + changes.Add($"timeScale {Time.timeScale} -> {settings.TimeScale.Value}"); + + if (changes.Count == 0) + return NoChanges(); + + var planText = "Set time settings: " + string.Join("; ", changes); + + void Apply() + { + if (settings.FixedDeltaTime.HasValue) Time.fixedDeltaTime = settings.FixedDeltaTime.Value; + if (settings.MaximumDeltaTime.HasValue) Time.maximumDeltaTime = settings.MaximumDeltaTime.Value; + if (settings.TimeScale.HasValue) Time.timeScale = settings.TimeScale.Value; + AssetDatabase.SaveAssets(); + } + + return ProjectSettingsCommand.Apply(Group, confirm, dryRun, settings, () => planText, Apply, Read); + } + + static ProjectSettingsResponse NoChanges() + { + var response = ProjectSettingsCommand.Get(Group, Read); + response.Message = "No changes specified; nothing to apply."; + return response; + } + + static Dictionary Read() => new Dictionary + { + ["fixedDeltaTime"] = Time.fixedDeltaTime, + ["maximumDeltaTime"] = Time.maximumDeltaTime, + ["timeScale"] = Time.timeScale + }; + } + + /// Time settings to change. Null/omitted fields are left unchanged. + public class TimeSettingsInput : IStructuredCommandInput + { + [CliArg("fixedDeltaTime", "Fixed timestep in seconds (e.g. 0.02).")] + public float? FixedDeltaTime { get; set; } + + [CliArg("maximumDeltaTime", "Maximum allowed timestep in seconds.")] + public float? MaximumDeltaTime { get; set; } + + [CliArg("timeScale", "Time scale (1 = real-time).")] + public float? TimeScale { get; set; } + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/TimeSettingsCommands.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/TimeSettingsCommands.cs.meta new file mode 100644 index 00000000..c467654b --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ProjectSettings/TimeSettingsCommands.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a5973463d405c064687fe56fee5d011a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/RecompileCommand.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/RecompileCommand.cs new file mode 100644 index 00000000..a0fc4ff2 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/RecompileCommand.cs @@ -0,0 +1,113 @@ +using System; +using System.Collections.Generic; +using System.IO; +using Newtonsoft.Json; +using Unity.Pipeline.Commands; +using UnityEditor; +using UnityEditor.Compilation; +using UnityEngine; + +namespace Unity.Pipeline.Editor.Commands +{ + /// + /// Forces a script recompile that works even when the editor is unfocused or minimized. + /// + /// Why this is non-trivial: + /// - Unity only runs script compilation while the editor is the active OS application. Pass + /// focus=true to bring it to the foreground (editor_focus) before AssetDatabase.Refresh(); + /// it is off by default because the server keeps the editor ticking while unfocused, so + /// compilation still proceeds without stealing the user's foreground window. + /// - A successful compile triggers a domain reload, which destroys the managed AppDomain + /// (HTTP server, in-flight requests, statics). The triggering request therefore cannot stay + /// open and return when done. + /// + /// Pattern (mirrors the test runner): completion is reported via a status file that survives the + /// domain reload. Call "recompile" to trigger, then poll "recompile_status" until status is + /// "completed" or "up_to_date". The client must tolerate connection errors during the reload. + /// + [InitializeOnLoad] + public static class RecompileCommand + { + const string StatusFile = "Temp/pipeline_recompile_status.json"; + + static readonly List s_Errors = new List(); + + // Focus action, indirected so tests can observe whether focus was performed without + // actually stealing the OS foreground window. + internal static Action s_FocusAction = () => FocusEditorCommand.FocusEditor(); + + static RecompileCommand() + { + CompilationPipeline.compilationStarted += OnCompilationStarted; + CompilationPipeline.assemblyCompilationFinished += OnAssemblyCompilationFinished; + CompilationPipeline.compilationFinished += OnCompilationFinished; + } + + [CliCommand("recompile", "Force a script recompile (works while unfocused/minimized). Poll recompile_status for completion.", MainThreadRequired = true)] + public static object Recompile( + [CliArg("focus", "If true, bring the Editor to the foreground before compiling. Off by default.")] bool focus = false) + { + // Unity compiles only while it is the active application. Optionally bring it to the + // foreground first; off by default (the server keeps the editor ticking while unfocused, + // so compilation still proceeds). + if (focus) + s_FocusAction(); + + WriteStatus("triggered", false, null); + + // Trigger asset import + compilation. + AssetDatabase.Refresh(); + + if (EditorApplication.isCompiling) + { + // compilationStarted has written "compiling"; a domain reload will follow on success. + return new { status = "compiling", message = "Recompilation started. Poll recompile_status until completed." }; + } + + // Nothing needed recompilation. + WriteStatus("up_to_date", false, null); + return new { status = "up_to_date", message = "No scripts needed recompilation." }; + } + + [CliCommand("recompile_status", "Get the status of the last recompile: idle | triggered | compiling | completed | up_to_date.", MainThreadRequired = false)] + public static string RecompileStatus() + { + if (File.Exists(StatusFile)) + return File.ReadAllText(StatusFile); + return "{\"status\":\"idle\"}"; + } + + static void OnCompilationStarted(object _) + { + s_Errors.Clear(); + WriteStatus("compiling", false, null); + } + + static void OnAssemblyCompilationFinished(string assembly, CompilerMessage[] messages) + { + if (messages == null) return; + foreach (var m in messages) + if (m.type == CompilerMessageType.Error) + s_Errors.Add(m.message); + } + + static void OnCompilationFinished(object _) + { + // Written before the domain reload, so it persists for pollers after the reload. + WriteStatus("completed", s_Errors.Count > 0, s_Errors.ToArray()); + } + + static void WriteStatus(string status, bool failed, string[] errors) + { + try + { + var payload = new { status, failed, errors = errors ?? Array.Empty() }; + File.WriteAllText(StatusFile, JsonConvert.SerializeObject(payload)); + } + catch (Exception ex) + { + Debug.LogError($"[Recompile] Failed to write status file: {ex.Message}"); + } + } + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/RecompileCommand.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/RecompileCommand.cs.meta new file mode 100644 index 00000000..287a05cd --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/RecompileCommand.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c0ded562e1968c342b40922dbb32f3f5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Scenes.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Scenes.meta new file mode 100644 index 00000000..e7459cb0 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Scenes.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d7cf2e413ccd43f0b9dfb4db22c6cb29 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Scenes/SceneCommands.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Scenes/SceneCommands.cs new file mode 100644 index 00000000..7492a79d --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Scenes/SceneCommands.cs @@ -0,0 +1,395 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using Unity.Pipeline.Commands; +using Unity.Pipeline.Editor.Authoring; +using Unity.Pipeline.Models; +using UnityEditor; +using UnityEditor.SceneManagement; +using UnityEngine; +using UnityEngine.SceneManagement; + +namespace Unity.Pipeline.Editor.Commands.Scenes +{ + /// + /// Scene-management authoring commands (CLI-193): create / open / save scenes, inspect open + /// scenes, control the active scene, snapshot a scene's hierarchy, and manage the build scene + /// list. They build on the same foundation as the asset commands — paths go through the + /// sandbox and results come back as the canonical + /// envelope so an agent can chain follow-up calls. + /// + /// WHY the play-mode guard: mutations (new/open/save/setActive) + /// are undefined and destructive while the editor is entering or in play mode — they can discard + /// in-flight play-mode state or leave the scene manager inconsistent. Rather than risk corrupting + /// state, every mutating command refuses up front with a clear, *recoverable* error (an + /// , surfaced by the server as a 400 "Command Execution + /// Failed" without touching scene state). The caller can exit play mode and retry. + /// + public static class SceneCommands + { + private const string SceneExtension = ".unity"; + + // create_scene --template values. "empty" is the historical default (blank scene); "default" + // seeds Unity's built-in "3D" new-scene contents (Main Camera + Directional Light). + private const string TemplateEmpty = "empty"; + private const string TemplateDefault = "default"; + + #region Create / Open / Save + + [CliCommand("create_scene", "Create a new scene and save it to the given path under the authoring root.")] + public static AuthoringResult CreateScene( + [CliArg("path", "Scene path relative to the authoring root (default Assets/); the Assets/ prefix and the .unity extension are optional. e.g. Scenes/Level1", Required = true)] string path, + [CliArg("additive", "Open the new scene additively alongside currently open scenes instead of replacing them.", DefaultValue = false)] bool additive = false, + [CliArg("template", "Initial contents: 'empty' (default) for a blank scene, or 'default' to seed a Main Camera + Directional Light matching Unity's built-in 3D template.", DefaultValue = TemplateEmpty)] string template = TemplateEmpty) + { + GuardNotPlaying("create_scene"); + + // Validate the template up front (before touching scene state) so an unknown value fails + // recoverably with a clear, enumerated error rather than silently doing the wrong thing. + var sceneSetup = ResolveSceneSetup(template); + + var normalized = ResolveScenePath(path); + EnsureParentFolder(normalized); + + // NewSceneMode.Single replaces all open scenes; Additive keeps them. NewSceneSetup.EmptyScene + // gives a blank scene (no default camera/light) — predictable for programmatic population; + // NewSceneSetup.DefaultGameObjects gives exactly a Main Camera (tagged MainCamera) + a + // Directional Light, identical to Unity's built-in "3D" new-scene template. + var setup = additive ? NewSceneMode.Additive : NewSceneMode.Single; + var scene = EditorSceneManager.NewScene(sceneSetup, setup); + + if (!EditorSceneManager.SaveScene(scene, normalized)) + throw new InvalidOperationException($"Failed to save new scene to '{normalized}'."); + + AssetDatabase.Refresh(); + return DescribeSceneAsset(normalized); + } + + [CliCommand("open_scene", "Open an existing scene from the given path.")] + public static AuthoringResult OpenScene( + [CliArg("path", "Scene path relative to the authoring root (default Assets/); the Assets/ prefix and the .unity extension are optional.", Required = true)] string path, + [CliArg("additive", "Open additively alongside currently open scenes instead of replacing them.", DefaultValue = false)] bool additive = false) + { + GuardNotPlaying("open_scene"); + + var normalized = ResolveScenePath(path); + if (string.IsNullOrEmpty(AssetDatabase.AssetPathToGUID(normalized))) + throw new InvalidOperationException($"No scene asset at '{normalized}'."); + + var mode = additive ? OpenSceneMode.Additive : OpenSceneMode.Single; + var scene = EditorSceneManager.OpenScene(normalized, mode); + if (!scene.IsValid()) + throw new InvalidOperationException($"Failed to open scene '{normalized}'."); + + return DescribeSceneAsset(normalized); + } + + [CliCommand("save_scene", "Save an open scene. Saves the active scene when no path is given.")] + public static AuthoringResult SaveScene( + [CliArg("path", "Path of the open scene to save (authoring-root relative; Assets/ prefix and .unity optional). Omit to save the active scene.")] string path = null) + { + GuardNotPlaying("save_scene"); + + var scene = string.IsNullOrEmpty(path) + ? EditorSceneManager.GetActiveScene() + : FindOpenScene(ResolveScenePath(path)); + + if (!scene.IsValid() || !scene.isLoaded) + throw new InvalidOperationException( + string.IsNullOrEmpty(path) + ? "No valid active scene to save." + : $"Scene '{path}' is not open."); + + // An untitled/never-saved scene has an empty path. SaveScene(scene) with no explicit path + // would either trigger a modal "Save Scene" dialog (hangs a headless editor) or fail + // non-deterministically. Refuse up front with a recoverable error so the caller picks a path. + if (string.IsNullOrEmpty(scene.path)) + throw new InvalidOperationException( + $"Scene '{scene.name}' has never been saved (no path). " + + "Create or save it with an explicit path first (create_scene ) — no scene state was changed."); + + if (!EditorSceneManager.SaveScene(scene)) + throw new InvalidOperationException($"Failed to save scene '{scene.name}'."); + + AssetDatabase.Refresh(); + return DescribeSceneAsset(scene.path); + } + + [CliCommand("save_all", "Save all open scenes that have unsaved changes.")] + public static object SaveAll() + { + GuardNotPlaying("save_all"); + + // SaveOpenScenes saves every loaded, dirty scene. A dirty untitled scene (empty path) would + // make it pop a modal "Save Scene" dialog, which hangs a headless editor. Fail fast with a + // recoverable error before saving anything so the caller saves that scene with an explicit path. + var dirty = OpenScenes().Where(s => s.isDirty).ToList(); + var untitled = dirty.Where(s => string.IsNullOrEmpty(s.path)).Select(s => s.name).ToList(); + if (untitled.Count > 0) + throw new InvalidOperationException( + $"Cannot save all: {untitled.Count} dirty scene(s) have never been saved ({string.Join(", ", untitled)}). " + + "Save each with an explicit path first (create_scene ) — no scenes were saved."); + + // Report which scenes it touched. + var dirtyBefore = dirty.Select(s => s.path).ToList(); + + var saved = EditorSceneManager.SaveOpenScenes(); + if (!saved && dirtyBefore.Count > 0) + throw new InvalidOperationException("Failed to save one or more open scenes."); + + AssetDatabase.Refresh(); + return new { saved, scenes = dirtyBefore }; + } + + #endregion + + #region Inspect / Active + + [CliCommand("list_open_scenes", "List all currently open scenes with their load/active/dirty state.")] + public static object ListOpenScenes() + { + // Read-only; safe in play mode, so no guard here. + var active = SceneManager.GetActiveScene(); + var scenes = OpenScenes() + .Select(s => new + { + name = s.name, + path = s.path, + isLoaded = s.isLoaded, + isDirty = s.isDirty, + isActive = s.handle == active.handle, + rootCount = s.isLoaded ? s.rootCount : 0 + }) + .ToList(); + + return new { count = scenes.Count, scenes }; + } + + [CliCommand("set_active_scene", "Set which open scene is the active scene (new objects are created in the active scene).")] + public static AuthoringResult SetActiveScene( + [CliArg("path", "Path of an already-open scene to make active (authoring-root relative; Assets/ prefix and .unity optional).", Required = true)] string path) + { + GuardNotPlaying("set_active_scene"); + + var normalized = ResolveScenePath(path); + var scene = FindOpenScene(normalized); + if (!scene.IsValid() || !scene.isLoaded) + throw new InvalidOperationException($"Scene '{path}' is not open; open it before making it active."); + + if (!SceneManager.SetActiveScene(scene)) + throw new InvalidOperationException($"Failed to set '{normalized}' as the active scene."); + + return DescribeSceneAsset(scene.path); + } + + [CliCommand("get_scene_hierarchy", "Return the GameObject tree of an open scene (or the active scene). Each node carries instanceId + hierarchyPath usable by GameObject commands.")] + public static SceneHierarchy GetSceneHierarchy( + [CliArg("path", "Path of the open scene to snapshot (authoring-root relative; Assets/ prefix and .unity optional). Omit for the active scene.")] string path = null) + { + // Read-only; safe in play mode. + var scene = string.IsNullOrEmpty(path) + ? SceneManager.GetActiveScene() + : FindOpenScene(ResolveScenePath(path)); + + if (!scene.IsValid() || !scene.isLoaded) + throw new InvalidOperationException( + string.IsNullOrEmpty(path) + ? "No valid active scene to read." + : $"Scene '{path}' is not open."); + + var active = SceneManager.GetActiveScene(); + var hierarchy = new SceneHierarchy + { + SceneName = scene.name, + ScenePath = scene.path, + IsDirty = scene.isDirty, + IsActive = scene.handle == active.handle + }; + + foreach (var root in scene.GetRootGameObjects()) + hierarchy.Roots.Add(BuildNode(root, "/" + root.name)); + + return hierarchy; + } + + #endregion + + #region Build settings + + [CliCommand("add_scene_to_build", "Add a scene to the Build Settings scene list (idempotent). Optionally enable it.")] + public static object AddSceneToBuild( + [CliArg("path", "Scene path to add (authoring-root relative; Assets/ prefix and .unity optional).", Required = true)] string path, + [CliArg("enabled", "Whether the scene is enabled in the build list.", DefaultValue = true)] bool enabled = true) + { + GuardNotPlaying("add_scene_to_build"); + + var normalized = ResolveScenePath(path); + if (string.IsNullOrEmpty(AssetDatabase.AssetPathToGUID(normalized))) + throw new InvalidOperationException($"No scene asset at '{normalized}'."); + + var scenes = EditorBuildSettings.scenes.ToList(); + var existing = scenes.FindIndex(s => PathsEqual(s.path, normalized)); + if (existing >= 0) + { + // Idempotent: just reconcile the enabled flag. + if (scenes[existing].enabled != enabled) + scenes[existing] = new EditorBuildSettingsScene(normalized, enabled); + } + else + { + scenes.Add(new EditorBuildSettingsScene(normalized, enabled)); + } + + EditorBuildSettings.scenes = scenes.ToArray(); + return new { path = normalized, enabled, buildIndex = SceneUtility.GetBuildIndexByScenePath(normalized), count = scenes.Count }; + } + + [CliCommand("remove_scene_from_build", "Remove a scene from the Build Settings scene list (idempotent).")] + public static object RemoveSceneFromBuild( + [CliArg("path", "Scene path to remove (authoring-root relative; Assets/ prefix and .unity optional).", Required = true)] string path) + { + GuardNotPlaying("remove_scene_from_build"); + + var normalized = ResolveScenePath(path); + var scenes = EditorBuildSettings.scenes.ToList(); + var removed = scenes.RemoveAll(s => PathsEqual(s.path, normalized)); + EditorBuildSettings.scenes = scenes.ToArray(); + return new { path = normalized, removed = removed > 0, count = scenes.Count }; + } + + #endregion + + #region Helpers + + /// + /// Refuse a mutating scene op while entering or in play mode. We deliberately throw a + /// recoverable *before* touching any state, so the + /// command surfaces as a clean failure rather than leaving the scene manager inconsistent. + /// + private static void GuardNotPlaying(string command) + { + if (EditorApplication.isPlayingOrWillChangePlaymode) + throw new InvalidOperationException( + $"'{command}' cannot run while the editor is in (or entering) play mode. " + + "Exit play mode (editor_stop) and retry — no scene state was changed."); + } + + /// + /// Map the create_scene template argument to a . "empty" + /// (or a null/blank value) keeps the historical blank-scene behavior; "default" seeds Unity's + /// built-in "3D" template (Main Camera tagged MainCamera + Directional Light). An unknown value + /// throws a recoverable listing the valid options. + /// + private static NewSceneSetup ResolveSceneSetup(string template) + { + // Treat a null/blank template as the default ("empty") for parity with an omitted argument. + var value = string.IsNullOrWhiteSpace(template) ? TemplateEmpty : template.Trim(); + + if (string.Equals(value, TemplateEmpty, StringComparison.OrdinalIgnoreCase)) + return NewSceneSetup.EmptyScene; + if (string.Equals(value, TemplateDefault, StringComparison.OrdinalIgnoreCase)) + return NewSceneSetup.DefaultGameObjects; + + throw new ArgumentException( + $"Unknown template '{template}'. Valid values: '{TemplateEmpty}', '{TemplateDefault}'."); + } + + /// Resolve an agent path through the sandbox and normalize it to a "*.unity" asset path. + private static string ResolveScenePath(string path) + { + var normalized = ProjectPaths.Resolve(path, out var error); + if (normalized == null) + throw new ArgumentException(error); + + if (!normalized.EndsWith(SceneExtension, StringComparison.OrdinalIgnoreCase)) + normalized += SceneExtension; + + return normalized; + } + + /// Create the scene's parent folder chain if missing (mirrors FolderCommands). + private static void EnsureParentFolder(string scenePath) + { + var parent = Path.GetDirectoryName(scenePath)?.Replace('\\', '/'); + if (string.IsNullOrEmpty(parent) || AssetDatabase.IsValidFolder(parent)) + return; + + CreateFolderRecursive(parent); + } + + private static void CreateFolderRecursive(string assetsPath) + { + if (AssetDatabase.IsValidFolder(assetsPath)) + return; + + var parent = Path.GetDirectoryName(assetsPath)?.Replace('\\', '/'); + var name = Path.GetFileName(assetsPath); + if (string.IsNullOrEmpty(parent) || string.IsNullOrEmpty(name)) + throw new ArgumentException($"Invalid folder path '{assetsPath}'."); + + if (!AssetDatabase.IsValidFolder(parent)) + CreateFolderRecursive(parent); + + AssetDatabase.CreateFolder(parent, name); + } + + /// Build the canonical identity envelope for a scene asset path. + private static AuthoringResult DescribeSceneAsset(string scenePath) + { + var asset = AssetDatabase.LoadAssetAtPath(scenePath); + var result = ObjectResolver.Describe(asset) ?? new AuthoringResult { Type = nameof(SceneAsset) }; + result.AssetPath = scenePath; + return result; + } + + /// Enumerate every open scene (loaded or not) by index. + private static IEnumerable OpenScenes() + { + for (int i = 0; i < SceneManager.sceneCount; i++) + yield return SceneManager.GetSceneAt(i); + } + + /// Find an open scene by its (normalized) asset path. Returns an invalid Scene when not open. + private static Scene FindOpenScene(string normalizedPath) + { + foreach (var scene in OpenScenes()) + { + if (PathsEqual(scene.path, normalizedPath)) + return scene; + } + + return default; + } + + private static bool PathsEqual(string a, string b) => + string.Equals(a, b, StringComparison.OrdinalIgnoreCase); + + private static SceneHierarchyNode BuildNode(GameObject go, string hierarchyPath) + { + var node = new SceneHierarchyNode + { + Name = go.name, + InstanceId = PipelineUtils.GetObjectId(go), + HierarchyPath = hierarchyPath, + ActiveSelf = go.activeSelf, + Components = go.GetComponents() + // A missing/broken script serializes as a null component; skip it rather than NRE. + .Where(c => c != null) + .Select(c => c.GetType().Name) + .ToList() + }; + + var transform = go.transform; + for (int i = 0; i < transform.childCount; i++) + { + var child = transform.GetChild(i).gameObject; + node.Children.Add(BuildNode(child, hierarchyPath + "/" + child.name)); + } + + return node; + } + + #endregion + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Scenes/SceneCommands.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Scenes/SceneCommands.cs.meta new file mode 100644 index 00000000..94e4e995 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Scenes/SceneCommands.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 2c7b859adf794e05969586b070d0ab79 diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Scenes/SceneHierarchy.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Scenes/SceneHierarchy.cs new file mode 100644 index 00000000..c83adbca --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Scenes/SceneHierarchy.cs @@ -0,0 +1,82 @@ +using System; +using System.Collections.Generic; +using Newtonsoft.Json; + +namespace Unity.Pipeline.Editor.Commands.Scenes +{ + /// + /// Serializable snapshot of an open scene's GameObject tree, returned by + /// get_scene_hierarchy. + /// + /// WHY a dedicated tree type (rather than reusing ): + /// the hierarchy is meant to be the *input* to GameObject-targeting commands. Every node carries + /// a stable and a , + /// either of which is directly accepted by + /// / . + /// That lets an agent fetch the tree once and then address any node without a second round-trip. + /// The shape is kept intentionally small and JSON-friendly (no UnityEngine references) so it + /// survives the HTTP boundary cleanly. + /// + [Serializable] + public class SceneHierarchy + { + /// Scene name (the file name without extension for a saved scene). + [JsonProperty("sceneName")] + public string SceneName { get; set; } + + /// Project-relative scene asset path, or empty for an unsaved scene. + [JsonProperty("scenePath")] + public string ScenePath { get; set; } + + /// Whether this scene currently has unsaved changes. + [JsonProperty("isDirty")] + public bool IsDirty { get; set; } + + /// Whether this scene is the active scene. + [JsonProperty("isActive")] + public bool IsActive { get; set; } + + /// Root GameObjects of the scene, each with their descendants. + [JsonProperty("roots")] + public List Roots { get; set; } = new List(); + } + + /// + /// One GameObject node in a , with enough identity to be used as an + /// handle (instanceId or hierarchyPath) by + /// follow-up GameObject commands. + /// + [Serializable] + public class SceneHierarchyNode + { + /// GameObject name. + [JsonProperty("name")] + public string Name { get; set; } + + /// + /// Runtime instance id of the GameObject. Stable for the lifetime of the loaded scene and + /// directly usable as ObjectRef.instanceId. + /// + [JsonProperty("instanceId")] + public ObjectId InstanceId { get; set; } + + /// + /// Slash-delimited scene path (e.g. "/Root/Child/Leaf"), directly usable as + /// ObjectRef.hierarchyPath. + /// + [JsonProperty("hierarchyPath")] + public string HierarchyPath { get; set; } + + /// Whether the GameObject is active in the hierarchy. + [JsonProperty("activeSelf")] + public bool ActiveSelf { get; set; } + + /// Component type names attached to this GameObject (e.g. "Transform", "Camera"). + [JsonProperty("components")] + public List Components { get; set; } = new List(); + + /// Child nodes. + [JsonProperty("children")] + public List Children { get; set; } = new List(); + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Scenes/SceneHierarchy.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Scenes/SceneHierarchy.cs.meta new file mode 100644 index 00000000..5c3d8203 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Scenes/SceneHierarchy.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: a93c6751c9564baca2addf1deb479da4 diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ScreenshotCommand.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ScreenshotCommand.cs new file mode 100644 index 00000000..3b60fd8b --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ScreenshotCommand.cs @@ -0,0 +1,198 @@ +using System; +using System.Globalization; +using System.IO; +using Newtonsoft.Json; +using Unity.Pipeline.Commands; +using UnityEditor; +using UnityEngine; + +namespace Unity.Pipeline.Editor.Commands +{ + /// + /// Captures the Scene or Game view of a running Editor as a PNG and returns the file path. + /// Backs the unity screenshot CLI command (CLI-112): the CLI only forwards the request + /// via unity request screenshot — all capture logic lives here in the package, per the + /// two-commands design. + /// + /// Capture renders the relevant view camera into an offscreen RenderTexture and reads it back, + /// rather than using ScreenCapture.CaptureScreenshot. CaptureScreenshot only targets the Game + /// view and writes asynchronously on the next frame — a single request/response can't reliably + /// wait for that, and it does nothing for the Scene view in edit mode. Camera.Render() into a + /// RenderTexture is synchronous, needs no play mode, and handles both views identically. + /// + public static class ScreenshotCommand + { + const int k_DefaultWidth = 1920; + const int k_DefaultHeight = 1080; + + [CliCommand("screenshot", "Capture the Scene or Game view as a PNG and return its file path", MainThreadRequired = true)] + public static ScreenshotResponse CaptureScreenshot( + [CliArg("view", "Which view to capture: 'game' (default) or 'scene'")] string view = "game", + [CliArg("output", "Output PNG path (absolute, or relative to the project root). Defaults to a timestamped file under /Temp/pipeline-screenshots/.")] string output = "", + [CliArg("width", "Output width in pixels. 0 (default) uses the view camera's current width.")] int width = 0, + [CliArg("height", "Output height in pixels. 0 (default) uses the view camera's current height.")] int height = 0) + { + var normalizedView = string.IsNullOrWhiteSpace(view) ? "game" : view.Trim().ToLowerInvariant(); + if (normalizedView != "game" && normalizedView != "scene") + return ScreenshotResponse.Fail($"Invalid view '{view}'. Expected 'game' or 'scene'."); + + if (width < 0 || height < 0) + return ScreenshotResponse.Fail("width and height must be >= 0 (0 = use the view's current size)."); + + var camera = ResolveCamera(normalizedView, out var resolveError); + if (camera == null) + return ScreenshotResponse.Fail(resolveError); + + // Default the size to the camera's current pixel size, falling back to 1080p when the + // camera reports nothing useful (can happen for an off-screen scene camera). + var w = width > 0 ? width : camera.pixelWidth; + var h = height > 0 ? height : camera.pixelHeight; + if (w <= 1) w = k_DefaultWidth; + if (h <= 1) h = k_DefaultHeight; + + var path = ResolveOutputPath(output, normalizedView); + + try + { + var png = RenderToPng(camera, w, h); + var dir = Path.GetDirectoryName(path); + if (!string.IsNullOrEmpty(dir)) + Directory.CreateDirectory(dir); + File.WriteAllBytes(path, png); + } + catch (Exception ex) + { + return ScreenshotResponse.Fail($"Failed to capture {normalizedView} view: {ex.Message}"); + } + + return new ScreenshotResponse + { + Success = true, + Path = path, + View = normalizedView, + Width = w, + Height = h, + Message = $"Captured {normalizedView} view to {path}" + }; + } + + /// + /// Resolve the camera to render for the requested view, or null with an explanatory error. + /// + static Camera ResolveCamera(string view, out string error) + { + error = null; + + if (view == "scene") + { + var sv = SceneView.lastActiveSceneView; + if (sv == null || sv.camera == null) + { + error = "No active Scene view to capture. Open a Scene view window and try again."; + return null; + } + return sv.camera; + } + + // Game view: prefer the main camera, otherwise the first enabled camera in the open scenes. + var cam = Camera.main; + if (cam == null && Camera.allCamerasCount > 0) + { + var all = Camera.allCameras; + if (all.Length > 0) + cam = all[0]; + } + + if (cam == null) + error = "No camera found to capture the Game view (no MainCamera and no enabled cameras in the open scenes)."; + + return cam; + } + + /// + /// Render into an offscreen RenderTexture at the given size and + /// encode it to PNG. Restores the camera's previous target and the active RenderTexture so + /// the capture leaves no side effects on the live editor. + /// + static byte[] RenderToPng(Camera camera, int width, int height) + { + var rt = new RenderTexture(width, height, 24); + var prevTarget = camera.targetTexture; + var prevActive = RenderTexture.active; + Texture2D tex = null; + + try + { + camera.targetTexture = rt; + camera.Render(); + + RenderTexture.active = rt; + tex = new Texture2D(width, height, TextureFormat.RGB24, false); + tex.ReadPixels(new Rect(0, 0, width, height), 0, 0); + tex.Apply(); + + return tex.EncodeToPNG(); + } + finally + { + camera.targetTexture = prevTarget; + RenderTexture.active = prevActive; + rt.Release(); + UnityEngine.Object.DestroyImmediate(rt); + if (tex != null) + UnityEngine.Object.DestroyImmediate(tex); + } + } + + /// + /// Resolve the output path: an explicit path is used as-is (rooted) or relative to the + /// project root; an empty path defaults to a timestamped file under Temp. + /// + static string ResolveOutputPath(string output, string view) + { + var projectRoot = Path.GetDirectoryName(Application.dataPath); + + if (!string.IsNullOrWhiteSpace(output)) + { + return Path.IsPathRooted(output) + ? output + : Path.GetFullPath(Path.Combine(projectRoot, output)); + } + + var stamp = DateTime.Now.ToString("yyyyMMdd_HHmmss_fff", CultureInfo.InvariantCulture); + return Path.Combine(projectRoot, "Temp", "pipeline-screenshots", $"screenshot_{view}_{stamp}.png"); + } + } + + /// + /// Result of the screenshot command. Serialized to JSON for the CLI's --format json + /// output; the human formatter reads . + /// + [Serializable] + public class ScreenshotResponse + { + [JsonProperty("success")] + public bool Success { get; set; } + + [JsonProperty("path")] + public string Path { get; set; } + + [JsonProperty("view")] + public string View { get; set; } + + [JsonProperty("width")] + public int Width { get; set; } + + [JsonProperty("height")] + public int Height { get; set; } + + [JsonProperty("message")] + public string Message { get; set; } + + public static ScreenshotResponse Fail(string message) => new ScreenshotResponse + { + Success = false, + Message = message + }; + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ScreenshotCommand.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ScreenshotCommand.cs.meta new file mode 100644 index 00000000..1dcce16f --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/ScreenshotCommand.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: ee6b23eed8dc4ff096cf01b461985fcc diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Scripts.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Scripts.meta new file mode 100644 index 00000000..5c91cfb9 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Scripts.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c4d83f412a414f419f97bac28b65f25b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Scripts/AttachScriptCommand.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Scripts/AttachScriptCommand.cs new file mode 100644 index 00000000..01f1461d --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Scripts/AttachScriptCommand.cs @@ -0,0 +1,138 @@ +using System; +using Unity.Pipeline.Commands; +using Unity.Pipeline.Editor.Authoring; +using Unity.Pipeline.Models; +using UnityEditor; +using UnityEngine; +using Object = UnityEngine.Object; + +namespace Unity.Pipeline.Editor.Commands.Scripts +{ + /// + /// Authoring command that adds a MonoBehaviour component to a GameObject, addressing the script + /// either by its (compiled) type name OR by its source asset path (CLI-195, CLI-224). + /// + /// COMPILE-AWARE: the type must already be compiled. A script created via create_script does not + /// have a compiled until a domain reload runs, so attaching it before that + /// fails with a CLEAR, RECOVERABLE error (no crash, no silent no-op) telling the agent to + /// recompile and retry. The full flow is: + /// create_script -> recompile -> poll recompile_status (completed/up_to_date) -> attach_script. + /// + /// Addressing by asset path resolves the backing class through + /// , which correctly handles a class whose name differs from + /// the filename. A path whose MonoScript has no class yet (not compiled, or no single matching + /// top-level type) surfaces the same recoverable "not yet compiled / ambiguous" error. + /// + /// The component add is wrapped in an and registered with the + /// Undo system so it reverts as one step and the owning object/prefab is marked dirty. + /// + public static class AttachScriptCommand + { + [CliCommand("attach_script", + "Add a MonoBehaviour to a GameObject by its (compiled) type name OR by its script asset path. " + + "Provide exactly one of 'type' or 'script'. " + + "If the type isn't compiled yet, returns a recoverable error: recompile, poll recompile_status, then retry.")] + public static AuthoringResult AttachScript( + [CliArg("target", "Reference to the GameObject to add the component to (globalId/path/guid/instanceId/hierarchyPath).", Required = true)] ObjectRef target, + [CliArg("type", "Component type name to add, e.g. PlayerController or Game.Player.PlayerController. Must already be compiled. Mutually exclusive with 'script'.")] string type = null, + [CliArg("script", "Script asset path, e.g. 'Assets/Pool/Scripts/CueShooter.cs'. The backing class is resolved via MonoScript.GetClass(), so the class name may differ from the filename. Mutually exclusive with 'type'.")] string script = null) + { + if (target == null || target.IsEmpty) + throw new ArgumentException("attach_script 'target' is required."); + + // Exactly one addressing form must be supplied. Both is ambiguous; neither is incomplete. + var hasType = !string.IsNullOrWhiteSpace(type); + var hasScript = !string.IsNullOrWhiteSpace(script); + if (hasType && hasScript) + throw new ArgumentException( + "Provide either 'type' (class name) or 'script' (asset path), not both."); + if (!hasType && !hasScript) + throw new ArgumentException( + "Provide either 'type' (class name) or 'script' (asset path)."); + + if (!ObjectResolver.TryResolve(target, out var obj, out var resolveError)) + throw new ArgumentException($"Could not resolve target: {resolveError}"); + + var go = obj as GameObject ?? (obj as Component)?.gameObject; + if (go == null) + throw new ArgumentException( + $"Target '{target}' resolved to a {obj.GetType().Name}, which is not a GameObject. " + + "attach_script needs a GameObject."); + + // Resolve the component Type from whichever addressing form was given. A type that exists but + // isn't compiled yet (or is the wrong kind) surfaces as InvalidOperationException so the + // server returns a 400 "Command Execution Failed" with the recovery instructions intact. + // ArgumentException is reserved for caller input mistakes — both/neither args, or a script + // path that points at no asset — which the server reports as "Parameter Validation Failed". + var componentType = hasScript + ? ResolveTypeFromScriptPath(script) + : ResolveTypeFromName(type); + + using (new AuthoringUndoScope($"Attach {componentType.Name}")) + { + // Undo.AddComponent registers the add for undo and returns the new component. + var component = Undo.AddComponent(go, componentType); + if (component == null) + throw new InvalidOperationException( + $"Failed to add component '{componentType.FullName}' to '{go.name}'. " + + "It may conflict with [DisallowMultipleComponent] or a required-component rule."); + + EditorUtility.SetDirty(go); + + var result = ObjectResolver.Describe(component) ?? new AuthoringResult { Type = componentType.Name }; + return result; + } + } + + /// + /// Resolve a component type by its compiled type name. A missing type is the expected, + /// recoverable "created but not yet compiled" case. + /// + private static Type ResolveTypeFromName(string type) + { + if (!ScriptTypeResolver.TryResolveComponentType(type, out var componentType, out var typeError)) + throw new InvalidOperationException(typeError); + + return componentType; + } + + /// + /// Resolve a component type from a script asset path. Loads the at the + /// path and resolves its backing class via — which correctly + /// handles a class whose name differs from the filename. Validates the class is a concrete + /// MonoBehaviour. A null class is the recoverable "not yet compiled / ambiguous" case and + /// mirrors the type-not-found message style. A path that resolves to no MonoScript asset is a + /// caller input mistake (ArgumentException → "Parameter Validation Failed"), not a recompile- + /// recoverable failure. + /// + private static Type ResolveTypeFromScriptPath(string path) + { + var trimmed = path.Trim(); + + var mono = AssetDatabase.LoadAssetAtPath(trimmed); + if (mono == null) + throw new ArgumentException( + $"No MonoScript at '{trimmed}'. Check the asset path (it should be a project-relative " + + "path to a .cs file, e.g. 'Assets/Scripts/PlayerController.cs')."); + + var cls = mono.GetClass(); + if (cls == null) + throw new InvalidOperationException( + $"Script at '{trimmed}' has no resolvable class. " + + "If you just created or edited this script it is not compiled yet: run 'recompile', poll " + + "'recompile_status' until it reports completed/up_to_date, then retry attach_script. " + + "If it should already exist, ensure the file has a single top-level type matching the " + + "script and that it compiled without errors."); + + if (!typeof(MonoBehaviour).IsAssignableFrom(cls)) + throw new InvalidOperationException( + $"Type '{cls.FullName}' (from '{trimmed}') does not derive from MonoBehaviour and cannot be added as a component."); + + if (cls.IsAbstract) + throw new InvalidOperationException( + $"Type '{cls.FullName}' (from '{trimmed}') is abstract and cannot be instantiated as a component."); + + return cls; + } + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Scripts/AttachScriptCommand.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Scripts/AttachScriptCommand.cs.meta new file mode 100644 index 00000000..2c4aca08 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Scripts/AttachScriptCommand.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 488a53ecbf5c4984bdc009bf1f2f9a45 diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Scripts/CreateScriptCommand.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Scripts/CreateScriptCommand.cs new file mode 100644 index 00000000..9d092698 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Scripts/CreateScriptCommand.cs @@ -0,0 +1,163 @@ +using System; +using System.IO; +using System.Text; +using System.Text.RegularExpressions; +using Unity.Pipeline.Commands; +using Unity.Pipeline.Editor.Authoring; +using Unity.Pipeline.Models; +using UnityEditor; + +namespace Unity.Pipeline.Editor.Commands.Scripts +{ + /// + /// Authoring command that writes a new C# MonoBehaviour (or other base-class) script from a + /// template into the project under the authoring root (CLI-195). + /// + /// IMPORTANT — the compile/domain-reload boundary: + /// Writing a .cs file does NOT make the type available. Unity must import and compile the new + /// file, which triggers a domain reload, before the type exists and can be attached. The agent + /// workflow is therefore: + /// 1. create_script (this command — writes the file) + /// 2. recompile (triggers compilation; see ) + /// 3. poll recompile_status (wait until "completed" / "up_to_date") + /// 4. attach_script (now the type exists; see ) + /// This command intentionally does its part only: it creates the file and returns the asset + /// identity. It does not trigger a recompile itself — the agent owns that step so it can batch + /// multiple authoring writes before paying the domain-reload cost once. + /// + public static class CreateScriptCommand + { + /// + /// Default class body (the Start/Update stubs) written inside the generated class, matching + /// Unity's own new-MonoBehaviour template so the output reads like a hand-authored script. + /// wraps it with the using/class declaration and an optional namespace. + /// + private const string DefaultBody = + " // Use this for initialization\n" + + " void Start()\n" + + " {\n\n" + + " }\n\n" + + " // Update is called once per frame\n" + + " void Update()\n" + + " {\n\n" + + " }\n"; + + [CliCommand("create_script", + "Create a new C# script (default base class MonoBehaviour) from a template under the authoring root. " + + "NOTE: the type does not exist until a recompile completes — to attach it, call recompile, poll recompile_status, then attach_script.")] + public static AuthoringResult CreateScript( + [CliArg("name", "Class/file name without extension, e.g. PlayerController. Must be a valid C# identifier.", Required = true)] string name, + [CliArg("path", "Folder (relative to the authoring root; the Assets/ prefix is optional) to write the .cs into. Defaults to the authoring root.")] string path = null, + [CliArg("namespace", "Optional namespace to wrap the class in. Omit for the global namespace.")] string @namespace = null, + [CliArg("base_class", "Base class to derive from. Defaults to MonoBehaviour.")] string baseClass = "MonoBehaviour", + [CliArg("overwrite", "Overwrite the file if it already exists. Defaults to false (an existing file is an error).")] bool overwrite = false) + { + if (string.IsNullOrWhiteSpace(name)) + throw new ArgumentException("Script 'name' is required."); + + var className = name.Trim(); + if (className.EndsWith(".cs", StringComparison.OrdinalIgnoreCase)) + className = className.Substring(0, className.Length - 3); + + if (!IsValidIdentifier(className)) + throw new ArgumentException($"Script name '{className}' is not a valid C# class identifier."); + + if (string.IsNullOrWhiteSpace(baseClass)) + baseClass = "MonoBehaviour"; + + // Resolve & sandbox the destination folder through the project-path policy. A null/empty + // path means "the authoring root itself" — Resolve treats an empty path as an error, so + // fall back to the configured root in that case (it is already a confined, valid path). + string folder; + if (string.IsNullOrWhiteSpace(path)) + { + folder = ProjectPaths.AuthoringRoot; + } + else + { + folder = ProjectPaths.Resolve(path, out var error); + if (folder == null) + throw new ArgumentException(error); + } + + if (!AssetDatabase.IsValidFolder(folder)) + throw new ArgumentException( + $"Destination folder '{folder}' does not exist. Create it first with create_folder."); + + var assetPath = $"{folder}/{className}.cs"; + if (File.Exists(ToAbsolute(assetPath)) && !overwrite) + throw new ArgumentException( + $"A script already exists at '{assetPath}'. Pass overwrite=true to replace it."); + + var source = BuildSource(className, @namespace, baseClass); + + // Write through the filesystem then import: AssetDatabase has no "create text asset" API, + // and CreateAsset is for UnityEngine.Object instances, not source files. + File.WriteAllText(ToAbsolute(assetPath), source, new UTF8Encoding(false)); + AssetDatabase.ImportAsset(assetPath, ImportAssetOptions.ForceUpdate); + + // The MonoScript may already be loadable (its asset entry exists), but its compiled Type + // will not exist until the next domain reload — see the class doc. + var script = AssetDatabase.LoadAssetAtPath(assetPath); + var result = ObjectResolver.Describe(script) ?? new AuthoringResult { Type = "MonoScript" }; + result.AssetPath = assetPath; + return result; + } + + /// + /// Build the script source from the template, substituting the class name, optional namespace + /// and base class. When a namespace is supplied the class body is indented one extra level. + /// + private static string BuildSource(string className, string @namespace, string baseClass) + { + var usings = "using UnityEngine;\n\n"; + var classDecl = $"public class {className} : {baseClass}\n"; + + var sb = new StringBuilder(); + sb.Append(usings); + + if (!string.IsNullOrWhiteSpace(@namespace)) + { + sb.Append($"namespace {@namespace}\n{{\n"); + sb.Append(Indent(classDecl, " ")); + sb.Append(" {\n"); + sb.Append(Indent(DefaultBody, " ")); + sb.Append(" }\n"); + sb.Append("}\n"); + } + else + { + sb.Append(classDecl); + sb.Append("{\n"); + sb.Append(DefaultBody); + sb.Append("}\n"); + } + + return sb.ToString(); + } + + private static string Indent(string text, string prefix) + { + var sb = new StringBuilder(); + foreach (var line in text.Split('\n')) + sb.Append(line.Length == 0 ? "\n" : prefix + line + "\n"); + // Split adds a trailing empty element for a trailing newline; trim the extra newline we + // appended for it. + if (text.EndsWith("\n") && sb.Length > 0) + sb.Length -= 1; + return sb.ToString(); + } + + private static bool IsValidIdentifier(string value) + { + // A C# identifier: starts with a letter or underscore, then letters/digits/underscores. + return Regex.IsMatch(value, @"^[A-Za-z_][A-Za-z0-9_]*$"); + } + + private static string ToAbsolute(string assetPath) + { + // assetPath is project-relative ("Assets/..."); ProjectRoot is the folder containing Assets/. + return Path.Combine(ProjectPaths.ProjectRoot, assetPath).Replace('\\', '/'); + } + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Scripts/CreateScriptCommand.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Scripts/CreateScriptCommand.cs.meta new file mode 100644 index 00000000..8884c31e --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Scripts/CreateScriptCommand.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 34d285de0757475796fcecc889996421 diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Scripts/ScriptTypeResolver.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Scripts/ScriptTypeResolver.cs new file mode 100644 index 00000000..bae855a8 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Scripts/ScriptTypeResolver.cs @@ -0,0 +1,161 @@ +using System; +using System.Linq; +using System.Reflection; +using UnityEditor; +using UnityEngine; + +namespace Unity.Pipeline.Editor.Commands.Scripts +{ + /// + /// Resolves an agent-supplied type name (or a reference) to a compiled + /// , searching the currently-loaded assemblies. + /// + /// This is the heart of the compile-aware behaviour for CLI-195: a script that was just created + /// has no compiled type until a domain reload runs, so resolution here will fail until the agent + /// recompiles. Callers translate that failure into a clear, recoverable error rather than a crash. + /// + public static class ScriptTypeResolver + { + /// + /// Try to resolve a MonoBehaviour-derived type by its name. Accepts either a bare class name + /// ("PlayerController") or a fully-qualified name ("Game.Player.PlayerController"). When a + /// bare name is ambiguous across namespaces the first match wins; callers should prefer the + /// fully-qualified name. Returns false with a human-readable when no + /// loaded type matches (typically: not yet compiled). + /// + public static bool TryResolveComponentType(string typeName, out Type type, out string error) + { + type = null; + error = null; + + if (string.IsNullOrWhiteSpace(typeName)) + { + error = "Type name is required."; + return false; + } + + var name = typeName.Trim(); + var match = FindType(name); + + if (match == null) + { + error = + $"Type '{name}' was not found in any loaded assembly. " + + "If you just created this script it is not compiled yet: run 'recompile', poll " + + "'recompile_status' until it reports completed/up_to_date, then retry attach_script. " + + "If it should already exist, check the class name (and namespace) and that the file compiled without errors."; + return false; + } + + if (!typeof(MonoBehaviour).IsAssignableFrom(match)) + { + error = $"Type '{match.FullName}' does not derive from MonoBehaviour and cannot be added as a component."; + return false; + } + + if (match.IsAbstract) + { + error = $"Type '{match.FullName}' is abstract and cannot be instantiated as a component."; + return false; + } + + type = match; + return true; + } + + /// + /// Resolve the compiled backing a asset reference + /// (e.g. one returned by create_script). Returns false when the script has no class yet + /// (uncompiled) or the asset is not a MonoScript. + /// + public static bool TryResolveFromMonoScript(MonoScript script, out Type type, out string error) + { + type = null; + error = null; + + if (script == null) + { + error = "MonoScript reference is null."; + return false; + } + + var scriptClass = script.GetClass(); + if (scriptClass == null) + { + error = + $"Script '{script.name}' has no compiled class. It is likely not compiled yet: run 'recompile', " + + "poll 'recompile_status', then retry."; + return false; + } + + type = scriptClass; + return true; + } + + /// + /// Search all loaded assemblies for a type by full name first, then by bare class name. Done + /// over rather than TypeCache so it also finds types in + /// non-Unity-managed assemblies and matches what Activator/AddComponent can actually load. + /// + private static Type FindType(string name) + { + var assemblies = PipelineUtils.GetLoadedAssemblies(); + + // 1. Fully-qualified name (exact). + foreach (var asm in assemblies) + { + var t = asm.GetType(name, throwOnError: false, ignoreCase: false); + if (t != null) + return t; + } + + // 2. Bare class name — match on Name across loaded types. GetTypes() is expensive, so skip + // dynamic and system/Unity assemblies (which never hold user MonoBehaviours). This mirrors + // CommandRegistry.IsSystemAssembly's predicate (replicated locally rather than shared so we + // don't widen that internal helper's surface). + foreach (var asm in assemblies) + { + if (IsSkippableAssembly(asm)) + continue; + + Type[] types; + try + { + types = asm.GetTypes(); + } + catch (ReflectionTypeLoadException ex) + { + types = ex.Types.Where(t => t != null).ToArray(); + } + + var hit = types.FirstOrDefault(t => t != null && t.Name == name); + if (hit != null) + return hit; + } + + return null; + } + + /// + /// Assemblies we never need to scan for a user MonoBehaviour: dynamic (in-memory, can't be + /// reflected for types reliably) and core system/Unity assemblies. Mirrors the predicate in + /// CommandRegistry.IsSystemAssembly. + /// + private static bool IsSkippableAssembly(Assembly assembly) + { + if (assembly.IsDynamic) + return true; + + var name = assembly.GetName().Name; + if (string.IsNullOrEmpty(name)) + return false; + + return name.StartsWith("System.", StringComparison.Ordinal) || + name.StartsWith("Microsoft.", StringComparison.Ordinal) || + name.StartsWith("mscorlib", StringComparison.Ordinal) || + name.StartsWith("netstandard", StringComparison.Ordinal) || + name.Equals("UnityEngine", StringComparison.Ordinal) || + name.Equals("UnityEditor", StringComparison.Ordinal); + } + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Scripts/ScriptTypeResolver.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Scripts/ScriptTypeResolver.cs.meta new file mode 100644 index 00000000..79f33389 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Scripts/ScriptTypeResolver.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 6b1131a6a27648b1829e78c8c0bd69a7 diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Scripts/SerializedFieldCommands.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Scripts/SerializedFieldCommands.cs new file mode 100644 index 00000000..f8b742bf --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Scripts/SerializedFieldCommands.cs @@ -0,0 +1,215 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using Newtonsoft.Json.Linq; +using Unity.Pipeline.Commands; +using Unity.Pipeline.Editor.Authoring; +using Unity.Pipeline.Editor.Commands.GameObjects; +using Unity.Pipeline.Models; +using UnityEditor; +using UnityEngine; +using Object = UnityEngine.Object; + +namespace Unity.Pipeline.Editor.Commands.Scripts +{ + /// + /// Read and write serialized ([SerializeField] / public) fields on a component or asset through + /// Unity's model (CLI-195). + /// + /// Why SerializedObject and not plain reflection: it honours Unity's serialization rules (private + /// [SerializeField] fields, property drawers, prefab overrides), marks the object dirty correctly, + /// and integrates with Undo. Writes are wrapped in an so an + /// agent's change reverts as one step. + /// + /// Field addressing uses Unity's native SerializedProperty path syntax, so array elements are + /// reachable directly: "myArray.Array.data[2]" sets the third element; "myArray.Array.size" sets + /// the array length. Nested fields use dotted paths ("settings.speed"). + /// + public static class SerializedFieldCommands + { + [CliCommand("set_serialized_field", + "Set a serialized field on a component/asset. Supports primitives, enums, Vector/Color/Rect/Bounds, " + + "object references (value = an ObjectRef: asset by guid/fileId/path or scene object by instanceId/hierarchyPath), " + + "and array elements via 'name.Array.data[i]' (or 'name.Array.size' to resize).")] + public static AuthoringResult SetSerializedField( + [CliArg("target", "Reference to the component or asset to modify (globalId/path/guid/instanceId/hierarchyPath). May be a GameObject when 'component' is given.", Required = true)] ObjectRef target, + [CliArg("field", "SerializedProperty path, e.g. 'speed', 'settings.speed', or 'waypoints.Array.data[0]'.", Required = true)] string field, + [CliArg("value", "JSON value to assign. For object references pass an ObjectRef object (or null to clear). For enums pass the value name.", Required = true)] JToken value, + [CliArg("component", "Component type name on the target GameObject (e.g. 'Rigidbody'). Use when 'target' is a GameObject; omit when 'target' is already a component handle.")] string component = null) + { + if (target == null || target.IsEmpty) + throw new ArgumentException("set_serialized_field 'target' is required."); + if (string.IsNullOrWhiteSpace(field)) + throw new ArgumentException("set_serialized_field 'field' is required."); + + var obj = ResolveSerializable(target, component); + + using (new AuthoringUndoScope($"Set {field}")) + { + // RegisterCompleteObjectUndo captures the pre-change state for revert; the + // SerializedObject below then records the change for prefab/asset dirtying. + Undo.RegisterCompleteObjectUndo(obj, $"Set {field}"); + + var so = new SerializedObject(obj); + var prop = so.FindProperty(field); + if (prop == null) + throw new ArgumentException( + $"Field '{field}' was not found on '{obj.GetType().Name}'. " + + "Use a SerializedProperty path (e.g. 'speed', 'settings.speed', 'items.Array.data[0]')."); + + SerializedPropertyConverter.SetValue(prop, value); + so.ApplyModifiedProperties(); + EditorUtility.SetDirty(obj); + } + + var result = ObjectResolver.Describe(obj) ?? new AuthoringResult { Type = obj.GetType().Name }; + return result; + } + + [CliCommand("get_serialized_fields", + "Read serialized fields of a component/asset. Returns each top-level field's name, type and value " + + "(object references are returned as re-usable handles). Pass 'field' to read a single SerializedProperty path.")] + public static object GetSerializedFields( + [CliArg("target", "Reference to the component or asset to read (globalId/path/guid/instanceId/hierarchyPath). May be a GameObject when 'component' is given.", Required = true)] ObjectRef target, + [CliArg("field", "Optional single SerializedProperty path to read (e.g. 'speed' or 'items.Array.data[0]'). Omit to read all top-level fields.")] string field = null, + [CliArg("component", "Component type name on the target GameObject (e.g. 'Rigidbody'). Use when 'target' is a GameObject; omit when 'target' is already a component handle.")] string component = null) + { + if (target == null || target.IsEmpty) + throw new ArgumentException("get_serialized_fields 'target' is required."); + + var obj = ResolveSerializable(target, component); + var so = new SerializedObject(obj); + + if (!string.IsNullOrWhiteSpace(field)) + { + var prop = so.FindProperty(field); + if (prop == null) + throw new ArgumentException($"Field '{field}' was not found on '{obj.GetType().Name}'."); + + return new + { + type = obj.GetType().Name, + fields = new[] { DescribeProperty(prop) } + }; + } + + var fields = new List(); + var iterator = so.GetIterator(); + // enterChildren=true on the first MoveNext to step into the top level; then false to stay + // at the top level and skip nested children (callers drill in via an explicit 'field'). + var enterChildren = true; + while (iterator.NextVisible(enterChildren)) + { + enterChildren = false; + + // m_Script is Unity's hidden back-reference to the MonoScript; not a user field. + if (iterator.propertyPath == "m_Script") + continue; + + fields.Add(DescribeProperty(iterator)); + } + + return new { type = obj.GetType().Name, fields }; + } + + /// + /// Resolve a handle to an object that a SerializedObject can wrap: a Component or an asset. + /// + /// Two addressing forms (CLI-225): + /// * The handle already points at a Component (or asset) → use it directly. An optional + /// type name is validated against it as a guard. + /// * The handle points at a GameObject AND is given → look up + /// the matching component(s) on that GameObject. Exactly one match is used; MULTIPLE + /// same-type components are an error that lists each instanceId so the agent can re-address + /// by instanceId; zero matches is a clear error. + /// + /// A GameObject with no is rejected (a GameObject's "fields" are + /// its components), with a hint to pass --component or a specific component handle. + /// + /// This mirrors 's GO-path+type pattern, but + /// deliberately errors on MULTIPLE matches (that helper returns the first) so a set/get never + /// silently targets the wrong instance. + /// + private static Object ResolveSerializable(ObjectRef target, string component = null) + { + if (!ObjectResolver.TryResolve(target, out var obj, out var error)) + throw new ArgumentException($"Could not resolve target: {error}"); + + // The handle already points at a specific Component: honour it directly. A 'component' here + // is only a constraint to validate against, never a reason to re-fetch (which could pick a + // different same-type instance and ignore the handle). + if (obj is Component directComponent) + { + if (!string.IsNullOrWhiteSpace(component)) + { + var requestedType = TypeResolver.ResolveComponentType(component); + if (requestedType == null) + throw new ArgumentException($"Could not resolve component type '{component}'."); + if (!requestedType.IsInstanceOfType(directComponent)) + throw new ArgumentException( + $"Target resolves to a {directComponent.GetType().Name}, which is not a '{requestedType.Name}'."); + } + + return directComponent; + } + + if (obj is GameObject go) + { + if (string.IsNullOrWhiteSpace(component)) + throw new ArgumentException( + $"Target '{target}' is a GameObject. Pass --component to pick a component on it, " + + "or target a specific component directly (use its instanceId/globalId), " + + "to read or set serialized fields."); + + var componentType = TypeResolver.ResolveComponentType(component); + if (componentType == null) + throw new ArgumentException($"Could not resolve component type '{component}'."); + + var matches = go.GetComponents(componentType).Where(c => c != null).ToArray(); + if (matches.Length == 0) + throw new ArgumentException( + $"GameObject '{go.name}' has no component of type '{componentType.Name}'."); + + if (matches.Length > 1) + { + var sb = new StringBuilder(); + sb.Append($"GameObject '{go.name}' has {matches.Length} components of type '{componentType.Name}'. ") + .Append("Re-target a specific one by its instanceId: "); + for (int i = 0; i < matches.Length; i++) + { + if (i > 0) sb.Append(", "); + sb.Append($"instanceId {PipelineUtils.GetObjectId(matches[i])}"); + } + sb.Append('.'); + throw new ArgumentException(sb.ToString()); + } + + return matches[0]; + } + + // Not a Component, not a GameObject — an asset (e.g. ScriptableObject) handled directly. + // A 'component' filter is meaningless for an asset; reject it rather than silently ignore it + // (a supplied component here signals a misrouted or misspelled request). + if (!string.IsNullOrWhiteSpace(component)) + throw new ArgumentException( + $"Target '{target}' resolved to a {obj.GetType().Name} (an asset), which has no components. " + + "Omit --component when targeting an asset directly."); + + return obj; + } + + private static object DescribeProperty(SerializedProperty prop) + { + return new + { + name = prop.name, + path = prop.propertyPath, + propertyType = prop.propertyType.ToString(), + isArray = prop.isArray && prop.propertyType != SerializedPropertyType.String, + arrayLength = (prop.isArray && prop.propertyType != SerializedPropertyType.String) ? prop.arraySize : (int?)null, + value = SerializedPropertyConverter.GetValue(prop) + }; + } + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Scripts/SerializedFieldCommands.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Scripts/SerializedFieldCommands.cs.meta new file mode 100644 index 00000000..161e82f3 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Scripts/SerializedFieldCommands.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 974b8c0dcec74d388bbf2061fc3aa3dc diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Scripts/SerializedPropertyConverter.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Scripts/SerializedPropertyConverter.cs new file mode 100644 index 00000000..3e044207 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Scripts/SerializedPropertyConverter.cs @@ -0,0 +1,237 @@ +using System; +using Newtonsoft.Json.Linq; +using Unity.Pipeline.Editor.Authoring; +using Unity.Pipeline.Models; +using UnityEditor; +using UnityEngine; +using Object = UnityEngine.Object; + +namespace Unity.Pipeline.Editor.Commands.Scripts +{ + /// + /// Bridges agent-supplied JSON values and Unity's model for the + /// set_serialized_field / get_serialized_fields commands (CLI-195). + /// + /// Supported property kinds: integers, floats, bools, strings, enums, Vector2/3/4, Color, + /// Quaternion, Rect, Bounds, and object references. Object references accept an + /// handle (resolved via ) — assets by GUID/fileId or path, and scene + /// objects by instanceId/hierarchyPath. Arrays are addressed element-by-element via a path like + /// "myArray.Array.data[2]" (Unity's native SerializedProperty path syntax) — see the commands. + /// + public static class SerializedPropertyConverter + { + /// + /// Assign a JSON value to a serialized property, converting by the property's type. Throws + /// with a clear message when the value can't be coerced or the + /// property type isn't supported. The caller is responsible for ApplyModifiedProperties. + /// + public static void SetValue(SerializedProperty prop, JToken value) + { + // Whole-array assignment: an array/list field (Generic + isArray) set from a JSON array — + // resize, then recurse per element (handles primitive and object-reference arrays alike). + // Element-by-element addressing via "field.Array.data[i]" / "field.Array.size" still works. + if (prop.isArray && prop.propertyType != SerializedPropertyType.String) + { + if (!(value is JArray array)) + throw new ArgumentException( + $"Field '{prop.propertyPath}' is an array; provide a JSON array of elements."); + + prop.arraySize = array.Count; + for (int i = 0; i < array.Count; i++) + SetValue(prop.GetArrayElementAtIndex(i), array[i]); + return; + } + + switch (prop.propertyType) + { + case SerializedPropertyType.Integer: + prop.longValue = value.ToObject(); + break; + case SerializedPropertyType.Boolean: + prop.boolValue = value.ToObject(); + break; + case SerializedPropertyType.Float: + prop.doubleValue = value.ToObject(); + break; + case SerializedPropertyType.String: + prop.stringValue = value.ToObject(); + break; + case SerializedPropertyType.Enum: + SetEnum(prop, value); + break; + case SerializedPropertyType.Vector2: + prop.vector2Value = ToVector2(value); + break; + case SerializedPropertyType.Vector3: + prop.vector3Value = ToVector3(value); + break; + case SerializedPropertyType.Vector4: + prop.vector4Value = ToVector4(value); + break; + case SerializedPropertyType.Quaternion: + var v4 = ToVector4(value); + prop.quaternionValue = new Quaternion(v4.x, v4.y, v4.z, v4.w); + break; + case SerializedPropertyType.Color: + prop.colorValue = ToColor(value); + break; + case SerializedPropertyType.Rect: + prop.rectValue = ToRect(value); + break; + case SerializedPropertyType.Bounds: + prop.boundsValue = ToBounds(value); + break; + case SerializedPropertyType.ObjectReference: + prop.objectReferenceValue = ResolveObjectReference(value); + break; + case SerializedPropertyType.ArraySize: + // Resizing an array via ".Array.size" — the property is an int under the hood. + prop.intValue = value.ToObject(); + break; + default: + throw new ArgumentException( + $"Field '{prop.propertyPath}' has unsupported type '{prop.propertyType}'. " + + "Supported: int, float, bool, string, enum, Vector2/3/4, Quaternion, Color, Rect, Bounds, object reference, array size."); + } + } + + /// + /// Read a serialized property into a plain object suitable for JSON serialization. Object + /// references are described via so the agent gets a + /// re-usable handle; arrays are returned as a length plus per-element values. + /// + public static object GetValue(SerializedProperty prop) + { + // Array/list fields are returned as a JSON array of their elements so they round-trip with + // SetValue. (String also reports isArray, hence the exclusion.) + if (prop.isArray && prop.propertyType != SerializedPropertyType.String) + { + var elements = new JArray(); + for (int i = 0; i < prop.arraySize; i++) + { + var v = GetValue(prop.GetArrayElementAtIndex(i)); + elements.Add(v == null ? JValue.CreateNull() : JToken.FromObject(v)); + } + + return elements; + } + + switch (prop.propertyType) + { + case SerializedPropertyType.Integer: + return prop.longValue; + case SerializedPropertyType.Boolean: + return prop.boolValue; + case SerializedPropertyType.Float: + return prop.doubleValue; + case SerializedPropertyType.String: + return prop.stringValue; + case SerializedPropertyType.Enum: + return prop.enumValueIndex >= 0 && prop.enumValueIndex < prop.enumNames.Length + ? prop.enumNames[prop.enumValueIndex] + : (object)prop.intValue; + case SerializedPropertyType.Vector2: + return new { x = prop.vector2Value.x, y = prop.vector2Value.y }; + case SerializedPropertyType.Vector3: + return new { x = prop.vector3Value.x, y = prop.vector3Value.y, z = prop.vector3Value.z }; + case SerializedPropertyType.Vector4: + return new { x = prop.vector4Value.x, y = prop.vector4Value.y, z = prop.vector4Value.z, w = prop.vector4Value.w }; + case SerializedPropertyType.Quaternion: + return new { x = prop.quaternionValue.x, y = prop.quaternionValue.y, z = prop.quaternionValue.z, w = prop.quaternionValue.w }; + case SerializedPropertyType.Color: + return new { r = prop.colorValue.r, g = prop.colorValue.g, b = prop.colorValue.b, a = prop.colorValue.a }; + case SerializedPropertyType.Rect: + return new { x = prop.rectValue.x, y = prop.rectValue.y, width = prop.rectValue.width, height = prop.rectValue.height }; + case SerializedPropertyType.Bounds: + var b = prop.boundsValue; + return new { center = new { x = b.center.x, y = b.center.y, z = b.center.z }, size = new { x = b.size.x, y = b.size.y, z = b.size.z } }; + case SerializedPropertyType.ObjectReference: + return ObjectResolver.Describe(prop.objectReferenceValue); + case SerializedPropertyType.ArraySize: + return prop.intValue; + default: + // Unknown/unsupported types are reported by kind rather than failing a whole read. + return new { unsupported = prop.propertyType.ToString() }; + } + } + + private static void SetEnum(SerializedProperty prop, JToken value) + { + // Accept either the enum name (preferred, stable across reordering) or the numeric index. + if (value.Type == JTokenType.String) + { + var name = value.ToObject(); + var idx = Array.IndexOf(prop.enumNames, name); + if (idx < 0) + idx = Array.IndexOf(prop.enumDisplayNames, name); + if (idx < 0) + throw new ArgumentException( + $"Enum '{name}' is not a valid value for '{prop.propertyPath}'. Valid: {string.Join(", ", prop.enumNames)}."); + prop.enumValueIndex = idx; + } + else + { + var idx = value.ToObject(); + if (idx < 0 || idx >= prop.enumNames.Length) + throw new ArgumentException( + $"Enum index {idx} is out of range for '{prop.propertyPath}' (valid 0..{prop.enumNames.Length - 1}). " + + $"Valid values: {string.Join(", ", prop.enumNames)}."); + prop.enumValueIndex = idx; + } + } + + private static Object ResolveObjectReference(JToken value) + { + // An explicit null clears the reference; anything else MUST resolve — never silently no-op + // (an unresolved handle used to be dropped, so the command reported success while assigning + // nothing). + if (value == null || value.Type == JTokenType.Null) + return null; + + var handle = value.ToObject(); + if (handle == null || handle.IsEmpty) + throw new ArgumentException( + $"'{value}' is not a recognized object reference handle. " + + "Provide a path, guid, globalId, or instanceId (or null to clear)."); + + if (!ObjectResolver.TryResolve(handle, out var obj, out var error)) + throw new ArgumentException($"Could not resolve object reference: {error}"); + + return obj; + } + + private static float F(JToken t, string key, float fallback = 0f) + { + // Indexing a non-object token (e.g. the agent passed a number or array for a Vector3/Color) + // with a string key throws an opaque InvalidOperationException — validate first so the + // caller gets a clear, actionable ArgumentException instead. + if (!(t is JObject obj)) + throw new ArgumentException( + $"Expected a JSON object with named components (e.g. {{ \"{key}\": 0 }}) " + + $"but received a '{t?.Type.ToString() ?? "null"}'."); + + var token = obj[key]; + return token != null ? token.ToObject() : fallback; + } + + private static Vector2 ToVector2(JToken t) => new Vector2(F(t, "x"), F(t, "y")); + private static Vector3 ToVector3(JToken t) => new Vector3(F(t, "x"), F(t, "y"), F(t, "z")); + private static Vector4 ToVector4(JToken t) => new Vector4(F(t, "x"), F(t, "y"), F(t, "z"), F(t, "w")); + + private static Color ToColor(JToken t) => new Color(F(t, "r"), F(t, "g"), F(t, "b"), F(t, "a", 1f)); + + private static Rect ToRect(JToken t) => new Rect(F(t, "x"), F(t, "y"), F(t, "width"), F(t, "height")); + + private static Bounds ToBounds(JToken t) + { + if (!(t is JObject obj)) + throw new ArgumentException( + $"Expected a JSON object with 'center' and 'size' components but received a " + + $"'{t?.Type.ToString() ?? "null"}'."); + + var center = obj["center"] != null ? ToVector3(obj["center"]) : Vector3.zero; + var size = obj["size"] != null ? ToVector3(obj["size"]) : Vector3.zero; + return new Bounds(center, size); + } + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Scripts/SerializedPropertyConverter.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Scripts/SerializedPropertyConverter.cs.meta new file mode 100644 index 00000000..35a6b3dc --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/Scripts/SerializedPropertyConverter.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: ce4000d573a64d76a63e42b2b40c60a5 diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/TestCommands.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/TestCommands.cs new file mode 100644 index 00000000..88612ea8 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/TestCommands.cs @@ -0,0 +1,219 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Unity.Pipeline.Commands; +using Unity.Pipeline.Editor.Testing; +using Unity.Pipeline.Models; +using UnityEditor.TestTools.TestRunner.Api; +using UnityEngine; + +namespace Unity.Pipeline.Editor.Commands +{ + /// + /// Commands for running Unity tests programmatically + /// + public static class TestCommands + { + /// + /// Execute Unity tests with filtering options. + /// Synchronous by default (blocks until completion), async mode available with --async-tests flag. + /// + [CliCommand("run_tests", "Execute Unity tests with filtering options", MainThreadRequired = true)] + public static async Task RunTests( + [CliArg("mode", "Test mode: all, editor, playmode (default: all)")] string mode = "all", + [CliArg("filter", "Test name filter pattern (case-insensitive partial match)")] string filter = "", + [CliArg("filter_type", "Filter type: testName, assembly, category (default: testName)")] string filterType = "testName", + [CliArg("include_explicit", "Include tests marked with [Explicit] attribute")] bool includeExplicit = false, + [CliArg("async_tests", "Run asynchronously - return immediately, poll /test-status for results")] bool asyncTests = false, + [CliArg("timeout", "Test execution timeout in seconds (default: 300)")] int timeout = 300) + { + // Return the full structured response (including failures and the Error field on a + // failed run) rather than throwing: the server now awaits this Task and serializes the + // unwrapped response, so the client receives complete, structured reporting. Throwing + // would only surface an opaque message and discard the per-test results. + return await PipelineTestRunner.ExecuteTestsAsync( + mode, + filter, + filterType, + includeExplicit, + asyncTests, + timeout); + } + + /// + /// List all available tests without executing any of them. + /// Enumerates the test tree via TestRunnerApi.RetrieveTestList for the requested mode(s). + /// + [CliCommand("list_tests", "List all available tests (EditMode and/or PlayMode) without running them", MainThreadRequired = true)] + public static async Task ListTests( + [CliArg("mode", "Test mode: all, editor, playmode (default: all)")] string mode = "all") + { + try + { + if (!TryGetModes(mode, out var modes)) + { + return new TestListResponse + { + Success = false, + Command = "list_tests", + Error = $"Invalid mode '{mode}'. Use 'editor', 'playmode', or 'all'.", + ExecutedAt = DateTime.UtcNow + }; + } + + var tests = new List(); + foreach (var testMode in modes) + { + tests.AddRange(await RetrieveTestsAsync(testMode)); + } + + return new TestListResponse + { + Success = true, + Command = "list_tests", + Mode = modes.Count == 2 ? "All" : modes[0].ToString(), + Count = tests.Count, + Tests = tests, + Message = $"Found {tests.Count} test(s).", + ExecutedAt = DateTime.UtcNow + }; + } + catch (Exception ex) + { + Debug.LogError($"[TestCommands] list_tests failed: {ex.Message}"); + return new TestListResponse + { + Success = false, + Command = "list_tests", + Error = "Failed to list tests", + ErrorDetails = ex.ToString(), + ExecutedAt = DateTime.UtcNow + }; + } + } + + /// + /// Get current test status for async test execution + /// + [CliCommand("test_status", "Get status of running async test execution", MainThreadRequired = false)] + public static string GetTestStatus() + { + var status = PipelineTestRunner.GetTestStatus(); + return status ?? "{\"status\":\"no_tests\",\"message\":\"No test run in progress\"}"; + } + + /// + /// Cancel running test execution + /// + [CliCommand("cancel_tests", "Cancel running test execution", MainThreadRequired = true)] + public static object CancelTests() + { + return PipelineTestRunner.CancelTests(); + } + + /// + /// Resolve a mode string to the concrete TestMode(s) to enumerate. + /// + private static bool TryGetModes(string mode, out List modes) + { + switch (mode?.ToLowerInvariant()) + { + case null: + case "": + case "all": + modes = new List { TestMode.EditMode, TestMode.PlayMode }; + return true; + case "editor": + case "editmode": + modes = new List { TestMode.EditMode }; + return true; + case "playmode": + case "play": + modes = new List { TestMode.PlayMode }; + return true; + default: + modes = null; + return false; + } + } + + /// + /// Retrieve the test list for a single mode. RetrieveTestList enumerates the test tree (no + /// execution) and invokes the callback on the main thread; we bridge it to a Task. + /// + private static Task> RetrieveTestsAsync(TestMode testMode) + { + var api = ScriptableObject.CreateInstance(); + var tcs = new TaskCompletionSource>(); + + api.RetrieveTestList(testMode, root => + { + try + { + var items = new List(); + CollectLeafTests(root, testMode, items); + tcs.SetResult(items); + } + catch (Exception ex) + { + tcs.SetException(ex); + } + }); + + return tcs.Task; + } + + /// + /// Walk the test tree and collect leaf tests (actual test methods, not suites/fixtures). + /// + private static void CollectLeafTests(ITestAdaptor test, TestMode testMode, List items) + { + if (test == null) + return; + + if (!test.HasChildren && !test.IsSuite) + { + items.Add(new TestListItem + { + FullName = test.FullName, + Mode = testMode.ToString(), + Assembly = test.TypeInfo?.Assembly?.GetName()?.Name, + Categories = test.Categories?.ToList() ?? new List(), + Explicit = test.RunState == RunState.Explicit + }); + return; + } + + if (test.Children != null) + { + foreach (var child in test.Children) + CollectLeafTests(child, testMode, items); + } + } + } + + /// + /// Response for the list_tests command: the available tests, without execution results. + /// + [Serializable] + public class TestListResponse : CommandExecutionResponse + { + public string Mode { get; set; } // EditMode, PlayMode, or All + public int Count { get; set; } + public List Tests { get; set; } = new List(); + } + + /// + /// A single available test (no run state / outcome — this is a listing, not a result). + /// + [Serializable] + public class TestListItem + { + public string FullName { get; set; } + public string Mode { get; set; } + public string Assembly { get; set; } + public List Categories { get; set; } = new List(); + public bool Explicit { get; set; } + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/TestCommands.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/TestCommands.cs.meta new file mode 100644 index 00000000..e43426e3 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Commands/TestCommands.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 00cbe51faaafd2d488d88f72394a97d3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Console.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Console.meta new file mode 100644 index 00000000..6b510e36 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Console.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 98aa20a2d767cba16cc6922b9e5bb32b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Console/EditorConsoleCaptureBootstrap.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Console/EditorConsoleCaptureBootstrap.cs new file mode 100644 index 00000000..9fde3e5d --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Console/EditorConsoleCaptureBootstrap.cs @@ -0,0 +1,43 @@ +using UnityEditor; +using Unity.Pipeline.Console; + +namespace Unity.Pipeline.Editor.Console +{ + /// + /// Editor-only bootstrap for . The capture itself (the shared + /// buffer and the log-callback subscription) lives in the runtime assembly so it also works in + /// player builds; this type adds the two things that only make sense in the Editor: + /// + /// - [InitializeOnLoad] starts capture on every editor load and after every domain reload. + /// - Persistence to a Temp file across domain reloads, so entries and the cursor survive a + /// recompile. Players have no domain reloads, so the runtime path skips persistence. + /// + /// The static constructor restores the persisted buffer first, then starts capture, so logs are + /// never appended ahead of a restore. + /// + [InitializeOnLoad] + public static class EditorConsoleCaptureBootstrap + { + // Lives under Temp/ like the recompile status file: cleared by Unity on project-level cleanup, + // survives domain reloads, and never committed. + internal const string PersistencePath = "Temp/pipeline_console_log.json"; + + static EditorConsoleCaptureBootstrap() + { + // Restore before capture starts so restored entries precede any newly captured ones. + ConsoleLogCapture.Buffer.Load(PersistencePath); + ConsoleLogCapture.EnsureCapturing(); + + AssemblyReloadEvents.beforeAssemblyReload -= Persist; + AssemblyReloadEvents.beforeAssemblyReload += Persist; + + EditorApplication.quitting -= Persist; + EditorApplication.quitting += Persist; + } + + static void Persist() + { + ConsoleLogCapture.Buffer.Save(PersistencePath); + } + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Console/EditorConsoleCaptureBootstrap.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Console/EditorConsoleCaptureBootstrap.cs.meta new file mode 100644 index 00000000..623e9333 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Console/EditorConsoleCaptureBootstrap.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 1fb443a79f9bd099f5894c23de206319 diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/EditorPipelineManager.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/EditorPipelineManager.cs new file mode 100644 index 00000000..f5f1f433 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/EditorPipelineManager.cs @@ -0,0 +1,74 @@ +using UnityEditor; +using UnityEngine; + +namespace Unity.Pipeline.Editor +{ + /// + /// Inspectable configuration and control surface for the live editor pipeline server. This is a + /// settings asset, NOT the server's owner — owns the server + /// instance (a static owner survives domain reloads cleanly, whereas a ScriptableObject's + /// lifetime does not track the server across editor events). The owner reads this asset's config + /// when starting; the custom inspector drives Start/Stop through the owner and shows live status. + /// + /// The asset is optional: without it the owner uses the defaults below. "Pipeline/Settings" + /// creates it on demand. + /// + public class EditorPipelineManager : ScriptableObject + { + [Tooltip("HTTP port for the editor server. 0 = auto-assign from the 7800-7849 range. Applies on next start.")] + [SerializeField] private ushort m_Port = 0; + + [Tooltip("Start the server automatically when the editor loads. Applies on next editor load.")] + [SerializeField] private bool m_AutoStart = true; + + [Tooltip("Self-heal: if the HTTP listener dies without a Stop(), re-open it on a timer. " + + "Keeps auto-tick on so the editor keeps ticking while unfocused (required for the watchdog).")] + [SerializeField] private bool m_WatchdogEnabled = true; + + [Tooltip("How often the watchdog checks the listener, between 1 and 60 seconds.")] + [SerializeField] private int m_WatchdogIntervalSeconds = 5; + + [Tooltip("Log every command request/response (raw JSON) handled by the editor server to " + + "/Logs/pipeline.log. Editor only; applies live.")] + [SerializeField] private bool m_LogRequestsResponses = false; + + public int Port => m_Port; + public bool AutoStart => m_AutoStart; + public bool WatchdogEnabled => m_WatchdogEnabled; + public int WatchdogIntervalSeconds => m_WatchdogIntervalSeconds; + public bool LogRequestsResponses => m_LogRequestsResponses; + + /// Whether the live server (owned by PipelineServerStartup) is actually running. + public bool IsServerRunning => PipelineServerStartup.Server != null && PipelineServerStartup.Server.IsRunning; + + /// The port the live server is actually listening on, or 0 when stopped. + public int ActualPort => PipelineServerStartup.Server?.Port ?? 0; + + /// Start the live server (delegates to the static owner, which reads this config). + public void StartServer() => PipelineServerStartup.EnsureServerStarted(); + + /// Stop the live server. + public void StopServer() => PipelineServerStartup.StopServer(); + + /// Restart the live server. + public void RestartServer() => PipelineServerStartup.RestartServer(); + + /// + /// Load the single settings asset if one exists, otherwise null (the owner falls back to + /// defaults). No caching — assets are cheap to look up and this is only read at start/inspect. + /// + public static EditorPipelineManager Load() + { + var guids = AssetDatabase.FindAssets("t:EditorPipelineManager"); + if (guids.Length == 0) + return null; + return AssetDatabase.LoadAssetAtPath( + AssetDatabase.GUIDToAssetPath(guids[0])); + } + + private void OnValidate() + { + m_WatchdogIntervalSeconds = Mathf.Clamp(m_WatchdogIntervalSeconds, 1, 60); + } + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/EditorPipelineManager.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/EditorPipelineManager.cs.meta new file mode 100644 index 00000000..1196d74a --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/EditorPipelineManager.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9e6f601455c0e0549b841c969d30c2b7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/EditorPipelineManagerEditor.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/EditorPipelineManagerEditor.cs new file mode 100644 index 00000000..5ca7aede --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/EditorPipelineManagerEditor.cs @@ -0,0 +1,63 @@ +using UnityEditor; +using UnityEngine; + +namespace Unity.Pipeline.Editor +{ + /// + /// Custom inspector for the settings asset: shows live server + /// status (accurate running check + actual port, read from the static owner) and offers + /// Start/Stop/Restart buttons, alongside the editable configuration. Watchdog edits are pushed to + /// a running server immediately; port/autoStart apply on the next start. + /// + [CustomEditor(typeof(EditorPipelineManager))] + public class EditorPipelineManagerEditor : UnityEditor.Editor + { + public override void OnInspectorGUI() + { + var mgr = (EditorPipelineManager)target; + + EditorGUI.BeginChangeCheck(); + DrawDefaultInspector(); + if (EditorGUI.EndChangeCheck()) + { + // Push edited watchdog config to the live server (owned by PipelineServerStartup), so + // changes take effect without a restart. + var server = PipelineServerStartup.Server; + if (server != null) + { + server.WatchdogEnabled = mgr.WatchdogEnabled; + server.WatchdogIntervalSeconds = mgr.WatchdogIntervalSeconds; + server.LogRequestsResponses = mgr.LogRequestsResponses; + } + } + + EditorGUILayout.Space(); + EditorGUILayout.LabelField("Status", EditorStyles.boldLabel); + using (new EditorGUI.DisabledScope(true)) + { + EditorGUILayout.Toggle("Running", mgr.IsServerRunning); + EditorGUILayout.IntField("Actual Port", mgr.ActualPort); + } + + EditorGUILayout.Space(); + using (new EditorGUILayout.HorizontalScope()) + { + using (new EditorGUI.DisabledScope(mgr.IsServerRunning)) + { + if (GUILayout.Button("Start")) + mgr.StartServer(); + } + using (new EditorGUI.DisabledScope(!mgr.IsServerRunning)) + { + if (GUILayout.Button("Stop")) + mgr.StopServer(); + } + if (GUILayout.Button("Restart")) + mgr.RestartServer(); + } + + // Keep the live status display current while the inspector is open. + Repaint(); + } + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/EditorPipelineManagerEditor.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/EditorPipelineManagerEditor.cs.meta new file mode 100644 index 00000000..9d89150b --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/EditorPipelineManagerEditor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8a6ccaaae4fdc6f429517e759dbad721 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/EditorPipelineServer.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/EditorPipelineServer.cs new file mode 100644 index 00000000..4268982f --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/EditorPipelineServer.cs @@ -0,0 +1,101 @@ +using System; +using Unity.Pipeline.Models; +using Unity.Pipeline.Security; +using UnityEngine; + +namespace Unity.Pipeline.Editor +{ + public class EditorPipelineServer : BasePipelineServer + { + private InstanceDescriptor m_InstanceDescriptor; + + /// When true, every command transaction is written to the project transaction log. + public bool LogRequestsResponses { get; set; } + + public override DateTime StartedAt => m_InstanceDescriptor == null ? new DateTime() : m_InstanceDescriptor.StartedAt; + + protected override void ServerStarted() + { + var isAutomated = false; + foreach (var arg in System.Environment.GetCommandLineArgs()) + { + if (arg == "-automated") + { + isAutomated = true; + break; + } + } + // Only warn in an interactive Editor: batchmode (CI, upm-pvp, UTR) can't show modal + // popups, so the warning is pure noise there. + if (!isAutomated && !Application.isBatchMode) + { + Debug.LogWarning("Editor is not in automated mode. Modal Pop up might break continuous command workflow. Start the editor with -automated"); + } + } + + protected override void OnTransactionProcessed(string requestJson, string responseJson) + { + if (!LogRequestsResponses) + return; + + PipelineTransactionLog.Append(requestJson, responseJson); + } + + // Runtime-only commands (eval, reload_file_override, …) are part of the Player surface; don't + // advertise them when a client is connected to the Editor. + protected override bool IncludeRuntimeOnlyCommands => false; + protected override void CreateInstanceDescriptor() + { + // Create and write instance descriptor for CLI discovery + m_InstanceDescriptor = InstanceDescriptor.CreateCurrent(Port); + InstanceDescriptor.WriteToProjectRoot(m_InstanceDescriptor); + } + + protected override void DeleteInstanceDescriptor() + { + // Clean up instance descriptor file + if (m_InstanceDescriptor != null) + { + InstanceDescriptor.RemoveFromProjectRoot(m_InstanceDescriptor.ProjectPath); + } + m_InstanceDescriptor = null; + } + + protected override void UpdateHeartBeat() + { + // Update heartbeat in instance descriptor + if (m_InstanceDescriptor != null) + { + // Keep the port file's token current for discovery only — GetToken() validates the + // live token, so this just catches up to a rotation on the next heartbeat. + m_InstanceDescriptor.EvalToken = SecurityTokenManager.GetOrCreateToken(); + m_InstanceDescriptor.LastHeartbeat = DateTime.UtcNow; + try + { + InstanceDescriptor.WriteToProjectRoot(m_InstanceDescriptor); + } + catch (Exception ex) + { + Debug.LogWarning($"Failed to update instance descriptor: {ex.Message}"); + } + } + } + + protected override object GetServerStatus() + { + UpdateHeartBeat(); + return new + { + status = m_InstanceDescriptor == null ? "error" : "ready", + lastHeartbeat = m_InstanceDescriptor?.LastHeartbeat + }; + } + + protected override string GetToken() + { + // Validate the live token so a rotation/revocation takes effect on the next request (not + // the next heartbeat). The descriptor's EvalToken is discovery-only. + return SecurityTokenManager.GetOrCreateToken(); + } + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/EditorPipelineServer.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/EditorPipelineServer.cs.meta new file mode 100644 index 00000000..8fb37eb3 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/EditorPipelineServer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 11ba9c53c356c2c469bc37d0d370db29 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/EditorPipelineStartup.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/EditorPipelineStartup.cs new file mode 100644 index 00000000..68c3b86e --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/EditorPipelineStartup.cs @@ -0,0 +1,267 @@ +using UnityEditor; +using UnityEngine; +using Unity.Pipeline.Models; +using Unity.Pipeline.Commands; +using Unity.Pipeline.Threading; +using UnityEditor.MPE; + +namespace Unity.Pipeline.Editor +{ + /// + /// Automatically starts Pipeline HTTP server when Unity Editor loads. + /// Handles startup, domain reload persistence, and cleanup. + /// + /// Static owner of the live editor server: a static owner survives domain reloads cleanly + /// (re-created by [InitializeOnLoad]), whereas a ScriptableObject's lifetime does not track the + /// server across editor events. is an optional, inspectable + /// settings asset whose config is read here at start. + /// + [InitializeOnLoad] + public static class PipelineServerStartup + { + private static EditorPipelineServer m_Server; + + /// + /// The live editor pipeline server instance (null when stopped). Exposed so the test guard + /// can disable its watchdog for a test run and the EditorPipelineManager inspector can read + /// live status. + /// + public static EditorPipelineServer Server => m_Server; + + static PipelineServerStartup() + { + // Don't start server in AssetImportWorker processes + if (!IsMainProcess()) + return; + // Setup command discovery using TypeCache for fast Editor performance + CommandRegistry.SetDiscovery(new TypeCacheCommandDiscovery()); + + // Clean up any stale instance descriptor files from previous sessions + CleanupStaleDescriptors(); + + // Start the pipeline server (respecting the settings asset's autoStart if one exists) + if (EditorPipelineManager.Load()?.AutoStart ?? true) + StartServer(); + + // Handle domain reloads and editor shutdown + EditorApplication.playModeStateChanged += OnPlayModeStateChanged; + EditorApplication.quitting += OnEditorQuitting; + + // Handle domain reload detection + AssemblyReloadEvents.beforeAssemblyReload += OnBeforeAssemblyReload; + AssemblyReloadEvents.afterAssemblyReload += OnAfterAssemblyReload; + } + + public static void EnsureServerStarted() + { + StartServer(); + } + + /// + /// Force a clean restart of the editor pipeline server. Unlike EnsureServerStarted, this + /// works even when the current server's listener has died but still reports IsRunning + /// (e.g. after a test disrupted it). Used by tests to revive the live server they disrupted. + /// + public static void RestartServer() + { + StopServer(); + StartServer(); + } + + [MenuItem("Pipeline/Start Server")] + private static void MenuStartServer() + { + StartServer(); + if (m_Server != null && m_Server.IsRunning) + Debug.Log($"Pipeline Server started on port {m_Server.Port}"); + else + Debug.LogWarning("Pipeline Server failed to start"); + } + + [MenuItem("Pipeline/Start Server", true)] + private static bool MenuStartServerValidate() => m_Server == null || !m_Server.IsRunning; + + [MenuItem("Pipeline/Stop Server")] + private static void MenuStopServer() + { + StopServer(); + } + + [MenuItem("Pipeline/Stop Server", true)] + private static bool MenuStopServerValidate() => m_Server != null && m_Server.IsRunning; + + /// + /// Select the EditorPipelineManager settings asset, creating it under Assets/Settings/Pipeline + /// on first use (the live server otherwise runs from built-in defaults). + /// + [MenuItem("Pipeline/Settings...")] + private static void OpenSettings() + { + var mgr = EditorPipelineManager.Load(); + if (mgr == null) + { + const string folder = "Assets/Settings/Pipeline"; + if (!AssetDatabase.IsValidFolder(folder)) + { + if (!AssetDatabase.IsValidFolder("Assets/Settings")) + AssetDatabase.CreateFolder("Assets", "Settings"); + AssetDatabase.CreateFolder("Assets/Settings", "Pipeline"); + } + + mgr = ScriptableObject.CreateInstance(); + AssetDatabase.CreateAsset(mgr, folder + "/EditorPipelineManager.asset"); + AssetDatabase.SaveAssets(); + } + Selection.activeObject = mgr; + EditorGUIUtility.PingObject(mgr); + } + + internal static bool IsMainProcess() + { + // Check command line arguments for asset import worker indicators + var args = System.Environment.GetCommandLineArgs(); + for (int i = 0; i < args.Length; i++) + { + if (args[i] == "-readonly" || args[i] == "--virtual-project-clone") + return true; + } + + if (AssetDatabase.IsAssetImportWorkerProcess()) + return false; + + if (ProcessService.level != ProcessLevel.Main) + return false; + + return true; + } + + /// + /// Start the Pipeline HTTP server, reading configuration from the EditorPipelineManager + /// settings asset if one exists (otherwise using defaults). + /// + private static void StartServer() + { + if (m_Server != null && m_Server.IsRunning) + return; + + try + { + var cfg = EditorPipelineManager.Load(); + m_Server = new EditorPipelineServer + { + // Self-healing watchdog: if the listener dies without a Stop() (an unexpected fault + // outside a domain reload), the watchdog re-opens it so the dogfood loop doesn't + // wedge. Set before Start() (Start arms the watchdog). + WatchdogEnabled = cfg?.WatchdogEnabled ?? true, + WatchdogIntervalSeconds = cfg?.WatchdogIntervalSeconds ?? 5, + LogRequestsResponses = cfg?.LogRequestsResponses ?? false + }; + + // Rotate the transaction log once per Unity session (main thread; SessionState-gated). + // The append path runs off-thread and can't touch SessionState. + PipelineTransactionLog.RotateForNewSession(); + + m_Server.Start(cfg?.Port ?? 0); // 0 auto-assigns from the 7800-7849 range. + + if (m_Server.WatchdogEnabled) + { + // The watchdog rides EditorApplication.update, but a backgrounded/idle editor stops + // ticking once the listener dies (no requests left to wake it) — the exact moment the + // watchdog must run. Keep auto-tick on so the update loop keeps spinning regardless of + // focus, which keeps both the watchdog AND the dispatcher message pump alive. + Commands.AutoTickCommand.SetAutoTick(true); + } + } + catch (System.Exception ex) + { + Debug.LogError($"Failed to start Pipeline Server: {ex.Message}"); + } + } + + /// + /// Stop the Pipeline HTTP server. + /// + public static void StopServer() + { + if (m_Server != null) + { + try + { + m_Server.Stop(); + } + catch (System.Exception ex) + { + Debug.LogWarning($"Error stopping Pipeline Server: {ex.Message}"); + } + finally + { + m_Server = null; + } + } + } + + /// + /// Clean up stale instance descriptor files from previous Editor sessions. + /// + private static void CleanupStaleDescriptors() + { + var projectPath = System.IO.Path.GetDirectoryName(Application.dataPath); + + // Try to read existing descriptor + var existing = InstanceDescriptor.ReadFromProjectRoot(projectPath); + if (existing != null) + { + // Check if process is still running + try + { + var process = System.Diagnostics.Process.GetProcessById(existing.Pid); + if (process.HasExited) + { + // Process is dead, remove stale file + InstanceDescriptor.RemoveFromProjectRoot(projectPath); + } + } + catch + { + // Process doesn't exist or access denied, remove stale file + InstanceDescriptor.RemoveFromProjectRoot(projectPath); + } + } + } + + /// + /// Handle play mode state changes. + /// + private static void OnPlayModeStateChanged(PlayModeStateChange state) + { + // Server continues running through play mode changes + // Status endpoint will reflect current play mode via EditorApplication.isPlaying + } + + /// + /// Handle Editor shutdown. + /// + private static void OnEditorQuitting() + { + StopServer(); // Stop() shuts down the server's own dispatcher. + } + + /// + /// Handle before assembly reload (domain reload). + /// + private static void OnBeforeAssemblyReload() + { + // Server will be automatically recreated after reload due to [InitializeOnLoad] + // Instance descriptor file will be cleaned up and recreated + } + + /// + /// Handle after assembly reload (domain reload). + /// + private static void OnAfterAssemblyReload() + { + // Server should already be restarted via [InitializeOnLoad] + // This is mainly for logging/verification + } + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/EditorPipelineStartup.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/EditorPipelineStartup.cs.meta new file mode 100644 index 00000000..ef3bd7b8 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/EditorPipelineStartup.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4f85dcf6fb33a5047be5b7790e736674 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/PipelineTransactionLog.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/PipelineTransactionLog.cs new file mode 100644 index 00000000..c56b8e3b --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/PipelineTransactionLog.cs @@ -0,0 +1,153 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Runtime.CompilerServices; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using UnityEditor; +using UnityEngine; + +[assembly: InternalsVisibleTo("Unity.Pipeline.Tests.Editor")] + +namespace Unity.Pipeline.Editor +{ + /// + /// Appends editor pipeline request/response transactions to <project>/Logs/pipeline.log as a + /// JSON array. rotates any existing log to pipeline_old.log on + /// the first server start of a Unity session: SessionState survives domain reloads but resets on + /// editor restart, so the log accumulates across a session's server start/stop cycles and starts + /// fresh each new session. + /// + /// Rotation must run on the main thread (SessionState is main-thread only), hence it lives in + /// RotateForNewSession (called from server startup), NOT in Append — which runs on the background + /// HTTP thread and is restricted to thread-safe file I/O. + /// + internal static class PipelineTransactionLog + { + private const string SessionRotatedKey = "Unity.Pipeline.TransactionLog.SessionRotated"; + private const string LogFileName = "pipeline.log"; + private const string OldLogFileName = "pipeline_old.log"; + + // Field names are the JSON keys, so they intentionally stay lowercase. request/response are + // JToken so the raw JSON is embedded as real JSON (not a stringified blob) in the log array. + private struct Entry + { + public JToken request; + public JToken response; + public string time; + } + + /// + /// On the first call of a Unity session, back up any existing pipeline.log to pipeline_old.log + /// so the session starts with a fresh log. Gated by SessionState (resets on editor restart), + /// so domain-reload server restarts within a session do not rotate. Main thread only. + /// + public static void RotateForNewSession() + { + try + { + if (SessionState.GetBool(SessionRotatedKey, false)) + return; + + Rotate(GetLogsDirectory()); + SessionState.SetBool(SessionRotatedKey, true); + } + catch (Exception ex) + { + Debug.LogWarning($"Pipeline transaction log rotation failed: {ex.Message}"); + } + } + + /// + /// Append one transaction to the JSON-array log. Runs on the background HTTP thread, so it + /// uses only thread-safe file I/O (no Unity editor APIs). + /// + public static void Append(string requestJson, string responseJson) + { + try + { + Append(GetLogsDirectory(), requestJson, responseJson); + } + catch (Exception ex) + { + // Logging must never break request handling. + Debug.LogWarning($"Pipeline transaction log write failed: {ex.Message}"); + } + } + + /// + /// Back up an existing pipeline.log in to pipeline_old.log, + /// replacing any prior backup. No SessionState gate — exposed as the testable rotation seam. + /// + internal static void Rotate(string logsDir) + { + Directory.CreateDirectory(logsDir); + + var logPath = Path.Combine(logsDir, LogFileName); + if (!File.Exists(logPath)) + return; + + var oldPath = Path.Combine(logsDir, OldLogFileName); + if (File.Exists(oldPath)) + File.Delete(oldPath); + File.Move(logPath, oldPath); + } + + /// + /// Append a transaction to the JSON-array log in an explicit directory. Testable seam behind + /// the public . + /// + internal static void Append(string logsDir, string requestJson, string responseJson) + { + Directory.CreateDirectory(logsDir); + var logPath = Path.Combine(logsDir, LogFileName); + + var entries = ReadEntries(logPath); + entries.Add(new Entry + { + request = ToJsonToken(requestJson), + response = ToJsonToken(responseJson), + time = DateTime.UtcNow.ToString("o") + }); + + File.WriteAllText(logPath, JsonConvert.SerializeObject(entries, Formatting.Indented)); + } + + /// + /// Embed a raw JSON payload as a real JSON token. Falls back to a JSON string for empty or + /// non-JSON payloads, so the log file always stays valid JSON. + /// + private static JToken ToJsonToken(string raw) + { + if (string.IsNullOrEmpty(raw)) + return JValue.CreateNull(); + + try + { + return JToken.Parse(raw); + } + catch (JsonException) + { + return new JValue(raw); + } + } + + private static string GetLogsDirectory() + { + var projectPath = Path.GetDirectoryName(Application.dataPath); + return Path.Combine(projectPath, "Logs"); + } + + private static List ReadEntries(string logPath) + { + if (!File.Exists(logPath)) + return new List(); + + var json = File.ReadAllText(logPath); + if (string.IsNullOrEmpty(json)) + return new List(); + + return JsonConvert.DeserializeObject>(json) ?? new List(); + } + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/PipelineTransactionLog.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/PipelineTransactionLog.cs.meta new file mode 100644 index 00000000..90622168 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/PipelineTransactionLog.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 7e3c9a4b21d54f8d8b6e0c1f2a3d4e5b diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Testing.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Testing.meta new file mode 100644 index 00000000..4f35249c --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Testing.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 487c1aaaab92fe74884c8b7b0442128a +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Testing/PipelineTestRunner.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Testing/PipelineTestRunner.cs new file mode 100644 index 00000000..809ffbf9 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Testing/PipelineTestRunner.cs @@ -0,0 +1,804 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using UnityEditor; +using UnityEditor.TestTools.TestRunner.Api; +using UnityEngine; +using Newtonsoft.Json; + +namespace Unity.Pipeline.Editor.Testing +{ + /// + /// Core test execution engine supporting both synchronous and asynchronous execution modes. + /// Adapted from unity-tools with domain reload handling and dual mode support. + /// + public static class PipelineTestRunner + { + private const string TestRequestFile = "Temp/pipeline_test_request.json"; + private const string TestStatusFile = "Temp/pipeline_test_status.json"; + + private static TestRunnerApi m_ActiveApi; + private static TestResultCollector m_ActiveCollector; + + /// + /// Execute tests with the given parameters + /// + public static async Task ExecuteTestsAsync( + string mode, + string filter, + string filterType, + bool includeExplicit, + bool asyncMode, + int timeoutSeconds) + { + try + { + var parsedMode = ParseTestMode(mode); + if (!parsedMode.IsValid) + { + return CreateErrorResponse($"Invalid mode '{mode}'. Use 'editor', 'playmode', or 'all'"); + } + + // Validate filter type + var normalizedFilterType = filterType?.ToLower() ?? "testname"; + if (!string.IsNullOrEmpty(filter) && + normalizedFilterType != "testname" && normalizedFilterType != "assembly" && normalizedFilterType != "category") + { + return CreateErrorResponse($"Invalid filterType '{filterType}'. Valid options: testName, assembly, category"); + } + + // Cancel any previous run + InvalidatePreviousRun(); + + if (parsedMode.IsAll) + { + // Handle "all" mode by running both editor and playmode tests + return await ExecuteAllModesAsync(filter, normalizedFilterType, includeExplicit, asyncMode, timeoutSeconds); + } + else if (asyncMode) + { + return await ExecuteAsyncMode(parsedMode.TestMode, filter, normalizedFilterType, includeExplicit, timeoutSeconds); + } + else if (parsedMode.TestMode == TestMode.PlayMode) + { + // PlayMode entry triggers a domain reload that drops the in-flight HTTP request, + // so a synchronous playmode run can never return results over one call. Fail fast + // with guidance instead of hanging until the connection resets. + return CreateErrorResponse( + "PlayMode tests cannot run synchronously over HTTP: entering play mode triggers a " + + "domain reload that drops the request. Re-run asynchronously (run_tests --mode " + + "playmode --async_tests) and poll the test_status command for results."); + } + else + { + return await ExecuteSyncMode(parsedMode.TestMode, filter, normalizedFilterType, includeExplicit, timeoutSeconds); + } + } + catch (Exception ex) + { + Debug.LogError($"[PipelineTestRunner] Error: {ex.Message}"); + return CreateErrorResponse($"Failed to run tests: {ex.Message}"); + } + } + + /// + /// Execute tests in all modes (editor + playmode) + /// + private static async Task ExecuteAllModesAsync( + string filter, + string filterType, + bool includeExplicit, + bool asyncMode, + int timeoutSeconds) + { + if (asyncMode) + { + return CreateErrorResponse("Async mode is not supported for 'all' mode. Use 'editor' or 'playmode' for async execution."); + } + + var startTime = DateTime.UtcNow; + + try + { + // EditMode runs synchronously over HTTP (no domain reload), so its results are + // returned in this response. + Debug.Log("[PipelineTestRunner] Running editor tests (all mode)..."); + var editorResponse = await ExecuteSyncMode(TestMode.EditMode, filter, filterType, includeExplicit, timeoutSeconds); + + if (!editorResponse.Success) + { + return editorResponse; // Return error immediately + } + + // PlayMode can't run synchronously over HTTP (entering play mode triggers a domain + // reload that drops the request), so start it asynchronously and hand back a + // StatusPath. The caller polls the test_status command for the playmode results. + Debug.Log("[PipelineTestRunner] Starting playmode tests asynchronously (all mode)..."); + var playmodeStart = await ExecuteAsyncMode(TestMode.PlayMode, filter, filterType, includeExplicit, timeoutSeconds); + + if (!playmodeStart.Success) + { + return playmodeStart; // Return error immediately + } + + // Build combined response: editor results inline, playmode running async. + var duration = (DateTime.UtcNow - startTime).TotalSeconds; + return new TestExecutionResponse + { + Success = true, + Command = "run_tests", + Duration = Math.Round(duration, 2), + Mode = "All", + FilterApplied = string.IsNullOrEmpty(filter) ? null : $"{filterType}: {filter}", + ExecutionTimeMs = (int)(duration * 1000), + Summary = editorResponse.Summary, + Results = editorResponse.Results, + Result = "playmode_running", + StatusPath = playmodeStart.StatusPath, + Message = $"EditMode complete: {editorResponse.Summary.Passed}/{editorResponse.Summary.Total} passed. " + + "PlayMode tests started asynchronously — poll the test_status command for their results." + }; + } + catch (Exception ex) + { + Debug.LogError($"[PipelineTestRunner] All modes execution error: {ex.Message}"); + return CreateErrorResponse($"Failed to execute tests in all modes: {ex.Message}"); + } + } + + /// + /// Synchronous execution - blocks until completion + /// + private static async Task ExecuteSyncMode( + TestMode testMode, + string filter, + string filterType, + bool includeExplicit, + int timeoutSeconds) + { + var startTime = DateTime.UtcNow; + var api = ScriptableObject.CreateInstance(); + var collector = new TestResultCollector(); + + m_ActiveApi = api; + m_ActiveCollector = collector; + + // Set up timeout cancellation + using (var cts = new CancellationTokenSource(TimeSpan.FromSeconds(timeoutSeconds))) + { + cts.Token.Register(() => + { + Debug.Log("[PipelineTestRunner] Test execution timed out, cancelling..."); + InvalidatePreviousRun(); + }); + + try + { + // For PlayMode tests, we need to handle domain reloads + if (testMode == TestMode.PlayMode) + { + // Save request for domain reload recovery + var request = new TestRequest + { + filter = filter, + filterType = filterType, + mode = testMode.ToString(), + includeExplicit = includeExplicit, + isSync = true + }; + File.WriteAllText(TestRequestFile, JsonConvert.SerializeObject(request)); + } + + // Execute tests and wait for completion + var completionTask = ExecuteTestsInternal(api, collector, testMode, filter, filterType, includeExplicit); + var resultAdaptor = await completionTask; + + // Build response + var duration = (DateTime.UtcNow - startTime).TotalSeconds; + var response = new TestExecutionResponse + { + Success = true, + Command = "run_tests", + Duration = Math.Round(duration, 2), + Mode = testMode.ToString(), + FilterApplied = string.IsNullOrEmpty(filter) ? null : $"{filterType}: {filter}", + ExecutionTimeMs = (int)(duration * 1000), + Summary = resultAdaptor != null ? new TestSummary + { + Total = resultAdaptor.PassCount + resultAdaptor.FailCount + resultAdaptor.SkipCount + resultAdaptor.InconclusiveCount, + Passed = resultAdaptor.PassCount, + Failed = resultAdaptor.FailCount, + Skipped = resultAdaptor.SkipCount, + Inconclusive = resultAdaptor.InconclusiveCount + } : new TestSummary(), + Results = collector.Results + }; + + // Clean up PlayMode request file + CleanupRequestFile(); + + return response; + } + catch (OperationCanceledException) + { + return CreateErrorResponse("Test execution timed out"); + } + catch (Exception ex) + { + Debug.LogError($"[PipelineTestRunner] Sync execution error: {ex.Message}"); + CleanupRequestFile(); + return CreateErrorResponse($"Test execution failed: {ex.Message}"); + } + } + } + + /// + /// Asynchronous execution - returns immediately + /// + // Not async: the work here is synchronous (file I/O + a main-thread call that returns + // immediately). Returns a completed Task so callers can still await it. + private static Task ExecuteAsyncMode( + TestMode testMode, + string filter, + string filterType, + bool includeExplicit, + int timeoutSeconds) + { + try + { + // Save request to disk (survives domain reloads for PlayMode) + var request = new TestRequest + { + filter = filter, + filterType = filterType, + mode = testMode.ToString(), + includeExplicit = includeExplicit, + isSync = false + }; + File.WriteAllText(TestRequestFile, JsonConvert.SerializeObject(request)); + + // Clear any previous status + if (File.Exists(TestStatusFile)) + File.Delete(TestStatusFile); + + // Start test execution now, on the main thread (run_tests is MainThreadRequired, + // so we are inside the editor update tick that dispatched this command). Must NOT + // run on a background thread: the test runner creates a TestRunnerApi via + // ScriptableObject.CreateInstance, which is main-thread-only. RetrieveTestList + // returns immediately, so the HTTP "running" response below is still sent promptly. + StartAsyncTestExecution(testMode, filter, filterType, includeExplicit); + + return Task.FromResult(new TestExecutionResponse + { + Success = true, + Command = "run_tests", + Result = "running", + StatusPath = TestStatusFile, + Mode = testMode.ToString(), + FilterApplied = string.IsNullOrEmpty(filter) ? null : $"{filterType}: {filter}", + Message = "Tests started in async mode. Poll /test-status for results." + }); + } + catch (Exception ex) + { + Debug.LogError($"[PipelineTestRunner] Async setup error: {ex.Message}"); + return Task.FromResult(CreateErrorResponse($"Failed to start async test execution: {ex.Message}")); + } + } + + /// + /// Internal test execution logic + /// + private static async Task ExecuteTestsInternal( + TestRunnerApi api, + TestResultCollector collector, + TestMode testMode, + string filter, + string filterType, + bool includeExplicit) + { + var tcs = new TaskCompletionSource(); + + // Retrieve test list and filter + api.RetrieveTestList(testMode, (ITestAdaptor rootTest) => + { + try + { + var testNames = CollectTestNames(rootTest, filter, filterType, includeExplicit); + + if (testNames.Count == 0) + { + Debug.Log("[PipelineTestRunner] No tests to run after filtering"); + var emptyResult = CreateEmptyTestResult(); + tcs.SetResult(emptyResult); + return; + } + + Debug.Log($"[PipelineTestRunner] Running {testNames.Count} tests (explicit tests {(includeExplicit ? "included" : "excluded")})"); + + var testFilter = new Filter + { + testMode = testMode, + testNames = testNames.ToArray() + }; + + // Set up completion handling + collector.OnRunFinished = () => tcs.SetResult(collector.RootResult); + + api.RegisterCallbacks(collector); + api.Execute(new ExecutionSettings(testFilter)); + } + catch (Exception ex) + { + Debug.LogError($"[PipelineTestRunner] Error during test execution: {ex.Message}"); + tcs.SetException(ex); + } + }); + + return await tcs.Task; + } + + /// + /// Start async test execution on the main thread. Registers callbacks and kicks off the + /// run, then returns; completion is reported by the collector writing the status file. + /// Unlike the sync path, this does NOT reuse ExecuteTestsInternal (which sets its own + /// OnRunFinished to complete a Task, clobbering ours), and does NOT await. + /// + private static void StartAsyncTestExecution(TestMode testMode, string filter, string filterType, bool includeExplicit) + { + try + { + var api = ScriptableObject.CreateInstance(); + var collector = new TestResultCollector(); + + m_ActiveApi = api; + m_ActiveCollector = collector; + + // Async completion: write results for pollers. Set once, never overwritten. + collector.OnRunFinished = () => + { + WriteCompletedResults(collector); + RestoreLiveServerIfDisrupted(); // B2: self-heal if a test broke the live server. + CleanupRequestFile(); + m_ActiveApi = null; + m_ActiveCollector = null; + }; + + api.RetrieveTestList(testMode, (ITestAdaptor rootTest) => + { + try + { + var testNames = CollectTestNames(rootTest, filter, filterType, includeExplicit); + + if (testNames.Count == 0) + { + WriteStatusFile(new + { + status = "completed", + duration = 0.0, + summary = new { total = 0, passed = 0, failed = 0, skipped = 0, inconclusive = 0 }, + results = new object[0] + }); + CleanupRequestFile(); + m_ActiveApi = null; + m_ActiveCollector = null; + return; + } + + api.RegisterCallbacks(collector); + api.Execute(new ExecutionSettings(new Filter + { + testMode = testMode, + testNames = testNames.ToArray() + })); + } + catch (Exception ex) + { + Debug.LogError($"[PipelineTestRunner] Async run setup error: {ex.Message}"); + WriteStatusFile(new { status = "error", message = ex.Message }); + CleanupRequestFile(); + m_ActiveApi = null; + m_ActiveCollector = null; + } + }); + } + catch (Exception ex) + { + Debug.LogError($"[PipelineTestRunner] Async execution error: {ex.Message}"); + WriteStatusFile(new { status = "error", message = ex.Message }); + CleanupRequestFile(); + m_ActiveApi = null; + m_ActiveCollector = null; + } + } + + /// + /// Re-register a result collector to capture the completion of a PlayMode run that the + /// Unity Test Framework auto-resumes after a play-mode domain reload (see TestJobDataHolder + /// in the test-framework package). The previous collector did not survive the reload. + /// Deliberately does NOT call RetrieveTestList/api.Execute: the run is already in flight, so + /// starting another one double-executes the task list (running scene tasks during play + /// mode) and trips the runner's "too many instant steps" guard. The collector rebuilds its + /// per-test results from the RootResult tree at RunFinished, since the incremental + /// TestFinished callbacks were delivered to a collector from the previous domain. + /// + private static void ReattachResultCollector() + { + try + { + var api = ScriptableObject.CreateInstance(); + var collector = new TestResultCollector(); + + m_ActiveApi = api; + m_ActiveCollector = collector; + + collector.OnRunFinished = () => + { + WriteCompletedResults(collector); + RestoreLiveServerIfDisrupted(); + CleanupRequestFile(); + m_ActiveApi = null; + m_ActiveCollector = null; + }; + + api.RegisterCallbacks(collector); + } + catch (Exception ex) + { + Debug.LogError($"[PipelineTestRunner] Failed to reattach result collector: {ex.Message}"); + WriteStatusFile(new { status = "error", message = ex.Message }); + CleanupRequestFile(); + m_ActiveApi = null; + m_ActiveCollector = null; + } + } + + /// + /// Called after domain reload to resume pending tests + /// + [InitializeOnLoad] + public static class TestReloader + { + static TestReloader() + { + EditorApplication.delayCall += CheckForPendingTests; + } + } + + public static void CheckForPendingTests() + { + if (!File.Exists(TestRequestFile)) return; + if (File.Exists(TestStatusFile)) return; // Already completed + + try + { + var json = File.ReadAllText(TestRequestFile); + var request = JsonConvert.DeserializeObject(json); + + Debug.Log("[PipelineTestRunner] Reattaching result collector after domain reload"); + if (request.isSync) + { + // For sync mode, we can't really resume after domain reload + // The command has already timed out or failed + CleanupRequestFile(); + return; + } + + // The Unity Test Framework (TestJobDataHolder) auto-resumes the in-flight PlayMode + // run after a play-mode domain reload. We must NOT start a new run here: re-calling + // api.Execute double-starts the job, which re-runs the task list (executing scene + // tasks during play mode) and trips the runner's "too many instant steps" guard. + // We only need to re-register a collector — our previous one did not survive the + // reload — to capture the resumed run's completion. Runs on the main thread because + // CheckForPendingTests is invoked via EditorApplication.delayCall. + ReattachResultCollector(); + } + catch (Exception ex) + { + Debug.LogError($"[PipelineTestRunner] Failed to resume tests: {ex.Message}"); + WriteStatusFile(new { status = "error", message = $"Failed to resume tests: {ex.Message}" }); + CleanupRequestFile(); + } + } + + #region Utility Methods + + private struct ParsedTestMode + { + public bool IsValid { get; set; } + public bool IsAll { get; set; } + public TestMode TestMode { get; set; } + + public static ParsedTestMode Invalid => new ParsedTestMode { IsValid = false }; + public static ParsedTestMode All => new ParsedTestMode { IsValid = true, IsAll = true }; + public static ParsedTestMode Single(TestMode mode) => new ParsedTestMode { IsValid = true, IsAll = false, TestMode = mode }; + } + + private static ParsedTestMode ParseTestMode(string mode) + { + switch (mode?.ToLower()) + { + case "editor": + case "editmode": + return ParsedTestMode.Single(TestMode.EditMode); + case "playmode": + case "play": + return ParsedTestMode.Single(TestMode.PlayMode); + case "all": + return ParsedTestMode.All; + default: + return ParsedTestMode.Invalid; + } + } + + private static List CollectTestNames(ITestAdaptor test, string filter, string filterType, bool includeExplicit) + { + var testNames = new List(); + CollectTestNamesRecursive(test, testNames, filter, filterType, includeExplicit); + return testNames; + } + + private static void CollectTestNamesRecursive(ITestAdaptor test, List testNames, string filter, string filterType, bool includeExplicit) + { + if (test == null) return; + + // Skip [Explicit] tests AND [Explicit] fixtures (the whole subtree) unless includeExplicit. + // Checked at EVERY node — including suite/fixture nodes — because a class-level [Explicit] + // is not reliably propagated to [UnityTest] leaf RunState by Unity's adaptor; honoring the + // declaring type's attribute here is what makes class-level [Explicit] actually exclude. + if (!includeExplicit && IsExplicit(test)) + return; + + // Only collect leaf tests (actual test methods, not fixtures/suites) + if (!test.HasChildren && test.IsSuite == false) + { + // Apply user filter + if (!ShouldIncludeTest(test, filter, filterType)) + return; + + testNames.Add(test.FullName); + } + + // Recurse into children + if (test.Children != null) + { + foreach (var child in test.Children) + { + CollectTestNamesRecursive(child, testNames, filter, filterType, includeExplicit); + } + } + } + + /// + /// True if the test, its method, or its declaring fixture type is marked [Explicit]. + /// Class-level [Explicit] must be honored here because Unity does not always propagate it + /// to leaf RunState (notably for [UnityTest]). + /// + private static bool IsExplicit(ITestAdaptor test) + { + if (test.RunState == RunState.Explicit) + return true; + + var method = test.Method?.MethodInfo; + if (method != null && method.GetCustomAttributes(true).Any(a => a.GetType().Name == "ExplicitAttribute")) + return true; + + var type = test.TypeInfo?.Type; + if (type != null && type.GetCustomAttributes(true).Any(a => a.GetType().Name == "ExplicitAttribute")) + return true; + + return false; + } + + private static bool ShouldIncludeTest(ITestAdaptor test, string filter, string filterType) + { + if (string.IsNullOrEmpty(filter)) + return true; + + switch (filterType) + { + case "assembly": + var assemblyName = test.TypeInfo?.Assembly?.GetName()?.Name; + return assemblyName != null && + assemblyName.IndexOf(filter, StringComparison.OrdinalIgnoreCase) >= 0; + + case "testname": + return test.FullName != null && + test.FullName.IndexOf(filter, StringComparison.OrdinalIgnoreCase) >= 0; + + case "category": + return test.Categories != null && + test.Categories.Any(c => c.Equals(filter, StringComparison.OrdinalIgnoreCase)); + + default: + return true; + } + } + + private static void InvalidatePreviousRun() + { + if (m_ActiveCollector != null) + { + m_ActiveCollector.Cancel(); + + if (m_ActiveApi != null) + { + try { m_ActiveApi.UnregisterCallbacks(m_ActiveCollector); } + catch (Exception ex) + { + Debug.LogWarning($"[PipelineTestRunner] Could not unregister old collector: {ex.Message}"); + } + } + + Debug.Log("[PipelineTestRunner] Invalidated previous test run"); + } + + m_ActiveApi = null; + m_ActiveCollector = null; + } + + private static TestExecutionResponse CreateErrorResponse(string message) + { + return new TestExecutionResponse + { + Success = false, + Command = "run_tests", + Error = message, + Results = new List(), + Summary = new TestSummary() + }; + } + + private static ITestResultAdaptor CreateEmptyTestResult() + { + // This is a bit of a hack since ITestResultAdaptor is an interface + // In practice, this case should be rare (no tests matching filter) + return null; + } + + /// + /// B2 self-heal: after a test run, if a test left the live editor server disrupted (its + /// listener died, or its discovery descriptor was deleted/clobbered), restart it so the + /// dogfood loop and subsequent commands keep working instead of wedging the session. No-op + /// when the server is healthy. Runs at run completion — the watchdog is disabled during the + /// run (PipelineWatchdogTestGuard), so this is what revives the live server afterwards. + /// + private static void RestoreLiveServerIfDisrupted() + { + try + { + var server = PipelineServerStartup.Server; + var root = Path.GetDirectoryName(Application.dataPath); + var descriptor = Unity.Pipeline.Models.InstanceDescriptor.ReadFromProjectRoot(root); + + var disrupted = server == null + || !server.IsRunning + || descriptor == null + || descriptor.Port != server.Port; + + if (disrupted) + { + Debug.Log("[PipelineTestRunner] Live server was disrupted during the test run — restarting it."); + PipelineServerStartup.RestartServer(); + } + } + catch (Exception ex) + { + Debug.LogWarning($"[PipelineTestRunner] Live server restore check failed: {ex.Message}"); + } + } + + private static void WriteCompletedResults(TestResultCollector collector) + { + try + { + if (!collector.IsComplete) + { + WriteStatusFile(new { status = "error", message = "Tests did not complete" }); + return; + } + + var root = collector.RootResult; + var result = new + { + status = "completed", + duration = Math.Round(root.Duration, 2), + summary = new + { + total = root.PassCount + root.FailCount + root.SkipCount + root.InconclusiveCount, + passed = root.PassCount, + failed = root.FailCount, + skipped = root.SkipCount, + inconclusive = root.InconclusiveCount + }, + results = collector.Results.ToArray() + }; + + WriteStatusFile(result); + } + catch (Exception ex) + { + Debug.LogError($"[PipelineTestRunner] Failed to write results: {ex.Message}"); + WriteStatusFile(new { status = "error", message = ex.Message }); + } + } + + private static void WriteStatusFile(object data) + { + try + { + File.WriteAllText(TestStatusFile, JsonConvert.SerializeObject(data, Formatting.Indented)); + } + catch (Exception ex) + { + Debug.LogError($"[PipelineTestRunner] Failed to write status file: {ex.Message}"); + } + } + + private static void CleanupRequestFile() + { + try { if (File.Exists(TestRequestFile)) File.Delete(TestRequestFile); } catch { } + } + + /// + /// Get current test status (for async mode polling) + /// + public static string GetTestStatus() + { + if (File.Exists(TestStatusFile)) + return File.ReadAllText(TestStatusFile); + if (File.Exists(TestRequestFile)) + return JsonConvert.SerializeObject(new { status = "running" }); + return null; + } + + /// + /// Cancel running tests + /// + public static object CancelTests() + { + if (m_ActiveCollector == null && !File.Exists(TestRequestFile) && !File.Exists(TestStatusFile)) + return new { status = "no_tests", message = "No test run in progress." }; + + bool wasPlayMode = false; + try + { + if (File.Exists(TestRequestFile)) + { + var json = File.ReadAllText(TestRequestFile); + wasPlayMode = json.Contains("PlayMode"); + } + } + catch { } + + InvalidatePreviousRun(); + WriteStatusFile(new { status = "cancelled", message = "Test run cancelled." }); + CleanupRequestFile(); + + if (wasPlayMode && EditorApplication.isPlaying) + { + Debug.Log("[PipelineTestRunner] Exiting play mode to cancel PlayMode tests"); + EditorApplication.ExitPlaymode(); + } + + Debug.Log("[PipelineTestRunner] Test run cancelled"); + return new { status = "cancelled", message = "Test run cancelled." }; + } + + #endregion + + [Serializable] + private class TestRequest + { + public string filter; + public string filterType; + public string mode; + public bool includeExplicit; + public bool isSync; + } + } +} + diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Testing/PipelineTestRunner.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Testing/PipelineTestRunner.cs.meta new file mode 100644 index 00000000..2992d00f --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Testing/PipelineTestRunner.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b9212c4c36abc384e8bdbefe0d9892df +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Testing/TestResultCollector.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Testing/TestResultCollector.cs new file mode 100644 index 00000000..da5d736d --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Testing/TestResultCollector.cs @@ -0,0 +1,156 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using UnityEditor.TestTools.TestRunner.Api; +using UnityEngine; + +namespace Unity.Pipeline.Editor.Testing +{ + /// + /// Collects test results from Unity TestRunner API callbacks. + /// Adapted from unity-tools implementation with sync/async mode support. + /// + public class TestResultCollector : ICallbacks + { + public bool IsComplete { get; private set; } + public bool IsCancelled { get; set; } + public List Results { get; } = new List(); + public ITestResultAdaptor RootResult { get; private set; } + + // For async mode + public Action OnRunFinished { get; set; } + + // For sync mode + private TaskCompletionSource m_CompletionSource; + + public TestResultCollector() + { + m_CompletionSource = new TaskCompletionSource(); + } + + /// + /// Wait for test completion (sync mode) + /// + public Task WaitForCompletionAsync() + { + return m_CompletionSource.Task; + } + + public void RunStarted(ITestAdaptor testsToRun) + { + if (IsCancelled) return; + + IsComplete = false; + Results.Clear(); + Debug.Log($"[TestResultCollector] Run started: {testsToRun.TestCaseCount} test(s)"); + } + + public void TestStarted(ITestAdaptor test) + { + // No action needed for test start + } + + public void TestFinished(ITestResultAdaptor result) + { + if (IsCancelled) return; + if (result.Test.IsSuite) return; + + Results.Add(BuildTestResult(result)); + } + + public void RunFinished(ITestResultAdaptor result) + { + if (IsCancelled) + { + Debug.Log("[TestResultCollector] Ignoring RunFinished from cancelled run"); + return; + } + + RootResult = result; + IsComplete = true; + + // If we attached after the tests already ran (PlayMode re-registers a fresh collector + // after each play-mode domain reload, so the incremental TestFinished callbacks were + // delivered to a collector from a previous domain), rebuild from the authoritative + // result tree. The normal in-domain path leaves Results already populated. + if (Results.Count == 0) + { + CollectLeafResults(result); + } + + var total = result.PassCount + result.FailCount + result.SkipCount + result.InconclusiveCount; + Debug.Log($"[TestResultCollector] Run finished: {total} total, {result.PassCount} passed, {result.FailCount} failed"); + + // Notify async mode + OnRunFinished?.Invoke(); + + // Notify sync mode + m_CompletionSource.SetResult(result); + } + + /// + /// Cancel the test collection and notify sync waiters + /// + public void Cancel() + { + IsCancelled = true; + if (!m_CompletionSource.Task.IsCompleted) + { + m_CompletionSource.SetCanceled(); + } + } + + /// + /// Set error state and notify sync waiters + /// + public void SetError(Exception exception) + { + if (!m_CompletionSource.Task.IsCompleted) + { + m_CompletionSource.SetException(exception); + } + } + + /// + /// Recursively collect leaf (non-suite) test results from the result tree. Used at + /// RunFinished to rebuild Results when this collector was registered too late to receive + /// the incremental TestFinished callbacks (PlayMode resume after a domain reload). + /// + private void CollectLeafResults(ITestResultAdaptor result) + { + if (result == null) return; + + if (!result.Test.IsSuite && !result.Test.HasChildren) + { + Results.Add(BuildTestResult(result)); + return; + } + + if (result.Children != null) + { + foreach (var child in result.Children) + { + CollectLeafResults(child); + } + } + } + + private static TestResult BuildTestResult(ITestResultAdaptor result) + { + return new TestResult + { + FullName = result.Test.FullName, + Status = result.TestStatus.ToString(), + Duration = result.Duration, + Message = Truncate(result.Message, 10000), + StackTrace = Truncate(result.StackTrace, 10000) + }; + } + + private static string Truncate(string s, int maxLength) + { + if (s == null || s.Length <= maxLength) return s; + return s.Substring(0, maxLength) + "\n... (truncated)"; + } + } +} \ No newline at end of file diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Testing/TestResultCollector.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Testing/TestResultCollector.cs.meta new file mode 100644 index 00000000..97f68e1c --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Testing/TestResultCollector.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f4541ff42ef502f4989e8ab059df20f3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/TypeCacheCommandDiscovery.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/TypeCacheCommandDiscovery.cs new file mode 100644 index 00000000..aaf1162e --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/TypeCacheCommandDiscovery.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Reflection; +using Unity.Pipeline.Commands; +using UnityEditor; + +namespace Unity.Pipeline.Editor +{ + /// + /// Editor implementation of command discovery using Unity's TypeCache. + /// Provides fast command discovery in Editor mode via Unity's optimized caching system. + /// + public class TypeCacheCommandDiscovery : ICommandDiscovery + { + /// + /// Find all methods marked with specified attribute using TypeCache. + /// + public IEnumerable GetMethodsWithAttribute() where T : Attribute + { + return TypeCache.GetMethodsWithAttribute(); + } + } +} \ No newline at end of file diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/TypeCacheCommandDiscovery.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/TypeCacheCommandDiscovery.cs.meta new file mode 100644 index 00000000..15b703c4 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/TypeCacheCommandDiscovery.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f7f7b0f5ced14e548afee892a4014ce9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Unity.Pipeline.Editor.asmdef b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Unity.Pipeline.Editor.asmdef new file mode 100644 index 00000000..70d41e8f --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Unity.Pipeline.Editor.asmdef @@ -0,0 +1,19 @@ +{ + "name": "Unity.Pipeline.Editor", + "rootNamespace": "Unity.Pipeline.Editor", + "references": [ + "Unity.Pipeline", + "Unity.Nuget.Newtonsoft-Json" + ], + "includePlatforms": [ + "Editor" + ], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Unity.Pipeline.Editor.asmdef.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Unity.Pipeline.Editor.asmdef.meta new file mode 100644 index 00000000..0b423f33 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Editor/Unity.Pipeline.Editor.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: a3ca9b2d97442e0499ea28b681f751d9 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/LICENSE.md b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/LICENSE.md new file mode 100644 index 00000000..d786c29a --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/LICENSE.md @@ -0,0 +1,5 @@ +com.unity.pipeline copyright © 2026 Unity Technologies + +Licensed under the Unity Package Distribution License (see https://unity3d.com/legal/licenses/Unity_Package_Distribution_License ). + +Unless expressly provided otherwise, the software under this license is made available strictly on an “AS IS” BASIS WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED. Please review the license for details on these and other terms and conditions.” diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/LICENSE.md.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/LICENSE.md.meta new file mode 100644 index 00000000..6b4c589d --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/LICENSE.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: c07017e56bf04bf4992412964a20140c +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/README.md b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/README.md new file mode 100644 index 00000000..700c1a2e --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/README.md @@ -0,0 +1,91 @@ +# Unity Pipeline Package + +[![Unity Version](https://img.shields.io/badge/Unity-6.0%2B-blue.svg)](https://unity3d.com/unity/whats-new/2023.3.0) + +Transform Unity Editor into a programmable automation element for CI/CD pipelines and development workflows. The package exposes a running Unity Editor (or development Player) over a local HTTP API so external tools, scripts, or agents can execute commands remotely. + +## Install the Unity CLI + +The Pipeline package is driven through the `unity` CLI. + +macOS / Linux +``` +curl -fsSL https://public-cdn.cloud.unity3d.com/hub/prod/cli/install.sh | UNITY_CLI_CHANNEL=beta bash +``` + +Windows (PowerShell) +``` +$env:UNITY_CLI_CHANNEL='beta'; irm https://public-cdn.cloud.unity3d.com/hub/prod/cli/install.ps1 | iex +``` + +For more details, see the [CLI documentation](https://github.com/Unity-Technologies/unity-hub/tree/dev/src/cli). + +## Install the Pipeline package + +Install the package into a Unity project with: + +```bash +unity pipeline install +``` + +By default it targets the current directory (or the running Unity instance). Use `--project-path` to target a specific project: + +```bash +unity pipeline install --project-path /path/to/your/unity/project +``` + +Then open the project in the Unity Editor. The package automatically starts its HTTP server and registers the built-in commands. + +## Connect to a running Editor + +Run `unity command` with no command name to connect to a Unity instance and list its available commands: + +```bash +# Auto-discover a Unity instance from the current directory +unity command + +# Connect to a specific project +unity command --project-path /path/to/your/unity/project +``` + +Click [here](Documentation~/connectivity.md) for more details on Connectivity troubleshooting. + +## Connect to a running Player (Runtime) + +To target a running development Player instead of the Editor, use `--runtime` (by process name) or `--runtime-path` (by the location of the runtime port file). These options go **after** `command` and **before** the command name. + +```bash +# By Player process/executable name +unity command --runtime MyGame.exe runtime_status + +# By the path where the runtime port file is located +unity command --runtime-path runtime_status +``` + +`--runtime-path` points to where the `.unity-pipeline-runtime-port` file lives: + +- **Windows** — the port file sits next to the Player executable: + + ```bash + unity command --runtime-path "C:\Builds\MyGame" runtime_status + ``` + +- **macOS** — pass the path to the `.app` bundle: + + ```bash + unity command --runtime-path "/Users/me/Builds/MyGame.app" runtime_status + ``` + +Click [here](Documentation~/connectivity.md) for more details on Connectivity troubleshooting. + +## Documentation + +For the full command reference, connectivity details, runtime setup, and hot-reload guides, see the [Pipeline documentation](Documentation~/index.md). + +## License + +com.unity.package is licensed under the Unity Companion License. See [LICENSE.md](LICENSE.md) for more legal information. + +## Contributions to this repository + +We are not accepting pull requests at this time. If you find an issue with the package or would like to request a new feature, please submit a [GitHub issue](https://github.com/Unity-Technologies/com.unity.pipeline/issues). diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/README.md.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/README.md.meta new file mode 100644 index 00000000..786d10ff --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/README.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: d1a2488a30b969941afb4af17c063ad3 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime.meta new file mode 100644 index 00000000..4b3402e4 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a9bf7426ce9ccf4448467e47c849c567 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/AssemblyInfo.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/AssemblyInfo.cs new file mode 100644 index 00000000..ff198f09 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/AssemblyInfo.cs @@ -0,0 +1,6 @@ +using System.Runtime.CompilerServices; + +// Lets the runtime test assembly's PipelineClient read a server's internal Token to authenticate. +[assembly: InternalsVisibleTo("Unity.Pipeline.Tests.Runtime")] +// Lets the EditMode test assembly unit-test internal runtime utilities (e.g. MaxLengthStream). +[assembly: InternalsVisibleTo("Unity.Pipeline.Tests.Editor")] diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/AssemblyInfo.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/AssemblyInfo.cs.meta new file mode 100644 index 00000000..00451891 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/AssemblyInfo.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 87863085291527c4581eb05fcc20b47c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Commands.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Commands.meta new file mode 100644 index 00000000..ed4d6133 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Commands.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 67704748e63416c4c959bd6de99b4c4f +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Commands/CaptureRuntimeElementCommand.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Commands/CaptureRuntimeElementCommand.cs new file mode 100644 index 00000000..a588fd57 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Commands/CaptureRuntimeElementCommand.cs @@ -0,0 +1,143 @@ +#if UNITY_6000_7_OR_NEWER +using System.Collections.Generic; +using System.Linq; +using Unity.Pipeline.Commands; +using UnityEngine; +using UnityEngine.UIElements; +using Object = UnityEngine.Object; + +namespace Unity.Pipeline.Runtime.Commands +{ + /// + /// Captures a UI Toolkit from a live runtime panel to a PNG and + /// returns it base64-encoded (and writes it to disk). Runtime-only so it is available in a + /// development Player as well as the editor's Play mode. + /// + /// A runtime panel is hosted by either a or a . + /// The panel is identified by name (the asset name or the host + /// GameObject name) rather than an asset path, because a Player has no AssetDatabase. + /// + public static class CaptureRuntimeElementCommand + { + [CliCommand("capture_runtime_element", + "Capture a UI Toolkit VisualElement (by selector) from a live runtime panel (UIDocument or PanelRenderer) to a PNG; returns path + base64.", + MainThreadRequired = true, RuntimeOnly = true)] + public static CaptureElementResponse CaptureRuntimeElement( + [CliArg("panel", "Name of the target panel: matches the PanelSettings asset name or the host GameObject name (UIDocument or PanelRenderer). Optional when exactly one panel exists.")] string panel = "", + [CliArg("selector", "Element selector: '#name', '.class', a type name (e.g. Button), descendant (space) / child ('>') chains, optional pseudo-states (:checked,:hover,:focus,:active,:enabled,:disabled,:not(...)).", Required = true)] string selector = "", + [CliArg("output", "Output PNG path (absolute, or relative to Application.persistentDataPath). Defaults to a timestamped file under Application.persistentDataPath.")] string output = "") + { + if (string.IsNullOrWhiteSpace(selector)) + return CaptureElementResponse.Fail("A 'selector' is required."); + + var hosts = GatherHosts(); + if (hosts.Count == 0) + return CaptureElementResponse.Fail("No live runtime UI panels found (UIDocument or PanelRenderer). Show the UI first."); + + List matched; + string resolvedName; + if (string.IsNullOrWhiteSpace(panel)) + { + if (hosts.Count > 1) + { + var names = string.Join(", ", hosts.Select(h => h.DisplayName).Distinct()); + return CaptureElementResponse.Fail( + $"Multiple runtime panels exist; specify --panel as one of: {names}."); + } + + matched = hosts; + resolvedName = hosts[0].DisplayName; + } + else + { + matched = hosts.Where(h => h.PanelSettingsName == panel || h.GameObjectName == panel).ToList(); + if (matched.Count == 0) + { + var names = string.Join(", ", hosts.Select(h => h.DisplayName).Distinct()); + return CaptureElementResponse.Fail( + $"No live runtime panel named '{panel}'. Available: {names}."); + } + + resolvedName = panel; + } + + // Lower sorting order is drawn first (further back); query in that order so the topmost + // match is found last only if earlier panels miss. Roots that can't be resolved are skipped. + var roots = matched + .OrderBy(h => h.SortingOrder) + .Select(h => h.GetRoot()) + .Where(r => r != null) + .ToList(); + + if (roots.Count == 0) + return CaptureElementResponse.Fail( + $"Panel '{resolvedName}' has no initialized root VisualElement yet. Show the UI first."); + + var element = VisualElementCaptureSupport.ResolveElement(roots, selector, out _); + if (element == null) + return CaptureElementResponse.Fail( + $"No element matched selector '{selector}' in panel '{resolvedName}'."); + + var dir = Application.persistentDataPath; + return VisualElementCaptureSupport.CaptureAndRespond( + element, selector, $"panel:{resolvedName}", output, + relativeBaseDir: dir, defaultDir: dir, prefix: "element"); + } + + /// A live runtime UI host (UIDocument or PanelRenderer) and how to reach its root. + class Host + { + public string PanelSettingsName; + public string GameObjectName; + public float SortingOrder; + public System.Func GetRoot; + + public string DisplayName => PanelSettingsName ?? GameObjectName; + } + + static List GatherHosts() + { + var hosts = new List(); + + foreach (var doc in PipelineUtils.FindObjectsByType()) + { + var d = doc; + hosts.Add(new Host + { + PanelSettingsName = d.panelSettings != null ? d.panelSettings.name : null, + GameObjectName = d.gameObject.name, + SortingOrder = d.sortingOrder, + GetRoot = () => d.rootVisualElement + }); + } + + // PanelRenderer is a 6000.5+ UI Toolkit API; on older editors only UIDocument panels exist. + foreach (var renderer in PipelineUtils.FindObjectsByType()) + { + var r = renderer; + hosts.Add(new Host + { + PanelSettingsName = r.panelSettings != null ? r.panelSettings.name : null, + GameObjectName = r.gameObject.name, + SortingOrder = r.sortingOrder, + GetRoot = () => GetPanelRendererRoot(r) + }); + } + + return hosts; + } + + // PanelRenderer.rootVisualElement is internal; the public route to its root is a UI-reload + // callback, which fires synchronously when the panel is already initialized. Register, capture + // the root, and immediately unregister. PanelRenderer is a 6000.5+ API. + static VisualElement GetPanelRendererRoot(PanelRenderer renderer) + { + VisualElement captured = null; + PanelRenderer.VersionedUIReloadCallback callback = (pr, root, version) => captured = root; + renderer.RegisterUIReloadCallback(callback); + renderer.UnregisterUIReloadCallback(callback); + return captured; + } + } +} +#endif diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Commands/CaptureRuntimeElementCommand.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Commands/CaptureRuntimeElementCommand.cs.meta new file mode 100644 index 00000000..44372415 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Commands/CaptureRuntimeElementCommand.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 54dc75c59cc13424c9e6e0e7b237e412 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Commands/CodeEvalCommand.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Commands/CodeEvalCommand.cs new file mode 100644 index 00000000..5727a766 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Commands/CodeEvalCommand.cs @@ -0,0 +1,129 @@ +using System; +using Unity.Pipeline.Models; +using Unity.Pipeline.Compilation; +using UnityEngine; +using Unity.Pipeline.Commands; + +namespace Unity.Pipeline.Runtime.Commands +{ + /// + /// Command for evaluating C# code dynamically using Roslyn compilation. + /// Requires security token for authorization. + /// + public static class CodeEvalCommand + { + [CliCommand("eval", "Evaluate C# code dynamically using Roslyn compiler", MainThreadRequired = true)] + public static EvalResponse EvaluateCode( + [CliArg("code", "C# code to evaluate", Required = true)] string code, + [CliArg("timeout", "Timeout in milliseconds")] int timeout = 5000) + { + if (string.IsNullOrWhiteSpace(code)) + { + return EvalResponse.EvalFailure( + "Bad Request", + "Code parameter is required and cannot be empty"); + } + + return EvaluateSource(code, timeout); + } + + [CliCommand("eval_file", "Evaluate C# code read from a .cs file on disk", MainThreadRequired = true)] + public static EvalResponse EvaluateFile( + [CliArg("file", "Path to a .cs file to evaluate", Required = true)] string file, + [CliArg("timeout", "Timeout in milliseconds")] int timeout = 5000) + { + if (string.IsNullOrWhiteSpace(file)) + { + return EvalResponse.EvalFailure( + "Bad Request", + "File parameter is required and cannot be empty"); + } + + if (!file.EndsWith(".cs", StringComparison.OrdinalIgnoreCase)) + { + return EvalResponse.EvalFailure( + "Bad Request", + "File must have a .cs extension"); + } + + if (!System.IO.File.Exists(file)) + { + return EvalResponse.EvalFailure( + "Bad Request", + $"File not found: {file}"); + } + + string code; + try + { + code = System.IO.File.ReadAllText(file); + } + catch (Exception ex) + { + return EvalResponse.EvalFailure( + "Bad Request", + $"Failed to read file: {ex.Message}"); + } + + if (string.IsNullOrWhiteSpace(code)) + { + return EvalResponse.EvalFailure( + "Bad Request", + $"File is empty: {file}"); + } + + return EvaluateSource(code, timeout); + } + + /// + /// Shared evaluation path: compiles and executes the given C# source and returns the + /// response. Both the eval and eval_file commands funnel their resolved + /// source string into here. + /// + private static EvalResponse EvaluateSource(string code, int timeout) + { + var stopwatch = System.Diagnostics.Stopwatch.StartNew(); + + try + { + // Validate timeout + if (timeout <= 0 || timeout > 30000) + { + stopwatch.Stop(); + return EvalResponse.EvalFailure( + "Bad Request", + "Timeout must be between 1ms and 30000ms", + stopwatch.ElapsedMilliseconds); + } + + // Execute compilation and evaluation. We're already on the main thread + // (MainThreadRequired = true), so call the synchronous path directly. + var result = EvalCodeCompiler.CompileAndExecuteOnMainThread(code, timeout, null); + + stopwatch.Stop(); + + // Update execution time + if (result != null) + { + result.ExecutionTimeMs = stopwatch.ElapsedMilliseconds; + } + + return result ?? EvalResponse.EvalFailure( + "Unknown Error", + "Compilation returned null result", + stopwatch.ElapsedMilliseconds); + } + catch (Exception ex) + { + stopwatch.Stop(); + Debug.LogError($"Pipeline: Eval command failed: {ex.Message}"); + Debug.LogError($"Pipeline: Stack trace: {ex.StackTrace}"); + + return EvalResponse.EvalFailure( + "Execution Failed", + ex.ToString(), + stopwatch.ElapsedMilliseconds); + } + } + } +} \ No newline at end of file diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Commands/CodeEvalCommand.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Commands/CodeEvalCommand.cs.meta new file mode 100644 index 00000000..2d9d5843 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Commands/CodeEvalCommand.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: bc1d3406462d2c246a5f84dd30dd02c7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Commands/ConsoleCommand.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Commands/ConsoleCommand.cs new file mode 100644 index 00000000..a51a1c2b --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Commands/ConsoleCommand.cs @@ -0,0 +1,45 @@ +using Unity.Pipeline.Commands; +using Unity.Pipeline.Console; +using Unity.Pipeline.Models; + +namespace Unity.Pipeline.Runtime.Commands +{ + /// + /// Returns captured Unity console output. Backs the CLI's + /// console [--tail N] [--level log|warn|error] [--follow]. + /// + /// Lives in the runtime assembly, so it is available from both the Editor and player builds — + /// console capture is driven by , which runs in both contexts. + /// + /// The package has no streaming transport (the HTTP server handles one request at a time), so + /// --follow is realized client-side: the CLI polls this command, prints new entries, and + /// passes the returned back as since on the next + /// call. The flag mapping is: + /// --tail N -> tail + /// --level X -> level (minimum severity threshold) + /// --follow -> repeated calls with since = previous cursor + /// + /// Reads only the in-memory buffer (no Unity main-thread APIs), so it is marked + /// MainThreadRequired = false for fast polling. + /// + public static class ConsoleCommand + { + /// Default number of entries returned when tail is not supplied. + public const int DefaultTail = 100; + + [CliCommand("console", "Get captured Unity console output (Editor or Player; supports tail, level filtering, and follow via a cursor)", MainThreadRequired = false)] + public static ConsoleLogResponse GetConsole( + [CliArg("tail", "Maximum number of most-recent entries to return")] int tail = DefaultTail, + [CliArg("level", "Minimum severity to include: log | warn | error")] string level = ConsoleLogBuffer.LevelLog, + [CliArg("since", "Cursor: only return entries newer than this seq. Use the 'cursor' from a previous response to follow.")] long since = -1) + { + // Guard against nonsensical tail values; <= 0 would otherwise mean "unlimited" in the + // buffer, which is not what a caller passing e.g. --tail 0 expects. + if (tail <= 0) + tail = DefaultTail; + + var minSeverity = ConsoleLogBuffer.SeverityFromLevelName(level); + return ConsoleLogCapture.Buffer.Query(since, tail, minSeverity); + } + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Commands/ConsoleCommand.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Commands/ConsoleCommand.cs.meta new file mode 100644 index 00000000..597d4a81 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Commands/ConsoleCommand.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 92be7cfe398a263a7b06a4a8a00a802c diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Commands/HotReloadCommands.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Commands/HotReloadCommands.cs new file mode 100644 index 00000000..941b9113 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Commands/HotReloadCommands.cs @@ -0,0 +1,563 @@ +using System; +using System.IO; +using System.Threading.Tasks; +using Unity.Pipeline.Commands; +using Unity.Pipeline.Compilation; +using Unity.Pipeline.HotReload; +using Unity.Pipeline.Models; +using UnityEngine; + +namespace Unity.Pipeline.Runtime.Commands +{ + /// + /// CLI commands for hot reload operations. + /// Provides runtime compilation and management of hot reload files. + /// Follows existing [CliCommand] patterns and integrates with Pipeline Server. + /// + public static class HotReloadCommands + { + [CliCommand("reload_file_override", "Compile and apply hot reload file changes immediately", MainThreadRequired = true)] + internal static HotReloadResponse ReloadFileOverride( + [CliArg("filename", "Hot reload source file to compile (e.g. PlayerTweaks.cs)", Required = true)] string filename, + [CliArg("timeout", "Compilation timeout in milliseconds")] int timeout = 30000, + [CliArg("assemblyDir", "Directory to save compiled assemblies to disk (optional, default is in-memory only)")] string assemblyDir = null) + { + var stopwatch = System.Diagnostics.Stopwatch.StartNew(); + + try + { + // Validate filename input + if (string.IsNullOrWhiteSpace(filename)) + { + stopwatch.Stop(); + return HotReloadResponse.CmdFailure( + "Bad Request", + "Filename parameter is required and cannot be empty", + stopwatch.ElapsedMilliseconds); + } + + // Ensure filename ends with .cs + if (!filename.EndsWith(".cs", StringComparison.OrdinalIgnoreCase)) + { + filename += ".cs"; + } + + // Validate timeout + if (timeout <= 0 || timeout > 300000) // Max 5 minutes + { + stopwatch.Stop(); + return HotReloadResponse.CmdFailure( + "Bad Request", + "Timeout must be between 1ms and 300000ms (5 minutes)", + stopwatch.ElapsedMilliseconds); + } + + Debug.Log($"HotReload: Executing reload_file_override command (helper workflow): {filename}, timeout: {timeout}ms, assemblyDir: {assemblyDir ?? "in-memory"}"); + + // Resolve the override file path (absolute, or relative to the project root). + var fullPath = Path.IsPathRooted(filename) ? filename : Path.GetFullPath(filename); + + // In a Player build, the file must be inside the project's build-baked roots. The + // project layout cannot be resolved from a running build, so this is skipped in the + // editor (which resolves files against the live project). + if (!Application.isEditor) + { + var scopeCheck = ValidateReloadPath(fullPath, HotReloadRegistry.AllowedReloadRoots); + if (!scopeCheck.IsValid) + { + stopwatch.Stop(); + return HotReloadResponse.CmdFailure( + scopeCheck.Error, + scopeCheck.ErrorDetails, + stopwatch.ElapsedMilliseconds); + } + } + + if (!File.Exists(fullPath)) + { + stopwatch.Stop(); + return HotReloadResponse.CmdFailure( + "File Not Found", + $"Override file not found: {fullPath}", + stopwatch.ElapsedMilliseconds); + } + + // Up-front validation so a misconfigured override file produces a clear, actionable + // message instead of a confusing compiler error from generated/duplicate code. + var validation = OverrideFileValidator.Validate(File.ReadAllText(fullPath), Path.GetFileName(fullPath)); + if (!validation.IsValid) + { + stopwatch.Stop(); + return HotReloadResponse.CmdFailure( + "Invalid Override File", + validation.GetFormattedErrorMessage(), + stopwatch.ElapsedMilliseconds, + validation.Errors); + } + + // Compile and apply (helper / separate override file workflow). + var task = ExecuteHotReloadAsync(fullPath, timeout, assemblyDir); + task.Wait(); + var result = task.Result; + + stopwatch.Stop(); + + if (result != null) + { + result.ExecutionTimeMs = stopwatch.ElapsedMilliseconds; + } + + Debug.Log($"HotReload: reload_file_override completed in {stopwatch.ElapsedMilliseconds}ms, success: {result?.Success}"); + + return result ?? HotReloadResponse.CmdFailure( + "Unknown Error", + "Hot reload compilation returned null result", + stopwatch.ElapsedMilliseconds); + } + catch (Exception ex) + { + stopwatch.Stop(); + Debug.LogError($"HotReload: reload_file_override command failed: {ex.Message}"); + Debug.LogError($"HotReload: Stack trace: {ex.StackTrace}"); + + return HotReloadResponse.CmdFailure( + "Execution Failed", + ex.ToString(), + stopwatch.ElapsedMilliseconds); + } + } + + [CliCommand("reload_file", "Compile and apply in-place [HotReload] edits from a source file", MainThreadRequired = true)] + public static HotReloadResponse ReloadFile( + [CliArg("filename", "Source file containing [HotReload] methods (e.g. Assets/Scripts/Player.cs)", Required = true)] string filename, + [CliArg("timeout", "Compilation timeout in milliseconds")] int timeout = 30000, + [CliArg("assemblyDir", "Directory to save compiled assemblies to disk (optional, default is in-memory only)")] string assemblyDir = null, + [CliArg("pdb", "Emit debug symbols (portable PDB) mapped to the original source so breakpoints bind in your editor. Compiles unoptimized.")] bool pdb = false) + { + var stopwatch = System.Diagnostics.Stopwatch.StartNew(); + + try + { + if (string.IsNullOrWhiteSpace(filename)) + { + stopwatch.Stop(); + return HotReloadResponse.CmdFailure( + "Bad Request", + "Filename parameter is required and cannot be empty", + stopwatch.ElapsedMilliseconds); + } + + if (!filename.EndsWith(".cs", StringComparison.OrdinalIgnoreCase)) + { + filename += ".cs"; + } + + var fullPath = ResolveSourceFilePath(filename); + if (string.IsNullOrEmpty(fullPath)) + { + stopwatch.Stop(); + return HotReloadResponse.CmdFailure( + "File Not Found", + $"Could not locate source file: {filename}", + stopwatch.ElapsedMilliseconds); + } + + // In a Player build, the file must be inside the project's build-baked roots. The + // project layout cannot be resolved from a running build, so this is skipped in the + // editor (which resolves files against the live project). + if (!Application.isEditor) + { + var scopeCheck = ValidateReloadPath(fullPath, HotReloadRegistry.AllowedReloadRoots); + if (!scopeCheck.IsValid) + { + stopwatch.Stop(); + return HotReloadResponse.CmdFailure( + scopeCheck.Error, + scopeCheck.ErrorDetails, + stopwatch.ElapsedMilliseconds); + } + } + + Debug.Log($"HotReload: Executing reload_file command: {fullPath}, timeout: {timeout}ms, assemblyDir: {assemblyDir ?? "in-memory"}, pdb: {pdb}"); + + var task = InPlaceReloadProcessor.ProcessSourceFileAsync(fullPath, assemblyDir, pdb); + task.Wait(); + var result = task.Result; + + stopwatch.Stop(); + + if (result.Success) + { + return HotReloadResponse.CmdSuccess( + result.AssemblyName, + $"In-place hot reload successful: {result.AssemblyName} with {result.RegisteredMethods.Count} methods", + result.RegisteredMethods, + stopwatch.ElapsedMilliseconds); + } + + return HotReloadResponse.CmdFailure( + "In-Place Reload Failed", + result.ErrorMessage ?? "In-place hot reload processing failed", + stopwatch.ElapsedMilliseconds, + result.CompilationDiagnostics); + } + catch (Exception ex) + { + stopwatch.Stop(); + Debug.LogError($"HotReload: reload_file command failed: {ex.Message}"); + Debug.LogError($"HotReload: Stack trace: {ex.StackTrace}"); + + return HotReloadResponse.CmdFailure( + "Execution Failed", + ex.ToString(), + stopwatch.ElapsedMilliseconds); + } + } + + [CliCommand("cleanup_hotreload", "Remove old hot reload DLL versions and clear registry", MainThreadRequired = true, RuntimeOnly = true)] + public static HotReloadResponse CleanupHotReload( + [CliArg("assemblyDir", "Directory containing assemblies to cleanup", Required = true)] string assemblyDir, + [CliArg("force_domain_reload", "Force Unity domain reload after cleanup")] bool forceDomainReload = true) + { + var stopwatch = System.Diagnostics.Stopwatch.StartNew(); + + try + { + Debug.Log($"HotReload: Executing cleanup_hotreload command for directory: {assemblyDir}"); + + // Execute cleanup + var cleanupResult = HotReloadCompiler.CleanupHotReloadDlls(assemblyDir); + + stopwatch.Stop(); + + if (cleanupResult.Success) + { + var message = $"Cleanup successful: {cleanupResult.Message}"; + if (cleanupResult.DeletedFiles.Count > 0) + { + message += $" Files removed: {string.Join(", ", cleanupResult.DeletedFiles)}"; + } + + // Force domain reload if requested (interrupts gameplay but ensures clean state) + if (forceDomainReload && Application.isEditor) + { +#if UNITY_EDITOR + Debug.Log("HotReload: Requesting Unity domain reload to clean memory state"); + UnityEditor.EditorUtility.RequestScriptReload(); + message += " Unity domain reload requested."; +#endif + } + + Debug.Log($"HotReload: cleanup_hotreload completed successfully in {stopwatch.ElapsedMilliseconds}ms"); + + return HotReloadResponse.CmdSuccess( + "cleanup_completed", + message, + cleanupResult.DeletedFiles, + stopwatch.ElapsedMilliseconds); + } + else + { + return HotReloadResponse.CmdFailure( + "Cleanup Failed", + cleanupResult.Message, + stopwatch.ElapsedMilliseconds); + } + } + catch (Exception ex) + { + stopwatch.Stop(); + Debug.LogError($"HotReload: cleanup_hotreload command failed: {ex.Message}"); + + return HotReloadResponse.CmdFailure( + "Execution Failed", + ex.ToString(), + stopwatch.ElapsedMilliseconds); + } + } + + [CliCommand("hotreload_status", "Show current hot reload registry status and statistics", MainThreadRequired = true, RuntimeOnly = true)] + public static HotReloadResponse HotReloadStatus() + { + var stopwatch = System.Diagnostics.Stopwatch.StartNew(); + + try + { + // Get current registry stats + var stats = HotReloadRegistry.GetStats(); + + stopwatch.Stop(); + + var statusMessage = $"Hot Reload Status - " + + $"Reloadable Methods: {stats.ReloadableMethodCount}, " + + $"Active Overrides: {stats.ActiveOverrideCount}, " + + $"Loaded Types: {stats.LoadedTypeCount}"; + + Debug.Log($"HotReload: {statusMessage}"); + + return HotReloadResponse.CmdSuccess( + "status_retrieved", + statusMessage, + stats.ActiveOverrideIds, + stopwatch.ElapsedMilliseconds); + } + catch (Exception ex) + { + stopwatch.Stop(); + Debug.LogError($"HotReload: hotreload_status command failed: {ex.Message}"); + + return HotReloadResponse.CmdFailure( + "Execution Failed", + ex.ToString(), + stopwatch.ElapsedMilliseconds); + } + } + + /// + /// Validate that a resolved file path lives inside one of the allowed project roots and + /// exists on disk. "In scope" means under the Assets folder or a loaded package's location. + /// The path is normalized (collapsing any .. segments) before the scope check, so a + /// path that escapes the allowed roots via traversal is rejected. A null or empty root set + /// matches nothing, so the path is rejected as out of scope. This is a security boundary — + /// it prevents files outside the project from being compiled and injected into the assembly. + /// + public static PathValidationResult ValidateReloadPath(string resolvedPath, System.Collections.Generic.IReadOnlyCollection allowedRoots) + { + if (string.IsNullOrWhiteSpace(resolvedPath)) + { + return PathValidationResult.Invalid("Bad Request", "Resolved file path is empty."); + } + + string fullPath; + try + { + fullPath = Path.GetFullPath(resolvedPath); + } + catch (Exception ex) + { + return PathValidationResult.Invalid("Bad Request", $"Invalid path: {ex.Message}"); + } + + var underAnyRoot = false; + if (allowedRoots != null) + { + foreach (var root in allowedRoots) + { + if (string.IsNullOrWhiteSpace(root)) + { + continue; + } + + string fullRoot; + try + { + fullRoot = Path.GetFullPath(root); + } + catch + { + continue; + } + + if (IsUnderDirectory(fullPath, fullRoot)) + { + underAnyRoot = true; + break; + } + } + } + + if (!underAnyRoot) + { + return PathValidationResult.Invalid( + "Out Of Project Scope", + $"Hot reload only accepts files inside the project's baked roots (Assets/ or a loaded " + + $"package). '{fullPath}' is outside the project scope and will not be compiled."); + } + + if (!File.Exists(fullPath)) + { + return PathValidationResult.Invalid("File Not Found", $"Source file not found: {fullPath}"); + } + + return PathValidationResult.Valid(); + } + + /// + /// True when is contained within . + /// Both are expected to be normalized absolute paths. A trailing separator is appended to + /// the directory so that a sibling such as "AssetsExtra" is not treated as being under "Assets". + /// + private static bool IsUnderDirectory(string path, string directory) + { + var prefix = directory.TrimEnd(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar) + + Path.DirectorySeparatorChar; + + // Windows file systems are case-insensitive; Unix file systems are case-sensitive. + var comparison = Path.DirectorySeparatorChar == '\\' + ? StringComparison.OrdinalIgnoreCase + : StringComparison.Ordinal; + + return path.StartsWith(prefix, comparison); + } + + /// + /// Resolve source file path from various possible locations (used by the in-place command). + /// + private static string ResolveSourceFilePath(string filename) + { + if (Path.IsPathRooted(filename) && File.Exists(filename)) + { + return filename; + } + + var potentialPaths = new[] + { + Path.Combine("Assets", filename), + Path.Combine("Assets", "Scripts", filename), + filename // Project root + }; + + foreach (var path in potentialPaths) + { + if (File.Exists(path)) + { + return Path.GetFullPath(path); + } + } + + return null; + } + + /// + /// Execute hot reload compilation and application asynchronously (for separate override files). + /// + private static async Task ExecuteHotReloadAsync(string filename, int timeoutMs, string assemblyDir) + { + try + { + // Use the HotReloadCompiler to compile and apply the changes + var compileResult = await HotReloadCompiler.CompileAndApplyAsync(filename, assemblyDir); + + if (!compileResult.IsSuccess) + { + return HotReloadResponse.CmdFailure( + compileResult.Error ?? "Compilation Failed", + compileResult.ErrorDetails ?? "Hot reload compilation failed", + compileResult.ExecutionTimeMs, + compileResult.Diagnostics); + } + + // Compiled, but no override actually bound (e.g. the target is not [HotReloadWithOverrides], + // or the component is not in the scene / not in play mode). Report it rather than + // claiming success when nothing changed. + if (compileResult.RegisteredMethods.Count == 0) + { + return HotReloadResponse.CmdFailure( + "No Overrides Applied", + compileResult.Diagnostics.Count > 0 + ? "No hot reload overrides were applied:\n- " + string.Join("\n- ", compileResult.Diagnostics) + : "No [HotReloadOverrideMethod] overrides were applied. Ensure the target component is in the scene and in play mode.", + compileResult.ExecutionTimeMs, + compileResult.Diagnostics); + } + + var message = $"Hot reload successful: {compileResult.AssemblyName} with {compileResult.RegisteredMethods.Count} methods"; + var response = HotReloadResponse.CmdSuccess( + compileResult.AssemblyName, + message, + compileResult.RegisteredMethods, + compileResult.ExecutionTimeMs); + response.Diagnostics = compileResult.Diagnostics; // surface any partially-skipped overrides + return response; + } + catch (TimeoutException) + { + return HotReloadResponse.CmdFailure( + "Timeout", + $"Hot reload compilation exceeded {timeoutMs}ms timeout", + timeoutMs); + } + catch (Exception ex) + { + return HotReloadResponse.CmdFailure( + "Execution Failed", + ex.ToString(), + 0); + } + } + } + + /// + /// Response model for hot reload CLI commands. + /// Provides consistent response format for all hot reload operations. + /// + public class HotReloadResponse : CommandExecutionResponse + { + /// + /// Assembly name or operation identifier for successful operations. + /// + public string AssemblyName { get; set; } + + /// + /// List of registered method IDs or files processed. + /// + public System.Collections.Generic.List Items { get; set; } = new System.Collections.Generic.List(); + + /// + /// Compilation or processing diagnostics. + /// + public System.Collections.Generic.List Diagnostics { get; set; } = new System.Collections.Generic.List(); + + /// + /// Create a successful hot reload response. + /// + public static HotReloadResponse CmdSuccess(string assemblyName, string message, System.Collections.Generic.List items, long executionTimeMs) + { + return new HotReloadResponse + { + Success = true, + AssemblyName = assemblyName, + Message = message, + Items = items ?? new System.Collections.Generic.List(), + ExecutionTimeMs = executionTimeMs + }; + } + + /// + /// Create a failed hot reload response. + /// + public static HotReloadResponse CmdFailure(string error, string errorDetails, long executionTimeMs, System.Collections.Generic.List diagnostics = null) + { + return new HotReloadResponse + { + Success = false, + Error = error, + ErrorDetails = errorDetails, + ExecutionTimeMs = executionTimeMs, + Diagnostics = diagnostics ?? new System.Collections.Generic.List() + }; + } + } + + /// + /// Result of validating a hot reload source path. is a short category and + /// the human-readable explanation, matching the shape consumed by + /// . + /// + public class PathValidationResult + { + public bool IsValid { get; private set; } + public string Error { get; private set; } + public string ErrorDetails { get; private set; } + + public static PathValidationResult Valid() + { + return new PathValidationResult { IsValid = true }; + } + + public static PathValidationResult Invalid(string error, string errorDetails) + { + return new PathValidationResult { IsValid = false, Error = error, ErrorDetails = errorDetails }; + } + } +} \ No newline at end of file diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Commands/HotReloadCommands.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Commands/HotReloadCommands.cs.meta new file mode 100644 index 00000000..74077bc3 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Commands/HotReloadCommands.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 33ec6e594cb07434cb51fbc751ca37f2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Commands/RuntimeApplicationCommand.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Commands/RuntimeApplicationCommand.cs new file mode 100644 index 00000000..a937df13 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Commands/RuntimeApplicationCommand.cs @@ -0,0 +1,89 @@ +using Unity.Pipeline.Commands; +using UnityEngine; + +namespace Unity.Pipeline.Runtime.Commands +{ + /// + /// Runtime application control commands for Unity Player builds. + /// Provides basic application lifecycle and performance control. + /// + public static class RuntimeApplicationCommand + { + [CliCommand("quit", "Gracefully quit the Unity application", MainThreadRequired = true, RuntimeOnly = true)] + public static string QuitApplication( + [CliArg("exitCode", "Exit code for the application")] int exitCode = 0) + { + // Schedule quit on next frame to allow HTTP response to be sent + var quitObject = new GameObject("PipelineQuitScheduler"); + var quitScheduler = quitObject.AddComponent(); + quitScheduler.Initialize(exitCode); + + return $"Application quit scheduled with exit code {exitCode}"; + } + + [CliCommand("set_target_framerate", "Set the target frame rate for the application", MainThreadRequired = true, RuntimeOnly = true)] + public static string SetTargetFrameRate( + [CliArg("frameRate", "Target frame rate (-1 for platform default, 0 for unlimited)", Required = true)] int frameRate) + { + var previousFrameRate = Application.targetFrameRate; + Application.targetFrameRate = frameRate; + + var frameRateDescription = frameRate switch + { + -1 => "platform default", + 0 => "unlimited (VSync)", + _ => $"{frameRate} FPS" + }; + + return $"Target frame rate set to {frameRateDescription} (was {previousFrameRate})"; + } + + [CliCommand("set_timescale", "Set the time scale for the application", MainThreadRequired = true, RuntimeOnly = true)] + public static string SetTimeScale( + [CliArg("scale", "Time scale multiplier (0.0 to pause, 1.0 for normal speed)", Required = true)] float scale) + { + if (scale < 0f) + { + return "Error: Time scale cannot be negative"; + } + + var previousScale = Time.timeScale; + Time.timeScale = scale; + + var scaleDescription = scale switch + { + 0f => "paused", + 1f => "normal speed", + _ => $"{scale}x speed" + }; + + return $"Time scale set to {scaleDescription} (was {previousScale}x)"; + } + + /// + /// MonoBehaviour to handle delayed application quit. + /// Allows HTTP response to be sent before application terminates. + /// + private class QuitScheduler : MonoBehaviour + { + private int m_ExitCode; + private float m_QuitTime; + + public void Initialize(int exitCode) + { + m_ExitCode = exitCode; + m_QuitTime = Time.realtimeSinceStartup + 0.1f; // 100ms delay + DontDestroyOnLoad(gameObject); + } + + private void Update() + { + if (Time.realtimeSinceStartup >= m_QuitTime) + { + Debug.Log($"Pipeline: Quitting application with exit code {m_ExitCode}"); + Application.Quit(m_ExitCode); + } + } + } + } +} \ No newline at end of file diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Commands/RuntimeApplicationCommand.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Commands/RuntimeApplicationCommand.cs.meta new file mode 100644 index 00000000..d952319c --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Commands/RuntimeApplicationCommand.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e508f97d464c66347816d5281c68e276 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Commands/RuntimeInputCommand.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Commands/RuntimeInputCommand.cs new file mode 100644 index 00000000..526de177 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Commands/RuntimeInputCommand.cs @@ -0,0 +1,180 @@ +using System; +using Unity.Pipeline.Commands; +using UnityEngine; +#if ENABLE_INPUT_SYSTEM +using UnityEngine.InputSystem; +using UnityEngine.InputSystem.Controls; +using UnityEngine.InputSystem.LowLevel; +#endif + +namespace Unity.Pipeline.Runtime.Commands +{ + /// + /// + /// Input-simulation commands that drive a running Player by injecting synthetic input — the enabler + /// for automated play-testing (CLI-208). Keyboard and pointer events are injected through the Input + /// System (InputSystem.QueueEvent with a state event captured from the live device), which also + /// drives uGUI / UI Toolkit through the Input System UI module — so a simulated pointer click lands on + /// on-screen UI the same way a real one does. + /// + /// + /// Input stack: device injection requires the Input System package to be present and active + /// (ENABLE_INPUT_SYSTEM). Legacy UnityEngine.Input is poll-only and exposes no injection + /// API, so it is intentionally not supported; when the Input System is absent these commands report an + /// "unavailable" result rather than silently no-op'ing. + /// + /// Safety: these are write/destructive commands. The package has no safety-policy gate yet + /// (CAT-2509 is not implemented), so they follow the existing unguarded write-command model (cf. + /// set_target_framerate). TODO(CAT-2509): route input commands through the safety policy when it + /// lands. + /// + public static class RuntimeInputCommand + { + [CliCommand("simulate_key", "Simulate a keyboard key event (Input System). Drives the running app.", + MainThreadRequired = true, RuntimeOnly = true)] + public static InputSimulationResponse SimulateKey( + [CliArg("key", "Input System Key name, e.g. Space, W, Enter, LeftArrow", Required = true)] string key, + [CliArg("action", "down | up | press (down+up). Default: press")] string action = "press") + { +#if ENABLE_INPUT_SYSTEM + var keyboard = Keyboard.current; + if (keyboard == null) + return InputSimulationResponse.Fail("simulate_key", "No keyboard device is present."); + + if (!Enum.TryParse(key, ignoreCase: true, out var parsedKey) || parsedKey == Key.None) + return InputSimulationResponse.Fail("simulate_key", $"Unknown key '{key}'. Use an Input System Key name (e.g. Space, W, Enter)."); + + var control = keyboard[parsedKey]; + var act = Normalize(action); + switch (act) + { + case "down": + QueueButton(control, true); + break; + case "up": + QueueButton(control, false); + break; + case "press": + QueueButton(control, true); + QueueButton(control, false); + break; + default: + return InputSimulationResponse.Fail("simulate_key", $"Unknown action '{action}'. Use down | up | press."); + } + + // Flush queued events so the effect is observable synchronously to the caller. + InputSystem.Update(); + return InputSimulationResponse.Ok("simulate_key", $"key={parsedKey} action={act}"); +#else + return InputSimulationResponse.Unavailable("simulate_key"); +#endif + } + + [CliCommand("simulate_pointer", "Simulate a mouse/pointer event at screen coordinates (Input System).", + MainThreadRequired = true, RuntimeOnly = true)] + public static InputSimulationResponse SimulatePointer( + [CliArg("x", "Screen X in pixels (origin bottom-left)", Required = true)] float x, + [CliArg("y", "Screen Y in pixels (origin bottom-left)", Required = true)] float y, + [CliArg("action", "move | down | up | click (down+up). Default: click")] string action = "click", + [CliArg("button", "left | right | middle. Default: left")] string button = "left") + { +#if ENABLE_INPUT_SYSTEM + var mouse = Mouse.current; + if (mouse == null) + return InputSimulationResponse.Fail("simulate_pointer", "No mouse/pointer device is present."); + + var position = new Vector2(x, y); + var act = Normalize(action); + + ButtonControl btn; + switch (Normalize(button)) + { + case "left": btn = mouse.leftButton; break; + case "right": btn = mouse.rightButton; break; + case "middle": btn = mouse.middleButton; break; + default: + return InputSimulationResponse.Fail("simulate_pointer", $"Unknown button '{button}'. Use left | right | middle."); + } + + switch (act) + { + case "move": + QueuePointer(mouse, position, null, false); + break; + case "down": + QueuePointer(mouse, position, btn, true); + break; + case "up": + QueuePointer(mouse, position, btn, false); + break; + case "click": + QueuePointer(mouse, position, btn, true); + QueuePointer(mouse, position, btn, false); + break; + default: + return InputSimulationResponse.Fail("simulate_pointer", $"Unknown action '{action}'. Use move | down | up | click."); + } + + InputSystem.Update(); + return InputSimulationResponse.Ok("simulate_pointer", $"pos=({x},{y}) action={act} button={Normalize(button)}"); +#else + return InputSimulationResponse.Unavailable("simulate_pointer"); +#endif + } + +#if ENABLE_INPUT_SYSTEM + // Capture the device's current state into a state event, override a single control, then queue it. + // Capturing current state (rather than sending a zeroed full state) preserves any other controls + // that are already held — so chained down/up calls compose correctly. + private static void QueueButton(InputControl control, bool pressed) + { + using (StateEvent.From(control.device, out var eventPtr)) + { + control.WriteValueIntoEvent(pressed ? 1f : 0f, eventPtr); + InputSystem.QueueEvent(eventPtr); + } + } + + private static void QueuePointer(Mouse mouse, Vector2 position, ButtonControl button, bool pressed) + { + using (StateEvent.From(mouse, out var eventPtr)) + { + mouse.position.WriteValueIntoEvent(position, eventPtr); + if (button != null) + button.WriteValueIntoEvent(pressed ? 1f : 0f, eventPtr); + InputSystem.QueueEvent(eventPtr); + } + } +#endif + + private static string Normalize(string s) => (s ?? string.Empty).Trim().ToLowerInvariant(); + } + + /// + /// Structured result for an input-simulation command: whether the event was injected, and a short + /// human-readable detail (or an error / unavailable reason). + /// + [Serializable] + public class InputSimulationResponse + { + public bool Success { get; set; } + public string Command { get; set; } + public string Detail { get; set; } + public string Error { get; set; } + + public static InputSimulationResponse Ok(string command, string detail) => + new InputSimulationResponse { Success = true, Command = command, Detail = detail }; + + public static InputSimulationResponse Fail(string command, string error) => + new InputSimulationResponse { Success = false, Command = command, Error = error }; + + public static InputSimulationResponse Unavailable(string command) => + new InputSimulationResponse + { + Success = false, + Command = command, + Error = "Input simulation requires the Input System package to be present and active " + + "(ENABLE_INPUT_SYSTEM). Legacy input injection is not supported." + }; + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Commands/RuntimeInputCommand.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Commands/RuntimeInputCommand.cs.meta new file mode 100644 index 00000000..788ed9dd --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Commands/RuntimeInputCommand.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: fa9e0d957acd4b1293e4d40e83bca73f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Commands/RuntimeLogCommand.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Commands/RuntimeLogCommand.cs new file mode 100644 index 00000000..8c4e3192 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Commands/RuntimeLogCommand.cs @@ -0,0 +1,49 @@ +using Unity.Pipeline.Commands; +using UnityEngine; + +namespace Unity.Pipeline.Runtime.Commands +{ + /// + /// Runtime logging commands for Unity Player builds. + /// Provides console logging capabilities from CLI. + /// + public static class RuntimeLogCommand + { + [CliCommand("log", "Write a message to Unity console", MainThreadRequired = true, RuntimeOnly = true)] + public static string LogMessage( + [CliArg("message", "Message to log to console", Required = true)] string message, + [CliArg("level", "Log level: info, warning, error")] string level = "info") + { + if (string.IsNullOrWhiteSpace(message)) + { + return "Error: Message cannot be empty"; + } + + Debug.developerConsoleVisible = false; + var logLevel = level?.ToLowerInvariant() ?? "info"; + + switch (logLevel) + { + case "info": + case "log": + Debug.Log($"[Pipeline] {message}"); + return $"Logged info message: {message}"; + + case "warning": + case "warn": + Debug.LogWarning($"[Pipeline] {message}"); + return $"Logged warning message: {message}"; + + case "error": + case "err": + Debug.LogError($"[Pipeline] {message}"); + return $"Logged error message: {message}"; + + default: + Debug.LogWarning($"[Pipeline] Unknown log level '{level}', defaulting to info: {message}"); + Debug.Log($"[Pipeline] {message}"); + return $"Logged message with default level: {message}"; + } + } + } +} \ No newline at end of file diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Commands/RuntimeLogCommand.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Commands/RuntimeLogCommand.cs.meta new file mode 100644 index 00000000..876ab94d --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Commands/RuntimeLogCommand.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8e82ea92b18fc264faf68d664212e013 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Commands/RuntimeStatusCommand.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Commands/RuntimeStatusCommand.cs new file mode 100644 index 00000000..2e006d7b --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Commands/RuntimeStatusCommand.cs @@ -0,0 +1,162 @@ +using System; +using System.Collections.Generic; +using Unity.Pipeline.Commands; +using Unity.Pipeline.Runtime.Telemetry; +using UnityEngine; +using UnityEngine.Profiling; + +namespace Unity.Pipeline.Runtime.Commands +{ + /// + /// Runtime status information for Unity Player builds. + /// Provides Player-appropriate status without Editor-specific APIs. + /// + public static class RuntimeStatusCommand + { + [CliCommand("runtime_status", "Get comprehensive runtime application status", MainThreadRequired = true, RuntimeOnly = true)] + public static RuntimeStatusResponse GetRuntimeStatus() + { + try + { + return new RuntimeStatusResponse + { + // Application info + UnityVersion = Application.unityVersion, + Platform = Application.platform.ToString(), + BuildGuid = Application.buildGUID, + Version = Application.version, + + // Runtime state + IsPlaying = true, // Always true in Player builds + TargetFrameRate = Application.targetFrameRate, + TimeScale = Time.timeScale, + RealTimeSinceStartup = Time.realtimeSinceStartup, + + // Performance info + FrameCount = Time.frameCount, + LoadedLevelName = UnityEngine.SceneManagement.SceneManager.GetActiveScene().name, + LoadedLevelBuildIndex = UnityEngine.SceneManagement.SceneManager.GetActiveScene().buildIndex, + + // Live performance telemetry (fps, frame time, memory, profiler counters) + Performance = BuildPerformanceTelemetry(), + + // Timestamp + Timestamp = DateTime.UtcNow + }; + } + catch (Exception ex) + { + Debug.LogError($"Pipeline: Runtime status command failed: {ex.Message}"); + throw; + } + } + + /// + /// Assemble the live performance section from two independent sources: + /// the per-frame (fps / frame time / profiler counters), which only + /// exists while a is feeding it, and the Profiler memory APIs, + /// which can be read on demand at any time. Frame-stat fields stay at their defaults (and + /// stays false) when no sampler is + /// running — e.g. in EditMode tests — so a missing sampler degrades gracefully rather than throwing. + /// + private static RuntimePerformanceTelemetry BuildPerformanceTelemetry() + { + var perf = new RuntimePerformanceTelemetry(); + + var sampler = FrameStatsSampler.Shared; + if (sampler != null) + { + var snap = sampler.GetSnapshot(); + perf.FrameStatsAvailable = snap.Available; + perf.SampleWindow = snap.SampleWindow; + perf.Fps = snap.Fps; + perf.AverageFrameTimeMs = snap.AverageFrameTimeMs; + perf.MinFrameTimeMs = snap.MinFrameTimeMs; + perf.MaxFrameTimeMs = snap.MaxFrameTimeMs; + perf.LastFrameTimeMs = snap.LastFrameTimeMs; + perf.GpuTimingAvailable = snap.GpuTimingAvailable; + perf.CpuFrameTimeMs = snap.CpuFrameTimeMs; + perf.GpuFrameTimeMs = snap.GpuFrameTimeMs; + perf.Counters = snap.Counters; + } + else + { + perf.Counters = new Dictionary(); + } + + // Memory is sampled directly (no per-frame accumulation needed). These return 0 in a + // non-development build where the profiler is stripped, which is reported faithfully. + perf.TotalAllocatedMemory = Profiler.GetTotalAllocatedMemoryLong(); + perf.TotalReservedMemory = Profiler.GetTotalReservedMemoryLong(); + perf.MonoUsedSize = Profiler.GetMonoUsedSizeLong(); + perf.MonoHeapSize = Profiler.GetMonoHeapSizeLong(); + perf.GcMemory = GC.GetTotalMemory(false); + + return perf; + } + } + + /// + /// Response model for runtime status information. + /// + [Serializable] + public class RuntimeStatusResponse + { + // Application Information + public string UnityVersion { get; set; } + public string Platform { get; set; } + public string BuildGuid { get; set; } + public string Version { get; set; } + + // Runtime State + public bool IsPlaying { get; set; } // Always true for Player builds + public int TargetFrameRate { get; set; } + public float TimeScale { get; set; } + public float RealTimeSinceStartup { get; set; } + + // Performance Information + public int FrameCount { get; set; } + public string LoadedLevelName { get; set; } + public int LoadedLevelBuildIndex { get; set; } + + // Live performance telemetry + public RuntimePerformanceTelemetry Performance { get; set; } + + // Metadata + public DateTime Timestamp { get; set; } + } + + /// + /// Live performance telemetry for a running Player: rolling fps / frame-time statistics, optional + /// CPU/GPU frame timing, memory usage, and a map of profiler counters. Frame-stat and counter fields + /// are populated from the per-frame ; memory fields are read on demand. + /// + [Serializable] + public class RuntimePerformanceTelemetry + { + // Frame timing — sampled over a rolling window by the RuntimePipelineManager. + /// False when no sampler is running; the fps / frame-time fields below are then meaningless. + public bool FrameStatsAvailable { get; set; } + public int SampleWindow { get; set; } + public float Fps { get; set; } + public float AverageFrameTimeMs { get; set; } + public float MinFrameTimeMs { get; set; } + public float MaxFrameTimeMs { get; set; } + public float LastFrameTimeMs { get; set; } + + // CPU/GPU frame timing via FrameTimingManager (not available on every platform). + public bool GpuTimingAvailable { get; set; } + public double CpuFrameTimeMs { get; set; } + public double GpuFrameTimeMs { get; set; } + + // Memory (bytes) via the Profiler API; 0 when the profiler is stripped (non-development build). + public long TotalAllocatedMemory { get; set; } + public long TotalReservedMemory { get; set; } + public long MonoUsedSize { get; set; } + public long MonoHeapSize { get; set; } + public long GcMemory { get; set; } + + // Profiler counters by reported name (e.g. DrawCalls, Triangles, GcAllocInFrame). + public Dictionary Counters { get; set; } + } +} \ No newline at end of file diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Commands/RuntimeStatusCommand.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Commands/RuntimeStatusCommand.cs.meta new file mode 100644 index 00000000..3ae73653 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Commands/RuntimeStatusCommand.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 846a260c41f6d8f4583f1473632c1d62 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Commands/VisualElementCaptureSupport.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Commands/VisualElementCaptureSupport.cs new file mode 100644 index 00000000..f04c6f3d --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Commands/VisualElementCaptureSupport.cs @@ -0,0 +1,444 @@ +#if UNITY_6000_7_OR_NEWER +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Text; +using Newtonsoft.Json; +using UnityEngine; +using UnityEngine.Rendering; +using UnityEngine.UIElements; +using Object = UnityEngine.Object; + +namespace Unity.Pipeline.Runtime.Commands +{ + /// + /// Shared, runtime-safe helpers behind the visual-element capture commands + /// (capture_editor_element and capture_runtime_element). Lives in the runtime + /// assembly with no UnityEditor dependency so both the Editor command and the + /// player-side runtime command can use it. + /// + /// Capture uses (runtime + /// module) and encodes the PNG here, rather than the editor-only + /// VisualElementCaptureEditorExtensions.CaptureToPNG, so the same path works in a Player. + /// + /// Element selection maps a small USS-like selector string onto UQuery's public + /// (the engine's USS string parser is internal). Supported: + /// descendant (space) and child (>) combinators; each simple part is + /// Type#name.class1.class2 (any subset); optional pseudo-state suffixes + /// :checked :hover :focus :active :enabled :disabled and :not(<state>). + /// + public static class VisualElementCaptureSupport + { + /// + /// Returns a failure response when no GPU is available (batchmode/headless), where a capture + /// would read back a blank image; otherwise returns null (capture may proceed). + /// + public static CaptureElementResponse GpuUnavailableResponse() + { + if (SystemInfo.graphicsDeviceType == GraphicsDeviceType.Null) + return CaptureElementResponse.Fail("No GPU available (batchmode/headless); cannot capture."); + return null; + } + + /// + /// Resolve the first under matching + /// , or null if the selector is empty/invalid or nothing matches. + /// + public static VisualElement ResolveElement(VisualElement root, string selector) + { + if (root == null || string.IsNullOrWhiteSpace(selector)) + return null; + + if (!TryBuildQuery(root, selector, out var query)) + return null; + + return query.First(); + } + + /// + /// Resolve the selector against each root in order, returning the first match (and the root + /// it was found under via ), or null if none match. + /// + public static VisualElement ResolveElement(IEnumerable roots, string selector, + out VisualElement matchedRoot) + { + matchedRoot = null; + if (roots == null) + return null; + + foreach (var root in roots) + { + var element = ResolveElement(root, selector); + if (element != null) + { + matchedRoot = root; + return element; + } + } + + return null; + } + + /// + /// Capture to PNG bytes at its own pixel size. Restores the active + /// RenderTexture and releases all temporaries so the capture leaves no global render state. + /// Throws for camera-drawn (world-space) or detached + /// panels (surfaced from ). + /// + public static byte[] CaptureElementToPng(VisualElement element, out int width, out int height) + { + if (element == null) + throw new ArgumentNullException(nameof(element)); + + var rt = element.CaptureToRenderTexture(); + var prevActive = RenderTexture.active; + Texture2D tex = null; + try + { + width = rt.width; + height = rt.height; + + RenderTexture.active = rt; + tex = new Texture2D(rt.width, rt.height, TextureFormat.RGBA32, false); + tex.ReadPixels(new Rect(0, 0, rt.width, rt.height), 0, 0, false); + tex.Apply(false, false); + return tex.EncodeToPNG(); + } + finally + { + RenderTexture.active = prevActive; + rt.Release(); + DestroyObject(rt); + if (tex != null) + DestroyObject(tex); + } + } + + /// + /// Resolve the output path. An explicit rooted path is used as-is; an explicit relative path + /// is resolved against ; an empty path produces a + /// timestamped <prefix>_yyyyMMdd_HHmmss_fff.png file under + /// . + /// + public static string ResolveOutputPath(string output, string relativeBaseDir, string defaultDir, string prefix) + { + if (!string.IsNullOrWhiteSpace(output)) + { + return Path.IsPathRooted(output) + ? output + : Path.GetFullPath(Path.Combine(relativeBaseDir, output)); + } + + var stamp = DateTime.Now.ToString("yyyyMMdd_HHmmss_fff", CultureInfo.InvariantCulture); + return Path.Combine(defaultDir, $"{prefix}_{stamp}.png"); + } + + /// Write PNG bytes to , creating the directory if needed. + public static void WritePng(string path, byte[] png) + { + var dir = Path.GetDirectoryName(path); + if (!string.IsNullOrEmpty(dir)) + Directory.CreateDirectory(dir); + File.WriteAllBytes(path, png); + } + + /// + /// Capture the resolved , write the PNG to disk, and build a + /// populated success response (or a failure response if the panel cannot be captured). This + /// is the shared tail both commands run once they have an element + a panel root. + /// + public static CaptureElementResponse CaptureAndRespond(VisualElement element, string selector, + string source, string output, string relativeBaseDir, string defaultDir, string prefix) + { + var gpuGuard = GpuUnavailableResponse(); + if (gpuGuard != null) + return gpuGuard; + + try + { + var png = CaptureElementToPng(element, out var width, out var height); + var path = ResolveOutputPath(output, relativeBaseDir, defaultDir, prefix); + WritePng(path, png); + + return new CaptureElementResponse + { + Success = true, + Selector = selector, + Source = source, + Path = path, + Width = width, + Height = height, + Encoding = "png", + Base64 = Convert.ToBase64String(png), + Bytes = png.Length, + Message = $"Captured {source} to {path}" + }; + } + catch (InvalidOperationException ex) + { + // The capture API throws this for camera-drawn (world-space) or detached panels. + return CaptureElementResponse.Fail(ex.Message); + } + catch (Exception ex) + { + return CaptureElementResponse.Fail($"Failed to capture '{selector}' from {source}: {ex.Message}"); + } + } + + // ---- Selector parsing ------------------------------------------------------------------- + + // Build a UQuery from the selector, mapping tokens onto the public UQueryBuilder fluent API. + static bool TryBuildQuery(VisualElement root, string selector, out UQueryBuilder query) + { + query = root.Query(); + + var parts = Tokenize(selector); + if (parts.Count == 0) + return false; + + for (int i = 0; i < parts.Count; i++) + { + var (isChild, partStr) = parts[i]; + if (!TryParsePart(partStr, out var part)) + return false; + + if (i == 0) + query = query.Name(part.Name); + else + query = isChild + ? query.Children(part.Name) + : query.Descendents(part.Name); + + foreach (var cls in part.Classes) + query = query.Class(cls); + + if (part.Type != null) + { + var typeName = part.Type; + query = query.Where(e => TypeNameMatches(e, typeName)); + } + + foreach (var pseudo in part.Pseudos) + { + if (!TryApplyPseudo(ref query, pseudo.Name, pseudo.Negate)) + return false; + } + } + + return true; + } + + // Split a selector into simple parts, flagging each with whether it follows a '>' (child) + // combinator. Whitespace separates descendant parts; '>' is treated as its own token. + static List<(bool isChild, string part)> Tokenize(string selector) + { + var result = new List<(bool, string)>(); + var raw = selector.Replace(">", " > ") + .Split((char[])null, StringSplitOptions.RemoveEmptyEntries); + + bool nextIsChild = false; + foreach (var token in raw) + { + if (token == ">") + { + nextIsChild = true; + continue; + } + + result.Add((nextIsChild, token)); + nextIsChild = false; + } + + return result; + } + + class SelectorPart + { + public string Type; + public string Name; + public readonly List Classes = new List(); + public readonly List<(bool Negate, string Name)> Pseudos = new List<(bool, string)>(); + } + + // Parse "Type#name.class1.class2" with optional ":pseudo" / ":not(pseudo)" suffixes. + static bool TryParsePart(string raw, out SelectorPart part) + { + part = new SelectorPart(); + + var simple = ExtractPseudos(raw, part.Pseudos); + if (simple == null) + return false; + + int i = 0; + var sb = new StringBuilder(); + + // Leading run (before any '#' or '.') is the type token. + while (i < simple.Length && simple[i] != '#' && simple[i] != '.') + sb.Append(simple[i++]); + if (sb.Length > 0) + { + var type = sb.ToString(); + if (type != "*") + part.Type = type; + } + + while (i < simple.Length) + { + char kind = simple[i++]; + sb.Clear(); + while (i < simple.Length && simple[i] != '#' && simple[i] != '.') + sb.Append(simple[i++]); + + var value = sb.ToString(); + if (value.Length == 0) + return false; // dangling '#' or '.' + + if (kind == '#') + { + if (part.Name != null) + return false; // more than one id + part.Name = value; + } + else + { + part.Classes.Add(value); + } + } + + return true; + } + + // Strip ":pseudo" and ":not(pseudo)" suffixes into 'pseudos', returning the simple-selector + // remainder, or null if a pseudo is malformed. + static string ExtractPseudos(string raw, List<(bool Negate, string Name)> pseudos) + { + int idx; + while ((idx = raw.IndexOf(':')) >= 0) + { + var head = raw.Substring(0, idx); + var rest = raw.Substring(idx + 1); + + if (rest.StartsWith("not(", StringComparison.Ordinal)) + { + int close = rest.IndexOf(')'); + if (close < 0) + return null; + var inner = rest.Substring(4, close - 4).Trim().TrimStart(':'); + if (inner.Length == 0) + return null; + pseudos.Add((true, inner.ToLowerInvariant())); + raw = head + rest.Substring(close + 1); + } + else + { + int next = rest.IndexOf(':'); + var name = next < 0 ? rest : rest.Substring(0, next); + if (name.Length == 0) + return null; + pseudos.Add((false, name.ToLowerInvariant())); + raw = head + (next < 0 ? string.Empty : rest.Substring(next)); + } + } + + return raw; + } + + // Apply one pseudo-state to the query, honoring negation. Returns false for an unknown state. + static bool TryApplyPseudo(ref UQueryBuilder query, string name, bool negate) + { + bool on = !negate; + switch (name) + { + case "checked": query = on ? query.Checked() : query.NotChecked(); return true; + case "hover": query = on ? query.Hovered() : query.NotHovered(); return true; + case "focus": query = on ? query.Focused() : query.NotFocused(); return true; + case "active": query = on ? query.Active() : query.NotActive(); return true; + case "enabled": query = on ? query.Enabled() : query.NotEnabled(); return true; + case "disabled": query = on ? query.NotEnabled() : query.Enabled(); return true; + default: return false; + } + } + + // Match a type token against the element's runtime type name or any of its base type names, + // so "Button" matches a Button and "VisualElement" matches everything. Avoids reflecting the + // generic OfType over a runtime-resolved Type. + static bool TypeNameMatches(VisualElement element, string typeName) + { + for (var t = element.GetType(); t != null && t != typeof(object); t = t.BaseType) + { + if (string.Equals(t.Name, typeName, StringComparison.Ordinal)) + return true; + } + return false; + } + + static void DestroyObject(Object obj) + { +#if UNITY_EDITOR + if (!Application.isPlaying) + { + Object.DestroyImmediate(obj); + return; + } +#endif + Object.Destroy(obj); + } + } + + /// + /// Result of a visual-element capture command: the PNG payload (base64), its dimensions, the + /// panel/source it was rendered from, and the path it was written to. JSON property names mirror + /// the GameView capture command's result shape (PR #13) for easy convergence later. + /// + [Serializable] + public class CaptureElementResponse + { + /// Whether the capture succeeded. + [JsonProperty("success")] + public bool Success { get; set; } + + /// Human-readable message (the error text on failure). + [JsonProperty("message")] + public string Message { get; set; } + + /// The selector used to locate the element. + [JsonProperty("selector")] + public string Selector { get; set; } + + /// What was captured, e.g. "window:Inspector" or "panel:MainUI". + [JsonProperty("source")] + public string Source { get; set; } + + /// Absolute filesystem path the PNG was written to. + [JsonProperty("path")] + public string Path { get; set; } + + /// Captured width in pixels. + [JsonProperty("width")] + public int Width { get; set; } + + /// Captured height in pixels. + [JsonProperty("height")] + public int Height { get; set; } + + /// Image encoding; always "png". + [JsonProperty("encoding")] + public string Encoding { get; set; } + + /// Base64-encoded PNG bytes. + [JsonProperty("base64")] + public string Base64 { get; set; } + + /// Length of the raw PNG byte array. + [JsonProperty("bytes")] + public int Bytes { get; set; } + + public static CaptureElementResponse Fail(string message) => new CaptureElementResponse + { + Success = false, + Message = message + }; + } +} +#endif diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Commands/VisualElementCaptureSupport.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Commands/VisualElementCaptureSupport.cs.meta new file mode 100644 index 00000000..4c2af275 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Commands/VisualElementCaptureSupport.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3e2225ea88f5b5a4c9be3afc9c5d9f4e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common.meta new file mode 100644 index 00000000..614ed4af --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c9f4a11d82a4dd54d93200f6c3aa4678 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/BasePipelineServer.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/BasePipelineServer.cs new file mode 100644 index 00000000..f83a67ae --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/BasePipelineServer.cs @@ -0,0 +1,1177 @@ +using System; +using System.IO; +using System.Linq; +using System.Net; +using System.Text; +using System.Threading.Tasks; +using Unity.Pipeline.Models; +using Unity.Pipeline.Commands; +using Unity.Pipeline.Security; +using Unity.Pipeline.Threading; +using UnityEngine; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; + +namespace Unity.Pipeline +{ + /// + /// HTTP server that enables CLI tools to execute commands in Unity Editor. + /// Represents an Instance that can serve as a Pipeline Element for automation. + /// + public abstract class BasePipelineServer + { + /// + /// Maximum accepted request body size (1 MiB). Requests larger than this are rejected with + /// 413 to bound the memory a single remote request can force the server to buffer. + /// + private const long MaxRequestBodyBytes = 1 * 1024 * 1024; + + /// + /// Upper bound on how many bytes we read-and-discard from an over-limit request body before + /// sending the 413. HttpListener resets the TCP connection if we close the response while the + /// client is still uploading, and the client then sees a connection error instead of the 413. + /// Draining lets the client finish so it can read the response. Kept comfortably above + /// to cover clients only slightly over the cap, while still + /// bounding the work a single abusive request can force (a larger body simply resets). + /// + private const long MaxDrainBytes = 8 * 1024 * 1024; + + private bool m_IsRunning; + private int m_Port; + private HttpListener m_HttpListener; + private readonly Dispatcher m_Dispatcher = new Dispatcher(); + + private bool m_WatchdogEnabled; + private bool m_WatchdogArmed; + private DateTime m_LastWatchdogCheck; + + /// + /// This server's own main-thread dispatcher. Each server instance owns one (no global + /// singleton), so tests that start their own server never affect any other server's + /// dispatch. Pump it via ProcessWorkQueue from the main thread (auto-pumped on + /// EditorApplication.update in the editor; pumped by RuntimePipelineManager.Update in a + /// player; pumped explicitly by tests). + /// + public Dispatcher Dispatcher => m_Dispatcher; + + /// + /// Whether the server is running AND its HTTP listener is actually listening. More accurate + /// than the internal running flag alone: returns false if the listener was stopped/disposed + /// (e.g. by a domain reload) even when the flag is stale-true. Cheap and non-blocking. + /// + /// A self-HTTP probe was considered for "does it actually respond" but rejected: the server + /// processes requests strictly one-at-a-time (HandleRequests awaits ProcessRequest), so a + /// self-probe deadlocks if issued from within a handler and false-negatives whenever a + /// request is in flight — unsafe for a watchdog. IsListening reliably catches the realistic + /// failure (listener stopped by a domain reload), which is what we need. + /// + public bool IsRunning => m_IsRunning && m_HttpListener != null && m_HttpListener.IsListening; + + /// + /// When enabled, the server periodically checks its own HTTP listener and re-opens it in + /// place if it died without going through (e.g. an unexpected listener + /// fault). The server instance survives such failures — only the listener dies — so it can + /// self-heal without an external restart. Default OFF: transient/test servers must not + /// watchdog. The editor owner enables it for the live server. + /// + /// Setting this while the server is running arms/disarms the watchdog immediately; otherwise + /// it takes effect on the next . Domain reloads are NOT handled here (the + /// instance is torn down and recreated by [InitializeOnLoad]); the watchdog only revives a + /// listener that died while the instance is still alive. + /// + public bool WatchdogEnabled + { + get => m_WatchdogEnabled; + set + { + if (m_WatchdogEnabled == value) + return; + m_WatchdogEnabled = value; + if (!m_IsRunning) + return; + if (value) + ArmWatchdog(); + else + DisarmWatchdog(); + } + } + + /// + /// How often the watchdog checks the listener (seconds). Default 5. + /// + public double WatchdogIntervalSeconds { get; set; } = 5.0; + + /// + /// Port number the server is listening on. 0 if not running. + /// Range: 7800-7899 for Editor, 7900-7999 for Runtime (avoids unity-tools port range 37800-37899). + /// + public int Port => m_Port; + + public abstract DateTime StartedAt { get; } + + /// + /// Whether this server writes/deletes the shared instance descriptor (.unity-pipeline-port). + /// Test servers override this to false so they never clobber the live server's descriptor — + /// the test already knows its port, so no discovery file is needed. + /// + protected virtual bool WritesDescriptor => true; + + /// + /// Whether this server advertises commands marked [CliCommand(RuntimeOnly = true)] in + /// its /api/commands listing. Runtime servers list them; Editor servers hide them so a + /// client connected to an Editor only sees the Editor command surface. + /// + protected virtual bool IncludeRuntimeOnlyCommands => true; + + protected abstract void CreateInstanceDescriptor(); + protected abstract void DeleteInstanceDescriptor(); + protected abstract void UpdateHeartBeat(); + protected abstract object GetServerStatus(); + protected abstract string GetToken(); + + protected virtual void ServerStarted() + { + + } + + protected virtual void ServerStopped() + { + + } + + /// + /// This server's current auth token. Exposed to the test assembly (via InternalsVisibleTo) + /// so the test client can authenticate without re-deriving the token. + /// + internal string Token => GetToken(); + + /// + /// Start the HTTP server on the specified port or auto-assign from range. + /// + /// Port to bind to, or 0 for auto-assignment from server-specific range + public void Start(int port = 0) + { + if (m_IsRunning) + return; + + m_Port = port == 0 ? FindAvailablePort() : port; + + try + { + // Initialize this server's own dispatcher (captures the main thread; Start() is + // always called from the main thread). + m_Dispatcher.Initialize(); + + // Warm the token cache on the main thread before the listener accepts requests: + // per-request auth runs on background threads and the Editor token is SessionState- + // backed (main-thread-only). Re-runs after every domain reload via [InitializeOnLoad]. + SecurityTokenManager.GetOrCreateToken(); + + // Mark running before opening the listener so HandleRequests' loop guard stays true + // as soon as it starts on the threadpool. + m_IsRunning = true; + OpenListener(); + + System.Console.WriteLine($"Start HTTP server: port:{m_Port}"); + + if (WritesDescriptor) + CreateInstanceDescriptor(); + + ArmWatchdog(); + + // Keep the Editor and player loop (and thus Update -> Dispatcher.ProcessWorkQueue) running + // while the window is unfocused or minimized this is similar to auto_tick (especially for the Player). + Application.runInBackground = true; + ServerStarted(); + } + catch (Exception) + { + m_IsRunning = false; + m_HttpListener?.Stop(); + m_HttpListener = null; + throw; + } + } + + /// + /// Create the HTTP listener, bind it, and start the request-handling loop. Extracted from + /// so the watchdog can re-open a dead listener in place without + /// re-running the rest of startup (dispatcher init, descriptor). Caller sets m_IsRunning. + /// + private void OpenListener() + { + m_HttpListener = new HttpListener(); + AddLoopbackPrefixes(m_HttpListener, m_Port); + m_HttpListener.Start(); + + // Start request handling + _ = Task.Run(HandleRequests); + } + + /// + /// Bind a wildcard-host prefix so the listener accepts any Host header ("127.0.0.1", + /// "localhost", "::1") no matter how a client — or its DNS resolver — resolves the name. + /// This is required because Mono's HttpListener binds a hostname prefix to a single resolved + /// address family and then matches the request's Host literally per prefix: an + /// explicit "http://127.0.0.1/" prefix rejects "Host: localhost" (and vice-versa) with a + /// 400. A wildcard sidesteps that. The wildcard binds all interfaces at the socket level, so + /// access is confined to the local machine by the loopback check in + /// (plus bearer-token auth). + /// + private static void AddLoopbackPrefixes(HttpListener listener, int port) + { + listener.Prefixes.Add($"http://+:{port}/"); + } + + /// + /// Stop the HTTP server and clean up resources. + /// + public void Stop() + { + if (!m_IsRunning) + return; + + m_IsRunning = false; + + DisarmWatchdog(); + System.Console.WriteLine("Pipeline Server stopped"); + + try + { + if (WritesDescriptor) + DeleteInstanceDescriptor(); + + m_HttpListener?.Stop(); + m_HttpListener?.Close(); + + ServerStopped(); + } + catch + { + // Ignore cleanup errors + } + finally + { + m_HttpListener = null; + m_Dispatcher.Shutdown(); + } + // Note: Keep port value for diagnostic purposes + } + + /// + /// Arm the watchdog (no-op if disabled or already armed). In the editor the tick rides + /// EditorApplication.update; in a player it is driven by RuntimePipelineManager.Update via + /// . + /// + private void ArmWatchdog() + { + if (!m_WatchdogEnabled || m_WatchdogArmed) + return; + + m_WatchdogArmed = true; + m_LastWatchdogCheck = DateTime.UtcNow; +#if UNITY_EDITOR + UnityEditor.EditorApplication.update += WatchdogTick; +#endif + } + + private void DisarmWatchdog() + { + if (!m_WatchdogArmed) + return; + + m_WatchdogArmed = false; +#if UNITY_EDITOR + UnityEditor.EditorApplication.update -= WatchdogTick; +#endif + } + + /// + /// Watchdog heartbeat: throttled to , re-opens the HTTP + /// listener in place if it died while the server is still meant to be running. Safe to call + /// every frame. In the editor it is subscribed to EditorApplication.update by ArmWatchdog; + /// in a player RuntimePipelineManager.Update calls it. + /// + public void WatchdogTick() + { + if (!m_WatchdogArmed) + return; + +#if UNITY_EDITOR + // Don't fight domain reloads / asset updates — the listener is expected to be torn down + // then, and [InitializeOnLoad] recreates the server afterwards. + if (UnityEditor.EditorApplication.isCompiling || UnityEditor.EditorApplication.isUpdating) + return; +#endif + + var now = DateTime.UtcNow; + if ((now - m_LastWatchdogCheck).TotalSeconds < WatchdogIntervalSeconds) + return; + m_LastWatchdogCheck = now; + + if (m_HttpListener != null && m_HttpListener.IsListening) + return; // healthy + + try + { + // Dispose the dead listener so it releases the port binding before we re-bind a new + // one on the same port (a stopped-but-not-closed listener can keep the port held). + try { m_HttpListener?.Close(); } catch { } + m_HttpListener = null; + + // The instance is alive and the watchdog is armed → the server is meant to be + // listening. Re-open the listener in place. + m_IsRunning = true; + OpenListener(); + Debug.Log($"Pipeline watchdog re-opened HTTP listener on port {m_Port}"); + } + catch (Exception ex) + { + Debug.LogWarning($"Pipeline watchdog failed to re-open listener on port {m_Port}: {ex.Message}"); + } + } + + /// + /// Handle incoming HTTP requests with routing to appropriate endpoints. + /// + private async Task HandleRequests() + { + while (m_IsRunning && m_HttpListener != null && m_HttpListener.IsListening) + { + try + { + var context = await m_HttpListener.GetContextAsync(); + await ProcessRequest(context); + } + catch (ObjectDisposedException) + { + // Listener was stopped, exit gracefully + break; + } + catch (HttpListenerException) + { + // Listener was stopped, exit gracefully + break; + } + catch (Exception ex) + { + Debug.LogError(ex); + } + } + m_IsRunning = false; + } + + /// + /// Process individual HTTP request and route to appropriate handler. + /// + protected virtual async Task ProcessRequest(HttpListenerContext context) + { + var request = context.Request; + var response = context.Response; + + try + { + // Confine access to the local machine. The listener binds a wildcard host (see + // AddLoopbackPrefixes) so it accepts any Host header, which also means it accepts + // connections on non-loopback interfaces — reject anything that isn't loopback + // before doing any other work. Bearer-token auth is still enforced below. + var remoteAddress = request.RemoteEndPoint?.Address; + if (remoteAddress == null || !IPAddress.IsLoopback(remoteAddress)) + { + await SendStatusResponse(response, 403, "Forbidden", "Only loopback connections are allowed"); + return; + } + + // Reject browser-originated requests. Legitimate non-browser clients (CLI, CI) never + // send an Origin header; emitting no CORS headers and refusing any request that + // carries one prevents a website in the developer's browser from reaching this + // local server (and short-circuits CORS preflights). + if (!string.IsNullOrEmpty(request.Headers["Origin"])) + { + await SendStatusResponse(response, 403, "Forbidden", "Cross-origin requests are not allowed"); + return; + } + + // Authenticate every request with the bearer token before routing. + if (!IsAuthorized(request)) + { + await SendStatusResponse(response, 401, "Unauthorized", "Missing or invalid authentication token"); + return; + } + + // Route to appropriate endpoint + var path = request.Url.AbsolutePath.ToLowerInvariant(); + + switch (path) + { + case "/api/status": + await HandleStatusRequest(response); + break; + case "/api/editor_status": + await HandleEditorStatusRequest(response); + break; + case "/api/commands": + await HandleCommandsRequest(response); + break; + case "/api/exec": + if (request.HttpMethod == "POST") + await HandleExecRequest(request, response); + else + await HandleMethodNotAllowed(response); + break; + case "/api/test-status": + await HandleTestStatusRequest(response); + break; + default: + await HandleNotFound(response); + break; + } + } + catch (Exception) + { + // Ensure response is always closed + try + { + if (response.OutputStream.CanWrite) + { + response.StatusCode = 500; + response.OutputStream.Close(); + } + } + catch { } + } + } + + /// + /// Validate the request's bearer token against this server's token. + /// + private bool IsAuthorized(HttpListenerRequest request) + { + var header = request.Headers["Authorization"]; + if (string.IsNullOrEmpty(header)) + return false; + + const string prefix = "Bearer "; + if (!header.StartsWith(prefix, StringComparison.OrdinalIgnoreCase)) + return false; + + var token = header.Substring(prefix.Length).Trim(); + return SecurityTokenManager.ConstantTimeEquals(token, GetToken()); + } + + /// + /// Send a structured JSON error response with an explicit HTTP status code. + /// + private async Task SendStatusResponse(HttpListenerResponse response, int statusCode, string error, string details) + { + try + { + response.StatusCode = statusCode; + response.ContentType = "application/json"; + var json = JsonConvert.SerializeObject(BaseResponse.Failure(error, details), Formatting.Indented); + var buffer = Encoding.UTF8.GetBytes(json); + response.ContentLength64 = buffer.Length; + + await response.OutputStream.WriteAsync(buffer, 0, buffer.Length); + response.OutputStream.Close(); + } + catch + { + try { response.OutputStream.Close(); } catch { } + } + } + + /// + /// Handle /api/status endpoint - returns basic server health information. + /// No Editor API access required, always fast response. + /// + private async Task HandleStatusRequest(HttpListenerResponse response) + { + try + { + var basicStatus = GetServerStatus(); + var json = JsonConvert.SerializeObject(basicStatus, Formatting.Indented); + + response.StatusCode = 200; + response.ContentType = "application/json"; + + var buffer = Encoding.UTF8.GetBytes(json); + response.ContentLength64 = buffer.Length; + + await response.OutputStream.WriteAsync(buffer, 0, buffer.Length); + response.OutputStream.Close(); + } + catch (Exception ex) + { + Debug.LogError($"HandleStatusRequest failed: {ex.Message}"); + await SendErrorResponse(response, "Status Error", $"Failed to get status: {ex.Message}"); + } + } + + /// + /// Handle /api/editor_status endpoint - returns detailed Editor state via command execution. + /// Executes the "editor_status" command to get rich Editor information. + /// + private async Task HandleEditorStatusRequest(HttpListenerResponse response) + { + try + { + // TODO: should this be implemented as a command?? + + // Execute editor_status command to get rich Editor information + var result = await ExecuteCommandByName("editor_status", new JObject()); + + // The editor_status command returns a StatusResponse directly + var editorStatus = result as StatusResponse; + if (editorStatus != null) + { + // Update with server-specific information + UpdateStatusWithServerInfo(editorStatus); + + var json = JsonConvert.SerializeObject(editorStatus, Formatting.Indented); + + response.StatusCode = 200; + response.ContentType = "application/json"; + + var buffer = Encoding.UTF8.GetBytes(json); + response.ContentLength64 = buffer.Length; + + await response.OutputStream.WriteAsync(buffer, 0, buffer.Length); + response.OutputStream.Close(); + } + else + { + Debug.LogError($"HandleEditorStatusRequest: editor_status command returned wrong type: {result?.GetType().FullName ?? "null"}"); + await SendErrorResponse(response, "Editor Status Error", "editor_status command did not return valid StatusResponse"); + } + } + catch (Exception ex) + { + var errorMessage = !string.IsNullOrEmpty(ex.Message) ? ex.Message : "[EMPTY EXCEPTION MESSAGE]"; + Debug.LogError($"HandleEditorStatusRequest failed:"); + Debug.LogError($" Exception Type: {ex.GetType().FullName}"); + Debug.LogError($" Message: '{errorMessage}'"); + Debug.LogError($" Full Exception: {ex}"); + + await SendErrorResponse(response, "Editor Status Error", $"Failed to get editor status: {errorMessage}"); + } + } + + /// + /// Update StatusResponse with server-specific information. + /// Used by /api/editor_status to add server metadata to command result. + /// + private void UpdateStatusWithServerInfo(StatusResponse editorStatus) + { + UpdateHeartBeat(); + // Ensure heartbeat is current + editorStatus.LastHeartbeat = DateTime.UtcNow; + } + + /// + /// Handle /api/commands endpoint - returns available CLI commands with schemas. + /// + private async Task HandleCommandsRequest(HttpListenerResponse response) + { + try + { + var commands = CommandRegistry.DiscoverCommands() + .Where(c => IncludeRuntimeOnlyCommands || !c.RuntimeOnly) + .ToList(); + var commandsJson = commands.Select(BuildCommandResponse).ToList(); + + var responseData = new + { + commands = commandsJson, + count = commands.Count, + server = new + { + version = "0.0.1", // TODO: Get from package.json + port = m_Port, + startTime = StartedAt + } + }; + + var json = JsonConvert.SerializeObject(responseData, Formatting.Indented); + + response.StatusCode = 200; + response.ContentType = "application/json"; + + var buffer = Encoding.UTF8.GetBytes(json); + response.ContentLength64 = buffer.Length; + + await response.OutputStream.WriteAsync(buffer, 0, buffer.Length); + response.OutputStream.Close(); + } + catch (Exception ex) + { + Debug.LogError($"Failed to handle /api/commands request: {ex.Message}"); + + // Return error response + response.StatusCode = 500; + response.ContentType = "application/json"; + + var errorResponse = new { error = "Internal server error", message = ex.Message }; + var errorJson = JsonConvert.SerializeObject(errorResponse); + var errorBuffer = Encoding.UTF8.GetBytes(errorJson); + response.ContentLength64 = errorBuffer.Length; + + await response.OutputStream.WriteAsync(errorBuffer, 0, errorBuffer.Length); + response.OutputStream.Close(); + } + } + + /// + /// Build JSON response object for a single command. + /// + private object BuildCommandResponse(CommandInfo command) + { + return new + { + name = command.Name, + description = command.Description, + mainThreadRequired = command.MainThreadRequired, + runtimeOnly = command.RuntimeOnly, + parameters = command.Parameters.Select(p => new + { + name = p.Name, + description = p.Description, + type = p.ParameterType.Name, + required = p.Required, + defaultValue = p.DefaultValue + }).ToList(), + schema = JsonSchemaGenerator.GenerateCommandSchema(command) + }; + } + + /// + /// Handle 404 Not Found responses. + /// + private async Task HandleNotFound(HttpListenerResponse response) + { + response.StatusCode = 404; + response.ContentType = "text/plain"; + + var responseText = "Not Found"; + var buffer = Encoding.UTF8.GetBytes(responseText); + response.ContentLength64 = buffer.Length; + + await response.OutputStream.WriteAsync(buffer, 0, buffer.Length); + response.OutputStream.Close(); + } + + /// + /// Handle 405 Method Not Allowed responses. + /// + private async Task HandleMethodNotAllowed(HttpListenerResponse response) + { + await SendErrorResponse(response, "Method Not Allowed", "This endpoint only supports POST requests"); + } + + /// + /// Handle /api/test-status endpoint - returns status of async test execution. + /// + private async Task HandleTestStatusRequest(HttpListenerResponse response) + { + try + { + // Execute test_status command to get current test status + var result = await ExecuteCommandByName("test_status", new JObject()); + + string jsonResponse; + if (result is string statusString) + { + // test_status command returns JSON string directly + jsonResponse = statusString; + } + else + { + // Fallback - serialize whatever was returned + jsonResponse = JsonConvert.SerializeObject(result ?? new { status = "no_tests", message = "No test run in progress" }); + } + + response.StatusCode = 200; + response.ContentType = "application/json"; + + var buffer = Encoding.UTF8.GetBytes(jsonResponse); + response.ContentLength64 = buffer.Length; + + await response.OutputStream.WriteAsync(buffer, 0, buffer.Length); + response.OutputStream.Close(); + } + catch (Exception ex) + { + Debug.LogError($"HandleTestStatusRequest failed: {ex.Message}"); + await SendErrorResponse(response, "Test Status Error", $"Failed to get test status: {ex.Message}"); + } + } + + /// + /// Handle /api/exec endpoint - execute CLI commands with parameters. + /// + private async Task HandleExecRequest(HttpListenerRequest request, HttpListenerResponse response) + { + var cmd = ""; + string requestBody = null; + try + { + // Reject oversized bodies up front via Content-Length (cheap, before reading anything). + if (request.ContentLength64 > MaxRequestBodyBytes) + { + // Drain the body first so the client can read the 413 (see DrainRequestBody). + await DrainRequestBody(request, MaxDrainBytes); + await SendExecResponse(response, 413, + BaseResponse.Failure("Payload Too Large", + $"Request body exceeds the maximum allowed size of {MaxRequestBodyBytes} bytes"), null); + return; + } + + // Read request body, enforcing the same cap while reading in case Content-Length is + // absent or untruthful (e.g. chunked transfer-encoding). + try + { + // leaveOpen: on an over-limit read we still need the raw InputStream open to drain + // the unsent remainder before responding, so it must outlive the reader/wrapper. + using (var limited = new MaxLengthStream(request.InputStream, MaxRequestBodyBytes, leaveOpen: true)) + using (var reader = new StreamReader(limited)) + { + requestBody = await reader.ReadToEndAsync(); + } + } + catch (RequestTooLargeException ex) + { + // Drain the body first so the client can read the 413 (see DrainRequestBody). + await DrainRequestBody(request, MaxDrainBytes); + await SendExecResponse(response, 413, + BaseResponse.Failure("Payload Too Large", ex.Message), null); + return; + } + finally + { + // MaxLengthStream left the InputStream open; dispose it now that any read/drain is done. + request.InputStream.Dispose(); + } + + if (string.IsNullOrEmpty(requestBody)) + { + await SendExecResponse(response, 400, + BaseResponse.Failure("Bad Request", "Request body is required"), requestBody); + return; + } + + // Parse command request + CommandExecutionRequest commandRequest; + try + { + commandRequest = JsonConvert.DeserializeObject(requestBody); + } + catch (JsonException ex) + { + await SendExecResponse(response, 400, + BaseResponse.Failure("Invalid JSON", $"Failed to parse request body: {ex.Message}"), requestBody); + return; + } + + // Validate request structure + var requestValidationError = commandRequest?.Validate(); + if (!string.IsNullOrEmpty(requestValidationError)) + { + await SendExecResponse(response, 400, + BaseResponse.Failure("Invalid Request", requestValidationError), requestBody); + return; + } + + cmd = commandRequest.Command; + // Execute command using shared execution logic + var result = await ExecuteCommandByName(commandRequest.Command, commandRequest.Parameters); + + // Send success response + await SendExecResponse(response, 200, + CommandExecutionResponse.CmdSuccess(commandRequest.Command, result), requestBody); + } + catch (ArgumentException ex) + { + // Parameter validation errors + await SendExecResponse(response, 400, + CommandExecutionResponse.CmdFailure(cmd, "Parameter Validation Failed", ex.Message), requestBody); + } + catch (InvalidOperationException ex) when (ex.Message.Contains("No command named")) + { + // Command not found errors + await SendExecResponse(response, 400, + CommandExecutionResponse.CmdFailure(cmd, "Command Not Found", ex.Message), requestBody); + } + catch (InvalidOperationException ex) + { + // Command execution errors + await SendExecResponse(response, 400, + CommandExecutionResponse.CmdFailure(cmd, "Command Execution Failed", ex.Message), requestBody); + } + catch (Exception ex) + { + Debug.LogError($"Failed to handle /api/exec request: {ex.Message}"); + await SendExecResponse(response, 400, + CommandExecutionResponse.CmdFailure(cmd, "Internal Server Error", ex.Message), requestBody); + } + } + + /// + /// Read and discard the remaining request body, up to bytes. + /// When we reject a request early (e.g. 413) the client may still be uploading; if we close the + /// response while unread data is in flight, HttpListener resets the TCP connection and the client + /// sees a connection error instead of our HTTP response. Draining lets the upload complete so the + /// response is delivered. Best-effort and bounded: a body larger than the budget stops draining + /// (and may reset), which is acceptable for an abusive request. + /// + private static async Task DrainRequestBody(HttpListenerRequest request, long maxDrainBytes) + { + try + { + var input = request.InputStream; + var buffer = new byte[16 * 1024]; + long drained = 0; + while (drained < maxDrainBytes) + { + var read = await input.ReadAsync(buffer, 0, buffer.Length); + if (read <= 0) + break; + drained += read; + } + } + catch + { + // Best-effort: if the client already closed the connection or the stream is gone, + // there is nothing left to drain and the response send below will handle the rest. + } + } + + /// + /// Send error response with structured JSON format. + /// + private async Task SendErrorResponse(HttpListenerResponse response, string error, string details = null) + { + try + { + var errorResponse = BaseResponse.Failure(error, details); + await SendResponse(response, 400, errorResponse); + } + catch + { + // Ignore errors in error handling + } + } + + private async Task SendResponse(HttpListenerResponse response, int statusCode, BaseResponse pipelineResponse) + { + response.StatusCode = 400; + response.ContentType = "application/json"; + var json = JsonConvert.SerializeObject(pipelineResponse, Formatting.Indented); + var buffer = Encoding.UTF8.GetBytes(json); + response.ContentLength64 = buffer.Length; + + await response.OutputStream.WriteAsync(buffer, 0, buffer.Length); + response.OutputStream.Close(); + } + + /// + /// Send an /api/exec response and notify the transaction hook with the raw request and + /// response JSON. Single send point for the exec handler so every branch (success and + /// error) is captured uniformly. + /// + private async Task SendExecResponse(HttpListenerResponse response, int statusCode, + BaseResponse body, string requestJson) + { + response.StatusCode = statusCode; + response.ContentType = "application/json"; + var json = JsonConvert.SerializeObject(body, Formatting.Indented); + var buffer = Encoding.UTF8.GetBytes(json); + response.ContentLength64 = buffer.Length; + + await response.OutputStream.WriteAsync(buffer, 0, buffer.Length); + response.OutputStream.Close(); + + OnTransactionProcessed(requestJson, json); + } + + /// + /// Hook invoked after an /api/exec transaction is sent, with the raw request and response + /// JSON. No-op by default (the Player never logs); the Editor server overrides this to + /// write the transaction log. + /// + protected virtual void OnTransactionProcessed(string requestJson, string responseJson) { } + + /// + /// Convert a single JSON parameter token to the command's parameter type. + /// + /// Agents and the CLI frequently pass structured parameters (e.g. float[] position, + /// JObject properties) as a JSON-ENCODED STRING — e.g. position "[0,0,0]" or + /// properties "{\"m_Mass\":0.17}". Newtonsoft's JValue(string).ToObject(float[]) + /// (and likewise for JObject) returns null, so the parameter silently drops out: + /// set_transform applies nothing and set_component_properties fails Required-parameter + /// validation (CLI-219 / CLI-220). To fix this generally — without special-casing any command — + /// when the token is a string but the target type is NOT string AND the trimmed string starts + /// with '{' or '[', we re-parse it as a JSON document before converting. + /// + /// The '{'/'[' guard is deliberate and narrow: ordinary string params (and ObjectRef string + /// handles like "/Player", "Assets/Foo.prefab", "guid:..." — none of which start with '{'/'[') + /// fall straight through to token.ToObject, so the class-level + /// and plain-string parameters keep + /// working unchanged. A re-parse that fails falls through to the normal conversion path (the + /// caller's try/catch then handles any remaining failure). + /// + private static object ConvertParameterToken(Newtonsoft.Json.Linq.JToken token, System.Type targetType) + { + if (token == null) + return null; + + if (token.Type == Newtonsoft.Json.Linq.JTokenType.String + && targetType != typeof(string) + && !targetType.IsPrimitive + && !targetType.IsEnum) + { + var s = token.Value(); + if (!string.IsNullOrWhiteSpace(s)) + { + var t = s.TrimStart(); + if (t.Length > 0 && (t[0] == '{' || t[0] == '[')) + { + try { return Newtonsoft.Json.Linq.JToken.Parse(s).ToObject(targetType); } + catch (Newtonsoft.Json.JsonException) { /* fall through to the direct conversion */ } + } + } + } + + return token.ToObject(targetType); + } + + /// + /// Extract command parameters from JSON request and convert to appropriate types. + /// + private object[] ExtractCommandParameters(CommandInfo command, Newtonsoft.Json.Linq.JObject parametersJson) + { + var parameterValues = new object[command.Parameters.Count]; + + for (int i = 0; i < command.Parameters.Count; i++) + { + var paramInfo = command.Parameters[i]; + var paramName = paramInfo.Name; + + // Try to get value from JSON parameters + object jsonValue = null; + if (parametersJson != null && parametersJson.ContainsKey(paramName)) + { + try + { + jsonValue = ConvertParameterToken(parametersJson[paramName], paramInfo.ParameterType); + } + catch (Exception ex) + { + Debug.LogWarning($"Failed to convert parameter '{paramName}' to {paramInfo.ParameterType.Name}: {ex.Message}"); + // Conversion failed, will use default value + } + } + + // Use provided value or default value + if (jsonValue != null) + { + parameterValues[i] = jsonValue; + } + else if (paramInfo.DefaultValue != null) + { + parameterValues[i] = paramInfo.DefaultValue; + } + else + { + // Use type's default value for value types, null for reference types + parameterValues[i] = paramInfo.ParameterType.IsValueType + ? Activator.CreateInstance(paramInfo.ParameterType) + : null; + } + } + + return parameterValues; + } + + /// + /// Validate that all required command parameters are provided. + /// + private string ValidateCommandParameters(CommandInfo command, object[] parameters) + { + for (int i = 0; i < command.Parameters.Count; i++) + { + var paramInfo = command.Parameters[i]; + var value = parameters[i]; + + if (paramInfo.Required && (value == null || + (value is string str && string.IsNullOrEmpty(str)))) + { + return $"Required parameter '{paramInfo.Name}' is missing or empty"; + } + } + + return null; // No validation errors + } + + /// + /// Execute a command by name with JSON parameters. + /// Handles command lookup, parameter validation, and execution. + /// Shared logic for both /api/exec and /api/editor_status endpoints. + /// + private async Task ExecuteCommandByName(string commandName, JObject parametersJson) + { + // Find command + var commands = CommandRegistry.DiscoverCommands().ToList(); + var command = commands.FirstOrDefault(c => c.Name == commandName); + if (command == null) + { + var availableCommands = string.Join(", ", commands.Select(c => c.Name)); + var errorMessage = $"No command named '{commandName}' is available. Available: [{availableCommands}]"; + Debug.LogError($"ExecuteCommandByName: {errorMessage}"); + throw new InvalidOperationException(errorMessage); + } + + // Extract parameters + var parameters = ExtractCommandParameters(command, parametersJson); + + // Validate required parameters + var validationError = ValidateCommandParameters(command, parameters); + if (!string.IsNullOrEmpty(validationError)) + { + Debug.LogError($"ExecuteCommandByName: Parameter validation failed: {validationError}"); + throw new ArgumentException(validationError); + } + + // Execute command with appropriate threading + return await ExecuteCommand(command, parameters); + } + + /// + /// Execute the command method with provided parameters. + /// Handles main thread execution if required. + /// + private async Task ExecuteCommand(CommandInfo command, object[] parameters) + { + object raw; + if (command.MainThreadRequired) + { + // Execute on the main thread using THIS server's dispatcher. + if (m_Dispatcher.IsMainThread()) + { + raw = ExecuteCommandDirect(command, parameters); + } + else + { + raw = await Task.Run(() => m_Dispatcher.Invoke(() => ExecuteCommandDirect(command, parameters))); + } + } + else + { + // Execute on background thread + raw = await Task.Run(() => ExecuteCommandDirect(command, parameters)); + } + + return await UnwrapResult(raw); + } + + /// + /// Commands declared as `async Task`/`Task<T>` return their Task from reflection Invoke. + /// Await it here (on the calling background thread, leaving the main thread free to pump the + /// dispatcher) so the actual value is serialized rather than the Task itself, and so a faulted + /// command surfaces its real exception to the request handler instead of being masked when + /// Newtonsoft reads Task.Result during serialization. + /// + private static async Task UnwrapResult(object result) + { + if (result is Task task) + { + await task.ConfigureAwait(false); + // Task<T> exposes a Result property; non-generic Task does not. + var resultProperty = task.GetType().GetProperty("Result"); + return resultProperty?.GetValue(task); + } + + return result; + } + + /// + /// Direct command execution using reflection. + /// + private object ExecuteCommandDirect(CommandInfo command, object[] parameters) + { + try + { + return command.Method.Invoke(null, parameters); + } + catch (System.Reflection.TargetInvocationException tie) when (tie.InnerException != null) + { + // Reflection wraps the command's own exception in a TargetInvocationException; surface + // the inner message so callers (and agents) get an actionable error instead of the + // generic "Exception has been thrown by the target of an invocation." + var inner = tie.InnerException; + Debug.LogError($"Command '{command.Name}' failed: {inner.Message}"); + + // Preserve validation-oriented exceptions so HandleExecRequest's dedicated + // catch (ArgumentException) classifies them as "Parameter Validation Failed" rather than + // collapsing them into "Command Execution Failed". Rethrow the original with its stack. + if (inner is ArgumentException) + System.Runtime.ExceptionServices.ExceptionDispatchInfo.Capture(inner).Throw(); + + throw new InvalidOperationException($"Command '{command.Name}' failed: {inner.Message}", inner); + } + catch (Exception ex) + { + Debug.LogError($"Command execution failed: {ex.Message}"); + throw new InvalidOperationException($"Command '{command.Name}' failed: {ex.Message}", ex); + } + } + + + /// + /// Get the port range for this server type. + /// Editor servers use 7800-7899, Runtime servers use 7900-7999. + /// + protected virtual (int basePort, int maxPort) GetPortRange() + { + return (7800, 7849); // Editor production (test editor servers use 7850-7899) + } + + /// + /// Find an available port in the pipeline server range. + /// + private int FindAvailablePort() + { + var (basePort, maxPort) = GetPortRange(); + + for (int port = basePort; port <= maxPort; port++) + { + if (IsPortAvailable(port)) + { + return port; + } + } + + throw new InvalidOperationException($"No available ports in range {basePort}-{maxPort}"); + } + + /// + /// Check if a specific port is available for binding. + /// + private bool IsPortAvailable(int port) + { + try + { + using (var listener = new HttpListener()) + { + AddLoopbackPrefixes(listener, port); + listener.Start(); + listener.Stop(); + return true; + } + } + catch + { + return false; + } + } + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/BasePipelineServer.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/BasePipelineServer.cs.meta new file mode 100644 index 00000000..85365bd5 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/BasePipelineServer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b6905de2a6949fc40bea9d708751b0fe +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/CliArgAttribute.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/CliArgAttribute.cs new file mode 100644 index 00000000..9a175235 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/CliArgAttribute.cs @@ -0,0 +1,51 @@ +using System; + +namespace Unity.Pipeline.Commands +{ + /// + /// Attribute to mark parameters of CLI command methods. + /// Provides parameter metadata for CLI validation and help generation. + /// Adapted from unity-tools [Parameter] attribute for Pipeline organization requirements. + /// + /// Also valid on the fields/properties of an DTO, where it + /// describes a member of a nested object schema (same Name/Description/Required semantics). + /// + [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false)] + public class CliArgAttribute : Attribute + { + /// + /// Name of the parameter as it appears in CLI arguments. + /// Used in "unity request command_name --param_name value" syntax. + /// + public string Name { get; } + + /// + /// Human-readable description of the parameter. + /// Used in CLI help text and parameter documentation. + /// + public string Description { get; } + + /// + /// Whether this parameter is required for command execution. + /// Default: false (parameter is optional). + /// + public bool Required { get; set; } = false; + + /// + /// Default value for the parameter if not provided. + /// Must be compatible with the parameter type. + /// + public object DefaultValue { get; set; } + + /// + /// Create a new CLI parameter attribute. + /// + /// Parameter name for CLI arguments + /// Human-readable description + public CliArgAttribute(string name, string description) + { + Name = name ?? throw new ArgumentNullException(nameof(name)); + Description = description ?? throw new ArgumentNullException(nameof(description)); + } + } +} \ No newline at end of file diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/CliArgAttribute.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/CliArgAttribute.cs.meta new file mode 100644 index 00000000..debe1bae --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/CliArgAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ac8886d9f7e92d844b4f1728ce2e2cab +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/CliCommandAttribute.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/CliCommandAttribute.cs new file mode 100644 index 00000000..2d1f58ed --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/CliCommandAttribute.cs @@ -0,0 +1,50 @@ +using System; + +namespace Unity.Pipeline.Commands +{ + /// + /// Attribute to mark static methods as CLI-accessible commands. + /// Commands with this attribute can be executed remotely via Pipeline Server. + /// Adapted from unity-tools [Tool] attribute for Pipeline organization requirements. + /// + [AttributeUsage(AttributeTargets.Method, AllowMultiple = false)] + public class CliCommandAttribute : Attribute + { + /// + /// Unique name of the command for CLI execution. + /// Used in "unity request command_name" syntax. + /// + public string Name { get; } + + /// + /// Human-readable description of what the command does. + /// Used in CLI help text and command discovery. + /// + public string Description { get; } + + /// + /// Whether this command requires Unity main thread execution. + /// Default: true (most Unity APIs require main thread). + /// + public bool MainThreadRequired { get; set; } = true; + + /// + /// Whether this command belongs to the runtime (Player) command surface only. + /// Runtime-only commands are hidden from an Editor server's command listing + /// (they remain executable, but are not advertised when connected to an Editor). + /// Default: false (listed on the Editor server). + /// + public bool RuntimeOnly { get; set; } = false; + + /// + /// Create a new CLI command attribute. + /// + /// Unique command name for CLI execution + /// Human-readable description + public CliCommandAttribute(string name, string description) + { + Name = name ?? throw new ArgumentNullException(nameof(name)); + Description = description ?? throw new ArgumentNullException(nameof(description)); + } + } +} \ No newline at end of file diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/CliCommandAttribute.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/CliCommandAttribute.cs.meta new file mode 100644 index 00000000..325d86dd --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/CliCommandAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ee4da62af1984f442af8ada30f3eee83 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/CommandInfo.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/CommandInfo.cs new file mode 100644 index 00000000..310d36d1 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/CommandInfo.cs @@ -0,0 +1,64 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Reflection; + +namespace Unity.Pipeline.Commands +{ + /// + /// Information about a discovered CLI command. + /// Contains metadata needed for command execution and CLI help generation. + /// + public class CommandInfo + { + /// + /// Unique name of the command for CLI execution. + /// + public string Name { get; } + + /// + /// Human-readable description of the command. + /// + public string Description { get; } + + /// + /// Whether this command requires Unity main thread execution. + /// + public bool MainThreadRequired { get; } + + /// + /// Whether this command is part of the runtime (Player) command surface only. + /// Editor servers hide runtime-only commands from their command listing. + /// + public bool RuntimeOnly { get; } + + /// + /// Method that implements this command. + /// + public MethodInfo Method { get; } // TODO Maybe look at generating a dynamic Delegate to increase performance of the command call. + + /// + /// Parameters that this command accepts. + /// + public IReadOnlyList Parameters { get; } + + /// + /// Create command information from discovery. + /// + public CommandInfo(string name, string description, bool mainThreadRequired, + MethodInfo method, IReadOnlyList parameters, bool runtimeOnly = false) + { + Name = name ?? throw new ArgumentNullException(nameof(name)); + Description = description ?? throw new ArgumentNullException(nameof(description)); + Method = method ?? throw new ArgumentNullException(nameof(method)); + Parameters = parameters ?? throw new ArgumentNullException(nameof(parameters)); + MainThreadRequired = mainThreadRequired; + RuntimeOnly = runtimeOnly; + } + + public override string ToString() + { + return $"{Name} MainThreadRequired:{MainThreadRequired} Parameters:{Parameters.Count}"; + } + } +} \ No newline at end of file diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/CommandInfo.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/CommandInfo.cs.meta new file mode 100644 index 00000000..3c57877e --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/CommandInfo.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 40290d720d0d35b44a9fa5843a5ee294 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/CommandRegistry.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/CommandRegistry.cs new file mode 100644 index 00000000..d6400c9b --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/CommandRegistry.cs @@ -0,0 +1,258 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using Unity.Pipeline.HotReload; +using UnityEngine; +#if UNITY_6000_3_OR_NEWER +using UnityEngine.Assemblies; +#endif + +namespace Unity.Pipeline.Commands +{ + /// + /// Registry for discovering and managing CLI commands via pluggable discovery mechanism. + /// Scans for methods marked with [CliCommand] attribute across all assemblies. + /// Based on unity-tools ToolRegistry patterns adapted for Pipeline requirements. + /// + public static class CommandRegistry + { + private static IReadOnlyList m_CachedCommands; + private static ICommandDiscovery m_Discovery; + + /// + /// Set the command discovery mechanism. + /// Editor assembly provides TypeCache-based discovery, Runtime uses reflection fallback. + /// + public static void SetDiscovery(ICommandDiscovery discovery) + { + m_Discovery = discovery; + ClearCache(); // Re-discover with new mechanism + } + + /// + /// Discover all CLI commands marked with [CliCommand] attribute. + /// Uses injected discovery mechanism (TypeCache in Editor, reflection in Runtime). + /// Results are cached until domain reload. + /// + public static IEnumerable DiscoverCommands() + { + if (m_CachedCommands == null) + { + m_CachedCommands = DiscoverCommandsInternal().ToList(); + + // Also discover hot reload methods when commands are discovered + DiscoverHotReloadMethods(); + } + + return m_CachedCommands; + } + + /// + /// Clear the command cache. Called automatically on domain reload. + /// Can be called manually for testing or dynamic command registration. + /// + public static void ClearCache() + { + m_CachedCommands = null; + } + + /// + /// Internal implementation of command discovery using injected discovery mechanism. + /// + private static IEnumerable DiscoverCommandsInternal() + { + var commands = new List(); + + try + { + // Use injected discovery mechanism if available, otherwise fallback to reflection + IEnumerable methods; + + if (m_Discovery != null) + { + methods = m_Discovery.GetMethodsWithAttribute(); + } + else + { + // Fallback: Use reflection to scan loaded assemblies + methods = GetMethodsWithAttributeViaReflection(); + } + + foreach (var method in methods) + { + try + { + var commandInfo = CreateCommandInfo(method); + if (commandInfo != null) + { + commands.Add(commandInfo); + } + } + catch (Exception ex) + { + Debug.LogWarning($"Failed to register command from method {method.DeclaringType?.Name}.{method.Name}: {ex.Message}"); + } + } + } + catch (Exception ex) + { + Debug.LogError($"Failed to discover commands: {ex.Message}"); + } + + return commands; + } + + /// + /// Fallback command discovery using reflection when TypeCache is not available. + /// + private static IEnumerable GetMethodsWithAttributeViaReflection() where T : Attribute + { + var methods = new List(); + + try + { + var assemblies = PipelineUtils.GetLoadedAssemblies(); + + foreach (var assembly in assemblies) + { + // Skip system assemblies for performance + if (IsSystemAssembly(assembly)) + continue; + + try + { + foreach (var type in assembly.GetTypes()) + { + foreach (var method in type.GetMethods(BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic)) + { + if (method.GetCustomAttribute() != null) + { + methods.Add(method); + } + } + } + } + catch (ReflectionTypeLoadException) + { + // Skip assemblies that can't be loaded + continue; + } + } + } + catch (Exception ex) + { + Debug.LogWarning($"Reflection-based command discovery failed: {ex.Message}"); + } + + return methods; + } + + /// + /// Check if assembly is a system assembly that should be skipped during discovery. + /// + private static bool IsSystemAssembly(Assembly assembly) + { + var name = assembly.GetName().Name; + return name.StartsWith("System.") || + name.StartsWith("Microsoft.") || + name.StartsWith("mscorlib") || + name.StartsWith("netstandard") || + name.Equals("UnityEngine") || + name.Equals("UnityEditor"); + } + + /// + /// Create CommandInfo from a method with CliCommand attribute. + /// + private static CommandInfo CreateCommandInfo(MethodInfo method) + { + var commandAttr = method.GetCustomAttribute(); + if (commandAttr == null) + return null; + + // Validate method is static (required for CLI commands). + // Any static method may be registered regardless of accessibility + // (public, internal, or private) — invocation goes through MethodInfo.Invoke. + if (!method.IsStatic) + { + Debug.LogWarning($"Command method {method.DeclaringType?.Name}.{method.Name} must be static"); + return null; + } + + // Discover parameters + var parameters = DiscoverParameters(method).ToList(); + + return new CommandInfo( + commandAttr.Name, + commandAttr.Description, + commandAttr.MainThreadRequired, + method, + parameters, + commandAttr.RuntimeOnly + ); + } + + /// + /// Discover parameter information from method parameters. + /// + private static IEnumerable DiscoverParameters(MethodInfo method) + { + foreach (var param in method.GetParameters()) + { + var argAttr = param.GetCustomAttribute(); + + // Parameters without CliArg attribute get default metadata + var name = argAttr?.Name ?? param.Name; + var description = argAttr?.Description ?? $"Parameter: {param.Name}"; + var required = argAttr?.Required ?? !param.HasDefaultValue; + var defaultValue = param.HasDefaultValue ? param.DefaultValue : argAttr?.DefaultValue; + + yield return new CommandParameterInfo(name, description, required, param.ParameterType, defaultValue); + } + } + + /// + /// Discover and register methods marked with [HotReloadWithOverrides] attribute. + /// Called during command discovery to populate the hot reload registry. + /// + private static void DiscoverHotReloadMethods() + { + try + { + // Use injected discovery mechanism if available, otherwise fallback to reflection + IEnumerable methods; + + if (m_Discovery != null) + { + methods = m_Discovery.GetMethodsWithAttribute(); + } + else + { + // Fallback: Use reflection to scan loaded assemblies + methods = GetMethodsWithAttributeViaReflection(); + } + + foreach (var method in methods) + { + try + { + var hotReloadAttr = method.GetCustomAttribute(); + if (hotReloadAttr != null) + { + HotReloadRegistry.RegisterReloadableMethod(method, hotReloadAttr); + } + } + catch (Exception ex) + { + Debug.LogWarning($"Failed to register hot reload method {method.DeclaringType?.Name}.{method.Name}: {ex.Message}"); + } + } + } + catch (Exception ex) + { + Debug.LogError($"Failed to discover hot reload methods: {ex.Message}"); + } + } + } +} \ No newline at end of file diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/CommandRegistry.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/CommandRegistry.cs.meta new file mode 100644 index 00000000..607900ec --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/CommandRegistry.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c53b0ba553311e14c833aadafdb44999 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/Dispatcher.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/Dispatcher.cs new file mode 100644 index 00000000..32fa1070 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/Dispatcher.cs @@ -0,0 +1,200 @@ +using System; +using System.Collections.Concurrent; +using System.Threading; +using System.Threading.Tasks; +using UnityEngine; + +namespace Unity.Pipeline.Threading +{ + /// + /// Dispatches work to Unity's main thread from background threads (required for accessing Unity + /// APIs from HTTP request handlers). + /// + /// Each pipeline server owns its own instance (no global singleton): it is initialized on Start + /// and pumped from the main thread — auto-pumped via EditorApplication.update in the editor, and + /// by RuntimePipelineManager.Update in a player. + /// + public class Dispatcher + { + private readonly ConcurrentQueue m_WorkQueue = new ConcurrentQueue(); + private volatile bool m_IsInitialized; + private int m_MainThreadId = -1; + + public bool IsInitialized => m_IsInitialized; + + /// + /// Initialize the dispatcher. Must be called from Unity's main thread. + /// + public void Initialize() + { + if (m_IsInitialized) + return; + + m_MainThreadId = Thread.CurrentThread.ManagedThreadId; + m_IsInitialized = true; + +#if UNITY_EDITOR + UnityEditor.EditorApplication.update += ProcessWorkQueue; +#endif + } + + /// + /// Shutdown the dispatcher and cancel any pending work. + /// + public void Shutdown() + { + if (!m_IsInitialized) + return; + +#if UNITY_EDITOR + UnityEditor.EditorApplication.update -= ProcessWorkQueue; +#endif + + while (m_WorkQueue.TryDequeue(out var item)) + { + try + { + item.SetException(new OperationCanceledException("Dispatcher is shutting down")); + } + catch { } + } + + m_IsInitialized = false; + } + + /// + /// Execute a function on the main thread and return the result (synchronous wait). + /// + public T Invoke(Func function, int timeoutMs = 60000) + { + if (!m_IsInitialized) + throw new InvalidOperationException("Dispatcher must be initialized first"); + + if (IsMainThread()) + return function(); + + var workItem = new WorkItem(function); + m_WorkQueue.Enqueue(workItem); + + var startTime = DateTime.UtcNow; + var task = workItem.TaskCompletionSource.Task; + + while (!task.IsCompleted) + { + if ((DateTime.UtcNow - startTime).TotalMilliseconds > timeoutMs) + throw new TimeoutException($"Main thread operation timed out after {timeoutMs}ms"); + + Thread.Sleep(1); + } + + if (task.IsFaulted) + throw task.Exception?.GetBaseException() ?? new Exception("Unknown error"); + + if (task.IsCanceled) + throw new OperationCanceledException("Main thread operation was cancelled"); + + return task.Result; + } + + /// + /// Execute an action on the main thread. + /// + public void Invoke(Action action, int timeoutMs = 60000) + { + Invoke(() => + { + action(); + return null; + }, timeoutMs); + } + + /// + /// Execute a function on the main thread and return the result (async version). + /// + public async Task InvokeAsync(Func function, int timeoutMs = 60000) + { + return await Task.Run(() => Invoke(function, timeoutMs)); + } + + /// + /// Execute an action on the main thread (async version). + /// + public async Task InvokeAsync(Action action, int timeoutMs = 60000) + { + await Task.Run(() => Invoke(action, timeoutMs)); + } + + /// + /// Check if we're currently on Unity's main thread. + /// + public bool IsMainThread() + { + return m_MainThreadId != -1 && Thread.CurrentThread.ManagedThreadId == m_MainThreadId; + } + + /// + /// Process queued work items. Called from EditorApplication.update or MonoBehaviour.Update. + /// + /// Max items to process per call, to limit frame-rate impact. + public void ProcessWorkQueue(int maxItemsPerFrame) + { + int processedCount = 0; + + while (processedCount < maxItemsPerFrame && m_WorkQueue.TryDequeue(out var workItem)) + { + try + { + workItem.Execute(); + } + catch (Exception ex) + { + Debug.LogError($"Dispatcher work item failed: {ex.Message}"); + workItem.SetException(ex); + } + + processedCount++; + } + } + + public void ProcessWorkQueue() + { + ProcessWorkQueue(10); + } + + private abstract class WorkItem + { + public abstract void Execute(); + public abstract void SetException(Exception exception); + } + + private class WorkItem : WorkItem + { + private readonly Func m_Function; + public TaskCompletionSource TaskCompletionSource { get; } + + public WorkItem(Func function) + { + m_Function = function ?? throw new ArgumentNullException(nameof(function)); + TaskCompletionSource = new TaskCompletionSource(); + } + + public override void Execute() + { + try + { + var result = m_Function(); + TaskCompletionSource.SetResult(result); + } + catch (Exception ex) + { + TaskCompletionSource.SetException(ex); + } + } + + public override void SetException(Exception exception) + { + TaskCompletionSource.SetException(exception); + } + } + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/Dispatcher.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/Dispatcher.cs.meta new file mode 100644 index 00000000..49e040ab --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/Dispatcher.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: df7819f4aeb94b2408fd309361f67243 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/FilePermissions.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/FilePermissions.cs new file mode 100644 index 00000000..bc5d0719 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/FilePermissions.cs @@ -0,0 +1,109 @@ +using System; +using System.Diagnostics; +using System.Runtime.InteropServices; +using UnityEngine; +using Debug = UnityEngine.Debug; + +namespace Unity.Pipeline +{ + /// + /// Restricts a file so that only the user who started the process can read or write it. + /// Used to protect the instance descriptor (port file), which carries the auth token. + /// + /// The managed ACL APIs (System.Security.AccessControl) are not part of Unity's runtime + /// profile, so Windows is handled via icacls and Unix via libc chmod. + /// + public static class FilePermissions + { + /// + /// Restrict the file at to the current user only. + /// Failures are logged but never thrown, so they cannot block server startup. + /// + public static void RestrictToCurrentUser(string path) + { + try + { + switch (Application.platform) + { + case RuntimePlatform.WindowsEditor: + case RuntimePlatform.WindowsPlayer: + RestrictWindows(path); + break; + default: + RestrictUnix(path); + break; + } + } + catch (Exception ex) + { + Debug.LogWarning($"Pipeline: Could not restrict permissions on '{path}': {ex.Message}"); + } + } + + private static void RestrictWindows(string path) + { + // Grant by SID rather than account name: AzureAD/Entra-joined accounts (e.g. + // "AzureAD\\user") have no name-to-SID mapping for icacls, but the SID always resolves. + var sid = GetCurrentUserSid(); + if (string.IsNullOrEmpty(sid)) + { + Debug.LogWarning($"Pipeline: Could not resolve current user SID; leaving default permissions on '{path}'."); + return; + } + + // /inheritance:r drops inherited ACEs; /grant:r replaces the DACL with a single + // full-control grant to the current user. + Run("icacls", $"\"{path}\" /inheritance:r /grant:r \"*{sid}:(F)\"", out _); + } + + private static string GetCurrentUserSid() + { + if (!Run("whoami", "/user /fo csv /nh", out var output) || string.IsNullOrEmpty(output)) + return null; + + // Output looks like: "domain\user","S-1-5-21-..." + var idx = output.IndexOf("S-1-", StringComparison.Ordinal); + if (idx < 0) + return null; + + var end = idx; + while (end < output.Length && (char.IsLetterOrDigit(output[end]) || output[end] == '-')) + end++; + + return output.Substring(idx, end - idx); + } + + private static bool Run(string fileName, string arguments, out string stdout) + { + stdout = null; + var psi = new ProcessStartInfo(fileName, arguments) + { + UseShellExecute = false, + CreateNoWindow = true, + RedirectStandardOutput = true, + RedirectStandardError = true, + }; + + using (var process = Process.Start(psi)) + { + if (process == null) + return false; + + // Read before WaitForExit to avoid a full-pipe deadlock. + stdout = process.StandardOutput.ReadToEnd(); + process.WaitForExit(); + return process.ExitCode == 0; + } + } + + [DllImport("libc", SetLastError = true)] + private static extern int chmod(string pathname, uint mode); + + private static void RestrictUnix(string path) + { + // 0600 (octal) == owner read/write only. + const uint ownerReadWrite = 0x180; + chmod(path, ownerReadWrite); + } + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/FilePermissions.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/FilePermissions.cs.meta new file mode 100644 index 00000000..211ca38a --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/FilePermissions.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e310dee2532338d4e914d3c909ea4db0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/ICommandDiscovery.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/ICommandDiscovery.cs new file mode 100644 index 00000000..8ac10544 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/ICommandDiscovery.cs @@ -0,0 +1,18 @@ +using System.Collections.Generic; +using System.Reflection; + +namespace Unity.Pipeline.Commands +{ + /// + /// Interface for command discovery mechanism. + /// Allows Runtime assembly to discover commands without directly using Editor APIs. + /// + public interface ICommandDiscovery + { + /// + /// Find all methods marked with CliCommand attribute. + /// Implementation uses TypeCache in Editor or reflection fallback in Runtime. + /// + IEnumerable GetMethodsWithAttribute() where T : System.Attribute; + } +} \ No newline at end of file diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/ICommandDiscovery.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/ICommandDiscovery.cs.meta new file mode 100644 index 00000000..4110a5b4 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/ICommandDiscovery.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c6e1392c576ec4d4d9b389d5fc899303 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/IStructuredCommandInput.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/IStructuredCommandInput.cs new file mode 100644 index 00000000..fafd213a --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/IStructuredCommandInput.cs @@ -0,0 +1,28 @@ +namespace Unity.Pipeline.Commands +{ + /// + /// Marker for a command parameter type that should be advertised to clients as a nested JSON + /// object schema in GET /api/commands, instead of collapsing to string. + /// + /// Convention for command authors: when a command needs a structured (multi-field) argument, + /// declare a small DTO that implements this interface and take it as a single parameter. The + /// reflects over the type's public, writable fields and + /// properties to emit { "type": "object", "properties": { ... } } (recursing into nested + /// members and arrays/lists of them). At runtime the value + /// deserializes automatically via Newtonsoft in + /// BasePipelineServer.ExtractCommandParameters, so no extra wiring is needed. + /// + /// Member metadata: + /// + /// Annotate members with [CliArg(name, description, Required = ...)] to control the + /// property name, description, and whether it appears in the schema's required array + /// (mirrors how command parameters are described). + /// Without a [CliArg], the member name (or its Newtonsoft [JsonProperty] name) + /// is used and the member is optional. + /// [JsonIgnore] members are omitted from the schema. + /// + /// + public interface IStructuredCommandInput + { + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/IStructuredCommandInput.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/IStructuredCommandInput.cs.meta new file mode 100644 index 00000000..cc7ec9a1 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/IStructuredCommandInput.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 366b2704c3b5c044aa544fe545d462f0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/JsonSchemaGenerator.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/JsonSchemaGenerator.cs new file mode 100644 index 00000000..c39be687 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/JsonSchemaGenerator.cs @@ -0,0 +1,324 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; + +namespace Unity.Pipeline.Commands +{ + /// + /// Generates JSON Schema for CLI commands to enable parameter validation and help generation. + /// Produces standard JSON Schema format that CLI tools can use for validation and auto-completion. + /// + /// Primitive, enum, and array parameters map directly. Parameters whose type implements + /// are emitted as nested object schemas (recursing into + /// structured members and arrays/lists of them) rather than collapsing to string, so + /// agents calling the package — directly or as MCP tools whose schemas come from + /// GET /api/commands — can construct structured arguments reliably. + /// + public static class JsonSchemaGenerator + { + /// + /// Generate JSON Schema for a command. + /// Returns standard JSON Schema format for CLI validation. + /// + public static string GenerateCommandSchema(CommandInfo command) + { + if (command == null) + throw new ArgumentNullException(nameof(command)); + + var schema = new JObject + { + ["$schema"] = "http://json-schema.org/draft-07/schema#", + ["type"] = "object", + ["title"] = command.Name, + ["description"] = command.Description, + ["properties"] = GenerateParameterProperties(command.Parameters), + ["required"] = new JArray(command.Parameters.Where(p => p.Required).Select(p => p.Name)), + ["additionalProperties"] = false + }; + + // Add command metadata for CLI tools + schema["x-command-metadata"] = new JObject + { + ["mainThreadRequired"] = command.MainThreadRequired, + ["methodName"] = $"{command.Method.DeclaringType?.FullName}.{command.Method.Name}" + }; + + return schema.ToString(Formatting.Indented); + } + + /// + /// Generate properties section of JSON Schema from command parameters. + /// + private static JObject GenerateParameterProperties(IEnumerable parameters) + { + var properties = new JObject(); + + foreach (var parameter in parameters) + { + properties[parameter.Name] = GenerateParameterSchema(parameter); + } + + return properties; + } + + /// + /// Generate JSON Schema for a single top-level command parameter. + /// + private static JObject GenerateParameterSchema(CommandParameterInfo parameter) + { + var schema = GenerateTypeSchema(parameter.ParameterType, new HashSet()); + schema["description"] = parameter.Description; + + // Add default value if present (skip for objects/arrays whose default is typically null) + if (parameter.DefaultValue != null) + { + try + { + schema["default"] = JToken.FromObject(parameter.DefaultValue); + } + catch + { + // Non-serializable default; omit rather than fail schema generation. + } + } + + return schema; + } + + /// + /// Build the schema fragment for a CLR type: scalar/enum, array/list, or — for + /// types — a nested object schema. + /// tracks structured types currently being expanded so self-referential graphs don't recurse + /// forever. + /// + private static JObject GenerateTypeSchema(Type type, HashSet visited) + { + // Unwrap Nullable so e.g. int? schemas as "integer". + var underlying = Nullable.GetUnderlyingType(type); + if (underlying != null) + type = underlying; + + if (typeof(IStructuredCommandInput).IsAssignableFrom(type) && !type.IsAbstract && !type.IsInterface) + return GenerateObjectSchema(type, visited); + + if (TryGetEnumerableElementType(type, out var elementType)) + { + return new JObject + { + ["type"] = "array", + ["items"] = GenerateTypeSchema(elementType, visited) + }; + } + + var schema = new JObject(); + var (jsonType, format) = MapTypeToJsonSchema(type); + schema["type"] = jsonType; + + if (!string.IsNullOrEmpty(format)) + schema["format"] = format; + + if (type.IsEnum) + schema["enum"] = new JArray(Enum.GetNames(type)); + + return schema; + } + + /// + /// Emit a nested object schema for an type by reflecting + /// its public, writable fields and properties. + /// + private static JObject GenerateObjectSchema(Type type, HashSet visited) + { + var schema = new JObject { ["type"] = "object" }; + + // Cycle guard: if we're already expanding this type higher in the stack, stop recursing + // and emit an open object rather than looping. + if (!visited.Add(type)) + { + schema["additionalProperties"] = true; + return schema; + } + + try + { + var properties = new JObject(); + var required = new JArray(); + + foreach (var member in GetSchemaMembers(type)) + { + var memberSchema = GenerateTypeSchema(member.Type, visited); + if (!string.IsNullOrEmpty(member.Description)) + memberSchema["description"] = member.Description; + + properties[member.Name] = memberSchema; + if (member.Required) + required.Add(member.Name); + } + + schema["properties"] = properties; + if (required.Count > 0) + schema["required"] = required; + schema["additionalProperties"] = false; + } + finally + { + visited.Remove(type); + } + + return schema; + } + + /// + /// Enumerate the schema-bearing members of a structured-input type: public instance fields and + /// read/write properties. Honors [JsonIgnore], and reads name/description/required from + /// [CliArg] (falling back to a Newtonsoft [JsonProperty] name, then the member name). + /// + private static IEnumerable GetSchemaMembers(Type type) + { + const BindingFlags flags = BindingFlags.Public | BindingFlags.Instance; + + foreach (var field in type.GetFields(flags)) + { + if (field.IsInitOnly || field.IsLiteral) + continue; + if (field.GetCustomAttribute() != null) + continue; + + yield return ToSchemaMember(field, field.FieldType); + } + + foreach (var property in type.GetProperties(flags)) + { + if (!property.CanRead || !property.CanWrite) + continue; + if (property.GetIndexParameters().Length > 0) + continue; + if (property.GetCustomAttribute() != null) + continue; + + yield return ToSchemaMember(property, property.PropertyType); + } + } + + private static SchemaMember ToSchemaMember(MemberInfo member, Type memberType) + { + var cliArg = member.GetCustomAttribute(); + var jsonProperty = member.GetCustomAttribute(); + + return new SchemaMember + { + Name = cliArg?.Name ?? jsonProperty?.PropertyName ?? member.Name, + Type = memberType, + Description = cliArg?.Description, + Required = cliArg?.Required ?? false + }; + } + + /// + /// Detect a JSON-array-shaped type (arrays and common generic collections) and yield its + /// element type. string is intentionally excluded (it is + /// of char but maps to a JSON string). + /// + private static bool TryGetEnumerableElementType(Type type, out Type elementType) + { + elementType = null; + + if (type == typeof(string)) + return false; + + if (type.IsArray) + { + elementType = type.GetElementType(); + return elementType != null; + } + + if (type.IsGenericType) + { + var definition = type.GetGenericTypeDefinition(); + if (definition == typeof(List<>) || definition == typeof(IList<>) || + definition == typeof(IEnumerable<>) || definition == typeof(ICollection<>) || + definition == typeof(IReadOnlyList<>) || definition == typeof(IReadOnlyCollection<>)) + { + elementType = type.GetGenericArguments()[0]; + return true; + } + } + + return false; + } + + /// + /// Map a scalar/enum C# type to JSON Schema type and format. Object and array shapes are + /// handled by before this is reached; anything else falls + /// back to string. + /// + private static (string type, string format) MapTypeToJsonSchema(Type csharpType) + { + // Handle nullable types + if (Nullable.GetUnderlyingType(csharpType) != null) + { + csharpType = Nullable.GetUnderlyingType(csharpType); + } + + // String types + if (csharpType == typeof(string) || csharpType == typeof(char)) + { + return ("string", null); + } + + // Integer types + if (csharpType == typeof(int) || csharpType == typeof(long) || + csharpType == typeof(short) || csharpType == typeof(byte) || + csharpType == typeof(uint) || csharpType == typeof(ulong) || + csharpType == typeof(ushort) || csharpType == typeof(sbyte)) + { + return ("integer", null); + } + + // Number types + if (csharpType == typeof(float) || csharpType == typeof(double) || csharpType == typeof(decimal)) + { + return ("number", null); + } + + // Boolean type + if (csharpType == typeof(bool)) + { + return ("boolean", null); + } + + // Enum types - represent as string with enum constraint (added by the caller) + if (csharpType.IsEnum) + { + return ("string", null); + } + + // DateTime types + if (csharpType == typeof(DateTime) || csharpType == typeof(DateTimeOffset)) + { + return ("string", "date-time"); + } + + // Guid type + if (csharpType == typeof(Guid)) + { + return ("string", "uuid"); + } + + // Default to string for unknown types + return ("string", null); + } + + /// A reflected member of a structured-input type, flattened for schema emission. + private struct SchemaMember + { + public string Name; + public Type Type; + public string Description; + public bool Required; + } + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/JsonSchemaGenerator.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/JsonSchemaGenerator.cs.meta new file mode 100644 index 00000000..34f6582b --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/JsonSchemaGenerator.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 779098faca184884f9f588e41c4c0898 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/MaxLengthStream.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/MaxLengthStream.cs new file mode 100644 index 00000000..aa41352f --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/MaxLengthStream.cs @@ -0,0 +1,97 @@ +using System; +using System.IO; +using System.Threading; +using System.Threading.Tasks; + +namespace Unity.Pipeline +{ + /// + /// Read-only stream wrapper that enforces a maximum number of bytes read from an inner stream. + /// Once cumulative reads exceed maxBytes, the next read throws + /// . Used to cap HTTP request bodies even when the + /// Content-Length header is absent or untruthful (e.g. chunked transfer-encoding), so an + /// oversized body cannot be buffered into memory. + /// + internal sealed class MaxLengthStream : Stream + { + private readonly Stream m_Inner; + private readonly long m_MaxBytes; + private readonly bool m_LeaveOpen; + private long m_TotalRead; + + /// + /// When true, disposing this wrapper does not dispose . The server + /// uses this so it can keep reading (draining) the raw request stream after the wrapper is + /// disposed on an over-limit read. + /// + public MaxLengthStream(Stream inner, long maxBytes, bool leaveOpen = false) + { + m_Inner = inner ?? throw new ArgumentNullException(nameof(inner)); + m_MaxBytes = maxBytes; + m_LeaveOpen = leaveOpen; + } + + public override int Read(byte[] buffer, int offset, int count) + { + var read = m_Inner.Read(buffer, offset, count); + Account(read); + return read; + } + + public override async Task ReadAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) + { + var read = await m_Inner.ReadAsync(buffer, offset, count, cancellationToken); + Account(read); + return read; + } + + // Throw as soon as the running total exceeds the cap. Exactly maxBytes is allowed. + private void Account(int read) + { + if (read <= 0) + return; + + m_TotalRead += read; + if (m_TotalRead > m_MaxBytes) + throw new RequestTooLargeException(m_MaxBytes); + } + + public override bool CanRead => true; + public override bool CanSeek => false; + public override bool CanWrite => false; + public override long Length => throw new NotSupportedException(); + public override long Position + { + get => m_TotalRead; + set => throw new NotSupportedException(); + } + + public override void Flush() { } + public override long Seek(long offset, SeekOrigin origin) => throw new NotSupportedException(); + public override void SetLength(long value) => throw new NotSupportedException(); + public override void Write(byte[] buffer, int offset, int count) => throw new NotSupportedException(); + + protected override void Dispose(bool disposing) + { + // Own the inner stream's lifetime (matching the previous `using (StreamReader(InputStream))`) + // unless the caller asked to leave it open so it can keep reading from it afterwards. + if (disposing && !m_LeaveOpen) + m_Inner.Dispose(); + base.Dispose(disposing); + } + } + + /// + /// Thrown by when a read would exceed the configured byte cap. + /// + internal sealed class RequestTooLargeException : Exception + { + public long MaxBytes { get; } + + public RequestTooLargeException(long maxBytes) + : base($"Request body exceeds the maximum allowed size of {maxBytes} bytes.") + { + MaxBytes = maxBytes; + } + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/MaxLengthStream.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/MaxLengthStream.cs.meta new file mode 100644 index 00000000..1b0dca1c --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/MaxLengthStream.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d75fa6089aa06114c9450387a6d816ad +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/ParameterInfo.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/ParameterInfo.cs new file mode 100644 index 00000000..3a5ac55e --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/ParameterInfo.cs @@ -0,0 +1,55 @@ +using System; + +namespace Unity.Pipeline.Commands +{ + /// + /// Information about a CLI command parameter. + /// Contains metadata needed for parameter validation and CLI help generation. + /// + public class CommandParameterInfo + { + /// + /// Name of the parameter for CLI arguments. + /// + public string Name { get; } + + /// + /// Human-readable description of the parameter. + /// + public string Description { get; } + + /// + /// Whether this parameter is required for command execution. + /// + public bool Required { get; } + + /// + /// Type of the parameter for validation and conversion. + /// + public Type ParameterType { get; } + + /// + /// Default value for optional parameters. + /// + public object DefaultValue { get; } + + /// + /// Create parameter information from discovery. + /// + public CommandParameterInfo(string name, string description, bool required, + Type parameterType, object defaultValue = null) + { + Name = name ?? throw new ArgumentNullException(nameof(name)); + Description = description ?? throw new ArgumentNullException(nameof(description)); + ParameterType = parameterType ?? throw new ArgumentNullException(nameof(parameterType)); + Required = required; + DefaultValue = defaultValue; + } + + public override string ToString() + { + return $"{Name} Required:{Required} Type:{ParameterType}"; + } + + } +} \ No newline at end of file diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/ParameterInfo.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/ParameterInfo.cs.meta new file mode 100644 index 00000000..445c8ac7 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/ParameterInfo.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7127497e92677024f949772c30aaf79b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/PipelineUtils.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/PipelineUtils.cs new file mode 100644 index 00000000..4e216830 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/PipelineUtils.cs @@ -0,0 +1,163 @@ +using System.Collections.Generic; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using UnityEngine; +#if UNITY_6000_3_OR_NEWER +using UnityEngine.Assemblies; +#endif + +namespace Unity.Pipeline +{ + /// + /// Version-stable handle to a Unity object id. In 6000.4 Unity replaced the int instance id with + /// (a ulong-backed handle), made Object.GetInstanceID() / + /// EditorUtility.InstanceIDToObject(int) obsolete-as-error, and is removing the + /// EntityId<->int conversions. This struct stores the concrete id type for the + /// running editor — on 6000.4+, int below — and converts implicitly to + /// it so it can be passed straight to Unity APIs. All version branching for object ids is confined + /// here. It (de)serializes as a single JSON integer (the raw ulong on 6000.4+, the int below). + /// + [JsonConverter(typeof(ObjectIdConverter))] + public readonly struct ObjectId : System.IEquatable + { +#if UNITY_6000_4_OR_NEWER + readonly EntityId m_Value; + public ObjectId(EntityId value) { m_Value = value; } + public static implicit operator EntityId(ObjectId id) => id.m_Value; + public static implicit operator ObjectId(EntityId value) => new ObjectId(value); + /// Raw 64-bit id — the canonical wire / serialization form. + public ulong RawValue => EntityId.ToULong(m_Value); + public static ObjectId FromRaw(ulong raw) => new ObjectId(EntityId.FromULong(raw)); + public bool Equals(ObjectId other) => m_Value.Equals(other.m_Value); + public override int GetHashCode() => m_Value.GetHashCode(); +#else + readonly int m_Value; + public ObjectId(int value) { m_Value = value; } + public static implicit operator int(ObjectId id) => id.m_Value; + public static implicit operator ObjectId(int value) => new ObjectId(value); + /// Raw id — the canonical wire / serialization form. + public long RawValue => m_Value; + public static ObjectId FromRaw(long raw) => new ObjectId((int)raw); + public bool Equals(ObjectId other) => m_Value == other.m_Value; + public override int GetHashCode() => m_Value; +#endif + public override bool Equals(object obj) => obj is ObjectId other && Equals(other); + public override string ToString() => RawValue.ToString(); + + /// Parse the canonical numeric form produced by . + public static ObjectId Parse(string s) + { +#if UNITY_6000_4_OR_NEWER + return FromRaw(ulong.Parse(s)); +#else + return FromRaw(long.Parse(s)); +#endif + } + + /// Try to parse the canonical numeric form produced by . + public static bool TryParse(string s, out ObjectId id) + { +#if UNITY_6000_4_OR_NEWER + if (ulong.TryParse(s, out var raw)) { id = FromRaw(raw); return true; } +#else + if (long.TryParse(s, out var raw)) { id = FromRaw(raw); return true; } +#endif + id = default; + return false; + } + } + + /// JSON converter: an is a single integer on the wire. + public sealed class ObjectIdConverter : JsonConverter + { + public override void WriteJson(JsonWriter writer, ObjectId value, JsonSerializer serializer) + { + writer.WriteValue(value.RawValue); + } + + public override ObjectId ReadJson(JsonReader reader, System.Type objectType, ObjectId existingValue, + bool hasExistingValue, JsonSerializer serializer) + { + var token = JToken.Load(reader); + switch (token.Type) + { + case JTokenType.Integer: +#if UNITY_6000_4_OR_NEWER + return ObjectId.FromRaw(token.Value()); +#else + return ObjectId.FromRaw(token.Value()); +#endif + case JTokenType.String: + return ObjectId.Parse((string)token); + default: + return default; + } + } + } + + public static class PipelineUtils + { + public static string GetLoadedAssemblyPath(System.Reflection.Assembly a) + { +#if UNITY_6000_5_OR_NEWER + return a.GetLoadedAssemblyPath(); +#else + return a.Location; +#endif + } + + public static System.Reflection.Assembly LoadFromBytes(byte[] bytes, byte[] pdb = null) + { +#if UNITY_6000_5_OR_NEWER + return UnityEngine.Assemblies.CurrentAssemblies.LoadFromBytes(bytes, pdb); +#else + return System.Reflection.Assembly.Load(bytes, pdb); +#endif + } + + public static T[] FindObjectsByType() where T : Object + { +#if UNITY_6000_4_OR_NEWER + return GameObject.FindObjectsByType(); +#else + return GameObject.FindObjectsByType(FindObjectsSortMode.None) ; +#endif + } + + public static IReadOnlyList GetLoadedAssemblies() + { +#if UNITY_6000_5_OR_NEWER + return CurrentAssemblies.GetLoadedAssemblies(); +#else + return System.AppDomain.CurrentDomain.GetAssemblies(); +#endif + } + + /// The object's id as a version-stable (EntityId on 6000.4+, int below). + public static ObjectId GetObjectId(Object obj) + { +#if UNITY_6000_4_OR_NEWER + return new ObjectId(obj.GetEntityId()); +#else + return new ObjectId(obj.GetInstanceID()); +#endif + } + +#if UNITY_EDITOR + /// Resolve a loaded/scene object from its , or null if not found. + public static Object IdToObject(ObjectId id) + { +#if UNITY_6000_4_OR_NEWER + return UnityEditor.EditorUtility.EntityIdToObject(id); +#elif UNITY_6000_3_OR_NEWER + // EntityIdToObject is the non-obsolete resolver from 6000.3, but the ulong-backed ObjectId + // (GetRawData/FromULong) doesn't exist until 6000.4 — so ObjectId is still int-backed here and + // we route the int through the (non-obsolete on 6.3) int->EntityId conversion. + return UnityEditor.EditorUtility.EntityIdToObject((int)id); +#else + return UnityEditor.EditorUtility.InstanceIDToObject((int)id); +#endif + } +#endif + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/PipelineUtils.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/PipelineUtils.cs.meta new file mode 100644 index 00000000..436cb52e --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Common/PipelineUtils.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e6c6a6cac05ac41438850c53ea3178b1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Compilation.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Compilation.meta new file mode 100644 index 00000000..ded6006a --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Compilation.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 257ad47737473da48b7569484405904e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Compilation/EvalCodeCompiler.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Compilation/EvalCodeCompiler.cs new file mode 100644 index 00000000..ab220383 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Compilation/EvalCodeCompiler.cs @@ -0,0 +1,327 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using Unity.Pipeline.Models; +using UnityEngine; + +namespace Unity.Pipeline.Compilation +{ + /// + /// C# code evaluation service using shared Roslyn compilation infrastructure. + /// Wraps user code in Execute() method, compiles, and executes with result serialization. + /// Supports both Editor and Runtime compilation for desktop development builds. + /// + public static class EvalCodeCompiler + { +#if UNITY_EDITOR || (UNITY_STANDALONE && DEBUG) + + // Fixed lines in the generated source before user code begins + private const int BaseCodeLineOffset = 11; + + /// + /// Compile and execute code on Unity's main thread using Roslyn. + /// Eval is a MainThreadRequired command, so the server marshals the caller to the main + /// thread before invoking this; compilation + execution run synchronously here. + /// + public static EvalResponse CompileAndExecuteOnMainThread(string code, int timeoutMs, System.Diagnostics.Stopwatch stopwatch) + { + if (stopwatch == null) + { + stopwatch = System.Diagnostics.Stopwatch.StartNew(); + } + + try + { + // Compile on current thread + var compilationResult = CompileCodeToAssembly(code, timeoutMs, stopwatch); + + if (!compilationResult.Success) + { + stopwatch.Stop(); + return EvalResponse.EvalFailure( + "Compilation Failed", + "Code compilation failed", + stopwatch.ElapsedMilliseconds, + compilationResult.Diagnostics); + } + + // Execute on current thread + var executionResult = ExecuteCompiledAssembly(compilationResult.Assembly); + + stopwatch.Stop(); + + if (executionResult.Success) + { + return EvalResponse.EvalSuccess( + executionResult.ReturnValue, + executionResult.Output, + stopwatch.ElapsedMilliseconds); + } + else + { + return EvalResponse.EvalFailure( + executionResult.Error, + executionResult.ErrorDetails, + stopwatch.ElapsedMilliseconds); + } + } + catch (Exception ex) + { + stopwatch.Stop(); + return EvalResponse.EvalFailure( + "Execution Failed", + ex.ToString(), + stopwatch.ElapsedMilliseconds); + } + } + + /// + /// Compile C# code to assembly using shared RoslynCompilationService. + /// Thread-safe and can run on background thread. + /// + private static CompilationResult CompileCodeToAssembly(string userCode, int timeoutMs, System.Diagnostics.Stopwatch stopwatch) + { + var id = Guid.NewGuid().ToString("N").Substring(0, 8); + + // Generate wrapper code + var sourceCode = BuildSourceCode(id, userCode, Application.isEditor); + + // Use shared compilation service + var request = new CompilationRequest + { + SourceCode = sourceCode, + AssemblyName = $"PipelineEval_{id}", + LineNumberOffset = BaseCodeLineOffset // Adjust diagnostics for wrapper code + }; + + var result = RoslynCompilationService.Compile(request); + + if (result.Success) + { + // Add execution context for eval-specific needs + return new CompilationResult + { + Success = true, + Assembly = result.Assembly, + ExecutionContext = new ExecutionContext + { + AssemblyId = id, + TypeName = $"PipelineEvaluation.PipelineEval_{id}", + MethodName = "Execute" + }, + Diagnostics = result.Diagnostics + }; + } + else + { + return new CompilationResult + { + Success = false, + Diagnostics = result.Diagnostics + }; + } + } + + /// + /// Generate C# source code wrapper for user code with conditional editor support. + /// + private static string BuildSourceCode(string id, string userCode, bool isEditorContext) + { + var editorUsing = isEditorContext ? "using UnityEditor;" : ""; + + return $@"using System; +using System.Collections.Generic; +using System.Linq; +using UnityEngine; +{editorUsing} + +namespace PipelineEvaluation +{{ + public static class PipelineEval_{id} + {{ + public static object Execute() + {{ + {userCode} + return null; + }} + }} +}}"; + } + + + /// + /// Execute compiled assembly and return result. + /// Must run on Unity's main thread for safe Unity API access. + /// + private static ExecutionResult ExecuteCompiledAssembly(Assembly assembly) + { + try + { + var executionContext = GetExecutionContextFromAssembly(assembly); + + var type = assembly.GetType(executionContext.TypeName); + var method = type?.GetMethod(executionContext.MethodName, BindingFlags.Public | BindingFlags.Static); + + if (type == null) + { + return new ExecutionResult + { + Success = false, + Error = "Assembly Load Error", + ErrorDetails = $"Could not find type {executionContext.TypeName} in compiled assembly" + }; + } + + if (method == null) + { + return new ExecutionResult + { + Success = false, + Error = "Method Not Found", + ErrorDetails = $"Could not find method {executionContext.MethodName} in compiled type" + }; + } + + var result = method.Invoke(null, null); + + return new ExecutionResult + { + Success = true, + ReturnValue = SerializeResult(result) + }; + } + catch (TargetInvocationException tie) when (tie.InnerException != null) + { + return new ExecutionResult + { + Success = false, + Error = "Runtime Error", + ErrorDetails = tie.InnerException.Message, + StackTrace = tie.InnerException.StackTrace + }; + } + catch (Exception ex) + { + return new ExecutionResult + { + Success = false, + Error = "Execution Error", + ErrorDetails = ex.Message, + StackTrace = ex.StackTrace + }; + } + } + + /// + /// Get execution context from compiled assembly. + /// + private static ExecutionContext GetExecutionContextFromAssembly(Assembly assembly) + { + // Find PipelineEvaluation types + var evalTypes = assembly.GetTypes() + .Where(t => t.Namespace == "PipelineEvaluation" && t.Name.StartsWith("PipelineEval_")) + .ToList(); + + if (evalTypes.Any()) + { + var evalType = evalTypes.First(); + return new ExecutionContext + { + TypeName = evalType.FullName, + MethodName = "Execute" + }; + } + + // Fallback + return new ExecutionContext + { + TypeName = "PipelineEvaluation.PipelineEval_Unknown", + MethodName = "Execute" + }; + } + + /// + /// Serialize result for JSON response. + /// + private static object SerializeResult(object value) + { + if (value == null) return null; + + // Handle primitive types directly + if (value is string || value is bool || value is int || value is long || value is float || value is double) + return value; + + // Handle Unity objects + if (value is UnityEngine.Object unityObj) + { + try + { + return Newtonsoft.Json.JsonConvert.DeserializeObject(UnityEngine.JsonUtility.ToJson(unityObj)); + } + catch + { + return value.ToString(); + } + } + + // Handle other objects via JSON serialization + try + { + return Newtonsoft.Json.JsonConvert.DeserializeObject( + Newtonsoft.Json.JsonConvert.SerializeObject(value)); + } + catch + { + return value.ToString(); + } + } + + /// + /// Result from compilation process. + /// + private class CompilationResult + { + public bool Success { get; set; } + public Assembly Assembly { get; set; } + public ExecutionContext ExecutionContext { get; set; } + public List Diagnostics { get; set; } = new List(); + } + + /// + /// Result from code execution. + /// + private class ExecutionResult + { + public bool Success { get; set; } + public object ReturnValue { get; set; } + public string Output { get; set; } + public string Error { get; set; } + public string ErrorDetails { get; set; } + public string StackTrace { get; set; } + } + + /// + /// Execution context for compiled assembly. + /// + private class ExecutionContext + { + public string AssemblyId { get; set; } + public string TypeName { get; set; } + public string MethodName { get; set; } + } + +#else + /// + /// Runtime compilation not supported on this platform. + /// Desktop development builds only (Windows/Mac/Linux). + /// + public static EvalResponse CompileAndExecuteOnMainThread(string code, int timeoutMs, System.Diagnostics.Stopwatch stopwatch) + { + return EvalResponse.EvalFailure( + "Platform Not Supported", + "Runtime code compilation only supported on Desktop development builds"); + } +#endif + } +} \ No newline at end of file diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Compilation/EvalCodeCompiler.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Compilation/EvalCodeCompiler.cs.meta new file mode 100644 index 00000000..09eebd06 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Compilation/EvalCodeCompiler.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1ea6a44edd711194a968a40f1eb16f59 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Compilation/HotReloadCompiler.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Compilation/HotReloadCompiler.cs new file mode 100644 index 00000000..4b415e8a --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Compilation/HotReloadCompiler.cs @@ -0,0 +1,804 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Threading.Tasks; +using Unity.Pipeline.HotReload; +using Unity.Pipeline.Models; +using Unity.Pipeline.Threading; +using UnityEngine; + +namespace Unity.Pipeline.Compilation +{ + /// + /// Compiles hot reload source files using shared RoslynCompilationService. + /// Creates versioned DLLs and manages hot reload assembly lifecycle. + /// Fixed deadlock issue by adding main thread detection like EvalCodeCompiler. + /// + public static class HotReloadCompiler + { +#if UNITY_EDITOR || (UNITY_STANDALONE && DEBUG) + + private static readonly Dictionary _versionTracker = new(); + private const string HotReloadTempDir = "Temp/HotReload"; + + /// + /// Compile a hot reload source file and apply the overrides immediately. + /// Fixed deadlock by detecting main thread and running synchronously when needed. + /// + /// Hot reload file to compile + /// Optional directory to save compiled assembly to disk. If null, assembly stays in memory only. + public static Task CompileAndApplyAsync(string filename, string assemblyDir = null) + { + // Hot reload commands are MainThreadRequired, so we are already on the main thread. + // Run synchronously (no background thread / dispatcher). Returns a completed Task for + // signature compatibility. + return Task.FromResult(CompileAndApplyOnMainThread(filename, assemblyDir)); + } + + public static string GetHotReloadPath(string filePath) + { + if (Path.IsPathRooted(filePath)) + return filePath; + + // Relative paths are resolved against the current working directory (the Unity + // project root). Override files can live in any folder; there is no special + // "HotReload" location. + return Path.GetFullPath(filePath); + } + + /// + /// Compile and apply on main thread synchronously to avoid deadlocks. + /// + /// Hot reload file to compile + /// Optional directory to save compiled assembly to disk. If null, assembly stays in memory only. + public static HotReloadCompileResult CompileAndApplyOnMainThread(string filename, string assemblyDir = null) + { + var stopwatch = System.Diagnostics.Stopwatch.StartNew(); + + try + { + // Resolve the override file path (absolute, or relative to the project root). + var hotReloadPath = GetHotReloadPath(filename); + if (!File.Exists(hotReloadPath)) + { + return HotReloadCompileResult.Failure( + "File Not Found", + $"Hot reload file not found: {hotReloadPath}", + stopwatch.ElapsedMilliseconds); + } + + Debug.Log($"HotReload: Starting synchronous compilation of {filename}"); + + // Read source code + var sourceCode = File.ReadAllText(hotReloadPath); + if (string.IsNullOrWhiteSpace(sourceCode)) + { + return HotReloadCompileResult.Failure( + "Empty File", + $"Hot reload file is empty: {hotReloadPath}", + stopwatch.ElapsedMilliseconds); + } + + // Generate versioned assembly name + var baseFilename = Path.GetFileNameWithoutExtension(filename); + var nextVersion = GetNextVersion(baseFilename); + var assemblyName = $"{baseFilename}_{nextVersion:D3}"; + + // Ensure temp directory exists + Directory.CreateDirectory(HotReloadTempDir); + + // Compile using shared RoslynCompilationService + var compilationResult = CompileHotReloadAssembly(sourceCode, assemblyName); + + if (!compilationResult.Success) + { + return HotReloadCompileResult.Failure( + "Compilation Failed", + "Hot reload file compilation failed", + stopwatch.ElapsedMilliseconds, + compilationResult.Diagnostics.Select(d => d.Message).ToList()); + } + + // Register hot reload methods from compiled assembly + var registeredMethods = RegisterHotReloadMethods(compilationResult.Assembly, assemblyName, out var skippedOverrides); + + // Save assembly to disk if assemblyDir is specified + string actualAssemblyPath = null; + if (!string.IsNullOrWhiteSpace(assemblyDir)) + { + Directory.CreateDirectory(assemblyDir); + actualAssemblyPath = Path.Combine(assemblyDir, $"{assemblyName}.dll"); + File.WriteAllBytes(actualAssemblyPath, compilationResult.AssemblyBytes); + Debug.Log($"HotReload: Assembly saved to disk: {actualAssemblyPath}"); + } + else + { + actualAssemblyPath = Path.Combine(HotReloadTempDir, $"{assemblyName}.dll"); // For compatibility (in-memory) + } + + stopwatch.Stop(); + + Debug.Log($"HotReload: Successfully compiled {filename} -> {assemblyName}.dll with {registeredMethods.Count} methods in {stopwatch.ElapsedMilliseconds}ms"); + + var compileResult = HotReloadCompileResult.Success( + assemblyName, + actualAssemblyPath, + registeredMethods, + stopwatch.ElapsedMilliseconds); + compileResult.Diagnostics = skippedOverrides; + return compileResult; + } + catch (Exception ex) + { + stopwatch.Stop(); + Debug.LogError($"HotReload: Synchronous compilation failed for {filename}: {ex.Message}"); + return HotReloadCompileResult.Failure( + "Exception", + ex.ToString(), + stopwatch.ElapsedMilliseconds); + } + } + + /// + /// Internal async compilation implementation for background threads. + /// + /// Hot reload file to compile + /// Optional directory to save compiled assembly to disk. If null, assembly stays in memory only. + private static async Task CompileAndApplyInternalAsync(string filename, string assemblyDir = null) + { + var stopwatch = System.Diagnostics.Stopwatch.StartNew(); + + try + { + // Resolve the override file path (absolute, or relative to the project root). + var hotReloadPath = GetHotReloadPath(filename); + if (!File.Exists(hotReloadPath)) + { + return HotReloadCompileResult.Failure( + "File Not Found", + $"Hot reload file not found: {hotReloadPath}", + stopwatch.ElapsedMilliseconds); + } + + Debug.Log($"HotReload: Starting async compilation of {filename}"); + + // Read source code + var sourceCode = File.ReadAllText(hotReloadPath); + if (string.IsNullOrWhiteSpace(sourceCode)) + { + return HotReloadCompileResult.Failure( + "Empty File", + $"Hot reload file is empty: {hotReloadPath}", + stopwatch.ElapsedMilliseconds); + } + + // Generate versioned assembly name + var baseFilename = Path.GetFileNameWithoutExtension(filename); + var nextVersion = GetNextVersion(baseFilename); + var assemblyName = $"{baseFilename}_{nextVersion:D3}"; + + // Ensure temp directory exists + Directory.CreateDirectory(HotReloadTempDir); + + // Compile using shared RoslynCompilationService async + var compilationResult = await CompileHotReloadAssemblyAsync(sourceCode, assemblyName); + + if (!compilationResult.Success) + { + return HotReloadCompileResult.Failure( + "Compilation Failed", + "Hot reload file compilation failed", + stopwatch.ElapsedMilliseconds, + compilationResult.Diagnostics.Select(d => d.Message).ToList()); + } + + // Register hot reload methods from compiled assembly + var registeredMethods = RegisterHotReloadMethods(compilationResult.Assembly, assemblyName, out var skippedOverrides); + + // Save assembly to disk if assemblyDir is specified + string actualAssemblyPath = null; + if (!string.IsNullOrWhiteSpace(assemblyDir)) + { + Directory.CreateDirectory(assemblyDir); + actualAssemblyPath = Path.Combine(assemblyDir, $"{assemblyName}.dll"); + File.WriteAllBytes(actualAssemblyPath, compilationResult.AssemblyBytes); + Debug.Log($"HotReload: Assembly saved to disk: {actualAssemblyPath}"); + } + else + { + actualAssemblyPath = Path.Combine(HotReloadTempDir, $"{assemblyName}.dll"); // For compatibility (in-memory) + } + + stopwatch.Stop(); + + Debug.Log($"HotReload: Successfully compiled {filename} -> {assemblyName}.dll with {registeredMethods.Count} methods in {stopwatch.ElapsedMilliseconds}ms"); + + var compileResult = HotReloadCompileResult.Success( + assemblyName, + actualAssemblyPath, + registeredMethods, + stopwatch.ElapsedMilliseconds); + compileResult.Diagnostics = skippedOverrides; + return compileResult; + } + catch (Exception ex) + { + stopwatch.Stop(); + Debug.LogError($"HotReload: Async compilation failed for {filename}: {ex.Message}"); + return HotReloadCompileResult.Failure( + "Exception", + ex.ToString(), + stopwatch.ElapsedMilliseconds); + } + } + + /// + /// Compile hot reload source code directly (for in-place editing workflow). + /// + /// Hot reload source code to compile + /// Base filename for versioned assembly naming + /// Optional directory to save compiled assembly to disk + public static Task CompileSourceCodeAsync(string sourceCode, string baseFileName, string assemblyDir = null, bool emitPdb = false, string documentPath = null) + { + // Runs synchronously on the calling (main) thread; returns a completed Task. + return Task.FromResult(CompileSourceCodeOnMainThread(sourceCode, baseFileName, assemblyDir, emitPdb, documentPath)); + } + + /// + /// Compile source code on main thread synchronously to avoid deadlocks. + /// + /// Emit a portable PDB and load symbols so breakpoints can bind. + /// Source document path recorded in the PDB (the original .cs file). + public static HotReloadCompilationResult CompileSourceCodeOnMainThread(string sourceCode, string baseFileName, string assemblyDir = null, bool emitPdb = false, string documentPath = null) + { + var stopwatch = System.Diagnostics.Stopwatch.StartNew(); + + try + { + Debug.Log($"HotReload: Starting synchronous source code compilation for {baseFileName}"); + + if (string.IsNullOrWhiteSpace(sourceCode)) + { + return HotReloadCompilationResult.Failure( + "Empty Source Code", + "Source code cannot be empty", + stopwatch.ElapsedMilliseconds); + } + + // Generate versioned assembly name + var nextVersion = GetNextVersion(baseFileName); + var assemblyName = $"{baseFileName}_{nextVersion:D3}"; + + // Ensure temp directory exists + Directory.CreateDirectory(HotReloadTempDir); + + // Compile using shared RoslynCompilationService + var compilationResult = CompileHotReloadAssembly(sourceCode, assemblyName, emitPdb, documentPath); + + if (!compilationResult.Success) + { + return HotReloadCompilationResult.Failure( + "Compilation Failed", + "Hot reload source code compilation failed", + stopwatch.ElapsedMilliseconds, + compilationResult.Diagnostics.Select(d => d.Message).ToList()); + } + + // Register hot reload methods from compiled assembly + var registeredMethods = RegisterHotReloadMethods(compilationResult.Assembly, assemblyName, out var skippedOverrides); + + // Save assembly to disk if assemblyDir is specified + string actualAssemblyPath = null; + if (!string.IsNullOrWhiteSpace(assemblyDir)) + { + Directory.CreateDirectory(assemblyDir); + actualAssemblyPath = Path.Combine(assemblyDir, $"{assemblyName}.dll"); + File.WriteAllBytes(actualAssemblyPath, compilationResult.AssemblyBytes); + Debug.Log($"HotReload: Assembly saved to disk: {actualAssemblyPath}"); + + // Symbols are loaded in-memory; also write the .pdb next to the .dll for convenience. + if (compilationResult.PdbBytes != null) + { + var pdbPath = Path.Combine(assemblyDir, $"{assemblyName}.pdb"); + File.WriteAllBytes(pdbPath, compilationResult.PdbBytes); + Debug.Log($"HotReload: Symbols saved to disk: {pdbPath}"); + } + } + else + { + actualAssemblyPath = Path.Combine(HotReloadTempDir, $"{assemblyName}.dll"); // For compatibility (in-memory) + } + + stopwatch.Stop(); + + Debug.Log($"HotReload: Successfully compiled source code -> {assemblyName}.dll with {registeredMethods.Count} methods in {stopwatch.ElapsedMilliseconds}ms"); + + var sourceCompileResult = HotReloadCompilationResult.Success( + assemblyName, + actualAssemblyPath, + registeredMethods, + stopwatch.ElapsedMilliseconds); + sourceCompileResult.Diagnostics = skippedOverrides; + return sourceCompileResult; + } + catch (Exception ex) + { + stopwatch.Stop(); + Debug.LogError($"HotReload: Synchronous source code compilation failed for {baseFileName}: {ex.Message}"); + return HotReloadCompilationResult.Failure( + "Exception", + ex.ToString(), + stopwatch.ElapsedMilliseconds); + } + } + + /// + /// Internal async source code compilation implementation for background threads. + /// + private static async Task CompileSourceCodeInternalAsync(string sourceCode, string baseFileName, string assemblyDir = null) + { + var stopwatch = System.Diagnostics.Stopwatch.StartNew(); + + try + { + Debug.Log($"HotReload: Starting async source code compilation for {baseFileName}"); + + if (string.IsNullOrWhiteSpace(sourceCode)) + { + return HotReloadCompilationResult.Failure( + "Empty Source Code", + "Source code cannot be empty", + stopwatch.ElapsedMilliseconds); + } + + // Generate versioned assembly name + var nextVersion = GetNextVersion(baseFileName); + var assemblyName = $"{baseFileName}_{nextVersion:D3}"; + + // Ensure temp directory exists + Directory.CreateDirectory(HotReloadTempDir); + + // Compile using shared RoslynCompilationService async + var compilationResult = await CompileHotReloadAssemblyAsync(sourceCode, assemblyName); + + if (!compilationResult.Success) + { + return HotReloadCompilationResult.Failure( + "Compilation Failed", + "Hot reload source code compilation failed", + stopwatch.ElapsedMilliseconds, + compilationResult.Diagnostics.Select(d => d.Message).ToList()); + } + + // Register hot reload methods from compiled assembly + var registeredMethods = RegisterHotReloadMethods(compilationResult.Assembly, assemblyName, out var skippedOverrides); + + // Save assembly to disk if assemblyDir is specified + string actualAssemblyPath = null; + if (!string.IsNullOrWhiteSpace(assemblyDir)) + { + Directory.CreateDirectory(assemblyDir); + actualAssemblyPath = Path.Combine(assemblyDir, $"{assemblyName}.dll"); + File.WriteAllBytes(actualAssemblyPath, compilationResult.AssemblyBytes); + Debug.Log($"HotReload: Assembly saved to disk: {actualAssemblyPath}"); + } + else + { + actualAssemblyPath = Path.Combine(HotReloadTempDir, $"{assemblyName}.dll"); // For compatibility (in-memory) + } + + stopwatch.Stop(); + + Debug.Log($"HotReload: Successfully compiled source code -> {assemblyName}.dll with {registeredMethods.Count} methods in {stopwatch.ElapsedMilliseconds}ms"); + + var sourceCompileResult = HotReloadCompilationResult.Success( + assemblyName, + actualAssemblyPath, + registeredMethods, + stopwatch.ElapsedMilliseconds); + sourceCompileResult.Diagnostics = skippedOverrides; + return sourceCompileResult; + } + catch (Exception ex) + { + stopwatch.Stop(); + Debug.LogError($"HotReload: Async source code compilation failed for {baseFileName}: {ex.Message}"); + return HotReloadCompilationResult.Failure( + "Exception", + ex.ToString(), + stopwatch.ElapsedMilliseconds); + } + } + + /// + /// Clean up old hot reload DLL versions, keeping only the latest for each base filename. + /// + public static HotReloadCleanupResult CleanupHotReloadDlls(string assemblyDir = null) + { + var stopwatch = System.Diagnostics.Stopwatch.StartNew(); + var deletedFiles = new List(); + + try + { + // Use specified assemblyDir or default to HotReloadTempDir + var targetDir = !string.IsNullOrWhiteSpace(assemblyDir) ? assemblyDir : HotReloadTempDir; + + if (!Directory.Exists(targetDir)) + { + return new HotReloadCleanupResult + { + Success = true, + DeletedFiles = deletedFiles, + Message = $"No hot reload directory found: {targetDir}", + ExecutionTimeMs = stopwatch.ElapsedMilliseconds + }; + } + + var dllFiles = Directory.GetFiles(targetDir, "*.dll"); + var groupedFiles = dllFiles + .Select(f => new + { + FilePath = f, + FileName = Path.GetFileNameWithoutExtension(f), + BaseFilename = ExtractBaseFilename(Path.GetFileNameWithoutExtension(f)), + Version = ExtractVersion(Path.GetFileNameWithoutExtension(f)) + }) + .Where(f => f.Version > 0) // Only versioned hot reload DLLs + .GroupBy(f => f.BaseFilename) + .ToList(); + + foreach (var group in groupedFiles) + { + var sortedFiles = group.OrderByDescending(f => f.Version).ToList(); + + // Keep the latest version, delete older ones + for (int i = 1; i < sortedFiles.Count; i++) + { + var fileToDelete = sortedFiles[i]; + File.Delete(fileToDelete.FilePath); + deletedFiles.Add(fileToDelete.FileName + ".dll"); + Debug.Log($"HotReload: Deleted old version {fileToDelete.FileName}.dll"); + } + } + + // Clear registry and reset version tracker + HotReloadRegistry.ClearAllOverrides(); + _versionTracker.Clear(); + + stopwatch.Stop(); + + Debug.Log($"HotReload: Cleanup completed - deleted {deletedFiles.Count} files in {stopwatch.ElapsedMilliseconds}ms"); + + return new HotReloadCleanupResult + { + Success = true, + DeletedFiles = deletedFiles, + Message = $"Deleted {deletedFiles.Count} old DLL versions", + ExecutionTimeMs = stopwatch.ElapsedMilliseconds + }; + } + catch (Exception ex) + { + stopwatch.Stop(); + Debug.LogError($"HotReload: Cleanup failed: {ex.Message}"); + + return new HotReloadCleanupResult + { + Success = false, + DeletedFiles = deletedFiles, + Message = $"Cleanup failed: {ex.Message}", + ExecutionTimeMs = stopwatch.ElapsedMilliseconds + }; + } + } + + /// + /// Get the next version number for a base filename. + /// + private static int GetNextVersion(string baseFilename) + { + if (!_versionTracker.ContainsKey(baseFilename)) + { + _versionTracker[baseFilename] = 0; + } + + return ++_versionTracker[baseFilename]; + } + + /// + /// Wrap hot reload user code with proper using statements and namespace. + /// + + /// + /// Compile hot reload source code using shared RoslynCompilationService. + /// Synchronous compilation for main thread use. + /// + private static CompilationResult CompileHotReloadAssembly(string sourceCode, string assemblyName, bool emitPdb = false, string documentPath = null) + { + var request = new CompilationRequest + { + SourceCode = sourceCode, + AssemblyName = assemblyName, + // Ensure Unity.Pipeline assemblies are included (contains HotReloadOverrideMethodAttribute) + // Also include test assemblies for testing scenarios + AdditionalAssemblyPrefixes = new[] { "Unity.Pipeline", "Unity.Pipeline.Tests" }, + EmitDebugInformation = emitPdb, + DocumentPath = documentPath + }; + + return RoslynCompilationService.Compile(request); + } + + /// + /// Compile hot reload source code using shared RoslynCompilationService. + /// Async compilation for background thread use. + /// + private static async Task CompileHotReloadAssemblyAsync(string sourceCode, string assemblyName) + { + var request = new CompilationRequest + { + SourceCode = sourceCode, + AssemblyName = assemblyName, + // Ensure Unity.Pipeline assemblies are included (contains HotReloadOverrideMethodAttribute) + // Also include test assemblies for testing scenarios + AdditionalAssemblyPrefixes = new[] { "Unity.Pipeline", "Unity.Pipeline.Tests" } + }; + + return await RoslynCompilationService.CompileAsync(request); + } + + /// + /// Register hot reload methods from compiled assembly with the registry. + /// Also registers any [HotReloadWithOverrides] target methods found in the assembly. + /// Only overrides that actually bind are returned; overrides that were skipped (e.g. the + /// target is not currently [HotReloadWithOverrides], or a signature mismatch) are reported via + /// with a user-facing reason. + /// + private static List RegisterHotReloadMethods(Assembly assembly, string assemblyId, out List skipped) + { + var registeredMethods = new List(); + skipped = new List(); + + try + { + Debug.Log($"HotReload: Registering methods from assembly {assemblyId} with {assembly.GetTypes().Length} types"); + + // Register assembly types for discovery + foreach (var type in assembly.GetTypes()) + { + Debug.Log($"HotReload: Processing type {type.Name} in {type.Namespace}"); + HotReloadRegistry.RegisterHotReloadType(type, assemblyId); + + // First, scan for [HotReloadWithOverrides] methods to register as targets + var allMethods = type.GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static); + foreach (var method in allMethods) + { + var reloadableAttr = method.GetCustomAttribute(); + if (reloadableAttr != null) + { + Debug.Log($"HotReload: Found reloadable method {method.Name} with ID {reloadableAttr.Id}"); + HotReloadRegistry.RegisterReloadableMethod(method, reloadableAttr); + } + } + + // Then, find methods with [HotReloadOverrideMethod] attribute for overrides + var staticMethods = type.GetMethods(BindingFlags.Public | BindingFlags.Static); + Debug.Log($"HotReload: Found {staticMethods.Length} static methods in {type.Name}"); + + foreach (var method in staticMethods) + { + var customAttributes = method.GetCustomAttributes(true); + Debug.Log($"HotReload: Method {method.Name} has {customAttributes.Length} custom attributes: {string.Join(", ", customAttributes.Select(a => a.GetType().Name))}"); + + // Try multiple ways to find the attribute + var hotReloadAttr = method.GetCustomAttribute(); + if (hotReloadAttr == null) + { + // Try by name in case of type loading issues + var attrByName = customAttributes.FirstOrDefault(a => a.GetType().Name == "HotReloadOverrideMethodAttribute"); + if (attrByName != null) + { + Debug.Log($"HotReload: Found HotReloadOverrideMethodAttribute by name on {method.Name}"); + // Cast to the attribute type + hotReloadAttr = attrByName as HotReloadOverrideMethodAttribute; + } + } + + if (hotReloadAttr != null) + { + Debug.Log($"HotReload: Registering method override {method.Name} -> {hotReloadAttr.TargetMethodId}"); + if (HotReloadRegistry.RegisterMethodOverride(method, hotReloadAttr, type, out var skipReason)) + { + registeredMethods.Add(hotReloadAttr.TargetMethodId); + } + else + { + skipped.Add($"{method.Name} -> {hotReloadAttr.TargetMethodId}: {skipReason}"); + } + } + } + } + + Debug.Log($"HotReload: Registered {registeredMethods.Count} override methods: {string.Join(", ", registeredMethods)}"); + } + catch (Exception ex) + { + Debug.LogError($"HotReload: Error registering methods from assembly {assemblyId}: {ex.Message}"); + Debug.LogError($"HotReload: Stack trace: {ex.StackTrace}"); + } + + return registeredMethods; + } + + /// + /// Extract base filename from versioned filename (e.g., "PlayerMovement_001" -> "PlayerMovement"). + /// + private static string ExtractBaseFilename(string versionedFilename) + { + var lastUnderscoreIndex = versionedFilename.LastIndexOf('_'); + if (lastUnderscoreIndex > 0) + { + var potentialVersion = versionedFilename.Substring(lastUnderscoreIndex + 1); + if (int.TryParse(potentialVersion, out _)) + { + return versionedFilename.Substring(0, lastUnderscoreIndex); + } + } + return versionedFilename; + } + + /// + /// Extract version number from versioned filename (e.g., "PlayerMovement_001" -> 1). + /// + private static int ExtractVersion(string versionedFilename) + { + var lastUnderscoreIndex = versionedFilename.LastIndexOf('_'); + if (lastUnderscoreIndex > 0) + { + var potentialVersion = versionedFilename.Substring(lastUnderscoreIndex + 1); + if (int.TryParse(potentialVersion, out var version)) + { + return version; + } + } + return 0; + } + +#else + // Hot reload requires Roslyn compilation, which is only available in the Editor and in + // Desktop development builds. In all other builds the methods below are compiled instead, + // matching the public surface used by callers (HotReloadCommands, InPlaceReloadProcessor) + // so the project still builds, and returning a clear "not supported" failure at runtime. + const string NotSupportedMessage = + "Hot reload compilation is only supported on Desktop development builds (Windows/Mac/Linux)."; + + /// + /// Hot reload compilation not supported on this build. + /// + public static Task CompileAndApplyAsync(string filename, string assemblyDir = null) + { + return Task.FromResult(HotReloadCompileResult.Failure("Platform Not Supported", NotSupportedMessage)); + } + + /// + /// Hot reload source compilation (in-place editing) not supported on this build. + /// + public static HotReloadCompilationResult CompileSourceCodeOnMainThread(string sourceCode, string baseFileName, string assemblyDir = null, bool emitPdb = false, string documentPath = null) + { + return HotReloadCompilationResult.Failure("Platform Not Supported", NotSupportedMessage); + } + + /// + /// Hot reload source compilation (in-place editing) not supported on this build. + /// + public static Task CompileSourceCodeAsync(string sourceCode, string baseFileName, string assemblyDir = null, bool emitPdb = false, string documentPath = null) + { + return Task.FromResult(HotReloadCompilationResult.Failure("Platform Not Supported", NotSupportedMessage)); + } + + /// + /// Hot reload cleanup not supported on this build. + /// + public static HotReloadCleanupResult CleanupHotReloadDlls(string assemblyDir = null) + { + return new HotReloadCleanupResult + { + Success = false, + Message = NotSupportedMessage, + ExecutionTimeMs = 0 + }; + } +#endif + } + + /// + /// Result from hot reload compilation operation. + /// + public class HotReloadCompileResult + { + public bool IsSuccess { get; set; } + public string AssemblyName { get; set; } + public string OutputPath { get; set; } + public List RegisteredMethods { get; set; } = new List(); + public long ExecutionTimeMs { get; set; } + public string Error { get; set; } + public string ErrorDetails { get; set; } + public List Diagnostics { get; set; } = new List(); + + public static HotReloadCompileResult Success(string assemblyName, string outputPath, List registeredMethods, long executionTimeMs) + { + return new HotReloadCompileResult + { + IsSuccess = true, + AssemblyName = assemblyName, + OutputPath = outputPath, + RegisteredMethods = registeredMethods, + ExecutionTimeMs = executionTimeMs + }; + } + + public static HotReloadCompileResult Failure(string error, string errorDetails, long executionTimeMs = 0, List diagnostics = null) + { + return new HotReloadCompileResult + { + IsSuccess = false, + Error = error, + ErrorDetails = errorDetails, + ExecutionTimeMs = executionTimeMs, + Diagnostics = diagnostics ?? new List() + }; + } + } + + /// + /// Result from hot reload cleanup operation. + /// + public class HotReloadCleanupResult + { + public bool Success { get; set; } + public List DeletedFiles { get; set; } = new List(); + public string Message { get; set; } + public long ExecutionTimeMs { get; set; } + } + + /// + /// Result from hot reload source code compilation operation (for in-place editing). + /// + public class HotReloadCompilationResult + { + public bool IsSuccess { get; set; } + public string AssemblyName { get; set; } + public string OutputPath { get; set; } + public List RegisteredMethods { get; set; } = new List(); + public long ExecutionTimeMs { get; set; } + public string Error { get; set; } + public string ErrorDetails { get; set; } + public List Diagnostics { get; set; } = new List(); + + public static HotReloadCompilationResult Success(string assemblyName, string outputPath, List registeredMethods, long executionTimeMs) + { + return new HotReloadCompilationResult + { + IsSuccess = true, + AssemblyName = assemblyName, + OutputPath = outputPath, + RegisteredMethods = registeredMethods, + ExecutionTimeMs = executionTimeMs + }; + } + + public static HotReloadCompilationResult Failure(string error, string errorDetails, long executionTimeMs = 0, List diagnostics = null) + { + return new HotReloadCompilationResult + { + IsSuccess = false, + Error = error, + ErrorDetails = errorDetails, + ExecutionTimeMs = executionTimeMs, + Diagnostics = diagnostics ?? new List() + }; + } + } +} \ No newline at end of file diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Compilation/HotReloadCompiler.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Compilation/HotReloadCompiler.cs.meta new file mode 100644 index 00000000..5c30a103 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Compilation/HotReloadCompiler.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 29ede4b57fcc6c64b84e5f6ee75df373 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Compilation/RoslynCompilationService.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Compilation/RoslynCompilationService.cs new file mode 100644 index 00000000..4aec5187 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Compilation/RoslynCompilationService.cs @@ -0,0 +1,356 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp; +using Microsoft.CodeAnalysis.Emit; +using Microsoft.CodeAnalysis.Text; +using Unity.Pipeline.Models; +using UnityEngine; + +namespace Unity.Pipeline.Compilation +{ + /// + /// Shared Roslyn compilation service for both code evaluation and hot reload systems. + /// Eliminates code duplication by providing common compilation infrastructure. + /// Thread-safe and can be called from any thread. + /// + public static class RoslynCompilationService + { +#if UNITY_EDITOR || (UNITY_STANDALONE && DEBUG) + + /// + /// Compile source code to assembly with customizable options. + /// Thread-safe compilation that can run on any thread. + /// + public static CompilationResult Compile(CompilationRequest request) + { + try + { + // Parse syntax tree. When emitting debug info, the tree needs a document path and + // UTF-8 encoding so the portable PDB can reference a source document. + var syntaxTree = request.EmitDebugInformation + ? CSharpSyntaxTree.ParseText( + SourceText.From(request.SourceCode, Encoding.UTF8), + path: request.DocumentPath ?? request.AssemblyName + ".cs") + : CSharpSyntaxTree.ParseText(request.SourceCode); + + // Get metadata references with optional additional prefixes + var references = GetMetadataReferences(request.AdditionalAssemblyPrefixes); + + // Create compilation. Disable optimizations when emitting debug info so the JIT + // keeps full sequence points (otherwise breakpoints can't bind). + var options = new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary); + if (request.EmitDebugInformation) + options = options.WithOptimizationLevel(OptimizationLevel.Debug); + + var compilation = CSharpCompilation.Create( + request.AssemblyName, + new[] { syntaxTree }, + references, + options); + + // Get diagnostics + var diagnostics = compilation.GetDiagnostics(); + var diagnosticInfos = ConvertDiagnostics(diagnostics, request.LineNumberOffset); + + // Check for compilation errors + var errors = diagnostics.Where(d => d.Severity == DiagnosticSeverity.Error).ToList(); + if (errors.Any()) + { + return new CompilationResult + { + Success = false, + Diagnostics = diagnosticInfos + }; + } + + // Compile to memory + using (var peStream = new MemoryStream()) + { + byte[] pdbBytes = null; + EmitResult emitResult; + + if (request.EmitDebugInformation) + { + using (var pdbStream = new MemoryStream()) + { + emitResult = compilation.Emit( + peStream, + pdbStream, + options: new EmitOptions(debugInformationFormat: DebugInformationFormat.PortablePdb)); + + if (emitResult.Success) + pdbBytes = pdbStream.ToArray(); + } + } + else + { + emitResult = compilation.Emit(peStream); + } + + if (!emitResult.Success) + { + var emitDiagnostics = ConvertDiagnostics(emitResult.Diagnostics, request.LineNumberOffset); + return new CompilationResult + { + Success = false, + Diagnostics = diagnosticInfos.Concat(emitDiagnostics).ToList() + }; + } + + // Load assembly from memory. When symbols are present, load them alongside the + // assembly so an attached debugger can bind breakpoints into the emitted code. + var assemblyBytes = peStream.ToArray(); + var assembly = pdbBytes != null + ? PipelineUtils.LoadFromBytes(assemblyBytes, pdbBytes) + : PipelineUtils.LoadFromBytes(assemblyBytes); + + return new CompilationResult + { + Success = true, + Assembly = assembly, + AssemblyBytes = assemblyBytes, + PdbBytes = pdbBytes, + Diagnostics = diagnosticInfos + }; + } + } + catch (Exception ex) + { + return new CompilationResult + { + Success = false, + Diagnostics = new List + { + new DiagnosticInfo + { + Severity = "error", + Message = $"Compilation exception: {ex.Message}", + Line = 0, + Column = 0, + Id = "ROSLYN001" + } + } + }; + } + } + + /// + /// Async wrapper for compilation that runs on background thread. + /// Use when you need to avoid blocking the calling thread. + /// + public static Task CompileAsync(CompilationRequest request) + { + return Task.Run(() => Compile(request)); + } + + /// + /// Get metadata references for compilation with optional additional assembly prefixes. + /// Handles both Editor and Runtime scenarios with appropriate filtering. + /// + public static List GetMetadataReferences(string[] additionalPrefixes = null) + { + var references = new List(); + var assemblies = PipelineUtils.GetLoadedAssemblies() + .Where(a => !a.IsDynamic && !string.IsNullOrEmpty(PipelineUtils.GetLoadedAssemblyPath(a))); + + if (Application.isEditor) + { + // Editor: Include all loaded assemblies for maximum compatibility + foreach (var assembly in assemblies) + { + try + { + references.Add(MetadataReference.CreateFromFile(PipelineUtils.GetLoadedAssemblyPath(assembly))); + } + catch + { + // Skip problematic assemblies + } + } + } + else + { + // Runtime: Use curated filtering for Unity + user assemblies + var allowedPrefixes = new List + { + "UnityEngine", + "Assembly-CSharp", + "netstandard", + "mscorlib", + "System.", + "Unity.Pipeline" + }; + + // Add any additional prefixes (e.g., for hot reload: "Microsoft.CodeAnalysis") + if (additionalPrefixes != null) + { + allowedPrefixes.AddRange(additionalPrefixes); + } + + foreach (var assembly in assemblies) + { + try + { + var assemblyName = assembly.GetName().Name; + if (allowedPrefixes.Any(prefix => assemblyName.StartsWith(prefix))) + { + references.Add(MetadataReference.CreateFromFile(PipelineUtils.GetLoadedAssemblyPath(assembly))); + } + } + catch + { + // Skip problematic assemblies + } + } + } + + return references; + } + + /// + /// Convert Roslyn diagnostics to DiagnosticInfo list with optional line number adjustment. + /// Handles line number offset for wrapped code scenarios. + /// + private static List ConvertDiagnostics(IEnumerable diagnostics, int lineOffset = 0) + { + var result = new List(); + + foreach (var diagnostic in diagnostics.Where(d => d.Severity >= DiagnosticSeverity.Warning)) + { + var location = diagnostic.Location.GetLineSpan(); + var line = Math.Max(0, location.StartLinePosition.Line - lineOffset); + var column = location.StartLinePosition.Character; + + result.Add(new DiagnosticInfo + { + Severity = diagnostic.Severity.ToString().ToLower(), + Message = diagnostic.GetMessage(), + Line = line, + Column = column, + Id = diagnostic.Id + }); + } + + return result; + } + +#else + /// + /// Runtime compilation not supported on this platform. + /// Desktop development builds only (Windows/Mac/Linux). + /// + public static CompilationResult Compile(CompilationRequest request) + { + return new CompilationResult + { + Success = false, + Diagnostics = new List + { + new DiagnosticInfo + { + Severity = "error", + Message = "Runtime code compilation only supported on Desktop development builds", + Line = 0, + Column = 0, + Id = "PLATFORM001" + } + } + }; + } + + /// + /// Runtime compilation not supported on this platform. + /// + public static Task CompileAsync(CompilationRequest request) + { + return Task.FromResult(Compile(request)); + } + + /// + /// Runtime compilation not supported on this platform. + /// + public static List GetMetadataReferences(string[] additionalPrefixes = null) + { + return new List(); + } +#endif + } + + /// + /// Request for Roslyn compilation with customizable options. + /// + public class CompilationRequest + { + /// + /// Source code to compile. + /// + public string SourceCode { get; set; } + + /// + /// Name for the generated assembly (should be unique). + /// + public string AssemblyName { get; set; } + + /// + /// Additional assembly prefixes to include in metadata references. + /// Useful for hot reload scenarios that need "Microsoft.CodeAnalysis" etc. + /// + public string[] AdditionalAssemblyPrefixes { get; set; } + + /// + /// Line number offset to subtract from diagnostic line numbers. + /// Used when source code has wrapper code that should be hidden from diagnostics. + /// + public int LineNumberOffset { get; set; } + + /// + /// When true, emit a portable PDB and load the assembly with its symbols so an attached + /// managed debugger can bind breakpoints. Compiles unoptimized. Default false (no symbols). + /// + public bool EmitDebugInformation { get; set; } + + /// + /// Document path recorded in the syntax tree when is set. + /// Source that is not covered by explicit #line directives maps to this path. + /// + public string DocumentPath { get; set; } + } + + /// + /// Result from Roslyn compilation. + /// + public class CompilationResult + { + /// + /// Whether compilation was successful. + /// + public bool Success { get; set; } + + /// + /// Compiled assembly (only available if Success = true). + /// + public Assembly Assembly { get; set; } + + /// + /// Raw assembly bytes (for potential disk saving or caching). + /// + public byte[] AssemblyBytes { get; set; } + + /// + /// Portable PDB bytes when was set; + /// null otherwise. + /// + public byte[] PdbBytes { get; set; } + + /// + /// Compilation diagnostics (errors, warnings, info). + /// + public List Diagnostics { get; set; } = new List(); + } +} \ No newline at end of file diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Compilation/RoslynCompilationService.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Compilation/RoslynCompilationService.cs.meta new file mode 100644 index 00000000..b2ec11a5 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Compilation/RoslynCompilationService.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 957feb25e68236e45b15cd5e9f095c31 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Console.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Console.meta new file mode 100644 index 00000000..77428918 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Console.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7c1f4a9e2b6d4c8f9a0e3d5b7c1a2f48 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Console/ConsoleLogBuffer.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Console/ConsoleLogBuffer.cs new file mode 100644 index 00000000..745d1137 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Console/ConsoleLogBuffer.cs @@ -0,0 +1,304 @@ +using System; +using System.Collections.Generic; +using System.IO; +using Newtonsoft.Json; +using Unity.Pipeline.Models; +using UnityEngine; + +namespace Unity.Pipeline.Console +{ + /// + /// Bounded, thread-safe ring buffer of captured Unity console entries that backs the + /// console command. + /// + /// Why thread-safe: entries arrive via , + /// which can fire from background threads, while the command reads the buffer from an HTTP + /// request thread. All access is guarded by a single lock. + /// + /// Each entry gets a monotonic that never repeats and only + /// increases — including across domain reloads, because the buffer (and the seq counter) is + /// persisted via /. The seq is the cursor a "--follow" + /// client uses to fetch only newer entries. + /// + public class ConsoleLogBuffer + { + /// Maximum number of entries retained. Older entries are evicted first. + public const int Capacity = 2000; + + // Severity levels, ordered so a "minimum severity" filter is a simple >= comparison. + public const int SeverityLog = 0; + public const int SeverityWarn = 1; + public const int SeverityError = 2; + + public const string LevelLog = "log"; + public const string LevelWarn = "warn"; + public const string LevelError = "error"; + + readonly object m_Lock = new object(); + readonly Queue m_Entries = new Queue(); + long m_LastSeq; + + struct StoredEntry + { + public int Severity; + public ConsoleLogEntry Entry; + } + + /// + /// Capture a console entry. Assigns the next sequence number and evicts the oldest entry if + /// the buffer is full. Safe to call from any thread. + /// + public void Add(LogType type, string message, string stackTrace, DateTime timestampUtc) + { + var severity = SeverityFromLogType(type); + lock (m_Lock) + { + m_LastSeq++; + if (m_Entries.Count >= Capacity) + m_Entries.Dequeue(); + + m_Entries.Enqueue(new StoredEntry + { + Severity = severity, + Entry = new ConsoleLogEntry + { + Seq = m_LastSeq, + TimestampUtc = timestampUtc, + Level = LevelName(severity), + Message = message ?? string.Empty, + StackTrace = stackTrace ?? string.Empty + } + }); + } + } + + /// + /// Query the buffer for the console command. + /// + /// + /// Cursor: return only entries with Seq > since. Pass a negative value (e.g. -1) + /// for a snapshot of the most recent entries with no cursor filtering. + /// + /// + /// Maximum number of entries to return (the most recent matches). Values <= 0 mean "no + /// limit" (up to ). + /// + /// Minimum severity to include (see the Severity* constants). + public ConsoleLogResponse Query(long since, int tail, int minSeverity) + { + lock (m_Lock) + { + var matches = new List(); + foreach (var stored in m_Entries) + { + if (stored.Severity < minSeverity) + continue; + if (since >= 0 && stored.Entry.Seq <= since) + continue; + matches.Add(stored.Entry); + } + + // Keep only the most recent `tail` matches. + if (tail > 0 && matches.Count > tail) + matches.RemoveRange(0, matches.Count - tail); + + return new ConsoleLogResponse + { + Entries = matches.ToArray(), + Cursor = m_LastSeq, + Returned = matches.Count, + Dropped = ComputeDropped(since) + }; + } + } + + /// + /// True when refers to entries that have already been evicted, so + /// the caller missed some output. Caller must hold . + /// + bool ComputeDropped(long since) + { + if (since < 0) + return false; + if (since >= m_LastSeq) + return false; + + // Everything after `since` was evicted (or never retained): buffer empty but seq moved on. + if (m_Entries.Count == 0) + return m_LastSeq > since; + + // The next entry the caller expects is since+1; if the oldest entry we still hold is + // newer than that, the gap in between was evicted. + var oldestSeq = m_Entries.Peek().Entry.Seq; + return oldestSeq > since + 1; + } + + /// Remove all entries. Does NOT reset the sequence counter (cursors stay monotonic). + public void Clear() + { + lock (m_Lock) + { + m_Entries.Clear(); + } + } + + /// Current number of retained entries. For diagnostics/tests. + public int Count + { + get { lock (m_Lock) { return m_Entries.Count; } } + } + + /// The highest sequence number assigned so far (the live cursor). + public long LastSeq + { + get { lock (m_Lock) { return m_LastSeq; } } + } + + #region Persistence + + [Serializable] + class Snapshot + { + [JsonProperty("lastSeq")] public long LastSeq; + [JsonProperty("entries")] public ConsoleLogEntry[] Entries; + } + + /// + /// Persist the buffer (entries + sequence counter) to so it survives + /// a domain reload. Failures are swallowed (logging is best-effort, never fatal). + /// + public void Save(string path) + { + try + { + Snapshot snapshot; + lock (m_Lock) + { + var entries = new ConsoleLogEntry[m_Entries.Count]; + var i = 0; + foreach (var stored in m_Entries) + entries[i++] = stored.Entry; + snapshot = new Snapshot { LastSeq = m_LastSeq, Entries = entries }; + } + + var dir = Path.GetDirectoryName(path); + if (!string.IsNullOrEmpty(dir)) + Directory.CreateDirectory(dir); + File.WriteAllText(path, JsonConvert.SerializeObject(snapshot)); + } + catch (Exception ex) + { + Debug.LogWarning($"[Pipeline] Failed to persist console log buffer: {ex.Message}"); + } + } + + /// + /// Restore a buffer previously written by . Missing or unreadable files + /// leave the buffer empty. Returns true if a snapshot was loaded. + /// + public bool Load(string path) + { + try + { + if (!File.Exists(path)) + return false; + + var snapshot = JsonConvert.DeserializeObject(File.ReadAllText(path)); + if (snapshot == null) + return false; + + lock (m_Lock) + { + m_Entries.Clear(); + long lastRestoredSeq = 0; + if (snapshot.Entries != null) + { + foreach (var entry in snapshot.Entries) + { + if (entry == null) + continue; + if (m_Entries.Count >= Capacity) + m_Entries.Dequeue(); + + m_Entries.Enqueue(new StoredEntry + { + Severity = SeverityFromLevelName(entry.Level), + Entry = entry + }); + lastRestoredSeq = entry.Seq; + } + } + + // Keep the counter ahead of any restored entry so seq stays monotonic. + m_LastSeq = snapshot.LastSeq; + if (m_Entries.Count > 0) + m_LastSeq = Math.Max(m_LastSeq, lastRestoredSeq); + } + + return true; + } + catch (Exception ex) + { + Debug.LogWarning($"[Pipeline] Failed to restore console log buffer: {ex.Message}"); + return false; + } + } + + #endregion + + #region Severity mapping + + /// Map a Unity to an ordered severity. + public static int SeverityFromLogType(LogType type) + { + switch (type) + { + case LogType.Warning: + return SeverityWarn; + case LogType.Error: + case LogType.Exception: + case LogType.Assert: + return SeverityError; + default: + return SeverityLog; + } + } + + /// + /// Parse a "--level" value ("log"/"warn"/"error", plus common aliases) into a minimum + /// severity. Unknown values fall back to (everything), matching the + /// lenient behavior of the existing log command. + /// + public static int SeverityFromLevelName(string level) + { + switch ((level ?? string.Empty).Trim().ToLowerInvariant()) + { + case "error": + case "err": + case "exception": + return SeverityError; + case "warn": + case "warning": + return SeverityWarn; + default: + return SeverityLog; + } + } + + /// The canonical level name for a severity. + public static string LevelName(int severity) + { + switch (severity) + { + case SeverityError: + return LevelError; + case SeverityWarn: + return LevelWarn; + default: + return LevelLog; + } + } + + #endregion + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Console/ConsoleLogBuffer.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Console/ConsoleLogBuffer.cs.meta new file mode 100644 index 00000000..1a81c697 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Console/ConsoleLogBuffer.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 1e014974635df5fe6a6787c4ba983f80 diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Console/ConsoleLogCapture.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Console/ConsoleLogCapture.cs new file mode 100644 index 00000000..3ffa740a --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Console/ConsoleLogCapture.cs @@ -0,0 +1,67 @@ +using System; +using UnityEngine; + +namespace Unity.Pipeline.Console +{ + /// + /// Captures Unity console output into a process-wide so the + /// console command can serve it to CLI clients. This type lives in the runtime + /// assembly, so it ships in player builds as well as the Editor. + /// + /// Lifecycle: + /// - In a Player, the [RuntimeInitializeOnLoadMethod] hook starts capture as the app boots. + /// - In the Editor, the editor-only EditorConsoleCaptureBootstrap starts capture on every + /// domain reload and layers on persistence so entries survive reloads (e.g. after a recompile). + /// Both paths funnel through , which is idempotent — entering Play + /// mode in the Editor fires the runtime hook too, and the guard makes that a no-op. + /// - is used (not the non-threaded variant) + /// so logs emitted from background threads are captured too. The buffer is thread-safe. + /// + /// Capture starts when this type first initializes. Console entries produced before that — or + /// before the package's first import — are not retroactively captured; this reads from the public + /// log callback, not Unity's internal console store. + /// + public static class ConsoleLogCapture + { + static readonly ConsoleLogBuffer s_Buffer = new ConsoleLogBuffer(); + static readonly object s_SubscriptionLock = new object(); + static bool s_Subscribed; + + /// The shared buffer holding captured console entries. + public static ConsoleLogBuffer Buffer => s_Buffer; + + /// + /// Player entry point. Runs as the application boots so console output is captured from the + /// start. In the Editor this also fires when entering Play mode, but + /// is idempotent so it does not double-subscribe. + /// + [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)] + static void RuntimeBootstrap() + { + EnsureCapturing(); + } + + /// + /// Subscribe to Unity's log callback if not already subscribed. Safe to call repeatedly and + /// from either the runtime bootstrap or the Editor bootstrap. + /// + public static void EnsureCapturing() + { + lock (s_SubscriptionLock) + { + if (s_Subscribed) + return; + + // Defensive: remove before adding in case a prior subscription leaked across a reload. + Application.logMessageReceivedThreaded -= OnLogMessage; + Application.logMessageReceivedThreaded += OnLogMessage; + s_Subscribed = true; + } + } + + static void OnLogMessage(string condition, string stackTrace, LogType type) + { + s_Buffer.Add(type, condition, stackTrace, DateTime.UtcNow); + } + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Console/ConsoleLogCapture.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Console/ConsoleLogCapture.cs.meta new file mode 100644 index 00000000..88136c44 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Console/ConsoleLogCapture.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 3d9b6e1a4f2c40a78c5e0b1d2a6f9c84 diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/HotReload.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/HotReload.meta new file mode 100644 index 00000000..5fa83283 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/HotReload.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c29607a31a43d7149b8296de99b81d8e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/HotReload/AccessibilityValidator.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/HotReload/AccessibilityValidator.cs new file mode 100644 index 00000000..6d458b8a --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/HotReload/AccessibilityValidator.cs @@ -0,0 +1,198 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp; +using Microsoft.CodeAnalysis.CSharp.Syntax; +using Unity.Pipeline.Compilation; +using UnityEngine; + +namespace Unity.Pipeline.HotReload +{ + /// + /// Validates that [HotReload] method bodies only access PUBLIC instance members of the + /// declaring type. In-place overrides are compiled into a separate assembly, so they can only + /// reach public members of the original type; private/internal/protected access would fail to + /// compile. This check runs up front (via a Roslyn semantic model) to produce a clear message + /// instead of a raw compiler error. + /// + public static class AccessibilityValidator + { + public static AccessibilityValidationResult ValidatePublicAccess( + string sourceCode, + Dictionary methodBodies, + string originalTypeName) + { + var result = new AccessibilityValidationResult + { + IsValid = true, + Violations = new List() + }; + + try + { + var tree = CSharpSyntaxTree.ParseText(sourceCode); + var root = tree.GetRoot(); + + var compilation = CSharpCompilation.Create( + "HotReloadInPlaceValidation", + new[] { tree }, + RoslynCompilationService.GetMetadataReferences(), + new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary)); + var model = compilation.GetSemanticModel(tree); + + var classDecl = root.DescendantNodes() + .OfType() + .FirstOrDefault(c => c.Identifier.ValueText == originalTypeName); + if (classDecl == null) + { + result.IsValid = false; + result.ValidationError = $"Could not find class '{originalTypeName}' in source."; + return result; + } + + var classSymbol = model.GetDeclaredSymbol(classDecl); + + foreach (var method in classDecl.Members.OfType()) + { + var methodName = method.Identifier.ValueText; + if (!methodBodies.ContainsKey(methodName) || method.Body == null) + continue; + + var seen = new HashSet(); + foreach (var name in method.Body.DescendantNodes().OfType()) + { + if (IsMemberName(name)) + continue; + + var symbol = model.GetSymbolInfo(name).Symbol; + if (!IsInstanceMemberOf(symbol, classSymbol)) + continue; + + if (symbol.DeclaredAccessibility != Accessibility.Public && seen.Add(symbol.Name)) + { + result.Violations.Add(new AccessibilityViolation + { + MemberName = symbol.Name, + MethodName = methodName, + AccessLevel = symbol.DeclaredAccessibility, + ViolationType = AccessibilityViolationType.PrivateAccess, + ErrorMessage = $"Cannot access non-public member '{symbol.Name}' " + + $"({symbol.DeclaredAccessibility}) in [HotReload] method '{methodName}'", + Suggestion = $"Make '{symbol.Name}' public in {originalTypeName}, or use a " + + "public property/method. In-place overrides compile in a separate assembly " + + "and can only access public members." + }); + } + } + } + + result.IsValid = result.Violations.Count == 0; + return result; + } + catch (Exception ex) + { + Debug.LogError($"HotReload: Accessibility validation error: {ex.Message}"); + return new AccessibilityValidationResult + { + IsValid = false, + ValidationError = ex.Message, + Violations = new List() + }; + } + } + + /// True if the name is the right-hand member name of an access (foo.Bar -> Bar). + private static bool IsMemberName(SimpleNameSyntax node) + { + if (node.Parent is MemberAccessExpressionSyntax ma && ma.Name == node) + return true; + if (node.Parent is QualifiedNameSyntax) + return true; + if (node.Parent is MemberBindingExpressionSyntax) + return true; + return false; + } + + /// True if the symbol is an instance field/property/method/event of the type or a base. + private static bool IsInstanceMemberOf(ISymbol symbol, INamedTypeSymbol type) + { + if (symbol == null || symbol.IsStatic) + return false; + + switch (symbol.Kind) + { + case SymbolKind.Field: + case SymbolKind.Property: + case SymbolKind.Method: + case SymbolKind.Event: + break; + default: + return false; + } + + for (var t = type; t != null; t = t.BaseType) + { + if (SymbolEqualityComparer.Default.Equals(t, symbol.ContainingType)) + return true; + } + return false; + } + } + + /// + /// Result of accessibility validation for hot reload methods. + /// + public class AccessibilityValidationResult + { + public bool IsValid { get; set; } + public List Violations { get; set; } = new List(); + public string ValidationError { get; set; } + + public string GetFormattedErrorMessage() + { + if (!string.IsNullOrEmpty(ValidationError)) + return $"HotReload Validation Error: {ValidationError}"; + + if (Violations.Count == 0) + return "All member access is valid for hot reload."; + + var errorMessage = $"HotReload Validation Failed: {Violations.Count} accessibility violation(s) found\n\n"; + for (int i = 0; i < Violations.Count; i++) + { + var violation = Violations[i]; + errorMessage += $"{i + 1}. Method '{violation.MethodName}': {violation.ErrorMessage}\n"; + errorMessage += $" → Suggestion: {violation.Suggestion}\n"; + if (i < Violations.Count - 1) + errorMessage += "\n"; + } + + errorMessage += "\nFix these accessibility issues and run reload_file again."; + return errorMessage; + } + } + + /// + /// Information about a specific accessibility violation in hot reload code. + /// + public class AccessibilityViolation + { + public string MemberName { get; set; } + public string MethodName { get; set; } + public Accessibility AccessLevel { get; set; } + public AccessibilityViolationType ViolationType { get; set; } + public string ErrorMessage { get; set; } + public string Suggestion { get; set; } + } + + /// + /// Types of accessibility violations that can occur in hot reload methods. + /// + public enum AccessibilityViolationType + { + PrivateAccess, + InternalAccess, + ProtectedAccess, + ParseError + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/HotReload/AccessibilityValidator.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/HotReload/AccessibilityValidator.cs.meta new file mode 100644 index 00000000..3958537d --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/HotReload/AccessibilityValidator.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1bdaafa6e8d172648a57310104db179a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/HotReload/HotReloadAttributes.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/HotReload/HotReloadAttributes.cs new file mode 100644 index 00000000..518c7c8a --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/HotReload/HotReloadAttributes.cs @@ -0,0 +1,166 @@ +using System; + +namespace Unity.Pipeline.HotReload +{ + /// + /// Marks a method as hot reloadable. The method can be overridden at runtime + /// through the hot reload system without triggering Unity domain reload. + /// + /// Belongs to the helper (separate override file) workflow, together with + /// . For the in-place workflow use + /// instead. + /// + /// Pattern A: Attribute-Based Method Override + /// - Individual methods can be surgically replaced + /// - Hot reload methods must have same signature + instance parameter + /// - Access limited to public fields/properties for simplicity + /// - Best for: Quick gameplay tweaks, formula adjustments + /// + [AttributeUsage(AttributeTargets.Method, AllowMultiple = false)] + public class HotReloadWithOverridesAttribute : Attribute + { + /// + /// Optional identifier for this hot reloadable method. + /// If not specified, uses TypeName.MethodName format. + /// + public string Id { get; set; } + + /// + /// Whether this method requires main thread execution. + /// Defaults to true for Unity API safety. + /// + public bool RequireMainThread { get; set; } = true; + } + + /// + /// Marks a method for the in-place hot reload workflow: the method body is edited directly + /// in the original source file and applied via the reload_file command. + /// + /// This attribute is exclusive to the in-place workflow and is independent of + /// / , which + /// belong to the helper (separate override file) workflow. + /// + [AttributeUsage(AttributeTargets.Method, AllowMultiple = false)] + public class HotReloadAttribute : Attribute + { + /// + /// Optional identifier for this in-place hot reloadable method. + /// If not specified, uses TypeName.MethodName format. + /// + public string Id { get; set; } + + /// + /// Whether this method requires main thread execution. + /// Defaults to true for Unity API safety. + /// + public bool RequireMainThread { get; set; } = true; + } + + /// + /// Marks a static method as a hot reload override for a specific method. + /// Used in hot reload files to define replacement logic for [HotReloadWithOverrides] methods. + /// + /// Method signature must match original method plus instance parameter as first argument. + /// Example: void Update() becomes static void Update(TargetType instance) + /// + [AttributeUsage(AttributeTargets.Method, AllowMultiple = false)] + public class HotReloadOverrideMethodAttribute : Attribute + { + /// + /// Target method identifier in format "TypeName.MethodName" + /// Must match a method marked with [HotReloadWithOverrides]. + /// + public string TargetMethodId { get; } + + /// + /// Optional description of what this hot reload does. + /// Useful for debugging and hot reload management. + /// + public string Description { get; set; } + + public HotReloadOverrideMethodAttribute(string targetMethodId) + { + TargetMethodId = targetMethodId ?? throw new ArgumentNullException(nameof(targetMethodId)); + } + } + + /// + /// Marks a component class as hot reloadable via complete behavior replacement. + /// The component becomes a proxy that delegates to hot reload implementations. + /// + /// Pattern C: Component Override + /// - Complete component behavior replacement via interfaces + /// - Maximum flexibility for major behavioral experiments + /// - Pattern C wins when multiple patterns apply to same component + /// - Best for: Major AI changes, experimental features + /// + [AttributeUsage(AttributeTargets.Class, AllowMultiple = false)] + public class HotReloadableComponentAttribute : Attribute + { + /// + /// Optional identifier for this hot reloadable component. + /// If not specified, uses the class name. + /// + public string Id { get; set; } + + /// + /// Interface type that hot reload implementations must implement. + /// If not specified, generates interface automatically. + /// + public Type InterfaceType { get; set; } + } + + /// + /// Marks a class as a hot reload implementation for a specific component. + /// Used in hot reload files to provide complete component behavior replacement. + /// + [AttributeUsage(AttributeTargets.Class, AllowMultiple = false)] + public class HotReloadComponentAttribute : Attribute + { + /// + /// Target component type to override. + /// Must be a type marked with [HotReloadableComponent]. + /// + public Type TargetType { get; } + + /// + /// Optional description of what this hot reload implementation does. + /// + public string Description { get; set; } + + public HotReloadComponentAttribute(Type targetType) + { + TargetType = targetType ?? throw new ArgumentNullException(nameof(targetType)); + } + } + + /// + /// Marks a static method as a hot reload target for Pattern B explicit wrapper system. + /// Used with HotReloadMethod<T> wrapper for type-safe delegate hot reload. + /// + /// Pattern B: Explicit Wrapper + /// - HotReloadMethod<T> wrapper with type-safe delegate calls + /// - Built-in fallback logic, zero method signature changes + /// - Explicit opt-in with performance-optimized direct calls + /// - Best for: Performance-critical paths, type-safe hot reload + /// + [AttributeUsage(AttributeTargets.Method, AllowMultiple = false)] + public class HotReloadTargetAttribute : Attribute + { + /// + /// Unique identifier that matches HotReloadMethod<T> wrapper registration. + /// This ID connects the wrapper to the hot reload implementation. + /// + public string TargetId { get; } + + /// + /// Optional description of what this hot reload target does. + /// + public string Description { get; set; } + + public HotReloadTargetAttribute(string targetId) + { + TargetId = targetId ?? throw new ArgumentNullException(nameof(targetId)); + } + } +} \ No newline at end of file diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/HotReload/HotReloadAttributes.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/HotReload/HotReloadAttributes.cs.meta new file mode 100644 index 00000000..2d20e06c --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/HotReload/HotReloadAttributes.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0bd43f6237214774ab4a178b811eb453 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/HotReload/HotReloadHelper.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/HotReload/HotReloadHelper.cs new file mode 100644 index 00000000..163432bc --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/HotReload/HotReloadHelper.cs @@ -0,0 +1,140 @@ +using System; +using System.Reflection; +using UnityEngine; + +namespace Unity.Pipeline.HotReload +{ + /// + /// Helper utilities for integrating hot reload calls into methods marked with [HotReloadWithOverrides]. + /// Provides convenience methods for checking and invoking hot reload overrides. + /// + public static class HotReloadHelper + { + /// + /// Execute method with hot reload override check. + /// If hot reload override exists, invokes it; otherwise invokes original method. + /// + /// Type of the instance + /// Instance to invoke method on + /// Name of the method to invoke + /// Original method implementation + /// Method parameters + /// Result of method invocation + public static object ExecuteWithHotReload(T instance, string methodName, Func originalMethod, params object[] parameters) + { + var methodId = GetMethodId(methodName); + + // Try hot reload first + if (HotReloadRegistry.TryInvokeHotReload(methodId, instance, parameters)) + { + return null; // Hot reload methods currently don't return values (can be enhanced later) + } + + // Fall back to original method + return originalMethod?.Invoke(); + } + + /// + /// Execute void method with hot reload override check. + /// Convenience overload for void methods. + /// + /// Type of the instance + /// Instance to invoke method on + /// Name of the method to invoke + /// Original method implementation + /// Method parameters + public static void ExecuteWithHotReload(T instance, string methodName, Action originalMethod, params object[] parameters) + { + var methodId = GetMethodId(methodName); + + // Try hot reload first + if (HotReloadRegistry.TryInvokeHotReload(methodId, instance, parameters)) + { + return; // Hot reload override was invoked + } + + // Fall back to original method + originalMethod?.Invoke(); + } + + /// + /// Execute method with custom method ID and hot reload override check. + /// Use this when the method has a custom ID specified in [HotReloadWithOverrides(Id = "...")]. + /// + /// Type of the instance + /// Instance to invoke method on + /// Custom method ID from HotReloadWithOverrides attribute + /// Original method implementation + /// Method parameters + /// Result of method invocation + public static object ExecuteWithHotReloadCustomId(T instance, string customMethodId, Func originalMethod, params object[] parameters) + { + // Try hot reload first + if (HotReloadRegistry.TryInvokeHotReload(customMethodId, instance, parameters)) + { + return null; // Hot reload methods currently don't return values + } + + // Fall back to original method + return originalMethod?.Invoke(); + } + + /// + /// Execute void method with custom method ID and hot reload override check. + /// Use this when the method has a custom ID specified in [HotReloadWithOverrides(Id = "...")]. + /// + /// Type of the instance + /// Instance to invoke method on + /// Custom method ID from HotReloadWithOverrides attribute + /// Original method implementation + /// Method parameters + public static void ExecuteWithHotReloadCustomId(T instance, string customMethodId, Action originalMethod, params object[] parameters) + { + // Try hot reload first + if (HotReloadRegistry.TryInvokeHotReload(customMethodId, instance, parameters)) + { + return; // Hot reload override was invoked + } + + // Fall back to original method + originalMethod?.Invoke(); + } + + /// + /// Check if a hot reload override is active for a specific method. + /// Useful for debugging or conditional logic based on hot reload state. + /// + /// Type of the instance + /// Name of the method to check + /// True if hot reload override is active + public static bool IsHotReloadActive(string methodName) + { + var methodId = GetMethodId(methodName); + var stats = HotReloadRegistry.GetStats(); + return stats.ActiveOverrideIds.Contains(methodId); + } + + /// + /// Check if a hot reload override is active for a specific custom method ID. + /// + /// Custom method ID to check + /// True if hot reload override is active + public static bool IsHotReloadActive(string customMethodId) + { + var stats = HotReloadRegistry.GetStats(); + return stats.ActiveOverrideIds.Contains(customMethodId); + } + + /// + /// Generate standard method ID from type and method name. + /// Format: TypeName.MethodName + /// + /// Type containing the method + /// Name of the method + /// Standard method ID + private static string GetMethodId(string methodName) + { + return $"{typeof(T).Name}.{methodName}"; + } + } +} \ No newline at end of file diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/HotReload/HotReloadHelper.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/HotReload/HotReloadHelper.cs.meta new file mode 100644 index 00000000..1ca56c9f --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/HotReload/HotReloadHelper.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5a2835bfdec4fc24cb67a208766efcff +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/HotReload/HotReloadRegistry.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/HotReload/HotReloadRegistry.cs new file mode 100644 index 00000000..901b81ac --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/HotReload/HotReloadRegistry.cs @@ -0,0 +1,365 @@ +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using Unity.Pipeline.Threading; +using UnityEngine; + +namespace Unity.Pipeline.HotReload +{ + /// + /// Central registry for managing hot reload method and component overrides. + /// Handles runtime method resolution, override registration, and fallback logic. + /// Thread-safe for runtime hot reload operations. + /// + public static class HotReloadRegistry + { + /// + /// Dispatcher used to marshal main-thread-required hot-reload overrides to the main thread. + /// Injected by RuntimePipelineManager (= its server's dispatcher). Null = run on the + /// current thread (no marshaling). + /// + public static Dispatcher Dispatcher { get; set; } + + /// + /// Absolute roots a running Player is allowed to hot reload source files from (Assets folder + /// + loaded package locations). Baked into RuntimePipelineManager at build time (a running + /// Player cannot resolve the project layout) and published here when the runtime server + /// starts, so reload commands can validate incoming file paths. Null until published. + /// + public static IReadOnlyList AllowedReloadRoots { get; set; } + + // Thread-safe collections for runtime hot reload switching + private static readonly ConcurrentDictionary m_MethodOverrides = new(); + private static readonly ConcurrentDictionary> m_ReloadableMethods = new(); + private static readonly ConcurrentDictionary m_LoadedHotReloadTypes = new(); + + /// + /// Register a method as hot reloadable. Called during discovery phase. + /// + public static void RegisterReloadableMethod(MethodInfo method, HotReloadWithOverridesAttribute attribute) + { + var methodId = GetMethodId(method, attribute.Id); + + if (!m_ReloadableMethods.ContainsKey(methodId)) + { + m_ReloadableMethods[methodId] = new List(); + } + + m_ReloadableMethods[methodId].Add(method); + } + + /// + /// Register a hot reload method override from compiled hot reload assembly. + /// Returns true if the override was registered, false if it was skipped. + /// + public static bool RegisterMethodOverride(MethodInfo overrideMethod, HotReloadOverrideMethodAttribute attribute, Type sourceType) + { + return RegisterMethodOverride(overrideMethod, attribute, sourceType, out _); + } + + /// + /// Register a hot reload method override from compiled hot reload assembly. + /// Returns true if the override was registered, false if it was skipped (target not + /// reloadable or signature mismatch). The out parameter carries a user-facing reason + /// when registration is skipped. + /// + public static bool RegisterMethodOverride(MethodInfo overrideMethod, HotReloadOverrideMethodAttribute attribute, Type sourceType, out string skipReason) + { + skipReason = null; + var targetMethodId = attribute.TargetMethodId; + + // Validate that target method exists and is reloadable + if (!m_ReloadableMethods.ContainsKey(targetMethodId)) + { + Debug.LogWarning($"HotReload: Target method '{targetMethodId}' not found or not marked [HotReloadWithOverrides]"); + skipReason = $"target '{targetMethodId}' is not registered as [HotReloadWithOverrides]. " + + "Ensure the component is in the scene and in play mode, and that it calls " + + "HotReloadRegistry.RegisterReloadableType(...) in Awake."; + return false; + } + + var originalMethods = m_ReloadableMethods[targetMethodId]; + if (!originalMethods.Any()) + { + Debug.LogWarning($"HotReload: No original methods registered for '{targetMethodId}'"); + skipReason = $"no original methods registered for '{targetMethodId}'."; + return false; + } + + // Validate signature compatibility (basic check - instance parameter + matching return type) + var originalMethod = originalMethods.First(); + if (!ValidateSignatureCompatibility(originalMethod, overrideMethod)) + { + Debug.LogError($"HotReload: Signature mismatch for '{targetMethodId}'. Override method must have instance parameter as first argument."); + skipReason = $"signature mismatch for '{targetMethodId}'. The override must be " + + $"'public static {originalMethod.ReturnType.Name} {overrideMethod.Name}" + + $"({originalMethod.DeclaringType?.Name} instance, ...)'. " + + "A common cause is the override file redeclaring the target type."; + return false; + } + + var methodOverride = new MethodOverride + { + TargetMethodId = targetMethodId, + OverrideMethod = overrideMethod, + SourceType = sourceType, + RequireMainThread = GetMainThreadRequirement(originalMethod), + Description = attribute.Description + }; + + m_MethodOverrides[targetMethodId] = methodOverride; + return true; + } + + /// + /// Attempt to invoke hot reload override if available, otherwise invoke original method. + /// Returns true if hot reload override was invoked, false if original method should be called. + /// + public static bool TryInvokeHotReload(string methodId, T instance, object[] parameters = null) + { + return TryInvokeHotReload(methodId, (object)instance, parameters); + } + + /// + /// Non-generic dispatch entry point. This is the method woven into [HotReload] + /// methods at compile time (a non-generic signature keeps the injected IL simple). + /// Returns true if a hot reload override was invoked, false if the original body should run. + /// + public static bool TryInvokeHotReload(string methodId, object instance, object[] parameters = null) + { + if (!m_MethodOverrides.TryGetValue(methodId, out var methodOverride)) + { + return false; // No hot reload override available + } + + try + { + // Prepare parameters with instance as first parameter + var invokeParams = new object[parameters?.Length + 1 ?? 1]; + invokeParams[0] = instance; + if (parameters != null && parameters.Length > 0) + { + Array.Copy(parameters, 0, invokeParams, 1, parameters.Length); + } + + // Invoke on appropriate thread. The dispatcher is injected by the runtime manager + // (HotReloadRegistry is reached from hot-reloaded runtime code, not a command). + // If no dispatcher was injected, run on the current thread. + if (methodOverride.RequireMainThread && Dispatcher != null && !Dispatcher.IsMainThread()) + { + Dispatcher.Invoke(() => + { + methodOverride.OverrideMethod.Invoke(null, invokeParams); + }); + } + else + { + methodOverride.OverrideMethod.Invoke(null, invokeParams); + } + + return true; + } + catch (Exception ex) + { + Debug.LogError($"HotReload: Error invoking override for '{methodId}': {ex.Message}"); + Debug.LogError($"HotReload: Stack trace: {ex.StackTrace}"); + return false; // Fall back to original method + } + } + + /// + /// Register all methods in a type that have the HotReloadWithOverrides attribute. + /// Uses reflection to discover and register methods marked with [HotReloadWithOverrides]. + /// + public static void RegisterReloadableType(System.Type type) + { + if (type == null) + { + Debug.LogWarning("HotReload: Cannot register null type"); + return; + } + + int registeredCount = 0; + + // Get all instance methods (public and non-public) + var instanceMethods = type.GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); + foreach (var method in instanceMethods) + { + var hotReloadAttr = method.GetCustomAttribute(); + if (hotReloadAttr != null) + { + RegisterReloadableMethod(method, hotReloadAttr); + registeredCount++; + } + } + + // Get all static methods (public and non-public) + var staticMethods = type.GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static); + foreach (var method in staticMethods) + { + var hotReloadAttr = method.GetCustomAttribute(); + if (hotReloadAttr != null) + { + RegisterReloadableMethod(method, hotReloadAttr); + registeredCount++; + } + } + + if (registeredCount > 0) + { + Debug.Log($"HotReload: Registered {registeredCount} reloadable methods from type {type.Name}"); + } + else + { + Debug.Log($"HotReload: No methods with [HotReloadWithOverrides] attribute found in type {type.Name}"); + } + } + + /// + /// Register a type from loaded hot reload assembly for discovery scanning. + /// + public static void RegisterHotReloadType(Type type, string assemblyId) + { + var typeKey = $"{assemblyId}:{type.FullName}"; + m_LoadedHotReloadTypes[typeKey] = type; + } + + /// + /// Clear all hot reload overrides. Used by cleanup_hotreload command. + /// + public static void ClearAllOverrides() + { + var overrideCount = m_MethodOverrides.Count; + var typeCount = m_LoadedHotReloadTypes.Count; + + m_MethodOverrides.Clear(); + m_LoadedHotReloadTypes.Clear(); + } + + /// + /// Clear all registry state including reloadable methods. + /// FOR TESTING ONLY - this should not be called in production code. + /// + public static void ClearAllForTesting() + { + var overrideCount = m_MethodOverrides.Count; + var typeCount = m_LoadedHotReloadTypes.Count; + var reloadableCount = m_ReloadableMethods.Sum(kvp => kvp.Value.Count); + + m_MethodOverrides.Clear(); + m_LoadedHotReloadTypes.Clear(); + m_ReloadableMethods.Clear(); + } + + /// + /// Get statistics about current hot reload state. + /// + public static HotReloadStats GetStats() + { + return new HotReloadStats + { + ReloadableMethodCount = m_ReloadableMethods.Sum(kvp => kvp.Value.Count), + ActiveOverrideCount = m_MethodOverrides.Count, + LoadedTypeCount = m_LoadedHotReloadTypes.Count, + ReloadableMethodIds = m_ReloadableMethods.Keys.ToList(), + ActiveOverrideIds = m_MethodOverrides.Keys.ToList() + }; + } + + /// + /// Generate method ID from MethodInfo and optional custom ID. + /// Format: TypeName.MethodName or custom ID if provided. + /// + private static string GetMethodId(MethodInfo method, string customId = null) + { + if (!string.IsNullOrEmpty(customId)) + { + return customId; + } + + return $"{method.DeclaringType?.Name}.{method.Name}"; + } + + /// + /// Validate that hot reload method signature is compatible with original method. + /// Hot reload method must have instance parameter as first argument. + /// + private static bool ValidateSignatureCompatibility(MethodInfo originalMethod, MethodInfo overrideMethod) + { + var originalParams = originalMethod.GetParameters(); + var overrideParams = overrideMethod.GetParameters(); + + // Hot reload method must have at least one parameter (the instance) + if (overrideParams.Length == 0) + { + return false; + } + + // First parameter must be compatible with declaring type of original method + var firstParam = overrideParams[0]; + if (!originalMethod.DeclaringType.IsAssignableFrom(firstParam.ParameterType)) + { + return false; + } + + // Remaining parameters must match original method parameters + if (overrideParams.Length - 1 != originalParams.Length) + { + return false; + } + + for (int i = 0; i < originalParams.Length; i++) + { + if (overrideParams[i + 1].ParameterType != originalParams[i].ParameterType) + { + return false; + } + } + + // Return types must match + return originalMethod.ReturnType == overrideMethod.ReturnType; + } + + /// + /// Determine if original method requires main thread execution. + /// + private static bool GetMainThreadRequirement(MethodInfo originalMethod) + { + // Check for HotReloadWithOverridesAttribute main thread requirement + var hotReloadAttr = originalMethod.GetCustomAttribute(); + if (hotReloadAttr != null) + { + return hotReloadAttr.RequireMainThread; + } + + // Default to main thread requirement for safety + return true; + } + + /// + /// Information about a registered method override. + /// + private class MethodOverride + { + public string TargetMethodId { get; set; } + public MethodInfo OverrideMethod { get; set; } + public Type SourceType { get; set; } + public bool RequireMainThread { get; set; } + public string Description { get; set; } + } + } + + /// + /// Statistics about current hot reload registry state. + /// + public class HotReloadStats + { + public int ReloadableMethodCount { get; set; } + public int ActiveOverrideCount { get; set; } + public int LoadedTypeCount { get; set; } + public List ReloadableMethodIds { get; set; } = new(); + public List ActiveOverrideIds { get; set; } = new(); + } +} \ No newline at end of file diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/HotReload/HotReloadRegistry.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/HotReload/HotReloadRegistry.cs.meta new file mode 100644 index 00000000..bcabbeea --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/HotReload/HotReloadRegistry.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 23cd8d0c782f1974e8a3b4095a178092 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/HotReload/InPlaceReloadProcessor.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/HotReload/InPlaceReloadProcessor.cs new file mode 100644 index 00000000..665a19d3 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/HotReload/InPlaceReloadProcessor.cs @@ -0,0 +1,560 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.CodeAnalysis.CSharp; +using Microsoft.CodeAnalysis.CSharp.Syntax; +using Unity.Pipeline.Compilation; +using UnityEngine; + +namespace Unity.Pipeline.HotReload +{ + /// + /// Main orchestrator for in-place hot reload processing. + /// Handles the complete pipeline: source parsing -> validation -> transformation -> compilation. + /// + public static class InPlaceReloadProcessor + { + /// + /// Process a source file for in-place hot reload. + /// Extracts [HotReloadWithOverrides] methods, validates accessibility, transforms to static overrides, and compiles. + /// DEADLOCK FIX: Detects main thread and uses synchronous processing when needed. + /// + /// Path to source file containing [HotReloadWithOverrides] methods + /// Optional directory to save compiled assembly + /// Emit debug symbols mapped to the original source so breakpoints bind. + /// Compilation result with success/failure and diagnostic information + public static Task ProcessSourceFileAsync(string sourceFilePath, string assemblyDir = null, bool pdb = false) + { + // Runs synchronously on the calling (main) thread; returns a completed Task. + return Task.FromResult(ProcessSourceFileOnMainThread(sourceFilePath, assemblyDir, pdb)); + } + + /// + /// Process source file on main thread synchronously to avoid deadlocks. + /// + public static InPlaceReloadResult ProcessSourceFileOnMainThread(string sourceFilePath, string assemblyDir = null, bool pdb = false) + { + var result = new InPlaceReloadResult + { + SourceFilePath = sourceFilePath, + Success = false + }; + + try + { + Debug.Log($"HotReload: Processing source file synchronously on main thread: {sourceFilePath}"); + + // 1. Read and parse the source file (synchronous) + var sourceCode = ReadSourceFile(sourceFilePath); + if (string.IsNullOrEmpty(sourceCode)) + { + result.ErrorMessage = $"Could not read source file: {sourceFilePath}"; + return result; + } + + // 2. Extract [HotReloadWithOverrides] methods + var extractionResult = ExtractHotReloadableMethods(sourceCode); + if (!extractionResult.HasMethods) + { + result.ErrorMessage = $"No [HotReload] methods found in {sourceFilePath}"; + return result; + } + + result.OriginalTypeName = extractionResult.TypeName; + result.ExtractedMethods = extractionResult.Methods.Keys.ToList(); + + Debug.Log($"HotReload: Extracted {extractionResult.Methods.Count} [HotReloadWithOverrides] methods from {extractionResult.TypeName}"); + + // 3. Validate accessibility (public members only) + var validationResult = AccessibilityValidator.ValidatePublicAccess( + sourceCode, + extractionResult.Methods, + extractionResult.TypeName); + + if (!validationResult.IsValid) + { + result.ErrorMessage = validationResult.GetFormattedErrorMessage(); + result.ValidationViolations = validationResult.Violations; + Debug.LogWarning($"HotReload: Accessibility validation failed: {result.ErrorMessage}"); + return result; + } + + Debug.Log($"HotReload: Accessibility validation passed for {extractionResult.TypeName}"); + + // 4. Transform method bodies to static overrides + var originalSource = File.ReadAllText(sourceFilePath); + var transformedCode = SourceCodeTransformer.TransformMethodBodies( + extractionResult.Methods, + extractionResult.TypeName, + extractionResult.MethodSignatures, + originalSource, + emitLineDirectives: pdb, + originalFilePath: sourceFilePath); + + result.TransformedCode = transformedCode; + + Debug.Log($"HotReload: Code transformation completed for {extractionResult.TypeName}"); + + // 5. Compile the transformed code (synchronous) + var compilationResult = CompileTransformedCode( + transformedCode, + extractionResult.TypeName, + assemblyDir, + pdb, + sourceFilePath); + + result.Success = compilationResult.IsSuccess; + result.AssemblyName = compilationResult.AssemblyName; + result.RegisteredMethods = compilationResult.RegisteredMethods; + result.CompilationDiagnostics = compilationResult.Diagnostics; + + if (result.Success) + { + Debug.Log($"HotReload: In-place reload successful for {sourceFilePath} - {result.RegisteredMethods.Count} methods registered"); + } + else + { + result.ErrorMessage = compilationResult.ErrorDetails ?? "Compilation failed"; + Debug.LogError($"HotReload: In-place reload compilation failed: {result.ErrorMessage}"); + } + + return result; + } + catch (Exception ex) + { + Debug.LogError($"HotReload: Error processing source file {sourceFilePath}: {ex.Message}"); + Debug.LogError($"HotReload: Stack trace: {ex.StackTrace}"); + + result.ErrorMessage = $"Processing error: {ex.Message}"; + return result; + } + } + + /// + /// Internal async processing implementation for background threads. + /// + private static async Task ProcessSourceFileInternalAsync(string sourceFilePath, string assemblyDir = null) + { + var result = new InPlaceReloadResult + { + SourceFilePath = sourceFilePath, + Success = false + }; + + try + { + Debug.Log($"HotReload: Processing source file asynchronously: {sourceFilePath}"); + + // 1. Read and parse the source file (async) + var sourceCode = await ReadSourceFileAsync(sourceFilePath); + if (string.IsNullOrEmpty(sourceCode)) + { + result.ErrorMessage = $"Could not read source file: {sourceFilePath}"; + return result; + } + + // 2-4. Same processing as main thread version + var extractionResult = ExtractHotReloadableMethods(sourceCode); + if (!extractionResult.HasMethods) + { + result.ErrorMessage = $"No [HotReload] methods found in {sourceFilePath}"; + return result; + } + + result.OriginalTypeName = extractionResult.TypeName; + result.ExtractedMethods = extractionResult.Methods.Keys.ToList(); + + var validationResult = AccessibilityValidator.ValidatePublicAccess( + sourceCode, + extractionResult.Methods, + extractionResult.TypeName); + + if (!validationResult.IsValid) + { + result.ErrorMessage = validationResult.GetFormattedErrorMessage(); + result.ValidationViolations = validationResult.Violations; + return result; + } + + var originalSource = File.ReadAllText(sourceFilePath); + var transformedCode = SourceCodeTransformer.TransformMethodBodies( + extractionResult.Methods, + extractionResult.TypeName, + extractionResult.MethodSignatures, + originalSource); + + result.TransformedCode = transformedCode; + + // 5. Compile the transformed code (async) + var compilationResult = await CompileTransformedCodeAsync( + transformedCode, + extractionResult.TypeName, + assemblyDir); + + result.Success = compilationResult.IsSuccess; + result.AssemblyName = compilationResult.AssemblyName; + result.RegisteredMethods = compilationResult.RegisteredMethods; + result.CompilationDiagnostics = compilationResult.Diagnostics; + + if (!result.Success) + { + result.ErrorMessage = compilationResult.ErrorDetails ?? "Compilation failed"; + } + + return result; + } + catch (Exception ex) + { + result.ErrorMessage = $"Processing error: {ex.Message}"; + return result; + } + } + + /// + /// Check if a source file contains [HotReload] methods. + /// Simple synchronous check to avoid async deadlocks in tests. + /// + /// Path to source file to check + /// True if file contains [HotReload] methods + public static Task ContainsHotReloadableMethodsAsync(string sourceFilePath) + { + try + { + if (!File.Exists(sourceFilePath)) + { + return Task.FromResult(false); + } + + // Use synchronous read for simple attribute check to avoid deadlocks + var sourceCode = File.ReadAllText(sourceFilePath); + if (string.IsNullOrEmpty(sourceCode)) + { + return Task.FromResult(false); + } + + // Quick check for [HotReload] attribute + var result = sourceCode.Contains("[HotReload]"); + return Task.FromResult(result); + } + catch (Exception ex) + { + Debug.LogError($"HotReload: Error checking for [HotReload] methods in {sourceFilePath}: {ex.Message}"); + return Task.FromResult(false); + } + } + + /// + /// Read source file content synchronously (for main thread). + /// + private static string ReadSourceFile(string filePath) + { + try + { + if (!File.Exists(filePath)) + { + Debug.LogError($"HotReload: Source file not found: {filePath}"); + return null; + } + + return File.ReadAllText(filePath); + } + catch (Exception ex) + { + Debug.LogError($"HotReload: Error reading source file {filePath}: {ex.Message}"); + return null; + } + } + + /// + /// Read source file content asynchronously (for background threads). + /// + private static Task ReadSourceFileAsync(string filePath) + { + try + { + if (!File.Exists(filePath)) + { + Debug.LogError($"HotReload: Source file not found: {filePath}"); + return Task.FromResult(null); + } + + // Use synchronous read wrapped in Task.FromResult to avoid deadlock issues + var content = File.ReadAllText(filePath); + return Task.FromResult(content); + } + catch (Exception ex) + { + Debug.LogError($"HotReload: Error reading source file {filePath}: {ex.Message}"); + return Task.FromResult(null); + } + } + + /// + /// Extract [HotReloadWithOverrides] methods from source code. + /// + private static HotReloadableExtractionResult ExtractHotReloadableMethods(string sourceCode) + { + var result = new HotReloadableExtractionResult(); + + try + { + var syntaxTree = CSharpSyntaxTree.ParseText(sourceCode); + var root = syntaxTree.GetRoot(); + + // Find the class containing [HotReload] methods + var classDeclaration = root.DescendantNodes() + .OfType() + .FirstOrDefault(c => c.DescendantNodes() + .OfType() + .Any(m => HasHotReloadAttribute(m))); + + if (classDeclaration == null) + { + return result; + } + + result.TypeName = classDeclaration.Identifier.ValueText; + + // Extract all [HotReload] methods + var hotReloadableMethods = classDeclaration.DescendantNodes() + .OfType() + .Where(m => HasHotReloadAttribute(m)); + + foreach (var method in hotReloadableMethods) + { + var methodName = method.Identifier.ValueText; + var methodBody = ExtractMethodBody(method); + var signature = ExtractMethodSignature(method); + + if (!string.IsNullOrEmpty(methodBody)) + { + result.Methods[methodName] = methodBody; + result.MethodSignatures[methodName] = signature; + } + } + + Debug.Log($"HotReload: Extracted {result.Methods.Count} [HotReload] methods from class {result.TypeName}"); + return result; + } + catch (Exception ex) + { + Debug.LogError($"HotReload: Error extracting [HotReload] methods: {ex.Message}"); + return result; + } + } + + /// + /// Check if method has [HotReload] attribute. + /// + private static bool HasHotReloadAttribute(MethodDeclarationSyntax method) + { + return method.AttributeLists + .SelectMany(al => al.Attributes) + .Any(a => a.Name.ToString().EndsWith("HotReload") || a.Name.ToString().EndsWith("HotReloadAttribute")); + } + + /// + /// Extract method body content (excluding braces). + /// + private static string ExtractMethodBody(MethodDeclarationSyntax method) + { + if (method.Body != null) + { + var bodyText = method.Body.ToString().Trim(); + // Remove outer braces + if (bodyText.StartsWith("{") && bodyText.EndsWith("}")) + { + bodyText = bodyText.Substring(1, bodyText.Length - 2).Trim(); + } + return bodyText; + } + + return ""; + } + + /// + /// Extract method signature information. + /// + private static MethodSignatureInfo ExtractMethodSignature(MethodDeclarationSyntax method) + { + var signature = new MethodSignatureInfo + { + ReturnType = method.ReturnType.ToString() + }; + + foreach (var parameter in method.ParameterList.Parameters) + { + var paramInfo = new ParameterInfo + { + Type = parameter.Type?.ToString() ?? "object", + Name = parameter.Identifier.ValueText, + HasDefaultValue = parameter.Default != null, + DefaultValue = parameter.Default?.Value?.ToString() + }; + + signature.Parameters.Add(paramInfo); + } + + return signature; + } + + /// + /// Compile transformed code synchronously (for main thread). + /// + private static HotReloadCompilationResult CompileTransformedCode( + string transformedCode, + string originalTypeName, + string assemblyDir, + bool emitPdb = false, + string documentPath = null) + { + try + { + // Generate a temporary file name for the transformed code + var tempFileName = $"InPlace_{originalTypeName}_{DateTime.Now:yyyyMMdd_HHmmss}"; + + // Use HotReloadCompiler synchronous method + var compileResult = HotReloadCompiler.CompileSourceCodeOnMainThread( + transformedCode, + tempFileName, + assemblyDir, + emitPdb, + documentPath); + + return compileResult; + } + catch (Exception ex) + { + Debug.LogError($"HotReload: Error compiling transformed code for {originalTypeName}: {ex.Message}"); + + return HotReloadCompilationResult.Failure( + "Compilation Error", + ex.Message, + 0, + new List { ex.ToString() }); + } + } + + /// + /// Compile transformed code asynchronously (for background threads). + /// + private static async Task CompileTransformedCodeAsync( + string transformedCode, + string originalTypeName, + string assemblyDir) + { + try + { + // Generate a temporary file name for the transformed code + var tempFileName = $"InPlace_{originalTypeName}_{DateTime.Now:yyyyMMdd_HHmmss}"; + + // Use HotReloadCompiler to compile the transformed source code + var compileResult = await HotReloadCompiler.CompileSourceCodeAsync( + transformedCode, + tempFileName, + assemblyDir); + + return compileResult; + } + catch (Exception ex) + { + Debug.LogError($"HotReload: Error compiling transformed code for {originalTypeName}: {ex.Message}"); + + return HotReloadCompilationResult.Failure( + "Compilation Error", + ex.Message, + 0, + new List { ex.ToString() }); + } + } + + /// + /// Result of extracting [HotReloadWithOverrides] methods from source code. + /// + private class HotReloadableExtractionResult + { + /// + /// Name of the class containing [HotReloadWithOverrides] methods. + /// + public string TypeName { get; set; } + + /// + /// Dictionary of method names to their extracted body code. + /// + public Dictionary Methods { get; set; } = new Dictionary(); + + /// + /// Dictionary of method names to their signature information. + /// + public Dictionary MethodSignatures { get; set; } = new Dictionary(); + + /// + /// Whether any [HotReloadWithOverrides] methods were found. + /// + public bool HasMethods => Methods.Count > 0; + } + } + + /// + /// Result of in-place hot reload processing. + /// + public class InPlaceReloadResult + { + /// + /// Path to the source file that was processed. + /// + public string SourceFilePath { get; set; } + + /// + /// Whether the processing was successful. + /// + public bool Success { get; set; } + + /// + /// Name of the original type containing [HotReloadWithOverrides] methods. + /// + public string OriginalTypeName { get; set; } + + /// + /// List of method names that were extracted and processed. + /// + public List ExtractedMethods { get; set; } = new List(); + + /// + /// Generated transformed code for hot reload assembly. + /// + public string TransformedCode { get; set; } + + /// + /// Name of the compiled assembly (if successful). + /// + public string AssemblyName { get; set; } + + /// + /// List of registered method IDs (if successful). + /// + public List RegisteredMethods { get; set; } = new List(); + + /// + /// Error message if processing failed. + /// + public string ErrorMessage { get; set; } + + /// + /// Accessibility validation violations (if any). + /// + public List ValidationViolations { get; set; } = new List(); + + /// + /// Compilation diagnostics (warnings, errors). + /// + public List CompilationDiagnostics { get; set; } = new List(); + + /// + /// Execution time in milliseconds. + /// + public long ExecutionTimeMs { get; set; } + } +} \ No newline at end of file diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/HotReload/InPlaceReloadProcessor.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/HotReload/InPlaceReloadProcessor.cs.meta new file mode 100644 index 00000000..a8da6aac --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/HotReload/InPlaceReloadProcessor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 411fb44c3329710449bcbfc2af627524 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/HotReload/OverrideFileValidator.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/HotReload/OverrideFileValidator.cs new file mode 100644 index 00000000..b4a2b7f2 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/HotReload/OverrideFileValidator.cs @@ -0,0 +1,136 @@ +using System.Collections.Generic; +using System.Linq; +using Microsoft.CodeAnalysis.CSharp; +using Microsoft.CodeAnalysis.CSharp.Syntax; + +namespace Unity.Pipeline.HotReload +{ + /// + /// Up-front, parse-only validation for the helper (separate override file) workflow used by + /// the reload_file_override command. Catches the common setup mistakes before compilation so + /// the user gets an actionable message instead of a confusing compiler error. + /// + /// Rules: + /// 1. The file must contain at least one method annotated [HotReloadOverrideMethod(...)]. + /// 2. The file must not redeclare a type that an override targets (the override's first + /// parameter type). Redeclaring the target type binds the override to a duplicate type + /// and the registration silently mismatches. + /// 3. Each [HotReloadOverrideMethod] method must be 'public static' and take the instance as its + /// first parameter. + /// + public static class OverrideFileValidator + { + public static OverrideFileValidationResult Validate(string sourceCode, string displayName) + { + var result = new OverrideFileValidationResult { DisplayName = displayName }; + + var root = CSharpSyntaxTree.ParseText(sourceCode ?? string.Empty).GetRoot(); + + // All type names declared in this file (class/struct), by simple name. + var declaredTypeNames = new HashSet(root.DescendantNodes() + .OfType() + .Select(t => t.Identifier.ValueText)); + + // All methods annotated [HotReloadOverrideMethod(...)]. + var overrideMethods = root.DescendantNodes() + .OfType() + .Where(HasHotReloadOverrideMethodAttribute) + .ToList(); + + // Rule 1: must contain at least one override method. + if (overrideMethods.Count == 0) + { + result.Errors.Add( + $"No [HotReloadOverrideMethod] overrides found in '{displayName}'. An override file must contain " + + "public static methods annotated [HotReloadOverrideMethod(\"Type.Method\")]. " + + "If you meant to edit a method body directly in its own source file, that is the in-place " + + "workflow (reload_file), not reload_file_override."); + return result; + } + + foreach (var method in overrideMethods) + { + var name = method.Identifier.ValueText; + var modifiers = method.Modifiers.Select(m => m.ValueText).ToList(); + + // Rule 3: must be public static. + if (!modifiers.Contains("static") || !modifiers.Contains("public")) + { + result.Errors.Add( + $"Override method '{name}' must be declared 'public static'."); + } + + // Rule 3: must take the instance as its first parameter. + var parameters = method.ParameterList.Parameters; + if (parameters.Count == 0) + { + result.Errors.Add( + $"Override method '{name}' must take the target instance as its first parameter, " + + $"e.g. 'public static void {name}(MyComponent instance, ...)'."); + continue; + } + + // Rule 2: the file must not redeclare the target type (the first parameter type). + var targetTypeName = GetSimpleTypeName(parameters[0].Type); + if (targetTypeName != null && declaredTypeNames.Contains(targetTypeName)) + { + result.Errors.Add( + $"'{displayName}' declares '{targetTypeName}', which is the type that override " + + $"'{name}' targets. Put the override in a separate file (any folder) that does not " + + $"redeclare your gameplay type '{targetTypeName}'."); + } + } + + return result; + } + + private static bool HasHotReloadOverrideMethodAttribute(MethodDeclarationSyntax method) + { + return method.AttributeLists + .SelectMany(al => al.Attributes) + .Any(a => a.Name.ToString().Contains("HotReloadOverrideMethod")); + } + + /// + /// Extract the simple (unqualified) name of a parameter type, e.g. "BossController" from + /// "Namespace.BossController". Returns null for types we cannot reduce to a single name. + /// + private static string GetSimpleTypeName(TypeSyntax type) + { + switch (type) + { + case IdentifierNameSyntax id: + return id.Identifier.ValueText; + case QualifiedNameSyntax qualified: + return qualified.Right.Identifier.ValueText; + default: + return null; + } + } + } + + /// + /// Result of validating a helper-workflow override file. + /// + public class OverrideFileValidationResult + { + public string DisplayName { get; set; } + public List Errors { get; } = new List(); + public bool IsValid => Errors.Count == 0; + + public string GetFormattedErrorMessage() + { + if (IsValid) + { + return "Override file is valid."; + } + + var message = $"reload_file_override validation failed for '{DisplayName}': {Errors.Count} issue(s)\n"; + for (int i = 0; i < Errors.Count; i++) + { + message += $"\n{i + 1}. {Errors[i]}"; + } + return message; + } + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/HotReload/OverrideFileValidator.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/HotReload/OverrideFileValidator.cs.meta new file mode 100644 index 00000000..87ae4c45 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/HotReload/OverrideFileValidator.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f111479a805a488b81989f5451e4b203 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/HotReload/SourceCodeTransformer.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/HotReload/SourceCodeTransformer.cs new file mode 100644 index 00000000..9854c5ab --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/HotReload/SourceCodeTransformer.cs @@ -0,0 +1,266 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp; +using Microsoft.CodeAnalysis.CSharp.Syntax; +using Unity.Pipeline.Compilation; +using UnityEngine; + +namespace Unity.Pipeline.HotReload +{ + /// + /// Transforms [HotReload] method bodies (edited in place on a MonoBehaviour) into static + /// hot reload override methods that the registry can dispatch to. + /// + /// The transform is driven by a Roslyn : every identifier that binds + /// to an instance member of the declaring type (or a base, e.g. transform on Component) is + /// rewritten to instance.<member>; locals, parameters, static members and Unity + /// built-ins are left untouched. The output mirrors the helper workflow's override shape: + /// + /// [HotReloadOverrideMethod("Type.Method")] + /// public static <ret> Method(Type instance, <params>) { ...rewritten body... } + /// + public static class SourceCodeTransformer + { + /// + /// Transform the [HotReload] methods named in into a + /// static override class. (the full source of the + /// file) is required so the semantic model can resolve member bindings in context. + /// + /// + /// When true, each rewritten body is bracketed by #line directives that map it back to + /// the original source file so an attached debugger binds breakpoints in the file the user + /// edited. Requires . The body is emitted with its original + /// whitespace (no NormalizeWhitespace) so line positions survive the transform. + /// + /// Absolute path of the source file, recorded in the #line directives. + public static string TransformMethodBodies( + Dictionary methodBodies, + string originalTypeName, + Dictionary originalMethodSignatures, + string originalTypeDefinition = null, + bool emitLineDirectives = false, + string originalFilePath = null) + { + if (string.IsNullOrEmpty(originalTypeDefinition)) + { + throw new InvalidOperationException( + "In-place transformation requires the full original source to build a semantic model."); + } + + try + { + var tree = CSharpSyntaxTree.ParseText(originalTypeDefinition); + var root = tree.GetRoot(); + + var compilation = CSharpCompilation.Create( + "HotReloadInPlaceTransform", + new[] { tree }, + RoslynCompilationService.GetMetadataReferences(), + new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary)); + var model = compilation.GetSemanticModel(tree); + + var classDecl = root.DescendantNodes() + .OfType() + .FirstOrDefault(c => c.Identifier.ValueText == originalTypeName); + if (classDecl == null) + { + throw new InvalidOperationException($"Could not find class '{originalTypeName}' in source."); + } + + var classSymbol = model.GetDeclaredSymbol(classDecl); + var rewriter = new InstanceMemberQualifier(model, classSymbol); + + var sb = new StringBuilder(); + foreach (var u in root.DescendantNodes().OfType()) + sb.AppendLine(u.ToString()); + sb.AppendLine("using Unity.Pipeline.HotReload;"); + + var namespaceName = GetNamespace(classDecl); + if (!string.IsNullOrEmpty(namespaceName)) + sb.AppendLine($"using {namespaceName};"); + sb.AppendLine(); + + sb.AppendLine($"public static class {originalTypeName}HotReloadOverrides"); + sb.AppendLine("{"); + + foreach (var method in classDecl.Members.OfType()) + { + var methodName = method.Identifier.ValueText; + if (!methodBodies.ContainsKey(methodName) || method.Body == null) + continue; + + var rewrittenBody = (BlockSyntax)rewriter.Visit(method.Body); + var returnType = method.ReturnType.ToString(); + + var parameters = new List { $"{originalTypeName} instance" }; + parameters.AddRange(method.ParameterList.Parameters.Select( + p => $"{p.Type} {p.Identifier.ValueText}")); + + sb.AppendLine($" [HotReloadOverrideMethod(\"{originalTypeName}.{methodName}\")]"); + sb.AppendLine($" public static {returnType} {methodName}({string.Join(", ", parameters)})"); + + if (emitLineDirectives && !string.IsNullOrEmpty(originalFilePath)) + { + // Map the body back to the original file. The rewriter only makes intra-line + // edits, so a single #line at the body's opening brace maps every line of the + // block; emit the body with original trivia (not NormalizeWhitespace) to keep + // line counts intact. #line hidden masks the generated scaffolding that follows. + var bodyLine = method.Body.GetLocation().GetLineSpan().StartLinePosition.Line + 1; + var escapedPath = originalFilePath.Replace("\\", "\\\\"); + sb.AppendLine($"#line {bodyLine} \"{escapedPath}\""); + sb.AppendLine(rewrittenBody.ToString()); + sb.AppendLine("#line hidden"); + } + else + { + sb.AppendLine(" " + rewrittenBody.NormalizeWhitespace().ToString()); + } + sb.AppendLine(); + } + + sb.AppendLine("}"); + + var result = sb.ToString(); + Debug.Log($"HotReload: Transformed {methodBodies.Count} in-place method(s) for {originalTypeName}"); + return result; + } + catch (Exception ex) + { + Debug.LogError($"HotReload: Error transforming in-place methods for {originalTypeName}: {ex.Message}"); + throw new InvalidOperationException( + $"Failed to transform in-place methods for {originalTypeName}: {ex.Message}", ex); + } + } + + private static string GetNamespace(SyntaxNode node) + { + for (var current = node.Parent; current != null; current = current.Parent) + { + if (current is NamespaceDeclarationSyntax ns) + return ns.Name.ToString(); + } + return null; + } + + /// + /// Rewrites implicit instance-member access (this.x or bare x) to instance.x using the + /// semantic model. Locals, parameters, static members and built-ins are left untouched. + /// + private class InstanceMemberQualifier : CSharpSyntaxRewriter + { + private readonly SemanticModel m_Model; + private readonly INamedTypeSymbol m_Type; + + public InstanceMemberQualifier(SemanticModel model, INamedTypeSymbol type) + { + m_Model = model; + m_Type = type; + } + + public override SyntaxNode VisitThisExpression(ThisExpressionSyntax node) + { + return SyntaxFactory.IdentifierName("instance").WithTriviaFrom(node); + } + + public override SyntaxNode VisitIdentifierName(IdentifierNameSyntax node) + { + if (ShouldSkip(node)) + return base.VisitIdentifierName(node); + + if (IsImplicitInstanceMember(node)) + return Qualify(node); + + return base.VisitIdentifierName(node); + } + + public override SyntaxNode VisitGenericName(GenericNameSyntax node) + { + // e.g. GetComponent() — visit type arguments first. + var visited = (GenericNameSyntax)base.VisitGenericName(node); + + if (ShouldSkip(node)) + return visited; + + if (IsImplicitInstanceMember(node)) + return Qualify(visited); + + return visited; + } + + private static bool ShouldSkip(SimpleNameSyntax node) + { + // Right-hand side of a member access (foo.Bar -> Bar), or part of a qualified name. + if (node.Parent is MemberAccessExpressionSyntax ma && ma.Name == node) + return true; + if (node.Parent is QualifiedNameSyntax) + return true; + if (node.Parent is MemberBindingExpressionSyntax) + return true; + return false; + } + + private bool IsImplicitInstanceMember(SimpleNameSyntax node) + { + var symbol = m_Model.GetSymbolInfo(node).Symbol; + if (symbol == null || symbol.IsStatic) + return false; + + switch (symbol.Kind) + { + case SymbolKind.Field: + case SymbolKind.Property: + case SymbolKind.Method: + case SymbolKind.Event: + return InTypeHierarchy(symbol.ContainingType); + default: + return false; + } + } + + private bool InTypeHierarchy(INamedTypeSymbol containingType) + { + if (containingType == null) + return false; + for (var t = m_Type; t != null; t = t.BaseType) + { + if (SymbolEqualityComparer.Default.Equals(t, containingType)) + return true; + } + return false; + } + + private static SyntaxNode Qualify(SimpleNameSyntax node) + { + return SyntaxFactory.MemberAccessExpression( + SyntaxKind.SimpleMemberAccessExpression, + SyntaxFactory.IdentifierName("instance"), + node.WithoutTrivia()) + .WithTriviaFrom(node); + } + } + } + + /// + /// Information about a method's signature for transformation purposes. + /// + public class MethodSignatureInfo + { + public string ReturnType { get; set; } + public List Parameters { get; set; } = new List(); + public bool ReturnsValue => !string.IsNullOrEmpty(ReturnType) && ReturnType != "void"; + } + + /// + /// Information about a method parameter. + /// + public class ParameterInfo + { + public string Type { get; set; } + public string Name { get; set; } + public bool HasDefaultValue { get; set; } + public string DefaultValue { get; set; } + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/HotReload/SourceCodeTransformer.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/HotReload/SourceCodeTransformer.cs.meta new file mode 100644 index 00000000..75ef1fbf --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/HotReload/SourceCodeTransformer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 425cdc175cccce547a6a3bf6f73c1f4f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models.meta new file mode 100644 index 00000000..425d69aa --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 68a343bc078aa5e459201276f7813b32 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/AuthoringResult.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/AuthoringResult.cs new file mode 100644 index 00000000..ea232826 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/AuthoringResult.cs @@ -0,0 +1,42 @@ +using System; +using Newtonsoft.Json; + +namespace Unity.Pipeline.Models +{ + /// + /// Canonical identity of an object an authoring command created or acted on, returned as the + /// command result so an agent can reference it in a follow-up call (via ). + /// Asset objects carry assetPath/guid(/fileId); loaded/scene objects carry instanceId/hierarchyPath. + /// + [Serializable] + public class AuthoringResult + { + /// Canonical GlobalObjectId string for the object. + [JsonProperty("globalId")] + public string GlobalId { get; set; } + + /// Project-relative asset path, if the object is an asset. + [JsonProperty("assetPath")] + public string AssetPath { get; set; } + + /// Asset GUID, if the object is an asset. + [JsonProperty("guid")] + public string Guid { get; set; } + + /// Local file id within the asset, for sub-assets. + [JsonProperty("fileId")] + public long? FileId { get; set; } + + /// Instance id, if the object is loaded/in a scene. + [JsonProperty("instanceId")] + public ObjectId? InstanceId { get; set; } + + /// Scene hierarchy path, for scene objects. + [JsonProperty("hierarchyPath")] + public string HierarchyPath { get; set; } + + /// Object type name (e.g. "GameObject", "Material", "DefaultAsset"). + [JsonProperty("type")] + public string Type { get; set; } + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/AuthoringResult.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/AuthoringResult.cs.meta new file mode 100644 index 00000000..6875c3a3 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/AuthoringResult.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6b92c58d435dcee4e8312f67b90af25c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/BaseResponse.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/BaseResponse.cs new file mode 100644 index 00000000..1000ed4b --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/BaseResponse.cs @@ -0,0 +1,49 @@ +using System; +using Newtonsoft.Json; + +namespace Unity.Pipeline.Models +{ + /// + /// Base class for all responses. Serve also as the base class for all errors. + /// + [Serializable] + public class BaseResponse + { + /// + /// Response message if no error + /// + [JsonProperty("message")] + public string Message { get; set; } + + /// + /// Error message if the command failed. + /// + [JsonProperty("error")] + public string Error { get; set; } + + /// + /// Additional error details for debugging. + /// + [JsonProperty("errorDetails")] + public string ErrorDetails { get; set; } + + /// + /// When was the response created. + /// + [JsonProperty("executedAt")] + public DateTime ExecutedAt { get; set; } + + /// + /// Create a failed execution response. + /// + public static BaseResponse Failure(string error, string errorDetails) + { + return new BaseResponse + { + ExecutedAt = DateTime.UtcNow, + Error = error, + ErrorDetails = errorDetails + }; + } + } +} \ No newline at end of file diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/BaseResponse.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/BaseResponse.cs.meta new file mode 100644 index 00000000..a5c363bf --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/BaseResponse.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 00ec05951f34dac4494abb6eb6c90026 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/CommandExecutionRequest.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/CommandExecutionRequest.cs new file mode 100644 index 00000000..269e9311 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/CommandExecutionRequest.cs @@ -0,0 +1,93 @@ +using System; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; + +namespace Unity.Pipeline.Models +{ + /// + /// Request model for /api/exec endpoint. + /// Contains command name and parameters for remote command execution. + /// + [Serializable] + public class CommandExecutionRequest + { + /// + /// Name of the command to execute. + /// Must match a registered [CliCommand] name. + /// + [JsonProperty("command", Required = Required.Always)] + public string Command { get; set; } + + /// + /// Parameters for the command execution. + /// Contains key-value pairs matching command parameter names. + /// + [JsonProperty("parameters")] + public JObject Parameters { get; set; } + + /// + /// Optional timeout for command execution in milliseconds. + /// Default: 60000 (60 seconds) + /// + [JsonProperty("timeout")] + public int? Timeout { get; set; } + + /// + /// Create a new command execution request. + /// + public CommandExecutionRequest() + { + Parameters = new JObject(); + } + + /// + /// Create a command execution request with specified command and parameters. + /// + public CommandExecutionRequest(string command, JObject parameters = null) + { + Command = command ?? throw new ArgumentNullException(nameof(command)); + Parameters = parameters ?? new JObject(); + } + + /// + /// Get a parameter value as the specified type. + /// Returns the default value if the parameter is not found or cannot be converted. + /// + public T GetParameter(string name, T defaultValue = default(T)) + { + if (Parameters == null || !Parameters.ContainsKey(name)) + return defaultValue; + + try + { + return Parameters[name].ToObject(); + } + catch + { + return defaultValue; + } + } + + /// + /// Check if a parameter exists in the request. + /// + public bool HasParameter(string name) + { + return Parameters != null && Parameters.ContainsKey(name); + } + + /// + /// Validate the request structure. + /// + public string Validate() + { + if (string.IsNullOrWhiteSpace(Command)) + return "Command name is required"; + + if (Timeout.HasValue && Timeout.Value <= 0) + return "Timeout must be a positive number"; + + return null; // No validation errors + } + } +} \ No newline at end of file diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/CommandExecutionRequest.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/CommandExecutionRequest.cs.meta new file mode 100644 index 00000000..94629e64 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/CommandExecutionRequest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: cb08d2e5232819b43bbec0549c02a689 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/CommandExecutionResponse.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/CommandExecutionResponse.cs new file mode 100644 index 00000000..85c9b8fc --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/CommandExecutionResponse.cs @@ -0,0 +1,68 @@ +using System; +using Newtonsoft.Json; + +namespace Unity.Pipeline.Models +{ + /// + /// Response model for /api/exec endpoint. + /// Contains execution result and metadata for remote command execution. + /// + [Serializable] + public class CommandExecutionResponse : BaseResponse + { + /// + /// Whether the command executed successfully. + /// + [JsonProperty("success")] + public bool Success { get; set; } + + /// + /// Name of the command that was executed. + /// + [JsonProperty("command")] + public string Command { get; set; } + + + /// + /// Result returned by the command (if any). + /// + [JsonProperty("result")] + public object Result { get; set; } + + /// + /// Execution duration in milliseconds. + /// + [JsonProperty("executionTimeMs")] + public long? ExecutionTimeMs { get; set; } + + /// + /// Create a successful execution response. + /// + public static CommandExecutionResponse CmdSuccess(string command, object result = null, long? executionTimeMs = null) + { + return new CommandExecutionResponse + { + Success = true, + Command = command, + ExecutedAt = DateTime.UtcNow, + Result = result, + ExecutionTimeMs = executionTimeMs + }; + } + + /// + /// Create a failed execution response. + /// + public static CommandExecutionResponse CmdFailure(string cmd, string error, string errorDetails) + { + return new CommandExecutionResponse + { + Command = cmd, + Success = false, + ExecutedAt = DateTime.UtcNow, + Error = error, + ErrorDetails = errorDetails + }; + } + } +} \ No newline at end of file diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/CommandExecutionResponse.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/CommandExecutionResponse.cs.meta new file mode 100644 index 00000000..1303e898 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/CommandExecutionResponse.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1911e492692621e4998635d7ddce0489 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/ConsoleLogEntry.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/ConsoleLogEntry.cs new file mode 100644 index 00000000..1acf3831 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/ConsoleLogEntry.cs @@ -0,0 +1,46 @@ +using System; +using Newtonsoft.Json; + +namespace Unity.Pipeline.Models +{ + /// + /// A single captured Unity console entry, as returned by the console command. + /// + [Serializable] + public class ConsoleLogEntry + { + /// + /// Monotonic sequence number assigned when the entry was captured. Acts as the cursor for + /// incremental ("--follow") retrieval: pass the highest seq seen back as the since + /// parameter to get only newer entries. Never reused, and increasing for the life of the + /// buffer (including across domain reloads, since the buffer is persisted). + /// + [JsonProperty("seq")] + public long Seq { get; set; } + + /// + /// When the entry was captured (UTC). + /// + [JsonProperty("timestampUtc")] + public DateTime TimestampUtc { get; set; } + + /// + /// Normalized severity: "log", "warn", or "error". Unity's Error/Exception/Assert log types + /// all map to "error"; Warning maps to "warn"; Log maps to "log". + /// + [JsonProperty("level")] + public string Level { get; set; } + + /// + /// The log message text. + /// + [JsonProperty("message")] + public string Message { get; set; } + + /// + /// The stack trace associated with the entry, if any. Empty for most plain logs. + /// + [JsonProperty("stackTrace")] + public string StackTrace { get; set; } + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/ConsoleLogEntry.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/ConsoleLogEntry.cs.meta new file mode 100644 index 00000000..b3752370 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/ConsoleLogEntry.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: bd1bd665815e523ee0da6504d78923df diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/ConsoleLogResponse.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/ConsoleLogResponse.cs new file mode 100644 index 00000000..b8444b84 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/ConsoleLogResponse.cs @@ -0,0 +1,42 @@ +using System; +using Newtonsoft.Json; + +namespace Unity.Pipeline.Models +{ + /// + /// Response model for the console command: a page of captured console entries plus + /// the cursor needed to fetch the next page. + /// + [Serializable] + public class ConsoleLogResponse + { + /// + /// The matching entries, oldest first, after applying the level filter, since cursor, + /// and tail limit. + /// + [JsonProperty("entries")] + public ConsoleLogEntry[] Entries { get; set; } + + /// + /// The highest currently held in the buffer (regardless of + /// the level filter). A "--follow" client passes this back as since on the next poll + /// so it resumes exactly where it left off, even if the only new entries were filtered out. + /// + [JsonProperty("cursor")] + public long Cursor { get; set; } + + /// + /// Number of entries returned in . + /// + [JsonProperty("returned")] + public int Returned { get; set; } + + /// + /// True when the requested since cursor pointed at entries that have already been + /// evicted from the bounded buffer, meaning the consumer missed some entries. Lets a + /// "--follow" client warn about a gap instead of silently skipping output. + /// + [JsonProperty("dropped")] + public bool Dropped { get; set; } + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/ConsoleLogResponse.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/ConsoleLogResponse.cs.meta new file mode 100644 index 00000000..3ac7c4c1 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/ConsoleLogResponse.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 3382b91cda66d80db6ab090f9fbeac16 diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/EvalResponse.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/EvalResponse.cs new file mode 100644 index 00000000..3b839a3f --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/EvalResponse.cs @@ -0,0 +1,92 @@ +using System; +using System.Collections.Generic; +using Newtonsoft.Json; + +namespace Unity.Pipeline.Models +{ + /// + /// Response from code evaluation commands containing results, output, and diagnostics. + /// + [Serializable] + public class EvalResponse :CommandExecutionResponse + { + /// + /// Console output captured during execution. + /// + [JsonProperty("output")] + public string Output { get; set; } + + /// + /// Compilation diagnostics (errors, warnings) from Roslyn. + /// + [JsonProperty("diagnostics")] + public List Diagnostics { get; set; } = new List(); + + /// + /// Create a successful evaluation response. + /// + public static EvalResponse EvalSuccess(object result, string output = null, long executionTimeMs = 0, List diagnostics = null) + { + return new EvalResponse + { + Success = true, + Result = result, + Output = output, + ExecutionTimeMs = executionTimeMs, + Diagnostics = diagnostics ?? new List() + }; + } + + /// + /// Create a failed evaluation response. + /// + public static EvalResponse EvalFailure(string error, string errorDetails = null, long executionTimeMs = 0, List diagnostics = null) + { + return new EvalResponse + { + Success = false, + Error = error, + ErrorDetails = errorDetails, + ExecutionTimeMs = executionTimeMs, + Diagnostics = diagnostics ?? new List() + }; + } + } + + /// + /// Compilation diagnostic information from Roslyn. + /// + [Serializable] + public class DiagnosticInfo + { + /// + /// Severity level: "error", "warning", "info". + /// + [JsonProperty("severity")] + public string Severity { get; set; } + + /// + /// Diagnostic message text. + /// + [JsonProperty("message")] + public string Message { get; set; } + + /// + /// Line number (0-based). + /// + [JsonProperty("line")] + public int Line { get; set; } + + /// + /// Column number (0-based). + /// + [JsonProperty("column")] + public int Column { get; set; } + + /// + /// Diagnostic identifier (e.g., "CS1002"). + /// + [JsonProperty("id")] + public string Id { get; set; } + } +} \ No newline at end of file diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/EvalResponse.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/EvalResponse.cs.meta new file mode 100644 index 00000000..3ee6d5b1 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/EvalResponse.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7f93e07b346878148b61c36fd3ece752 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/InstanceDescriptor.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/InstanceDescriptor.cs new file mode 100644 index 00000000..a2352437 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/InstanceDescriptor.cs @@ -0,0 +1,203 @@ +using System; +using System.IO; +using System.Diagnostics; +using Newtonsoft.Json; +using UnityEngine; +using Unity.Pipeline.Security; + +namespace Unity.Pipeline.Models +{ + /// + /// Manages instance descriptor files for CLI discovery. + /// Written to Library/Pipeline/.unity-pipeline-port (under the project's git-ignored Library + /// folder) for CLI tools to find running Editor instances. + /// + [Serializable] + public class InstanceDescriptor + { + private const string DescriptorFileName = ".unity-pipeline-port"; + + /// + /// Process ID of the Unity Editor + /// + [JsonProperty("pid")] + public int Pid { get; set; } + + /// + /// HTTP port the pipeline server is listening on + /// + [JsonProperty("port")] + public int Port { get; set; } + + /// + /// Full path to the Unity project + /// + [JsonProperty("projectPath")] + public string ProjectPath { get; set; } + + /// + /// Name of the Unity project + /// + [JsonProperty("projectName")] + public string ProjectName { get; set; } + + /// + /// Unity Editor version string + /// + [JsonProperty("unityVersion")] + public string UnityVersion { get; set; } + + /// + /// Editor mode: "editor", "batchmode" + /// + [JsonProperty("mode")] + public string Mode { get; set; } + + /// + /// When the Editor instance was started + /// + [JsonProperty("startedAt")] + public DateTime StartedAt { get; set; } + + /// + /// Last heartbeat timestamp + /// + [JsonProperty("lastHeartbeat")] + public DateTime LastHeartbeat { get; set; } + + /// + /// Security token for code evaluation commands + /// + [JsonProperty("evalToken")] + public string EvalToken { get; set; } + + /// + /// Create instance descriptor for current Editor session + /// + public static InstanceDescriptor CreateCurrent(int port) + { + try + { + var projectPath = Path.GetDirectoryName(Application.dataPath); + var projectName = Path.GetFileName(projectPath); + var pid = Process.GetCurrentProcess().Id; + var unityVersion = Application.unityVersion; + var isBatchMode = Application.isBatchMode; + + // Generate eval token at server startup for CLI auto-discovery + var evalToken = SecurityTokenManager.GetOrCreateToken(); + + return new InstanceDescriptor + { + Pid = pid, + Port = port, + ProjectPath = projectPath, + ProjectName = projectName, + UnityVersion = unityVersion, + Mode = isBatchMode ? "batchmode" : "editor", + StartedAt = DateTime.UtcNow, + LastHeartbeat = DateTime.UtcNow, + EvalToken = evalToken + }; + } + catch (Exception ex) + { + UnityEngine.Debug.LogError($"CreateCurrent failed: {ex.Message}"); + UnityEngine.Debug.LogError($"Stack trace: {ex.StackTrace}"); + throw; + } + } + + /// + /// Write instance descriptor to project root + /// + public static void WriteToProjectRoot(InstanceDescriptor descriptor) + { + try + { + var filePath = GetDescriptorFilePath(descriptor.ProjectPath); + var isNewFile = !File.Exists(filePath); + // The descriptor lives under Library/Pipeline, which may not exist yet. + Directory.CreateDirectory(Path.GetDirectoryName(filePath)); + var json = JsonConvert.SerializeObject(descriptor, Formatting.Indented); + File.WriteAllText(filePath, json); + + // The descriptor carries the auth token; keep it readable only by the current user. + // Applied once on creation (heartbeat rewrites preserve the existing permissions). + if (isNewFile) + FilePermissions.RestrictToCurrentUser(filePath); + } + catch (Exception ex) + { + UnityEngine.Debug.LogError($"WriteToProjectRoot failed: {ex.Message}"); + UnityEngine.Debug.LogError($"Descriptor: {descriptor?.ProjectPath}, PID: {descriptor?.Pid}"); + throw; + } + } + + /// + /// Read instance descriptor from project root + /// + public static InstanceDescriptor ReadFromProjectRoot(string projectPath) + { + var filePath = GetDescriptorFilePath(projectPath); + + if (!File.Exists(filePath)) + return null; + + try + { + var json = File.ReadAllText(filePath); + return JsonConvert.DeserializeObject(json); + } + catch + { + // Invalid or corrupted file + return null; + } + } + + /// + /// Remove instance descriptor from project root + /// + public static void RemoveFromProjectRoot(string projectPath) + { + var filePath = GetDescriptorFilePath(projectPath); + + if (File.Exists(filePath)) + { + try + { + File.Delete(filePath); + } + catch + { + // Ignore cleanup errors + } + } + } + + /// + /// Update heartbeat timestamp in existing descriptor file + /// + public static void UpdateHeartbeat(string projectPath) + { + var descriptor = ReadFromProjectRoot(projectPath); + if (descriptor != null) + { + descriptor.LastHeartbeat = DateTime.UtcNow; + WriteToProjectRoot(descriptor); + } + } + + /// + /// Absolute path to the editor descriptor file for a project: the git-ignored + /// Library/Pipeline folder under the project root. Public so discovery code and tests + /// derive the location from one place. + /// + public static string GetDescriptorFilePath(string projectPath) + { + return Path.Combine(projectPath, "Library", "Pipeline", DescriptorFileName); + } + } +} \ No newline at end of file diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/InstanceDescriptor.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/InstanceDescriptor.cs.meta new file mode 100644 index 00000000..c86575bd --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/InstanceDescriptor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c19a2cde67d600341b17d8056b8393e2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/ObjectRef.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/ObjectRef.cs new file mode 100644 index 00000000..3b50e829 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/ObjectRef.cs @@ -0,0 +1,57 @@ +using System; +using Newtonsoft.Json; + +namespace Unity.Pipeline.Models +{ + /// + /// Agent-supplied handle that references an existing Unity object — an asset or a + /// loaded/scene object. Supply ONE form; + /// tries them in order: globalId, path, guid (+ optional fileId), instanceId, hierarchyPath. + /// + [Serializable] + [JsonConverter(typeof(ObjectRefConverter))] + public class ObjectRef + { + /// Canonical GlobalObjectId string (addresses assets and scene objects uniformly). + [JsonProperty("globalId")] + public string GlobalId { get; set; } + + /// Project-relative asset path, e.g. "Assets/Foo/Bar.prefab". + [JsonProperty("path")] + public string Path { get; set; } + + /// Asset GUID. + [JsonProperty("guid")] + public string Guid { get; set; } + + /// Local file id, used with to address a sub-asset. + [JsonProperty("fileId")] + public long? FileId { get; set; } + + /// Instance id of a loaded/scene object. + [JsonProperty("instanceId")] + public ObjectId? InstanceId { get; set; } + + /// Scene hierarchy path, e.g. "/Root/Child/Leaf". + [JsonProperty("hierarchyPath")] + public string HierarchyPath { get; set; } + + [JsonIgnore] + public bool IsEmpty => + string.IsNullOrEmpty(GlobalId) && + string.IsNullOrEmpty(Path) && + string.IsNullOrEmpty(Guid) && + InstanceId == null && + string.IsNullOrEmpty(HierarchyPath); + + public override string ToString() + { + if (!string.IsNullOrEmpty(GlobalId)) return GlobalId; + if (!string.IsNullOrEmpty(Path)) return Path; + if (!string.IsNullOrEmpty(Guid)) return FileId.HasValue ? $"guid:{Guid}:{FileId}" : $"guid:{Guid}"; + if (InstanceId.HasValue) return $"instanceId:{InstanceId}"; + if (!string.IsNullOrEmpty(HierarchyPath)) return HierarchyPath; + return ""; + } + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/ObjectRef.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/ObjectRef.cs.meta new file mode 100644 index 00000000..e436c15d --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/ObjectRef.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e970b2bf3a890d743bea6785f8af3765 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/ObjectRefConverter.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/ObjectRefConverter.cs new file mode 100644 index 00000000..138f6745 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/ObjectRefConverter.cs @@ -0,0 +1,188 @@ +using System; +using System.IO; +using System.Text.RegularExpressions; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; + +namespace Unity.Pipeline.Models +{ + /// + /// JSON converter for that accepts BOTH a structured object + /// (all six fields via their JSON property names) AND a single canonical string handle. + /// + /// The MCP tool schemas intentionally expose object-reference parameters as plain strings, so an + /// agent typically passes e.g. "target": "/Player" or "target": "GlobalObjectId_V1-...". + /// Without this converter, Newtonsoft's ToObject<ObjectRef>() (used by + /// BasePipelineServer.ExtractCommandParameters) gets a JValue(string), returns null, and the + /// command fails Required-parameter validation. This converter coerces the string into the matching + /// field, mirroring the priority order of ObjectResolver.TryResolve and ObjectRef.ToString(). + /// + /// Registered on the class itself via [JsonConverter(typeof(ObjectRefConverter))] so it applies + /// everywhere an is (de)serialized — no server or command changes required. + /// + public class ObjectRefConverter : JsonConverter + { + private static readonly Regex s_GuidWithFileId = new Regex(@"^guid:([0-9a-fA-F]+):([0-9]+)$", RegexOptions.Compiled); + private static readonly Regex s_GuidOnly = new Regex(@"^guid:([0-9a-fA-F]+)$", RegexOptions.Compiled); + private static readonly Regex s_InstanceId = new Regex(@"^instanceId:(-?[0-9]+)$", RegexOptions.Compiled); + private static readonly Regex s_PlainInt = new Regex(@"^-?[0-9]+$", RegexOptions.Compiled); + private static readonly Regex s_Hex32 = new Regex(@"^[0-9a-fA-F]{32}$", RegexOptions.Compiled); + + public override ObjectRef ReadJson(JsonReader reader, Type objectType, ObjectRef existingValue, + bool hasExistingValue, JsonSerializer serializer) + { + var token = JToken.Load(reader); + switch (token.Type) + { + case JTokenType.Null: + return null; + case JTokenType.String: + return FromString((string)token); + case JTokenType.Integer: + // A bare JSON number is treated as an instance id (e.g. "target": 48184). + return new ObjectRef { InstanceId = token.ToObject() }; + case JTokenType.Object: + return FromObject((JObject)token); + default: + return null; + } + } + + public override void WriteJson(JsonWriter writer, ObjectRef value, JsonSerializer serializer) + { + if (value == null) + { + writer.WriteNull(); + return; + } + + // Write a standard JSON object (matching the [JsonProperty] names on ObjectRef). Done + // manually rather than via serializer.Serialize to avoid re-entering this converter. + writer.WriteStartObject(); + writer.WritePropertyName("globalId"); + writer.WriteValue(value.GlobalId); + writer.WritePropertyName("path"); + writer.WriteValue(value.Path); + writer.WritePropertyName("guid"); + writer.WriteValue(value.Guid); + writer.WritePropertyName("fileId"); + if (value.FileId.HasValue) writer.WriteValue(value.FileId.Value); else writer.WriteNull(); + writer.WritePropertyName("instanceId"); + // Route the id through ObjectIdConverter so it serializes as its raw numeric form + // (the 64-bit EntityId on 6000.4+, the int below). Not this converter — no recursion. + if (value.InstanceId.HasValue) serializer.Serialize(writer, value.InstanceId.Value); else writer.WriteNull(); + writer.WritePropertyName("hierarchyPath"); + writer.WriteValue(value.HierarchyPath); + writer.WriteEndObject(); + } + + /// + /// Map a structured JSON object to an ObjectRef by reading each field directly (rather than + /// ToObject<ObjectRef>(), which would recurse back into this converter). + /// + /// Keys are matched case-INSENSITIVELY: agents commonly vary the casing (e.g. "instanceID" for + /// instanceId, "fileID" for fileId), and because this custom converter bypasses Newtonsoft's + /// default case-insensitive property binding, an exact-case lookup would otherwise drop the + /// field and yield an empty (silently unresolved) handle. + /// + private static ObjectRef FromObject(JObject jo) + { + return new ObjectRef + { + GlobalId = Str(jo, "globalId"), + Path = Str(jo, "path"), + Guid = Str(jo, "guid"), + FileId = Long(jo, "fileId"), + InstanceId = ObjId(jo, "instanceId"), + HierarchyPath = Str(jo, "hierarchyPath"), + }; + } + + /// Find a property value by name, ignoring case (Newtonsoft's JObject lookup is case-sensitive). + private static JToken Get(JObject jo, string key) + { + foreach (var p in jo.Properties()) + { + if (string.Equals(p.Name, key, StringComparison.OrdinalIgnoreCase)) + return p.Value; + } + + return null; + } + + private static string Str(JObject jo, string key) + { + var t = Get(jo, key); + return t == null || t.Type == JTokenType.Null ? null : t.Value(); + } + + private static ObjectId? ObjId(JObject jo, string key) + { + var t = Get(jo, key); + return t == null || t.Type == JTokenType.Null ? (ObjectId?)null : t.ToObject(); + } + + private static long? Long(JObject jo, string key) + { + var t = Get(jo, key); + return t == null || t.Type == JTokenType.Null ? (long?)null : t.Value(); + } + + /// + /// Parse a single canonical string handle into the matching field. Priority order matches + /// ObjectResolver.TryResolve / ObjectRef.ToString(); a bare name falls back to + /// the hierarchy path (the most common agent input). + /// + internal static ObjectRef FromString(string s) + { + if (string.IsNullOrWhiteSpace(s)) + return null; + + s = s.Trim(); + + if (s.StartsWith("GlobalObjectId_V1", StringComparison.Ordinal)) + return new ObjectRef { GlobalId = s }; + + // "Assets/..." and "Packages/..." (and the bare roots) are asset paths that + // AssetDatabase.LoadMainAssetAtPath can resolve; everything else falls through to the + // hierarchy-path fallback at the end. + if (s.StartsWith("Assets/", StringComparison.Ordinal) + || s.StartsWith("Packages/", StringComparison.Ordinal) + || s == "Assets" || s == "Packages") + return new ObjectRef { Path = s }; + + var guidFile = s_GuidWithFileId.Match(s); + if (guidFile.Success && long.TryParse(guidFile.Groups[2].Value, out var fileId)) + return new ObjectRef { Guid = guidFile.Groups[1].Value, FileId = fileId }; + + var guidOnly = s_GuidOnly.Match(s); + if (guidOnly.Success) + return new ObjectRef { Guid = guidOnly.Groups[1].Value }; + + var inst = s_InstanceId.Match(s); + if (inst.Success && ObjectId.TryParse(inst.Groups[1].Value, out var prefixedId)) + return new ObjectRef { InstanceId = prefixedId }; + + // A plain integer is an instance id. On 6000.0-6000.3 negative ids are valid (unsaved scene + // objects); on 6000.4+ the id is the unsigned 64-bit EntityId, so a leading '-' won't parse + // and falls through to the hierarchy-path handling below. + if (s_PlainInt.IsMatch(s) && ObjectId.TryParse(s, out var plainId)) + return new ObjectRef { InstanceId = plainId }; + + // Exactly 32 hex chars with no other prefix is a bare asset GUID. + if (s_Hex32.IsMatch(s)) + return new ObjectRef { Guid = s }; + + // A relative string with a file extension (e.g. "Materials/Floor.mat", "Enemy.prefab") is + // most likely an authoring-root-relative asset path — route it to Path so the resolver can + // normalize it under the authoring root. A leading "/" always means a scene hierarchy path, + // and an extension-less string ("Player", "Root/Child") stays one. Dotted GameObject names + // ("Cube.001") land here too, but the resolver falls back to a hierarchy lookup for those. + if (!s.StartsWith("/", StringComparison.Ordinal) && Path.HasExtension(s)) + return new ObjectRef { Path = s }; + + // Leading-"/" canonical paths and bare names resolve as a scene hierarchy path. + return new ObjectRef { HierarchyPath = s }; + } + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/ObjectRefConverter.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/ObjectRefConverter.cs.meta new file mode 100644 index 00000000..0b538def --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/ObjectRefConverter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e31382a242c2a084e97ba76716798aa3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/RuntimeInstanceDescriptor.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/RuntimeInstanceDescriptor.cs new file mode 100644 index 00000000..7775a1f9 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/RuntimeInstanceDescriptor.cs @@ -0,0 +1,203 @@ +using System; +using Newtonsoft.Json; +using UnityEngine; +using Unity.Pipeline.Config; +using System.IO; +using Unity.Pipeline.Security; + +namespace Unity.Pipeline.Models +{ + /// + /// Instance descriptor for runtime Unity Player builds with Pipeline server. + /// Different from Editor InstanceDescriptor to reflect runtime context and security. + /// + [Serializable] + public class RuntimeInstanceDescriptor + { + private const string RuntimeDescriptorFileName = ".unity-pipeline-runtime-port"; + + /// + /// Process ID of the Unity Player application + /// + [JsonProperty("pid")] + public int Pid { get; set; } + + /// + /// HTTP port the pipeline server is listening on (7900-7999 range) + /// + [JsonProperty("port")] + public int Port { get; set; } + + /// + /// Unity runtime platform (Windows, macOS, Linux, etc.) + /// + [JsonProperty("platform")] + public string Platform { get; set; } + + /// + /// Unity Player version string + /// + [JsonProperty("unityVersion")] + public string UnityVersion { get; set; } + + /// + /// Unique build identifier + /// + [JsonProperty("buildGuid")] + public string BuildGuid { get; set; } + + /// + /// When the runtime instance was started + /// + [JsonProperty("startedAt")] + public DateTime StartedAt { get; set; } + + /// + /// Last heartbeat timestamp + /// + [JsonProperty("lastHeartbeat")] + public DateTime LastHeartbeat { get; set; } + + /// + /// Working directory where the application is running + /// + [JsonProperty("workingDirectory")] + public string WorkingDirectory { get; set; } + + /// + /// Security token used to authorize requests to this runtime server. + /// + [JsonProperty("evalToken")] + public string EvalToken { get; set; } + + /// + /// Create runtime instance descriptor for current Player application. + /// + public static RuntimeInstanceDescriptor CreateCurrent(int port, RuntimePipelineConfig config) + { + try + { + var pid = System.Diagnostics.Process.GetCurrentProcess().Id; + var unityVersion = Application.unityVersion; + var platform = Application.platform.ToString(); + var buildGuid = Application.buildGUID; + var workingDir = Directory.GetCurrentDirectory(); + + var token = SecurityTokenManager.GetOrCreateToken(); + + return new RuntimeInstanceDescriptor + { + Pid = pid, + Port = port, + Platform = platform, + UnityVersion = unityVersion, + BuildGuid = buildGuid, + StartedAt = DateTime.UtcNow, + LastHeartbeat = DateTime.UtcNow, + WorkingDirectory = workingDir, + EvalToken = token + }; + } + catch (Exception ex) + { + UnityEngine.Debug.LogError($"Pipeline: CreateCurrent failed: {ex.Message}"); + throw; + } + } + + /// + /// Write runtime instance descriptor to working directory. + /// + public static void WriteToWorkingDirectory(RuntimeInstanceDescriptor descriptor) + { + try + { + var filePath = GetDescriptorFilePath(); + var isNewFile = !File.Exists(filePath); + var json = JsonConvert.SerializeObject(descriptor, Formatting.Indented); + + File.WriteAllText(filePath, json); + + // The descriptor carries the auth token; keep it readable only by the current user. + // Applied once on creation (heartbeat rewrites preserve the existing permissions). + if (isNewFile) + FilePermissions.RestrictToCurrentUser(filePath); + + System.Console.WriteLine($"Pipeline: Runtime descriptor written to {filePath}"); + } + catch (Exception ex) + { + UnityEngine.Debug.LogError($"Pipeline: Failed to write runtime descriptor: {ex.Message}"); + throw; + } + } + + /// + /// Read runtime instance descriptor from working directory. + /// + public static RuntimeInstanceDescriptor ReadFromWorkingDirectory() + { + var filePath = GetDescriptorFilePath(); + + if (!File.Exists(filePath)) + return null; + + try + { + var json = File.ReadAllText(filePath); + return JsonConvert.DeserializeObject(json); + } + catch (Exception ex) + { + UnityEngine.Debug.LogWarning($"Pipeline: Failed to read runtime descriptor: {ex.Message}"); + return null; + } + } + + /// + /// Remove runtime instance descriptor from working directory. + /// + public static void RemoveFromWorkingDirectory() + { + var filePath = GetDescriptorFilePath(); + + if (File.Exists(filePath)) + { + try + { + File.Delete(filePath); + } + catch (Exception ex) + { + UnityEngine.Debug.LogWarning($"Pipeline: Failed to remove runtime descriptor: {ex.Message}"); + } + } + } + + /// + /// Update heartbeat timestamp in existing descriptor file. + /// + public static void UpdateHeartbeat() + { + try + { + var descriptor = ReadFromWorkingDirectory(); + if (descriptor != null) + { + descriptor.LastHeartbeat = DateTime.UtcNow; + WriteToWorkingDirectory(descriptor); + } + } + catch (Exception ex) + { + UnityEngine.Debug.LogWarning($"Pipeline: Failed to update runtime heartbeat: {ex.Message}"); + } + } + + private static string GetDescriptorFilePath() + { + var workingDir = new FileInfo($"{Application.dataPath}/..").FullName; + return Path.Combine(workingDir, RuntimeDescriptorFileName); + } + } +} \ No newline at end of file diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/RuntimeInstanceDescriptor.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/RuntimeInstanceDescriptor.cs.meta new file mode 100644 index 00000000..6c7a30e6 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/RuntimeInstanceDescriptor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a7787403e02096545b7798cd3d5d076d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/StatusResponse.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/StatusResponse.cs new file mode 100644 index 00000000..6df8a129 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/StatusResponse.cs @@ -0,0 +1,55 @@ +using System; +using Newtonsoft.Json; + +namespace Unity.Pipeline.Models +{ + /// + /// Response model for /api/status endpoint. + /// Provides Editor state information for CLI tools and automation scripts. + /// + [Serializable] + public class StatusResponse + { + /// + /// Current Editor status: "ready", "compiling", "busy" + /// + [JsonProperty("status")] + public string Status { get; set; } + + /// + /// Whether Unity is currently compiling scripts + /// + [JsonProperty("compiling")] + public bool Compiling { get; set; } + + /// + /// Whether a domain reload is in progress + /// + [JsonProperty("domainReloadInProgress")] + public bool DomainReloadInProgress { get; set; } + + /// + /// Current play mode state: "stopped", "playing", "paused" + /// + [JsonProperty("playMode")] + public string PlayMode { get; set; } + + /// + /// Timestamp of last heartbeat update + /// + [JsonProperty("lastHeartbeat")] + public DateTime LastHeartbeat { get; set; } + + /// + /// Full path to the Unity project + /// + [JsonProperty("projectPath")] + public string ProjectPath { get; set; } + + /// + /// Unity Editor version string + /// + [JsonProperty("unityVersion")] + public string UnityVersion { get; set; } + } +} \ No newline at end of file diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/StatusResponse.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/StatusResponse.cs.meta new file mode 100644 index 00000000..12a903d0 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/StatusResponse.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 86f7bba2bb7101544a486545cb8e2f70 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/TestExecutionResponse.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/TestExecutionResponse.cs new file mode 100644 index 00000000..4ae4c9eb --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/TestExecutionResponse.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using Unity.Pipeline.Models; + +namespace Unity.Pipeline +{ + /// + /// Response for test execution commands, containing summary and detailed results + /// + [Serializable] + public class TestExecutionResponse : CommandExecutionResponse + { + public TestSummary Summary { get; set; } + public List Results { get; set; } + public double Duration { get; set; } + public string StatusPath { get; set; } // For async mode + public string Mode { get; set; } // EditMode, PlayMode, or All + public string FilterApplied { get; set; } // What filter was used, if any + + public TestExecutionResponse() + { + Results = new List(); + Summary = new TestSummary(); + } + } +} \ No newline at end of file diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/TestExecutionResponse.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/TestExecutionResponse.cs.meta new file mode 100644 index 00000000..29f2d39c --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/TestExecutionResponse.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 27c96238399817b4c8ffb66925bcbc6f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/TestResult.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/TestResult.cs new file mode 100644 index 00000000..33b3ab91 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/TestResult.cs @@ -0,0 +1,17 @@ +using System; + +namespace Unity.Pipeline +{ + /// + /// Individual test result information + /// + [Serializable] + public class TestResult + { + public string FullName { get; set; } + public string Status { get; set; } // Passed, Failed, Skipped, Inconclusive + public double Duration { get; set; } + public string Message { get; set; } + public string StackTrace { get; set; } + } +} \ No newline at end of file diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/TestResult.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/TestResult.cs.meta new file mode 100644 index 00000000..80f8419d --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/TestResult.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7ccc266e8f58db84dab523cd4dabc489 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/TestSummary.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/TestSummary.cs new file mode 100644 index 00000000..22fce421 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/TestSummary.cs @@ -0,0 +1,26 @@ +using System; + +namespace Unity.Pipeline +{ + /// + /// Summary statistics for test execution + /// + [Serializable] + public class TestSummary + { + public int Total { get; set; } + public int Passed { get; set; } + public int Failed { get; set; } + public int Skipped { get; set; } + public int Inconclusive { get; set; } + + public TestSummary() + { + Total = 0; + Passed = 0; + Failed = 0; + Skipped = 0; + Inconclusive = 0; + } + } +} \ No newline at end of file diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/TestSummary.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/TestSummary.cs.meta new file mode 100644 index 00000000..7bbaa286 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Models/TestSummary.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: df11040e7d969ff4fa8aaa417c44bd44 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/PlayerSupport.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/PlayerSupport.meta new file mode 100644 index 00000000..21bb235d --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/PlayerSupport.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 4a339d7263cb1ac4f879d79c8e7fe3ca +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/PlayerSupport/FrameStatsSampler.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/PlayerSupport/FrameStatsSampler.cs new file mode 100644 index 00000000..860c19d5 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/PlayerSupport/FrameStatsSampler.cs @@ -0,0 +1,208 @@ +using System; +using System.Collections.Generic; +using Unity.Profiling; +using UnityEngine; + +namespace Unity.Pipeline.Runtime.Telemetry +{ + /// + /// Samples per-frame timing on the main thread so the runtime telemetry command can report fps and + /// frame-time statistics over a rolling window. + /// + /// A Player build has no Editor profiler window to read from and no EditorApplication.update + /// to drive sampling, so owns one shared instance and feeds it + /// every frame from its Update. The sampler is deliberately allocation-free on the hot path: + /// each frame time is written into a fixed ring buffer and only reduced to a + /// on demand when a telemetry request arrives (far rarer than the frame rate). + /// + /// Sampling uses Time.unscaledDeltaTime so reported fps reflects real wall-clock frame pacing + /// independent of Time.timeScale — a paused or slow-motion game still reports its true fps. + /// + public sealed class FrameStatsSampler : IDisposable + { + /// + /// The process-wide sampler fed by the active . Null when no + /// manager is present (e.g. EditMode tests, or a scene without the component). Telemetry consumers + /// must treat a null sampler as "frame stats unavailable" rather than failing — memory and counter + /// data that do not depend on per-frame sampling can still be reported without it. + /// + public static FrameStatsSampler Shared { get; set; } + + private readonly float[] m_FrameTimesMs; + private int m_Head; + private int m_Count; + private float m_LastFrameTimeMs; + + // ProfilerRecorders pull counters straight from the profiler stream. They are started lazily on + // the first snapshot (creation must happen on the main thread) and disposed with the sampler. + // Recorders that do not resolve on this platform/Unity version report Valid == false and are + // simply skipped when building a snapshot. + private readonly List m_Counters = new List(); + private bool m_CountersStarted; + + private struct CounterRecorder + { + public string Name; + public ProfilerRecorder Recorder; + } + + /// Number of frames the rolling window can hold. + public int Capacity => m_FrameTimesMs.Length; + + /// Number of frames currently recorded (ramps up to ). + public int SampleCount => m_Count; + + public FrameStatsSampler(int windowFrames = 120) + { + if (windowFrames < 1) + windowFrames = 1; + m_FrameTimesMs = new float[windowFrames]; + } + + /// + /// Record one completed frame. Call once per frame from the main thread. + /// is the unscaled delta time of the frame just completed + /// (typically Time.unscaledDeltaTime). + /// + public void Sample(float deltaSeconds) + { + var ms = deltaSeconds * 1000f; + m_LastFrameTimeMs = ms; + m_FrameTimesMs[m_Head] = ms; + m_Head = (m_Head + 1) % m_FrameTimesMs.Length; + if (m_Count < m_FrameTimesMs.Length) + m_Count++; + + // FrameTimingManager only yields data for frames in which timings were captured, so the + // capture call has to happen on the per-frame path, not when a snapshot is requested. + FrameTimingManager.CaptureFrameTimings(); + } + + /// + /// Reduce the current window to an immutable snapshot. Must be called on the main thread (it reads + /// profiler recorders and the frame timing manager). + /// + public FrameStatsSnapshot GetSnapshot() + { + var snap = new FrameStatsSnapshot(); + + if (m_Count > 0) + { + float sum = 0f, min = float.MaxValue, max = 0f; + for (int i = 0; i < m_Count; i++) + { + var v = m_FrameTimesMs[i]; + sum += v; + if (v < min) min = v; + if (v > max) max = v; + } + + var avg = sum / m_Count; + snap.Available = true; + snap.SampleWindow = m_Count; + snap.AverageFrameTimeMs = avg; + snap.MinFrameTimeMs = min; + snap.MaxFrameTimeMs = max; + snap.LastFrameTimeMs = m_LastFrameTimeMs; + snap.Fps = avg > 0f ? 1000f / avg : 0f; + } + + ReadFrameTimingManager(snap); + ReadCounters(snap); + return snap; + } + + // CPU/GPU frame time from FrameTimingManager. Only populated when the platform reports timings + // (requires "Frame Timing Stats" in Player settings / -enable-frame-timing-stats); otherwise the + // snapshot's GpuTimingAvailable stays false rather than reporting misleading zeros. + private static void ReadFrameTimingManager(FrameStatsSnapshot snap) + { + var timings = new FrameTiming[1]; + var captured = FrameTimingManager.GetLatestTimings(1, timings); + if (captured > 0) + { + snap.GpuTimingAvailable = true; + snap.CpuFrameTimeMs = timings[0].cpuFrameTime; + snap.GpuFrameTimeMs = timings[0].gpuFrameTime; + } + } + + private void ReadCounters(FrameStatsSnapshot snap) + { + EnsureCountersStarted(); + var counters = new Dictionary(); + foreach (var c in m_Counters) + { + if (c.Recorder.Valid) + counters[c.Name] = c.Recorder.LastValue; + } + snap.Counters = counters; + } + + private void EnsureCountersStarted() + { + if (m_CountersStarted) + return; + m_CountersStarted = true; + + // Common render/memory counters. Stat names that do not exist on the running platform resolve + // to invalid recorders and are filtered out at snapshot time. + TryAddCounter("DrawCalls", ProfilerCategory.Render, "Draw Calls Count"); + TryAddCounter("SetPassCalls", ProfilerCategory.Render, "SetPass Calls Count"); + TryAddCounter("Triangles", ProfilerCategory.Render, "Triangles Count"); + TryAddCounter("Vertices", ProfilerCategory.Render, "Vertices Count"); + TryAddCounter("GcAllocInFrame", ProfilerCategory.Memory, "GC Allocated In Frame"); + } + + private void TryAddCounter(string reportedName, ProfilerCategory category, string statName) + { + m_Counters.Add(new CounterRecorder + { + Name = reportedName, + Recorder = ProfilerRecorder.StartNew(category, statName) + }); + } + + public void Dispose() + { + foreach (var c in m_Counters) + { + if (c.Recorder.Valid) + c.Recorder.Dispose(); + } + m_Counters.Clear(); + m_CountersStarted = false; + } + } + + /// + /// Immutable point-in-time reduction of 's rolling window plus the + /// counters/frame-timing read at snapshot time. Serialized as the frame-stats portion of the runtime + /// telemetry response. + /// + [Serializable] + public class FrameStatsSnapshot + { + /// True when at least one frame has been sampled (i.e. a manager is feeding the sampler). + public bool Available { get; set; } + + /// Number of frames included in the averages. + public int SampleWindow { get; set; } + + /// Frames per second derived from the average frame time over the window. + public float Fps { get; set; } + + public float AverageFrameTimeMs { get; set; } + public float MinFrameTimeMs { get; set; } + public float MaxFrameTimeMs { get; set; } + public float LastFrameTimeMs { get; set; } + + /// True when FrameTimingManager returned CPU/GPU timings for a recent frame. + public bool GpuTimingAvailable { get; set; } + public double CpuFrameTimeMs { get; set; } + public double GpuFrameTimeMs { get; set; } + + /// Valid profiler counters by reported name (e.g. DrawCalls, Triangles). + public Dictionary Counters { get; set; } + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/PlayerSupport/FrameStatsSampler.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/PlayerSupport/FrameStatsSampler.cs.meta new file mode 100644 index 00000000..4fd085d3 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/PlayerSupport/FrameStatsSampler.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0e2b7696d6f845cba4f7c776006707d1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/PlayerSupport/RuntimePipelineConfig.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/PlayerSupport/RuntimePipelineConfig.cs new file mode 100644 index 00000000..b36678d6 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/PlayerSupport/RuntimePipelineConfig.cs @@ -0,0 +1,68 @@ +using System; +using UnityEngine; + +namespace Unity.Pipeline.Config +{ + /// + /// Configuration for Pipeline server functionality in Unity Player builds. + /// Create this asset and place in Resources folder to enable runtime Pipeline support. + /// + [CreateAssetMenu(fileName = "RuntimePipelineConfig", menuName = "Pipeline/Runtime Configuration", order = 1)] + public class RuntimePipelineConfig : ScriptableObject + { + [Header("Server Configuration")] + [Tooltip("Enable Pipeline HTTP server in Player builds. SECURITY WARNING: Only enable in development/QA builds, never production without proper security measures.")] + public bool enableInBuilds = false; + + [Tooltip("HTTP port for Pipeline server. Use 0 for auto-assignment from range 7900-7999.")] + [Range(0, 65535)] + public int port = 0; + + [Header("Advanced")] + [Tooltip("Request timeout in milliseconds. Higher values allow longer-running commands.")] + [Range(1000, 60000)] + public int requestTimeoutMs = 30000; + + [Tooltip("Enable detailed logging of all remote requests for security auditing.")] + public bool enableAuditLogging = true; + + /// + /// Validate the configuration for correctness. + /// Called by build processor to ensure safe deployment. + /// + public ValidationResult Validate() + { + if (!enableInBuilds) + return ValidationResult.Success("Runtime Pipeline disabled"); + + // Port validation + if (port != 0 && (port < 7900 || port > 7999)) + { + return ValidationResult.Warning( + $"Port {port} is outside recommended runtime range 7900-7999. May conflict with Editor instances."); + } + + return ValidationResult.Success("Configuration is valid"); + } + } + + /// + /// Result from configuration validation. + /// + [Serializable] + public class ValidationResult + { + public bool IsValid { get; set; } + public string Level { get; set; } // "success", "warning", "error" + public string Message { get; set; } + + public static ValidationResult Success(string message = "Valid") => + new ValidationResult { IsValid = true, Level = "success", Message = message }; + + public static ValidationResult Warning(string message) => + new ValidationResult { IsValid = true, Level = "warning", Message = message }; + + public static ValidationResult Error(string message) => + new ValidationResult { IsValid = false, Level = "error", Message = message }; + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/PlayerSupport/RuntimePipelineConfig.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/PlayerSupport/RuntimePipelineConfig.cs.meta new file mode 100644 index 00000000..7f579c16 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/PlayerSupport/RuntimePipelineConfig.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0fd19cf31d54e3848a1075f001aed64f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/PlayerSupport/RuntimePipelineManager.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/PlayerSupport/RuntimePipelineManager.cs new file mode 100644 index 00000000..1e0e9771 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/PlayerSupport/RuntimePipelineManager.cs @@ -0,0 +1,368 @@ +using System; +using System.Collections.Generic; +using System.Reflection; +using Unity.Pipeline.Config; +using Unity.Pipeline.Commands; +using Unity.Pipeline.HotReload; +using Unity.Pipeline.Runtime.Telemetry; +using UnityEngine; + +namespace Unity.Pipeline +{ + /// + /// Unified Pipeline runtime manager that handles both server creation and event processing. + /// Replaces the need for separate RuntimePipelineConfig and RuntimePipelineProcessor. + /// + /// Simply add this component to a GameObject in your scene to enable Pipeline runtime support. + /// Only one instance should exist in your project. + /// + [AddComponentMenu("Pipeline/Runtime Pipeline Manager")] + [DisallowMultipleComponent] + public class RuntimePipelineManager : MonoBehaviour + { + [Header("Server Configuration")] + [Tooltip("Enable Pipeline HTTP server in Player builds. SECURITY WARNING: Only enable in development/QA builds, never production without proper security measures.")] + public bool enableInBuilds = false; + + [Tooltip("HTTP port for Pipeline server. Use 0 for auto-assignment from range 7900-7999.")] + [Range(0, 65535)] + public int port = 0; + + [Header("Advanced")] + [Tooltip("Request timeout in milliseconds. Higher values allow longer-running commands.")] + [Range(1000, 60000)] + public int requestTimeoutMs = 30000; + + [Tooltip("Enable detailed logging of all remote requests for security auditing.")] + public bool enableAuditLogging = true; + + [Header("Runtime")] + [Tooltip("Enable automatic server startup when the component starts (for runtime builds only).")] + public bool autoStart = true; + + [Tooltip("Maximum work items to process per frame to maintain performance.")] + [Range(1, 50)] + public int maxWorkItemsPerFrame = 10; + + // Absolute roots this build is allowed to hot reload source files from (Assets + loaded + // package locations). Baked at build time by the build processor (a running Player cannot + // resolve the project layout) and published to HotReloadFileScope when the server starts. + // Hidden from the inspector: it is build-injected, not user-edited. + [SerializeField, HideInInspector] private List m_AllowedReloadRoots = new List(); + + // Internal state + private RuntimePipelineServer m_Server; + private RuntimePipelineConfig m_RuntimeConfig; + + // True only for the instance that installed FrameStatsSampler.Shared, so a rejected duplicate's + // OnDestroy never tears down the real sampler. + private bool m_OwnsSampler; + + /// + /// Get the runtime server instance if it's running. + /// + public RuntimePipelineServer Server => m_Server; + + /// + /// Whether the server is currently running. + /// + public bool IsServerRunning => m_Server != null && m_Server.IsRunning; + + /// + /// Get the actual port the server is running on. + /// + public int ActualPort => m_Server?.Port ?? 0; + + public RuntimePipelineConfig Config => m_RuntimeConfig; + + /// + /// Absolute roots this build may hot reload source files from. Baked at build time. + /// + public IReadOnlyList AllowedReloadRoots => m_AllowedReloadRoots; + + /// + /// Set the allowed hot reload roots. Called by the build processor to bake the project's + /// Assets and package locations into the build. + /// + public void SetAllowedReloadRoots(IEnumerable roots) + { + m_AllowedReloadRoots = roots != null ? new List(roots) : new List(); + } + + void Awake() + { + // Ensure only one instance exists + var existing = PipelineUtils.FindObjectsByType(); + if (existing.Length > 1) + { + Debug.LogWarning($"Pipeline: Multiple RuntimePipelineManager instances found. Destroying duplicate on '{name}'."); + Destroy(this); + return; + } + + // Don't destroy on load for persistent operation across scenes + DontDestroyOnLoad(gameObject); + + // Set up command discovery (the server owns its own dispatcher, initialized on Start). + CommandRegistry.SetDiscovery(null); // Triggers reflection-based discovery + + // Auto-discover and register hot-reloadable methods. Hot reload requires this manager to + // be present (it owns the communication workflow), so discovery lives here rather than in + // each gameplay script's Awake. + RegisterDiscoveredHotReloadMethods(); + + // Own the process-wide frame-stats sampler. A Player has no profiler window or + // EditorApplication.update to drive sampling, so the manager feeds it from Update (below) and + // the runtime_status telemetry command reads FrameStatsSampler.Shared. Created here (rather than + // on server start) so fps history is already warm by the time an agent connects. + FrameStatsSampler.Shared = new FrameStatsSampler(); + m_OwnsSampler = true; + } + + void Start() + { + if (autoStart && enableInBuilds) + { + StartServer(); + } + } + + /// + /// Scan loaded user assemblies for methods tagged [HotReload] (in-place workflow) and + /// [HotReloadWithOverrides] (helper workflow) and register them as reload targets. This replaces any + /// per-script RegisterReloadableType call in Awake. + /// + private static void RegisterDiscoveredHotReloadMethods() + { + const BindingFlags flags = BindingFlags.Public | BindingFlags.NonPublic + | BindingFlags.Instance | BindingFlags.Static | BindingFlags.DeclaredOnly; + + int registered = 0; + + foreach (var assembly in PipelineUtils.GetLoadedAssemblies()) + { + if (!ShouldScanForHotReload(assembly)) + continue; + + Type[] types; + try + { + types = assembly.GetTypes(); + } + catch (ReflectionTypeLoadException ex) + { + types = ex.Types; // best effort: keep the types that did load + } + + foreach (var type in types) + { + if (type == null) + continue; + + foreach (var method in type.GetMethods(flags)) + { + var inPlace = method.GetCustomAttribute(); + if (inPlace != null) + { + // The weaver keys dispatch on TypeName.MethodName, so register with the + // default id (no custom Id) to match. + HotReloadRegistry.RegisterReloadableMethod( + method, new HotReloadWithOverridesAttribute { RequireMainThread = inPlace.RequireMainThread }); + registered++; + continue; + } + + var reloadable = method.GetCustomAttribute(); + if (reloadable != null) + { + HotReloadRegistry.RegisterReloadableMethod(method, reloadable); + registered++; + } + } + } + } + + if (registered > 0) + Debug.Log($"Pipeline: Auto-discovered and registered {registered} hot-reloadable method(s)."); + } + + /// + /// Skip engine/framework assemblies that cannot contain user hot-reload methods. + /// + private static bool ShouldScanForHotReload(Assembly assembly) + { + if (assembly.IsDynamic) + return false; + + var name = assembly.GetName().Name; + if (string.IsNullOrEmpty(name)) + return false; + + foreach (var prefix in s_HotReloadSkipPrefixes) + { + if (name.StartsWith(prefix, StringComparison.Ordinal)) + return false; + } + + return true; + } + + private static readonly string[] s_HotReloadSkipPrefixes = + { + "System", "mscorlib", "netstandard", "Microsoft", "Mono.", "nunit", + "UnityEngine", "UnityEditor", "Unity.Collections", "Unity.Burst", + "Unity.Mathematics", "Newtonsoft", "log4net", "ICSharpCode", + }; + + void Update() + { + // Feed the frame-stats sampler once per frame on the main thread. Uses unscaled delta so + // reported fps reflects real frame pacing regardless of Time.timeScale. + FrameStatsSampler.Shared?.Sample(Time.unscaledDeltaTime); + + // Pump this server's own dispatcher for main-thread operations (player builds have no + // EditorApplication.update to auto-pump it). + m_Server?.Dispatcher.ProcessWorkQueue(maxWorkItemsPerFrame); + + // Drive the watchdog (player builds have no EditorApplication.update). No-op unless the + // server's watchdog is enabled and armed. + m_Server?.WatchdogTick(); + } + + void OnApplicationQuit() + { + StopServer(); + } + + void OnDestroy() + { + // Dispose the sampler's profiler recorders and drop the shared reference, but only if this + // manager is the one that installed it (a rejected duplicate must not tear down the real one). + if (m_OwnsSampler) + { + FrameStatsSampler.Shared?.Dispose(); + FrameStatsSampler.Shared = null; + m_OwnsSampler = false; + } + } + + /// + /// Manually start the Pipeline server. + /// + public void StartServer() + { + if (m_Server != null && m_Server.IsRunning) + { + Debug.LogWarning("Pipeline: Server already started or initialization attempted."); + return; + } + + try + { + System.Console.WriteLine("Pipeline: Starting runtime server from RuntimePipelineManager..."); + + if (!enableInBuilds) + { + Debug.LogWarning("Pipeline: Runtime server disabled in configuration (enableInBuilds = false)"); + return; + } + + // Create runtime config from component settings + m_RuntimeConfig = CreateRuntimeConfig(); + + // Validate configuration + var validation = m_RuntimeConfig.Validate(); + if (!validation.IsValid) + { + Debug.LogError($"Pipeline: Invalid runtime configuration: {validation.Message}"); + return; + } + + if (validation.Level == "warning") + { + Debug.LogWarning($"Pipeline: Runtime configuration warning: {validation.Message}"); + } + + // Create runtime server + m_Server = new RuntimePipelineServer(m_RuntimeConfig); + + // Start server on configured port + var serverPort = port == 0 ? 0 : port; + m_Server.Start(serverPort); + + if (m_Server.IsRunning) + { + // The hot-reload registry marshals main-thread overrides through a dispatcher + // when hot-reloaded code is invoked from a background thread at runtime. Inject + // this server's dispatcher here (a player has exactly one manager), so editor and + // per-test servers never clobber the global registry's dispatcher. + Unity.Pipeline.HotReload.HotReloadRegistry.Dispatcher = m_Server.Dispatcher; + + // Publish the build-baked allowed roots so reload commands can validate that + // incoming files are inside the project before compiling and injecting them. + Unity.Pipeline.HotReload.HotReloadRegistry.AllowedReloadRoots = m_AllowedReloadRoots; + + System.Console.WriteLine($"Pipeline: Runtime server started successfully on port {m_Server.Port}"); + } + else + { + Debug.LogError("Pipeline: Failed to start runtime server"); + } + } + catch (Exception ex) + { + Debug.LogError($"Pipeline: Runtime initialization failed: {ex.Message}"); + Debug.LogError($"Pipeline: Stack trace: {ex.StackTrace}"); + } + } + + /// + /// Manually stop the Pipeline server. + /// + public void StopServer() + { + try + { + if (m_Server != null && m_Server.IsRunning) + { + System.Console.WriteLine("Pipeline: Stopping runtime server..."); + // Drop the registry's reference to this server's (about to be shut down) dispatcher. + if (Unity.Pipeline.HotReload.HotReloadRegistry.Dispatcher == m_Server.Dispatcher) + Unity.Pipeline.HotReload.HotReloadRegistry.Dispatcher = null; + m_Server.Stop(); // Stop() shuts down the server's own dispatcher. + } + } + catch (Exception ex) + { + Debug.LogError($"Pipeline: Runtime shutdown error: {ex.Message}"); + } + } + + /// + /// Create a RuntimePipelineConfig from the component settings. + /// + private RuntimePipelineConfig CreateRuntimeConfig() + { + var config = ScriptableObject.CreateInstance(); + + // Copy settings from component to config + config.enableInBuilds = this.enableInBuilds; + config.port = this.port; + config.requestTimeoutMs = this.requestTimeoutMs; + config.enableAuditLogging = this.enableAuditLogging; + + return config; + } + + /// + /// Validate the current configuration. + /// + public ValidationResult ValidateConfiguration() + { + if (m_RuntimeConfig == null) + m_RuntimeConfig = CreateRuntimeConfig(); + + return m_RuntimeConfig.Validate(); + } + } +} \ No newline at end of file diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/PlayerSupport/RuntimePipelineManager.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/PlayerSupport/RuntimePipelineManager.cs.meta new file mode 100644 index 00000000..8d1e3112 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/PlayerSupport/RuntimePipelineManager.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: dd4ab1c9091e0194196b5f5d51cb932f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/PlayerSupport/RuntimePipelineServer.cs b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/PlayerSupport/RuntimePipelineServer.cs new file mode 100644 index 00000000..7f627e7f --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/PlayerSupport/RuntimePipelineServer.cs @@ -0,0 +1,74 @@ +using System; +using Unity.Pipeline.Config; +using Unity.Pipeline.Models; +using UnityEngine; + +namespace Unity.Pipeline +{ + public class RuntimePipelineServer : BasePipelineServer + { + private RuntimePipelineConfig m_Config; + private RuntimeInstanceDescriptor m_InstanceDescriptor; + + public override DateTime StartedAt => m_InstanceDescriptor == null ? new DateTime() : m_InstanceDescriptor.StartedAt; + + public RuntimePipelineServer(RuntimePipelineConfig config) + { + m_Config = config; + } + + protected override (int basePort, int maxPort) GetPortRange() + { + return (7900, 7949); // Runtime production (test runtime servers use 7950-7999) + } + + protected override void CreateInstanceDescriptor() + { + // Create and write instance descriptor for CLI discovery + m_InstanceDescriptor = RuntimeInstanceDescriptor.CreateCurrent(Port, m_Config); + RuntimeInstanceDescriptor.WriteToWorkingDirectory(m_InstanceDescriptor); + } + + protected override void DeleteInstanceDescriptor() + { + // Clean up instance descriptor file + if (m_InstanceDescriptor != null) + { + RuntimeInstanceDescriptor.RemoveFromWorkingDirectory(); + } + m_InstanceDescriptor = null; + } + + protected override void UpdateHeartBeat() + { + // Update heartbeat in instance descriptor + if (m_InstanceDescriptor != null) + { + m_InstanceDescriptor.LastHeartbeat = DateTime.UtcNow; + try + { + RuntimeInstanceDescriptor.WriteToWorkingDirectory(m_InstanceDescriptor); + } + catch (Exception ex) + { + Debug.LogWarning($"Failed to update instance descriptor: {ex.Message}"); + } + } + } + + protected override object GetServerStatus() + { + UpdateHeartBeat(); + return new + { + status = m_InstanceDescriptor == null ? "error" : "ready", + lastHeartbeat = m_InstanceDescriptor?.LastHeartbeat + }; + } + + protected override string GetToken() + { + return m_InstanceDescriptor.EvalToken; + } + } +} diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/PlayerSupport/RuntimePipelineServer.cs.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/PlayerSupport/RuntimePipelineServer.cs.meta new file mode 100644 index 00000000..5afc6dc1 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/PlayerSupport/RuntimePipelineServer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4599450d651dea74cb4b90289360aa3e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Plugins.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Plugins.meta new file mode 100644 index 00000000..40fe832b --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Plugins.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a25774b4dfb214b4f8c39d802c589d7d +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Plugins/CodeAnalysis.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Plugins/CodeAnalysis.meta new file mode 100644 index 00000000..95f2154d --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Plugins/CodeAnalysis.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 014d6925adce7c84bb3742e7557d8581 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Plugins/CodeAnalysis/CHECKSUMS b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Plugins/CodeAnalysis/CHECKSUMS new file mode 100644 index 00000000..007eb480 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Plugins/CodeAnalysis/CHECKSUMS @@ -0,0 +1,13 @@ +# SHA-256 integrity manifest for the bundled Roslyn (Microsoft.CodeAnalysis) DLLs. +# Verified at build time by PipelineRuntimeBuildProcessor.VerifyBundledChecksums(); +# a mismatch (tampered/swapped DLL) fails the build. +# +# Format per line: # +# Regenerate hashes with: sha256sum *.dll (run in this folder) +# Version fields marked TODO should be set to the exact NuGet package version the DLL came from. + +159f595e313f8cc09bac14588e2466c312f512a4778d9fa2352fcccf2a53aa3d Microsoft.CodeAnalysis.dll # Microsoft.CodeAnalysis.Common TODO +e822156145e1add437b1d893c0315257c12e3d5b1b89d83494db6d88d37fe20a Microsoft.CodeAnalysis.CSharp.dll # Microsoft.CodeAnalysis.CSharp TODO +5b1b1c83ba3d135c2fdfe425842fbe9c7432878b7e468623acb554c69b4c130f System.Collections.Immutable.dll # System.Collections.Immutable TODO +55ef768ffa305de58e38e15420669258b16f420618eb1f702bddb30e5c797961 System.Reflection.Metadata.dll # System.Reflection.Metadata TODO +bac58578ec05ecb8c234bf3402a0aa1491a5e437b03008b431e78d663ab52b78 System.Runtime.CompilerServices.Unsafe.dll # System.Runtime.CompilerServices.Unsafe TODO diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Plugins/CodeAnalysis/CHECKSUMS.meta b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Plugins/CodeAnalysis/CHECKSUMS.meta new file mode 100644 index 00000000..9ac33302 --- /dev/null +++ b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Plugins/CodeAnalysis/CHECKSUMS.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: b61d5dbe422f84644aa94e10778b9e94 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Plugins/CodeAnalysis/Microsoft.CodeAnalysis.CSharp.dll b/Client/PackageLocal/com.unity.pipeline@0.4.0-exp.1/Runtime/Plugins/CodeAnalysis/Microsoft.CodeAnalysis.CSharp.dll new file mode 100644 index 0000000000000000000000000000000000000000..f98e395da58f063baff4a1db7fb849e5af40f753 GIT binary patch literal 6098320 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 SCBB_HDj z$I8vTVEG%T>P6Plt$D#Js7}@oC$ic(uHbU7#obytjBV->*xItSg&{Zatxd5{X0lcm zXZ;tEDy;QRft+pP#uDw3O7O$34^jt|?G)9Gzj&rL`_eL_-jWK6+SR#Y#_b|`OWLlI z8yBxknf$k?f-mtnI*C7c+Wo?AJ<=s&^A`w(t(l8`vK^F;ArzkDWnS{f*`A z^W+Ut4eoj%s-b%&UZVjMWaJA1cw15@lGnyD6u5CLpOHsG@JSQFUkt$~3%pL)#|axb zw?yAd-mqe?al=W8adTI3H;z>$IFLgKjweWP0-t!N^L^QQ#8IGULAio9IVewXE7Xa6 z9C8@+8gKYvCEDq2kV$i%Kzg12G`h$l=f_y`V&_vAr)n%%%)__B846A!vM{z9f~EEj zr%GT+`PVAnso>oh>fa}WTsqu81)~*Nxl=K@+c$*89YVawU!gGwF49Ro8Nrk-V--0G_qaliA=>oW<4s9E246 z{(JN?T%B&0x{b0{wQ#iMr&O#k2`ihVr zH^2ogzmo`;b$P=|(Y?MP+Qi*tZYiQ<9g$rwY57+Wsv|`#AX1<1>4vmV4yiVD^#n@T zu4kbv0=fJvaaK-9SNAVu%9oRd&%~dq?p(+Woxm(k&GO(P?N~N= zHk=#j$#&E)zEd59i@YjrJh)0(Mk~I_=d}7mQ2_3PT#XlFC>L8ued}-T;I*)DisjvQ z;c|F9-q>3QRHN5`X7~6T4-?q6QA_M3@c%&@^=1b@Z-Mq85Cl#UJ({~DWG2fS!C42% zD0_@HTIZPrx);2QRNJ47f- z@%Zo8BDsyKUaM7<)iK$<3v8||`R7M<>7g%8m09vHv>MWz+gDQdbI7YV`U%E{oe+QA z2Fb-55AOzh;YRrcYgLp~@E#y^+#4`htmN|F%LmOVH)6C_7IUQ#3%c)uC-+iEK`(>u z@njn}kn6@x_ywEzgxXx5ZoVXy4&IMXbdIoBY}tj;ou*vuV)8ktd^YtL)-jFB($ya{ zZPLB{HwRZhvLdjkQCf@7u1uT5E5FRtuCH*7%DrZtOpJGw*7P-}b+2u!%u8oC6^kK4 z#!nE+ko?b3SFPF7+O}+QyJvOvlChtN?S|PH%g^{|mH4)QuBsOu#n%3lTgh+W%fy26 zTh|Q4mxjnuwK}-9 zP+`2Fd^dXw`g27P-vi2UQih}$qd4GfgRl5tR@(~g` zF<7vPq3`N1MA{G`9X>Tumg^vPZS;L~`{MTVi4J*KqKiC={!REyh&Zn>dTvn%oW<=I zjfIIkivG_y*R|RhZ_uVnwO*31)VVuqy+pdwCiRkDB7H`k!}&~#i~A&b*EJr>1`R6X zHLKr^X>~<)1RE$uckW1EwzFMZ9dx!kPg{-zV5-2bftN7lu5{V+yF+RUYaL$|%U(k? z%uyhGIYEE2cv{j;@#y%@3f6b-wcd=8UOqys)0c?Y*)gWVL5??bOSq}YPz?SNVqSCli>9g_0jPGO_9^aAp*fjqdi&vIy4 zXd~T^5t8L#3FGABveK)w?OwvalJKco3zq;d$3`-GwHntI&ea0`CzR;dc)*K9yVo5u zo_c1iXxXNGc(D`7#|ZiGf>rymw0?|fa@m``p*rJi7&aQ3SgUJNLGRJ7Z=*CgS4Ebh z=-*93!5)Cs4L^yamE8`)#{yeSpDq)Vb~^}ADN{dn^V{C6m!o6pF|XW3ipy7I%9~`C zGPWV;KQZH2HZxb8HGr10SjIRy{p&O3J3(7pT5-|9Gy{J=45fUpow;H|rYuPR(7;bA zSEl@sz}+h@2&b=k;q*0g;8DE2A)_LH2NkJ8e41P`eR6-=3l=cLG{O3&fUTGUwrUF4 zuE3a%n`1=%?;fe(j-zP99i18c1BVekpCK2teGhHJ;#YG>sy4S=?FQgM5Pr_@ zVC+0@cCa_JgNpX@k*tm@4znGBe=m7J)mD}##qHtb`)~();2E5KARikX(R;(`rO&!( z1|~!!X&gnvCNHOGc&gN&G8(u-+6-r-Xw*G5VFnfIZB>q3YFl2#(UiDLaW|n#8OiNJ z{V|0?&tP!RRH%ChRZF{}e%4S^!S}aDjeA2osUX|XO{C|x{Qfc&>HTVy^x)69H-S>> ztIIqoW0jzM#GNAZCim|^8~68yb|gao(F_r$x0P}BT zDq;Wsb>YtS8du|l$>XP>C7mN@vPkjR;ndDX`dmBngs@rp!ss3(Ox(Yio9U(2%0i~? z&>NixO3l0*^7b#|ljA|QRw&#M$yk6(zv*~+0cl*Uer>+&LLGx}87jSm4xlMXABnL_ zpMO4FB{oB$zkeS*ht|p*`q};1Eb+E%_-1XI{n{|-cs?N3#DAuP5u9Q!E4a%2UdrM# zyei0+#f|#9g#2`()40@HVjnL&TSb*lM{?kE_EvEf)q>K3x&5xLOM z;1+#xcm~q7j1dYgJf6p9I2Sywpy*#gciR{E**!`~n zg(6sa897E*nY4k7FHTubD>wLFuoi9^odknvY8|5>~e31(>)Lbg~I?&)7 z`h1g5M;rIL+x&0I%EN{zE)(z8q6PeIz_k~Uwrkr`{1tpsCvBHrc`;eZDl2KDhZ^sT z!cvV zj%>g#m$w~8tp(V376Y>Ae;;gXq-X$sQ%H0~Gw*ih=%=G{ehSN$)a5GY4+yz%qkQ}p z^;7L3o+nRlqo4X)7}9KS6^W)=aV1*@#N>ob6BezFDgNSVsmMwuT`VQ?*j1Ejzmg0U(lY2hy z0>Yq?e|wl#(@p|jT9ANJCck2tuG)j{nF@Z0)zML&$uwT7Il{k*?Aw%Jl_`GGzry*_ z7|t}4H@$2u9?|itty~2uQLC!pDLQzs&H=pd^_nee_GCM{(zA@8&HVWsPQ3>fkA0UO@lMi~mJ&rKYDzWQTG<(Vi|mU{U`U?1&^3ZAGTU4oSZp;g!_2eUh zq0dRXtLNfK;Fi|-bxw%32*DB$}$oCxD_hsZ0Biw(tT7LjvE55=AN2ZWy zlHdz?`UN$~T<7Tfv&U;B+=PG@RkZPuA1c1&(WlX#ysGc)qMnc0!&%uJ5_2vboD zU#8$P6;7tY$y7L!9u|K0u|;l7gpOIwj=APo;m~?#OmLMaxOOquZVuD9`4a#e8HxrV z6=lgslbuT2xQd>I>A$E>o$KWGWpKA1VVId1{3jjBJvll0MLHc);s0dox2Uu4ti)h) z(X0ElyoO)lHT+7i;Wy{i{NP?Cf}bn%8L>`1G926p%=U#Z zQB0#We<4f4oqwSWOfDub(_vsczauFD8{|{j_^mVR^25{B0cbrbF%aSDR7dO$M4Aq` zxo%nxbXR;U4F{F^<4=}@|0@z3^0i{0O~^`8>!Eg|F9Wxy%fWVqP6hu3%sosl-j!#% z4X(1e?gc8_8~!oh?IG0V;)Uc2S~~?&p@)BhCAEE~`7%&Uw(oJt9&3^|nuP8ogis}M4p=0rP=VS_YB zT%0y-mF8mepQn#Rv;C;mF&o5w-Nck^l9@)$%75rAY22bVQ9rGIN zAHP!o9u*ufgjWoH53r?#rY%^3vZwo-{O#H3)Y2Ej(%VGo|3Q(j@P9{2dMie*&GAnE zy^wmDEk`FxvTGGhg+g5af4~IxM~uc#R3HzHD8Y{*)8o2-Xx_n}@O9xP zVqWN+@%}I(hZBz?I!5O|)cWW%EIOk*La_P2QW6I+Kqtd^U!9|lnlv$%*wKDRe+KhQLH2oVXJFM){p8}UqQL*t75p0yR zcZ;+C%mwlPSM@b(^yhN+H-0NLv(r|Im>BfEDDDoXEFUj^G&eJ&A`?2zFk z?dia+kc7i6IERDkRx4>kwXqed^>{H-#}=G$oS0V&BQ3$8_~i z9f^$j=-mn3Ke&!EB>W0mY%-dIHMVQwbexty1YhwmP$h~Z-w zKWu*Nf}TH3_bIu3RNdK~O}@pm3(5$6-$@|W<(E{Q$3)Pi|2K6b7D|J=d6kUXU+0$8 z-zi7q74^fv^V#U>%65s&E-c@~=<;8|+p#|umN!iXpyz!e#s?+??wSlh{$XMexFZt* z>=GveIQ*RmV2?Wyzz%F8;B%7!_e};oI2n**NtjUD8zy7iJQ?uhWWcqP<9Od>j1Nr) ztePC8J{iDu>4_QRy7WXqV{#B~LQlltTHr(g(qIz-h-OU$AZs-dfbi5rz#WqTI%Jzr zg%3;yJUSWhmC1mwP6j+X8L)XWV5=J2ZE}6=IvKF@WWeglfL$g7cA5;>aWY`dWWe5& z0eejb>@yi~{$#)f69IOPvN6se?OSTY9->6EVSi%_qu1|d;PyS}^=?@f@7>bpbuII{ z5Daabsm*dXw&`Z$pwgdVwjxrMC;KVv(@}-MyzazbQHMipO+GtJ^0`9jV?c}GsR3}t zAM@)&0eBP2;BuBi+XcNI^Qi6NBtx1)_t>bWu>ck2 zIV7S2boFu!#7n}@6RxRLdrT_T%cBW`)oM@e3}3{G5}<51_mm21&PflIZxp(PiRg>p z<=njLYMQ4I!g{90%lE_cU;R;zioNpb9@Z~UlU3&_tG`1iuY3#NC5L&v2P~Q6_0F!} zOk7^??)4kZJfMCx=D>C4IL%4Vz7q6qy!Xo!hmsfg{a*zoI7}w_?`! zFwh-X*Oqo)ZVt(R;HWCZwg!1tA$q*>R~3S%z=%|!dQvDUbHAcM-MjxOE6*Zj!SPER z1HUlH{XmwS<&{4ubCFk`g;{^hym(+KR)4^(@~z*aP@gjQt->bVj|l$0F;M+_pSQWd>I znrn~~X|a02tZKY^LSAum53rW5me7`0{;=Bha;n5DUxHP67!>voGXf3C`Zcr4xBf8J zfk(`ZoIdA0ZG=1z_eJ4vxXB*DMu6#eLDSDG-=z4?0_5^gKLzW+iRS(sUdqTvgz`oM zeO%T(#(e9`g}uVu+fo=+J=gnV_1-a1y(p9pb5}sAduCP9>#v})W#BJ-yz*Y^;+w7f z9MZ*>)V(q!ayA0{SlP)jNQL*|BW1u=4Lf+>y z_k0pu%fpGW*c{wF;je@#HGne^+!t)Jli{01s~yz;>i&Z`l!$NFaq zz53hMuJ>YHa=2Gk;Zy_2y~pZ*p{2a?V^|qA%*Z(8Uw;AX!1Lx-d)1#X>#bP9d(<3? zuYRxaK4ZKu^fZdq2b~-})88euue#A#8P5!OtE8)lU)1iRS)|ybd#~ zic#NBUi+APxQAl>)Qa^WDqdFKWY+tsueEz>CHWj3ulaZ1BzLplzp{UZunI4;8Mir3 z8jNhz?*fJ80xSLLW*h^X3=)uC74|I5`rF1p^+BPWXYLE+b-GzqxcXXo9cAwO6q*LR z1Cw|q3+0tREhNs#vC6-`o$#yX-iPMbw74rKt<^OKtmlN3Hurvb*8j#V;JQnl)0x=7 zug(3dGBx^=)#&FH6|2DUGReZ573#}|b+oLXGwV96WbEUL0xk1I`9a}R;LC+{)flLL zxlrD2?mOjmfmxMG{VaK%VeUJ~fKodLv(AlLBD`4Ez07($R*JQg@aqP71c*}mjF1+M zf$BX%={EPH@@g^bFJ1U8jE{j=Y>*r=p90S_>)!K-ilufnX8lt{c;$DKsU^F5W$oPR67TTJqWtL~pD@QYmT9KYn5YT;F6JjmY1uF1H}G~oUir(4 z=y^}Mv+ImQXmD_q?D}R92ShB5G-U!N)>0a-N{cD_~f2Yb$UiqDX``_Tu z`m3-?%8Qv{mXP2X9zL_2yT82x1P*VkKLakNk|`k%FfAsTPZk(>zt8Km`w*TE%~g0( z_Fyc*W!i~WX#(?#23+Wr?epWF& zWY$*{L-+2Vl;_6{V&wmzSALh;o|MB4!qw(!dx1;LD*yU<3O8hK+W?TVZ48bzkoE#( zkLw1p0Y}G&TYz26+qMA9<+;?{BIcE%Z2{&ONLv76m@(#GPYT~Nx9EG7HKhFi%g9?J z`d`30@VvQ=@_)*#YNz^F<@IHAi_8r-0V1@+O~4I`^~jL&ztIql^1sTg<3#^{xDN<_ z&Gu%P;LX2*eJm2A{C6~~b|3Za&1%H{BCG=o%q?`%*P>+xK)SH10f1d%3^8fglfBiqO4t&tuxA9$aqT3AAQ9MoT z<3#^*+&l1#%x3#!nB1=h8(3-)-_6%i{-VvJ-`}t||C-^BhBtB^y^yhim-%>Q(Pyif ztgwCux_I?!29YDqwFwYWuNnv`e@DR^<$srjHlqJSip^2-A?1Iyc^c(^iCK-71I1~HHXN2=Bsr$297p}NO~32sQkUh zK=su^S!M2!y62hoFr|7~o^#A?Bt6Y#q<+RgA$9+X(X{ff{~qgr=y*rcD?Ov~e>euJ zKQ5GSn%hYEFPPOx`A^FWStUY?_+8D@JXl47FL_Hy(363X)W6K|jJm(jtRnd9fucCm z+(z9WYgVJ~4>hY1^!o^Fjk!Og*opOG%=-2Qx*aQZ$2lUY%fCKT_(gL+id)5cMDS^2 zp!%Qb<^%s@ef^g%{EOx=D*i|E{JyzGw1tGeXmt_#A$9**^AD-}+s$Fr{0FcOXr^|Q zX-MebKwwARAI_*cBK*ld)ldFY!T%jta~x565iByB<7>v5%Kq=*Hpf3zTvNdme{;By zu-_l>z`lIE@;G%bO6gzyL}^FAsc<8|W;4QThE29dI3YnV8h+p|J|UscOcql2?>3-O z_uad{-5l?ludcdcLuJDxYX0?p^BG6Y>s~-e!|zKl z{dr|A`%5~#-faI$uXkHf=7KoN{O9r`lAj3zWiGd)%>N)8(SDb;!bQ8(E1$}!c8*nE z`4AjyOUo@u)JSwdk|WcT)Pcss-UgXP|EUY0(|gM&Fkr?MHk+6K7(TbyQ7`XLt#C)2 zU49%UJ+jopDRJ*-dmCh;8-u7#@rq8HJN=m)jUewSKfPuXCY%;(VgwCr;hk#tPS(4i z_x%LXa(5~jbaDsU)G?;~ZX!+TkyQ?GONb?=u(jqBiA*2-%5{MSnH(uOi`BnE6rna8}cW=+J4@! zP)orvC(>i7TcOfeUu8_wSdU?hbzsAEeHZb5^-07A6$?^KVc(Risc+7}N%93jU-mZ0 z^uJD#t39DZABptfEGS>dq!Q_b_xwdfbJZ>+%j;v&Y~h7^adZI_~FB6)PJBNGnFY;q| zK=}GA%z|EdlcJir`)_d!{Kg<3RU+(IKP)6inA|F)((aE4>Fb8{1wneVyF0?9lZj{T zo)Rx#I_W3fAo{KPfAmw|VQcySEIw|NSbR}FBUAZpwm0X$86MdcPxRBW7}*t0_Q;Iv zi-0x%al%gal-q`U(k0>-)uBJMGQty5@(^Vr@I>4F}yeGWr?SD6O_l4 zbEA(U6}u&M3lg-A9P6mxqIDNJx>lLF67P-8jr;%5JU1UXsejsp7xz(5X&zo^P7BR= zXeMON8bqJ<*?m{!6N5*!#LiC4+%he>j*Df#LzaLGU)OT)EAIbyi_(kxX@%$?7Z^Yj zT5??E&IHdw$+Er`ai2rzoRjxL<9%=;7wfzGxt=UbZ|gE1H-d+lL(yBCigc`WqjxN6 ziyc5cqi=|Ny`m9#f+&x7JeV#d#TXA}U`^PIM~R_1)R8IvPuNpP33~u3Vb2-)Y}RxQ z;d*J=oK-#~Ma9o5|DCxG<8=0#7|%k`VSJPc7DI#{#?#Kw=^n1<|@j)3|;^o^xOhl_dGAK}a3v1a$d0voi$Ic>>Z-R1%%b@;$ z(}@=KJrOV8(HtICq#Z6$Q|8Ipg8s}I*E`^OE;6z32(CRj6|gPVlbrt-oN>EDyTciy4)``_JmQQ4T}vG#L%KDV z(eF5g=bF%-(rJJ+Wy;^}RA{SsnTM8R=?M?%rGm$HVEqhB3_X#K4G{jlRy}kq zyR*tIWg6^~r*kv(CJxmW`(~{&9#& z_r)U{8JI&jpW`39%Q_c_k>qB%!YhsRDv1qczFWE;Mu-J+eV#yxk@>M?DTiEi(Zoj-Pv0hQSh3dTAXzU!7=2Lzg9QNmZG?7xVkf&4{6M7n#iO!5+sJwjgIXY}`;(|Kt;QBCKQ)p%(JkB(Qj&nN5==iqocHZOQP z2Rwg!>H(f@F15DBOQr4c#u1-5J%3vz(`VKS-;t_WYqIv6^+yCBQTo)(b}|wpOPsO2 zjO55t83;HpGc!5z2AQMj44rW~){zwkPmSzgW_n}*lY2$3j@rUH3RVg__)m!zy0RN& zux+sctY(DbUr4;PU}l9c?Px?FCElD#96>u`z2%yxS9tSP7cG(#V8DK73|m) z>Lo(41@u<~v-A!m>`k;^C(0Z5@rG3?)s+ko)!wqa%Ug{neRsl5xScUHj8&=2W`X&$eQP%*OGBt_1EKQJ^X}NW+p&iXmv5e*RaLU#kE0eL*b}>z@lfJ?A0U+TE$XdqdynXp=DL z0SYs$jvKtmtm?SIfqW>K?xku!++lnJ_1yLMph7@wpOiiB+&B6hqs8()2fShGPjBar zVM?icC4(I6`6p5hVIPRwdb+#z=i`{f$yH&!@U1JeD4EEW`jhd_gNl7TRvm)fGv5cf zeY#J2Hm?jT$7qfS4#JeIEYHJWBOB&{USV9CXI)(#imR#GXitalrXQ6#9{bp|Sd0^T z@@HMF^eSB}UTe{tVSi?7%1Y($scjJP-=RWOgzsXm)R`0Z?_qDv^q#tWai;e;Cp^d` zt!lNO?E6q0F#4AbWN~H6@4?N6_(_4wx65HFpa!wMz)!R4b^HdN<>SSNZr~fdnW7Cm z;{Xu%UhozHz62mXbUp4Id?huF|8ktW+W!GO6?~;7maZt3R_y~A&iC;65E)1Jg-2ulO1`P!WsKnL z6C#x5@u9mx89kiXOk>_!EL&1X@NFC^*hcwy!7P}b8l%PFD7jrrbVs9kdNi6D?HbL@ z6uZ&i-Dr#ZM+@ZI@)U}xzqo%4z$#akZ7hbXi**%SQYt&e{bMI!n4iOQ7_;NSi4>;F z8>}*epPwH~&FN2tG5YJ2DC9@;n3rNK=k8m>)7ymdkDzb+oO0#HAZxdREXUj7Sbtni z{#{?!dZ503oN_vy8A@v;Zny9aoA*{rW^lZ6MjYzf;-56d6`X*dM9p0&iwLf)iz#Ix zSuZq!g!OqE;cvEiPE!v&%o8zqApAh-*sSb~ZljX`s0R(7j3s>ax}7^lg~WzafVjL? z3YlzwHkCmY!l?kIyu)s(rI&sI4YQ{KVxF}XJk0mWuafSemhSG8(~Y~gvWsCAz0R~B z2-BuJiD#<5^Fhj53}=j%w3QZpxCfg)(aO$g@^9tkuDO*rOgGQ)h$m>6(sk%qQa`6=$1WPm6Tcf5ZXgj-jIJ?CrxXgL~sVs9D2x52{?Qv_GIwZ|Btvgfs?DO z^8PFLR@JSlUeeWFsm|V=KzA-(Rh^|t=p^i`ASgjVaA8qF2h-kBCg}UAR;25jxg@H#sBwr&b?LDNkDx6@8|R8ldk*R=RWIs&U2pgoO7P@ z@XJ_*T|hRggL125v<~+gPb2}%k&!wl>vM_n9FSGP_Nb6M9CGs-qjk0jTt@1OnR>A- zU(O4C7F~mU{loNZY3$PJfztTXY2);c*_ZN&cD@N-SDc8gKILT1Sgu%(uOR0IhBmX$ zuvGs+DlW56lL56=q=Tq*6E+?h?fjrp$;Zx9_-fA8PKFT~DK;iJN`H!irA`s0WVeba z^b|p&Q%ThNS_8*7YW20}i4ngY2KGw2Ge@JgP2l-~^zi@^8_X+#jW1YTO2O5AuTd6iMWfbw1^dvv*z>kl&@De7s@|#s5`pj%gLF`$s0guvw2$O%}B}}gFR3W8;=%(bV zchGhq+wV-uWelnN^|)N?dr0B`5}Hom_ZxF)*|=7635K0abX^e;@F zvzjIxMM?$2f^|ycMpx3e+9%vDa+R@H+6BJ;T$8^gY8> zgtTW+lYk%4*PdaY-0IkyX-EbUwYiXcAML%4^1`HTgMA)|l{^b}Q`n_l;{*-#J!*Fo z$z0crqrfXIld{H7_n6%lvqv${AjZp0xufJv3f_fbPQZ#c7(_m~N8@Mio7Hp0|F~Zz z*AUZ;f}*jT4)=oH$9I_QKg0N+_)fcuY=!=rpzm9cu~9)@oo{YP7qtAfY-U&Neimu6 zU9WXAjeoY{pTp0jM~u#2tJ2QSH_Q3tY&tQDt~=$ee4lKNZfyPj2 zpn-=;CH8ftta7@AIuS!SnW8BlF$L=2>?ufl46RH`CG>E6u4`DZnOPn%de9i)?b$Fz9rF4IlD59cpf9A$KLgI%dEKA3SZ*qM978G5i6GeQ{ zHXNer`~P=3|9SGg+4_DGYuQ-+Xqo+l$pd)dI`iaYp3N)#>D|8wXVXOP6qKwB*@o;` z|8Q?W@%CnE3@B%$KshA^%CSM(E5SoG-(PsBLB6%p^fz3%fF}p=Z2q%Q#4iB)&ZqDY z3xojAxgdywmNcz5&f-*p$i6VO`OxeK;0kz(h1)E_KA(Fkd^0Ei(B&UXA^XcI@qMKa zDhS59hzFSXg}m!Z^^PnP$A9C*jo?fMp`p9c{WnDv8k=#X_aX(OU_lmdel@}i){FTZ z4Ci|`Zj)qs39+qD1|^dGKZv6ys3Cf<;S_K=Oyi}z_v@Ho<$zR5MwPc)d@^XEv zG|s_u_$w5|F`(^0nkS|KxDrZ zW|496j>gyVGOrjBUU86&m|jhm))y3p7kODsp%aO2E+Zf@TYoUj0Eo-1l&laMVCATK zFGy^j;R)>sbLcmF+kqX>y|yEH1Enr#M*jb(8CH(ZfgpD__3IyeW`@WL*h<0Sc*TjD zD3EY;us9he_!+@xJCO?br0LxQgvlb}y@x)}{+>R*@&8gERZbVuNMVz&iiv%`WU{&g zU@LvLeRG)nhpMzKFybOjuv$H120L6~aqdlgNZxEo#S2c|NRfS-sY!+3Y_at>{ND6_ z%-Gvr`dXZNHEEszQ3{j9elHb)61zhDPQn@S79aba9%8Qd5A?iG1}LzuQIlQ}+B~!4 zFX)V>T#VNv#FM=o{T3e#Y0hy1S+o!TKgIYh6wo}wUsCCx3H#X3Uve>Y{;()!0}6h- ze6N(TzqkcTTM8FyqQ6p@C^C5~$+5yq%NOTCSYOz*>H8yy@nEy*iJVIGO>-H8wP_WL zQ)3bSPCZ{agX0s4I0~Q}k`g{z1CVZC(k{B7poTG^L7m%uypp|dZ4hdNFlrLR7Yr_qk&oy0b0!sMl* zla0TJh~T{3O4J%48ti;X48Nyo@_EX;Pj=)+(PLvr!sN3`e7$9i->nA%n$IZiJ-pPW zuA#g$kk|N_@p7hwHy;!2elH2|t*17K9!g%p_kg^f7#R}b`^O~jK`6l>#kb;0TARE0 zeH7l{a-8`6){MzC%5XHwt%e_Z7vm5g%C4aj;u}f=xPkK6>Y25roi7H!+FbP%8JGHa zzY8MX-xw*6jn9mh`l6l46a$Y0J+P8$G~Ndr)6&@Z^s>fu zWHn4!@gs%gZc0UJ7<+jW$pBNh8@<195Gmr<>E^g@EZ(~aKX`@s$Gnd%<^`Y9Yp5Pp z$ymsdN>Gh-PiI0z9i%qiSimJX}dWpq3^LU;qypnIdBLSaUY}b{Sed3X{}S zNs;-gj6X;g-^)BC!<)Qi9L%@S(;ufQOuV*`l`XK24=)-lI^WWOSIS}SV+;{$Y7^E` zK&qWk`GMiY^%|p_@kUn(`$)DKm_`QhT^b|A8UsKMsnnOa+Rdr_;sX&%ki|dbi-fh0i_AliXmUQOE-!a*>;n12ZKIlEb zfjSOR2W-tf(_ap>-fT_R8($6vI`seP>T&O~lP$fhkeyXmHDtY_Ud?gI3|uC88?*oZ zOzSZD2`L3S55*s*>dyX2`*W3-PZsW_o6t^^ar&e-KRh!K`qIuXOTMl$P}S`t|NMgE zG+1S{FigG|0z<}khLzEsCCfBg!+q6@_ zrk&&B(>txGO_A*Jpr$2LAWbHn5rW!ujY0WOyWVf@Do}@L+tc{kRTqe_6Td_|ujbLZ z)733jgm#BtB$w=lWpt9+aN4-`ZVd5LtXcB6cZcGs+z#{rWxV_Tmcc%!4tob750lT? z?+yG)m|T%nA^tfn^27G~5&QjUCjsz~-04|7jkhcufKC?N$e|u!*p`p~i*f_Z+&t7c zv)~2}^=@1@U1Lj6tn(Zx#qAd5(F<|CHuVAqPHYgq*11|p`-vc*=?*e($5l+WW}Qj< zeST#m^@X9B!`s4DF~*U76S6 zMQ@vJt8D6oOH;L*D*YnR^aQR}dRPaXe0+H4#hR;iz{WMNol`E=?axEAG}TPEk7!gROmZ-XL8&t$T7qo6 zWy$9AEtv%Sjj)BuI)cq3J8Ze;ewf5W-uFE2F?MJi-pMTra{qF7XpD~OqS{k~w6EUh zP4Jd2D~5H_Weaj$V*qs7K5hUyGX}7}=5w-P{eZ1&w*wcA#LG1jN7lH|^C!ee{ZVg} zliwlM(f*T*qAh->)RLxzlq^Mg!{knWqZG6v23jAUNckVM@_%D#I{I)xxi3300a4AE zwBM3iOsNJ9d4n>$@X}S)4UD^!drPB%RNYIdJH-K+QFL%1GrmYM;1wNC(lO$`-pS(s z)47;Fh&wTeKlXT+3kAuQh%^=R@lMQB6(do}X_Ahld+y{!UXUX38-LC)QbM==A~m+R z(idFAXf8d8$?SW(EB(dxc1R*58AH%v^3?N7)|>&X7$n;&yPzw3xrWO213&gqVRFNP zz93^rwH@3#{CQF|PEOn5g2?@gD%?j=g>=cRSyB6}VLk*G^i0a@DQat%euc?4Ubx-T zeh<}$yAeV5%xEMJT}_T#X>6P^_r;*t?}5?nYFhYd7B0aWO2e=c@&kHE&e1DFxT3d**X$3 zSK`%1%8}V>+ugn9bAPxS;nv%T(Y%$uA?AYh|5j_Q4cw<&iod3|4m2Ld9bR8o5KGFz z_G1YdEC@edv5V7Es*773n2)N9&C0I2xLK|)js=ZozFKZ9s(ID)_Id;{?}D5Lc% zjFhVdRFU80t+}>ZFq4}0wR)?iMz3jP-OOi#vX4hK@0!G-4O~ih9|q2R#OMWT!EaFp z*4917I4+sHAXE39s7jg(bbp*7bBmo$J{k9<_<8|2g`FM84Mb5 zAM-k1!bhLO`%k(sc?DnH>d>2E*P5P0I|gR|Kv^iNAHa)SbaE|NY!;n`+5gtJf*W<} z)+Dp$bc4n9yghKvDB7 zMP?z{yMZ8n5An@q;If4>>0@X4_vulM95+cNbJO~8DV-bKyPbu)vxE-G0Cn3zNPOw| zX$t>|bNkL5VmH(QmV?~;d$4!1wQm1T*0N3_-ldz4z}#A*F$!!i_;HO?Y~)jhyq5L(aHg`-x|K}BWNLkK)Y}#2WJ~r5wX26I4h;i@qe1|8 zMRME_lO%*_V)?rrym91bu&O*IA4iWq%5F_hNa8 z4_ov>hQLi-Xl=A=g4(`H5X9ASJ;_QjY6t?1d8yU6QvtY9aAo{p@(bM|h8xibV|)ZQbjNAsDe z)@|AwlI?CnSc!>`n2Jz`ZxDp;<-g8fme zP#P$6R%iucx`CTH3--ShcT+jFgCEQ-TbGMekM8e#F3-}8*l>CN(E_Gc;;^eoytY7ahrQ~86zCoijsMJRYfTvL{tE%?mJaOg<%N|f`76(PeQ{{V_`|{$R|3DA zg}omUriAeaC9Jeq35v4VMN0cdr`gSMYTi)*7CM(|l_KnEYaH_lbOAZjgP0{&9V{xd z1moRQxA>p*0m7)01(cSLl;p}opv0}8%d1@)wg%lgc| z6&n5^@T-qdU*v!}GVs8@ZJhKrM(uv(9pHzfre0lS5cBFNje{AL)|C1WD`18BL3%bDzyTM0UP$k8$15M(UI;K|G!{lS)?N*bbcolJUSudJ*h1^x0 zHb=xApv}$mf}}pWx|0RT2A6MfJDH7L4PZK%b#Cx$leR@KGc zC_JPk2z@Ghz5$7_LxW$pWA*O_cjtc2$>oWw^d(*m;8}cj+wgpkA#X)NGU|m|T!pkc zJKjeP$x=SxXiGt?{Rj>!xLm<_1;2Q8i&yfTSLz^MrJzy=@oEK?TJssoS&zq*{G_tO!>Z`ZBg0Dgy;v{ee;qGsx?|SlX@kRSJ zpKBQpCi{EWKi*MK2>- z4NIe!U-3Xi$KR6iz}nIJ+=_xCXE=vFr0nLl!@l4N(o_ zwSu+D4s}o2lgaaW<%tg>K0WvxAFS-@I8P{klApfD7LacpAr4<_Buh?<#yzj8wTWVv z&cfo`RX?&tu9#e{|Ki{n_PZ0EgJTSuuOkQNj(e=1{nDCu8g07K`jMZzL5pXB1Jk4P z15}x_b+nLtQw!<4`fP$5H-4udeu`0Se~ z^NR*cu~3ptidpKL{SfiMK$D-`kHI#E-RUmE4_-jbXfyn1#4FZOFu{*y+{}QQf?4r%or%7Xzf4#R7p=|2i z_yxF|sTMn7Jr4BDLsClQn#8I0b^eJ!WdT~08?S@Rrwa;qNM5!3C zCY`pXr`&WFk#fi>-5I5Zuh`f-&&@fN_2lX#Qr|SdU+qa_1tN~l#~YM1a*jLR$V;+` zpZ>-}*&@vl8YmmuG*9y9y$xU9KO0JoaCm&|Gz~`zgI7^IV$om9dlAJRO0liiX6-{V zvd8CpXh%?SXvl0x*wF%kcnc3ZU8q23&|KA~kuw=inEN9&;2{bgNz@^9>@&V99V?yU z#Jp<>yD9OW@{)nr-jGyeLt8ed8w-*^ZER^djG9IYvziwO3TE|2AKP0AxY+E#*+(QE zS--4QjW*U&P~5O4$2xD2fKBGZ3}4qzX8^DUZKGI9-_Bzu%lG-7eEqcHa6WFkOj|d+ zY!EhFh;s5Jb34G+$R0^_4=%$5+eSVfW39DeWVIBE%6a7L$%peu&Qr23zeqkD(kWdu ze_%a+iNf4Y(&8B#SZkmdlzBZWozgH zPI)a!dg5DW{mtsr1pD-yE1^XmgVl}7(61_}q3gSCS*FFj8 zcU~T#7vrbZmv7ow)m5a%YU?wI^8)RcD~~mF&HvMu$JfG1Pqa^_jQ;j1{FZzG?HA^H zNl%-1s}-DrbcpLq&{ovk1Ifqm(&or+J~8}CP9+vDw?+y_vrDqEb~HQf{~xg1Hol=Y z0x8O=rVf1d;%zGAx;Q`DY0UpEoPS?7&J3_h?=(O!Y&Ui#7JRcBtJ1Q(a%07K8Sb}CDv;nm=s^Evylx|7NZV1x@9ryM|nXS*lx_J z7euXA)WWjI6t%GMaYYptWL%}FQhbj_>|i0Wps5NRJv+mrD1A~z`+QQAKB>ZeJ}F9{ zRPjEa6s1pUKzth0LPAML1w}!(!rVicKi@XGxQ3|K@!4FNL-6h9AD*RQMn{{PE3oloucYLm-_WD*z+COWZQgxo50@UhqU?p404!>tMnzFq~tx{ zU6|&>N^^sy(U(0N@tqv6BVoMhQh*&3^0^r1p5oO|&-WIV@e!4A2A!R_N?+nbRL}Pp zrunGSJjBxIi`O%ygf}fr_%S6s(-P`S+)!JZYKG*4tFt!PqBDOGKoa|?9qV9mFiIta zlIumbFXXZd@d#;xxj%qFshsdn1p5ag&Mdp^GOZVfGJmKHCn$DgA+Ar@%JyhAz_|Cws%74nS9Sqi!kOg!=# zY5(%BFg?29&)Fb#{nnAHwI+fd2XHQE8x9e^nRw4?$;5f_+0E8_dvP65pUx{hI0H_@C2XSR&vRqK(>D)Tk8`&_;EOO$cI@f z^fc-8L^_zO!d+Z|7-&OOrh}5Zs-49in8ps%qUpb^9LIy{`VicdA*dB8&1FUKy7#g) z<>D<~UTF4k!mF@3jWG~D7n+k{G73_)DC*v@i^;-?eRz++{6H_*?_M~~-s*8PBdO!C z-=ZI!auo%F6)CYEDy06hcfAD;s;l=82eY*6z~YbmYvH-E&-X+UTbaAdCr2+`zhbef71s|?p!-B76Am^JFe1u|K-Pq}FaD6wpK|v#2 ztx_1j063$~cp(p<{zyu|gMO?e`Q|`A`6HHCJKx9HV^1)@QPG3N`AznW<`1=JX@0Xk z%kx|GbjK0%hbfFKn_c2pPuD>SIed;E&hBJ>E1xtr#oV|4-}OD~EZw=U-sb1ebC6h{ zN4?AUw~O?#ocqZCt3Jm6rZHtMjiR1AU%klsnvP`JH|U#n?mh-f^N2ZZ|5An21uC#D zY)vk-pb#^8lm({HVlx%EW ztwJ=Z7ZaJTJL_l_XIP+(nkA+vOB=?4)5lt!`hd8Lu-R8h^Oepy%fsBJ^h$#jNhyo% ze;}pDdAPpeCq>h-IlmH^F0osu=eJxHj10o5;?SbTZO9~NDb48jUh4aS&GAcAv^l6W zMJYX#k`zf7XSpl$Gi1P*<)vzMF?l?XsCfw1K2K1{yw8|J8LU1!YEI;cNDt###v0P~ zL=tjpKa3LsTV*aE6l>+=GAjw|Bf^&xc8&pAWDsA$E2jld$2et9!3diWTj`yZ;Ba48 z-B(Kss&VRXL9~@QTyQ#{>a&XRPReWj2O4H8No_Ih9kEGtzK;rVngmHb**vXswqp`;H2%+ie z#`b9J-07v!*u$sujrDk`-}zbyTp|l{gxI`t{~=eqbY7pQR~@R=*Sh@Li;uuRQ0^A1 zPh^xMJ#8bI*7BJ}tVn9<))`XuET3Bs;=NFdU#xRerM$_RhQc~VP=94*-1;L8IMVwk zla+nCR^7ZedlAQE^Ads%$DjVuFn1Y#G(r6 z;N9}M?LjX0BVdll$NAgA9=r+8-(k=E{GIm19q~^sP?-N2PZr{M9x!0<%I&2%uZj}+ zkDaQg@fg7VfcHH=A+2qX97(?{B*p61AT6K!gYt9pBpUGesC!xJNPhMtkOJ8^96lmep#MXfv}~p#my3JI(;W7idA+tD zr>IMnykOU$N(MVFFm5=Ez*`hpPCzoI?Lvz*a{7t0GG*XRLp6N@0cDy#q489L1C+O+ zMnFs5^r>mg^r?+U5Y*65_YwG41f$cd8V|6$Zt<^j-1xgt;}F<3e!T}aj=$Rj@%Vc@ zFgE^P57fus=YfIo_j`cd{z#^IuzYpTJ1}IJp>f`tNqQsYJVcn<|E~X zjDPOn2y(ohfza9Ikx~j0vL}yWH9`bnHv<61qX6T!w_&(;bAJ^t*~A#)r6ZO*W+gL; zj((XxU2?`gHrG#B|1__E#q(CpYi8fxCEW3c{^=@4VKTq+<;ApHP7t|jB4}Rh zMmbVFnX76HfKI^xXb3F9Ft+Whb$)WRfyg|54CE5-xf$ojb=g?zm)NLi)*9k^rWz%g zna$fEq^=J(4Ch(*7ph5@AcsIVC91E`#;B!xOXV_!$&3FW`C<$AkdwB>X@= zcL`L0hbNb4|J{nOW)) zVZ!ym#ho$)8m%Y4;1B?Oe!SWNtF`wh)cX_FTbcbf!Orq_(dKG2cHwsXCg-BDi?+Xr z=TtQIxb4zSM&nX<;=$F(!}JX68%I_GnJ&uraV?pod|u=a*`wlVVwz=-sx&Sm2S#ly z%v~23T11*_;at+}Wp|hirL?U6icRKJYCPu2rh?*5^X>fRPQ{9%xj~|BT$-wACa8`} zc{^WwyZYR0b1Dt6br8g0cxVR0Mi2D3EH{V__=T z8qDeKQR-fM%Z|p5a3^}jfJIEM(BeE^A6hI%dch?H_0&q{`ph~H=MwIGHObKdns*=V z!JE9uy^lB>-A0HNtnmAp(8W9H=j>AmbQH~x+q||2mTCDZj$PzFy$5;Gm5}&S$gSmX zs_5v}@2k=FYiKj|3ggm2X>N!N@sjIcI3S!Fs8YT;lE#X2$wq6`M+*j8$mt0j!!~-< z&?0Z#*hNQ+ocqXyT^#f2ID5S};($neYC0FESSQpXOe(EO)k40xn79MAXCby%{FOb! zX&Jg>MQ`#H6z&~-?}_Umd`}#cG)TU~P@wUi0#~P|!fj7y5rf{iP3cdCcW!5R4P>Nu zyX4Wu_@9XHYy5+MifjjDyPEz|edCNLD#bU8^_=iDZi#4Hqqu&l>wx1MLDI1bzIGPX z2QX}g6>1hrtzdM(ONh$x*C-+yJ*O`!ZhE1$Pgw9X+Ly2GDAceK5Dr%y6C6znjKC-P zdm?`lRLy>rpA;>8T>A^99VPP*)MOfz%tH|CN?S6CDM+U!3qWBgH~>f1f}*3a4ua!CJYnP%`O=6rY=` z@~1bKr=-_ z*w71dl(h=cSf?lv342MMAdw$1NUr!up4!KT&2y1DJ0n;%8Q`Mc)sgUd|Us;|=P_laSeR^>GoGONIE!igD>vVscyB5#=7u`2U>o zFVr_In#zc4vs_GG2VHG0nqp_Et#K^G-Gl*^?UTFveM4OQ!=B`{eD%zcE*P{!A+SnY z|3E)oCan7>b)ShRFt*0b6%;RvhNFxQSOo<`^=*b}hTYP}>+VLot#g}rWZ!d)6tXqs zF#P+o`1)Q5*1EZh@lW?c!^Q!#@HzK{o5PcAMTHxqxt3^PrWNj#pw;A@OJ~N?H|_13 zWn-^NJ!A|wfynrD84`)@tLA+>*x}N$ZI*+pFly6I^tq7J_?!HqXRtZV#inM4@xcKu zmqhvK!HTTYkO^Okxi2tI|D$=j1fQV3nG|B#PSMt-bmop-IK8by;&mWmCmHp34u8G# z`Z&HR?&~}?H)kKhi_1h>1!@_ck`PfMl1#LH<}6-&;Hi2jWA_s_ni*9%0MXaEDUpG^ z^-}H46C)-je@ZGiKhyXkrx4+Xrug0c|`cG$)fEl%HiD`m(#4R5S*dG<&Ffl$HNp$=RcDJV~=ZyfY#nm@(n zX|`T}m3IDuah?5?8f=3I3&Cw2CElOG-}BQyb?Edod?`;EAUcD1w3Ak24V?{y5i$-7 z_ceN!)77}_PTR!rv`S^Cj+_g0ZjnXsxSo+^mFnT8iZBAU%t^0AxU&o*ED?%ij~Ywg zVTcXv409gwXFf4)g5$6*=Ddr(&V7ZIsZuP=|D3&br_YbuJR6OjBzCxO`{PN;%k~;r z1v`A<_Qe*FaxS_%;4MU;RL#A>QW)p5d0EC_9k*M_Epq!eJ;9p+7Z;m+j<;z1gS?2X zmVx2)L+Q`AkrTm-Eg5Gsp?$$X8R1_!8$}cJ;nZr#M=;X~;!@Cre}nn0sIPONW}W=f zpcoer?)(m=np9vsD_5I-ZoRD*J4H+Acb`Rno)!zO)+{Xhxsq(jKRVj|YDfFTF~@58 zK8w53iYw7d=W~3>wVzMK+MBoa=CWd2L(}4thpi`DhRSI2EanhRuO!bVFw%!>Rjv+` z@KgQwL_K{MhDa7*(_v)53v3=-9Y_i6@}N54)@{{(v*)s#-CRUUE~`UlFuQepg24)^ z{XKOsB?69QRu_Bnp`bd{O|E&vr%rOnR+mxp=14;C_!;i}yvnLptBG7oj|>kFyQhK& z^~T84_2|s@peL?wKC%&93tqkDy`A!kdy8L{IO;h7EJ!xlJ~lg>ayRq9IXPA!W>A-t z)6%K6ju|LAUrf64!p1T8DlA-A-t{{6_bAQEVUMt|5AdXd!a{wdaC6;dd#(2`5bPm0 zWSL222pe;!?eViIj|#;Upi5&Z+UDFte7G-3$Xi0&Q~fXf2ta)>CN#Br6mxT9u{rOZkGh>7Xsjulq||0(+DG`p`bKabuQOZ8 zRyGMz>)SUUS#I)T!Xwus3@u7)YBgbjF25b~=lC#Hv?{H4pXN&sQQz>X%+C7aTf7ml^HIwbJp{ zenl+)FNK@CuLT70bNOkmNniej7uZX971fLu`Co~cSGo>R^kHg~sZ{E7pQdu*mCB9N za*_Y`aF5R;Z#`DJ;hbRyCls_raozg`Qcdx>6u@7(&Zai%H1JV9be(Gm#3RSj+j!gaxy`i0cy(8T zgF!Cm7xO*pc~jb(rVv(DivUfm8hRnk6>8WSx$4cV0dF~Ms?3NNPK z^9A5`#IFun0;x*;0!4+R@$st3RZ7M9g+!Xp>*G-4Uu#~bJmL8JDeT-6D*UeE?-_j7 zu5J^5U*qoz-W9i%KM4Z*_?vwKKfW&Z<+onW3mPm2$IhsQJ6Tjs4Asw~RQHv^mpk@$ ztBJEiq=`hOGd&UiMgw8KM-hg;NI|=^pk+kHitstsh%%|VU_=hKVd*c>pkpG>u=X_e=d!6%q8Ov10W#mQ(drgcx+&{GKvX!rlAJNIS`wtNGIU!M=G`rg_Yo z+H-Lw2m*kYlP$~jeV|dGaowt_SvI=>t~c%N9DT)cF0jjB^9oAJqSBteOrODQ8>k0E#+&sLLwTcs~!6g1et{@Lu*mkadiXs4FwH%I2$`O|nw z$;!HpGOWq()5xb4yxv=6QPyPI(KI|ljOAj2lHG|-%z){(fEv>3h#i%MY+e3UjI_TVe;<+ z&$*!iW7YKOE*^+)g=1?S=ezVg_j{yLXfqOu#-ZstHz3h)k5D4p#V^!qW-z(OVN$jk zCzw>{5gdQ@HLGgh5B)D>&RL}2BFuXpLTB3-h=79Pn+)x^BqHNUa0Xv(3b$2eV*vx`*=30wu7*a9lWo=r{c&}oD6-(Z@oqAECV5l@B@5?^BA4SF8X_RlSEHq06_Y=iLkz5hQD7S^hk0zmLSw43c z<@`lB-<4Y$t880u%t8eMt?Ar0JHc;y-7HG0oa`3#r|@$AlxBJzN*h-Xj^V3{Z6w)sZ!&QLcLc>JlGf9by*~oQ2VrX_{PQccNViwn-(V62%@VA;O)>RE}8o z?96{N+jum$F+gImB&JNsUG_sI;C3T^0q^|h=j+tGR zwcj-18l#6eN;XqZ)$!ev01ZQY8%>)bw2jeqU9RJO(PzO?>D#`ufFZHm>4g?1!{s6s ze@zqHSZn=x0`1I|teqcFmwRQ!5A{nZ_LCJ?XpP-cEJuw}DHR=!I4x(JJF~W4&PI8W z3-uRg%W9PBWvEi)p}qDz69O20(7@ffvzR_l&}UZ*`7IS`9fSC2U)YC&orzdPAMoqJ zuy!{D>rxhKAM^BxHALbZwgtrx9i`Xv=j=F;3`9(N6sP2S4>mUnHZ_`X2zBx~`Y+@$xdBdU?S^ZT^Zsg;}9+ zsHJ>-86~D3T)xxm!G$tiX0kZf-0t!qwUIH*g~FkQA~2I7ZCn<(1j>GH>5J3 zAopn6q<^8+;%;|lW_!}!N6S1_n&2bg&6JnY8p-5{{{*)=FAR`YmYZOAirPPWU+L1Q zNuk^)&fJYIkkZ_HDDA@Pf-!U6-0XYu?OP~Moj+tamv$TjD48awI(dx^)2R@}PZEwu zlg{k9hW2gxl4L)~pFgU`+WbD#dQbnGr)T1zUJ9{2wc72D)I!xRqRmvbTj;8G3w2lR z%3qS!rGoXr^jlZbB5fQ$Mg!m%-1Pc)G`K5U&h)7LB^R@v=Q77qSImlXa}&F9nWUPF zDtI6B9VN|0N7{w4n%SPRaW9%)nH;j+YklVCWeW`Vb_<@!sf1RUEcHRTqn_(#dsOZ?ZRQ?jmV3b8hyX_7+Si7)Lof6 zb0;f8{K++Zje5}3C+vUzTO`V!+*)m*3Hcx*CGRGcw~2riBjrc z1dnjfAQ85_=DG_?v1lbU6)YGyCs#Rw`UAq79_44W&eM#-&kY*2PtnQ%3t^-g6^?Fd zrrFs*&Q~n>1l;qvHIyTHEtihs7vVEx!4q1TpZhE!oEd(OM=Mw|Rm8P&TLp%uMRz{; zx#VR_&su7jF*HL$l{1=_ldrEQ2J288`|tE(7B<0gO50Vu4jMT<}IbMwcDiwDP?-=WxTv3{Zn`*4L_3S z1NfVL0Y4?@{~uMdd*(2gJEyTHh`&hF)K>U#1tkwqYsF@F?6G+%UFqX}c&>DotU9utbU!PyX3K`^! zS=%(%A4r}7;1cXQ+J>f84|ZKmh#P&E1iQ8nVhn0{cu6)~4t_M?KmK!<0;8qm&q*e( zDWqS6`aoIuST=uq6rG)u+|G1Mk4zq}pe;Frnk4Q<51yxBARbg(?Cacfn3sM=vSxEM zYGLlKf{JaGG51xv)mUujF#Sgn<^sqjX{mG1{LE24FCT=;LHXl%F7+U27 z#6qWimBzW4_Aq<;Fgw$_=T7^MUmV6?qv%#R+884Ib;7KGelCMO;C>5xsfiB2_FL1X zu;fQ9i@vhG=4NNZ}BCX zdJ^R9pAm+(hVg0gZK8%2fjsfcRnI8n7#JUZvuLUnoP2?ea9X3C)`?FOnHc73ZW))b zIUhkymmUQLkHg#4R2(ta0VoJ{sOWdalaDk^8IzQm8j zq*`C~TosbRcDtXI^H-HGGNbloaA+0d87bT)hIysB@uac6b2kCziD3S>tVt8${IB%L z&;N#p<{End%BTsJh6DYj71LWvD`(Dk%QE_OBNSGSw7HX#5K&;R;xey-Y~m8-SQ)V1J(f^x>A2`jMvtAuwW;3)ZH>4t0Mwz+psmrK;r7Z1U?g7@ z4O*IyUqdC$A?Am^#;@hA3tzt%A~8RCl2LFu_w+z^E{`Q&V|$PcQ5`wm?sFJmVAWzyNA+xQ5Z#&==OcQXufsv@!yX|+@Kv*a=6Y2i zTBQBg63q#xMX#sX>3Qwz2o~E%)0zIk!oDZ=Q%|3VGK6+!e+4*+r_XHO4d&J#;k1Zt zV1g_c>;8*_x$h8|SBV*2jNhhn+-wd$=jXYD+=FP3{-tN}Pe{+=AF<%z{dXw`Go9Y! z`HGUBVKDc7HRKpIB)&<(V+l^ZIB4t1^}_Z{e!!QYtyIa) z3VI`Ho8Wd5&w3YbZ|uVD%?3A>l>Crv{l%IUA7MX!?J1Bd$RDa$mSz z6U4Vr4%g^dTf#&a#3Yk!vEikE#FwcX(-dp76uM^2Q>0mRb!3+1*1tc?kN^HGw<*hh zP46}=jDMmO4E^nTGQR_}b{`c?yRO12vy%w(p(Zn=!k;LFrLvVf1W zLoHsf*R#x)^m5U#X`Et0VK663p3jHoATsED{2tJG>jx+ygujok=WS@wtiaO!`f~Mt z*NfnxBqOhJX8vVQW(_N}PK^+r#{(1|)#u=zi}jW0r(V5Bo`0G@2C*B=tWctA%)ntXn=bT5% zWxyccd`Mtz5V(%!3|wCnzm?+Hwnn4pCO-peC1eYu=f=+`cITHVpF5@Kb@F!J@uDjQ z{hk{Lmy&nzo3KF;TV!br-i6$$)U{mjwl1=L5uA0d#SZZH73*+=C9*Xl7QaCP@?ouV z15@aG`w;7*Cjcs5!x^Gr@z)`f3XH}pX_97-I1;Mutg$P+UZ~GRYcaaMpVJ{&n;k@8 z_!I0tlR*1Vwxp7$XnV0w1V;ZC!y^6<$?Nf6n1zB^JTQkddLL6=R!7n7qgSeqFo@qz zy#E5s-n@A9lxJPfm{t1cbR936mci@f2GF~yONUAKsZ4DaUt-c*xwSo~(9Ngmr?*)gO+}S|-YLI_*f^4*V}^gZ6{F5x=yE2X!NUWf5n0BYtfW#}Sbn|BrybEo@4Q z`;ETEzvWjnyqNo!tj^K-b4V2|nLk&LFh7U^ltwN7opKD8b#Ze(K8o_@RkD1^9B{&*zG5-*P z>AV!R(7&Mld)m-EXI19Awh)=`T6go13?ays>)MyGPrq(r8MERZk|%%Q=emjISG>cb zR}lTjZuH74{*v!_wC(uBJ#e`VI9V_EPu&8R_ZEPNSL3&lwyt8Xg=4ji2RkCStGJ3n zOtvIy|8*QuC^ElFSln2g`!hvJ$9l57g_ECi{{kxxAszsTB}uW@2Td-P2HLQz4yS8X$Q4E6cHDyA)U%upS`T(1)302P=Dhr^k8{H13|f6;AzCS+%6J~mCIvyeSz_p-VOy$)fvb%jS36O z2o;!}9$2a3gE*pu)^$KlHX{XKHU`YFoG&T9jPUCx%w(oLJJ`h%%*}oW_|mK)Ua-MN zk-@5)T*6W6tsfKinS+WlnX&IU5PqEonCdoPD|OTKF8GAh<_&`@^fkIst)Bdb${ej~wd6~AE%My?*0Mcc@+-I|Y$x)?5{ig=O>&`{ zJg6Zh{jPU~zLd=8+gjC~0rK(1_;%(-^D#w}Chj`IYHglng5dt)aPJbxLJ-vaL|qGO z+vj6x)IfajJf3@wV>`tGtv3bWb&W8H|eUeujTXu|2?JFgiU?x4ywAgQxhfgUJ^U z@^R1bS{A@9?13uaZW*s`QrAkJQka{8M#y(?py_`5eU0!w}NDgJPO|*wqNPC3efl_;%7L9OS!VL@&*SjD| z=SAaHijO9B4eoI6Q*=fXhQpZU_;=4_!q&(P)_ji-H|tUrt%Emt^EC0*vK@o@(?f`a zK_c59pPgHlpw;G|=&;1E?B}W`jIy8jFu{g{kfmbb^kfOOpjMt+im9MqTUOxKFd}zM zJuL9+ea_mFUhlJ4_Zr~S*r&lT)8JWPq#WLB8Xzn(-(N!}gIq_QqihG%XV_q$I8okn za7CALU=U%`My^z%S_q>mpx~(<)J3X^UcpgUaL2wd7gMGiB~=Cs?ca;>5&XCaj$e#w z>LI&`YgsA=F|m-@RG7S)-+VM!q&NdH;)eD;$|w+v%0=;C2n_&>vOyg8a|ZFK410$lY;W)r>K92_in8;0|)!T!O@V4v4r862$bC^BAy<>m=7NJbf5cgvn=A&%v^;^vti-A$>#tF|d|fb$t(;0P=% z2XcbsCh!q^1j@UKz88}3YZd|{)8!21RvpK}1#E)cQ0|D+SkCz;S?~^?7#grBH@ZQ0-UMr4Y9sn&kN&wXf(xu=hou5 zpvG#BevUS^Xj7WR^qJ~xK6wyH+RN!D5=hCW`=aINo*?^use@#`qQ58e*Uw)xHZZ*@ z8e2U5=*FeRojS_KIenEQ2PdaeQVXPhKD1t%VC{8muYj8foqa{dYH6#um-WQ3E5>{| zRZ5CDV2F!A!gDb<_iE(jtw}Ar_E>NrzMUQ8m5g^_ep>$K+46s+)sNusQ2u7G;^%Ll zE!XkU^jNtZDfBo8uruYI3+bbLp4MqDW&ui5eN`^DOE21 zA3|6TUkiC$kzOGguOKgIvyhZ~C>@sbf14TsEa) z!QHruW1;<^UNNewCo2_U8*5p@$7>i%Hu09sHoa5R$XJS#SA3352r0O}dCw}c%r)7w zOkMGc9I@Ue_$jyVvPIGb!A#)(V!Zl*>7PjY^@2q%{upT293&tOX>u#9i~I&~%Qkyb ziJwO|^BOjb;V4eNw%4c9l<^kjYou?xK422|=CUX`f)&06AM7?#wv~FPpvGg|u>dNH?uewu>v^H2Y61$ZG}ed>w9_&4KtYydj*54;4@znMRveoK}rD^C{9dT_$*gCg2eK`o=8*wHD&Psv~I* zHz-=wDR;1d$ckI~NP;^OJbx?gDZ%(l1&|*6hb-l7J{5esg%(sIuqL_|Q8~Qx+0GM& z-Q9#ie^!9A=KzNpU_)!xhxsA)JFUeutPhbJ%&;|#8#L)YmtRt|`P-{B*uk8O0#~Ux zbxp!Q@GaHw-nKx)>-=6TH-1{C-_4sX^`X?6w_TD5>mSM97oQ2eVVRXIscy2RfpWyg zKKTUr(dzRscPxlIwsHLfZQrbM4GX?@Fpy?8BGPX}(T?cXc*~$q(4db;4_RbsiRp{# zM_x}!^n8%doyDAEHvLNmSese_$70uzasVO1Ook$5N0G3Ok%=Kh*<=G5%0wkY54;$k z8$=R57%0%-PhRA?hse`m^uwY%;EvkF~Yk0lvLWA7EBg<7-`~3)#AJo8>Ss31^g>9bn)^b`PUuNEFhGfn7 zR;L*@es#(g%u-(VkI*L?6U0RUM84j{c*cJsy7Qtm9e#JKKHa2HM|Hg z|A^TNe&%5mzCdvO(6B~AvBv6ht8>A5UXI4#UdZH*9G^HxxDFtcXVd%AL4>Jx^ssrY zGalPI@PMqHM$LZUO%qna)CaRGUC2dq97tptIfGDh0Wn>h5z`{#p0{UQZps#4%;ItkuI#Hwh?(q~+kDo{cQcNy6R+Muzx?-pn zpT`$`!G9V!>ksyjolwdZkrT9ezdyWkhz2gmzj>mU`@AA!PB5Pcb z>lqFc(N$f|ZB$b?si|Iw_tB;P#|OJ5&Nr;XrSEVQ>^3>R;Yr|ds76Sbr6X|Bzf1bN z0BCSW`ridF7No;L9^Y^PA0?L) zI5RBaZ|4k}bhU~a)$P&3o0MJt7v*0QrjdRUXMlMYv(af-j(i_B&(&n@v%CDJ7H; zo4PI$+9drb%*LCEuh{`+JH)+`S7Q4u*68uuXxGsO$3q#O)>HR6zx@yU9;((XT5x`Q znxi4fX7cjkYRu_cH}9K8M}U-N*Sj+{2j}AR$xF}*b#8&9OPH*>CaJ#R+MUzP% zL)+)hhYD7Z+UXYJ`7JEPoS)Dm-a@sZ{wUDZ{mNl(8}K{U;3s{i9EomIU3zg9Cp)8LJ5jAA z5O)b2sYPG$9(p*@l7Yz&?UB&JLVT3ElN{}@MSHy&AFv&*+yG`zK$ZJ` zTt?^(ZpRueH64`khL^p!B?m#|fGHZdfTi=`^SR6KGL?RAd3+mk5y_Uq+)<3x@q#h8 z?9q-&x{B@=Mszti1i}`B38d(6b1~Q6=@}tIIfj6pkhjD7>1;aoK#|8OlKQmH$*lPV z>g7D~xUIFROa)7e+ZZBFLOz7}iPo}7C$y3;_pTj{f>AHoKANe4r|)uZP=dHgL0lvr zmGM=Q98cx(uZ;qfB3x&rRH5Khp;iu)GpVp1uOm~<4)>dP0`HGIGD!P&Le@8(5{uKw z6BT(4BP_QAX{7m6PlZcie3DY=fR_BIcVZuq74~UiMq1d(S>&lSDT_Qsk-*Mv+ScoA zlAY3TN+6XIPO(Po(;-Y*D{fb()6TC06OmN`P1L(+ys^ss8-5B_kckb59d1j{2r$HP}2D0z#Yc;LpGH*^SLsW<4Y)ViwO__!9@y{LN?T2lu1v}U&RT|8 zp}L2RHprKR%S&Yf!_k-n@8gh&<=xhlsglA zJefKQdr(pLLgF!k#14amzQj1tZ&a4x3PH9y{q=#;*1a?@r52I}+|6sa>(%MHEU_#O z)MK?&yYUtqes(tTox(_zjxW>r9j|z$E0{zBkM2=(E&gS-4@x)TRUATEMp6&9Z1C8^zhu~op_*6!0bmnwIZzMEQ8OHAG(d=7B zN~|$9jfcx|LU~QhqTG#|Ih8X^l;^nm#*rW@Rr^RLoX2g>PEtFOz>}?ZOGrTbf*O(> zCx1bRqDGq)hp_ESv=*NNe31gop9mav|G-K14Cf!f6UV5+io&kXVlv5Ljm3psHxS~m z#^cN-V-SJko7pBs$;YsZHKT~j*eeY*HX#ALoRFYvtnk>{nI$kQs-;@kiBvy`W5G-Q z$$XU{#~e9YpTYU%N9BZOitkfFDXpTkZx!paDmZ-S-1aLO4eq4!2Z|=- z4Q6>eI>U6feZb53c=UhqQ{4GxnkN4S0&HZ*gprNjE<|K8j9)GYa2Ua(qU26Kly<%s zaekEij45u&nLg+91ms^I?faS z8`*3{Ztgl7fPyp#2_f z9+UewyoSj=_WK9>{k{GEkzc0-XD}u#6u%>)xejWqfdASo<`|tC)g_rmlrg%d^{P)5 z6yuxevesXp`Mo5>=~QU$Td@gZU3E{z@vj#!xR;%-8HNfTx|mqM-uCXATfr*$=X2%xYda9KZOD|rim zEZPPrZqaA&Pr>9F9Pvi3BqKrb;b)S2UN0UcvD{fiwK$wB)*92B)wBmjSZO#5cQ%nM z?f6NM;Kj?0au0wOJcx3`qzz;Z42;e^;l60kkqi6xSoQCrWS+Q6U*MmCM1LvRTigOM zm^+6r@sUIgl=mF9Fz4fx^KnqRiL3M_K8jRZKcR_Hj!(i#gjP>+cq4fnGS)|mvoGcw zlBuG(k{m(bP4HaG=cWuoCy-^NjPJ3>qkOeNTseIqzQ_=~dhg_dEaLm6e6Mnwh8&`G zn8vUwp5ZW>Y`1j8I3e>@u-aEGrJ2k`b+|vB7X3CYszn4|R1e1`ua`$X!Y*rOh3k@6 zt?j7x!(8sc2GiR_9$`#kkw;`M!&GeaQ7+n2`h?RN&HkT&jig3O#H0?B9}`|!a!Ndk z$OKQeoZ3GA7kC5f?Qqw|=EUBUjlp#xO1KnkT3TIN+VpCc@sip#Iy_`d zKy}nmYGmc`%HB?o4An*wpG8RO{Ue=)ul~e!=c~Xxv>WSeDC8B49;jTpbO>d zQ1WwdiILaGAS^G$Sj~lpLtjp}xgd)tys6akp-k{nyCb&DAIHoFOQ`<_3;H>R$QUA+ zE;SC7@4-*=ZK8c4b&ZtUpWy}UqbX;Rmg!%ubn$@g!8s$PYAM?EIUjYb91I`eM2bH8 zc^`dd@K))Fn9jokDFO@_0*s(a?JBHB`s*WujZ23M)j_91iy7I)On($wS8KS2N>vP~ zh#IQ)5llV`WJapPRRb$yKT2=w!^7#|57%pn27hE^cm)4=0K;wmlSc^|25J3ZbuilW zyef=nMDhE!Eozj8Bi{;@l8XU=n>tlF39UV!`0_hsw{PS@yF!tiN@EH>N)(4)>snF>A$De9A7Xik=EfH;pIJy zf6VU%1Lg72DzfJa&taZR8_V};?j7q`V;aTLN+VGBt%obq9%A!ped_I+bmOM$NMVPJ zGxrc+r#-{TEajZ~kGUo#Ne>5YVG-0u=TwX)G890Z@45 zPP+`hklfvAtS?f1*2I1e0%;W*C?wdBv04_Az3ed^UA_(ss`;&7v`30CANQAgF!>rO z592w^k_)`^r_t_esjWvbzFH&zj>KNe{)*plXqg$_#D~+IiPjJz#d5W;8)a9BX=%xu z#?%~hNTgx{gOLF?CIWhxA0BWlt0Fgvw-Ut{^)M<84>(q_dCb0e-zZY-bYpd=kYc>8 zHz%Hv{8e450*PPn3gb4Tt`yiGp`Yztr$&bdQ@&}?1Rg0Ygr;Jj#&e@!W?6xy(4sx8 z*WO0ELa0}r*Q|KAMiw{LcxeA5KwAB?HGL*6+&plN;QAcW9B)_K6>4$iyR=XZ_RG>f z#oKBBR1M}b=d*AGqV*e1T&lG)BfPnW{tbNhZ`3D9n^@pt)wc{gp_N&$xXagiH9ebt znqJABE8`N?P7f=vBI`P4p)-?+jb$xmw_J`|OQ(9H>K?`YjD;LWC~{{BZ`(TC1DO>y zA1IH_POmO=qY@KdhbpJX8+-f~C9}KX2;aBDozKw0$8({|ynZg+`B81<*$h7$HWCd2 z^`|e!AtN=}c#wZI@+%~BVa5OiJQ~KT^Ic?7vO|N&4jPq`=THSpA(mJ3Thmt{w}4}a3_vN!ob`uI==AzOoV9_?)PJ9#wgWTi30Ks<&} zU&tNkl6UZa5$~-#G{4_bWK09rW{`?)J!-mUXj;m*g=eMH|ElLvpD?Z@&2E{mq( zXK=Dm@+<=hkeQ{~#pFk{d1^9`EKQZEj)IwGo?~_B(yLmm8?j{UHrmw#veR-n1V}g~ zokARQI0a5!AJ#Xn%R5ZQ3ZYqHv`Pi?rotPVkS{Eak5FRzF1wx&@jRFMkm<Q)3DTqUKvoSC#fKZa0y2VUG zRTrOiix`W@7z>VDl_7U8CRe&Kg6g4&;QpomkGJ=ZkMyeU|7WL<%1Dn!JJMEZi{!_e z8QHsXk!0iE8?Lx}*S%mEW9@>mR>ojcLm)utB{TyzU`&ZAp_@Q}P(#NUV|ooOfdp`V z@6S2+nWEjr$@h<+UN6n_-16LeZaeqfb5H3wRVLC8S(knQaj0veKqY7k<=!a+(V1{M z)rMT^2hbw8p$5NXmQG`b(7yU;+vpT({x?GnRch~l;=Q#m72<0&gZD#?$xch!Pn9d= z{V(#OYGo8k=kc_&GXS6CsC5Px^13v$&L|j?4YQi7GKlz|b}gO}S!lbvFLoj1YXuQb z+OOm3Da{L6RG2`(>8?<2je~e@Nl3V4TN~R!)?Z+;SsVWX+&Yz`ZOn0mfA$Kq_i`xD zQ~1A>f5f;ww^~_Ucr4Z7xbu2=1d)*W5h|mnc9D1nhiMEtB9Bip9qE}4?#dJ*VfVI5 zMYOX8*mK`6{-VipM;uG8SG~o>$LWDWx8;L@;JqG|VxtT@J7421uOJuMoE82BP1x{F za;GUB*rjv$aTFh9U~JxUcdpz%ztfzr1Q(+5^^o4BmOs4mH`1x{ZAHA4QtD!ODHqdU@T4D4N4szc4^1bm z@c)kKkcK3Wk7hh47MmK2{>2-3AbhAPja5Db_Bv9_mfD{z*C5O0D?gyk_`hHaLQ(W{ z@-xwmwLx?v>Nly4sN5mEu{JOphKn|nePUOe{~d}j!G@@8kN8^<-y9olS(e(zhYBYw zD3r(uZILQEG(IQ9WT+Ads!F&);y7Sh6Q^10jpU*XD9dIvi zmVe|pOAynJfS8i;+{r;VT^Wvs+4F{*A7vLo;~N;jN4RM>3oH1gdKO|Cc!_7d&CI9QBWfgJ6$sfc1hzx(u&ne->h^xqMnguLt7a| z_JPaJJdB_`UVo3))>LLq!M+?V!NRnd$|{>Ikv|NvRQhTM?LLw4D1I+{UM3GGWMKz0 zpa7f1Ug9HQxi)ta#ax4d)5Wv|w95Wb>I$BhXsv~nQ%*!Fbj90?sJ}!6?79~l6=Hz7 z7H5mkh4_y2v`T@^)yEeDV&uP->suDJed$FOr#|e$UWjG4M-hQ-6BDyJNP z64XRYQ308XGjbrwj4df*waqRx7}Y7K3$jL^y^G#42Lg*K%qNs;el5nyO73QlvS2*AJixy z)7(WKXu+G|AY__PBams{X1}-E?^F5B$LCSY#G+l1OxT@i-{KQ($eK4>`uU_|I5%62 zPqa5IvcyZ`Sl8f>>+%HAdxS=u`An=2ynv}w>6mwDk=xZ$5KXp4r<=nMFY^-PolT% zM(w9en<1Q$y%ySh06mPZg!nkVoWdK;(`k38?6P)ceH^RlD?|nlDK4+|Ag^^}x|G{% zy?*!UPV{`=Ubs zWGz36g;D&ZwhAm*2WA#?s(?%CqIYD83uyJQp`}W;iwcw=Zll)zq_n3`dcb)-j>tfN zwyrX%C)1wGY(A>{5x8^Ik;kfslS#c;)wIQhO1NgTaX`+e!|Llw_0=U`+C!Xi#D;Mv z##t<;t|O-1tz!!|((xKPoNGMJ30Og3HBA<#PD7SK-5;dJ{|JVVFvQ0|sZzVi#G{YJ zGU}n*5L~dx1~;CPTt@KXW@Ld!XNrjbzE58vEIeYN_bQa;*k}4V*qb-_9p_ACOgSfs z3_``}spo`vm1f_Ek6WdK=*08=JNoN#`YXNjE;c(9HP>P{fSnFS&7op*2Q3jF_Q{Mf z{%)tzJ7ws|j)4c$A>Wqx4I51zM`w#y!}%0%#yo_6hy&nWiZIlRS5>=O`oIPl4s=U? z$9rWC>B)yfp`J}gLbs(;lfZU`V1rZ{Ni&*u_Cw*lIR&`bO z?@gVO#ilm!%7|qyzLeyN#hdB5-o-_JkwA0VT~pXl-SLHF=`WY&u)vurmzw9%+jF<^ zo{7&Qr9O_i6~xKoD+!?X!3S6HHdrF7wt&HGxfFl%8Zw^gC9C&$svkv7)O)$)P=8hm zwNc`?DV|eNeS`~`Gmav@Sc7n{lxlDi`GtP4t2@fPidw?t+yW!|r&|1RIeW_yEZ~ki z?Q3-*+rvtoxK%0f1g9zpBuT#H;$6ZD2<3}Zn!k!oA`~=#0q>#k!E#BNduWd&s8Q+G zeM$eU?3>`mP+GQqJFkg zA+oJpV}#fmx>iYsic6(chN0XZ=dIwJp0fbJ-&S<#3_Nbx%JqW#ZeY>hRBEJ*;+QwK9U$ z#}(ZEY11<0Yh4hc^%ac{Q>$-ciw{dp|8D>&8ljYtXe5-f^%I$$&lSukvIHSsSgxl!T* z^5<8wE;?&YM{DBkYH_&54D;jgMfgm$ORAL(wbQ6!gU_Fhl)Az9oK5s*h~1oyHrjc2 zXj6OV@&ngKzxv$lcb*&Q)D6*wWD34H%=h&eCs@s7UtqF#+EWP(5(Zt8Ww&eMluG%9 zr}F|H%%p1cCf7>{Kf<|lOP&K6GnFEFgj#kb(@XYqS4^ehIbJ{`oyUmGTIwqBQP8W) zHZP=N(PliLPcG)cUSc+tkZHsWfRoP0L)duGh-U?BSlCj!F?bZgN_Yl!BRQF|m&Rsi z*^n);$m382h&+M95R17eQ$U-m%1BRuLjo8XQ284FviQ7#P$3w&s0yu zx9PZ^kDo<=gSl3%X&=F(F%O~Ls3PZ62YpQVL$vIN6Mvg(NI@79HQi3E(BwuZ9OYQhqIx_jfs_o z$uGfBmX7J#Jf0@~jAjaR3b;^l{8Or`kEUgDN6{^a;x~}M#jNev22V@P2EN4Z^-rQe z{@lY`78|DSl{6*f$9A!YMFD2xZK|r09{-08^kQ3QSE|i7N*@gFfNsO%6InBLQEa+W zB9RU^TRzO1>$I+0L&AM+>Ye=CkYq{5e2CO=Pp1GWtCtJ8_$1z?&r7t3(jL0Ou;oaa zx08XWp9QCuyR0X6>UBoWE&K)|xtC5-pTRoDX{~VuLHp`XN;{c?Jur{?Oo;?YOb}il zQl>5ssa&TjS188$;6YbuFYsxP37=IoMyft38iu6HSr#)pp`CCd8I|fYh+W+UtfMpg zc1v+1fi5X-lBHGz^&|Dcs2BQYzsycB2XLv$|W z8nHDr)in!+r?f*qR%_aY&+KqCwgOVPde|#SVy%J{u{7~Bhz_AvNha}sNcEI4L;e4ig6I^tcAlciZdC~x!v-%1O0t4`9W;K(8Et z77tzxs}7^KJ@s{N;-E7wV=FcO{V0nl7r&5i8uu0JoZi<^W1*?vy#0DVrBhAdz5%$0 zkuuYDIR-0E2?i?|nhQB8PiOLtIe+cRG)D5MRm6v&Op7?REtG{9QOlGYu|S5p@m_BH zWa+}=(^w9&Y={~y-Uh<;Xz+YK^(gB8q-1>!1u%`nJ}QokwowiiYSFw!^Q+bB6 zv+>W^?sBFV+8Xc6DC-Hd!#cGmD-#mefurDw^_FvWY}V=|wt_kk0lu5ErwWZVSU`|P z2V!nfjJ=LDpQd+9$|z~clJq)aB5hN@3a0FJF@#$PBbejUSwoF-y7O94>;#u5dk?V9 z5Yz^zbHDn&ZJ#4+h80kKH7d$&4zM|CgA8It8T&4i+QIH~BW=_@=oy?y(`IPOtZw?P z5>B8Lzw-g^vg=$IDu5vrJ>0;0X=aTFyS>(QDw65(<;=gU#} zlw=!Oc2izkfts&NLHL%^?>h?I`jQLxmi)Flhi-3%>p||&N3hj6TtG?|JulrJAjs)b zvh9m<-A!B%d^>;-d@C3b=E+!5Q$hRM>+7-lq-f;TIoq(0jo=ifI%^INdER&f`9iih zQiVzx9w}AJm?4xjq17)_gC?eH=eHxM*X(iB58#%Sn(OsUecz0|;*%kM6jACJZ8Vu+ zJ-A-VCc4#NJxL>)Vpe=3i`MTD(&kUa>_oKB7hDrG->GZfABw2Yn?@b2^sj`6b$7he z#%MLz3`K<_nVB6-o$J_NgM7YHTs|N79}nlxX7;q@^SMse0ykm*{!(LbnHJU*mAWv# z44G{9waaUe{>YZV=XBNsx}ZcRMEXyqV)Lm?RtO#)?HV_hn!jd>-Evene2*1;e-B2T zxK$|~cmj&`kBMCd-6rZRl{U@ zT~a;=Uj#*LZ!S@;Yd(Z>eQ$F+-A|%z*jm#)gk-X$FglbD!Z}?0LV-(1*7*s-(>H~_ zILG@Szw{V?;cCuaGE3*#GrM%YClr@1@R!okh5pjBbP+FQHvE#VoV^rkHvW{qbb_BiH<* zjAy`{(IyHD#?>*2$eUzmuK6X>Z60v@P`ku$@YJHB3F%@p#7v6hip_75aU^~+0M=*H z<9Ba>7rZK11t#@=Qf2C@`Dv9mxeC*ON5GHA=ylc&nHk|#*!micSJw1>Zr1p+t;aW0 zrdas6q~!!Ekpx-I6UylUAL`kX{?dWN>_ckX*D*N|8&kLB*uw)c(!A3){v`Akg$_z* zFm+(&yf8-#41K94LO6>yXR=Ed+xVxKF7bJgUE1a^xuxyARPEZRJlGh)SY=@{zo_g+ z(3lyk!9kBPTBlyD4)#_D`$qbQQoB@&HK3AZ0*MnLA%5Jg?92Fk5qu~4s5{}f=>OBa z5Ay8%A3{Fld&K`E2WROTBzg5biLn0lzKQ3HDO0EHB+u*lR^Q!7n$nZ_duNB+@Vrj& zu$1Of!~xc0m?#xAt@Ba2Ts9UmMMf&9%<=B!Z0PY#syrDNsfS=6LSyN?QT71IGfh#= z+vz(p#+TAm%%_HtT>i!EGn6fqfgXm2JHMzIQ!c_0!UQaaU~-n2UltKH;j3x?Gh{Y zK_Y0=H{01Y^6S$Z-OtD1W{aU6#wvKVJM?KPf6s6{;uKD_enX?DoL zT8~jr3wKF2DVcXx3te7_c3%jzode>@ zq34XM4kBKLl;>|?jyljzt8@NJ9il~I#>;K>dvd5oWI6oULb<=2<)?XgKJ!q7a|@nY zfZ3zsi>xDGs=^2ACr4qF4W^+X*J(a54227(Ria9D%f^J%80L0G9~qh%a^>cVDL4OL zVeJ61ceY?XU@)t3odR%kXT!jzPes$spTK*$SGxN?rA!Q*$@GsKx+jwZIJb)Idze>g zl`>GjAi-qSsJd=CA6405; zvx(W&9h?8}MzG2O#itY!K|Yc2n(d>R^o-mAsASes{o16K?R3l90K69gYtPs2pqVQI zg&bOJ%#}-{Gpj)*9c7lej#zl;xcWD8g{b}GYI5+nj>lrW0`r^F;CxVYYM%+x$*_62I0pGt%e|Fe zsaYA>-(N)yR0>*yIf@Xj#;B66YAfZTvMW^}HE&kL`ir*ZmzKJB5)%o zb~}JhVvJxj4C2xwvC-W)lx~RgXq6P=r&%kx?N`7YDa+yZ}*yEwUTTt@_G(vjP?|sY=e;M8j_z)$g^TDO%UTYos zFqi2AT+Ttyr_E-@l4v5csso9Zv70-@y4L1nA>K*cce;wb3y!ywv(uPh6;Hf*8Pt8~ zFul%v-s$6Wz>T*Ut&TCCPy>FKC=V43Ge8cS|Q~E+wcm%7dk*zds*lu&sk3F_5~CG!4gtJ z8NT|5GX;2KU=*gfPZe$Dg>BVx$($@`ZI-GLCDt62y_Hi08g?yEE|8S7uJSD4OUaVM79Is$1Hcx*%9OhD+Zky%ypGMf(-fsDCbhTgA^(naL^dC7JrF^rE~Z$q}EPm>7E{ zDkGX{a;Z2ZYPBu)4G6phkle z%xRX2u)yq^4svP(H3yX%6KHj<+^ji&Y2262xkj@lkgRR^1TroR0{kXj#Kj?sPJYLe z^UVuMJ>R?v@sDY)S$(X=Kjd{X=K@GYT(_IpP);_3!U3D{%BL=*g}2dXT}Na1XV2wp z&i=?_%DNf0n-Fi+jC4i9B*eC`iQaE?D&W)##BL@Qg9WlQ2ZF-VjZI-YhqLzKB?@X1)5GNA47SOfQgY;a{^@X9h zFdhaASJ=B`lJ(jP^5)m(8CJ%Bz$T;awmqzT{ATLHab4SDDRW+eUVF4qC>@4E>OrR1 zGp#%sV(H26Wa^k8-rRG5mc@1<)tFCe9e(RKq4@q5yrJr5)K#~bFO2~LZ)_FybUyeMiI^HfxAA8yCt`(?}Ie^J@RFmzts)O z{&~B$#ccp+r+|Qb1|c?~CR5t(3wlKHc;vCVv4IW`#%JB+W&HJhNS1;A4}eo8Bg~mv+jYTg7K?$S-fV)!$%Q2vOc%f7zmiLQttVl>#xb?W)HIscHU$)e+J3+?Pi-& z{W?RwC$kV+_U*5fli+Kn`_PGw*Rhs_meM=a5^F*8hivPPs%&4A1jlpLhuGkGc;yll z3m&EEaqr_?O2ozAD&3qF%2$P)7G|1~hn?vJs5r5# z7kHwJ;n(f25bWs;$>Qkd;#aoX(vvE|fqA~#63lmTK6@=S0Zz_9h(_5QhLUm$tqg!&`Z~Ixm=7NWpYH3QcKw*d~p+9FzM+ ztJJD1+TL6A-5Mon>jO?hD@M4Zw^04yf@x;By*P<+1cSq7Os9kbK9j>vs=Y(KzS-w( zvzOY@r|FLjj7GJw($9$#L7DT6b6qKi0T%y>1G3ogQhHnLp(ikbGgzN**Xy6DZe&@% z&-AyBtiZp=Rt|EuD5z=PM-`iywbLR<>F-5>>4QjdRnyX;h;T z2LL{cfu2T^RtMOjY6k$-y#g>iG#W%;M_mYYC7{5;DII<@p!gb(QlDXu|2x)&&t=U1 z$FHUet_)`1MhX^IGyn)T7rmdcn(o3Em0Za?oVm)4J12B5l0@QJcNVNWXRoA)k^u-u zpk$45IjxcmRt0e?h|5!%srBnUg9}&5)X{7-5QM9yg)v3)PgGz@2hpkl6Rk>iM>C#j zQdaOMdxGv35+ZHuo17Nh3?3?ITayCWorfhy0zB9~!hIaZI)`9^8f#@R$oy4$S62G4 zwiR&@w6l0y@NY6S%Xx!xC#jJe>J7qJ)Q>i1FSArPT8L$DIfv$&;9}3rNkN1vn9vw1 zJG*hF4W|qzZYEwgCCl+&~(CBY_t08&t#^y>Az z-@G0}?{(}9kJHZZCSaPlRViF6=q486^)DQd1%pLQh*xOV~H`DrRU%4%AM384v!l06c6$&@h_!u``|YpRuA0}NNB zRG9_1H?~u(iUnNZk|gGDO?n55HV5_0+sd~=3-Ci+F;KfewK&qBe;(&8(ipm9lTj_6sc@ZIO{Yc6_A67Sv(TP z9zy(dnlfaXbN1UxS}p~`)pug~tR>TtbY|8^!!<&k`#^zK)X~&3_ZMwf9zK?^+1sgK z9b%3V92ay1-1g4Q@f}ehBD!C27UCOVY@tZ=7RHN*cF3XLAh*z~BL^#Q1sh8hO*H8P zLFcz??kF<63O*2AKCye_wFEqzpy56n{duaFXiGBqyLCej+!U2M1ssC6g>t5OARh-L zm4i(YIa0|977rcU* zE2+}}O)PX*QMOwMJBwccT>68#+$dPFI3T-6rFRybtK;S62O@Lqsu2w|7x;l`UCYB% zBV|uD2S-)fH&#)H$qkwOvW#=Or$Kz#O3o~t4gOj_QCZ~c;%}r=vV-vwThkXXKJ?+1 zLeuPS?91IFgef>%<~L-7JKcOUZ)SL7DhWuRfPToDUdkx;r?pzd6v+5_>mBqrgJpgd zl%zwLn_D&hN;Y*a^}p2W*J;xhn>+;K+LkY2!P#+lI=v`E(l7!t=06Zo3J$}uw3lmg zk7{2uZ%*RGh%p;fR!1@QTIzV2)$v8E!*?TN%z?dHM&)(N?ZX>3?wPKqWHXlwZp<{l zOhTsl6@EdoU$em1?f0wv2J^XQ8q@?+M1Mk-wXQVa=Ri;E^uC*AdCFF$#Q?1O@qA!? zxxxBjUs;CKmcdGsKSpY@=swCjfENScz+5zgI%cI#4N!)p63SOSn|UVV^;2t%_$}7! zHV6tO10^2T1i1edz?DUX3t=rGT&$@Vuu&)a&&0={3c;Rp>pw^NnabIogBhsTdo-Md zN?~k)9j*|+g_#r;A6~)hoxE=2^otP>upuw5J?q}O`uJ2mDRnz_Y{}RdV!B(GxZR^! zT}9kQF>ID5{ss*zA8qh1lb~F4qY3F>fuD8%QOOFP9eaeQK9Q|X{vs-!7d-7*}M znoKW>2$x<%f)Y0(ZM&{=Bf^cN(`QfM`AQp0dF~t=n7KI9EFsWoGs~th>*_?8+BV(y zvGJMtM1QelAV2-e{wRP%*n)7ruh&p64Mgm z-8xdcqklg-Gu9Een}LsP4XyI_C!d8%kHQGY-^kGc4c8BV+Z&>XDnnRbB54n0rKhIC z&?RE5n$QWIu`(RERwm>Y_^&+_JvJ2WAt;3*Xo$mYix~bSOVYuOV0Lu&il5E9$J$G8 z^d|?!*^}Vrl*|xl1>pzOm8))Scw`7qm|DU;v->DZ((^Shq4{1~Yo<~k)I@TtH<-h1 zee_$f8C=6n*iF>+jDOW`PW!e7*-VbOGQ&AxtlIia6w}SV0{%qN3|Zf&^Z|^0VZa52{;J$CPrPj8bl& z0#eGo9@6LrvW2!>D+yGsj*gPyKK_}O4B-xAy|oG5SRFp>O4{w&VS9LWG`8?I7C`gu z{G_SEi7_*GhvM(u#7=r8mGNkNPO`4i_~LccH-}3ny(3$lt*nXG*i?_!IE)*rm5l*5 zlpM2_&C%xiSkvm9<+4>q z`l1aEwJaSw#pyC3k74S(+HjdBHPUi+bV0qJI~;9rB{-R#Q?}PBMlt4Gg`RDQdz8Y? z?b4?g8@gKC%yr3qbBu{RFno|RJO{?LwC*RwHD6I9Azw=jYP;nxd9wPR>Ob6{&7WvU zWjPzFRW3;y#r(oM=ymQjV4xTur^oogI$(T<%-&utc{M})bN4<>B>;;Mn_?I z`!j)WFNG;WgyTO@Fa~KpnGd{@BE9! z@4@v>e28icP=HQ>W&XTIf4NRKe+L1KQSU@EcDKIk|6Wopm z%ktUbwtj)%Uy>w`)R@F8`7TTW#xAH z9lf}_odkR}=UpAm0dDbmMp;Au0Q{1LzZ6zbeo?>8H5@uI9z1~i%ITG*@qP7t0?$#N z$IQNgkC6ehoNLLMpcqp>*XAiD=Af+nZq;cElL>nzys+Ncmoa1a@OgKpg*|6-Md?Sb z;{ZPIXp6C?=Kcq`L*#nE=DOjR!~`DI5#MX4s!?5*>a(u6!fq0bR(q2wD0;Q}EB>@t zHXs*9$jth359Uz;h4V{bG0dRfvw)OeMxLzcuP9;8P{kuDv52x zerq$oH|*%(R-Dyq6F^?Tj^z^O;#6eCb+pxw54G{mihQ1R4^BugBwPfYH74np*D^<# zLGQ6?_F2@TMntYY$b598n62q(bY|B#|7hQw&lzT~--vN=S?fd;rtGjS!F!j_SwE`= zc;0Je-^8bx=9Br|D^R-EJDzsPj#sAH&-l8nYcAMizBn%)|tUOC)X3+&_PUV`?38>1|u`d;E{(8=f_ zbmle5;@2}X3YHWE8Bw31s8VBo_d(lJP+DV7P}qyM2WtZy0SY#Wg?j=Ru%BU7v)2`UMGXb7Fi#5r(MP#%j# z?*{7SMrQa2s90zFH5BTzFC+?4|C1%!K4XjEgB@Xg{GssiyO|H2W-~<>6--y;jowEe zCL{iLSs4fonm?<}d@gM+S!^El{V!Nf#+%;C5%*Z7z2!gK@Y3hP0~hhUL*v;z6QC*g zEFLJ=#UBwk#%GevQL|AYa}9;&ix}X9k1yXkBZv~~px8FJjbw&-g`*VfWz~cAsnnYc zelt_;9EvJ8wsF}Pb>?+8+k^et=EeY))LO zN!AwNYq907A%0{xQLDrSgLuP|oV(M?cm@)btupc^ml@awvBdO{5Q4yxm>xES3-qYT ztpzS|ruj_1&NOk#icx1b42F(gOEXdQlX3W2ZZ;B`=2Hx`<<_0iO?CGWnu`)8xXWOB zODAl&ktT>lcmzMFG3_|hHv58~fFzpLW=?9M>jP(N(z$mMNZ5aRZw;-4?qx9#dbfUr zJTi+f)>o8zfbqg0q2EOQMrNe8HpH0C@Bo340P^V&*jqNduu++7MZ*hkwYI#DhJ$@< z`qE`@P?s@Jf5C*scBIeTQd>peJ4|Y{VAVI0Ir!^qPv$+nX}Wx}V^Rg9Zdz`ivgl0n zUUfsqVw}1vow=o#&C1LKF$YNxb*Z#}=_rjU>Wif7d*%9cM=oo(^#0#w?fxzcs5QS5 zE(frOb^IX7oX`1v89SffF*sWT}PUS(9yRnO##jM1+jLo>j)@F!R2 z>MJwxyf8?A#*CbrQimkFWUs(j99(&rW=qx?9J(+;HR8+>n>T%_qbUFF^dAQ^ygf+R zDd*QXFn1-nQO2Z6=Q-P1LtsLYs&0p9#7w45-8hg!DcZG~%6dQ8-kI!(d0v-pDNM6- zjvZ`1EImoX`k9Vl)g1b4m_r3ft=;Cpzj|gvQ_B3gkXdZHuFOjO{N55(?H4*qQuvD= zHnd5<2!~6?^lqD9XW5MC5-ZgPg)ytsp}}`9?cW?BARLbS;aAVX;@En z%Ym(kYJ8p!$p!OqyJluB@}a>|n=oAv5C*-=1wy9z7fQhZhrfg!DI0$Y@TT5G>>o%D zCz%lN3kZ__NRs*LcH7~X0pB|fzD)DY>~6PA00sDzS1>Za+P$?!5WI_^`zmFjzmZKBH~%*ugVzhi=T0 z;NYD`bGXriv_bnUWahI_z$1M&pwDQp&XJ;d+*j`(xEI=a4_iHphWi+7rJ0Z6=3~e` z(de7>aPw?}@t?r*3oBKO=nDBUkR3qa(;XF?lJ8~!$hptudtthy%qB#zzn$r{1R)x) z*%(i{eR%52gx9vh1lALXk2RUk=2*x3hE^s!VK@6a!W#2xD@HXR=z5?^EM}a~;w1 zqIQcmIA)>wW^hpBDQ<0|l1B=)Bkf$7M99bYVI~xraCD2nquj}u^#Np$j&5f~3>6_N zE>MRMOESX=2);-oGT>F@UEahRgrlS>V{AREMTnTcSH*m1pKzO zqqyI*Dp6E#)+toNO7%H}I%O&+o0vX{fuh`kqU?@hr1dP$FJHF7=|zl^o7$*v>nmBc zxa-qA^3_0)Bemv{g*~X5Pq}C8X?!pN!7pQsS)^m>%c#qo!0%pdHB@Vg4$UX2=(TJvNr~TUQLV3} z3~xdqu24Dm5zCq|`+UZ8Z>@M-(h8gw_BMA>4<_lpPEX0klO#r}3*S(`!9AC>X5ZpB z3Ar(vxWQ`#eIT2d;p3`#`;tN%7qHv}+uOo48Jqj@ll07ULObTKL}->n&8um|P{!*m zdcC!L$?8J&jt`9%&7>}&B_A!cXpA7o61>f8fTZoH@#(4I3C@N`YP#mtyyycYl!EA_ zT8g7P!IbjR`T_&;0crVJUHR0Co>c0+%q6ZpmM()UE*|++JmFF?ReFQ>XGoU)N7LOD zu6Rzs27DIrc{51A`Mu>>OY7nsfx?7ZbzitCWed_3F3!u^0WajQ}gxCeb>7bE@- zaZ8sIm0#2^UdJAAz`v`6D=b031r#Uk7`pHv3C-_$riYa2O3S2Qoa_OAI=-0NMi#!W zj6dKf{vkgVyhIlL<^X#Q)5vm7 zI{y{Iv-_Y3fk64y0){)~rp(aml+G3UIyqRqm^fp|ZXDVet&i5Z(7g+)jzuGO0v#H2 zv^Wy2uPz**Q5a8~U1Xn474$F1qYWV!v*K!|SmKnG;^nm=T6g}|7tg*^5RO`z+&(`R zn4-~zttxPnU(Idy8@Ot7C#*9JWP7He%~dlASJ`K1A2+@-8BLB(m!nBMa25GoHC<%x z4pk;L|UA`KV4QLJw?K@(|hbj}%M0Gz5aeB$sp{a0tHD$_n(WbCMD%=vUVK{tm z1Nrdd>rYRxxFJ+6*F6p4`!)x8&2d5aq>E7N?X zY0+%(V|I?^1fdSamX2zb{i6NqgP0)NulYrai6111FQ%*epGIml6dYs|wO{>EqPHCE zYcQH_{z7vsPJ+3%z;NRN*jxHO(%7M`uhvGnoVvR#_P&zs=Iw+~~;B<6QbnuX8302lc z!kV>9l8$Q&Hkjs7nyP)|yq2jwdz!F7xp^FsmD#YsXMKUs*#e)8<|ceu&-HF#kLC@a)d_DBE|63E^DonGd zu8IzCUQTP`^ASQdD!THhr1zpnajRmctns~Rcg3wPQx^54XAxM+B4}G#W@qL+Jv+ad^m+Xl_Q6ajDJPA za>Q(&#GxbNe3dv2gU8xzsT?02 zP5DnST{$_3YMeN9 zipd?QPmNBkZb4upIypME1x9qN zsUOe_zor-Fe}yoGBt+<_`Z?jn4_FsyYM8T3riSNmr)~sJv%c>dc;$JtMR%>T8c00J z?_(7veQgMmTok{$*XpsTK(kIE zen7!WNk^2OQlieN)`i_Eo%!s%f`J_?tU+OwAxta%O50b&*#y7idaa;UJ&3T+3>o}v z62-qJq47Xx4S{!K=aN2*OZqxt9Hg&>@~_z|7+04O9ua;|oY>W9BTJnw0+ zX5UPMlkr-E9{QT*6KI;Bv2b-^hZiDk2z7el{Xp8+C84s`B~;c)eol$eS~GcyqTE`u z8-XU_Iy2Rc>ki`)SJoq`vc7o{pkjd05s!OvL{Vw&(E3h}ep^izFg1JTPvzLg^7@>n zSg>f_Yjz<9(6)E!uHLu=aXHZ#h4E<3)`U&2^US3p3Y;TDV}URnGs3XapPl<#&4oU> z$t%yM!Kc;AcC3 z21#gMqSsA0{?NsXIn--zQ`9&d2t*>WG5JE6C`Et=fTs$WT>PJ8sBEr6`JMtK69&m- zvLce1fSjWsaUdq6&Cw+FO;~+HlUAGg-fR9rwM|ePL^8GA?Oyu4S%_5rkz{kt*MdSW zV;sc~An*)-qX#wR?JC7htLGQBtn8eO#-UDDVF{ydivfduf<*Q{Zq!1urLK7WvG#o90@?hEuv7iZB>i`VFbVtgTSjqm5p-%3wFrj3tUI}52f*2h25 z&WtH;XisvlGWlstn8yDNz}RQcx(x@U)l#pXSPC>UOg_;@ZkQw|}&UtBR&GWTfWeT-})ul(Vh z2?MLQ;IziqpfxlsC{qO{rEq8!&o^dGR~jElfd}jMlJBwAP}h-ql|-wy9^IWmyJW_|c zUXq5hr*;W6g+>!zQZ^oET}t zJ0wq>Y$k3}EkHr(HZ5Lm_c(_$rXSLnF8+xR=l%p}*=8@df{1=K+>tT{f;W|1(Q8d9 zD0;cMf_!E%&sXt!fSk(g`m^5cg1JAl>n};5dpYzL=Dt831#>23OkkUl+1h?+$l8oV zwZ~dBQZVi=I7r=-SybtnMJsllCM!nKG+FKrPWE+JWQTM)~mb>voJlYFGcU>n^??*KkZ5{O%)|`KAj;PK2Cr`cWzkr6+nC>g- zJ@M7Sy?HyvXp98(ji>qL9FrEaN$i6Vd)Q-4eA{=%~8oAjpL3V};YBlA|~?=94I~<-znq zma(vzaRyhp(0STMeEt+!k6_zw_kisX@g^$hj+W1_Jw(d~m_^HJfl9F*qoYTi4sX1Y zt%Et8PN5H-`nZk3S!|qU>&LtMhir=t>3=jCxZh*Bs65#Pl(jb9J1G zpUVF21YS>kr!I@lkd^L7QA{lq;-65i+4IWSgt?Ep*`Kvsdbm|j*>chKbc|Au7N9MF zAA=J!CWG<`n}>G2v&R?^AGiOe({#k909|rMgZKNdm zUuIebwEJm#=aF#_PBjemAQ|O&HwN^-hIgqcn18#J^*?Aw2XvGYa>J+6agMkVB-b|R zh&u$P@!jFbE;kbJ<)mgv5?KxSSdml^Q9&;12cAE2v`AlqhddWBX0gUV;L_=H$TfZXtf_yDOI7p0 zHTm&p^E_loIV|ds0bXY#3%`h@^H&}HOCI_0e^9=M?Dche{W?FhKjo)m*N+>_{p1w; zBv39A27oV)7;lknQK<`8qrW*rk$N-CsUc#EhDX`uJRXMlLl0G^Yx0EeKjR9gSfuUlirzhddlTz24U7eG(7b}cb2E_t=39r ztaPjwNmy746Np2uGC9Eu#*aJ*Q=5%dV7=z^Fj@O>TEvCw%A}54Lqvbap$)`>JhIkHHO~NCCIl8$>0X&btNp z9|Uh?7dcpDt6O(unjeOnqYY{t#MD4o;e&+z#C5K7Z9K1&T88%y&n}+8*NqX^VD$rg zTl#M*J^sLkL?|#pb^gigW3!fVShvmN(6?6t8#+!=_M~+47N(!@^c?`TRq}#KO!lPs zO~f(APbW*$93a66fMk#j0J%MaO49@50qz%xu-qd(ykc9un9ZIva^Bf_d7RLA=FPV6 zXKcPnxy+oV?>dRLx%#%`w-!$(XsRUfzoCHD16u;&s%bq(dA76sJA>4cv#ugmZ`koI7p)M=P1vxrmynv$fCme`}S9GLX)pk^SctvmR zNg+jAKDz^TZmYsJXq`pvx$ydlT>T-xn`BRy>qBNFQr%&s^|S(Io-n9$KsfjFEp zEmD{J$e2x)&rx1{n;B4n$A1to=9`D$IvSf4rs%@K&nF1?Q>O7EL!Psi?RzjOO~!8y zxIQARE`i!?EG@vnbf*z*!<)}wJJ3o(k|bhwxgu+a>udui) zA7Z_={4EVy-0Swqa;Z!C{*(Bu%PpR!CH5!ggAI$&v(!>#ogF_#A^E>a&cKPghE5Q= zvi20S)rH4u3rTXRkStdvmMaqysYi3>i9Ek3c)Lmrc`4D%gkegsBRTK#s}C}|Zp9b( zU$PA%w#zX8lC{7kV}%|jSi zGn0)047)VMGTMU-y3QLa5@770XFleHGm&qrLO?LmlWBY|g8_&~{HmVM%x{B`rX$o3_tFpg+gbz=<#$e zVC_Q~CAb8cRP5*jd;8Yr_kL8|9~7odv`sN;pp^usn#egKz6Ba3k$!Yl~36=;lg3 zhOBn%EgFSg&r}Cj6pgkLeHmCa>-idKsg$0{KcwZr%xJop2xjWM3?CNL;1ao~RO3dz zZt7{l|D%y>(F{EK?}-smNSi_lWD@Ojz1pv6uDZ3SM`i2tIXfUh1QZ#eMlIW1!2;;z zR&qt0=1nv6_nJJ{A=+BcjO{N@a)yM)12}-xzW*Aa{i@0|h402X^h!^mZyK18%H{@e z4iNu^v2m+sQ=#kI8#c19ZCBa)0(S!W_%sSYjKAw!r=VSBIuyIGBP!cBRruUSJj)My|OtRA{}8(VS!om{Sex{ z8k;{EFR3SE6=bY}-uh4>zYPQGorOu?-@={cq&vznP(nGqUeN!#oJ;VCu zoHwmEXK?l946y!U3D>1zs4DrwHg+0Ti+M`d0>is*M|!cey(8V$NxrbXxV^N!ew>e_ z*)RwTROuM?QhBX4TJ&&h0hc<`tv;>0Z0Zfb{x#-MhcEY;^_d+U?U)`C)MpuPW`4$( zQAd0xqpd@_OhPtrwVN@~3vezsKqgEv9oL9_BVWVK>M1lo%J$b7u2nNTG3knUc^$oe z2?o@&BmK2>6&C$KxGEbNHq*e+s*+F3WQ{vWRXPKB%0X`QKGXaZY<}P8GiF=udijja znv2kIPH5yZ!)KuG;0{J*kE$obHY0bXXJk${E-LVi7tH=KRx{;5hV9$EpzZ)koA2N= zMy7Tn@^udq(`P!<<0C!m-Vpsn-oq-gyP`b)THGe2ITO4wyGx!EV+qu8xnzM%e3N!U zxpHM3`coUzsnpjQ2U@JNFU*Ydk6lArk^ehZwErgwcm7KbKzWk?&b*!P)s8Zf_|9*Y zo*#>kcs0*7&61l#9&&Pss}T>!|0Q;aT&-Jjo5gb2)%wcja-t^pp(e9&?l-i1IW$7*)x*S;aClli zIF|ur_h^T`L;0cr#c<9BPaJX`iQ!bsye;n9vy0szOOmoXuX<>A$U_6d_Y;lcB(G|= zO>r}|Xl~qexj~A$Jam@`2$^HEE)|90b}O{;Onovv{`L*H*vc(t*$fhPVlH0Kd|Id@ z)h#2Bxy2lbE{ZYrfO}Ttc%d&6|B7(ce$IHBNl3Q>IWbC>j_rJD{E#g5 z{hd5sHG}nH^VY)phq{*FE;e1#W~XZP^l9mxoYB*bb845RcfNx+QBn0_2p%aqIVR92 z{k2u;`r*k}qqPI_g@rs|VzqYvVkvo@7{29xR!YiX|BmNhE)`;cwQgA}lf(m_TzYZS53mD!Y-W#1G|v|jIlr3eX8E^Hykj6eLj=R$3Eo|-n|eojWHsiS^l2|2eu57hA7@(PD|8R-mUd&`ZE1bubyIa)m=W%Po4jSlxmlDoeU@Za2g^v!mP) z@Nz?-RW3po@x7o76u_uz(pE>}-s4A%05qnO3)VUrnvVMgk_md@5V&01G1QBUj;fnj zR27wh32RSfa8Z?1I6j$}(8{5e-IQ zVI_%dMPLTH&{_s1qN%f7I+FP1!w1?w{=Pj7B87JhfTh9KjPXi%${9rA_WD)L?512g7J=xw5L;PKA04dzUzMm+2?BZVC~JQs!IoArlik_TuH`xh8`>xigJ7+{{M6MKt?>ZSku78n1v&a=Mgg-Z{6 zjn3LgZ>@*_Jpbvc7&IEEm8`r6sUv49IRZ->IdgttA$DorG;>THr?;LfG7aBLr zvW%gC?fi>_ODXT{lAewW|B)a%J4uk{jwj4MbNA1r$g{`K+6lF@!s+b)Tp^pM6A1|{ z?Lv_tm9o+HL0Cl+)MZ9UnJMeaOaqLf&#!E15um^4V`mwMR#+$1Pc2yA&_$-Kv{5c= z)d}#zCMbDQVYNL8*9H|M2$GmwA;6HqhB+JJMF7Bruv+rDPDpgF6TSN-=3H*^D$2+% z3P2@S_feXqAL|nib=nQ$4z0h8Y`NfOu1v%A=?S%vU zMpoJxWu)B3?FGcX!Cp8OZL*hgzPVX14;1h<5T$zVpIR}<{7RKmZ+cIvKy#R@C9|2M z_w>RY9Ql`2b9hzV;Z?PVSJj{N!EhN-*Lzln^_xyDQO@_(M~jGM1&O}el}@E;1?ld% zuQtv`I%qpE0wB6Xl{rb(KyVzE)FkP4JO1^2)9>->D{)|?jGU;IvEcdgc4?KUdA}?j zvs` z@j*<0%#N=JuoGYuK-pam$-fPAF?-JHZo0yhnRWIvj4nF6Zi-LDQPGO*wq!IBD-;HN_`#d-HG_cS}o`>#Ifm zHpb+RbY>NoSsFz=wUnoGg|Wez0=~PHLAX1Yx(s-JZ19NTxUfro5`U9bipLbhpbO2f zg2N`uxniT7-*p9_jl>nE4RxJa&KDb_`CV5MncwvglX~&15L&I|2XKaUKLzERYiR%d zbb#a7;nWdlr~0Wj#qtiW4c;z9`9!wPRxu0Tpq)#qkh7%vZx5-eIUWDhdRO`@8ejdT z7fvH?=_(~tgFN|Et8tmZP@6NUG4lMx+r01;HQ2VQ=2Lm?YwZXa?{j!dss5_(2^fwT zj@M~S7ghGuUAPzp%J>T-sr>kcji9d)Px1I2ua#EDFugTthA-r0qS|~mpbbym7`BY7 z1B~(CQ!MvA0|HVoA}x^mX@K!|!I-OKhG%J({J42%XKg-1;Npp_Sj*Y|)ZYTV)X~?g z8oR-+Ix#|GJomMjQD0O%!J%Z`kOWPJStDt+`+*0QS|STlZVx*>q=L)ALi148$XF@xt6^?BF@Ype4m=) z2WyKzLW{30_FjKPYm@&{Mn%ohtYc)qF7P1Qn$oX?1Wm{+4>;uF$QkGq#7-TZ5q; ztu+{{)VN7@ly{jyh8MO!5-+~}(Ve1AYy?dQk2Q1weW@?A@%ehYjyG<6UdnW2XE#A{ zE<>8oaR<( zWbbes9N@60;5cosaJ=sS499Di!7;jbIA#MJ_7ohC-YXn;{GZ`?V;3AZrdMTh4UW*s zkl0{mm*xTp_7n)G3xt<&7`&73rxA3q>z2^RZ|N#?t0TYoGUktzH<>t>>-DtsYPC6j z8@Uo4<(rY^#a)>vCxTGN#lT<-N zEUc=|N*eM(3bcm&Q@hUP4S9c8rPJwk9Sz}q_lBIEG~{FLLYFnlmR{f4kVCy8 z#3c=}n2v^6SPeNRX~?H2&>Hf|cAd)`@`>q!=A^CXF)-z-Vh zA=T#-;9ryKG)ML_0Y1}J-4oMe{oPaiS}-b=9Hx4y#Gb0;0#%|Z{zVE{KE=P#RVZy3 z=xoE`p$$YPZLp}0uCuVJxk%OgjB36{k#PmQ)X$JS+JFS{}5 zh^>L!^#s8MK#z7nkI{oo>)2%gD_H<5T~A9F;MY0eI)9$ihWp2Y8!6QICwkdr4FKey z67minER*;nf?(BdCXkBw!- zx%w*&KS2fMmQD=ion+74(#c*bnm(^Ins#JfS25`hW$nH*0BHL z?XNZLkEFL7_Tltc?CYpwnvSlJ>g$LPdv=L!R}EtW>}rUj1-Qiv@SPp&>6kX`X;9tF zI$+O;ihQFer2!hSf>3~Sx21$2QwNNK*ny8+JA&8+LXJp82J7d8(I` zO;6?1Q~C5%K0Pg;Ab(P8PD>tJf3!m8?`P&|MZaFQ(0wx2ITPC=*Tfzm=&O9#OJ;|%X5xoaZScAE&x@YQ+1N>k5wkXtia(Q1Ols|h!$35ZR_vd}*>3V5>OKci8X zA^yFMdZi1XGlhIa+6Uyr&ZsR~k-o*`mMp4cX<7Ig>9M+IOZV2Win1B33j?V36sS+` zn6n*wzY;s1*~F5%STT&EvhDwp8K|oT}H9((^V>j z$9|p7x;Qk8$fQ{o#gquoc4fO%nbzerMcTUDuU+f%#?-s2r7`<=Hip3Njaf<>b3nV; zWsTXoywok7r4rb^)LW8L=k{9a!Cj@&MO!<&=#tPyL?&HiQOP*aRTkEGJSFL(!zt3b z=&*LJ%e&~%u4->gkImR3PEhwY>Se`lSM}F^r_zs7-V0k32Mt#mytUBExxW{qg;F8I$E*n(gFIt+d}`RIUOE=56wc0U6^+Y4?eWx>^gSJ8sg;sxikT5xuq0k#Xg*6g^HP#gbmYlFDktiGfRKrq&! zow$X-?zrXIf9Hf|i%t?L95Em3Jprj~Emu%IU}5#Z z->UvEQ~&kUG9y~zalFKCzR$9rbk2;JOO0R-!@!u~q)O$J&z1NW0Yxgm7FJyrG#RrZf4`&N~0 zd_;{wj_mO_#baDP22bg#ig7>A#=U*G4CBEuLM!0LP@#evcMGfH7pY>6`|YZD4a40i zQSs9WO)szWwyruwAM3(bf9bK~MIW#B>Kj9Wu?nG_i<4tS0BFGh+Mx%igwq1g+!B;J z&-@Z}uK}oR0#y0*R6aeGPfyFI2K>DmpmWl8gQUGLJsW6!xz=dVa|q3B1XKQvUby2+ z$Is=>4dnq_nMe?>8eYgm>rIF_gGSNnCB^G$@q*$d zg2M6f*`dD}`w^g6ukD-}(NWTY}E8TA!m@E+fge>17F2uZ#l2GQL7(z|1QbH~^^IUu8 zmY^RjyW;hk;`Ow6=)aQboMSS*0!98`Mh_<{Nw%`MzL&XY@TC@h_zN zCMjmfrwJJ|U#xIHsNK1*_YOf`Qx;Xe0&4fh-We}?<>yTP4L zU7^n6FFkf%rd%wS$~}!uVN$MPTejIb1Xnjq(}KNd%d!#9EuLElt?y{{QBO+tIrPWaewn8D*j~)o{u`m0 zvzh5%X+ShuP;b+5|PQ|0NY^7K@Bda67< zRi2(IPfwMnrtDBcLz zD>OXcRRUtD>G(mtonB^SzNfe2)ZY*3?a*>59e-bMTgwQv|3GhH7;%2I+c5TZ4&(G5 zhEY>plCohqzeRcN;k-9Jc7Z764nDVrO7lK&a@j96Fl=bnAquKvEUb=svpVL(^u|vF zsEFmC^0FJT{Nt`_=`+#G*Mz=Ik6oB4mpayC*fsXJ9>ccrT8E3Bje*ZDu`BS*ErB9= z=9fS@JPS)KE1tzA#?Ro^XM$hf>8bDZ)OUL7J3aNCp7x#E`IgrDETwL0&w*dkE+5}x zX!@_z2Zu1u|E`y#eyg_uO@QAii|EZd9tv9fsxQMZYQG>$ z*Qi~*mr)D7!>DM~0NPripju;LwdSs5)cznSG-`4iw%e%vXIHh$#%x>nnEf>z8s^fS z4i%L%CfTL8+B3KGHhbom-fqvr(%tqfF1>@Npw?%4>N`F4ou2wmPkpDSzSGmbQ!B|3 z?lMcM9qlpuGp+J5JA#J)MLlpZL-Q~%&SgPhl7#uF0)P1#1hToG(OZuOEzR5X zUdQWCeA^x`SRR*lvOEav&hh|yXL%GTIdFTH5v4g&x=OvQvs41Rmr7rFseOAbwP$&$ zmv@#*VE0n*NlK0OTIxVosqkR0V#X#H7uh9B&;)&_h72C860I5zah*vWTq;FtbnO$3 z?z?StJMXCzs(ysJoz&4a%P1kcW~sJ;-Hk^z+yySDifh~S{<~B&Oq^?5^uEOai#-L) zy@I86s#urQzx-6OrmGg%6pz(1?zjUF%a^99cit14te~21VO94&RrjN$xf_z|>RQMf z3GKF!$Ga*9>px!9c?XB^|6}h>z~rc^{^3qlud^jRJ?Wk;nPy2SW~M{JkdS29F>GN; z*aOHaAd3{#BqB5&2q-895m6CwfgqxyA|i^SAR;IrBA}omAc*^mfNXAr|L=G1z16p> zdnP#Hd%y4hJl{M?SKak2_uO;OJ$ES$_!b2i8QGhMqAPl8}JKADeC=Hrw3 z_>_EP9B_&HX)uCr4K66XG#AX{#pfeiK>KXNmzmT^yyASMZoMx+P%*TrpJpDC>)L|* zo4FU0f6l-eXny-34U9BPfA0zR9Gq2k8+Zs+p=bU8RDcP0@c}0MP!SdSk(o>)na-!A zlUQ&=>*3bKH3|jVPot<+E8KU2I$k3%auf*O9xrOhTu!QatNqCC)WbYW=-t$cdFnzc zV_uCvGDpOV8kx85t6twrV~UsZWAPux)MC78h3Yj7uoN^s$Sy*@I>XRO#>N?Bm#Y0y zcasmP+C7?F21&MrNj4f?nMV9rlMJ%_(n~|%+$jPUGv}4;n-k5PHT)kb_&??Y&2g`W z&uHSocs?bb_(1s7%$eVok(o0;>moB}etx8J=DZ|=nX=h-*X`#FtfH@?sgKk29gXLG zL@-smpAX>q6M3d;4`}?DOgx#+C)4?qbm9%UVqZxo_NvRy-ayTpNtXo`%|4_9SJQg@ zf(FKCMDe2;b5KiYPw7TpiuigXL(#t*ie4l7Q$mKKf4A%Ht(sV3P>Vc?3uN0;^!!+g z>VdJ5djAL%xW3HfV9pu`%+E9! zc@hkSRLSNMs6u43DS*Qx0N~I)8@7QxZjcP|O+f0D%TnrzvE!&nHDE_|96TS=c*>J_ zLWq?^UcRft@1}@DzA3WD#-Y^WPzDs!AJ$OhNhlCOYdk#>^(aL$F5^##gIYZfs7Ev? zc@h+)T(vJhP`07=Jvk2M+;PDCT!WD(!Jrda6!{yb=(Gr^i=Fa$=xpOa`-O%kPeMai zwV?4EUK`+F5P|knr+hx4$^I00!1lpvf$S=ZtrI;8xKJdIY48kEQAn6*pcCnFroKNN z4N!A%NU1L=H5euDj^OwQr_7^QRL#wNbb5yKONHUD_<*YWwZ@Rq z#FX)TN<1+}e+0&~VU7J{jJk6|Cep>pk8FyfUX7PVMO}@cipG0y*m!CxZEak8T;m{5 z;()%UB=UR$;jXX=w(zcrK#K2${0-_R-A`y343l07-{;7kw5pYxI2`o;&nH<&s`ivB z8X6ajW>peTw9)!%Kh?!Vn}+@e1%EW^2k@c?{DxM2e}n*zX{m%+`*F(j=D;NE$X0qo zAB2A4;+;|68r9z_RG;PpR6irnRPA^2OxK>p6DWryFgrPv+-S@{=?Ow3g#+ z;$6Uqe~{x3lfIoqKtSzf2&rCH0m&a>8qWAR-sODjrEGtcZ_{WgU5Yo&kWH;2kv5^n03pc99~JXLCNrAMlz3u-KBwg5v&4jQaS}*dDE^rb$j4vgnX3I&p6S~E;0aVi)R~>AGe4iq&nNTqDfvkf zx>JLE7`<^F@K$260Hl7Nq*6Yv=Znb47x*Uf@kPFge0&aX6U)c7$WfP%^BuXe0=9r! zxS&N~7PfofKLoalDq;(97af;Q97aLLA7r@~xzuViHzoHmbR9Rra`#R@LuG1c*}e0X zI&xq_+@AY#1Tko79C22%qvkh}U8**Yn9n>1#zKVtruoYt`7B{#jt&~~nfDR$54hh1 zkRwZg_SgBc9Wbs_GlyNUPR;=Pp-m6^o26aH>5N~C(DWszOozMb50LEP;1O}vb!L2rp*7asy%BsviGzsK-l zJn@nEPdepKkR&BPw)fez&}{%Bb|o~5Zi5Kk-y^2nKh2Ax>-(p_i_my@-+{Ec2(QL9 z(T1x=$Gt?{Q?-|g>bt{qqwDNcBi|s1(IiYtkltA}-MR6t+NePof zP;9zQBWE>!ielausRg(h?m~oQGu%atmL2k<4jw>IH!-*#R|h{qYQ2$naLT+>GxTRJ zHsMB>CX}plls;0gKQ@bbC{j19Ec!B(iQHgiy&9uk!lWI_MGcI4CUD#WZP)-{5Whws;(=^|k=^*9!LBgpOgI!eYBVH5LCN`l;H#W7spASW7&yhF;S$ z6wwRM0;Uoc>a*VyQ}(dm)e&vzVb4U+ywE9sj%aqtG}lP9M(#f`tRzfqpxxAFxW5?q z@$F21ia>#Z#f$iC1M79x4FgNX8>J($mbQ^FA)+%`2gY7N?W%!jYCVsTZkD)2Jr_aa zWT$)+(NJ@Gd$uLIcfFyiK1+&qiI*bPo$ZuwR@I5^W*G%(T#+GFCZ^%V_Ss`R&G70f z>EKl8S%zey&xW%G%Z7$~H4gk68vu^`7($t`&NWOH{y!t|0o$I(Iptf3jr7%te0f^3 zz-o&98+@Sif=wdsjHcK#o==Hq^E--<>BLe%;UD<;I`A3U6f9iN7xvUQ_#!>k;v=ew zYt8>eDIpz)t7;QYnYU5PmWd`l$%ZKrSWG&Ap3vdSGgV81x zlll2%emPsvZZk%97)lY3A!-7aoI7&#DhC;74zbf@^T3r(>!-xi7HkVHwCM1k6H zJUm$Q9qrjh+$$iW9WSa&41k6jDpkFESekZq7;d&Nt2Kh^Zch1DqDsTdBX+p*!o+yz zFid>F_4MH1fPn>ydc}ei*DKQ^U;u*t+9jG6r~GXKH3qp}X|V4b(2U9{Mz!#PUeGGf zRIN=jjLBpi)A?jNpOQ|*Atq#GVQyBwT}SX{UNjvDs+QjlloSyf838j(d>N#qbn~rD zA+e~I*^x!|I0kzc%GTvUX!k?fzazBEE{w`%+L_P?_U}tC7pIT%VlTI7ZnT3uh)o9{ z;Ko#WrfSpVnXcvKnW=TkGg~X*Np7$hpDf2G%kjx_e6k#$EXSvmBljSe>|3pg8#L~a zfPQl2J;n~0fskV2@!-=;guG2SPdkJR90-GZg#C?|l&AvR(ABUBg5WlK*`|CebDbu_ zZ7juD+@5f?rVlmLdH$$VzD@Y7w$V|x$W~6qH8;CJF1R_J4{)=nsb@5~z<53-p4>q1 zRI-$jZ#0l4MwVuWRPAgyvqcy+2b}Q`Qk*H1GZ7MzY?0V>yK z%4p)ucs?bbxI?`V_l$hkMdQAJC~pnix8=*0Xv~FtnN%~+kI?ZEr+f$Lkcm~3L1d;z zPo6{%S`PxsvD)Za@OC?5!zrdEbF`x@k!!G{Mk9DU?3BN6@zZiRXf_T25r|xw53q3) zjTfWIKF0GY@x&AQNbt5TSSZN+(IxHr1$Z zrcq;3MCH#!8hoY?7J0RE+q z-z(^HirMUZw>DR2D;&4r12W(#9K)GDlZi9a`IL0x4(+OOx9(`zpV)?T%>xipLk2C_ z1DPgf&T_nsKi6D_)cRdy7xi!S4MmC;&W9c2=_1J^^*k}ittns~pFg0W5)?g^$MkLz;> z?b@%pi7C3UBtxfIcx=YXLOhmAFm$vAk2L86Fq^rl!roixSBLk*19+>V4i6o4W#uEu6lqW?aFEwgPBQH5Jz~3So zuWCXguRStg-U=EYiqMEJ@}RkR-;v$b!gl2SM+W%D(HQc01Q6>y9u@e!0BP-x&?W|! zkt0qhP29%7w{*tR2>ecntF4YsCO}bnMjgF{sBjH~BLIEvB5X1< zG?#+QCE;Jt{cB%|DAH?L-u3^D6lZ;UvrTaQ-saHM-hMFMLrto>iOt2{@w!Rhgxv&v zu_a;7jR$uTcBp4GCU@X7(!gYMVls=EEURNOv7(_)4|UiRk-Bq3(e~jjR`K?kXtyP01bGYv?*o?K!Fg)KGA=m$~C1R!EfEc{X8swonSi?N7{}CkdyLFFqV+}4+W*GF( zinPQ~#>3YahFb9*4;dMIg6jq9N0E8$ms0hX?$w&}ast$u`^Ial{tdO2rPCfHwxLe@ zw?OA5U2DG*kuxPJysyhZ-(Na;tGsMK`_mrLOpObOfe7Kxi_ z#q|c`^z6RiUddc0^oOmU-LGlq_X$kRGsdHR<_2l!r;GU)kqL)+;16bu-;&~Bn-zB`o`l-zvj#wmasW9Lvv;e3+~MEI5Uu& zkTs$gKBicc2*${pP)6ge&%1-894G}>2vOT2B{FUr!JW?{p;(M#|4b~nz%63y-as6~ zejLXU9~)@EQFUp2<{?C7l3kiM(y4}5zmMS2K8LN&JNFE^X1wIhdnRtuaIJBB3qTs5 z{-2CX|NUb@or&AiO>2~bxUxCB0YSs4_gDx{l2K?s>b+cr(yB+(;oTr1^YkeQ2i40XX43|W1M_h-g&TN2B| zt2Lu}%;?H%HtV>m_UB!jCT@~yfcWz}K!X4A#3pVNtcTIH7E73x04Q7M4a*ucSmGlc zAx0DQab@c`@e#c*xFE)lzcuiqKe!~8ho4iA^2}HU`~tb*&!jB_C4Ubn7C}!EdZ;Jk z`0{ShC@!T2e0gnXG*5S+Oi$h;8ew%$a3{dIKCcxugcuFU3r0=cWM>A7wn5YWzaVV` ztx=n>ovjpY|4rr*sSc~HyMvu2ZmJd66C5sa)2z4++P|HIW?OmvZ$c(!H1N1lCT8lP z)0PPsh2z*_11%Gqi=vYT4ByTKomRj3ijcj4lpGT2H*sm%mYj*%(sAit*pLT8ApjN; zK-9K=N)i^w6Ee&^ zu*TDkqXUgCf595k5$dxW8M4MK-U}S3<43VPyfQeNr&~)X?+}hiXixC85Xjqv*Fq%1 zF~uk~UM_4JYSK!L?R2%FFEav)!ns_WzIQjVYvc5t*^tNB54Iz1BkYG44X%3<*O^BB zUc`{q7Wc3(MzlpKxGI+CM-6$pgPUV{e%z3!M|&^swR(GRa6ihq{(XpBi|>AhP1UFS zludm9czSfk2GpqZsj|_d&lA(S{h>PbcZh)9sY^keGq*KR)ZM@teoi#Xy`Bcn@YA5t zJiVGTw=*T2j+C|`XYR1#`h)or_kF}gkTr_*+g9euDpJbzHAYqr0KB?f$LF2A6FW*t zDL92CT;D|!=4)FtpRXx>IfcbFxsw!Z;7NSLIZl<(!#PeI-)s|n6)L<|+n}-$bDYpd zznpl4OwQhL_;l|c2x3plq6>EBbjnKBq0@5}I zFxFn)WNnuBW1B{wB!SY`EgDAwF-{}z%Qj#(g2r(D_wXh#czgC+03-BmUPKt7jNB-E z+%W<}>8Ks7xJj~*KGpM#ZoiXoLz_j(<`N4=DR@k9;ceK4UeizBX2oqpKM8SpBZ7C%vM*z zz1(WVjhl0XbHMLSNC)rmj^bDf;&kwO?`R%F$Km7A!JEI0Fm4OS4riUrt{|trR>cDDv)hLyBq3qpY||x1}|nzDV3+HUn>SH*hDd_gWGkH)GC}MK=9< zZRY?eFw7OaW^;v-UfVekc_M2&h70>|y!KOb2yUC^U$6;r41E>HAmsY*x1eBVC~+Sk zO15XLJBUv>E@rVv=Y(5L3V+b5(6}Wovf?J~mXP^SxUc0Y(h}~O`8Pw>ICEix&tc*% zGg9|E6`K;l^u?$xl$Utjr#6x0Gs@)UyO6T>`_{gziTBE_4|XP?kcd?Xxqc84%&D^Z zvH9N3^}z?5lt1%Lm#5A2Hbe8>k*X9uyiPwt&%{jRo+e(N!oT1())(4-YX9m?%9Xu; zwG_Ccq3?}FOUhDYLal0qjDU|W&ZrV5|) zNM976DA>VfU?*-=z@uIaWocW|5z5lxLhgGB_v848a9sh#Hj zEwoRrLdf+$j;iZ?{E@_6K?$aGQkv=~C7g z_9wO9wT0>)9{4eWX9~>8{Zw*4O|5er!>Y9m%uuGbh=SK?OTzR3* zF*f^6tSj{Y$7#EwL5@qoLxS%okP;aOx`RJU!j(+0$EBVizawDaCL8A7fpX&PWnc2X9ezzc+2aXQ4FZ5X?MJ!HiS5d0g zZkmDCCT%m&Ht~uq``?(+aX%typ{?>tjL<(dAXo~v*d^K`e{RS#vDqTy;S?hqOIceu z9xDCy9BH>(vJ{*Y1IkYaL^;W8}jr7${6NX1|o9S+t4)p@<0?oUqch~n*`B3 z{eiN;`Hcc2+#4DWg&%88dwhU|hGUN6#}BceImVCcWBj6xWRNT1%1rp`V}=h--=ey zmb8Kns#`(b!APv4ISm!{1P36G>u<%BaLgN%xVeanbkd0jKF~s*hO&PpfyZS3Kj2cV zt#6Fs$WJiD8TkvrXFXFijy=I^v2t%TlT!Js zDG`3W3E8*SYd=6_LfKb-^j$44uvxFQx20^vT3op1bS2@2vaOaxG9*&7a?-w6%fEX| z6Buo8F^uP$z{tPFFg97z$g3%q@xKwg`nu`s+Y?6U16IDFFIqd1OTnJV;rd_Vwq=wG z_br(tS~pmkdxDcB^Ou>~UfM8@-!E91C++x+tnFSx{KGko!oL)0hZ_W?ZY$1s)QeW! zq}LU!wa)t^xcpJzJ{IXy@#FcwWNOTfwsk^aFU$I)l^!Jyo zxJmZ+^}$xC-g5HD+#B)Z3vCYadn>>M7+<=(2_fm@CX-jZf1XhL!H%l31Q% zL!OC;XBkV5GkxY}))wk8g%iJYQrBVe>D{JGjkWVceh|R3+Kv$7Jb2QQ57TyUiLSPM zslOndp|39L3ZKg{KJJ0vaJz>4*Is1ZVY|jBU9%hbRSNREQ)ah7N<_8bz_7@dXEngY zjY;|Xp=rx4P;1@RQ8wV#gb}rg_hU9o$VM6v><*5K<=LhoPfx@B9Q7y&h(u`T#C<%&4d6<_S6BkJ8r0sUFZM(%iSaTXG>d`)- ztt`BIgS$|<>(518q|x5eO|PVX)XZ_7CpGmm7iw$isD)EWZ!O&}j+5E(ussuO?|o0h zytR>yy)ia!-HeTW4UWJ@Hug7R?<~O0Q@dKfWuP?ox1D zEYI!@dAfrKVtMvx$TP885*~fc^y8;lTWHth_GCBO8#S(dWQx5`*oOpLFYVI+w7UWM zeH-%hG$6lUL!OC!x$A>P#3U3LrIQb2EumpQ(SXN39F7ggu&S_qlsz=xvP(+APCZew z7c|Htwi9noo^6Yi$Ue=98-aL)l)RrR!Z!=3=N?NyUPT8{efWH-T)ROp+ z83VSA;Gt~OGeLLEHeJGOuKymSzqw3-M&fp zWpqyQZPjkyLJHb#KAR+d#Z=>kez!K6xvCz23sba0oAicU@-w94p(b=(0{>HUIzEIH z(6OMIXf@JtDg9UxX)uRN*IFK~jiTdm(;m-}j&M#ieQ$)UsoY5o9L2f|^0@xVNLh;; ze!_iO-ND!Um~e{4>YiXv$$Tm^M}1x^B;j501T*=0r&Y^jPyDgH{>RXH5-AJmyhNa% zN9ez@w$hn>rfZmB-ywoU9Vu}>6CSooG|qo6Z0Jh8f!^YJ5t1MU+cuMCL-@HHPdMqm z+R*(7=?-n>c>7-5fNUvvjU_A@;P<(r(rA2y{9u>qRg?C^wI{+esXhDHZ4}4#!wq

dEo>GZ-GR?qEd2S6ttkFj$d2W?ydh6-@L8$*qezL2W2T`lwSZ1mLOE_&_oZD& ztU}vf!RLp#BJho3=7+fq^C#(ygp5RF@rb8}b-g`HY3` zM#xHd55fV2T=!)trL>F+*j7p<{ihf-QSDu{TFF`Hb;yBQpMquUQIUI#jr>N9PoFkEtK5EU=c#7TMx4QC)AWomxD=>EY*ouB#j%n(sK)ir zK_oQr!e$z{Cs3n8jh3rDD)j2p2dkN2j|zQ30ob|zxlFK!xBg(BB%Bvdm=WwM32WjB zGlNxhQES6IHe!r(!5?;Gd`rr_k7aBT$CeCb5S@h-qdf-N z$2(F#&@u524y8Z-VC3ux0IiR)?aRoU>#Tl{wQ!01JmMn!!X837_ftJKwMmFXVsc=WWrE!u zdjf95cl|c*FA0r(CGS})ZnBH394l9wc0Y^s40IU1q}u%yi)*Fe24r#lQ`tav9}Jbz zyHo>h*Nl3jj80?eX3EHCf=zv&);Xs$!4`;qty<1tf-OQbv}OsIU~86{`smyk5)31u zhaM!!mSMG$$&s!Im89;bSj8%BB%qR1L!4~a**31?Y2Se2VIREF$kvqofmk@cY1!(< z=nUD~z8QCoZ1r&jx4GLL^r0@-?`Hx&tQD$ZGr)btQXrEZ;3D&q?TLFhFFA=Ji^cqA zWt7EciH0AsjBq#^iQd-}ys^*SYTeeTh zjM>*95)HXyGkUOkElOe?tr@!^d-RxnEfef+(%T@$pCizS829Pf-gPW&cU^Nq?q^v< zYnVx1kPF!*Kf?39cak5W?fp7JuFtQ08ZbBm8tZcD2iUkR zWyq4z?=|323XWqQ*S{S}Xu6%6H=R-l-`#j*g_kXf9gS|T5&A%z(am2$(Di?BDV|Wa z{(wjzxN~y^m2CZyx~!RO{fP-t*-~cTpP685zdo&k|H1@Y1@~(e{8uK}DtLlv!jFWU z=TO4P26VIH<+FBV%ecz5bz#=&=tE?iT zv3m62{~A&vlGm#x?;lLCC9h9Q-anaOOJ2X8qWmjf)dV7`IQSAunC71R%vI^d?-?g_4)fyM3HNr690WSTbuY!R zM=U6l-mln__@?32L4*l}G=x4dwZ8N|3yN`nz1NDHr2C8GZ@8}YNCa+tto%^Z%`g5&w1H{1-&mO^-E3mNgf_yqfLPbf z2QcLN{H!nJZ1-kzR+8D8t=9P2-zbyKK*H|;8zxV3Akj8L&G7jcVi?Mqwpae5@ZF<1 zzN*vy*}`R#4KBD?XU{%BT*7{P0`_m<+aQ*SSqi?*9M%YMS%b~m-N4R|G~_YOZ`<;d zY<~8gZx~+Q{lAR=CoSG=1pY4={HGiO?$+lbaUbKY^p(Xre-Dbd{2v zYpLf+1>Z&HNDu7`mPo?);t6Kz@hz+RNlrZ?`)7|K?O{JqWbw1qrn?zE_q-K1NwKHQ zgnI5G!VP6U&hooRWsK$531fa}(Z4}=^bf4elN1!)SASq+VUBPa|dRL6!%yH@H9&K4VpAh`q{+nSl7iK2FCE4DC*cu|~LGkle$Md7Sm?++>a^;Z{;Lie;?0Ns0#j|CbqAJu8CSEeyGS z27LnhX76VD#$2SCwfc>bTiZCEByzf4Lj3NW0Ka|y-@?y2=krJ67usU+ZuL4XzgV}L zayUv@U1)tnp6+0JEYBMadEVmrNZRO$%?P=!C*qqOU3^?PPEdS9X0jnqcd!)I;+8d} zL=;|6!^xF&L*d@wC@Gv_itY`4K~>_iR-91|wh&HQIdI(mpy?x5k|$yRjkj@I1ICzh z3U=)lcCbYxjvpyERP+RYmNLasmEqNxuW;P#2?mVTOJ1a z{u{p~`e|ZQ-*XU0uD<~}90Zk(_A{6gD&sp?jqA@uBo^7dv-QVB8HVEAmx^f){eFkR z?-#$2t|#C&B9tD8m1Y>F_nWYEZ=f2YjLZg~zJ`X_gsBn5(;qw`Ox_eJ5hl-Q!sMAv zm<(%wqLViCJ-5{NPUhYY5<|T>3nAB^ZJ}HWmPp(dR$O;*3`@Dbhe$ADS%eXq_dQL} z?QMeYhR-&J=MK&y)UY2Z+jH2$s}#glT!pC-_P&XJ71{%r5?-iJ;vzV&q3)7yx~-8C zX}Y&Ysjz>9{;2DTTi9-QA>{fC;&Ab8xw*(@b^L7`kjA_umSEhuo1i4=V_{{!Zj!<9Q()xt$x3>(&FwE=+lg z<=?v3Vn^Z|%D=KR53uHdlU`r3)(DOxjIdqeX2lH+roQo=*`xVJ_|C$xxG+t#XqzciHzs+b_b4^oA-a1*o;RVFzh?UFrwKol4RyX|Z`2q&mvTYumbQJG0NpV1IM=>Cz*)+v z5&4OYLCVg@4DRq_N{a^bxun~J+k0y=>FeNm-Mi6JS?ZAd|W^T0HDmO_N_H4&hd>j1#-&+1J=fSU? z@*PehF}Kqxt>|B{xl{fgLMyr#^bYkp<+7Vd%$eqt-^*v#DX)LyjdMqw(qM5AGVCP2 ztoxa+Vh2>QB!jqN{NEb?7vld8_|JRJ_rm{W_^$yhL5-2Lp~Ez|-88tj4ee1rcp#A& zEFU7jI17&V74mzS{8r`n2Kha$%+&Mb_v`ZeGx=SzDdL^A&*B?!-XEMq%h@xX>f&jM za^Jizup8s;!Xb}yXDc^Sb z%hN|mrAi$g#OuNgs?L=E@t$v#MxUC(*Qdu`E{$$3xmed|79zLsX$c>zc>VF;r}S2Ih$WI5!-f9*ATizE@ooYNL2CH~0D@9rR=n@iui za`Ze&PyM6(`OzZ;CR0bNMDI}n{I8c2&k)dWzPR(9qd0>E`WZF4h=6XEEPwCY<*#$j z%9Qsz&HvBn$t-#m;?n_}-8(m#Xj$CH%oj=|r9eftGV%ui+;hu;Z#oZcSVGj6_}( zM)IuH!UrUh-CE^b$H-eHa?23V#~FF8M6&CvoNE~QA&IP*oR#+sotqA*7$i^Sq@mNL ztGnelpoh@sT~SE#LQT(?5`Vh+)5D)${`B#upFcDBBO`{q+>Vx(7mg_MLRBCy96|U} zJg_);nlp?sg}RSp3Sp0=Wr!Jc27A@ZVyAr6f<(fr^d!>jlY>6IxbF~vVJk!TrgDGq+q8N29xiF9oTj0TRkvIEYQRBe=j zDt}#na5kbklC|wPTtG)A6R1A%Jp5(Ju^LLYr2X^os5r?%Cs|#dN+eSq$+0;o)#|vJ z^w=>NN|OF=Qvvuw3_rMNzA!hJ=mH~NKpn1>XmP5n9(&_h(@8-1RFpz_pZ9gD!av2Z z(w40_nZeAepW(eQH9vKDRvy1TZwJMrf=3ol-sFh~FYolX#?PQ4C9{%Mto~*?(UR@* z?*f8@05k?b?QwvY5nBNWmLP+wpyV$>p@Qa&za;|sWT|u7`su&L!Ls}`@0({O(gVeG zu{icP_+3b;V!=E}p1+7ibwyHCB@VPpr46-|!dfyaqx#LK{I#e^1^oT->fghPvv#K5 zOUUS1#mu@{B^BT0e-63U&Fa>*r2Q)-+~ef(nS9!N2WVX9ABebo);k<-$*z1_I8?}~ z68*Z$Xmz@F-py#sLVLd5hUtG5k@+@oY8PZOX}SWNeaP{Vlfl3{ zQDxEJ55J~prdiR9#rb@uY0+G@wrL_+=*V|;dHpTGI|n>EbY=ORs=htnDlZzNHh)(^ z)4vgD`v(IH*j?!a_tU+I{vjl`xYa5uZgs0?w%iqcd+Yw?Z%W$p+2U9Z>Zi~$ zbZ|af$*cO%`os&7JFAH92--SRP5`0?k;||j>%yw57N9k$qC>*-E$bAuZIC;mR%KAX zs&#Vy0&v0q7*K$mB@;V=@|VDSs9N4(sZ{O7(36-F_`I=F#e4xV=%^edT%T8A3hUe4 zY&zq2BRI%GCXd0xv?*r@FSA}LqcD&z?)v-;N@qe?*P79c%cA)6a4J9}OL`rTw(Ris zs(3R-rG-y%Hf40vQ=u8I$=_O4=aV7-47ifP^|$O?*j$A^ZH ztlFj3NqeWDgSF{w-X}0?F=*DcuS#vKDy@{r^{CH(Cw?$0y&sQt{z3Q!BMWn<${mBR z#&A_A_#Z?rjpo2PC4VmjwJsf~sbCw}OFguRrdC$J{}t~xMgt@M?kHL(U29X7M+u^x zUqR0)+>b>`#S1em=7b47TB!5MP{@kA!i5u29eh#31v6OLSvP`DdeW)?bZZe;Ixh8(YB0!rZpRgU~UrDLJRL;D;l8i@HI)wR4KMEqcbVLy6fQ za^B{2)%b)&(y;KhnvxjOtV!p(lmS7anWvD-rxu+65DKGUX??`cr>f^s>1LpS76O2` z2tS2vu|SQ)2xx-+^LqTwLsduBn2{z7(>Z@JvWNT(6&$5pb$sdbtOJ$j@-16`L7@W_ zRs#h*&c(ySoD z$*z>o)>RUX1j%MF=-2tRg&{oyOwUTos$>p&hZpgy>@?^l zUV+G`p$$TVvCxth9Ru@tJM`szYLH_`I?39PJL>%kbGNY%Wu?Qfubwddu0nrM-1(M&`7_ zi#Js-zf#wv-sccKe!auM``?1EOrZ5Nb`3bA)XK^ipi#!&k8q2lCfUlb+7&5>v?^_1 zg)w}yJA&XrJa^L1o%M4U{oGYQ-^S;|j&~n?y71w$n3Jrr6lU=(#F;w_IUT7Q3ppL> zniLX#w+p}Vns5eQukFEf7t{AtN4g`^k?qKJv~;v~v~{$5m!oH~swK?gR1d+UwwqL! z3Jy1eU2S*7XxXC|_&?x_n!mtKIu|vh`^+%ot(LA@a*EyuRi|~TFQRmp|8{g-89W$t zs;pAaE_g5wM|3b z@~2={_)CdZ-L&DnzM(!nR}lTAY$!d;D$LC!Rs!e7_Hd*fB%4Of#@49{NvlA!zmu>{ z!e=9_vS~x~T*ET0p#(E)8u@UOO5anjRFO<+5*uBiKDb&HGMsU#?!7fAr4;bs=cARr z#Nx^|!uqDmu;`xv%-D|U#L=LCJ=@W#Qq0>iXBK(Sq3gl)dvF$La_hPl130TOo)i_z zXhAfHz(SqwJ&Tf%*Q`d1GWaZDy-|n7`L>3ZPe#C91Kn634wO5i9ixcii24wqpL9fmVZJ6d6G$EcxR$0#avK$tvER)v}#dc;NW0~KYO30?FewviD~ zry91aX3*_T$cqVs>t6}{l{l+$A*1#nYg)qeE7#u!MRThjH71RdPkQsEZGibTu zA`G$0s)p1fIjwtDpZW+8u8!vnfu6%@Q--kPjQ+&oHi!pbl-hH>r@?t~XkrqmKq{1` zDGZ0RPR2VQtZ2<(p6w=PKqjWt@rO}LG%J}?UGEzeYqT9X6HzVgh}_LFC}woIP6+H!fe)b^KWYwZ9$1qSYdhRyB*Z`T(G z-w9567WEuwqAgDOQoN6C0h2OaMCW`vCM>fvm0W85^#6e!R2+1QX{TTOrkSozXZ`eD zahxMt{xAxaFXPWg_;Wda!o-w!DX1QFz0*%YTl!AqE7IsUZpr&A2RE*Qv!uYO!abxKUR-Y(UWRjy_OrJqhoL&# z{Tok2vX!sRpN8V4OTLhz4dfp{=VhwF@(aw$8lbV`si|crPcP2R!nzr1%Ku z?4t9)EX*95R)dL1N4`z*cpBankEagp=agRxd5lUL;CDFX>4p!eqO)_V;XCg%Q+#Li zG|l%8@O>KiJ~hJkP84m&qQF!(!6VP})Bjufv=Z~+KXs&&E;d86FAtyT zbYuj1M5*pQ{0^rhYoZ*LYq`^rGf}RJ+QI2)F;S|Q4i7mUt*9oYGR){`Lj--<= z`Fnsx6;*e|?HcOtNT#YB z{*fT78pVMwagf(ms2Y;f$BqEZ+F=Z?KE6MZ9NPiYv)bX3+){CiLz#{i|JPFycLd|c zc4YF~@v3All~@N_veXe(7J`=WcS4rMmypEjMLn>3ma3<+TKvt?m$ZQ=IO%9Aqv{>t zvj20esKq1Uuh<#2Ryr{QARd?j94ZLqS~Ff|l{oQfLb*6L1ig^)7oa-SA}FQ(T~Jo} zlhX9RAUntjkcPl{v9P{ zGO27~G0L-!_j^utv3jCW-nS^tXqyGESCUPnBvfzAh2r%Yc9X|>P{ z+enpMWQ}-?N&tTuvf|VQCo<#A%v`3LNoj3JG1lCAoT7gZWm;x;rQ+DXG0CP6ASHUU75FNj6o&Y> zf$OacKMXR^1WOQT>oj_W%0#0>edynf?fl*kpj@*4=Z}LO;QB9O9Md_NIqSD$DDj?x zp3C_sV$a#^;l(;#<gB*^H{i4Q9T+cE!HB0z`FHmM;{3Dg zx8KKUf0?}r?707Ca4%C_`UkxTg9~i82>IwHsF>TpM>vA%z<4Jdqys}E1!QD+<(beO zUEbAb&_O%LrXwRd0}LLgHRGch!@}K;3QOUP{{oU!4Z700mjo*|+BxGNM*Q5ge*;^% z*L#-xT3cM=m`mIa9o|ma#JV<-3|9%@Iw&%t4L_}!VXU-pD9WV$-NA32){eAFH;PKm zj!5~T4kz6ed^(Xhz38n2jctzJ+;lOhn&y~7(@@B}>sT!1=vt<-P7J6;lY;-aWH48o1 zufU-G#i~NmyOz50K9q4V)BGF)W>K2UjF?dgiBgAvKD^;3iwg=`XAUQ#m2;GP}U z4GqTC*dZN6Scy4z7D;+KvTB~^vUxtI*T5I3)^Ytk!2{^LoO~y%1MQj|9?`~IhpNX- zihp!ag_1IZNt%UXSFH{sk!DKDU3~~TsOY-Y*niuydKP|)uyBrn;-I;EIG&WFOyV@i zI^ikpqh_dksA|kFsZc#BxS3+%A8*xCDr#jqL;Mx~kye_)D5Hs!CQ2o!U(p*m z(NQ_kb_!C_>nB_+s*z$nKxq}irAvc}in5eh9_-;_r*N+_6@t!?>wO-G4rSm2yN)s^ z+qRNgdz+Aevb>iD-R|)yP{0)gg}g>vGh3yML#?cT4Qbzc11};J*)=reR1pe%T(g4$ z%iXGS!kUrAJiY0vFn3zwAFwf}vF(Ke>bJ~EPi(VBOC-Y$jTy|Kx&>SOS&UiTbD)K= z%+5wszdqBf#cPqBs2|$wfTf1n+^`y5@Z5i=pt5t3dlEa|I&`3s=#Rh5b zlsOS4RSp=Zuu7V#J+oJj=&JQdRYD={&B+k>cS96t2wVKH-^Uq4>GAB=9w-GMtV2rp z87$qd^Vea{t8uj!C$j!1K>O$MM|P@kt4p1;jmTRvq!gpdUf(HFFKkyd4({~Q8r&6Q zH-Nj{5)HVEnI$`Rr0F9KX&2N@7_)N}y6LQUJyd|Tq%HRCTIj!g*at*P-<$-ucn3nE z8_5^@?L63T#PyGKe}jqPYRE$&3BT`Byj0rtnjqVFs8t7Srpa2AG+4Z?+jMR^ zx`%hsDpKrgMX0>`#6^z^b;pcTy%00qv7Spg`oo=d_d79%v|Cfxpk{{Q`lW_puYINK z;?!tK*dh|8&3GohnJOj8Jbdp`MAGYzo_ixc-Oy=Le!DMvO%W&Y#BUBm4AnaD-#2@ zY0+B(H)F{-lYAdg)_w_IZ0*`o@H&#!^Wa?c-wP@6_k|O((x!nV2jJW5ZtFH#)W`R-=HJ2bH~FW`k~U;?fBdSawYQgg-n?S#wA`#w7i~}y;}ye zckCzK4>7Mfi98f)ifsP`DE590#~l_v{VxMt+J79j*DRO;k^y>ntQ|f}NE!1Zcr2HF ze4h?kOt9HZIA?d7Q|6Hq*ZT^pnC+D5y48WfkE@23zU891UDP8;i#xij=$!)aJnF!8 z;5~^l{owLL;y0t?aWF!QUY z)%#dI&Q8~(0g+bIPes*ogpHXT$<95_{@D=G_D;9x;aFOWzXPJy`D>V<#x1lmf$3cv zYAB$;!trkcX-X%g5{C%KiLLZRF+xUQL@PWc?ryME`Oz$jR1W_dR%pTTp2JQ|pSF_n zjlfn;%W1@ereI#6Mu?H^q3r8?Fx&nalk|I!7c0N$B_N63QBY$38K})NN0jaV0@|!A zY*VM2B&nDkP=8c3>7u|_e-dse)j0;mcxr{@)}gC+WqUYPHbBz98%_l61z^Umbd`&% z3YoK`$iPBQc?ptB6M2G~DY6YUtDO)QZRskPXU*~z_OsDQX-ijS%-R{_3GvZmR`_bh zEQz3hM*5cOvodBuNYs$k1iuOC*8sI;R)&_TyO|8ZWW220R)ipW?NIQI)57RoGvJ5`PoPL;!lfh`I`TGOevOCD@&M=G}b<2Nh6 zZSqUSHYPi$L^rwq$5iLw{E|zC(!8U8hE^UK(aL@>*Q_OMVMmZ z3@=Bslz%f?&i@*hM`^rp8MWQX)sAObHChdqGwCvyAAMRnrp+zN$TK-Zk*c zjNOSLu!XxBPLz~%?Va*W)lQOUrgnxrlQo}Dw|0UATWhDOXnz%$Ut7h1cRQw4wUvBz zQnOlXr{gVC8)LXiuxQEsfC6Co2cr-cP_f!tJCo_9T7U;m7efivF2xQ&w|X&t)9cee z0D5D~P|UjxZ`dEmRDU^1IR{1Hm#gyW`j0^~Q(v{peGet_K}LO{6-zI&B;tLU)TTwq z#75Ga`^LTtrnhD~GX7n7$@o9yZ^o%_g!1oTOtlJ7!}B|G{>dfizNsBK73H6T;Lr>m zujBRyj{5b_@P-^tOuKKW|jP7 z;2xVc1^Z{13lAwy2_gUaWOEH}?Nr&U;swIE?EYhaDbsZZT66vnz&P(N{7_*LJO5@N)5`rU&rC^7!Gfw&rM%9n z&^1U>ho*G30|sAn#jZ?tY;aQuB>@q*z*Z1z#6Z3B_<|rsn2vunx&;Q%#PQG#2Z8|( z0vwq2L*;e7gV5$W%DcG_Zk^wPC;4Rc3c%78x^n)Lt2xFh;Sx?4GJPDGWZXl9sy#jc z!|G2KyVTJs<-~`BQ&$g{B!MaHad!cneq5FJKLgC!7OBK~v~w@p`5y4ACGFHcqT2a# zX=nCK9xvq6e-xRbY|f4qU?_a#a7gvPvLk5n4zlM`a4=h_y>XEXzL3g zBU!929E{*_PfnGEI`|RD89M}#{tdHGOLpaRvX-suPJ*@KR4a~sjzE-N#EnvkKJWq` zJi=D{mZ4o>yWEPm){N{qSal)j!|sI~EKzp9p-ml?AjY$LU3oENxj6O(I;NQiHGG@f z_HV(Cx*YWm=S>H|SJe+V$?7v(VsD;PrB+=1G4OL%r8Il>NAa>geIE%p6a>sVk15_U z(0E0)qr^KF@2%;K_Zr-S-~nYgTk6c|bG12ju68D9MS?zD+pd&FA?a;{nL;6j6>D z@Iv*>`q!c7;dm*83pglWT{Vk|lbQ6+wR_7clZ*LO_1UGGE#i%Q^MM1Vfly3s;LOX;QTambWB>Qr_ zdmza;D~c^n-18%zeT@;0Hm7ianRuyA=bwZ=H(XBR{NE6uS-qA~pP?;z7;v=F&bJoF zz6??E4@W|>`V?^YkHBkT+E6h+%|8N5cZEDr!bzc&cOSd(G=E3LR-S&c4I7g(2=0L3 zZxk1Bf>H#`e+HtBiCIp@H?=&9{bM=3-pSz(ew?=h5M-RImqaUXMnf`qcrc$H#wuQ& z!{{|c65XyI=O2Zb*@H62bQ0H3+3db4ZQ#7v`ddR~&R`$^31kX`TI~u5R614r1Rko6 zB%C^Iv_;&Lmy{hKJQ6i?&PYBt&^}U4uDqGu2M4riEMUuD+CLiED|juW(^b}|`)k|K zQAyR;VAyi#=eh=;m?M9#6Gf%~?e{`h@|n&ots7R7!AVh7Nwy0-ptoBIVA~M-DfgqS z-38NUwPh=#vZ9Yaz%CN@ai}EXk;|$@A0rx|kRzP3Bt|wj!80N6>I^EBJxz-WHV7tb z@5b9;2e-UXm_#qQiMilo6|OZ!z3aaM@x-PJa$vZi`W03hj=(@W_5!sDJoMk9g5@~6 z6B_}43JcX&1#V?X1$<(neMDG76J3H!gP~SsyQ5OouGF&5rI-p)7uQU7M}yCVY*?dq(m#;Q`8K#)eUb_ayE)K_S~H9Og+f?^W9mK7-|e}M z)ESRJXZk-vNF`*b>H{?q#!7uwtNOZ{*PA#Y!>z{y&v})6dgaSdtp2^wM_AErejZMzGdw+Y*+R7L2l?A7eksT0y&|~Mlu70g1_~9bN�DED%JflJ5xJzgr) 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 M4;0}c{5tQ2 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%0AOY8D{cT{YOw0_Cc%KO)s=ewhVYg%&5Z8RbU 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

NfF#2f$uPy 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�{X42y! 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℘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責QdVq|2! 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

Q2Tq4yi8~Xn8+R7Y!Fjj<7vWO4UfgB45^fN8 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%0ABW7n6b)bGN3sqkY7Ek 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

4&6~-pC~-3 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


o-4gO_8Ccl}atL&q!W3gLYK{ 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

dXv#YOY#7 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%0DxCo~dYM9H- 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