@alpsckr/unitycli 0.4.2 → 0.4.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -5
- package/contracts/command-contract.json +109 -217
- package/contracts/package-files.json +374 -294
- package/contracts/stable-session/direct-call-semantics.json +8 -2
- package/contracts/tool-completion-contract.json +148 -672
- package/dist/bridge/admission.d.ts +17 -1
- package/dist/bridge/admission.js +2 -0
- package/dist/bridge/admission.js.map +1 -1
- package/dist/bridge/domains/asset.js +3 -1
- package/dist/bridge/domains/asset.js.map +1 -1
- package/dist/bridge/domains/camera.js +39 -7
- package/dist/bridge/domains/camera.js.map +1 -1
- package/dist/bridge/domains/console.js +2 -1
- package/dist/bridge/domains/console.js.map +1 -1
- package/dist/bridge/domains/doctor.d.ts +3 -0
- package/dist/bridge/domains/doctor.js +8 -0
- package/dist/bridge/domains/doctor.js.map +1 -0
- package/dist/bridge/domains/editor.js +0 -4
- package/dist/bridge/domains/editor.js.map +1 -1
- package/dist/bridge/domains/game-object.js +4 -12
- package/dist/bridge/domains/game-object.js.map +1 -1
- package/dist/bridge/domains/graphics.js +1 -16
- package/dist/bridge/domains/graphics.js.map +1 -1
- package/dist/bridge/domains/object.js +3 -0
- package/dist/bridge/domains/object.js.map +1 -1
- package/dist/bridge/domains/physics.js +1 -2
- package/dist/bridge/domains/physics.js.map +1 -1
- package/dist/bridge/domains/profiler.js +18 -7
- package/dist/bridge/domains/profiler.js.map +1 -1
- package/dist/bridge/domains/project-tool.js +4 -0
- package/dist/bridge/domains/project-tool.js.map +1 -1
- package/dist/bridge/domains/reflection.js +10 -2
- package/dist/bridge/domains/reflection.js.map +1 -1
- package/dist/bridge/domains/runtime-tool.js +3 -0
- package/dist/bridge/domains/runtime-tool.js.map +1 -1
- package/dist/bridge/domains/scene.js +3 -8
- package/dist/bridge/domains/scene.js.map +1 -1
- package/dist/bridge/domains/screenshot.js +30 -6
- package/dist/bridge/domains/screenshot.js.map +1 -1
- package/dist/bridge/domains/ui.js +3 -1
- package/dist/bridge/domains/ui.js.map +1 -1
- package/dist/bridge/index.d.ts +5 -5
- package/dist/bridge/index.js +6 -9
- package/dist/bridge/index.js.map +1 -1
- package/dist/bridge/registry.js +3 -5
- package/dist/bridge/registry.js.map +1 -1
- package/dist/bridge/session-supervisor.d.ts +6 -3
- package/dist/bridge/session-supervisor.js +122 -34
- package/dist/bridge/session-supervisor.js.map +1 -1
- package/dist/bridge/types.d.ts +6 -5
- package/dist/bridge/types.js +16 -2
- package/dist/bridge/types.js.map +1 -1
- package/dist/catalog-protocol.d.ts +64 -0
- package/dist/catalog-protocol.js +460 -0
- package/dist/catalog-protocol.js.map +1 -0
- package/dist/cli-commands/command.js +84 -61
- package/dist/cli-commands/command.js.map +1 -1
- package/dist/cli-commands/extensions.js +70 -50
- package/dist/cli-commands/extensions.js.map +1 -1
- package/dist/cli-commands/instances.js +1 -1
- package/dist/cli-commands/instances.js.map +1 -1
- package/dist/cli-process-owners.d.ts +6 -0
- package/dist/cli-process-owners.js +27 -0
- package/dist/cli-process-owners.js.map +1 -0
- package/dist/cli.d.ts +1 -1
- package/dist/cli.js +20 -5
- package/dist/cli.js.map +1 -1
- package/dist/contracts/command-contract.js +14 -4
- package/dist/contracts/command-contract.js.map +1 -1
- package/dist/doctor.d.ts +4 -6
- package/dist/doctor.js +429 -398
- package/dist/doctor.js.map +1 -1
- package/dist/editor-blocker-observer.d.ts +2 -1
- package/dist/editor-blocker-observer.js +40 -13
- package/dist/editor-blocker-observer.js.map +1 -1
- package/dist/extension-availability.d.ts +27 -9
- package/dist/extension-availability.js +96 -56
- package/dist/extension-availability.js.map +1 -1
- package/dist/extensions/descriptor-loader.d.ts +2 -2
- package/dist/extensions/descriptor-loader.js +3 -4
- package/dist/extensions/descriptor-loader.js.map +1 -1
- package/dist/extensions/index.d.ts +1 -1
- package/dist/extensions/index.js +1 -1
- package/dist/extensions/index.js.map +1 -1
- package/dist/extensions/installer.d.ts +24 -7
- package/dist/extensions/installer.js +142 -66
- package/dist/extensions/installer.js.map +1 -1
- package/dist/extensions/registry.js +3 -5
- package/dist/extensions/registry.js.map +1 -1
- package/dist/extensions/state-contract.d.ts +11 -0
- package/dist/extensions/state-contract.js +50 -0
- package/dist/extensions/state-contract.js.map +1 -0
- package/dist/instances.d.ts +13 -1
- package/dist/instances.js +26 -0
- package/dist/instances.js.map +1 -1
- package/dist/package-manager.d.ts +0 -24
- package/dist/package-manager.js +5 -58
- package/dist/package-manager.js.map +1 -1
- package/dist/project-tool-discovery.d.ts +5 -2
- package/dist/project-tool-discovery.js +22 -18
- package/dist/project-tool-discovery.js.map +1 -1
- package/dist/runtime-code.js +1 -1
- package/dist/runtime-code.js.map +1 -1
- package/dist/tool-name.d.ts +4 -0
- package/dist/tool-name.js +15 -0
- package/dist/tool-name.js.map +1 -0
- package/dist/tools/.generated-completion-registry.d.ts +2 -0
- package/dist/tools/.generated-completion-registry.js +763 -325
- package/dist/tools/.generated-completion-registry.js.map +1 -1
- package/dist/tools/.generated-registry.d.ts +6 -11
- package/dist/tools/.generated-registry.js +6 -11
- package/dist/tools/.generated-registry.js.map +1 -1
- package/dist/tools/.generated-schemas.js +11 -16
- package/dist/tools/.generated-schemas.js.map +1 -1
- package/dist/tools/asset/refresh-status.d.ts +3 -0
- package/dist/tools/asset/refresh-status.js +12 -0
- package/dist/tools/asset/refresh-status.js.map +1 -0
- package/dist/tools/asset/refresh.js +7 -3
- package/dist/tools/asset/refresh.js.map +1 -1
- package/dist/tools/build/player-status.d.ts +3 -0
- package/dist/tools/build/player-status.js +12 -0
- package/dist/tools/build/player-status.js.map +1 -0
- package/dist/tools/build/run.js +1 -1
- package/dist/tools/build/run.js.map +1 -1
- package/dist/tools/catalog-control.d.ts +22 -0
- package/dist/tools/catalog-control.js +335 -0
- package/dist/tools/catalog-control.js.map +1 -0
- package/dist/tools/catalog.d.ts +7 -9
- package/dist/tools/catalog.js +66 -45
- package/dist/tools/catalog.js.map +1 -1
- package/dist/tools/commands.d.ts +1 -1
- package/dist/tools/commands.js +44 -11
- package/dist/tools/commands.js.map +1 -1
- package/dist/tools/define.js +3 -2
- package/dist/tools/define.js.map +1 -1
- package/dist/tools/dispatcher.d.ts +53 -6
- package/dist/tools/dispatcher.js +277 -108
- package/dist/tools/dispatcher.js.map +1 -1
- package/dist/tools/editor/compile.js +1 -1
- package/dist/tools/editor/compile.js.map +1 -1
- package/dist/tools/editor/play-mode-status.d.ts +3 -0
- package/dist/tools/editor/play-mode-status.js +12 -0
- package/dist/tools/editor/play-mode-status.js.map +1 -0
- package/dist/tools/editor/readiness.d.ts +0 -1
- package/dist/tools/editor/readiness.js +0 -1
- package/dist/tools/editor/readiness.js.map +1 -1
- package/dist/tools/editor/refresh.d.ts +7 -3
- package/dist/tools/editor/refresh.js +20 -15
- package/dist/tools/editor/refresh.js.map +1 -1
- package/dist/tools/editor/state.d.ts +2 -2
- package/dist/tools/editor/state.js +13 -12
- package/dist/tools/editor/state.js.map +1 -1
- package/dist/tools/metadata/derived.js +1 -7
- package/dist/tools/metadata/derived.js.map +1 -1
- package/dist/tools/metadata/status.js +1 -12
- package/dist/tools/metadata/status.js.map +1 -1
- package/dist/tools/metadata/types.d.ts +0 -2
- package/dist/tools/navmesh/live.js +1 -1
- package/dist/tools/navmesh/live.js.map +1 -1
- package/dist/tools/occlusion/live.js +1 -1
- package/dist/tools/occlusion/live.js.map +1 -1
- package/dist/tools/package/deploy.js +2 -2
- package/dist/tools/package/deploy.js.map +1 -1
- package/dist/tools/package/embed.js +1 -1
- package/dist/tools/package/embed.js.map +1 -1
- package/dist/tools/package/install-status.d.ts +3 -0
- package/dist/tools/package/install-status.js +12 -0
- package/dist/tools/package/install-status.js.map +1 -0
- package/dist/tools/package/install.js +3 -3
- package/dist/tools/package/install.js.map +1 -1
- package/dist/tools/package/live-resolve.js +45 -12
- package/dist/tools/package/live-resolve.js.map +1 -1
- package/dist/tools/package/registry-clear.js.map +1 -1
- package/dist/tools/package/registry-set.js.map +1 -1
- package/dist/tools/package/remove-status.d.ts +3 -0
- package/dist/tools/package/remove-status.js +12 -0
- package/dist/tools/package/remove-status.js.map +1 -0
- package/dist/tools/package/remove.js +3 -3
- package/dist/tools/package/remove.js.map +1 -1
- package/dist/tools/package/resolve.js +3 -3
- package/dist/tools/package/resolve.js.map +1 -1
- package/dist/tools/package/restore.js +2 -2
- package/dist/tools/package/restore.js.map +1 -1
- package/dist/tools/package/scoped-registry-add.js.map +1 -1
- package/dist/tools/status/support.d.ts +13 -0
- package/dist/tools/status/support.js +28 -0
- package/dist/tools/status/support.js.map +1 -0
- package/dist/tools/test/cancel.js +2 -2
- package/dist/tools/test/cancel.js.map +1 -1
- package/dist/tools/test/run-status.d.ts +3 -0
- package/dist/tools/test/run-status.js +12 -0
- package/dist/tools/test/run-status.js.map +1 -0
- package/dist/tools/test/run.js +7 -4
- package/dist/tools/test/run.js.map +1 -1
- package/dist/tools/tools/group-summaries.js +10 -14
- package/dist/tools/tools/group-summaries.js.map +1 -1
- package/docs/architecture.md +4 -4
- package/docs/availability-differences.md +4 -4
- package/docs/command-execution.md +4 -3
- package/docs/error-codes.md +13 -5
- package/docs/extensions.md +1 -7
- package/docs/risk-and-side-effects.md +4 -3
- package/docs/safety-boundaries.md +3 -1
- package/docs/target-and-instance.md +1 -1
- package/docs/tool-discovery.md +17 -10
- package/docs/tool-execution.md +18 -7
- package/extensions/cinemachine/unitypkg/Editor/UnityCliExtensionAssembly.cs +3 -0
- package/extensions/hdrp/unitypkg/Editor/UnityCliExtensionAssembly.cs +3 -0
- package/extensions/probuilder/unitypkg/Editor/UnityCliExtensionAssembly.cs +3 -0
- package/extensions/urp/unitypkg/Editor/UnityCliExtensionAssembly.cs +3 -0
- package/extensions/vfx-graph/unitypkg/Editor/UnityCliExtensionAssembly.cs +3 -0
- package/package.json +2 -4
- package/skills/unitycli/SKILL.md +35 -42
- package/skills/unitycli/manifest.json +1 -1
- package/skills/unitycli/references/operation-protocol.md +3 -3
- package/unitypkg/Editor/AssemblyInfo.cs +5 -0
- package/unitypkg/Editor/Bridge/BridgeCommandRegistry.cs +49 -14
- package/unitypkg/Editor/Bridge/BridgeHttpServer.cs +9 -35
- package/unitypkg/Editor/Bridge/BridgeQueueState.cs +672 -0
- package/unitypkg/Editor/Bridge/BridgeWorkQueue.cs +970 -120
- package/unitypkg/Editor/BridgeStartupStateMachine.cs +59 -1
- package/unitypkg/Editor/Commands/ProjectToolCommands.cs +4 -0
- package/unitypkg/Editor/Commands/RuntimeToolCommands.cs +3 -0
- package/unitypkg/Editor/Generated/UnityCliToolCompletionRegistry.g.cs +379 -14
- package/unitypkg/Editor/Infrastructure/CodeExecSupport.cs +28 -13
- package/unitypkg/Editor/Infrastructure/RegistryOwnershipResolver.cs +132 -105
- package/unitypkg/Editor/Infrastructure/UnityCliActiveOperation.cs +138 -29
- package/unitypkg/Editor/Infrastructure/UnityCliAdmission.cs +1856 -237
- package/unitypkg/Editor/Infrastructure/UnityCliDoctorDiagnostics.cs +220 -0
- package/unitypkg/Editor/Infrastructure/UnityCliDurableStatusCoordinator.cs +118 -0
- package/unitypkg/Editor/Infrastructure/UnityCliEditorStateSnapshot.cs +2 -1
- package/unitypkg/Editor/Infrastructure/UnityCliHierarchyPager.cs +203 -0
- package/unitypkg/Editor/Infrastructure/UnityCliInstanceCleanup.cs +2 -1
- package/unitypkg/Editor/Infrastructure/UnityCliInstanceRegistry.cs +201 -63
- package/unitypkg/Editor/Infrastructure/UnityCliJson.cs +2 -3
- package/unitypkg/Editor/Infrastructure/UnityCliLiveBuildCoordinator.cs +289 -46
- package/unitypkg/Editor/Infrastructure/UnityCliLiveRefreshCoordinator.cs +87 -53
- package/unitypkg/Editor/Infrastructure/UnityCliNavMeshBakeCoordinator.cs +4 -4
- package/unitypkg/Editor/Infrastructure/UnityCliObjectRef.cs +128 -25
- package/unitypkg/Editor/Infrastructure/UnityCliObjectSerializer.cs +435 -327
- package/unitypkg/Editor/Infrastructure/UnityCliOcclusionBakeCoordinator.cs +4 -4
- package/unitypkg/Editor/Infrastructure/UnityCliOperationCoordinator.cs +351 -53
- package/unitypkg/Editor/Infrastructure/UnityCliPackageResolveCoordinator.cs +118 -18
- package/unitypkg/Editor/Infrastructure/UnityCliPackageResolveState.cs +20 -1
- package/unitypkg/Editor/Infrastructure/UnityCliReadGeneration.cs +97 -0
- package/unitypkg/Editor/Infrastructure/UnityCliReflection.cs +644 -133
- package/unitypkg/Editor/Infrastructure/UnityCliReloadOperation.cs +128 -41
- package/unitypkg/Editor/Infrastructure/UnityCliRuntimeExecutor.cs +14 -84
- package/unitypkg/Editor/Infrastructure/UnityCliSerializer.cs +220 -0
- package/unitypkg/Editor/Infrastructure/UnityCliSessionMutationLease.cs +69 -29
- package/unitypkg/Editor/Infrastructure/UnityCliTestRunCoordinator.cs +440 -54
- package/unitypkg/Editor/Infrastructure/UnityCliWaiter.cs +128 -35
- package/unitypkg/Editor/ProjectTools/IUnityCliTool.cs +9 -1
- package/unitypkg/Editor/ProjectTools/OfficialAttributeToolRegistry.cs +32 -31
- package/unitypkg/Editor/ProjectTools/ProjectToolRegistry.cs +607 -458
- package/unitypkg/Editor/ProjectTools/ProjectToolSchemaValidator.cs +35 -7
- package/unitypkg/Editor/ProjectTools/RegisteredTool.cs +501 -60
- package/unitypkg/Editor/ProjectTools/UnityCliProjectToolContext.cs +21 -0
- package/unitypkg/Editor/ProjectTools/UnityCliSchemaDeriver.cs +36 -7
- package/unitypkg/Editor/ProjectTools/UnityCliToolName.cs +30 -0
- package/unitypkg/Editor/Properties/AssemblyInfo.cs +3 -0
- package/unitypkg/Editor/Tools/asset/get-data.cs +16 -7
- package/unitypkg/Editor/Tools/build/BuildSceneStateTool.cs +23 -3
- package/unitypkg/Editor/Tools/build/BuildToolDtos.cs +2 -1
- package/unitypkg/Editor/Tools/build/scene/add.cs +6 -3
- package/unitypkg/Editor/Tools/build/scene/disable.cs +1 -1
- package/unitypkg/Editor/Tools/build/scene/enable.cs +1 -1
- package/unitypkg/Editor/Tools/build/scene/list.cs +1 -1
- package/unitypkg/Editor/Tools/build/scene/remove.cs +13 -3
- package/unitypkg/Editor/Tools/camera/CameraToolSupport.cs +38 -38
- package/unitypkg/Editor/Tools/camera/multiview.cs +13 -6
- package/unitypkg/Editor/Tools/camera/screenshot.cs +14 -7
- package/unitypkg/Editor/Tools/component/get.cs +16 -9
- package/unitypkg/Editor/Tools/component/modify.cs +6 -4
- package/unitypkg/Editor/Tools/console/clear.cs +7 -6
- package/unitypkg/Editor/Tools/console/get.cs +48 -16
- package/unitypkg/Editor/Tools/editor/EditorToolSupport.cs +143 -28
- package/unitypkg/Editor/Tools/editor/menu-items.cs +1 -1
- package/unitypkg/Editor/Tools/editor/play.cs +2 -11
- package/unitypkg/Editor/Tools/editor/selection.cs +1 -1
- package/unitypkg/Editor/Tools/editor/stop.cs +2 -11
- package/unitypkg/Editor/Tools/editor/windows.cs +1 -1
- package/unitypkg/Editor/Tools/go/GameObjectToolSupport.cs +54 -4
- package/unitypkg/Editor/Tools/go/delete.cs +1 -1
- package/unitypkg/Editor/Tools/go/find.cs +167 -70
- package/unitypkg/Editor/Tools/graphics/GraphicsToolSupport.cs +25 -0
- package/unitypkg/Editor/Tools/graphics/light-probe-group.cs +9 -3
- package/unitypkg/Editor/Tools/graphics/pipeline-info.cs +1 -1
- package/unitypkg/Editor/Tools/graphics/pipeline-settings.cs +1 -1
- package/unitypkg/Editor/Tools/graphics/quality.cs +2 -2
- package/unitypkg/Editor/Tools/graphics/reflection-probe.cs +3 -3
- package/unitypkg/Editor/Tools/graphics/stats.cs +1 -1
- package/unitypkg/Editor/Tools/object/ObjectToolSupport.cs +4 -4
- package/unitypkg/Editor/Tools/object/get-data.cs +9 -7
- package/unitypkg/Editor/Tools/object/modify.cs +7 -5
- package/unitypkg/Editor/Tools/physics/raycast.cs +24 -6
- package/unitypkg/Editor/Tools/prefab/stage.cs +1 -1
- package/unitypkg/Editor/Tools/profiler/ProfilerFrameDebuggerSupport.cs +94 -21
- package/unitypkg/Editor/Tools/profiler/ProfilerMemorySnapshotSupport.cs +397 -10
- package/unitypkg/Editor/Tools/profiler/ProfilerToolSupport.cs +18 -4
- package/unitypkg/Editor/Tools/profiler/frame-debugger/enable.cs +1 -1
- package/unitypkg/Editor/Tools/profiler/frame-debugger/events.cs +88 -87
- package/unitypkg/Editor/Tools/profiler/hierarchy.cs +278 -112
- package/unitypkg/Editor/Tools/profiler/memory-snapshot/compare.cs +9 -5
- package/unitypkg/Editor/Tools/profiler/memory-snapshot/list.cs +37 -35
- package/unitypkg/Editor/Tools/profiler/memory-snapshot/take.cs +99 -97
- package/unitypkg/Editor/Tools/project/info.cs +1 -1
- package/unitypkg/Editor/Tools/project/layers.cs +1 -1
- package/unitypkg/Editor/Tools/project/tags.cs +1 -1
- package/unitypkg/Editor/Tools/reflection/method/call.cs +9 -7
- package/unitypkg/Editor/Tools/reflection/method/find.cs +27 -37
- package/unitypkg/Editor/Tools/reflection/type/schema.cs +24 -28
- package/unitypkg/Editor/Tools/scene/gameobject/component.cs +8 -5
- package/unitypkg/Editor/Tools/scene/gameobject/components.cs +10 -7
- package/unitypkg/Editor/Tools/scene/gameobject-support.cs +104 -8
- package/unitypkg/Editor/Tools/scene/gameobject.cs +37 -16
- package/unitypkg/Editor/Tools/scene/hierarchy.cs +146 -142
- package/unitypkg/Editor/Tools/screenshot/EditorElementCaptureToolSupport.cs +77 -25
- package/unitypkg/Editor/Tools/screenshot/ScreenshotToolSupport.cs +315 -95
- package/unitypkg/Editor/Tools/screenshot/editor-element.cs +7 -5
- package/unitypkg/Editor/Tools/screenshot/game-view.cs +35 -21
- package/unitypkg/Editor/Tools/screenshot/isolated-object.cs +29 -23
- package/unitypkg/Editor/Tools/screenshot/orbit.cs +37 -25
- package/unitypkg/Editor/Tools/screenshot/scene-view.cs +25 -18
- package/unitypkg/Editor/Tools/screenshot/screen.cs +177 -17
- package/unitypkg/Editor/Tools/screenshot/surround.cs +83 -79
- package/unitypkg/Editor/Tools/ui/render-preview.cs +16 -11
- package/unitypkg/Editor/UnityCliBridge.cs +97 -34
- package/unitypkg/Runtime/Infrastructure/UnityCliRuntimeBridge.cs +753 -122
- package/unitypkg/Runtime/Properties/AssemblyInfo.cs +5 -0
- package/unitypkg/Runtime/UnityCli.Runtime.asmdef +1 -1
- package/unitypkg/Shared/AssemblyInfo.cs +4 -0
- package/unitypkg/Shared/UnityCliAdmissionPool.cs +265 -75
- package/unitypkg/Shared/UnityCliBridgeQueuePolicy.cs +410 -0
- package/unitypkg/Shared/UnityCliBridgeWorkItemState.cs +47 -0
- package/unitypkg/Shared/UnityCliExceptionProjection.cs +151 -0
- package/unitypkg/Shared/UnityCliQueuePublication.cs +30 -0
- package/unitypkg/Shared/UnityCliRequestBudget.cs +352 -0
- package/unitypkg/Shared/UnityCliRuntimeRequestPublication.cs +107 -0
- package/unitypkg/Tests/Editor/UnityCli.Editor.Tests.asmdef +2 -2
- package/unitypkg/Tests/Editor/UnityCliAdmissionCoordinatorIntegrationTests.cs +1329 -0
- package/unitypkg/Tests/Editor/UnityCliAdmissionPoolTests.cs +311 -114
- package/unitypkg/Tests/Editor/UnityCliAdmissionRepairStateTests.cs +94 -0
- package/unitypkg/Tests/Editor/UnityCliBridgeAdmissionIntegrationTests.cs +1229 -0
- package/unitypkg/Tests/Editor/UnityCliBridgeQueuePolicyTests.cs +412 -0
- package/unitypkg/Tests/Editor/UnityCliContinuationIntegrationTests.cs +292 -0
- package/unitypkg/Tests/Editor/UnityCliDiagnosticBoundaryTests.cs +120 -0
- package/unitypkg/Tests/Editor/UnityCliDurableStatusTests.cs +84 -0
- package/unitypkg/Tests/Editor/UnityCliExceptionProjectionTests.cs +72 -0
- package/unitypkg/Tests/Editor/UnityCliInstancePublicationRetryTests.cs +180 -97
- package/unitypkg/Tests/Editor/UnityCliMemoryReflectionIntegrationTests.cs +434 -0
- package/unitypkg/Tests/Editor/UnityCliRequestBudgetTests.cs +615 -0
- package/unitypkg/Tests/Editor/UnityCliRuntimeBridgeIntegrationTests.cs +520 -0
- package/unitypkg/Tests/Editor/UnityCliToolCatalogTests.cs +562 -0
- package/unitypkg/Tests/Runtime/UnityCli.Runtime.Tests.asmdef +23 -0
- package/unitypkg/Tests/Runtime/UnityCliRuntimeCatalogValidationTests.cs +29 -0
- package/unitypkg/package.json +1 -1
- package/contracts/static-capability-catalog.json +0 -48226
- package/dist/bridge/domains/diagnose.d.ts +0 -2
- package/dist/bridge/domains/diagnose.js +0 -11
- package/dist/bridge/domains/diagnose.js.map +0 -1
- package/dist/bridge/domains/extension.d.ts +0 -8
- package/dist/bridge/domains/extension.js +0 -20
- package/dist/bridge/domains/extension.js.map +0 -1
- package/dist/capabilities.d.ts +0 -5
- package/dist/capabilities.js +0 -84
- package/dist/capabilities.js.map +0 -1
- package/dist/static-capability-catalog.d.ts +0 -13
- package/dist/static-capability-catalog.js +0 -41
- package/dist/static-capability-catalog.js.map +0 -1
- package/dist/tools/diagnose/capabilities.d.ts +0 -13
- package/dist/tools/diagnose/capabilities.js +0 -34
- package/dist/tools/diagnose/capabilities.js.map +0 -1
- package/dist/tools/package/info.d.ts +0 -19
- package/dist/tools/package/info.js +0 -27
- package/dist/tools/package/info.js.map +0 -1
- package/dist/tools/package/list.d.ts +0 -27
- package/dist/tools/package/list.js +0 -21
- package/dist/tools/package/list.js.map +0 -1
- package/dist/tools/package/registry-get.d.ts +0 -10
- package/dist/tools/package/registry-get.js +0 -22
- package/dist/tools/package/registry-get.js.map +0 -1
- package/dist/tools/package/scoped-registry-list.d.ts +0 -14
- package/dist/tools/package/scoped-registry-list.js +0 -22
- package/dist/tools/package/scoped-registry-list.js.map +0 -1
- package/dist/tools/package/search.d.ts +0 -17
- package/dist/tools/package/search.js +0 -39
- package/dist/tools/package/search.js.map +0 -1
- package/dist/tools/package/status.d.ts +0 -21
- package/dist/tools/package/status.js +0 -37
- package/dist/tools/package/status.js.map +0 -1
- package/dist/tools/tools/describe.d.ts +0 -27
- package/dist/tools/tools/describe.js +0 -35
- package/dist/tools/tools/describe.js.map +0 -1
- package/dist/tools/tools/group-list.d.ts +0 -16
- package/dist/tools/tools/group-list.js +0 -38
- package/dist/tools/tools/group-list.js.map +0 -1
- package/dist/tools/tools/group.d.ts +0 -13
- package/dist/tools/tools/group.js +0 -34
- package/dist/tools/tools/group.js.map +0 -1
- package/dist/tools/tools/pagination.d.ts +0 -17
- package/dist/tools/tools/pagination.js +0 -28
- package/dist/tools/tools/pagination.js.map +0 -1
- package/dist/tools/tools/search.d.ts +0 -15
- package/dist/tools/tools/search.js +0 -42
- package/dist/tools/tools/search.js.map +0 -1
- package/unitypkg/Editor/Tools/diagnose/preflight.cs +0 -269
- package/unitypkg/Editor/Tools/editor/console.cs +0 -26
- package/unitypkg/Editor/Tools/extension/status.cs +0 -87
- package/unitypkg/Editor/Tools/go/inspect.cs +0 -49
- package/unitypkg/Editor/Tools/graphics/pipeline-quality.cs +0 -24
- package/unitypkg/Editor/Tools/graphics/probe-positions.cs +0 -58
- package/unitypkg/Editor/Tools/graphics/settings.cs +0 -104
- package/unitypkg/Editor/Tools/graphics/stats-counters.cs +0 -28
- package/unitypkg/Editor/Tools/graphics/stats-memory.cs +0 -21
- package/unitypkg/Editor/Tools/instances/list.cs +0 -71
- package/unitypkg/Editor/Tools/physics/raycast-all.cs +0 -67
- package/unitypkg/Editor/Tools/scene/build-settings.cs +0 -69
- package/unitypkg/Editor/Tools/scene/data.cs +0 -125
- package/unitypkg/Editor/Tools/tests/list.cs +0 -98
|
@@ -36,14 +36,14 @@ namespace UnityCli
|
|
|
36
36
|
protected override string StartCommand { get { return Command; } }
|
|
37
37
|
protected override string StatusCommand { get { return UnityCliPackageResolveCoordinator.StatusCommand; } }
|
|
38
38
|
protected override string OperationDisplayName { get { return "Package root"; } }
|
|
39
|
-
protected override IEnumerable<(string name, bool destructive)> AdditionalCommands
|
|
39
|
+
protected override IEnumerable<(string name, bool destructive, UnityCliBridgeQueuePolicy.WorkClass queueClass)> AdditionalCommands
|
|
40
40
|
{
|
|
41
41
|
get
|
|
42
42
|
{
|
|
43
|
-
yield return (ClaimFilesCommand, true);
|
|
44
|
-
yield return (CommitFilesCommand, true);
|
|
45
|
-
yield return (ProveFilesCommand, true);
|
|
46
|
-
yield return (FailFilesCommand, true);
|
|
43
|
+
yield return (ClaimFilesCommand, true, UnityCliBridgeQueuePolicy.WorkClass.Control);
|
|
44
|
+
yield return (CommitFilesCommand, true, UnityCliBridgeQueuePolicy.WorkClass.Control);
|
|
45
|
+
yield return (ProveFilesCommand, true, UnityCliBridgeQueuePolicy.WorkClass.Control);
|
|
46
|
+
yield return (FailFilesCommand, true, UnityCliBridgeQueuePolicy.WorkClass.Control);
|
|
47
47
|
}
|
|
48
48
|
}
|
|
49
49
|
protected override object DeserializeStartArgs(BridgeRequest request) { return request.DeserializeArgs<StartArgs>(); }
|
|
@@ -70,7 +70,7 @@ namespace UnityCli
|
|
|
70
70
|
}
|
|
71
71
|
catch (BridgeCommandException exception) { return SerializeBridgeExceptionEnvelope(request.RequestId, exception); }
|
|
72
72
|
}
|
|
73
|
-
internal override void Tick() { TickPackageRoots(); }
|
|
73
|
+
internal override void Tick() { if (RetryAdmissionOwnerRecoveryMarker()) return; TickPackageRoots(); }
|
|
74
74
|
}
|
|
75
75
|
|
|
76
76
|
internal static bool IsCommand(string command)
|
|
@@ -136,29 +136,28 @@ namespace UnityCli
|
|
|
136
136
|
|
|
137
137
|
private static async Task<string> ExecuteStart(BridgeRequest request, byte[] raw, Func<bool> accept, CancellationToken cancellationToken)
|
|
138
138
|
{
|
|
139
|
+
var leaseHeld = false;
|
|
139
140
|
var newlyAcquiredLease = false;
|
|
140
141
|
var requestDigest = UnityCliRequestDigest.Compute(raw, request.InstanceId);
|
|
141
142
|
try
|
|
142
143
|
{
|
|
143
144
|
var args = request.DeserializeArgs<StartArgs>();
|
|
144
145
|
ValidateStart(args);
|
|
146
|
+
UnityCliToolCompletionContract contract;
|
|
147
|
+
if (!UnityCliToolCompletionRegistry.TryGetPackageRoot(args.Operation, out contract))
|
|
148
|
+
throw new BridgeCommandException("E_SCHEMA_INVALID", "Unsupported package root operation.");
|
|
145
149
|
object cachedTerminal;
|
|
146
150
|
if (UnityCliActiveOperation.TryGetTerminal(ActiveScope, request.RequestId, requestDigest, out cachedTerminal))
|
|
147
151
|
{
|
|
148
|
-
try { UnityCliActiveOperation.BeginExactTerminalCleanup(ActiveScope, request.RequestId, requestDigest); } catch { }
|
|
152
|
+
try { UnityCliActiveOperation.BeginExactTerminalCleanup(ActiveScope, request.RequestId, requestDigest, ProductionQueueState); } catch { }
|
|
149
153
|
return StartTerminal(request.RequestId, cachedTerminal);
|
|
150
154
|
}
|
|
151
155
|
if (!UnityCliSessionMutationLease.TryAcquire(request.RequestId, requestDigest, out newlyAcquiredLease)) return BusyEnvelope(request.RequestId);
|
|
156
|
+
leaseHeld = true;
|
|
152
157
|
PackageActiveDecision decision;
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
if (!UnityCliToolCompletionRegistry.TryGetPackageRoot(args.Operation, out contract)) throw new BridgeCommandException("E_SCHEMA_INVALID", "Unsupported package root operation.");
|
|
157
|
-
decision = AcceptPackageActiveOperation(request, raw, contract, newlyAcquiredLease,
|
|
158
|
-
() => { if (accept == null || !accept()) throw new OperationCanceledException(); },
|
|
159
|
-
() => ValidateStart(args), root => InitializeRoot(root, args));
|
|
160
|
-
}
|
|
161
|
-
catch { if (newlyAcquiredLease) UnityCliSessionMutationLease.Release(request.RequestId, requestDigest); throw; }
|
|
158
|
+
decision = AcceptPackageActiveOperation(request, raw, contract, newlyAcquiredLease,
|
|
159
|
+
() => { if (accept == null || !accept()) throw new OperationCanceledException(); },
|
|
160
|
+
() => ValidateStart(args), root => InitializeRoot(root, args));
|
|
162
161
|
if (decision.TerminalEnvelope != null)
|
|
163
162
|
{
|
|
164
163
|
UnityCliSessionMutationLease.Release(request.RequestId, requestDigest);
|
|
@@ -172,7 +171,108 @@ namespace UnityCli
|
|
|
172
171
|
await Task.FromResult(0);
|
|
173
172
|
return UnityCliSerializer.Serialize(StartState(request.RequestId));
|
|
174
173
|
}
|
|
175
|
-
catch (BridgeCommandException exception) { return
|
|
174
|
+
catch (BridgeCommandException exception) { return FinishStartFault(ProductionQueueState, request, requestDigest, leaseHeld, newlyAcquiredLease, exception); }
|
|
175
|
+
catch (Exception exception) { return FinishStartFault(ProductionQueueState, request, requestDigest, leaseHeld, newlyAcquiredLease, exception); }
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
private static string FinishStartFault(BridgeQueueState state, BridgeRequest request, string requestDigest, bool leaseHeld, bool newlyAcquiredLease, Exception exception)
|
|
179
|
+
{
|
|
180
|
+
var normalized = NormalizePackageStartFault(exception);
|
|
181
|
+
if (!leaseHeld) return SerializeBridgeExceptionEnvelope(request.RequestId, normalized);
|
|
182
|
+
ActivePackageOperationRecord root;
|
|
183
|
+
try { root = LoadPackageActiveOperation(); }
|
|
184
|
+
catch
|
|
185
|
+
{
|
|
186
|
+
if (!RetainPackageAdmissionRecovery(state, request.RequestId, requestDigest))
|
|
187
|
+
return SerializeBridgeExceptionEnvelope(request.RequestId, new BridgeCommandException("E_EXECUTION_TIMEOUT", "Package recovery owner could not be frozen after an unreadable root."));
|
|
188
|
+
try
|
|
189
|
+
{
|
|
190
|
+
var unknown = ProtocolEnvelopeFactory.Error(request.RequestId, "E_EXECUTION_TIMEOUT", "Package active state is unreadable after root publication; outcome is unknown.", null, new[] { "Inspect Package Manager and package files before submitting another mutation." });
|
|
191
|
+
var first = UnityCliActiveOperation.StoreTerminalFirst(ActiveScope, request.RequestId, requestDigest, unknown);
|
|
192
|
+
UnityCliActiveOperation.BeginExactTerminalCleanup(ActiveScope, request.RequestId, requestDigest, state);
|
|
193
|
+
return StartTerminal(request.RequestId, first);
|
|
194
|
+
}
|
|
195
|
+
catch
|
|
196
|
+
{
|
|
197
|
+
return SerializeBridgeExceptionEnvelope(request.RequestId, new BridgeCommandException("E_EXECUTION_TIMEOUT", "Package root fault cleanup remains pending because the exact active state is unreadable."));
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
if (root != null)
|
|
201
|
+
{
|
|
202
|
+
if (!string.Equals(root.RequestId, request.RequestId, StringComparison.Ordinal)
|
|
203
|
+
|| !string.Equals(root.RequestDigest, requestDigest, StringComparison.Ordinal))
|
|
204
|
+
return SerializeBridgeExceptionEnvelope(request.RequestId, new BridgeCommandException("E_EXECUTION_TIMEOUT", "Package root fault conflicts with another exact active identity; cleanup is blocked."));
|
|
205
|
+
if (!RetainPackageAdmissionRecovery(state, request.RequestId, requestDigest))
|
|
206
|
+
return SerializeBridgeExceptionEnvelope(request.RequestId, new BridgeCommandException("E_EXECUTION_TIMEOUT", "Package recovery owner could not be frozen after root publication."));
|
|
207
|
+
try
|
|
208
|
+
{
|
|
209
|
+
object first;
|
|
210
|
+
if (IsTerminal(root)) first = root.TerminalEnvelope;
|
|
211
|
+
else if (root.StartedAt.HasValue || root.Phase == "effect_started" || root.Phase == "effect_proven")
|
|
212
|
+
{
|
|
213
|
+
TerminalTimeout(root, "Package operation failed after its effect barrier: " + exception.GetType().Name + ".");
|
|
214
|
+
first = RequiredRoot(request.RequestId).TerminalEnvelope;
|
|
215
|
+
}
|
|
216
|
+
else
|
|
217
|
+
{
|
|
218
|
+
var terminal = PackageStartFaultTerminal(request.RequestId, exception);
|
|
219
|
+
first = PersistPackageTerminal(request.RequestId, terminal, "failed");
|
|
220
|
+
}
|
|
221
|
+
return StartTerminal(request.RequestId, first);
|
|
222
|
+
}
|
|
223
|
+
catch
|
|
224
|
+
{
|
|
225
|
+
return SerializeBridgeExceptionEnvelope(request.RequestId, new BridgeCommandException("E_EXECUTION_TIMEOUT", "Package first-terminal cleanup remains pending after a root-created fault."));
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
if (!newlyAcquiredLease)
|
|
229
|
+
{
|
|
230
|
+
if (!RetainPackageAdmissionRecovery(state, request.RequestId, requestDigest))
|
|
231
|
+
return SerializeBridgeExceptionEnvelope(request.RequestId, new BridgeCommandException("E_EXECUTION_TIMEOUT", "Package pre-existing lease owner could not be frozen for recovery."));
|
|
232
|
+
return SerializeBridgeExceptionEnvelope(request.RequestId, new BridgeCommandException("E_EXECUTION_TIMEOUT", "Package has an exact pre-existing lease without a readable root; cleanup is blocked."));
|
|
233
|
+
}
|
|
234
|
+
try { UnityCliSessionMutationLease.Release(request.RequestId, requestDigest); } catch { }
|
|
235
|
+
bool isOwned;
|
|
236
|
+
if (UnityCliSessionMutationLease.TryIsOwnedBy(request.RequestId, requestDigest, out isOwned) && !isOwned)
|
|
237
|
+
return SerializeBridgeExceptionEnvelope(request.RequestId, normalized);
|
|
238
|
+
try { UnityCliActiveOperation.BeginExactTerminalCleanup(ActiveScope, request.RequestId, requestDigest); } catch { }
|
|
239
|
+
return SerializeBridgeExceptionEnvelope(request.RequestId, new BridgeCommandException("E_EXECUTION_TIMEOUT", "Package was rejected before its durable root, but exact lease cleanup remains pending."));
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
private static bool RetainPackageAdmissionRecovery(BridgeQueueState state, string requestId, string requestDigest)
|
|
243
|
+
{
|
|
244
|
+
try
|
|
245
|
+
{
|
|
246
|
+
var owner = CaptureAdmissionOwner(state, requestId, requestDigest);
|
|
247
|
+
if (owner.OwnerState == UnityCliAdmissionPool.AdmissionOwnerState.Recovery
|
|
248
|
+
|| owner.OwnerState == UnityCliAdmissionPool.AdmissionOwnerState.TerminalCleanup) return true;
|
|
249
|
+
if (owner.OwnerState != UnityCliAdmissionPool.AdmissionOwnerState.WorkItem) return false;
|
|
250
|
+
PersistAdmissionOwnerTransfer(state, ActiveScope + "-admission-owner", new Dictionary<string, object>
|
|
251
|
+
{
|
|
252
|
+
{ "requestId", requestId }, { "requestDigest", requestDigest }, { "editorSessionId", EditorSessionId() }
|
|
253
|
+
}, owner, UnityCliAdmissionPool.AdmissionOwnerState.Recovery);
|
|
254
|
+
return true;
|
|
255
|
+
}
|
|
256
|
+
catch { return false; }
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
private static object PackageStartFaultTerminal(string requestId, Exception exception)
|
|
260
|
+
{
|
|
261
|
+
var bridge = exception as BridgeCommandException;
|
|
262
|
+
if (bridge != null)
|
|
263
|
+
return ProtocolEnvelopeFactory.Error(requestId, bridge.Code, bridge.Message, bridge.Details, bridge.NextActions, bridge.Transient, bridge.RetryAfterMs);
|
|
264
|
+
if (exception is OperationCanceledException)
|
|
265
|
+
return ProtocolEnvelopeFactory.Error(requestId, "E_EXECUTION_TIMEOUT", "Package operation did not begin before the request deadline.");
|
|
266
|
+
return ProtocolEnvelopeFactory.Error(requestId, "E_BRIDGE_COMMAND_FAILED", exception.Message, null, new[] { "Check Unity Console and UnityCliBridge.log." });
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
private static BridgeCommandException NormalizePackageStartFault(Exception exception)
|
|
270
|
+
{
|
|
271
|
+
return exception is BridgeCommandException
|
|
272
|
+
? (BridgeCommandException)exception
|
|
273
|
+
: exception is OperationCanceledException
|
|
274
|
+
? new BridgeCommandException("E_EXECUTION_TIMEOUT", "Package operation did not begin before the request deadline.")
|
|
275
|
+
: new BridgeCommandException("E_BRIDGE_COMMAND_FAILED", exception.Message, "Check Unity Console and UnityCliBridge.log.");
|
|
176
276
|
}
|
|
177
277
|
|
|
178
278
|
private static string CurrentReloadEpoch()
|
|
@@ -215,7 +315,7 @@ namespace UnityCli
|
|
|
215
315
|
&& root.TerminalEnvelope != null)
|
|
216
316
|
{
|
|
217
317
|
var selector = UnityCliSerializer.Sha256Canonical(root.PackageOperation["input"]);
|
|
218
|
-
terminal = UnityCliActiveOperation.StoreTerminalFirst(ActiveScope, root.RequestId, root.RequestDigest, selector, root.TerminalEnvelope);
|
|
318
|
+
terminal = UnityCliActiveOperation.StoreTerminalFirst(ActiveScope, root.RequestId, root.RequestDigest, selector, Text(root.PackageOperation, "operation"), root.TerminalEnvelope);
|
|
219
319
|
}
|
|
220
320
|
if (terminal != null) UnityCliActiveOperation.BeginExactTerminalCleanup(ActiveScope, root.RequestId, root.RequestDigest);
|
|
221
321
|
}
|
|
@@ -374,6 +374,25 @@ namespace UnityCli
|
|
|
374
374
|
if (root == null || !string.Equals(root.RequestId, requestId, StringComparison.Ordinal)) throw new BridgeCommandException("E_REQUEST_NOT_FOUND", "Package active operation was not found.");
|
|
375
375
|
return root;
|
|
376
376
|
}
|
|
377
|
+
|
|
378
|
+
/// <summary>域status按公开root requestId读取active或terminal,并拒绝活跃请求的跨operation查询。</summary>
|
|
379
|
+
internal static object ReadPublicStatus(string requestId, string expectedOperation)
|
|
380
|
+
{
|
|
381
|
+
string requestDigest;
|
|
382
|
+
object terminal;
|
|
383
|
+
string statusDomain;
|
|
384
|
+
if (UnityCliActiveOperation.TryGetTerminalByRequestId(ActiveScope, requestId, out requestDigest, out statusDomain, out terminal))
|
|
385
|
+
{
|
|
386
|
+
if (!string.IsNullOrEmpty(statusDomain) && !string.Equals(statusDomain, expectedOperation, StringComparison.Ordinal))
|
|
387
|
+
throw new BridgeCommandException("E_REQUEST_NOT_FOUND", "The requested Package operation was not found in this status domain.");
|
|
388
|
+
return UnityCliDurableStatusCoordinator.Terminal(requestId, terminal);
|
|
389
|
+
}
|
|
390
|
+
var root = RequiredRoot(requestId);
|
|
391
|
+
var operation = Text(root.PackageOperation, "operation");
|
|
392
|
+
if (!string.Equals(operation, expectedOperation, StringComparison.Ordinal))
|
|
393
|
+
throw new BridgeCommandException("E_REQUEST_NOT_FOUND", "The requested Package operation was not found in this status domain.");
|
|
394
|
+
return UnityCliDurableStatusCoordinator.Running(requestId, Text(root.PackageOperation, "phase"));
|
|
395
|
+
}
|
|
377
396
|
private static List<ActivePackageOperationRecord> OpenRoots()
|
|
378
397
|
{
|
|
379
398
|
var root = LoadPackageActiveOperation();
|
|
@@ -455,7 +474,7 @@ namespace UnityCli
|
|
|
455
474
|
root.State = state; root.Phase = "result_persisted"; root.TerminalEnvelope = envelope;
|
|
456
475
|
SavePackageActiveOperation(root);
|
|
457
476
|
var selectorDigest = UnityCliSerializer.Sha256Canonical(root.PackageOperation["input"]);
|
|
458
|
-
var first = UnityCliActiveOperation.StoreTerminalFirst(ActiveScope, root.RequestId, root.RequestDigest, selectorDigest, envelope);
|
|
477
|
+
var first = UnityCliActiveOperation.StoreTerminalFirst(ActiveScope, root.RequestId, root.RequestDigest, selectorDigest, Text(root.PackageOperation, "operation"), envelope);
|
|
459
478
|
root.TerminalEnvelope = first;
|
|
460
479
|
TerminalRoots[requestId] = root;
|
|
461
480
|
UnityCliActiveOperation.BeginExactTerminalCleanup(ActiveScope, root.RequestId, root.RequestDigest);
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
#if UNITY_EDITOR
|
|
2
|
+
using System;
|
|
3
|
+
using System.Globalization;
|
|
4
|
+
using System.Threading;
|
|
5
|
+
using ReflectionAssembly = System.Reflection.Assembly;
|
|
6
|
+
using UnityEditor;
|
|
7
|
+
using UnityEditor.Compilation;
|
|
8
|
+
using UnityEngine.SceneManagement;
|
|
9
|
+
|
|
10
|
+
namespace UnityCli
|
|
11
|
+
{
|
|
12
|
+
public static partial class UnityCliBridge
|
|
13
|
+
{
|
|
14
|
+
/// <summary>listener id 每次 domain reload 都变化,确保旧 domain 的只读游标不能碰撞复用。</summary>
|
|
15
|
+
internal static string ReadGenerationIdentity()
|
|
16
|
+
{
|
|
17
|
+
return EditorSessionId() + "\0" + ListenerId + "\0" + CurrentListenerGeneration().ToString(CultureInfo.InvariantCulture);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/// <summary>为只读 continuation 提供 Unity-owned generation;层级或程序集变化立即使旧游标失效。</summary>
|
|
22
|
+
[InitializeOnLoad]
|
|
23
|
+
internal static class UnityCliReadGeneration
|
|
24
|
+
{
|
|
25
|
+
private static long hierarchyGeneration = 1L;
|
|
26
|
+
private static long reflectionGeneration = 1L;
|
|
27
|
+
|
|
28
|
+
static UnityCliReadGeneration()
|
|
29
|
+
{
|
|
30
|
+
EditorApplication.hierarchyChanged += InvalidateHierarchy;
|
|
31
|
+
EditorApplication.projectChanged += InvalidateHierarchy;
|
|
32
|
+
EditorApplication.playModeStateChanged += delegate { InvalidateHierarchy(); };
|
|
33
|
+
CompilationPipeline.compilationFinished += delegate { InvalidateReflection(); };
|
|
34
|
+
AssemblyReloadEvents.beforeAssemblyReload += InvalidateReflection;
|
|
35
|
+
AppDomain.CurrentDomain.AssemblyLoad += delegate { InvalidateReflection(); };
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
internal static string Hierarchy(Scene scene)
|
|
39
|
+
{
|
|
40
|
+
return UnityCliContinuationToken.Fingerprint(
|
|
41
|
+
UnityCliBridge.ReadGenerationIdentity() + "\0" + scene.handle.ToString(CultureInfo.InvariantCulture) + "\0" + Interlocked.Read(ref hierarchyGeneration).ToString(CultureInfo.InvariantCulture));
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
internal static string Reflection()
|
|
45
|
+
{
|
|
46
|
+
return UnityCliContinuationToken.Fingerprint(
|
|
47
|
+
UnityCliBridge.ReadGenerationIdentity() + "\0" + Interlocked.Read(ref reflectionGeneration).ToString(CultureInfo.InvariantCulture));
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
internal static string Session(string scope)
|
|
51
|
+
{
|
|
52
|
+
return UnityCliContinuationToken.Fingerprint(UnityCliBridge.ReadGenerationIdentity() + "\0" + (scope ?? string.Empty));
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
internal static void InvalidateHierarchy()
|
|
56
|
+
{
|
|
57
|
+
Interlocked.Increment(ref hierarchyGeneration);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
internal static void InvalidateReflection()
|
|
61
|
+
{
|
|
62
|
+
Interlocked.Increment(ref reflectionGeneration);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/// <summary>AppDomain没有逐项程序集API;每个reflection generation仅创建一次有1024项硬上限的snapshot。</summary>
|
|
67
|
+
internal static class UnityCliAssemblySnapshot
|
|
68
|
+
{
|
|
69
|
+
private const int MaximumAssemblies = 1024;
|
|
70
|
+
private static readonly object SnapshotLock = new object();
|
|
71
|
+
private static string generation;
|
|
72
|
+
private static ReflectionAssembly[] assemblies;
|
|
73
|
+
|
|
74
|
+
internal static ReflectionAssembly[] Get(UnityCliRequestBudget budget)
|
|
75
|
+
{
|
|
76
|
+
if (budget == null) throw new ArgumentNullException("budget");
|
|
77
|
+
var currentGeneration = UnityCliReadGeneration.Reflection();
|
|
78
|
+
ReflectionAssembly[] snapshot;
|
|
79
|
+
lock (SnapshotLock)
|
|
80
|
+
{
|
|
81
|
+
if (assemblies == null || !string.Equals(generation, currentGeneration, StringComparison.Ordinal))
|
|
82
|
+
{
|
|
83
|
+
if (!budget.TryConsumeReflectionCall()) throw new UnityCliRequestBudgetExceededException(budget.ExhaustedDimension);
|
|
84
|
+
snapshot = AppDomain.CurrentDomain.GetAssemblies();
|
|
85
|
+
if (snapshot.Length > MaximumAssemblies)
|
|
86
|
+
throw new UnityCliBridge.BridgeCommandException("E_REFLECTION_LIMIT_EXCEEDED", "Loaded assembly count exceeds the 1024-item reflection snapshot bound.", "Reduce loaded assemblies before retrying the bounded reflection request.");
|
|
87
|
+
assemblies = snapshot;
|
|
88
|
+
generation = currentGeneration;
|
|
89
|
+
}
|
|
90
|
+
snapshot = assemblies;
|
|
91
|
+
}
|
|
92
|
+
if (!budget.TryConsumeScannedRecords(snapshot.Length)) throw new UnityCliRequestBudgetExceededException(budget.ExhaustedDimension);
|
|
93
|
+
return snapshot;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
#endif
|