@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
@@ -1,142 +1,225 @@
1
1
  #if UNITY_EDITOR
2
2
  using System;
3
3
  using System.Collections.Generic;
4
- using System.IO;
5
- using System.Reflection;
6
- using System.Text;
7
- using System.Threading;
8
4
  using NUnit.Framework;
9
5
 
10
6
  namespace UnityCli.Tests
11
7
  {
12
8
  public sealed class UnityCliInstancePublicationRetryTests
13
9
  {
14
- private Type bridgeType;
15
- private MethodInfo register;
16
- private MethodInfo tick;
17
- private MethodInfo cancel;
18
- private MethodInfo instanceId;
19
- private FieldInfo started;
20
- private FieldInfo exhausted;
21
- private FieldInfo attemptCount;
22
- private string originalDataRoot;
23
- private bool originalStarted;
24
- private string testRoot;
10
+ private double now;
11
+ private readonly Queue<InstancePublicationAttempt> attempts = new Queue<InstancePublicationAttempt>();
12
+ private readonly List<string> publishedStates = new List<string>();
13
+ private readonly List<string> logs = new List<string>();
25
14
 
26
15
  [SetUp]
27
16
  public void SetUp()
28
17
  {
29
- bridgeType = Type.GetType("UnityCli.UnityCliBridge, UnityCli.Editor", true);
30
- register = Method("RegisterInstance");
31
- tick = Method("TickInstancePublicationRetry");
32
- cancel = Method("CancelInstancePublicationRetry");
33
- instanceId = Method("InstanceId");
34
- started = Field("started");
35
- exhausted = Field("registryPublicationRetryExhausted");
36
- attemptCount = Field("registryPublicationAttemptCount");
37
- originalDataRoot = Environment.GetEnvironmentVariable("UNITYCLI_DATA_DIR");
38
- originalStarted = (bool)started.GetValue(null);
39
- testRoot = Path.Combine(Directory.GetCurrentDirectory(), "Library", "UnityCli", "instance-publication-retry-tests");
40
- if (Directory.Exists(testRoot)) Directory.Delete(testRoot, true);
41
- Directory.CreateDirectory(Path.Combine(testRoot, "instances"));
42
- Environment.SetEnvironmentVariable("UNITYCLI_DATA_DIR", testRoot);
43
- started.SetValue(null, true);
44
- cancel.Invoke(null, null);
18
+ now = 0;
19
+ attempts.Clear();
20
+ publishedStates.Clear();
21
+ logs.Clear();
45
22
  }
46
23
 
47
- [TearDown]
48
- public void TearDown()
24
+ [Test]
25
+ public void InitialRetryKeepsListenerClosedUntilTransitioningPublishesThenOpensOnce()
49
26
  {
50
- cancel.Invoke(null, null);
51
- started.SetValue(null, originalStarted);
52
- Environment.SetEnvironmentVariable("UNITYCLI_DATA_DIR", originalDataRoot);
53
- if (Directory.Exists(testRoot)) Directory.Delete(testRoot, true);
27
+ attempts.Enqueue(Failure(true, "io"));
28
+ attempts.Enqueue(Success());
29
+ var retry = CreateRetry();
30
+ var gate = new BridgeInitialPublicationGate();
31
+ var startup = new BridgeStartupStateMachine();
32
+ startup.BeginRegistryPublication();
33
+ var listenerRetained = true;
34
+ var queueOpen = false;
35
+ var listenLoopStarts = 0;
36
+ gate.Start();
37
+
38
+ Assert.That(Apply(gate, retry.Request("transitioning"), ref listenerRetained, ref queueOpen, ref listenLoopStarts),
39
+ Is.EqualTo(BridgeInitialPublicationAction.Wait));
40
+ Assert.That(listenerRetained, Is.True);
41
+ Assert.That(queueOpen, Is.False);
42
+ Assert.That(listenLoopStarts, Is.EqualTo(0));
43
+ Assert.That(retry.Pending, Is.True);
44
+ Assert.That(retry.AttemptCount, Is.EqualTo(1));
45
+ Assert.That(startup.Phase, Is.EqualTo(BridgeStartupPhase.RegistryPublication));
46
+ Assert.That(startup.Tick(false,
47
+ () => throw new InvalidOperationException("prime must not replay"),
48
+ () => throw new InvalidOperationException("handoff must not replay")),
49
+ Is.EqualTo(BridgeStartupTransition.RegistryPublicationPending));
50
+
51
+ now = 0.24;
52
+ Assert.That(retry.Tick(), Is.EqualTo(InstancePublicationRetryOutcome.None));
53
+ now = 0.25;
54
+ Assert.That(Apply(gate, retry.Tick(), ref listenerRetained, ref queueOpen, ref listenLoopStarts),
55
+ Is.EqualTo(BridgeInitialPublicationAction.OpenQueueAndListen));
56
+ startup.CompleteRegistryPublication();
57
+ Assert.That(publishedStates, Is.EqualTo(new[] { "transitioning", "transitioning" }));
58
+ Assert.That(listenerRetained, Is.True);
59
+ Assert.That(queueOpen, Is.True);
60
+ Assert.That(listenLoopStarts, Is.EqualTo(1));
61
+ Assert.That(gate.Published, Is.True);
62
+ Assert.That(startup.Phase, Is.EqualTo(BridgeStartupPhase.None));
63
+ Assert.That(retry.Pending, Is.False);
64
+ Assert.That(retry.AttemptCount, Is.EqualTo(0));
65
+
66
+ Assert.That(gate.Apply(InstancePublicationRetryOutcome.Written), Is.EqualTo(BridgeInitialPublicationAction.None));
67
+ Assert.That(listenLoopStarts, Is.EqualTo(1));
68
+ Assert.That(logs.Exists(value => value.Contains("instance_publication_retry_succeeded attempts=2")), Is.True);
54
69
  }
55
70
 
56
71
  [Test]
57
- public void TransientWriteFailureUsesLatestStateAndSucceedsOnOneRetry()
72
+ public void PendingPeriodicPublicationKeepsOneChainAndUsesLatestRequestedState()
58
73
  {
59
- var paths = Paths();
60
- using (new FileStream(paths.Temporary, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None))
61
- {
62
- Assert.That((bool)register.Invoke(null, new object[] { "transitioning" }), Is.False);
63
- Assert.That((bool)register.Invoke(null, new object[] { "ready" }), Is.False, "a second request must update the pending state without another write attempt");
64
- Assert.That((int)attemptCount.GetValue(null), Is.EqualTo(1));
65
- }
74
+ attempts.Enqueue(Failure(true, "io"));
75
+ attempts.Enqueue(Success());
76
+ var retry = CreateRetry();
77
+
78
+ Assert.That(retry.Request("transitioning"), Is.EqualTo(InstancePublicationRetryOutcome.Pending));
79
+ Assert.That(retry.Request("ready"), Is.EqualTo(InstancePublicationRetryOutcome.Pending));
80
+ Assert.That(retry.AttemptCount, Is.EqualTo(1));
81
+ Assert.That(publishedStates, Is.EqualTo(new[] { "transitioning" }));
82
+ now = 0.25;
83
+
84
+ Assert.That(retry.Tick(), Is.EqualTo(InstancePublicationRetryOutcome.Written));
85
+ Assert.That(publishedStates, Is.EqualTo(new[] { "transitioning", "ready" }));
86
+ Assert.That(retry.AttemptCount, Is.EqualTo(0));
87
+ }
88
+
89
+ [TestCase(2L, 1L, 1L, 2L)]
90
+ [TestCase(1L, 2L, 1L, 2L)]
91
+ public void InitialStaleGenerationOrSequenceStopsOldListenerWithoutOpeningQueue(
92
+ long previousGeneration,
93
+ long previousSequence,
94
+ long generation,
95
+ long sequence)
96
+ {
97
+ var result = UnityCliBridge.RegistryPublicationResultForTests(
98
+ previousGeneration, previousSequence, generation, sequence);
99
+ Assert.That(result, Is.EqualTo(RegistryPublicationResult.StaleSkipped));
100
+ attempts.Enqueue(new InstancePublicationAttempt(result, false, "stale"));
101
+ var retry = CreateRetry();
102
+ var gate = new BridgeInitialPublicationGate();
103
+ var listenerRetained = true;
104
+ var queueOpen = false;
105
+ var listenLoopStarts = 0;
106
+ gate.Start();
107
+
108
+ Assert.That(Apply(gate, retry.Request("transitioning"), ref listenerRetained, ref queueOpen, ref listenLoopStarts),
109
+ Is.EqualTo(BridgeInitialPublicationAction.StopListener));
66
110
 
67
- Thread.Sleep(300);
68
- tick.Invoke(null, null);
69
- Assert.That(File.Exists(paths.Registry), Is.True);
70
- Assert.That(File.Exists(paths.Temporary), Is.False);
71
- Assert.That((bool)exhausted.GetValue(null), Is.False);
72
- Assert.That((int)attemptCount.GetValue(null), Is.EqualTo(0));
73
- var record = ParseRecord(paths.Registry);
74
- var sessions = (List<object>)record["sessions"];
75
- var session = (Dictionary<string, object>)sessions[0];
76
- Assert.That(session["lifecycle"], Is.EqualTo("ready"));
111
+ Assert.That(listenerRetained, Is.False);
112
+ Assert.That(queueOpen, Is.False);
113
+ Assert.That(listenLoopStarts, Is.EqualTo(0));
114
+ Assert.That(gate.Published, Is.False);
115
+ Assert.That(retry.Pending, Is.False);
116
+ Assert.That(retry.Exhausted, Is.False);
117
+ Assert.That(retry.AttemptCount, Is.EqualTo(0));
77
118
  }
78
119
 
79
120
  [Test]
80
- public void PersistentWriteFailureStopsAtFourAndDoesNotStartAnotherChain()
121
+ public void RetryableFailureStopsListenerOnlyAfterFourthAttempt()
81
122
  {
82
- var paths = Paths();
83
- using (new FileStream(paths.Temporary, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None))
84
- {
85
- Assert.That((bool)register.Invoke(null, new object[] { "ready" }), Is.False);
86
- Thread.Sleep(300); tick.Invoke(null, null);
87
- Thread.Sleep(550); tick.Invoke(null, null);
88
- Thread.Sleep(1050); tick.Invoke(null, null);
89
- Assert.That((int)attemptCount.GetValue(null), Is.EqualTo(4));
90
- Assert.That((bool)exhausted.GetValue(null), Is.True);
91
- }
123
+ for (var index = 0; index < 4; index++) attempts.Enqueue(Failure(true, "lock-timeout"));
124
+ var retry = CreateRetry();
125
+ var gate = new BridgeInitialPublicationGate();
126
+ var listenerRetained = true;
127
+ var queueOpen = false;
128
+ var listenLoopStarts = 0;
129
+ gate.Start();
130
+
131
+ Assert.That(Apply(gate, retry.Request("transitioning"), ref listenerRetained, ref queueOpen, ref listenLoopStarts),
132
+ Is.EqualTo(BridgeInitialPublicationAction.Wait));
133
+ now = 0.25;
134
+ Assert.That(Apply(gate, retry.Tick(), ref listenerRetained, ref queueOpen, ref listenLoopStarts),
135
+ Is.EqualTo(BridgeInitialPublicationAction.Wait));
136
+ now = 0.75;
137
+ Assert.That(Apply(gate, retry.Tick(), ref listenerRetained, ref queueOpen, ref listenLoopStarts),
138
+ Is.EqualTo(BridgeInitialPublicationAction.Wait));
139
+ now = 1.75;
140
+ Assert.That(Apply(gate, retry.Tick(), ref listenerRetained, ref queueOpen, ref listenLoopStarts),
141
+ Is.EqualTo(BridgeInitialPublicationAction.StopListener));
92
142
 
93
- File.Delete(paths.Temporary);
94
- Thread.Sleep(1100);
95
- tick.Invoke(null, null);
96
- Assert.That((bool)register.Invoke(null, new object[] { "ready" }), Is.False);
97
- Assert.That((int)attemptCount.GetValue(null), Is.EqualTo(4));
98
- Assert.That(File.Exists(paths.Registry), Is.False);
99
- Assert.That(File.Exists(paths.Temporary), Is.False);
143
+ Assert.That(retry.AttemptCount, Is.EqualTo(4));
144
+ Assert.That(retry.Exhausted, Is.True);
145
+ Assert.That(listenerRetained, Is.False);
146
+ Assert.That(queueOpen, Is.False);
147
+ Assert.That(listenLoopStarts, Is.EqualTo(0));
148
+ Assert.That(logs.Exists(value => value.Contains("instance_publication_retry_stopped")), Is.True);
100
149
  }
101
150
 
102
151
  [Test]
103
- public void CancelClearsExhaustionForTheNextDomainOwner()
152
+ public void NonRetryableFailureStopsImmediatelyAndResetCreatesANewDomainChain()
104
153
  {
105
- var paths = Paths();
106
- using (new FileStream(paths.Temporary, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None))
107
- {
108
- Assert.That((bool)register.Invoke(null, new object[] { "ready" }), Is.False);
109
- }
110
- cancel.Invoke(null, null);
111
- Assert.That((bool)exhausted.GetValue(null), Is.False);
112
- Assert.That((int)attemptCount.GetValue(null), Is.EqualTo(0));
113
- Assert.That((bool)register.Invoke(null, new object[] { "ready" }), Is.True);
114
- Assert.That(File.Exists(paths.Registry), Is.True);
115
- Assert.That(File.Exists(paths.Temporary), Is.False);
154
+ attempts.Enqueue(Failure(false, "InvalidOperationException"));
155
+ var retry = CreateRetry();
156
+ var gate = new BridgeInitialPublicationGate();
157
+ var listenerRetained = true;
158
+ var queueOpen = false;
159
+ var listenLoopStarts = 0;
160
+ gate.Start();
161
+
162
+ Assert.That(Apply(gate, retry.Request("transitioning"), ref listenerRetained, ref queueOpen, ref listenLoopStarts),
163
+ Is.EqualTo(BridgeInitialPublicationAction.StopListener));
164
+ Assert.That(retry.Exhausted, Is.True);
165
+ Assert.That(retry.AttemptCount, Is.EqualTo(1));
166
+ Assert.That(listenerRetained, Is.False);
167
+
168
+ retry.Reset();
169
+ gate.Reset();
170
+ attempts.Enqueue(Success());
171
+ listenerRetained = true;
172
+ gate.Start();
173
+ Assert.That(Apply(gate, retry.Request("transitioning"), ref listenerRetained, ref queueOpen, ref listenLoopStarts),
174
+ Is.EqualTo(BridgeInitialPublicationAction.OpenQueueAndListen));
175
+ Assert.That(retry.Exhausted, Is.False);
176
+ Assert.That(queueOpen, Is.True);
177
+ Assert.That(listenLoopStarts, Is.EqualTo(1));
116
178
  }
117
179
 
118
- private (string Registry, string Temporary) Paths()
180
+ private UnityCliInstancePublicationRetry CreateRetry()
119
181
  {
120
- var id = (string)instanceId.Invoke(null, null);
121
- var registry = Path.Combine(testRoot, "instances", id + ".json");
122
- return (registry, registry + ".tmp");
182
+ return new UnityCliInstancePublicationRetry(
183
+ 4,
184
+ () => now,
185
+ state =>
186
+ {
187
+ publishedStates.Add(state);
188
+ if (attempts.Count == 0) throw new InvalidOperationException("Test registry boundary has no configured attempt.");
189
+ return attempts.Dequeue();
190
+ },
191
+ failedAttempts => failedAttempts <= 1 ? 0.25 : failedAttempts == 2 ? 0.5 : 1.0,
192
+ logs.Add);
123
193
  }
124
194
 
125
- private Dictionary<string, object> ParseRecord(string path)
195
+ private static BridgeInitialPublicationAction Apply(
196
+ BridgeInitialPublicationGate gate,
197
+ InstancePublicationRetryOutcome outcome,
198
+ ref bool listenerRetained,
199
+ ref bool queueOpen,
200
+ ref int listenLoopStarts)
126
201
  {
127
- var serializer = Type.GetType("UnityCli.UnityCliSerializer, UnityCli.Editor", true);
128
- var parse = serializer.GetMethod("Parse", BindingFlags.Public | BindingFlags.Static);
129
- return (Dictionary<string, object>)parse.Invoke(null, new object[] { File.ReadAllText(path, Encoding.UTF8) });
202
+ var action = gate.Apply(outcome);
203
+ if (action == BridgeInitialPublicationAction.OpenQueueAndListen)
204
+ {
205
+ queueOpen = true;
206
+ listenLoopStarts += 1;
207
+ }
208
+ else if (action == BridgeInitialPublicationAction.StopListener)
209
+ {
210
+ listenerRetained = false;
211
+ }
212
+ return action;
130
213
  }
131
214
 
132
- private MethodInfo Method(string name)
215
+ private static InstancePublicationAttempt Success()
133
216
  {
134
- return bridgeType.GetMethod(name, BindingFlags.NonPublic | BindingFlags.Static) ?? throw new MissingMethodException(name);
217
+ return new InstancePublicationAttempt(RegistryPublicationResult.Written, false, "none");
135
218
  }
136
219
 
137
- private FieldInfo Field(string name)
220
+ private static InstancePublicationAttempt Failure(bool retryable, string kind)
138
221
  {
139
- return bridgeType.GetField(name, BindingFlags.NonPublic | BindingFlags.Static) ?? throw new MissingFieldException(name);
222
+ return new InstancePublicationAttempt(RegistryPublicationResult.Failed, retryable, kind);
140
223
  }
141
224
  }
142
225
  }