@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.
Files changed (420) hide show
  1. package/README.md +5 -5
  2. package/contracts/command-contract.json +109 -217
  3. package/contracts/package-files.json +374 -294
  4. package/contracts/stable-session/direct-call-semantics.json +8 -2
  5. package/contracts/tool-completion-contract.json +148 -672
  6. package/dist/bridge/admission.d.ts +17 -1
  7. package/dist/bridge/admission.js +2 -0
  8. package/dist/bridge/admission.js.map +1 -1
  9. package/dist/bridge/domains/asset.js +3 -1
  10. package/dist/bridge/domains/asset.js.map +1 -1
  11. package/dist/bridge/domains/camera.js +39 -7
  12. package/dist/bridge/domains/camera.js.map +1 -1
  13. package/dist/bridge/domains/console.js +2 -1
  14. package/dist/bridge/domains/console.js.map +1 -1
  15. package/dist/bridge/domains/doctor.d.ts +3 -0
  16. package/dist/bridge/domains/doctor.js +8 -0
  17. package/dist/bridge/domains/doctor.js.map +1 -0
  18. package/dist/bridge/domains/editor.js +0 -4
  19. package/dist/bridge/domains/editor.js.map +1 -1
  20. package/dist/bridge/domains/game-object.js +4 -12
  21. package/dist/bridge/domains/game-object.js.map +1 -1
  22. package/dist/bridge/domains/graphics.js +1 -16
  23. package/dist/bridge/domains/graphics.js.map +1 -1
  24. package/dist/bridge/domains/object.js +3 -0
  25. package/dist/bridge/domains/object.js.map +1 -1
  26. package/dist/bridge/domains/physics.js +1 -2
  27. package/dist/bridge/domains/physics.js.map +1 -1
  28. package/dist/bridge/domains/profiler.js +18 -7
  29. package/dist/bridge/domains/profiler.js.map +1 -1
  30. package/dist/bridge/domains/project-tool.js +4 -0
  31. package/dist/bridge/domains/project-tool.js.map +1 -1
  32. package/dist/bridge/domains/reflection.js +10 -2
  33. package/dist/bridge/domains/reflection.js.map +1 -1
  34. package/dist/bridge/domains/runtime-tool.js +3 -0
  35. package/dist/bridge/domains/runtime-tool.js.map +1 -1
  36. package/dist/bridge/domains/scene.js +3 -8
  37. package/dist/bridge/domains/scene.js.map +1 -1
  38. package/dist/bridge/domains/screenshot.js +30 -6
  39. package/dist/bridge/domains/screenshot.js.map +1 -1
  40. package/dist/bridge/domains/ui.js +3 -1
  41. package/dist/bridge/domains/ui.js.map +1 -1
  42. package/dist/bridge/index.d.ts +5 -5
  43. package/dist/bridge/index.js +6 -9
  44. package/dist/bridge/index.js.map +1 -1
  45. package/dist/bridge/registry.js +3 -5
  46. package/dist/bridge/registry.js.map +1 -1
  47. package/dist/bridge/session-supervisor.d.ts +6 -3
  48. package/dist/bridge/session-supervisor.js +122 -34
  49. package/dist/bridge/session-supervisor.js.map +1 -1
  50. package/dist/bridge/types.d.ts +6 -5
  51. package/dist/bridge/types.js +16 -2
  52. package/dist/bridge/types.js.map +1 -1
  53. package/dist/catalog-protocol.d.ts +64 -0
  54. package/dist/catalog-protocol.js +460 -0
  55. package/dist/catalog-protocol.js.map +1 -0
  56. package/dist/cli-commands/command.js +84 -61
  57. package/dist/cli-commands/command.js.map +1 -1
  58. package/dist/cli-commands/extensions.js +70 -50
  59. package/dist/cli-commands/extensions.js.map +1 -1
  60. package/dist/cli-commands/instances.js +1 -1
  61. package/dist/cli-commands/instances.js.map +1 -1
  62. package/dist/cli-process-owners.d.ts +6 -0
  63. package/dist/cli-process-owners.js +27 -0
  64. package/dist/cli-process-owners.js.map +1 -0
  65. package/dist/cli.d.ts +1 -1
  66. package/dist/cli.js +20 -5
  67. package/dist/cli.js.map +1 -1
  68. package/dist/contracts/command-contract.js +14 -4
  69. package/dist/contracts/command-contract.js.map +1 -1
  70. package/dist/doctor.d.ts +4 -6
  71. package/dist/doctor.js +429 -398
  72. package/dist/doctor.js.map +1 -1
  73. package/dist/editor-blocker-observer.d.ts +2 -1
  74. package/dist/editor-blocker-observer.js +40 -13
  75. package/dist/editor-blocker-observer.js.map +1 -1
  76. package/dist/extension-availability.d.ts +27 -9
  77. package/dist/extension-availability.js +96 -56
  78. package/dist/extension-availability.js.map +1 -1
  79. package/dist/extensions/descriptor-loader.d.ts +2 -2
  80. package/dist/extensions/descriptor-loader.js +3 -4
  81. package/dist/extensions/descriptor-loader.js.map +1 -1
  82. package/dist/extensions/index.d.ts +1 -1
  83. package/dist/extensions/index.js +1 -1
  84. package/dist/extensions/index.js.map +1 -1
  85. package/dist/extensions/installer.d.ts +24 -7
  86. package/dist/extensions/installer.js +142 -66
  87. package/dist/extensions/installer.js.map +1 -1
  88. package/dist/extensions/registry.js +3 -5
  89. package/dist/extensions/registry.js.map +1 -1
  90. package/dist/extensions/state-contract.d.ts +11 -0
  91. package/dist/extensions/state-contract.js +50 -0
  92. package/dist/extensions/state-contract.js.map +1 -0
  93. package/dist/instances.d.ts +13 -1
  94. package/dist/instances.js +26 -0
  95. package/dist/instances.js.map +1 -1
  96. package/dist/package-manager.d.ts +0 -24
  97. package/dist/package-manager.js +5 -58
  98. package/dist/package-manager.js.map +1 -1
  99. package/dist/project-tool-discovery.d.ts +5 -2
  100. package/dist/project-tool-discovery.js +22 -18
  101. package/dist/project-tool-discovery.js.map +1 -1
  102. package/dist/runtime-code.js +1 -1
  103. package/dist/runtime-code.js.map +1 -1
  104. package/dist/tool-name.d.ts +4 -0
  105. package/dist/tool-name.js +15 -0
  106. package/dist/tool-name.js.map +1 -0
  107. package/dist/tools/.generated-completion-registry.d.ts +2 -0
  108. package/dist/tools/.generated-completion-registry.js +763 -325
  109. package/dist/tools/.generated-completion-registry.js.map +1 -1
  110. package/dist/tools/.generated-registry.d.ts +6 -11
  111. package/dist/tools/.generated-registry.js +6 -11
  112. package/dist/tools/.generated-registry.js.map +1 -1
  113. package/dist/tools/.generated-schemas.js +11 -16
  114. package/dist/tools/.generated-schemas.js.map +1 -1
  115. package/dist/tools/asset/refresh-status.d.ts +3 -0
  116. package/dist/tools/asset/refresh-status.js +12 -0
  117. package/dist/tools/asset/refresh-status.js.map +1 -0
  118. package/dist/tools/asset/refresh.js +7 -3
  119. package/dist/tools/asset/refresh.js.map +1 -1
  120. package/dist/tools/build/player-status.d.ts +3 -0
  121. package/dist/tools/build/player-status.js +12 -0
  122. package/dist/tools/build/player-status.js.map +1 -0
  123. package/dist/tools/build/run.js +1 -1
  124. package/dist/tools/build/run.js.map +1 -1
  125. package/dist/tools/catalog-control.d.ts +22 -0
  126. package/dist/tools/catalog-control.js +335 -0
  127. package/dist/tools/catalog-control.js.map +1 -0
  128. package/dist/tools/catalog.d.ts +7 -9
  129. package/dist/tools/catalog.js +66 -45
  130. package/dist/tools/catalog.js.map +1 -1
  131. package/dist/tools/commands.d.ts +1 -1
  132. package/dist/tools/commands.js +44 -11
  133. package/dist/tools/commands.js.map +1 -1
  134. package/dist/tools/define.js +3 -2
  135. package/dist/tools/define.js.map +1 -1
  136. package/dist/tools/dispatcher.d.ts +53 -6
  137. package/dist/tools/dispatcher.js +277 -108
  138. package/dist/tools/dispatcher.js.map +1 -1
  139. package/dist/tools/editor/compile.js +1 -1
  140. package/dist/tools/editor/compile.js.map +1 -1
  141. package/dist/tools/editor/play-mode-status.d.ts +3 -0
  142. package/dist/tools/editor/play-mode-status.js +12 -0
  143. package/dist/tools/editor/play-mode-status.js.map +1 -0
  144. package/dist/tools/editor/readiness.d.ts +0 -1
  145. package/dist/tools/editor/readiness.js +0 -1
  146. package/dist/tools/editor/readiness.js.map +1 -1
  147. package/dist/tools/editor/refresh.d.ts +7 -3
  148. package/dist/tools/editor/refresh.js +20 -15
  149. package/dist/tools/editor/refresh.js.map +1 -1
  150. package/dist/tools/editor/state.d.ts +2 -2
  151. package/dist/tools/editor/state.js +13 -12
  152. package/dist/tools/editor/state.js.map +1 -1
  153. package/dist/tools/metadata/derived.js +1 -7
  154. package/dist/tools/metadata/derived.js.map +1 -1
  155. package/dist/tools/metadata/status.js +1 -12
  156. package/dist/tools/metadata/status.js.map +1 -1
  157. package/dist/tools/metadata/types.d.ts +0 -2
  158. package/dist/tools/navmesh/live.js +1 -1
  159. package/dist/tools/navmesh/live.js.map +1 -1
  160. package/dist/tools/occlusion/live.js +1 -1
  161. package/dist/tools/occlusion/live.js.map +1 -1
  162. package/dist/tools/package/deploy.js +2 -2
  163. package/dist/tools/package/deploy.js.map +1 -1
  164. package/dist/tools/package/embed.js +1 -1
  165. package/dist/tools/package/embed.js.map +1 -1
  166. package/dist/tools/package/install-status.d.ts +3 -0
  167. package/dist/tools/package/install-status.js +12 -0
  168. package/dist/tools/package/install-status.js.map +1 -0
  169. package/dist/tools/package/install.js +3 -3
  170. package/dist/tools/package/install.js.map +1 -1
  171. package/dist/tools/package/live-resolve.js +45 -12
  172. package/dist/tools/package/live-resolve.js.map +1 -1
  173. package/dist/tools/package/registry-clear.js.map +1 -1
  174. package/dist/tools/package/registry-set.js.map +1 -1
  175. package/dist/tools/package/remove-status.d.ts +3 -0
  176. package/dist/tools/package/remove-status.js +12 -0
  177. package/dist/tools/package/remove-status.js.map +1 -0
  178. package/dist/tools/package/remove.js +3 -3
  179. package/dist/tools/package/remove.js.map +1 -1
  180. package/dist/tools/package/resolve.js +3 -3
  181. package/dist/tools/package/resolve.js.map +1 -1
  182. package/dist/tools/package/restore.js +2 -2
  183. package/dist/tools/package/restore.js.map +1 -1
  184. package/dist/tools/package/scoped-registry-add.js.map +1 -1
  185. package/dist/tools/status/support.d.ts +13 -0
  186. package/dist/tools/status/support.js +28 -0
  187. package/dist/tools/status/support.js.map +1 -0
  188. package/dist/tools/test/cancel.js +2 -2
  189. package/dist/tools/test/cancel.js.map +1 -1
  190. package/dist/tools/test/run-status.d.ts +3 -0
  191. package/dist/tools/test/run-status.js +12 -0
  192. package/dist/tools/test/run-status.js.map +1 -0
  193. package/dist/tools/test/run.js +7 -4
  194. package/dist/tools/test/run.js.map +1 -1
  195. package/dist/tools/tools/group-summaries.js +10 -14
  196. package/dist/tools/tools/group-summaries.js.map +1 -1
  197. package/docs/architecture.md +4 -4
  198. package/docs/availability-differences.md +4 -4
  199. package/docs/command-execution.md +4 -3
  200. package/docs/error-codes.md +13 -5
  201. package/docs/extensions.md +1 -7
  202. package/docs/risk-and-side-effects.md +4 -3
  203. package/docs/safety-boundaries.md +3 -1
  204. package/docs/target-and-instance.md +1 -1
  205. package/docs/tool-discovery.md +17 -10
  206. package/docs/tool-execution.md +18 -7
  207. package/extensions/cinemachine/unitypkg/Editor/UnityCliExtensionAssembly.cs +3 -0
  208. package/extensions/hdrp/unitypkg/Editor/UnityCliExtensionAssembly.cs +3 -0
  209. package/extensions/probuilder/unitypkg/Editor/UnityCliExtensionAssembly.cs +3 -0
  210. package/extensions/urp/unitypkg/Editor/UnityCliExtensionAssembly.cs +3 -0
  211. package/extensions/vfx-graph/unitypkg/Editor/UnityCliExtensionAssembly.cs +3 -0
  212. package/package.json +2 -4
  213. package/skills/unitycli/SKILL.md +11 -2
  214. package/skills/unitycli/manifest.json +1 -1
  215. package/skills/unitycli/references/operation-protocol.md +3 -3
  216. package/unitypkg/Editor/AssemblyInfo.cs +5 -0
  217. package/unitypkg/Editor/Bridge/BridgeCommandRegistry.cs +49 -14
  218. package/unitypkg/Editor/Bridge/BridgeHttpServer.cs +9 -35
  219. package/unitypkg/Editor/Bridge/BridgeQueueState.cs +672 -0
  220. package/unitypkg/Editor/Bridge/BridgeWorkQueue.cs +970 -120
  221. package/unitypkg/Editor/BridgeStartupStateMachine.cs +59 -1
  222. package/unitypkg/Editor/Commands/ProjectToolCommands.cs +4 -0
  223. package/unitypkg/Editor/Commands/RuntimeToolCommands.cs +3 -0
  224. package/unitypkg/Editor/Generated/UnityCliToolCompletionRegistry.g.cs +379 -14
  225. package/unitypkg/Editor/Infrastructure/CodeExecSupport.cs +28 -13
  226. package/unitypkg/Editor/Infrastructure/RegistryOwnershipResolver.cs +132 -105
  227. package/unitypkg/Editor/Infrastructure/UnityCliActiveOperation.cs +138 -29
  228. package/unitypkg/Editor/Infrastructure/UnityCliAdmission.cs +1856 -237
  229. package/unitypkg/Editor/Infrastructure/UnityCliDoctorDiagnostics.cs +220 -0
  230. package/unitypkg/Editor/Infrastructure/UnityCliDurableStatusCoordinator.cs +118 -0
  231. package/unitypkg/Editor/Infrastructure/UnityCliEditorStateSnapshot.cs +2 -1
  232. package/unitypkg/Editor/Infrastructure/UnityCliHierarchyPager.cs +203 -0
  233. package/unitypkg/Editor/Infrastructure/UnityCliInstanceCleanup.cs +2 -1
  234. package/unitypkg/Editor/Infrastructure/UnityCliInstanceRegistry.cs +201 -63
  235. package/unitypkg/Editor/Infrastructure/UnityCliJson.cs +2 -3
  236. package/unitypkg/Editor/Infrastructure/UnityCliLiveBuildCoordinator.cs +289 -46
  237. package/unitypkg/Editor/Infrastructure/UnityCliLiveRefreshCoordinator.cs +87 -53
  238. package/unitypkg/Editor/Infrastructure/UnityCliNavMeshBakeCoordinator.cs +4 -4
  239. package/unitypkg/Editor/Infrastructure/UnityCliObjectRef.cs +128 -25
  240. package/unitypkg/Editor/Infrastructure/UnityCliObjectSerializer.cs +435 -327
  241. package/unitypkg/Editor/Infrastructure/UnityCliOcclusionBakeCoordinator.cs +4 -4
  242. package/unitypkg/Editor/Infrastructure/UnityCliOperationCoordinator.cs +351 -53
  243. package/unitypkg/Editor/Infrastructure/UnityCliPackageResolveCoordinator.cs +118 -18
  244. package/unitypkg/Editor/Infrastructure/UnityCliPackageResolveState.cs +20 -1
  245. package/unitypkg/Editor/Infrastructure/UnityCliReadGeneration.cs +97 -0
  246. package/unitypkg/Editor/Infrastructure/UnityCliReflection.cs +644 -133
  247. package/unitypkg/Editor/Infrastructure/UnityCliReloadOperation.cs +128 -41
  248. package/unitypkg/Editor/Infrastructure/UnityCliRuntimeExecutor.cs +14 -84
  249. package/unitypkg/Editor/Infrastructure/UnityCliSerializer.cs +220 -0
  250. package/unitypkg/Editor/Infrastructure/UnityCliSessionMutationLease.cs +69 -29
  251. package/unitypkg/Editor/Infrastructure/UnityCliTestRunCoordinator.cs +440 -54
  252. package/unitypkg/Editor/Infrastructure/UnityCliWaiter.cs +128 -35
  253. package/unitypkg/Editor/ProjectTools/IUnityCliTool.cs +9 -1
  254. package/unitypkg/Editor/ProjectTools/OfficialAttributeToolRegistry.cs +32 -31
  255. package/unitypkg/Editor/ProjectTools/ProjectToolRegistry.cs +607 -458
  256. package/unitypkg/Editor/ProjectTools/ProjectToolSchemaValidator.cs +35 -7
  257. package/unitypkg/Editor/ProjectTools/RegisteredTool.cs +501 -60
  258. package/unitypkg/Editor/ProjectTools/UnityCliProjectToolContext.cs +21 -0
  259. package/unitypkg/Editor/ProjectTools/UnityCliSchemaDeriver.cs +36 -7
  260. package/unitypkg/Editor/ProjectTools/UnityCliToolName.cs +30 -0
  261. package/unitypkg/Editor/Properties/AssemblyInfo.cs +3 -0
  262. package/unitypkg/Editor/Tools/asset/get-data.cs +16 -7
  263. package/unitypkg/Editor/Tools/build/BuildSceneStateTool.cs +23 -3
  264. package/unitypkg/Editor/Tools/build/BuildToolDtos.cs +2 -1
  265. package/unitypkg/Editor/Tools/build/scene/add.cs +6 -3
  266. package/unitypkg/Editor/Tools/build/scene/disable.cs +1 -1
  267. package/unitypkg/Editor/Tools/build/scene/enable.cs +1 -1
  268. package/unitypkg/Editor/Tools/build/scene/list.cs +1 -1
  269. package/unitypkg/Editor/Tools/build/scene/remove.cs +13 -3
  270. package/unitypkg/Editor/Tools/camera/CameraToolSupport.cs +38 -38
  271. package/unitypkg/Editor/Tools/camera/multiview.cs +13 -6
  272. package/unitypkg/Editor/Tools/camera/screenshot.cs +14 -7
  273. package/unitypkg/Editor/Tools/component/get.cs +16 -9
  274. package/unitypkg/Editor/Tools/component/modify.cs +6 -4
  275. package/unitypkg/Editor/Tools/console/clear.cs +7 -6
  276. package/unitypkg/Editor/Tools/console/get.cs +48 -16
  277. package/unitypkg/Editor/Tools/editor/EditorToolSupport.cs +143 -28
  278. package/unitypkg/Editor/Tools/editor/menu-items.cs +1 -1
  279. package/unitypkg/Editor/Tools/editor/play.cs +2 -11
  280. package/unitypkg/Editor/Tools/editor/selection.cs +1 -1
  281. package/unitypkg/Editor/Tools/editor/stop.cs +2 -11
  282. package/unitypkg/Editor/Tools/editor/windows.cs +1 -1
  283. package/unitypkg/Editor/Tools/go/GameObjectToolSupport.cs +54 -4
  284. package/unitypkg/Editor/Tools/go/delete.cs +1 -1
  285. package/unitypkg/Editor/Tools/go/find.cs +167 -70
  286. package/unitypkg/Editor/Tools/graphics/GraphicsToolSupport.cs +25 -0
  287. package/unitypkg/Editor/Tools/graphics/light-probe-group.cs +9 -3
  288. package/unitypkg/Editor/Tools/graphics/pipeline-info.cs +1 -1
  289. package/unitypkg/Editor/Tools/graphics/pipeline-settings.cs +1 -1
  290. package/unitypkg/Editor/Tools/graphics/quality.cs +2 -2
  291. package/unitypkg/Editor/Tools/graphics/reflection-probe.cs +3 -3
  292. package/unitypkg/Editor/Tools/graphics/stats.cs +1 -1
  293. package/unitypkg/Editor/Tools/object/ObjectToolSupport.cs +4 -4
  294. package/unitypkg/Editor/Tools/object/get-data.cs +9 -7
  295. package/unitypkg/Editor/Tools/object/modify.cs +7 -5
  296. package/unitypkg/Editor/Tools/physics/raycast.cs +24 -6
  297. package/unitypkg/Editor/Tools/prefab/stage.cs +1 -1
  298. package/unitypkg/Editor/Tools/profiler/ProfilerFrameDebuggerSupport.cs +94 -21
  299. package/unitypkg/Editor/Tools/profiler/ProfilerMemorySnapshotSupport.cs +397 -10
  300. package/unitypkg/Editor/Tools/profiler/ProfilerToolSupport.cs +18 -4
  301. package/unitypkg/Editor/Tools/profiler/frame-debugger/enable.cs +1 -1
  302. package/unitypkg/Editor/Tools/profiler/frame-debugger/events.cs +88 -87
  303. package/unitypkg/Editor/Tools/profiler/hierarchy.cs +278 -112
  304. package/unitypkg/Editor/Tools/profiler/memory-snapshot/compare.cs +9 -5
  305. package/unitypkg/Editor/Tools/profiler/memory-snapshot/list.cs +37 -35
  306. package/unitypkg/Editor/Tools/profiler/memory-snapshot/take.cs +99 -97
  307. package/unitypkg/Editor/Tools/project/info.cs +1 -1
  308. package/unitypkg/Editor/Tools/project/layers.cs +1 -1
  309. package/unitypkg/Editor/Tools/project/tags.cs +1 -1
  310. package/unitypkg/Editor/Tools/reflection/method/call.cs +9 -7
  311. package/unitypkg/Editor/Tools/reflection/method/find.cs +27 -37
  312. package/unitypkg/Editor/Tools/reflection/type/schema.cs +24 -28
  313. package/unitypkg/Editor/Tools/scene/gameobject/component.cs +8 -5
  314. package/unitypkg/Editor/Tools/scene/gameobject/components.cs +10 -7
  315. package/unitypkg/Editor/Tools/scene/gameobject-support.cs +104 -8
  316. package/unitypkg/Editor/Tools/scene/gameobject.cs +37 -16
  317. package/unitypkg/Editor/Tools/scene/hierarchy.cs +146 -142
  318. package/unitypkg/Editor/Tools/screenshot/EditorElementCaptureToolSupport.cs +77 -25
  319. package/unitypkg/Editor/Tools/screenshot/ScreenshotToolSupport.cs +315 -95
  320. package/unitypkg/Editor/Tools/screenshot/editor-element.cs +7 -5
  321. package/unitypkg/Editor/Tools/screenshot/game-view.cs +35 -21
  322. package/unitypkg/Editor/Tools/screenshot/isolated-object.cs +29 -23
  323. package/unitypkg/Editor/Tools/screenshot/orbit.cs +37 -25
  324. package/unitypkg/Editor/Tools/screenshot/scene-view.cs +25 -18
  325. package/unitypkg/Editor/Tools/screenshot/screen.cs +177 -17
  326. package/unitypkg/Editor/Tools/screenshot/surround.cs +83 -79
  327. package/unitypkg/Editor/Tools/ui/render-preview.cs +16 -11
  328. package/unitypkg/Editor/UnityCliBridge.cs +97 -34
  329. package/unitypkg/Runtime/Infrastructure/UnityCliRuntimeBridge.cs +753 -122
  330. package/unitypkg/Runtime/Properties/AssemblyInfo.cs +5 -0
  331. package/unitypkg/Runtime/UnityCli.Runtime.asmdef +1 -1
  332. package/unitypkg/Shared/AssemblyInfo.cs +4 -0
  333. package/unitypkg/Shared/UnityCliAdmissionPool.cs +265 -75
  334. package/unitypkg/Shared/UnityCliBridgeQueuePolicy.cs +410 -0
  335. package/unitypkg/Shared/UnityCliBridgeWorkItemState.cs +47 -0
  336. package/unitypkg/Shared/UnityCliExceptionProjection.cs +151 -0
  337. package/unitypkg/Shared/UnityCliQueuePublication.cs +30 -0
  338. package/unitypkg/Shared/UnityCliRequestBudget.cs +352 -0
  339. package/unitypkg/Shared/UnityCliRuntimeRequestPublication.cs +107 -0
  340. package/unitypkg/Tests/Editor/UnityCli.Editor.Tests.asmdef +2 -2
  341. package/unitypkg/Tests/Editor/UnityCliAdmissionCoordinatorIntegrationTests.cs +1329 -0
  342. package/unitypkg/Tests/Editor/UnityCliAdmissionPoolTests.cs +311 -114
  343. package/unitypkg/Tests/Editor/UnityCliAdmissionRepairStateTests.cs +94 -0
  344. package/unitypkg/Tests/Editor/UnityCliBridgeAdmissionIntegrationTests.cs +1229 -0
  345. package/unitypkg/Tests/Editor/UnityCliBridgeQueuePolicyTests.cs +412 -0
  346. package/unitypkg/Tests/Editor/UnityCliContinuationIntegrationTests.cs +292 -0
  347. package/unitypkg/Tests/Editor/UnityCliDiagnosticBoundaryTests.cs +120 -0
  348. package/unitypkg/Tests/Editor/UnityCliDurableStatusTests.cs +84 -0
  349. package/unitypkg/Tests/Editor/UnityCliExceptionProjectionTests.cs +72 -0
  350. package/unitypkg/Tests/Editor/UnityCliInstancePublicationRetryTests.cs +180 -97
  351. package/unitypkg/Tests/Editor/UnityCliMemoryReflectionIntegrationTests.cs +434 -0
  352. package/unitypkg/Tests/Editor/UnityCliRequestBudgetTests.cs +615 -0
  353. package/unitypkg/Tests/Editor/UnityCliRuntimeBridgeIntegrationTests.cs +520 -0
  354. package/unitypkg/Tests/Editor/UnityCliToolCatalogTests.cs +562 -0
  355. package/unitypkg/Tests/Runtime/UnityCli.Runtime.Tests.asmdef +23 -0
  356. package/unitypkg/Tests/Runtime/UnityCliRuntimeCatalogValidationTests.cs +29 -0
  357. package/unitypkg/package.json +1 -1
  358. package/contracts/static-capability-catalog.json +0 -48226
  359. package/dist/bridge/domains/diagnose.d.ts +0 -2
  360. package/dist/bridge/domains/diagnose.js +0 -11
  361. package/dist/bridge/domains/diagnose.js.map +0 -1
  362. package/dist/bridge/domains/extension.d.ts +0 -8
  363. package/dist/bridge/domains/extension.js +0 -20
  364. package/dist/bridge/domains/extension.js.map +0 -1
  365. package/dist/capabilities.d.ts +0 -5
  366. package/dist/capabilities.js +0 -84
  367. package/dist/capabilities.js.map +0 -1
  368. package/dist/static-capability-catalog.d.ts +0 -13
  369. package/dist/static-capability-catalog.js +0 -41
  370. package/dist/static-capability-catalog.js.map +0 -1
  371. package/dist/tools/diagnose/capabilities.d.ts +0 -13
  372. package/dist/tools/diagnose/capabilities.js +0 -34
  373. package/dist/tools/diagnose/capabilities.js.map +0 -1
  374. package/dist/tools/package/info.d.ts +0 -19
  375. package/dist/tools/package/info.js +0 -27
  376. package/dist/tools/package/info.js.map +0 -1
  377. package/dist/tools/package/list.d.ts +0 -27
  378. package/dist/tools/package/list.js +0 -21
  379. package/dist/tools/package/list.js.map +0 -1
  380. package/dist/tools/package/registry-get.d.ts +0 -10
  381. package/dist/tools/package/registry-get.js +0 -22
  382. package/dist/tools/package/registry-get.js.map +0 -1
  383. package/dist/tools/package/scoped-registry-list.d.ts +0 -14
  384. package/dist/tools/package/scoped-registry-list.js +0 -22
  385. package/dist/tools/package/scoped-registry-list.js.map +0 -1
  386. package/dist/tools/package/search.d.ts +0 -17
  387. package/dist/tools/package/search.js +0 -39
  388. package/dist/tools/package/search.js.map +0 -1
  389. package/dist/tools/package/status.d.ts +0 -21
  390. package/dist/tools/package/status.js +0 -37
  391. package/dist/tools/package/status.js.map +0 -1
  392. package/dist/tools/tools/describe.d.ts +0 -27
  393. package/dist/tools/tools/describe.js +0 -35
  394. package/dist/tools/tools/describe.js.map +0 -1
  395. package/dist/tools/tools/group-list.d.ts +0 -16
  396. package/dist/tools/tools/group-list.js +0 -38
  397. package/dist/tools/tools/group-list.js.map +0 -1
  398. package/dist/tools/tools/group.d.ts +0 -13
  399. package/dist/tools/tools/group.js +0 -34
  400. package/dist/tools/tools/group.js.map +0 -1
  401. package/dist/tools/tools/pagination.d.ts +0 -17
  402. package/dist/tools/tools/pagination.js +0 -28
  403. package/dist/tools/tools/pagination.js.map +0 -1
  404. package/dist/tools/tools/search.d.ts +0 -15
  405. package/dist/tools/tools/search.js +0 -42
  406. package/dist/tools/tools/search.js.map +0 -1
  407. package/unitypkg/Editor/Tools/diagnose/preflight.cs +0 -269
  408. package/unitypkg/Editor/Tools/editor/console.cs +0 -26
  409. package/unitypkg/Editor/Tools/extension/status.cs +0 -87
  410. package/unitypkg/Editor/Tools/go/inspect.cs +0 -49
  411. package/unitypkg/Editor/Tools/graphics/pipeline-quality.cs +0 -24
  412. package/unitypkg/Editor/Tools/graphics/probe-positions.cs +0 -58
  413. package/unitypkg/Editor/Tools/graphics/settings.cs +0 -104
  414. package/unitypkg/Editor/Tools/graphics/stats-counters.cs +0 -28
  415. package/unitypkg/Editor/Tools/graphics/stats-memory.cs +0 -21
  416. package/unitypkg/Editor/Tools/instances/list.cs +0 -71
  417. package/unitypkg/Editor/Tools/physics/raycast-all.cs +0 -67
  418. package/unitypkg/Editor/Tools/scene/build-settings.cs +0 -69
  419. package/unitypkg/Editor/Tools/scene/data.cs +0 -125
  420. 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后先写exact cleanup marker,再清active root并重试释放lease。</summary>
