@alpsckr/unitycli 0.4.3 → 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 +11 -2
- 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
|
@@ -52,48 +52,68 @@ namespace UnityCli
|
|
|
52
52
|
catch (DirectoryNotFoundException) { return false; }
|
|
53
53
|
}
|
|
54
54
|
|
|
55
|
-
/// <summary>terminal已durable
|
|
56
|
-
internal static void BeginExactTerminalCleanup(string scope, string requestId, string requestDigest, bool completeAdmission = true)
|
|
55
|
+
/// <summary>terminal已durable后以三段式transfer取得TerminalCleanup owner,再清root与lease。</summary>
|
|
56
|
+
internal static void BeginExactTerminalCleanup(string scope, string requestId, string requestDigest, bool completeAdmission = true, Action<string> cleanupBoundary = null)
|
|
57
|
+
{
|
|
58
|
+
BeginExactTerminalCleanup(scope, requestId, requestDigest, null, completeAdmission, cleanupBoundary);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
internal static void BeginExactTerminalCleanup(string scope, string requestId, string requestDigest, BridgeQueueState state, bool completeAdmission = true, Action<string> cleanupBoundary = null)
|
|
57
62
|
{
|
|
58
63
|
ValidateTerminalIdentity(scope, requestId, requestDigest);
|
|
59
64
|
var cleanupScope = scope + "-terminal-cleanup";
|
|
60
|
-
var existing =
|
|
65
|
+
var existing = LoadForState(state, cleanupScope);
|
|
61
66
|
if (existing != null && (!string.Equals(Text(existing, "requestId"), requestId, StringComparison.Ordinal)
|
|
62
67
|
|| !string.Equals(Text(existing, "requestDigest"), requestDigest, StringComparison.Ordinal)))
|
|
63
68
|
{
|
|
64
|
-
if (RetryExactTerminalCleanup(scope)) return;
|
|
69
|
+
if (RetryExactTerminalCleanup(scope, state, cleanupBoundary)) return;
|
|
65
70
|
existing = null;
|
|
66
71
|
}
|
|
67
72
|
if (existing == null)
|
|
68
73
|
{
|
|
69
|
-
|
|
74
|
+
existing = new Dictionary<string, object>
|
|
70
75
|
{
|
|
71
76
|
{ "requestId", requestId }, { "requestDigest", requestDigest },
|
|
72
77
|
{ "editorSessionId", UnityCliBridge.EditorSessionId() }, { "completeAdmission", completeAdmission }
|
|
73
78
|
};
|
|
74
|
-
|
|
75
|
-
|
|
79
|
+
if (completeAdmission)
|
|
80
|
+
{
|
|
81
|
+
var owner = state == null ? UnityCliBridge.CaptureAdmissionOwner(requestId, requestDigest) : UnityCliBridge.CaptureAdmissionOwner(state, requestId, requestDigest);
|
|
82
|
+
if (state == null) UnityCliBridge.PersistAdmissionOwnerTransfer(cleanupScope, existing, owner, UnityCliAdmissionPool.AdmissionOwnerState.TerminalCleanup);
|
|
83
|
+
else UnityCliBridge.PersistAdmissionOwnerTransfer(state, cleanupScope, existing, owner, UnityCliAdmissionPool.AdmissionOwnerState.TerminalCleanup);
|
|
84
|
+
}
|
|
85
|
+
else SaveForState(state, cleanupScope, existing);
|
|
76
86
|
}
|
|
77
87
|
else if (completeAdmission)
|
|
78
88
|
{
|
|
79
89
|
object current;
|
|
80
90
|
if (!existing.TryGetValue("completeAdmission", out current) || !(current is bool)) return;
|
|
81
|
-
|
|
91
|
+
var owner = state == null ? UnityCliBridge.CaptureAdmissionOwner(requestId, requestDigest) : UnityCliBridge.CaptureAdmissionOwner(state, requestId, requestDigest);
|
|
92
|
+
existing["completeAdmission"] = true;
|
|
93
|
+
if (owner.OwnerState != UnityCliAdmissionPool.AdmissionOwnerState.TerminalCleanup)
|
|
94
|
+
{
|
|
95
|
+
if (state == null) UnityCliBridge.PersistAdmissionOwnerTransfer(cleanupScope, existing, owner, UnityCliAdmissionPool.AdmissionOwnerState.TerminalCleanup);
|
|
96
|
+
else UnityCliBridge.PersistAdmissionOwnerTransfer(state, cleanupScope, existing, owner, UnityCliAdmissionPool.AdmissionOwnerState.TerminalCleanup);
|
|
97
|
+
}
|
|
98
|
+
else
|
|
82
99
|
{
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
existing["completeAdmission"] = true;
|
|
86
|
-
Save(cleanupScope, existing);
|
|
100
|
+
existing["admissionTransferCommitted"] = true;
|
|
101
|
+
SaveForState(state, cleanupScope, existing);
|
|
87
102
|
}
|
|
88
103
|
}
|
|
89
|
-
RetryExactTerminalCleanup(scope);
|
|
104
|
+
RetryExactTerminalCleanup(scope, state, cleanupBoundary);
|
|
90
105
|
}
|
|
91
106
|
|
|
92
107
|
/// <summary>只有确认exact owner已不存在才删除cleanup marker;读取不确定时保持原状。</summary>
|
|
93
|
-
internal static bool RetryExactTerminalCleanup(string scope)
|
|
108
|
+
internal static bool RetryExactTerminalCleanup(string scope, Action<string> cleanupBoundary = null)
|
|
109
|
+
{
|
|
110
|
+
return RetryExactTerminalCleanup(scope, null, cleanupBoundary);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
internal static bool RetryExactTerminalCleanup(string scope, BridgeQueueState state, Action<string> cleanupBoundary = null)
|
|
94
114
|
{
|
|
95
115
|
var cleanupScope = scope + "-terminal-cleanup";
|
|
96
|
-
var marker =
|
|
116
|
+
var marker = LoadForState(state, cleanupScope);
|
|
97
117
|
if (marker == null) return false;
|
|
98
118
|
var requestId = Text(marker, "requestId");
|
|
99
119
|
var requestDigest = Text(marker, "requestDigest");
|
|
@@ -101,37 +121,79 @@ namespace UnityCli
|
|
|
101
121
|
object completeAdmissionValue;
|
|
102
122
|
if (!marker.TryGetValue("completeAdmission", out completeAdmissionValue) || !(completeAdmissionValue is bool)) return true;
|
|
103
123
|
var completeAdmission = (bool)completeAdmissionValue;
|
|
104
|
-
var admissionOwner = UnityCliBridge.ReadAdmissionOwnerFields(marker, requestId);
|
|
105
124
|
ValidateTerminalIdentity(scope, requestId, requestDigest);
|
|
106
125
|
if (!string.Equals(editorSessionId, UnityCliBridge.EditorSessionId(), StringComparison.Ordinal))
|
|
107
126
|
{
|
|
108
|
-
|
|
127
|
+
ClearForTerminalCleanup(state, cleanupScope, cleanupBoundary);
|
|
109
128
|
return false;
|
|
110
129
|
}
|
|
130
|
+
UnityCliBridge.AdmissionOwnerIdentity admissionOwner = null;
|
|
131
|
+
if (completeAdmission)
|
|
132
|
+
{
|
|
133
|
+
try { admissionOwner = state == null ? UnityCliBridge.ReconcileAdmissionTransferForLiveMarker(cleanupScope, marker, requestId, requestDigest) : UnityCliBridge.ReconcileAdmissionTransferForLiveMarker(state, cleanupScope, marker, requestId, requestDigest); }
|
|
134
|
+
catch { return true; }
|
|
135
|
+
if (admissionOwner == null) return false;
|
|
136
|
+
}
|
|
111
137
|
Dictionary<string, object> active;
|
|
112
|
-
try { active =
|
|
138
|
+
try { active = LoadForState(state, scope); }
|
|
113
139
|
catch
|
|
114
140
|
{
|
|
115
141
|
bool markerOwnsLease;
|
|
116
|
-
if (!
|
|
117
|
-
if (!markerOwnsLease)
|
|
118
|
-
|
|
142
|
+
if (!TryIsLeaseOwnedForState(state, requestId, requestDigest, out markerOwnsLease)) return true;
|
|
143
|
+
if (!markerOwnsLease)
|
|
144
|
+
{
|
|
145
|
+
if (completeAdmission && !(state == null ? UnityCliBridge.CompleteAdmissionRoot(admissionOwner) : UnityCliBridge.CompleteAdmissionRoot(state, admissionOwner))) return true;
|
|
146
|
+
ClearForTerminalCleanup(state, cleanupScope, cleanupBoundary);
|
|
147
|
+
return false;
|
|
148
|
+
}
|
|
149
|
+
try { ClearForTerminalCleanup(state, scope, cleanupBoundary); active = null; }
|
|
119
150
|
catch { return true; }
|
|
120
151
|
}
|
|
121
152
|
if (active != null && string.Equals(Text(active, "requestId"), requestId, StringComparison.Ordinal)
|
|
122
153
|
&& string.Equals(Text(active, "requestDigest"), requestDigest, StringComparison.Ordinal))
|
|
123
154
|
{
|
|
124
|
-
try {
|
|
155
|
+
try { ClearForTerminalCleanup(state, scope, cleanupBoundary); }
|
|
125
156
|
catch { return true; }
|
|
126
157
|
}
|
|
127
|
-
|
|
158
|
+
ReleaseLeaseForState(state, requestId, requestDigest);
|
|
128
159
|
bool isOwned;
|
|
129
|
-
if (!
|
|
130
|
-
if (completeAdmission && !UnityCliBridge.CompleteAdmissionRoot(admissionOwner)) return true;
|
|
131
|
-
|
|
160
|
+
if (!TryIsLeaseOwnedForState(state, requestId, requestDigest, out isOwned) || isOwned) return true;
|
|
161
|
+
if (completeAdmission && !(state == null ? UnityCliBridge.CompleteAdmissionRoot(admissionOwner) : UnityCliBridge.CompleteAdmissionRoot(state, admissionOwner))) return true;
|
|
162
|
+
ClearForTerminalCleanup(state, cleanupScope, cleanupBoundary);
|
|
132
163
|
return false;
|
|
133
164
|
}
|
|
134
165
|
|
|
166
|
+
private static Dictionary<string, object> LoadForState(BridgeQueueState state, string scope)
|
|
167
|
+
{
|
|
168
|
+
return state == null ? Load(scope) : state.LoadOperation(scope);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
private static void SaveForState(BridgeQueueState state, string scope, Dictionary<string, object> value)
|
|
172
|
+
{
|
|
173
|
+
if (state == null) Save(scope, value);
|
|
174
|
+
else state.SaveOperation(scope, value);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
private static void ClearForTerminalCleanup(BridgeQueueState state, string scope, Action<string> cleanupBoundary)
|
|
178
|
+
{
|
|
179
|
+
if (cleanupBoundary != null) cleanupBoundary(scope);
|
|
180
|
+
if (state == null) Clear(scope);
|
|
181
|
+
else state.ClearOperation(scope);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
private static bool TryIsLeaseOwnedForState(BridgeQueueState state, string requestId, string requestDigest, out bool isOwned)
|
|
185
|
+
{
|
|
186
|
+
return state == null
|
|
187
|
+
? UnityCliBridge.UnityCliSessionMutationLease.TryIsOwnedBy(requestId, requestDigest, out isOwned)
|
|
188
|
+
: state.TryIsLeaseOwned(requestId, requestDigest, out isOwned);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
private static void ReleaseLeaseForState(BridgeQueueState state, string requestId, string requestDigest)
|
|
192
|
+
{
|
|
193
|
+
if (state == null) UnityCliBridge.UnityCliSessionMutationLease.Release(requestId, requestDigest);
|
|
194
|
+
else state.ReleaseLease(requestId, requestDigest);
|
|
195
|
+
}
|
|
196
|
+
|
|
135
197
|
private const int MaxTerminalCacheBytes = 8 * 1024 * 1024;
|
|
136
198
|
private const int MaxTerminalEntryBytes = 2 * 1024 * 1024;
|
|
137
199
|
private const int MaxRetiredTerminalIdentities = 4096;
|
|
@@ -173,6 +235,32 @@ namespace UnityCli
|
|
|
173
235
|
return false;
|
|
174
236
|
}
|
|
175
237
|
|
|
238
|
+
/// <summary>公开status仅凭root requestId定位exact terminal,digest只在Bridge内部读取和校验。</summary>
|
|
239
|
+
internal static bool TryGetTerminalByRequestId(string scope, string requestId, out string requestDigest, out string statusDomain, out object envelope)
|
|
240
|
+
{
|
|
241
|
+
requestDigest = null;
|
|
242
|
+
statusDomain = null;
|
|
243
|
+
envelope = null;
|
|
244
|
+
ValidateRequestId(scope, requestId);
|
|
245
|
+
var cache = LoadTerminalCache();
|
|
246
|
+
foreach (var entry in cache.Entries)
|
|
247
|
+
{
|
|
248
|
+
if (!string.Equals(Text(entry, "scope"), scope, StringComparison.Ordinal)
|
|
249
|
+
|| !string.Equals(Text(entry, "requestId"), requestId, StringComparison.Ordinal)) continue;
|
|
250
|
+
var storedDigest = Text(entry, "requestDigest");
|
|
251
|
+
ValidateTerminalIdentity(scope, requestId, storedDigest);
|
|
252
|
+
object stored;
|
|
253
|
+
if (!entry.TryGetValue("envelope", out stored) || stored == null)
|
|
254
|
+
throw new BridgeCommandException("E_EXECUTION_TIMEOUT", "Durable terminal cache entry is incomplete; outcome is unknown.");
|
|
255
|
+
requestDigest = storedDigest;
|
|
256
|
+
statusDomain = Text(entry, "statusDomain");
|
|
257
|
+
envelope = stored;
|
|
258
|
+
return true;
|
|
259
|
+
}
|
|
260
|
+
RejectRetiredTerminal(cache.RetiredIdentities, scope, requestId);
|
|
261
|
+
return false;
|
|
262
|
+
}
|
|
263
|
+
|
|
176
264
|
/// <summary>按业务selector读取terminal,仅用于start响应丢失且调用方尚未取得root digest的恢复。</summary>
|
|
177
265
|
internal static bool TryGetTerminalBySelector(string scope, string requestId, string selectorDigest, out object envelope)
|
|
178
266
|
{
|
|
@@ -202,8 +290,16 @@ namespace UnityCli
|
|
|
202
290
|
|
|
203
291
|
/// <summary>first-terminal-wins;固定cache按100条与8MiB双重上限保留当前session最新identity。</summary>
|
|
204
292
|
internal static object StoreTerminalFirst(string scope, string requestId, string requestDigest, string selectorDigest, object envelope)
|
|
293
|
+
{
|
|
294
|
+
return StoreTerminalFirst(scope, requestId, requestDigest, selectorDigest, null, envelope);
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
/// <summary>statusDomain只供固定域status校验,绝不参与公开输入或exact replay identity。</summary>
|
|
298
|
+
internal static object StoreTerminalFirst(string scope, string requestId, string requestDigest, string selectorDigest, string statusDomain, object envelope)
|
|
205
299
|
{
|
|
206
300
|
ValidateTerminalIdentity(scope, requestId, requestDigest);
|
|
301
|
+
if (statusDomain != null && (string.IsNullOrWhiteSpace(statusDomain) || statusDomain.Length > 80))
|
|
302
|
+
throw new BridgeCommandException("E_EXECUTION_FAILED", "Durable terminal status domain is invalid.");
|
|
207
303
|
if (!string.IsNullOrEmpty(selectorDigest)) ValidateTerminalIdentity(scope, requestId, selectorDigest);
|
|
208
304
|
if (envelope == null) throw new ArgumentNullException("envelope");
|
|
209
305
|
var cache = LoadTerminalCache();
|
|
@@ -212,7 +308,8 @@ namespace UnityCli
|
|
|
212
308
|
if (!string.Equals(Text(entry, "scope"), scope, StringComparison.Ordinal)
|
|
213
309
|
|| !string.Equals(Text(entry, "requestId"), requestId, StringComparison.Ordinal)) continue;
|
|
214
310
|
if (!string.Equals(Text(entry, "requestDigest"), requestDigest, StringComparison.Ordinal)
|
|
215
|
-
|| (!string.IsNullOrEmpty(selectorDigest) && !string.Equals(Text(entry, "selectorDigest"), selectorDigest, StringComparison.Ordinal))
|
|
311
|
+
|| (!string.IsNullOrEmpty(selectorDigest) && !string.Equals(Text(entry, "selectorDigest"), selectorDigest, StringComparison.Ordinal))
|
|
312
|
+
|| (!string.IsNullOrEmpty(statusDomain) && !string.Equals(Text(entry, "statusDomain"), statusDomain, StringComparison.Ordinal)))
|
|
216
313
|
throw new BridgeCommandException("E_REQUEST_ID_REUSED", "Terminal requestId was reused with different input.");
|
|
217
314
|
object stored;
|
|
218
315
|
if (!entry.TryGetValue("envelope", out stored) || stored == null)
|
|
@@ -228,6 +325,7 @@ namespace UnityCli
|
|
|
228
325
|
{ "storedAt", DateTimeOffset.UtcNow.ToString("O", CultureInfo.InvariantCulture) }, { "envelope", envelope }
|
|
229
326
|
};
|
|
230
327
|
if (!string.IsNullOrEmpty(selectorDigest)) added["selectorDigest"] = selectorDigest;
|
|
328
|
+
if (!string.IsNullOrEmpty(statusDomain)) added["statusDomain"] = statusDomain;
|
|
231
329
|
if (Encoding.UTF8.GetByteCount(UnityCliSerializer.Serialize(added)) > MaxTerminalEntryBytes)
|
|
232
330
|
throw new BridgeCommandException("E_EXECUTION_TIMEOUT", "Durable terminal envelope exceeds its fixed size limit; outcome is unknown.");
|
|
233
331
|
cache.Entries.Add(added);
|
|
@@ -299,6 +397,10 @@ namespace UnityCli
|
|
|
299
397
|
throw new InvalidDataException("Durable terminal cache contains a duplicate or retired request identity.");
|
|
300
398
|
object selectorValue;
|
|
301
399
|
if (entry.TryGetValue("selectorDigest", out selectorValue)) ValidateTerminalIdentity(scope, requestId, selectorValue as string);
|
|
400
|
+
object statusDomainValue;
|
|
401
|
+
if (entry.TryGetValue("statusDomain", out statusDomainValue)
|
|
402
|
+
&& (!(statusDomainValue is string) || string.IsNullOrWhiteSpace((string)statusDomainValue) || ((string)statusDomainValue).Length > 80))
|
|
403
|
+
throw new InvalidDataException("Durable terminal status domain is invalid.");
|
|
302
404
|
object envelopeValue;
|
|
303
405
|
var envelope = entry.TryGetValue("envelope", out envelopeValue) ? envelopeValue as Dictionary<string, object> : null;
|
|
304
406
|
object envelopeRequestId;
|
|
@@ -351,10 +453,17 @@ namespace UnityCli
|
|
|
351
453
|
return string.Concat(Array.ConvertAll(sha.ComputeHash(Encoding.UTF8.GetBytes(scope + "\0" + requestId)), value => value.ToString("x2")));
|
|
352
454
|
}
|
|
353
455
|
|
|
354
|
-
private static void
|
|
456
|
+
private static void ValidateRequestId(string scope, string requestId)
|
|
355
457
|
{
|
|
356
458
|
ActiveOperationPath(scope);
|
|
357
|
-
if (string.IsNullOrWhiteSpace(requestId) || requestId.Length > 200
|
|
459
|
+
if (string.IsNullOrWhiteSpace(requestId) || requestId.Length > 200)
|
|
460
|
+
throw new BridgeCommandException("E_EXECUTION_FAILED", "Durable terminal identity is invalid.");
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
private static void ValidateTerminalIdentity(string scope, string requestId, string requestDigest)
|
|
464
|
+
{
|
|
465
|
+
ValidateRequestId(scope, requestId);
|
|
466
|
+
if (string.IsNullOrWhiteSpace(requestDigest) || requestDigest.Length != 64)
|
|
358
467
|
throw new BridgeCommandException("E_EXECUTION_FAILED", "Durable terminal identity is invalid.");
|
|
359
468
|
foreach (var character in requestDigest)
|
|
360
469
|
if (!Uri.IsHexDigit(character)) throw new BridgeCommandException("E_EXECUTION_FAILED", "Durable terminal identity is invalid.");
|