@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.
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 +35 -42
  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
@@ -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
- try
154
- {
155
- UnityCliToolCompletionContract contract;
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 SerializeBridgeExceptionEnvelope(request.RequestId, exception); }
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