56
- internal static void BeginExactTerminalCleanup(string scope, string requestId, string requestDigest, bool completeAdmission = true)
55
+ /// <summary>terminal已durable后以三段式transfer取得TerminalCleanup owner,再清rootlease。</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 = Load(cleanupScope);
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
- var marker = new Dictionary<string, object>
74
+ existing = new Dictionary<string, object>
70
75
  {
71
76
  { "requestId", requestId }, { "requestDigest", requestDigest },
72
77
  { "editorSessionId", UnityCliBridge.EditorSessionId() }, { "completeAdmission", completeAdmission }
73
78
  };
74
- UnityCliBridge.AddAdmissionOwnerFields(marker, requestId, completeAdmission ? UnityCliAdmissionPool.AdmissionOwnerKind.Coordinator : UnityCliAdmissionPool.AdmissionOwnerKind.WorkItem);
75
- Save(cleanupScope, marker);
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
- if (!(bool)current)
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
- var owner = UnityCliBridge.ReadAdmissionOwnerFields(existing, requestId);
84
- UnityCliBridge.AddAdmissionOwnerFields(existing, owner, UnityCliAdmissionPool.AdmissionOwnerKind.Coordinator);
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 = Load(cleanupScope);
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
- Clear(cleanupScope);
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 = Load(scope); }
138
+ try { active = LoadForState(state, scope); }
113
139
  catch
114
140
  {
115
141
  bool markerOwnsLease;
116
- if (!UnityCliBridge.UnityCliSessionMutationLease.TryIsOwnedBy(requestId, requestDigest, out markerOwnsLease)) return true;
117
- if (!markerOwnsLease) { Clear(cleanupScope); return false; }
118
- try { Clear(scope); active = null; }
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 { Clear(scope); }
155
+ try { ClearForTerminalCleanup(state, scope, cleanupBoundary); }
125
156
  catch { return true; }
126
157
  }
127
- UnityCliBridge.UnityCliSessionMutationLease.Release(requestId, requestDigest);
158
+ ReleaseLeaseForState(state, requestId, requestDigest);
128
159
  bool isOwned;
129
- if (!UnityCliBridge.UnityCliSessionMutationLease.TryIsOwnedBy(requestId, requestDigest, out isOwned) || isOwned) return true;
130
- if (completeAdmission && !UnityCliBridge.CompleteAdmissionRoot(admissionOwner)) return true;
131
- Clear(cleanupScope);
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 ValidateTerminalIdentity(string scope, string requestId, string requestDigest)
456
+ private static void ValidateRequestId(string scope, string requestId)
355
457
  {
356
458
  ActiveOperationPath(scope);
357
- if (string.IsNullOrWhiteSpace(requestId) || requestId.Length > 200 || string.IsNullOrWhiteSpace(requestDigest) || requestDigest.Length != 64)
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.");