@alpsckr/unitycli 0.4.0

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 (1066) hide show
  1. package/README.md +389 -0
  2. package/contracts/command-contract.json +3972 -0
  3. package/contracts/stable-session/admission-acquire-v1.schema.json +16 -0
  4. package/contracts/stable-session/admission-response-v1.schema.json +30 -0
  5. package/contracts/stable-session/admission-revoke-v1.schema.json +15 -0
  6. package/contracts/stable-session/admission-transport-v1.json +36 -0
  7. package/contracts/stable-session/bridge-request-v2.schema.json +26 -0
  8. package/contracts/stable-session/canonical-path-v1-golden.json +23 -0
  9. package/contracts/stable-session/completion-contract.schema.json +46 -0
  10. package/contracts/stable-session/direct-call-semantics.json +102 -0
  11. package/contracts/stable-session/editor-state.schema.json +92 -0
  12. package/contracts/stable-session/health-v3.schema.json +47 -0
  13. package/contracts/stable-session/instance-registry-v3.schema.json +152 -0
  14. package/contracts/stable-session/removal-map.json +27 -0
  15. package/contracts/stable-session/request-digest-v1-golden.json +7 -0
  16. package/contracts/stable-session/runtime-config-v2.schema.json +27 -0
  17. package/contracts/static-capability-catalog.json +48226 -0
  18. package/contracts/tool-completion-contract.json +11322 -0
  19. package/dist/args.d.ts +27 -0
  20. package/dist/args.js +109 -0
  21. package/dist/args.js.map +1 -0
  22. package/dist/bridge/admission.d.ts +28 -0
  23. package/dist/bridge/admission.js +29 -0
  24. package/dist/bridge/admission.js.map +1 -0
  25. package/dist/bridge/args.d.ts +16 -0
  26. package/dist/bridge/args.js +123 -0
  27. package/dist/bridge/args.js.map +1 -0
  28. package/dist/bridge/domains/animation.d.ts +2 -0
  29. package/dist/bridge/domains/animation.js +199 -0
  30. package/dist/bridge/domains/animation.js.map +1 -0
  31. package/dist/bridge/domains/asset.d.ts +2 -0
  32. package/dist/bridge/domains/asset.js +85 -0
  33. package/dist/bridge/domains/asset.js.map +1 -0
  34. package/dist/bridge/domains/build.d.ts +2 -0
  35. package/dist/bridge/domains/build.js +35 -0
  36. package/dist/bridge/domains/build.js.map +1 -0
  37. package/dist/bridge/domains/camera.d.ts +2 -0
  38. package/dist/bridge/domains/camera.js +54 -0
  39. package/dist/bridge/domains/camera.js.map +1 -0
  40. package/dist/bridge/domains/code.d.ts +2 -0
  41. package/dist/bridge/domains/code.js +17 -0
  42. package/dist/bridge/domains/code.js.map +1 -0
  43. package/dist/bridge/domains/console.d.ts +2 -0
  44. package/dist/bridge/domains/console.js +34 -0
  45. package/dist/bridge/domains/console.js.map +1 -0
  46. package/dist/bridge/domains/diagnose.d.ts +2 -0
  47. package/dist/bridge/domains/diagnose.js +11 -0
  48. package/dist/bridge/domains/diagnose.js.map +1 -0
  49. package/dist/bridge/domains/editor.d.ts +2 -0
  50. package/dist/bridge/domains/editor.js +66 -0
  51. package/dist/bridge/domains/editor.js.map +1 -0
  52. package/dist/bridge/domains/extension.d.ts +8 -0
  53. package/dist/bridge/domains/extension.js +20 -0
  54. package/dist/bridge/domains/extension.js.map +1 -0
  55. package/dist/bridge/domains/game-object.d.ts +2 -0
  56. package/dist/bridge/domains/game-object.js +179 -0
  57. package/dist/bridge/domains/game-object.js.map +1 -0
  58. package/dist/bridge/domains/graphics.d.ts +2 -0
  59. package/dist/bridge/domains/graphics.js +185 -0
  60. package/dist/bridge/domains/graphics.js.map +1 -0
  61. package/dist/bridge/domains/material.d.ts +2 -0
  62. package/dist/bridge/domains/material.js +70 -0
  63. package/dist/bridge/domains/material.js.map +1 -0
  64. package/dist/bridge/domains/navmesh.d.ts +2 -0
  65. package/dist/bridge/domains/navmesh.js +34 -0
  66. package/dist/bridge/domains/navmesh.js.map +1 -0
  67. package/dist/bridge/domains/object.d.ts +2 -0
  68. package/dist/bridge/domains/object.js +43 -0
  69. package/dist/bridge/domains/object.js.map +1 -0
  70. package/dist/bridge/domains/occlusion.d.ts +2 -0
  71. package/dist/bridge/domains/occlusion.js +12 -0
  72. package/dist/bridge/domains/occlusion.js.map +1 -0
  73. package/dist/bridge/domains/package.d.ts +2 -0
  74. package/dist/bridge/domains/package.js +2 -0
  75. package/dist/bridge/domains/package.js.map +1 -0
  76. package/dist/bridge/domains/physics.d.ts +2 -0
  77. package/dist/bridge/domains/physics.js +139 -0
  78. package/dist/bridge/domains/physics.js.map +1 -0
  79. package/dist/bridge/domains/prefab.d.ts +2 -0
  80. package/dist/bridge/domains/prefab.js +104 -0
  81. package/dist/bridge/domains/prefab.js.map +1 -0
  82. package/dist/bridge/domains/profiler.d.ts +2 -0
  83. package/dist/bridge/domains/profiler.js +105 -0
  84. package/dist/bridge/domains/profiler.js.map +1 -0
  85. package/dist/bridge/domains/project-tool.d.ts +2 -0
  86. package/dist/bridge/domains/project-tool.js +46 -0
  87. package/dist/bridge/domains/project-tool.js.map +1 -0
  88. package/dist/bridge/domains/reflection.d.ts +2 -0
  89. package/dist/bridge/domains/reflection.js +48 -0
  90. package/dist/bridge/domains/reflection.js.map +1 -0
  91. package/dist/bridge/domains/runtime-tool.d.ts +2 -0
  92. package/dist/bridge/domains/runtime-tool.js +48 -0
  93. package/dist/bridge/domains/runtime-tool.js.map +1 -0
  94. package/dist/bridge/domains/scene.d.ts +2 -0
  95. package/dist/bridge/domains/scene.js +100 -0
  96. package/dist/bridge/domains/scene.js.map +1 -0
  97. package/dist/bridge/domains/screenshot.d.ts +2 -0
  98. package/dist/bridge/domains/screenshot.js +85 -0
  99. package/dist/bridge/domains/screenshot.js.map +1 -0
  100. package/dist/bridge/domains/scriptable-object.d.ts +2 -0
  101. package/dist/bridge/domains/scriptable-object.js +53 -0
  102. package/dist/bridge/domains/scriptable-object.js.map +1 -0
  103. package/dist/bridge/domains/shader.d.ts +2 -0
  104. package/dist/bridge/domains/shader.js +66 -0
  105. package/dist/bridge/domains/shader.js.map +1 -0
  106. package/dist/bridge/domains/texture.d.ts +2 -0
  107. package/dist/bridge/domains/texture.js +78 -0
  108. package/dist/bridge/domains/texture.js.map +1 -0
  109. package/dist/bridge/domains/timeline.d.ts +2 -0
  110. package/dist/bridge/domains/timeline.js +75 -0
  111. package/dist/bridge/domains/timeline.js.map +1 -0
  112. package/dist/bridge/domains/ui.d.ts +2 -0
  113. package/dist/bridge/domains/ui.js +193 -0
  114. package/dist/bridge/domains/ui.js.map +1 -0
  115. package/dist/bridge/index.d.ts +9 -0
  116. package/dist/bridge/index.js +124 -0
  117. package/dist/bridge/index.js.map +1 -0
  118. package/dist/bridge/registry.d.ts +19 -0
  119. package/dist/bridge/registry.js +114 -0
  120. package/dist/bridge/registry.js.map +1 -0
  121. package/dist/bridge/session-supervisor.d.ts +138 -0
  122. package/dist/bridge/session-supervisor.js +873 -0
  123. package/dist/bridge/session-supervisor.js.map +1 -0
  124. package/dist/bridge/types.d.ts +61 -0
  125. package/dist/bridge/types.js +17 -0
  126. package/dist/bridge/types.js.map +1 -0
  127. package/dist/capabilities.d.ts +5 -0
  128. package/dist/capabilities.js +84 -0
  129. package/dist/capabilities.js.map +1 -0
  130. package/dist/cli-commands/command.d.ts +7 -0
  131. package/dist/cli-commands/command.js +513 -0
  132. package/dist/cli-commands/command.js.map +1 -0
  133. package/dist/cli-commands/extension-auto-detect.d.ts +62 -0
  134. package/dist/cli-commands/extension-auto-detect.js +119 -0
  135. package/dist/cli-commands/extension-auto-detect.js.map +1 -0
  136. package/dist/cli-commands/extensions.d.ts +24 -0
  137. package/dist/cli-commands/extensions.js +428 -0
  138. package/dist/cli-commands/extensions.js.map +1 -0
  139. package/dist/cli-commands/package.d.ts +4 -0
  140. package/dist/cli-commands/package.js +151 -0
  141. package/dist/cli-commands/package.js.map +1 -0
  142. package/dist/cli-commands/skill-installer.d.ts +83 -0
  143. package/dist/cli-commands/skill-installer.js +703 -0
  144. package/dist/cli-commands/skill-installer.js.map +1 -0
  145. package/dist/cli-commands/types.d.ts +17 -0
  146. package/dist/cli-commands/types.js +2 -0
  147. package/dist/cli-commands/types.js.map +1 -0
  148. package/dist/cli.d.ts +17 -0
  149. package/dist/cli.js +302 -0
  150. package/dist/cli.js.map +1 -0
  151. package/dist/contracts/command-contract.d.ts +21 -0
  152. package/dist/contracts/command-contract.js +143 -0
  153. package/dist/contracts/command-contract.js.map +1 -0
  154. package/dist/contracts/csharp-command-extractor.d.ts +1 -0
  155. package/dist/contracts/csharp-command-extractor.js +89 -0
  156. package/dist/contracts/csharp-command-extractor.js.map +1 -0
  157. package/dist/contracts/validate-command-contract.d.ts +1 -0
  158. package/dist/contracts/validate-command-contract.js +86 -0
  159. package/dist/contracts/validate-command-contract.js.map +1 -0
  160. package/dist/doctor.d.ts +22 -0
  161. package/dist/doctor.js +498 -0
  162. package/dist/doctor.js.map +1 -0
  163. package/dist/editor-blocker-observer.d.ts +45 -0
  164. package/dist/editor-blocker-observer.js +55 -0
  165. package/dist/editor-blocker-observer.js.map +1 -0
  166. package/dist/editor-dialogs.d.ts +53 -0
  167. package/dist/editor-dialogs.js +79 -0
  168. package/dist/editor-dialogs.js.map +1 -0
  169. package/dist/extension-availability.d.ts +30 -0
  170. package/dist/extension-availability.js +83 -0
  171. package/dist/extension-availability.js.map +1 -0
  172. package/dist/extensions/.generated-bridge-domains/cinemachine.d.ts +2 -0
  173. package/dist/extensions/.generated-bridge-domains/cinemachine.js +104 -0
  174. package/dist/extensions/.generated-bridge-domains/cinemachine.js.map +1 -0
  175. package/dist/extensions/.generated-bridge-domains/hdrp.d.ts +2 -0
  176. package/dist/extensions/.generated-bridge-domains/hdrp.js +35 -0
  177. package/dist/extensions/.generated-bridge-domains/hdrp.js.map +1 -0
  178. package/dist/extensions/.generated-bridge-domains/probuilder.d.ts +13 -0
  179. package/dist/extensions/.generated-bridge-domains/probuilder.js +342 -0
  180. package/dist/extensions/.generated-bridge-domains/probuilder.js.map +1 -0
  181. package/dist/extensions/.generated-bridge-domains/urp.d.ts +2 -0
  182. package/dist/extensions/.generated-bridge-domains/urp.js +52 -0
  183. package/dist/extensions/.generated-bridge-domains/urp.js.map +1 -0
  184. package/dist/extensions/.generated-bridge-domains/vfx.d.ts +2 -0
  185. package/dist/extensions/.generated-bridge-domains/vfx.js +312 -0
  186. package/dist/extensions/.generated-bridge-domains/vfx.js.map +1 -0
  187. package/dist/extensions/.generated-registry-data.d.ts +7 -0
  188. package/dist/extensions/.generated-registry-data.js +895 -0
  189. package/dist/extensions/.generated-registry-data.js.map +1 -0
  190. package/dist/extensions/contribution-loader.d.ts +27 -0
  191. package/dist/extensions/contribution-loader.js +60 -0
  192. package/dist/extensions/contribution-loader.js.map +1 -0
  193. package/dist/extensions/descriptor-loader.d.ts +73 -0
  194. package/dist/extensions/descriptor-loader.js +126 -0
  195. package/dist/extensions/descriptor-loader.js.map +1 -0
  196. package/dist/extensions/index.d.ts +19 -0
  197. package/dist/extensions/index.js +23 -0
  198. package/dist/extensions/index.js.map +1 -0
  199. package/dist/extensions/installer.d.ts +80 -0
  200. package/dist/extensions/installer.js +594 -0
  201. package/dist/extensions/installer.js.map +1 -0
  202. package/dist/extensions/metadata/index.d.ts +15 -0
  203. package/dist/extensions/metadata/index.js +41 -0
  204. package/dist/extensions/metadata/index.js.map +1 -0
  205. package/dist/extensions/metadata/types.d.ts +38 -0
  206. package/dist/extensions/metadata/types.js +11 -0
  207. package/dist/extensions/metadata/types.js.map +1 -0
  208. package/dist/extensions/project-resolver.d.ts +35 -0
  209. package/dist/extensions/project-resolver.js +61 -0
  210. package/dist/extensions/project-resolver.js.map +1 -0
  211. package/dist/extensions/registry.d.ts +86 -0
  212. package/dist/extensions/registry.js +262 -0
  213. package/dist/extensions/registry.js.map +1 -0
  214. package/dist/extensions/tool-manifest.d.ts +29 -0
  215. package/dist/extensions/tool-manifest.js +53 -0
  216. package/dist/extensions/tool-manifest.js.map +1 -0
  217. package/dist/extensions/types.d.ts +115 -0
  218. package/dist/extensions/types.js +12 -0
  219. package/dist/extensions/types.js.map +1 -0
  220. package/dist/instances.d.ts +163 -0
  221. package/dist/instances.js +1137 -0
  222. package/dist/instances.js.map +1 -0
  223. package/dist/output.d.ts +119 -0
  224. package/dist/output.js +204 -0
  225. package/dist/output.js.map +1 -0
  226. package/dist/package-manager.d.ts +280 -0
  227. package/dist/package-manager.js +1832 -0
  228. package/dist/package-manager.js.map +1 -0
  229. package/dist/platform.d.ts +3 -0
  230. package/dist/platform.js +19 -0
  231. package/dist/platform.js.map +1 -0
  232. package/dist/project-identity.d.ts +48 -0
  233. package/dist/project-identity.js +254 -0
  234. package/dist/project-identity.js.map +1 -0
  235. package/dist/project-tool-discovery.d.ts +23 -0
  236. package/dist/project-tool-discovery.js +292 -0
  237. package/dist/project-tool-discovery.js.map +1 -0
  238. package/dist/protocol/envelope.d.ts +64 -0
  239. package/dist/protocol/envelope.js +8 -0
  240. package/dist/protocol/envelope.js.map +1 -0
  241. package/dist/protocol/index.d.ts +7 -0
  242. package/dist/protocol/index.js +2 -0
  243. package/dist/protocol/index.js.map +1 -0
  244. package/dist/runtime-code.d.ts +20 -0
  245. package/dist/runtime-code.js +232 -0
  246. package/dist/runtime-code.js.map +1 -0
  247. package/dist/schema/any-json.d.ts +4 -0
  248. package/dist/schema/any-json.js +2 -0
  249. package/dist/schema/any-json.js.map +1 -0
  250. package/dist/schema/validator.d.ts +7 -0
  251. package/dist/schema/validator.js +135 -0
  252. package/dist/schema/validator.js.map +1 -0
  253. package/dist/services/docs-reflect-cache.d.ts +106 -0
  254. package/dist/services/docs-reflect-cache.js +301 -0
  255. package/dist/services/docs-reflect-cache.js.map +1 -0
  256. package/dist/services/docs-service.d.ts +16 -0
  257. package/dist/services/docs-service.js +208 -0
  258. package/dist/services/docs-service.js.map +1 -0
  259. package/dist/services/reflect-service.d.ts +12 -0
  260. package/dist/services/reflect-service.js +122 -0
  261. package/dist/services/reflect-service.js.map +1 -0
  262. package/dist/static-capability-catalog.d.ts +13 -0
  263. package/dist/static-capability-catalog.js +41 -0
  264. package/dist/static-capability-catalog.js.map +1 -0
  265. package/dist/test-results.d.ts +13 -0
  266. package/dist/test-results.js +44 -0
  267. package/dist/test-results.js.map +1 -0
  268. package/dist/tools/.generated-completion-registry.d.ts +17 -0
  269. package/dist/tools/.generated-completion-registry.js +5862 -0
  270. package/dist/tools/.generated-completion-registry.js.map +1 -0
  271. package/dist/tools/.generated-registry.d.ts +53 -0
  272. package/dist/tools/.generated-registry.js +55 -0
  273. package/dist/tools/.generated-registry.js.map +1 -0
  274. package/dist/tools/.generated-schemas.d.ts +1 -0
  275. package/dist/tools/.generated-schemas.js +56 -0
  276. package/dist/tools/.generated-schemas.js.map +1 -0
  277. package/dist/tools/asset/refresh.d.ts +26 -0
  278. package/dist/tools/asset/refresh.js +97 -0
  279. package/dist/tools/asset/refresh.js.map +1 -0
  280. package/dist/tools/build/run.d.ts +45 -0
  281. package/dist/tools/build/run.js +115 -0
  282. package/dist/tools/build/run.js.map +1 -0
  283. package/dist/tools/catalog.d.ts +33 -0
  284. package/dist/tools/catalog.js +202 -0
  285. package/dist/tools/catalog.js.map +1 -0
  286. package/dist/tools/code/exec.d.ts +53 -0
  287. package/dist/tools/code/exec.js +59 -0
  288. package/dist/tools/code/exec.js.map +1 -0
  289. package/dist/tools/commands.d.ts +5 -0
  290. package/dist/tools/commands.js +45 -0
  291. package/dist/tools/commands.js.map +1 -0
  292. package/dist/tools/completion-probe.d.ts +22 -0
  293. package/dist/tools/completion-probe.js +2 -0
  294. package/dist/tools/completion-probe.js.map +1 -0
  295. package/dist/tools/define.d.ts +77 -0
  296. package/dist/tools/define.js +58 -0
  297. package/dist/tools/define.js.map +1 -0
  298. package/dist/tools/diagnose/capabilities.d.ts +13 -0
  299. package/dist/tools/diagnose/capabilities.js +34 -0
  300. package/dist/tools/diagnose/capabilities.js.map +1 -0
  301. package/dist/tools/dispatcher.d.ts +27 -0
  302. package/dist/tools/dispatcher.js +971 -0
  303. package/dist/tools/dispatcher.js.map +1 -0
  304. package/dist/tools/docs/get.d.ts +22 -0
  305. package/dist/tools/docs/get.js +22 -0
  306. package/dist/tools/docs/get.js.map +1 -0
  307. package/dist/tools/docs/search.d.ts +31 -0
  308. package/dist/tools/docs/search.js +22 -0
  309. package/dist/tools/docs/search.js.map +1 -0
  310. package/dist/tools/editor/compile.d.ts +66 -0
  311. package/dist/tools/editor/compile.js +225 -0
  312. package/dist/tools/editor/compile.js.map +1 -0
  313. package/dist/tools/editor/dialog/click.d.ts +12 -0
  314. package/dist/tools/editor/dialog/click.js +71 -0
  315. package/dist/tools/editor/dialog/click.js.map +1 -0
  316. package/dist/tools/editor/dialogs.d.ts +12 -0
  317. package/dist/tools/editor/dialogs.js +58 -0
  318. package/dist/tools/editor/dialogs.js.map +1 -0
  319. package/dist/tools/editor/readiness.d.ts +13 -0
  320. package/dist/tools/editor/readiness.js +24 -0
  321. package/dist/tools/editor/readiness.js.map +1 -0
  322. package/dist/tools/editor/refresh.d.ts +25 -0
  323. package/dist/tools/editor/refresh.js +154 -0
  324. package/dist/tools/editor/refresh.js.map +1 -0
  325. package/dist/tools/editor/state.d.ts +63 -0
  326. package/dist/tools/editor/state.js +286 -0
  327. package/dist/tools/editor/state.js.map +1 -0
  328. package/dist/tools/errors.d.ts +30 -0
  329. package/dist/tools/errors.js +46 -0
  330. package/dist/tools/errors.js.map +1 -0
  331. package/dist/tools/metadata/derived.d.ts +34 -0
  332. package/dist/tools/metadata/derived.js +136 -0
  333. package/dist/tools/metadata/derived.js.map +1 -0
  334. package/dist/tools/metadata/index.d.ts +34 -0
  335. package/dist/tools/metadata/index.js +130 -0
  336. package/dist/tools/metadata/index.js.map +1 -0
  337. package/dist/tools/metadata/schemas.d.ts +3 -0
  338. package/dist/tools/metadata/schemas.js +19 -0
  339. package/dist/tools/metadata/schemas.js.map +1 -0
  340. package/dist/tools/metadata/status.d.ts +4 -0
  341. package/dist/tools/metadata/status.js +61 -0
  342. package/dist/tools/metadata/status.js.map +1 -0
  343. package/dist/tools/metadata/types.d.ts +79 -0
  344. package/dist/tools/metadata/types.js +2 -0
  345. package/dist/tools/metadata/types.js.map +1 -0
  346. package/dist/tools/navmesh/bake-cancel.d.ts +7 -0
  347. package/dist/tools/navmesh/bake-cancel.js +21 -0
  348. package/dist/tools/navmesh/bake-cancel.js.map +1 -0
  349. package/dist/tools/navmesh/bake-status.d.ts +5 -0
  350. package/dist/tools/navmesh/bake-status.js +18 -0
  351. package/dist/tools/navmesh/bake-status.js.map +1 -0
  352. package/dist/tools/navmesh/bake.d.ts +5 -0
  353. package/dist/tools/navmesh/bake.js +23 -0
  354. package/dist/tools/navmesh/bake.js.map +1 -0
  355. package/dist/tools/navmesh/live.d.ts +86 -0
  356. package/dist/tools/navmesh/live.js +206 -0
  357. package/dist/tools/navmesh/live.js.map +1 -0
  358. package/dist/tools/navmesh/surface-bake.d.ts +5 -0
  359. package/dist/tools/navmesh/surface-bake.js +24 -0
  360. package/dist/tools/navmesh/surface-bake.js.map +1 -0
  361. package/dist/tools/occlusion/bake-cancel.d.ts +7 -0
  362. package/dist/tools/occlusion/bake-cancel.js +21 -0
  363. package/dist/tools/occlusion/bake-cancel.js.map +1 -0
  364. package/dist/tools/occlusion/bake-status.d.ts +5 -0
  365. package/dist/tools/occlusion/bake-status.js +18 -0
  366. package/dist/tools/occlusion/bake-status.js.map +1 -0
  367. package/dist/tools/occlusion/bake.d.ts +11 -0
  368. package/dist/tools/occlusion/bake.js +23 -0
  369. package/dist/tools/occlusion/bake.js.map +1 -0
  370. package/dist/tools/occlusion/live.d.ts +74 -0
  371. package/dist/tools/occlusion/live.js +201 -0
  372. package/dist/tools/occlusion/live.js.map +1 -0
  373. package/dist/tools/package/bridge-remove.d.ts +26 -0
  374. package/dist/tools/package/bridge-remove.js +32 -0
  375. package/dist/tools/package/bridge-remove.js.map +1 -0
  376. package/dist/tools/package/deploy.d.ts +49 -0
  377. package/dist/tools/package/deploy.js +134 -0
  378. package/dist/tools/package/deploy.js.map +1 -0
  379. package/dist/tools/package/embed.d.ts +14 -0
  380. package/dist/tools/package/embed.js +93 -0
  381. package/dist/tools/package/embed.js.map +1 -0
  382. package/dist/tools/package/file-mutation-worker.d.ts +6 -0
  383. package/dist/tools/package/file-mutation-worker.js +154 -0
  384. package/dist/tools/package/file-mutation-worker.js.map +1 -0
  385. package/dist/tools/package/info.d.ts +19 -0
  386. package/dist/tools/package/info.js +27 -0
  387. package/dist/tools/package/info.js.map +1 -0
  388. package/dist/tools/package/install.d.ts +24 -0
  389. package/dist/tools/package/install.js +65 -0
  390. package/dist/tools/package/install.js.map +1 -0
  391. package/dist/tools/package/list.d.ts +27 -0
  392. package/dist/tools/package/list.js +21 -0
  393. package/dist/tools/package/list.js.map +1 -0
  394. package/dist/tools/package/live-resolve.d.ts +46 -0
  395. package/dist/tools/package/live-resolve.js +497 -0
  396. package/dist/tools/package/live-resolve.js.map +1 -0
  397. package/dist/tools/package/public-result.d.ts +4 -0
  398. package/dist/tools/package/public-result.js +25 -0
  399. package/dist/tools/package/public-result.js.map +1 -0
  400. package/dist/tools/package/registry-clear.d.ts +15 -0
  401. package/dist/tools/package/registry-clear.js +27 -0
  402. package/dist/tools/package/registry-clear.js.map +1 -0
  403. package/dist/tools/package/registry-get.d.ts +10 -0
  404. package/dist/tools/package/registry-get.js +22 -0
  405. package/dist/tools/package/registry-get.js.map +1 -0
  406. package/dist/tools/package/registry-set.d.ts +17 -0
  407. package/dist/tools/package/registry-set.js +28 -0
  408. package/dist/tools/package/registry-set.js.map +1 -0
  409. package/dist/tools/package/remove.d.ts +47 -0
  410. package/dist/tools/package/remove.js +67 -0
  411. package/dist/tools/package/remove.js.map +1 -0
  412. package/dist/tools/package/resolve.d.ts +6 -0
  413. package/dist/tools/package/resolve.js +14 -0
  414. package/dist/tools/package/resolve.js.map +1 -0
  415. package/dist/tools/package/restore.d.ts +42 -0
  416. package/dist/tools/package/restore.js +122 -0
  417. package/dist/tools/package/restore.js.map +1 -0
  418. package/dist/tools/package/scoped-registry-add.d.ts +25 -0
  419. package/dist/tools/package/scoped-registry-add.js +30 -0
  420. package/dist/tools/package/scoped-registry-add.js.map +1 -0
  421. package/dist/tools/package/scoped-registry-list.d.ts +14 -0
  422. package/dist/tools/package/scoped-registry-list.js +22 -0
  423. package/dist/tools/package/scoped-registry-list.js.map +1 -0
  424. package/dist/tools/package/scoped-registry-remove.d.ts +29 -0
  425. package/dist/tools/package/scoped-registry-remove.js +31 -0
  426. package/dist/tools/package/scoped-registry-remove.js.map +1 -0
  427. package/dist/tools/package/search.d.ts +17 -0
  428. package/dist/tools/package/search.js +39 -0
  429. package/dist/tools/package/search.js.map +1 -0
  430. package/dist/tools/package/status.d.ts +21 -0
  431. package/dist/tools/package/status.js +37 -0
  432. package/dist/tools/package/status.js.map +1 -0
  433. package/dist/tools/reflect/member.d.ts +22 -0
  434. package/dist/tools/reflect/member.js +22 -0
  435. package/dist/tools/reflect/member.js.map +1 -0
  436. package/dist/tools/reflect/search.d.ts +30 -0
  437. package/dist/tools/reflect/search.js +22 -0
  438. package/dist/tools/reflect/search.js.map +1 -0
  439. package/dist/tools/reflect/type.d.ts +21 -0
  440. package/dist/tools/reflect/type.js +22 -0
  441. package/dist/tools/reflect/type.js.map +1 -0
  442. package/dist/tools/runtime/console.d.ts +24 -0
  443. package/dist/tools/runtime/console.js +17 -0
  444. package/dist/tools/runtime/console.js.map +1 -0
  445. package/dist/tools/runtime/input/key.d.ts +23 -0
  446. package/dist/tools/runtime/input/key.js +18 -0
  447. package/dist/tools/runtime/input/key.js.map +1 -0
  448. package/dist/tools/runtime/input/pointer.d.ts +34 -0
  449. package/dist/tools/runtime/input/pointer.js +18 -0
  450. package/dist/tools/runtime/input/pointer.js.map +1 -0
  451. package/dist/tools/runtime/log.d.ts +20 -0
  452. package/dist/tools/runtime/log.js +17 -0
  453. package/dist/tools/runtime/log.js.map +1 -0
  454. package/dist/tools/runtime/state.d.ts +45 -0
  455. package/dist/tools/runtime/state.js +17 -0
  456. package/dist/tools/runtime/state.js.map +1 -0
  457. package/dist/tools/runtime/target-framerate/set.d.ts +16 -0
  458. package/dist/tools/runtime/target-framerate/set.js +17 -0
  459. package/dist/tools/runtime/target-framerate/set.js.map +1 -0
  460. package/dist/tools/runtime/time-scale/set.d.ts +16 -0
  461. package/dist/tools/runtime/time-scale/set.js +17 -0
  462. package/dist/tools/runtime/time-scale/set.js.map +1 -0
  463. package/dist/tools/runtime/ui/capture-element.d.ts +31 -0
  464. package/dist/tools/runtime/ui/capture-element.js +17 -0
  465. package/dist/tools/runtime/ui/capture-element.js.map +1 -0
  466. package/dist/tools/test/cancel.d.ts +19 -0
  467. package/dist/tools/test/cancel.js +94 -0
  468. package/dist/tools/test/cancel.js.map +1 -0
  469. package/dist/tools/test/run.d.ts +39 -0
  470. package/dist/tools/test/run.js +101 -0
  471. package/dist/tools/test/run.js.map +1 -0
  472. package/dist/tools/tools/describe.d.ts +27 -0
  473. package/dist/tools/tools/describe.js +35 -0
  474. package/dist/tools/tools/describe.js.map +1 -0
  475. package/dist/tools/tools/group-list.d.ts +20 -0
  476. package/dist/tools/tools/group-list.js +39 -0
  477. package/dist/tools/tools/group-list.js.map +1 -0
  478. package/dist/tools/tools/group-summaries.d.ts +3 -0
  479. package/dist/tools/tools/group-summaries.js +52 -0
  480. package/dist/tools/tools/group-summaries.js.map +1 -0
  481. package/dist/tools/tools/group.d.ts +13 -0
  482. package/dist/tools/tools/group.js +34 -0
  483. package/dist/tools/tools/group.js.map +1 -0
  484. package/dist/tools/tools/search.d.ts +17 -0
  485. package/dist/tools/tools/search.js +42 -0
  486. package/dist/tools/tools/search.js.map +1 -0
  487. package/dist/types.d.ts +5 -0
  488. package/dist/types.js +2 -0
  489. package/dist/types.js.map +1 -0
  490. package/dist/unity-project-processes.d.ts +12 -0
  491. package/dist/unity-project-processes.js +59 -0
  492. package/dist/unity-project-processes.js.map +1 -0
  493. package/dist/util.d.ts +11 -0
  494. package/dist/util.js +22 -0
  495. package/dist/util.js.map +1 -0
  496. package/dist/windows-editor-state.d.ts +31 -0
  497. package/dist/windows-editor-state.js +98 -0
  498. package/dist/windows-editor-state.js.map +1 -0
  499. package/docs/README.md +43 -0
  500. package/docs/availability-differences.md +97 -0
  501. package/docs/command-execution.md +89 -0
  502. package/docs/error-codes.md +204 -0
  503. package/docs/extensions.md +132 -0
  504. package/docs/risk-and-side-effects.md +93 -0
  505. package/docs/safety-boundaries.md +103 -0
  506. package/docs/target-and-instance.md +83 -0
  507. package/docs/tool-discovery.md +104 -0
  508. package/docs/tool-execution.md +178 -0
  509. package/extensions/cinemachine/bridge/domains/cinemachine.ts +115 -0
  510. package/extensions/cinemachine/docs/cinemachine.md +50 -0
  511. package/extensions/cinemachine/extension.json +129 -0
  512. package/extensions/cinemachine/unitypkg/Editor/Cinemachine/CinemachineExtensionToolSupport.cs +15 -0
  513. package/extensions/cinemachine/unitypkg/Editor/Cinemachine/CinemachineToolSupport.cs +854 -0
  514. package/extensions/cinemachine/unitypkg/Editor/Cinemachine/aim.cs +96 -0
  515. package/extensions/cinemachine/unitypkg/Editor/Cinemachine/blend.cs +140 -0
  516. package/extensions/cinemachine/unitypkg/Editor/Cinemachine/body.cs +96 -0
  517. package/extensions/cinemachine/unitypkg/Editor/Cinemachine/brain-ensure.cs +16 -0
  518. package/extensions/cinemachine/unitypkg/Editor/Cinemachine/brain-status.cs +12 -0
  519. package/extensions/cinemachine/unitypkg/Editor/Cinemachine/create.cs +147 -0
  520. package/extensions/cinemachine/unitypkg/Editor/Cinemachine/extension-add.cs +13 -0
  521. package/extensions/cinemachine/unitypkg/Editor/Cinemachine/extension-list.cs +13 -0
  522. package/extensions/cinemachine/unitypkg/Editor/Cinemachine/extension-remove.cs +13 -0
  523. package/extensions/cinemachine/unitypkg/Editor/Cinemachine/lens.cs +142 -0
  524. package/extensions/cinemachine/unitypkg/Editor/Cinemachine/noise.cs +126 -0
  525. package/extensions/cinemachine/unitypkg/Editor/Cinemachine/ping.cs +43 -0
  526. package/extensions/cinemachine/unitypkg/Editor/Cinemachine/priority.cs +113 -0
  527. package/extensions/cinemachine/unitypkg/Editor/Cinemachine/target.cs +84 -0
  528. package/extensions/cinemachine/unitypkg/UnityCli.Extensions.Cinemachine.Editor.asmdef +18 -0
  529. package/extensions/hdrp/bridge/domains/hdrp.ts +41 -0
  530. package/extensions/hdrp/docs/hdrp.md +15 -0
  531. package/extensions/hdrp/extension.json +31 -0
  532. package/extensions/hdrp/unitypkg/Editor/Hdrp/HdrpToolSupport.cs +607 -0
  533. package/extensions/hdrp/unitypkg/Editor/Hdrp/settings-get.cs +29 -0
  534. package/extensions/hdrp/unitypkg/Editor/Hdrp/settings-set.cs +47 -0
  535. package/extensions/hdrp/unitypkg/Editor/Hdrp/volume-add-effect.cs +28 -0
  536. package/extensions/hdrp/unitypkg/Editor/Hdrp/volume-create.cs +28 -0
  537. package/extensions/hdrp/unitypkg/Editor/Hdrp/volume-info.cs +25 -0
  538. package/extensions/hdrp/unitypkg/Editor/Hdrp/volume-list.cs +25 -0
  539. package/extensions/hdrp/unitypkg/Editor/Hdrp/volume-set.cs +28 -0
  540. package/extensions/hdrp/unitypkg/UnityCli.Extensions.Hdrp.Editor.asmdef +19 -0
  541. package/extensions/probuilder/bridge/domains/probuilder.ts +386 -0
  542. package/extensions/probuilder/docs/probuilder.md +125 -0
  543. package/extensions/probuilder/extension.json +291 -0
  544. package/extensions/probuilder/unitypkg/Editor/ProBuilder/ProBuilderAppendCompletionProof.cs +254 -0
  545. package/extensions/probuilder/unitypkg/Editor/ProBuilder/ProBuilderAtomicReadback.cs +293 -0
  546. package/extensions/probuilder/unitypkg/Editor/ProBuilder/ProBuilderBevelCompletionProof.cs +299 -0
  547. package/extensions/probuilder/unitypkg/Editor/ProBuilder/ProBuilderCanonicalMeshSnapshot.cs +951 -0
  548. package/extensions/probuilder/unitypkg/Editor/ProBuilder/ProBuilderConnectCompletionProof.cs +407 -0
  549. package/extensions/probuilder/unitypkg/Editor/ProBuilder/ProBuilderEdgeCompletionProof.cs +318 -0
  550. package/extensions/probuilder/unitypkg/Editor/ProBuilder/ProBuilderErrors.cs +83 -0
  551. package/extensions/probuilder/unitypkg/Editor/ProBuilder/ProBuilderFaceCompletionProof.cs +152 -0
  552. package/extensions/probuilder/unitypkg/Editor/ProBuilder/ProBuilderFaceExtrudeCompletionProof.cs +283 -0
  553. package/extensions/probuilder/unitypkg/Editor/ProBuilder/ProBuilderFlipCompletionProof.cs +170 -0
  554. package/extensions/probuilder/unitypkg/Editor/ProBuilder/ProBuilderInput.cs +85 -0
  555. package/extensions/probuilder/unitypkg/Editor/ProBuilder/ProBuilderInsertCompletionProof.cs +674 -0
  556. package/extensions/probuilder/unitypkg/Editor/ProBuilder/ProBuilderOperationProof.cs +137 -0
  557. package/extensions/probuilder/unitypkg/Editor/ProBuilder/ProBuilderReflection.cs +1064 -0
  558. package/extensions/probuilder/unitypkg/Editor/ProBuilder/ProBuilderRefreshUvProof.cs +53 -0
  559. package/extensions/probuilder/unitypkg/Editor/ProBuilder/ProBuilderSceneTool.cs +184 -0
  560. package/extensions/probuilder/unitypkg/Editor/ProBuilder/ProBuilderShapeTopologyRecords.g.cs +82 -0
  561. package/extensions/probuilder/unitypkg/Editor/ProBuilder/ProBuilderVertexObjectCompletionProof.cs +346 -0
  562. package/extensions/probuilder/unitypkg/Editor/ProBuilder/append-vertices-to-edge.cs +118 -0
  563. package/extensions/probuilder/unitypkg/Editor/ProBuilder/auto-smooth.cs +104 -0
  564. package/extensions/probuilder/unitypkg/Editor/ProBuilder/bevel-edges.cs +119 -0
  565. package/extensions/probuilder/unitypkg/Editor/ProBuilder/bridge-edges.cs +113 -0
  566. package/extensions/probuilder/unitypkg/Editor/ProBuilder/center-pivot.cs +43 -0
  567. package/extensions/probuilder/unitypkg/Editor/ProBuilder/combine-meshes.cs +58 -0
  568. package/extensions/probuilder/unitypkg/Editor/ProBuilder/connect-elements.cs +128 -0
  569. package/extensions/probuilder/unitypkg/Editor/ProBuilder/convert-to-probuilder.cs +40 -0
  570. package/extensions/probuilder/unitypkg/Editor/ProBuilder/create-poly-shape.cs +55 -0
  571. package/extensions/probuilder/unitypkg/Editor/ProBuilder/create-polygon.cs +28 -0
  572. package/extensions/probuilder/unitypkg/Editor/ProBuilder/create-shape.cs +168 -0
  573. package/extensions/probuilder/unitypkg/Editor/ProBuilder/delete-faces.cs +42 -0
  574. package/extensions/probuilder/unitypkg/Editor/ProBuilder/detach-faces.cs +46 -0
  575. package/extensions/probuilder/unitypkg/Editor/ProBuilder/duplicate-and-flip.cs +100 -0
  576. package/extensions/probuilder/unitypkg/Editor/ProBuilder/extrude-edges.cs +118 -0
  577. package/extensions/probuilder/unitypkg/Editor/ProBuilder/extrude-faces.cs +110 -0
  578. package/extensions/probuilder/unitypkg/Editor/ProBuilder/flip-normals.cs +102 -0
  579. package/extensions/probuilder/unitypkg/Editor/ProBuilder/freeze-transform.cs +45 -0
  580. package/extensions/probuilder/unitypkg/Editor/ProBuilder/insert-vertex.cs +132 -0
  581. package/extensions/probuilder/unitypkg/Editor/ProBuilder/merge-faces.cs +44 -0
  582. package/extensions/probuilder/unitypkg/Editor/ProBuilder/merge-objects.cs +130 -0
  583. package/extensions/probuilder/unitypkg/Editor/ProBuilder/merge-vertices.cs +109 -0
  584. package/extensions/probuilder/unitypkg/Editor/ProBuilder/mesh-info.cs +117 -0
  585. package/extensions/probuilder/unitypkg/Editor/ProBuilder/move-vertices.cs +33 -0
  586. package/extensions/probuilder/unitypkg/Editor/ProBuilder/ping.cs +51 -0
  587. package/extensions/probuilder/unitypkg/Editor/ProBuilder/repair-mesh.cs +40 -0
  588. package/extensions/probuilder/unitypkg/Editor/ProBuilder/select-faces.cs +161 -0
  589. package/extensions/probuilder/unitypkg/Editor/ProBuilder/set-face-color.cs +24 -0
  590. package/extensions/probuilder/unitypkg/Editor/ProBuilder/set-face-material.cs +23 -0
  591. package/extensions/probuilder/unitypkg/Editor/ProBuilder/set-face-uvs.cs +28 -0
  592. package/extensions/probuilder/unitypkg/Editor/ProBuilder/set-pivot.cs +42 -0
  593. package/extensions/probuilder/unitypkg/Editor/ProBuilder/set-smoothing.cs +23 -0
  594. package/extensions/probuilder/unitypkg/Editor/ProBuilder/split-vertices.cs +64 -0
  595. package/extensions/probuilder/unitypkg/Editor/ProBuilder/subdivide.cs +111 -0
  596. package/extensions/probuilder/unitypkg/Editor/ProBuilder/validate-mesh.cs +75 -0
  597. package/extensions/probuilder/unitypkg/Editor/ProBuilder/weld-vertices.cs +112 -0
  598. package/extensions/probuilder/unitypkg/UnityCli.Extensions.ProBuilder.Editor.asmdef +25 -0
  599. package/extensions/urp/bridge/domains/urp.ts +62 -0
  600. package/extensions/urp/docs/urp.md +20 -0
  601. package/extensions/urp/extension.json +41 -0
  602. package/extensions/urp/unitypkg/Editor/Urp/UrpFeatureToolSupport.cs +336 -0
  603. package/extensions/urp/unitypkg/Editor/Urp/UrpToolSupport.cs +801 -0
  604. package/extensions/urp/unitypkg/Editor/Urp/feature-add.cs +12 -0
  605. package/extensions/urp/unitypkg/Editor/Urp/feature-configure.cs +12 -0
  606. package/extensions/urp/unitypkg/Editor/Urp/feature-list.cs +12 -0
  607. package/extensions/urp/unitypkg/Editor/Urp/feature-remove.cs +12 -0
  608. package/extensions/urp/unitypkg/Editor/Urp/feature-toggle.cs +12 -0
  609. package/extensions/urp/unitypkg/Editor/Urp/settings-get.cs +27 -0
  610. package/extensions/urp/unitypkg/Editor/Urp/settings-set.cs +47 -0
  611. package/extensions/urp/unitypkg/Editor/Urp/volume-add-effect.cs +33 -0
  612. package/extensions/urp/unitypkg/Editor/Urp/volume-create.cs +33 -0
  613. package/extensions/urp/unitypkg/Editor/Urp/volume-info.cs +31 -0
  614. package/extensions/urp/unitypkg/Editor/Urp/volume-list.cs +39 -0
  615. package/extensions/urp/unitypkg/Editor/Urp/volume-set.cs +33 -0
  616. package/extensions/urp/unitypkg/UnityCli.Extensions.Urp.Editor.asmdef +19 -0
  617. package/extensions/vfx-graph/bridge/domains/vfx.ts +337 -0
  618. package/extensions/vfx-graph/docs/vfx.md +28 -0
  619. package/extensions/vfx-graph/extension.json +72 -0
  620. package/extensions/vfx-graph/unitypkg/Editor/Vfx/VfxActionToolSupport.cs +248 -0
  621. package/extensions/vfx-graph/unitypkg/Editor/Vfx/VfxToolSupport.cs +1325 -0
  622. package/extensions/vfx-graph/unitypkg/Editor/Vfx/control-pause.cs +37 -0
  623. package/extensions/vfx-graph/unitypkg/Editor/Vfx/control-play.cs +40 -0
  624. package/extensions/vfx-graph/unitypkg/Editor/Vfx/control-reinitialize.cs +37 -0
  625. package/extensions/vfx-graph/unitypkg/Editor/Vfx/control-set-rate.cs +36 -0
  626. package/extensions/vfx-graph/unitypkg/Editor/Vfx/control-set-seed.cs +42 -0
  627. package/extensions/vfx-graph/unitypkg/Editor/Vfx/control-stop.cs +37 -0
  628. package/extensions/vfx-graph/unitypkg/Editor/Vfx/effect-add.cs +55 -0
  629. package/extensions/vfx-graph/unitypkg/Editor/Vfx/effect-assign.cs +44 -0
  630. package/extensions/vfx-graph/unitypkg/Editor/Vfx/effect-info.cs +30 -0
  631. package/extensions/vfx-graph/unitypkg/Editor/Vfx/graph-create.cs +62 -0
  632. package/extensions/vfx-graph/unitypkg/Editor/Vfx/graph-info.cs +32 -0
  633. package/extensions/vfx-graph/unitypkg/Editor/Vfx/line-create.cs +75 -0
  634. package/extensions/vfx-graph/unitypkg/Editor/Vfx/line-positions.cs +100 -0
  635. package/extensions/vfx-graph/unitypkg/Editor/Vfx/parameter.cs +216 -0
  636. package/extensions/vfx-graph/unitypkg/Editor/Vfx/particle-clear.cs +39 -0
  637. package/extensions/vfx-graph/unitypkg/Editor/Vfx/particle-create.cs +80 -0
  638. package/extensions/vfx-graph/unitypkg/Editor/Vfx/particle-emission.cs +126 -0
  639. package/extensions/vfx-graph/unitypkg/Editor/Vfx/particle-info.cs +55 -0
  640. package/extensions/vfx-graph/unitypkg/Editor/Vfx/particle-main.cs +75 -0
  641. package/extensions/vfx-graph/unitypkg/Editor/Vfx/particle-pause.cs +38 -0
  642. package/extensions/vfx-graph/unitypkg/Editor/Vfx/particle-play.cs +38 -0
  643. package/extensions/vfx-graph/unitypkg/Editor/Vfx/particle-shape.cs +148 -0
  644. package/extensions/vfx-graph/unitypkg/Editor/Vfx/particle-stop.cs +41 -0
  645. package/extensions/vfx-graph/unitypkg/Editor/Vfx/template-create.cs +58 -0
  646. package/extensions/vfx-graph/unitypkg/Editor/Vfx/template-list.cs +31 -0
  647. package/extensions/vfx-graph/unitypkg/Editor/Vfx/trail-create.cs +41 -0
  648. package/extensions/vfx-graph/unitypkg/Editor/Vfx/trail-set.cs +44 -0
  649. package/extensions/vfx-graph/unitypkg/UnityCli.Extensions.VfxGraph.Editor.asmdef +18 -0
  650. package/package.json +46 -0
  651. package/schemas/error-code.schema.json +70 -0
  652. package/schemas/extension-descriptor.schema.json +88 -0
  653. package/schemas/extension-manifest.schema.json +125 -0
  654. package/schemas/request-envelope.schema.json +34 -0
  655. package/schemas/response-envelope.schema.json +42 -0
  656. package/schemas/tool-metadata.schema.json +111 -0
  657. package/skills/unitycli/SKILL.md +61 -0
  658. package/skills/unitycli/agents/interface.yaml +30 -0
  659. package/skills/unitycli/evals/history/2026-08-05-governed-baseline.json +44 -0
  660. package/skills/unitycli/evals/output/cases.jsonl +5 -0
  661. package/skills/unitycli/evals/output/fixtures/feedback-scenario.json +27 -0
  662. package/skills/unitycli/evals/output/schema.json +32 -0
  663. package/skills/unitycli/evals/semantic_config.json +46 -0
  664. package/skills/unitycli/evals/trigger_cases.json +39 -0
  665. package/skills/unitycli/examples/feedback-event.input.json +8 -0
  666. package/skills/unitycli/examples/feedback-record.output.json +12 -0
  667. package/skills/unitycli/manifest.json +112 -0
  668. package/skills/unitycli/references/custom-tools.md +111 -0
  669. package/skills/unitycli/references/feedback.md +59 -0
  670. package/skills/unitycli/references/operation-protocol.md +83 -0
  671. package/skills/unitycli/reports/output_quality_scorecard.md +56 -0
  672. package/skills/unitycli/reports/trust-report.md +57 -0
  673. package/skills/unitycli/scripts/record-feedback.ps1 +210 -0
  674. package/skills/unitycli/security/network_policy.json +18 -0
  675. package/skills/unitycli/security/permission_policy.json +40 -0
  676. package/unitypkg/Editor/Bridge/BridgeCommandContext.cs +64 -0
  677. package/unitypkg/Editor/Bridge/BridgeCommandException.cs +39 -0
  678. package/unitypkg/Editor/Bridge/BridgeCommandRegistry.cs +172 -0
  679. package/unitypkg/Editor/Bridge/BridgeHttpServer.cs +534 -0
  680. package/unitypkg/Editor/Bridge/BridgeResponse.cs +58 -0
  681. package/unitypkg/Editor/Bridge/BridgeWorkQueue.cs +325 -0
  682. package/unitypkg/Editor/BridgeStartupStateMachine.cs +81 -0
  683. package/unitypkg/Editor/Commands/ProjectToolCommands.cs +43 -0
  684. package/unitypkg/Editor/Commands/RuntimeToolCommands.cs +43 -0
  685. package/unitypkg/Editor/Generated/UnityCliToolCompletionRegistry.g.cs +428 -0
  686. package/unitypkg/Editor/Infrastructure/CodeExecSupport.cs +664 -0
  687. package/unitypkg/Editor/Infrastructure/RegistryOwnershipResolver.cs +148 -0
  688. package/unitypkg/Editor/Infrastructure/UnityCliActiveOperation.cs +411 -0
  689. package/unitypkg/Editor/Infrastructure/UnityCliAdmission.cs +485 -0
  690. package/unitypkg/Editor/Infrastructure/UnityCliArtifacts.cs +110 -0
  691. package/unitypkg/Editor/Infrastructure/UnityCliAssetRefreshCoordinator.cs +106 -0
  692. package/unitypkg/Editor/Infrastructure/UnityCliBridgeHelpers.cs +155 -0
  693. package/unitypkg/Editor/Infrastructure/UnityCliCanonicalProjectPath.cs +325 -0
  694. package/unitypkg/Editor/Infrastructure/UnityCliCompilationEventBroker.cs +192 -0
  695. package/unitypkg/Editor/Infrastructure/UnityCliCompileCoordinator.cs +271 -0
  696. package/unitypkg/Editor/Infrastructure/UnityCliCompletionProbe.cs +515 -0
  697. package/unitypkg/Editor/Infrastructure/UnityCliEditorStateSnapshot.cs +84 -0
  698. package/unitypkg/Editor/Infrastructure/UnityCliInstanceRegistry.cs +558 -0
  699. package/unitypkg/Editor/Infrastructure/UnityCliJson.cs +155 -0
  700. package/unitypkg/Editor/Infrastructure/UnityCliLargeOutput.cs +128 -0
  701. package/unitypkg/Editor/Infrastructure/UnityCliLiveBuildCoordinator.cs +230 -0
  702. package/unitypkg/Editor/Infrastructure/UnityCliLiveRefreshCoordinator.cs +164 -0
  703. package/unitypkg/Editor/Infrastructure/UnityCliLog.cs +127 -0
  704. package/unitypkg/Editor/Infrastructure/UnityCliNavMeshBakeCoordinator.cs +2073 -0
  705. package/unitypkg/Editor/Infrastructure/UnityCliObjectPatch.cs +193 -0
  706. package/unitypkg/Editor/Infrastructure/UnityCliObjectRef.cs +278 -0
  707. package/unitypkg/Editor/Infrastructure/UnityCliObjectSerializer.cs +620 -0
  708. package/unitypkg/Editor/Infrastructure/UnityCliOcclusionBakeCoordinator.cs +1739 -0
  709. package/unitypkg/Editor/Infrastructure/UnityCliOperationCoordinator.cs +828 -0
  710. package/unitypkg/Editor/Infrastructure/UnityCliPackageEmbedCoordinator.cs +147 -0
  711. package/unitypkg/Editor/Infrastructure/UnityCliPackageResolveCoordinator.cs +454 -0
  712. package/unitypkg/Editor/Infrastructure/UnityCliPackageResolveState.cs +561 -0
  713. package/unitypkg/Editor/Infrastructure/UnityCliPipelineHandoff.cs +742 -0
  714. package/unitypkg/Editor/Infrastructure/UnityCliProjectSettings.cs +92 -0
  715. package/unitypkg/Editor/Infrastructure/UnityCliProtocolRequest.cs +116 -0
  716. package/unitypkg/Editor/Infrastructure/UnityCliReflection.cs +477 -0
  717. package/unitypkg/Editor/Infrastructure/UnityCliReloadOperation.cs +664 -0
  718. package/unitypkg/Editor/Infrastructure/UnityCliRequestDigest.cs +34 -0
  719. package/unitypkg/Editor/Infrastructure/UnityCliRuntimeBuildInjection.cs +121 -0
  720. package/unitypkg/Editor/Infrastructure/UnityCliRuntimeExecutor.cs +391 -0
  721. package/unitypkg/Editor/Infrastructure/UnityCliSceneMutation.cs +84 -0
  722. package/unitypkg/Editor/Infrastructure/UnityCliScriptableObjectHelpers.cs +235 -0
  723. package/unitypkg/Editor/Infrastructure/UnityCliSerializer.cs +580 -0
  724. package/unitypkg/Editor/Infrastructure/UnityCliSessionMutationLease.cs +568 -0
  725. package/unitypkg/Editor/Infrastructure/UnityCliStateIO.cs +73 -0
  726. package/unitypkg/Editor/Infrastructure/UnityCliTestRunCoordinator.cs +598 -0
  727. package/unitypkg/Editor/Infrastructure/UnityCliTransactionLog.cs +112 -0
  728. package/unitypkg/Editor/Infrastructure/UnityCliValueConverter.cs +146 -0
  729. package/unitypkg/Editor/Infrastructure/UnityCliWaiter.cs +716 -0
  730. package/unitypkg/Editor/ProjectTools/IUnityCliTool.cs +152 -0
  731. package/unitypkg/Editor/ProjectTools/OfficialAttributeToolRegistry.cs +992 -0
  732. package/unitypkg/Editor/ProjectTools/ProjectToolRegistry.cs +938 -0
  733. package/unitypkg/Editor/ProjectTools/ProjectToolSchemaValidator.cs +258 -0
  734. package/unitypkg/Editor/ProjectTools/RegisteredTool.cs +75 -0
  735. package/unitypkg/Editor/ProjectTools/UnityCliProjectToolContext.cs +68 -0
  736. package/unitypkg/Editor/ProjectTools/UnityCliSchemaDeriver.cs +297 -0
  737. package/unitypkg/Editor/Protocol/ProtocolEnvelopeFactory.cs +92 -0
  738. package/unitypkg/Editor/Protocol/envelope.cs +50 -0
  739. package/unitypkg/Editor/Roslyn/LICENSE.txt +23 -0
  740. package/unitypkg/Editor/Roslyn/Microsoft.CodeAnalysis.CSharp.dll +0 -0
  741. package/unitypkg/Editor/Roslyn/Microsoft.CodeAnalysis.dll +0 -0
  742. package/unitypkg/Editor/Roslyn/System.Collections.Immutable.dll +0 -0
  743. package/unitypkg/Editor/Roslyn/System.Reflection.Metadata.dll +0 -0
  744. package/unitypkg/Editor/Tools/animation/AnimationToolSupport.cs +335 -0
  745. package/unitypkg/Editor/Tools/animation/AnimatorRuntimeToolSupport.cs +24 -0
  746. package/unitypkg/Editor/Tools/animation/animator/crossfade.cs +117 -0
  747. package/unitypkg/Editor/Tools/animation/animator/get-info.cs +24 -0
  748. package/unitypkg/Editor/Tools/animation/animator/get-parameter.cs +36 -0
  749. package/unitypkg/Editor/Tools/animation/animator/set-enabled.cs +33 -0
  750. package/unitypkg/Editor/Tools/animation/animator/set-parameter.cs +71 -0
  751. package/unitypkg/Editor/Tools/animation/animator/set-speed.cs +33 -0
  752. package/unitypkg/Editor/Tools/animation/clip/create.cs +48 -0
  753. package/unitypkg/Editor/Tools/animation/clip/modify.cs +43 -0
  754. package/unitypkg/Editor/Tools/animation/clip.cs +23 -0
  755. package/unitypkg/Editor/Tools/animation/play.cs +41 -0
  756. package/unitypkg/Editor/Tools/animation/state.cs +25 -0
  757. package/unitypkg/Editor/Tools/animation/stop.cs +45 -0
  758. package/unitypkg/Editor/Tools/asset/AssetImportSettingsToolSupport.cs +633 -0
  759. package/unitypkg/Editor/Tools/asset/AssetToolSupport.cs +253 -0
  760. package/unitypkg/Editor/Tools/asset/create.cs +84 -0
  761. package/unitypkg/Editor/Tools/asset/delete.cs +88 -0
  762. package/unitypkg/Editor/Tools/asset/duplicate.cs +68 -0
  763. package/unitypkg/Editor/Tools/asset/get-components.cs +177 -0
  764. package/unitypkg/Editor/Tools/asset/get-data.cs +73 -0
  765. package/unitypkg/Editor/Tools/asset/import-settings/set.cs +127 -0
  766. package/unitypkg/Editor/Tools/asset/import-settings.cs +54 -0
  767. package/unitypkg/Editor/Tools/asset/import.cs +132 -0
  768. package/unitypkg/Editor/Tools/asset/info.cs +48 -0
  769. package/unitypkg/Editor/Tools/asset/modify.cs +69 -0
  770. package/unitypkg/Editor/Tools/asset/move.cs +70 -0
  771. package/unitypkg/Editor/Tools/asset/preview.cs +86 -0
  772. package/unitypkg/Editor/Tools/asset/rename.cs +84 -0
  773. package/unitypkg/Editor/Tools/asset/search-built-in.cs +90 -0
  774. package/unitypkg/Editor/Tools/asset/search.cs +83 -0
  775. package/unitypkg/Editor/Tools/build/BuildSceneStateTool.cs +37 -0
  776. package/unitypkg/Editor/Tools/build/BuildSettingsToolSupport.cs +4 -0
  777. package/unitypkg/Editor/Tools/build/BuildToolDtos.cs +15 -0
  778. package/unitypkg/Editor/Tools/build/BuildToolSupport.cs +111 -0
  779. package/unitypkg/Editor/Tools/build/platform/get.cs +12 -0
  780. package/unitypkg/Editor/Tools/build/platform/set.cs +45 -0
  781. package/unitypkg/Editor/Tools/build/profile/create.cs +44 -0
  782. package/unitypkg/Editor/Tools/build/profile/list.cs +12 -0
  783. package/unitypkg/Editor/Tools/build/profile/modify.cs +42 -0
  784. package/unitypkg/Editor/Tools/build/profile/switch.cs +30 -0
  785. package/unitypkg/Editor/Tools/build/scene/add.cs +45 -0
  786. package/unitypkg/Editor/Tools/build/scene/disable.cs +3 -0
  787. package/unitypkg/Editor/Tools/build/scene/enable.cs +4 -0
  788. package/unitypkg/Editor/Tools/build/scene/list.cs +4 -0
  789. package/unitypkg/Editor/Tools/build/scene/remove.cs +29 -0
  790. package/unitypkg/Editor/Tools/build/settings/get.cs +3 -0
  791. package/unitypkg/Editor/Tools/build/settings/set.cs +74 -0
  792. package/unitypkg/Editor/Tools/camera/CameraToolSupport.cs +292 -0
  793. package/unitypkg/Editor/Tools/camera/create.cs +114 -0
  794. package/unitypkg/Editor/Tools/camera/info.cs +49 -0
  795. package/unitypkg/Editor/Tools/camera/lens.cs +119 -0
  796. package/unitypkg/Editor/Tools/camera/list.cs +52 -0
  797. package/unitypkg/Editor/Tools/camera/multiview.cs +96 -0
  798. package/unitypkg/Editor/Tools/camera/screenshot.cs +65 -0
  799. package/unitypkg/Editor/Tools/camera/target.cs +94 -0
  800. package/unitypkg/Editor/Tools/component/add.cs +125 -0
  801. package/unitypkg/Editor/Tools/component/get.cs +73 -0
  802. package/unitypkg/Editor/Tools/component/list-types.cs +90 -0
  803. package/unitypkg/Editor/Tools/component/modify.cs +103 -0
  804. package/unitypkg/Editor/Tools/component/remove.cs +147 -0
  805. package/unitypkg/Editor/Tools/component/set.cs +93 -0
  806. package/unitypkg/Editor/Tools/console/clear.cs +38 -0
  807. package/unitypkg/Editor/Tools/console/get.cs +28 -0
  808. package/unitypkg/Editor/Tools/controller/add-blend-tree-child.cs +88 -0
  809. package/unitypkg/Editor/Tools/controller/add-layer.cs +43 -0
  810. package/unitypkg/Editor/Tools/controller/add-parameter.cs +51 -0
  811. package/unitypkg/Editor/Tools/controller/add-state.cs +44 -0
  812. package/unitypkg/Editor/Tools/controller/add-transition.cs +71 -0
  813. package/unitypkg/Editor/Tools/controller/assign.cs +38 -0
  814. package/unitypkg/Editor/Tools/controller/create-blend-tree-1d.cs +40 -0
  815. package/unitypkg/Editor/Tools/controller/create-blend-tree-2d.cs +42 -0
  816. package/unitypkg/Editor/Tools/controller/create.cs +31 -0
  817. package/unitypkg/Editor/Tools/controller/get-info.cs +27 -0
  818. package/unitypkg/Editor/Tools/controller/remove-layer.cs +57 -0
  819. package/unitypkg/Editor/Tools/controller/set-layer-weight.cs +42 -0
  820. package/unitypkg/Editor/Tools/diagnose/preflight.cs +269 -0
  821. package/unitypkg/Editor/Tools/editor/EditorActionToolSupport.cs +117 -0
  822. package/unitypkg/Editor/Tools/editor/EditorSearchToolSupport.cs +146 -0
  823. package/unitypkg/Editor/Tools/editor/EditorToolSupport.cs +132 -0
  824. package/unitypkg/Editor/Tools/editor/EditorWindowFocusToolSupport.cs +194 -0
  825. package/unitypkg/Editor/Tools/editor/active-tool/set.cs +33 -0
  826. package/unitypkg/Editor/Tools/editor/active-tool.cs +100 -0
  827. package/unitypkg/Editor/Tools/editor/autotick/set.cs +102 -0
  828. package/unitypkg/Editor/Tools/editor/console.cs +26 -0
  829. package/unitypkg/Editor/Tools/editor/focus.cs +80 -0
  830. package/unitypkg/Editor/Tools/editor/menu-items.cs +50 -0
  831. package/unitypkg/Editor/Tools/editor/menu.cs +53 -0
  832. package/unitypkg/Editor/Tools/editor/pause.cs +38 -0
  833. package/unitypkg/Editor/Tools/editor/play.cs +43 -0
  834. package/unitypkg/Editor/Tools/editor/redo.cs +56 -0
  835. package/unitypkg/Editor/Tools/editor/resolution.cs +34 -0
  836. package/unitypkg/Editor/Tools/editor/search.cs +55 -0
  837. package/unitypkg/Editor/Tools/editor/selection/set.cs +37 -0
  838. package/unitypkg/Editor/Tools/editor/selection.cs +153 -0
  839. package/unitypkg/Editor/Tools/editor/stop.cs +43 -0
  840. package/unitypkg/Editor/Tools/editor/tool-states.cs +140 -0
  841. package/unitypkg/Editor/Tools/editor/undo.cs +56 -0
  842. package/unitypkg/Editor/Tools/editor/windows.cs +87 -0
  843. package/unitypkg/Editor/Tools/extension/status.cs +87 -0
  844. package/unitypkg/Editor/Tools/go/GameObjectToolSupport.cs +524 -0
  845. package/unitypkg/Editor/Tools/go/create.cs +333 -0
  846. package/unitypkg/Editor/Tools/go/delete.cs +87 -0
  847. package/unitypkg/Editor/Tools/go/duplicate.cs +76 -0
  848. package/unitypkg/Editor/Tools/go/find.cs +152 -0
  849. package/unitypkg/Editor/Tools/go/inspect.cs +49 -0
  850. package/unitypkg/Editor/Tools/go/look-at.cs +76 -0
  851. package/unitypkg/Editor/Tools/go/modify.cs +156 -0
  852. package/unitypkg/Editor/Tools/go/move-relative.cs +74 -0
  853. package/unitypkg/Editor/Tools/go/set-parent.cs +84 -0
  854. package/unitypkg/Editor/Tools/graphics/GraphicsToolSupport.cs +396 -0
  855. package/unitypkg/Editor/Tools/graphics/bake-cancel.cs +27 -0
  856. package/unitypkg/Editor/Tools/graphics/bake-clear.cs +31 -0
  857. package/unitypkg/Editor/Tools/graphics/bake-reflection-probe.cs +35 -0
  858. package/unitypkg/Editor/Tools/graphics/bake-settings.cs +131 -0
  859. package/unitypkg/Editor/Tools/graphics/bake-start.cs +27 -0
  860. package/unitypkg/Editor/Tools/graphics/bake-status.cs +31 -0
  861. package/unitypkg/Editor/Tools/graphics/light-probe-group.cs +56 -0
  862. package/unitypkg/Editor/Tools/graphics/pipeline-info.cs +19 -0
  863. package/unitypkg/Editor/Tools/graphics/pipeline-quality.cs +24 -0
  864. package/unitypkg/Editor/Tools/graphics/pipeline-settings.cs +46 -0
  865. package/unitypkg/Editor/Tools/graphics/probe-positions.cs +58 -0
  866. package/unitypkg/Editor/Tools/graphics/quality.cs +85 -0
  867. package/unitypkg/Editor/Tools/graphics/reflection-probe.cs +73 -0
  868. package/unitypkg/Editor/Tools/graphics/scene-debug.cs +37 -0
  869. package/unitypkg/Editor/Tools/graphics/settings.cs +104 -0
  870. package/unitypkg/Editor/Tools/graphics/skybox-get.cs +33 -0
  871. package/unitypkg/Editor/Tools/graphics/skybox-set-ambient.cs +24 -0
  872. package/unitypkg/Editor/Tools/graphics/skybox-set-fog.cs +24 -0
  873. package/unitypkg/Editor/Tools/graphics/skybox-set-material.cs +33 -0
  874. package/unitypkg/Editor/Tools/graphics/skybox-set-properties.cs +51 -0
  875. package/unitypkg/Editor/Tools/graphics/skybox-set-reflection.cs +31 -0
  876. package/unitypkg/Editor/Tools/graphics/skybox-set-sun.cs +35 -0
  877. package/unitypkg/Editor/Tools/graphics/stats-counters.cs +28 -0
  878. package/unitypkg/Editor/Tools/graphics/stats-memory.cs +21 -0
  879. package/unitypkg/Editor/Tools/graphics/stats.cs +17 -0
  880. package/unitypkg/Editor/Tools/graphics/volume.cs +59 -0
  881. package/unitypkg/Editor/Tools/instances/list.cs +71 -0
  882. package/unitypkg/Editor/Tools/material/MaterialToolSupport.cs +401 -0
  883. package/unitypkg/Editor/Tools/material/assign.cs +124 -0
  884. package/unitypkg/Editor/Tools/material/create.cs +82 -0
  885. package/unitypkg/Editor/Tools/material/info.cs +55 -0
  886. package/unitypkg/Editor/Tools/material/set-renderer-color.cs +108 -0
  887. package/unitypkg/Editor/Tools/material/set.cs +114 -0
  888. package/unitypkg/Editor/Tools/navmesh/NavMeshToolSupport.cs +404 -0
  889. package/unitypkg/Editor/Tools/navmesh/bake-clear.cs +70 -0
  890. package/unitypkg/Editor/Tools/navmesh/settings/set.cs +73 -0
  891. package/unitypkg/Editor/Tools/navmesh/settings.cs +37 -0
  892. package/unitypkg/Editor/Tools/object/ObjectToolSupport.cs +99 -0
  893. package/unitypkg/Editor/Tools/object/get-data.cs +69 -0
  894. package/unitypkg/Editor/Tools/object/modify.cs +126 -0
  895. package/unitypkg/Editor/Tools/occlusion/OcclusionToolSupport.cs +422 -0
  896. package/unitypkg/Editor/Tools/occlusion/bake-clear.cs +67 -0
  897. package/unitypkg/Editor/Tools/physics/PhysicsJointToolSupport.cs +13 -0
  898. package/unitypkg/Editor/Tools/physics/PhysicsToolSupport.cs +389 -0
  899. package/unitypkg/Editor/Tools/physics/assign-material.cs +88 -0
  900. package/unitypkg/Editor/Tools/physics/collision-matrix.cs +90 -0
  901. package/unitypkg/Editor/Tools/physics/force.cs +127 -0
  902. package/unitypkg/Editor/Tools/physics/joint/add.cs +99 -0
  903. package/unitypkg/Editor/Tools/physics/joint/remove.cs +4 -0
  904. package/unitypkg/Editor/Tools/physics/linecast.cs +59 -0
  905. package/unitypkg/Editor/Tools/physics/material.cs +73 -0
  906. package/unitypkg/Editor/Tools/physics/overlap.cs +84 -0
  907. package/unitypkg/Editor/Tools/physics/raycast-all.cs +67 -0
  908. package/unitypkg/Editor/Tools/physics/raycast.cs +96 -0
  909. package/unitypkg/Editor/Tools/physics/rigidbody.cs +116 -0
  910. package/unitypkg/Editor/Tools/physics/settings.cs +116 -0
  911. package/unitypkg/Editor/Tools/physics/shapecast.cs +127 -0
  912. package/unitypkg/Editor/Tools/physics/simulation.cs +89 -0
  913. package/unitypkg/Editor/Tools/physics/validate.cs +67 -0
  914. package/unitypkg/Editor/Tools/prefab/PrefabOverrideToolSupport.cs +355 -0
  915. package/unitypkg/Editor/Tools/prefab/PrefabToolSupport.cs +446 -0
  916. package/unitypkg/Editor/Tools/prefab/create.cs +125 -0
  917. package/unitypkg/Editor/Tools/prefab/hierarchy.cs +157 -0
  918. package/unitypkg/Editor/Tools/prefab/info.cs +44 -0
  919. package/unitypkg/Editor/Tools/prefab/instantiate.cs +106 -0
  920. package/unitypkg/Editor/Tools/prefab/modify.cs +112 -0
  921. package/unitypkg/Editor/Tools/prefab/overrides/apply.cs +51 -0
  922. package/unitypkg/Editor/Tools/prefab/overrides/revert.cs +51 -0
  923. package/unitypkg/Editor/Tools/prefab/stage-close.cs +67 -0
  924. package/unitypkg/Editor/Tools/prefab/stage-open.cs +69 -0
  925. package/unitypkg/Editor/Tools/prefab/stage-save.cs +64 -0
  926. package/unitypkg/Editor/Tools/prefab/stage.cs +68 -0
  927. package/unitypkg/Editor/Tools/prefab/unpack.cs +80 -0
  928. package/unitypkg/Editor/Tools/prefab/variant/create.cs +53 -0
  929. package/unitypkg/Editor/Tools/profiler/ProfilerFrameDebuggerSupport.cs +68 -0
  930. package/unitypkg/Editor/Tools/profiler/ProfilerMemorySnapshotSupport.cs +30 -0
  931. package/unitypkg/Editor/Tools/profiler/ProfilerToolSupport.cs +515 -0
  932. package/unitypkg/Editor/Tools/profiler/areas.cs +36 -0
  933. package/unitypkg/Editor/Tools/profiler/capture.cs +188 -0
  934. package/unitypkg/Editor/Tools/profiler/clear.cs +57 -0
  935. package/unitypkg/Editor/Tools/profiler/counter.cs +34 -0
  936. package/unitypkg/Editor/Tools/profiler/deep.cs +48 -0
  937. package/unitypkg/Editor/Tools/profiler/export.cs +85 -0
  938. package/unitypkg/Editor/Tools/profiler/frame-debugger/disable.cs +53 -0
  939. package/unitypkg/Editor/Tools/profiler/frame-debugger/enable.cs +66 -0
  940. package/unitypkg/Editor/Tools/profiler/frame-debugger/events.cs +140 -0
  941. package/unitypkg/Editor/Tools/profiler/frame.cs +38 -0
  942. package/unitypkg/Editor/Tools/profiler/hierarchy.cs +183 -0
  943. package/unitypkg/Editor/Tools/profiler/load.cs +85 -0
  944. package/unitypkg/Editor/Tools/profiler/memory-snapshot/compare.cs +78 -0
  945. package/unitypkg/Editor/Tools/profiler/memory-snapshot/list.cs +73 -0
  946. package/unitypkg/Editor/Tools/profiler/memory-snapshot/take.cs +147 -0
  947. package/unitypkg/Editor/Tools/profiler/memory.cs +34 -0
  948. package/unitypkg/Editor/Tools/profiler/module-enable.cs +52 -0
  949. package/unitypkg/Editor/Tools/profiler/modules.cs +33 -0
  950. package/unitypkg/Editor/Tools/profiler/object-memory.cs +49 -0
  951. package/unitypkg/Editor/Tools/profiler/pause.cs +49 -0
  952. package/unitypkg/Editor/Tools/profiler/rendering-stats.cs +109 -0
  953. package/unitypkg/Editor/Tools/profiler/script-stats.cs +35 -0
  954. package/unitypkg/Editor/Tools/profiler/start.cs +55 -0
  955. package/unitypkg/Editor/Tools/profiler/status.cs +36 -0
  956. package/unitypkg/Editor/Tools/profiler/stop.cs +53 -0
  957. package/unitypkg/Editor/Tools/project/ProjectSettingsReader.cs +31 -0
  958. package/unitypkg/Editor/Tools/project/ProjectSettingsToolSupport.cs +757 -0
  959. package/unitypkg/Editor/Tools/project/ProjectTagLayerToolSupport.cs +23 -0
  960. package/unitypkg/Editor/Tools/project/audio-settings/set.cs +35 -0
  961. package/unitypkg/Editor/Tools/project/audio-settings.cs +31 -0
  962. package/unitypkg/Editor/Tools/project/info.cs +52 -0
  963. package/unitypkg/Editor/Tools/project/input-settings/set.cs +35 -0
  964. package/unitypkg/Editor/Tools/project/input-settings.cs +35 -0
  965. package/unitypkg/Editor/Tools/project/layer/add.cs +3 -0
  966. package/unitypkg/Editor/Tools/project/layer/remove.cs +3 -0
  967. package/unitypkg/Editor/Tools/project/layers.cs +61 -0
  968. package/unitypkg/Editor/Tools/project/player-settings/set.cs +35 -0
  969. package/unitypkg/Editor/Tools/project/player-settings.cs +31 -0
  970. package/unitypkg/Editor/Tools/project/tag/add.cs +3 -0
  971. package/unitypkg/Editor/Tools/project/tag/remove.cs +3 -0
  972. package/unitypkg/Editor/Tools/project/tags.cs +45 -0
  973. package/unitypkg/Editor/Tools/project/time-settings/set.cs +35 -0
  974. package/unitypkg/Editor/Tools/project/time-settings.cs +31 -0
  975. package/unitypkg/Editor/Tools/reflection/method/call.cs +114 -0
  976. package/unitypkg/Editor/Tools/reflection/method/find.cs +72 -0
  977. package/unitypkg/Editor/Tools/reflection/type/schema.cs +56 -0
  978. package/unitypkg/Editor/Tools/scene/SceneToolSupport.cs +181 -0
  979. package/unitypkg/Editor/Tools/scene/active.cs +62 -0
  980. package/unitypkg/Editor/Tools/scene/build-settings.cs +69 -0
  981. package/unitypkg/Editor/Tools/scene/create.cs +78 -0
  982. package/unitypkg/Editor/Tools/scene/data.cs +125 -0
  983. package/unitypkg/Editor/Tools/scene/gameobject/component.cs +63 -0
  984. package/unitypkg/Editor/Tools/scene/gameobject/components.cs +77 -0
  985. package/unitypkg/Editor/Tools/scene/gameobject-support.cs +101 -0
  986. package/unitypkg/Editor/Tools/scene/gameobject.cs +83 -0
  987. package/unitypkg/Editor/Tools/scene/hierarchy.cs +250 -0
  988. package/unitypkg/Editor/Tools/scene/list-opened.cs +77 -0
  989. package/unitypkg/Editor/Tools/scene/load.cs +68 -0
  990. package/unitypkg/Editor/Tools/scene/move-object.cs +122 -0
  991. package/unitypkg/Editor/Tools/scene/save.cs +231 -0
  992. package/unitypkg/Editor/Tools/scene/set-active.cs +76 -0
  993. package/unitypkg/Editor/Tools/scene/unload.cs +109 -0
  994. package/unitypkg/Editor/Tools/scene/validate.cs +115 -0
  995. package/unitypkg/Editor/Tools/scene/view-frame.cs +218 -0
  996. package/unitypkg/Editor/Tools/screenshot/EditorElementCaptureToolSupport.cs +181 -0
  997. package/unitypkg/Editor/Tools/screenshot/ScreenshotToolSupport.cs +196 -0
  998. package/unitypkg/Editor/Tools/screenshot/editor-element.cs +87 -0
  999. package/unitypkg/Editor/Tools/screenshot/game-view.cs +116 -0
  1000. package/unitypkg/Editor/Tools/screenshot/isolated-object.cs +93 -0
  1001. package/unitypkg/Editor/Tools/screenshot/orbit.cs +103 -0
  1002. package/unitypkg/Editor/Tools/screenshot/scene-view.cs +99 -0
  1003. package/unitypkg/Editor/Tools/screenshot/screen.cs +89 -0
  1004. package/unitypkg/Editor/Tools/screenshot/surround.cs +181 -0
  1005. package/unitypkg/Editor/Tools/scriptable-object/ScriptableObjectToolSupport.cs +196 -0
  1006. package/unitypkg/Editor/Tools/scriptable-object/create.cs +79 -0
  1007. package/unitypkg/Editor/Tools/scriptable-object/info.cs +49 -0
  1008. package/unitypkg/Editor/Tools/scriptable-object/list-types.cs +103 -0
  1009. package/unitypkg/Editor/Tools/scriptable-object/modify.cs +208 -0
  1010. package/unitypkg/Editor/Tools/shader/ShaderToolSupport.cs +326 -0
  1011. package/unitypkg/Editor/Tools/shader/create.cs +82 -0
  1012. package/unitypkg/Editor/Tools/shader/delete.cs +90 -0
  1013. package/unitypkg/Editor/Tools/shader/get-data.cs +125 -0
  1014. package/unitypkg/Editor/Tools/shader/info.cs +48 -0
  1015. package/unitypkg/Editor/Tools/shader/list.cs +82 -0
  1016. package/unitypkg/Editor/Tools/shader/read.cs +84 -0
  1017. package/unitypkg/Editor/Tools/shader/update.cs +71 -0
  1018. package/unitypkg/Editor/Tools/tests/list.cs +98 -0
  1019. package/unitypkg/Editor/Tools/texture/TextureToolSupport.cs +327 -0
  1020. package/unitypkg/Editor/Tools/texture/create.cs +182 -0
  1021. package/unitypkg/Editor/Tools/texture/delete.cs +89 -0
  1022. package/unitypkg/Editor/Tools/texture/generate.cs +189 -0
  1023. package/unitypkg/Editor/Tools/texture/import-settings.cs +104 -0
  1024. package/unitypkg/Editor/Tools/texture/info.cs +50 -0
  1025. package/unitypkg/Editor/Tools/texture/modify.cs +154 -0
  1026. package/unitypkg/Editor/Tools/texture/sprite.cs +132 -0
  1027. package/unitypkg/Editor/Tools/timeline/TimelineMutationToolSupport.cs +696 -0
  1028. package/unitypkg/Editor/Tools/timeline/TimelineReadToolSupport.cs +439 -0
  1029. package/unitypkg/Editor/Tools/timeline/TimelineToolSupport.cs +203 -0
  1030. package/unitypkg/Editor/Tools/timeline/clip/add.cs +93 -0
  1031. package/unitypkg/Editor/Tools/timeline/create.cs +88 -0
  1032. package/unitypkg/Editor/Tools/timeline/info.cs +54 -0
  1033. package/unitypkg/Editor/Tools/timeline/track/add.cs +91 -0
  1034. package/unitypkg/Editor/Tools/ui/UiToolSupport.cs +162 -0
  1035. package/unitypkg/Editor/Tools/ui/UiUguiToolSupport.cs +24 -0
  1036. package/unitypkg/Editor/Tools/ui/attach-document.cs +46 -0
  1037. package/unitypkg/Editor/Tools/ui/button/create.cs +58 -0
  1038. package/unitypkg/Editor/Tools/ui/canvas/create.cs +40 -0
  1039. package/unitypkg/Editor/Tools/ui/create-panel-settings.cs +44 -0
  1040. package/unitypkg/Editor/Tools/ui/detach-document.cs +41 -0
  1041. package/unitypkg/Editor/Tools/ui/document/create.cs +49 -0
  1042. package/unitypkg/Editor/Tools/ui/document/delete.cs +33 -0
  1043. package/unitypkg/Editor/Tools/ui/document/info.cs +33 -0
  1044. package/unitypkg/Editor/Tools/ui/document/update.cs +36 -0
  1045. package/unitypkg/Editor/Tools/ui/get-visual-tree.cs +34 -0
  1046. package/unitypkg/Editor/Tools/ui/hierarchy.cs +27 -0
  1047. package/unitypkg/Editor/Tools/ui/image/create.cs +47 -0
  1048. package/unitypkg/Editor/Tools/ui/link-stylesheet.cs +54 -0
  1049. package/unitypkg/Editor/Tools/ui/list-documents.cs +34 -0
  1050. package/unitypkg/Editor/Tools/ui/modify-visual-element.cs +76 -0
  1051. package/unitypkg/Editor/Tools/ui/render-preview.cs +128 -0
  1052. package/unitypkg/Editor/Tools/ui/text/create.cs +45 -0
  1053. package/unitypkg/Editor/Tools/ui/update-panel-settings.cs +49 -0
  1054. package/unitypkg/Editor/UnityCliBridge.cs +431 -0
  1055. package/unitypkg/Editor/UnityCliBridgeBuildInfo.cs +9 -0
  1056. package/unitypkg/Runtime/Infrastructure/UnityCliRuntimeBridge.cs +580 -0
  1057. package/unitypkg/Runtime/Infrastructure/UnityCliRuntimeJson.cs +232 -0
  1058. package/unitypkg/Runtime/Infrastructure/UnityCliRuntimeRegistry.cs +297 -0
  1059. package/unitypkg/Runtime/Tools/UnityCliRuntimeTools.cs +701 -0
  1060. package/unitypkg/Runtime/UnityCli.Runtime.asmdef +14 -0
  1061. package/unitypkg/Shared/UnityCli.Shared.asmdef +14 -0
  1062. package/unitypkg/Shared/UnityCliAdmissionPool.cs +426 -0
  1063. package/unitypkg/Tests/Editor/UnityCli.Editor.Tests.asmdef +15 -0
  1064. package/unitypkg/Tests/Editor/UnityCliAdmissionPoolTests.cs +262 -0
  1065. package/unitypkg/UnityCli.Editor.asmdef +26 -0
  1066. package/unitypkg/package.json +11 -0
@@ -0,0 +1,598 @@
1
+ #if UNITY_EDITOR
2
+ using System;
3
+ using System.Collections;
4
+ using System.Collections.Generic;
5
+ using System.Globalization;
6
+ using System.IO;
7
+ using System.Linq;
8
+ using System.Reflection;
9
+ using System.Security.Cryptography;
10
+ using System.Text;
11
+ using System.Threading;
12
+ using System.Threading.Tasks;
13
+ using UnityEditor;
14
+ using UnityEditor.TestTools.TestRunner.Api;
15
+ using UnityEngine;
16
+ using UnityEngine.TestTools;
17
+ using UnityCli.Protocol;
18
+
19
+ namespace UnityCli
20
+ {
21
+ public static partial class UnityCliBridge
22
+ {
23
+ /// <summary>TestRunner 的 callback 身份和阶段保存在 active-test-run 文件中,reload 后只续接而不重放 Execute。</summary>
24
+ internal static class UnityCliTestRunCoordinator
25
+ {
26
+ internal const string Command = "internal.test.run.start";
27
+ private const string StatusCommand = "internal.test.run.status";
28
+ private const string CancelPlanCommand = "internal.test.run.cancel.plan";
29
+ private const string CancelCommand = "internal.test.run.cancel";
30
+ private const string CancelStatusCommand = "internal.test.run.cancel.status";
31
+ private const string CancelTerminalScope = "test-cancel";
32
+ private const string Scope = "test-run";
33
+ private static readonly TimeSpan RecoveryGrace = TimeSpan.FromSeconds(5);
34
+ private static TestRunnerApi api;
35
+ private static Broker broker;
36
+ // 终态不落盘;同一 Editor session 内的 status 轮询可取回 callback 结果。
37
+ private static string terminalRequestId;
38
+ private static string terminalRequestDigest;
39
+ private static object terminalEnvelope;
40
+ private static string cancelTerminalRequestId;
41
+ private static object cancelTerminalData;
42
+ private static readonly Coordinator operation = new Coordinator();
43
+
44
+ private sealed class Coordinator : UnityCliReloadOperation
45
+ {
46
+ protected override string Scope { get { return "test-run"; } }
47
+ protected override string StartCommand { get { return Command; } }
48
+ protected override string StatusCommand { get { return UnityCliTestRunCoordinator.StatusCommand; } }
49
+ protected override string OperationDisplayName { get { return "Test run"; } }
50
+ protected override object DeserializeStartArgs(BridgeRequest request) { return request.DeserializeArgs<Args>(); }
51
+ protected override void ValidateStart(object args) { }
52
+ protected override object Planned(object args) { return null; }
53
+ protected override Dictionary<string, object> CreateRoot(BridgeRequest request, string digest, object args) { return null; }
54
+ protected override void OnTick(Dictionary<string, object> root) { }
55
+ protected override object BuildSuccessData(Dictionary<string, object> root) { return null; }
56
+ protected override IEnumerable<(string name, bool destructive)> AdditionalCommands
57
+ {
58
+ get { yield return (CancelPlanCommand, false); yield return (CancelCommand, true); yield return (CancelStatusCommand, false); }
59
+ }
60
+ internal void Initialize() { InitializeLegacy(); }
61
+ internal void Shutdown() { ShutdownLegacy(); }
62
+ internal void BeforeReload() { BeforeReloadLegacy(); }
63
+ internal override Task<string> Execute(BridgeRequest request, byte[] raw, Func<bool> accept, CancellationToken ct) { return LegacyExecute(request, raw, accept, ct); }
64
+ internal override void Tick() { LegacyTick(); }
65
+ }
66
+
67
+ private sealed class Root { internal string RequestId; internal string RequestDigest; internal string EditorSessionId; internal DateTimeOffset AbsoluteDeadlineUtc; internal Dictionary<string, object> TestOperation; }
68
+ private sealed class CancelDispatchIdentity
69
+ {
70
+ internal string RootRequestId; internal string RootRequestDigest; internal string EditorSessionId; internal DateTimeOffset AbsoluteDeadlineUtc;
71
+ internal string RunId; internal string CancelRequestId; internal string CancelRequestDigest;
72
+ }
73
+ private enum CancelDispatchOutcome { NotInvoked, Returned, OutcomeUnknown }
74
+ internal static bool IsCommand(string command) { return operation.IsCommand(command); }
75
+ internal static void Register(BridgeCommandRegistry registry) { operation.Register(registry); }
76
+ internal static void Initialize() { operation.Initialize(); RecoverTerminalCleanup(); }
77
+ internal static void Shutdown() { operation.Shutdown(); }
78
+ internal static void BeforeReload() { operation.BeforeReload(); }
79
+ private static void InitializeLegacy() { api = ScriptableObject.CreateInstance<TestRunnerApi>(); broker = new Broker(); api.RegisterCallbacks(broker, 1000); }
80
+ /// <summary>一次run终态会注销callback;后续新identity必须先重建唯一API与broker。</summary>
81
+ private static void EnsureLegacyApi() { if (api == null || broker == null) InitializeLegacy(); }
82
+ private static void ShutdownLegacy() { if (api != null && broker != null) api.UnregisterCallbacks(broker); api = null; broker = null; terminalRequestId = null; terminalRequestDigest = null; terminalEnvelope = null; cancelTerminalRequestId = null; cancelTerminalData = null; }
83
+ private static void BeforeReloadLegacy() { }
84
+
85
+ internal static Task<string> Execute(BridgeRequest request, byte[] raw, Func<bool> accept, CancellationToken ct) { return operation.Execute(request, raw, accept, ct); }
86
+
87
+ private static async Task<string> LegacyExecute(BridgeRequest request, byte[] raw, Func<bool> accept, CancellationToken ct)
88
+ {
89
+ if (request.Command == StatusCommand) return UnityCliSerializer.Serialize(Status(request));
90
+ if (request.Command == CancelPlanCommand) return UnityCliSerializer.Serialize(ProtocolEnvelopeFactory.Success(request.RequestId, CancelPlan(request)));
91
+ if (request.Command == CancelCommand)
92
+ {
93
+ var cancelDigest = UnityCliRequestDigest.Compute(raw, request.InstanceId);
94
+ object cancelTerminal;
95
+ if (UnityCliActiveOperation.TryGetTerminal(CancelTerminalScope, request.RequestId, cancelDigest, out cancelTerminal))
96
+ return CancelTerminalStartResponse(request.RequestId, cancelTerminal);
97
+ if (accept == null || !accept()) throw new OperationCanceledException("HTTP timeout cancelled test cancellation before acceptance.");
98
+ return UnityCliSerializer.Serialize(ProtocolEnvelopeFactory.Success(request.RequestId, Cancel(request, cancelDigest, ct)));
99
+ }
100
+ if (request.Command == CancelStatusCommand) return UnityCliSerializer.Serialize(ProtocolEnvelopeFactory.Success(request.RequestId, CancelStatus(request)));
101
+ var args = request.DeserializeArgs<Args>();
102
+ var digest = UnityCliRequestDigest.Compute(raw, request.InstanceId);
103
+ object durableTerminal;
104
+ try
105
+ {
106
+ if (UnityCliActiveOperation.TryGetTerminal(Scope, request.RequestId, digest, out durableTerminal))
107
+ {
108
+ terminalRequestId = request.RequestId;
109
+ terminalRequestDigest = digest;
110
+ terminalEnvelope = durableTerminal;
111
+ try { UnityCliActiveOperation.BeginExactTerminalCleanup(Scope, request.RequestId, digest); } catch { }
112
+ return Terminal(request.RequestId, durableTerminal);
113
+ }
114
+ }
115
+ catch (BridgeCommandException exception) { return SerializeBridgeExceptionEnvelope(request.RequestId, exception); }
116
+
117
+ Root root;
118
+ try { root = Load(); }
119
+ catch (Exception) { return SerializeBridgeExceptionEnvelope(request.RequestId, new BridgeCommandException("E_EXECUTION_TIMEOUT", "Test active state cannot be read; outcome is unknown.")); }
120
+ if (root != null)
121
+ {
122
+ if (!string.Equals(root.RequestId, request.RequestId, StringComparison.Ordinal)) return BusyStart(request.RequestId);
123
+ if (!string.Equals(root.RequestDigest, digest, StringComparison.Ordinal))
124
+ return SerializeBridgeExceptionEnvelope(request.RequestId, new BridgeCommandException("E_REQUEST_ID_REUSED", "Test requestId was reused with different input."));
125
+ if (!string.Equals(root.EditorSessionId, EditorSessionId(), StringComparison.Ordinal))
126
+ {
127
+ Fail(root, "E_EDITOR_SESSION_REPLACED", "The selected Editor session changed before tests began.");
128
+ return Accepted(request.RequestId, digest);
129
+ }
130
+ if (!UnityCliSessionMutationLease.IsOwnedBy(root.RequestId, root.RequestDigest))
131
+ return SerializeBridgeExceptionEnvelope(request.RequestId, new BridgeCommandException("E_EXECUTION_TIMEOUT", "Test active root no longer owns its exact lease; outcome is unknown."));
132
+ EnsureLegacyApi();
133
+ return Accepted(request.RequestId, digest);
134
+ }
135
+
136
+ bool newlyAcquiredLease;
137
+ if (!UnityCliSessionMutationLease.TryAcquire(request.RequestId, digest, out newlyAcquiredLease) || !newlyAcquiredLease) return BusyStart(request.RequestId);
138
+ try
139
+ {
140
+ if (accept == null || !accept()) throw new OperationCanceledException();
141
+ Validate(args);
142
+ EnsureLegacyApi();
143
+ root = NewRoot(request, digest, args);
144
+ Save(root);
145
+ await Task.FromResult(0);
146
+ return Accepted(request.RequestId, digest);
147
+ }
148
+ catch (OperationCanceledException)
149
+ {
150
+ var released = TrySchedulePreEffectLeaseCleanup(request.RequestId, digest);
151
+ var message = released ? "Tests did not begin before the request deadline." : "Tests did not begin and exact lease cleanup remains pending.";
152
+ return Terminal(request.RequestId, ProtocolEnvelopeFactory.Error(request.RequestId, "E_EXECUTION_TIMEOUT", message, null, new[] { "Inspect editor.state and retry after cleanup completes." }));
153
+ }
154
+ catch (BridgeCommandException ex)
155
+ {
156
+ return TrySchedulePreEffectLeaseCleanup(request.RequestId, digest)
157
+ ? SerializeBridgeExceptionEnvelope(request.RequestId, ex)
158
+ : SerializeBridgeExceptionEnvelope(request.RequestId, new BridgeCommandException("E_EXECUTION_TIMEOUT", "Test validation failed and exact lease cleanup remains pending."));
159
+ }
160
+ catch (Exception exception)
161
+ {
162
+ var released = TrySchedulePreEffectLeaseCleanup(request.RequestId, digest);
163
+ var message = released
164
+ ? "Test start failed before its effect: " + exception.GetType().Name + "."
165
+ : "Test start failed before its effect and exact lease cleanup remains pending.";
166
+ return SerializeBridgeExceptionEnvelope(request.RequestId, new BridgeCommandException("E_EXECUTION_TIMEOUT", message));
167
+ }
168
+ }
169
+
170
+ /// <summary>effect前失败也必须保留exact cleanup marker,直到可证明lease已不再归属该请求。</summary>
171
+ private static bool TrySchedulePreEffectLeaseCleanup(string requestId, string requestDigest)
172
+ {
173
+ try { UnityCliActiveOperation.Clear(Scope); } catch { }
174
+ try { UnityCliSessionMutationLease.Release(requestId, requestDigest); } catch { }
175
+ bool isOwned;
176
+ if (UnityCliSessionMutationLease.TryIsOwnedBy(requestId, requestDigest, out isOwned) && !isOwned) return true;
177
+ try { UnityCliActiveOperation.BeginExactTerminalCleanup(Scope, requestId, requestDigest); } catch { }
178
+ return false;
179
+ }
180
+
181
+ internal static void Tick() { operation.Tick(); }
182
+
183
+ private static void LegacyTick()
184
+ {
185
+ RecoverTerminalCleanup();
186
+ Root root;
187
+ try { root = Load(); }
188
+ catch (Exception) { return; }
189
+ if (root == null || !UnityCliSessionMutationLease.IsOwnedBy(root.RequestId, root.RequestDigest)) return;
190
+ var cancelRequested = Bool(root.TestOperation, "cancelRequested");
191
+ var cancelEffectState = Text(root.TestOperation, "cancelEffectState");
192
+ if (cancelRequested && Same(cancelEffectState, "dispatching")) { TickCancel(root); return; }
193
+ var acceptedCancel = cancelRequested && (Same(cancelEffectState, "dispatched") || Same(cancelEffectState, "outcome_unknown"));
194
+ if (!string.Equals(root.EditorSessionId, EditorSessionId(), StringComparison.Ordinal))
195
+ {
196
+ if (acceptedCancel)
197
+ {
198
+ if (!TryFreezeCancelOutcomeUnknown(root, "The Editor session changed after test cancellation was dispatched; cancellation outcome is unknown.")) return;
199
+ Fail(root, "E_EXECUTION_TIMEOUT", "Test cancellation outcome is unknown after the Editor session changed."); return;
200
+ }
201
+ Fail(root, "E_EDITOR_SESSION_REPLACED", "The selected Editor session changed before tests began."); return;
202
+ }
203
+ if (DateTimeOffset.UtcNow >= root.AbsoluteDeadlineUtc)
204
+ {
205
+ if (acceptedCancel)
206
+ {
207
+ TickCancel(root);
208
+ try { root = Load(); } catch { return; }
209
+ if (root == null) return;
210
+ if (!TryFreezeCancelOutcomeUnknown(root, "Test cancellation did not reach a proven terminal before the deadline; outcome is unknown.")) return;
211
+ Fail(root, "E_EXECUTION_TIMEOUT", "Test cancellation did not reach a proven terminal before the deadline."); return;
212
+ }
213
+ RecoverAfterDeadline(root); return;
214
+ }
215
+ if (cancelRequested) { TickCancel(root); return; }
216
+ var phase = Text(root.TestOperation, "phase"); if (phase != "queued") { RecoverRunIdentity(root); return; }
217
+ if (EditorApplication.isCompiling || EditorApplication.isUpdating || IsPlayModeChanging()) return;
218
+ string[] activeRunIds; string reason;
219
+ if (!TryReadActiveRunIds(out activeRunIds, out reason)) { Fail(root, "E_TEST_RUN_STATE_UNPROVEN", "Unity Test Framework active-run state could not be verified: " + reason + "."); return; }
220
+ if (activeRunIds.Length > 0) { Fail(root, "E_TEST_RUN_BUSY", "Another Unity Test Framework run is already active."); return; }
221
+ var dispatchNonce = Guid.NewGuid().ToString("N"); Update(root, x => { x.TestOperation["phase"] = "execute_dispatching"; x.TestOperation["dispatchNonce"] = dispatchNonce; });
222
+ try
223
+ {
224
+ var runId = api.Execute(Settings(root.TestOperation));
225
+ if (!Guid.TryParse(runId, out _)) { Fail(root, "E_EXECUTION_TIMEOUT", "TestRunnerApi.Execute returned an invalid run identity."); return; }
226
+ root = Required(); Update(root, x => { x.TestOperation["returnedRunId"] = runId; x.TestOperation["phase"] = "run_identity_pending"; }); ResolveRunIdentity(Required());
227
+ }
228
+ catch (Exception ex) { Fail(root, "E_EXECUTION_TIMEOUT", "TestRunnerApi.Execute failed: " + ex.GetType().Name + "."); }
229
+ }
230
+
231
+ private sealed class Broker : ICallbacks
232
+ {
233
+ public void RunStarted(ITestAdaptor testsToRun)
234
+ {
235
+ var root = Lease(); if (!CanObserveCallback(root, "execute_dispatching", "run_identity_pending", "running")) return;
236
+ string[] activeRunIds; string reason; var unique = TryReadActiveRunIds(out activeRunIds, out reason) && activeRunIds.Length == 1;
237
+ Update(root, x => { x.TestOperation["runStarted"] = true; if (unique) x.TestOperation["observedRunId"] = activeRunIds[0]; x.TestOperation["testTreeHash"] = TestTreeHash(testsToRun); x.TestOperation["testCaseCount"] = (long)Math.Max(0, testsToRun.TestCaseCount); });
238
+ }
239
+ public void TestStarted(ITestAdaptor test) { }
240
+ public void TestFinished(ITestResultAdaptor result) { }
241
+ public void RunFinished(ITestResultAdaptor result)
242
+ {
243
+ var root = Lease(); if (!CanObserveCallback(root, "execute_dispatching", "run_identity_pending", "running") || !Bool(root.TestOperation, "runStarted")) return;
244
+ var observed = Text(root.TestOperation, "observedRunId"); if (string.IsNullOrEmpty(observed) || !Same(Text(root.TestOperation, "testTreeHash"), TestTreeHash(result.Test))) return;
245
+ if (Bool(root.TestOperation, "cancelRequested") && Same(Text(root.TestOperation, "cancelRunId"), observed)) { Update(root, value => value.TestOperation["cancelRunFinished"] = true); return; }
246
+ if (Text(root.TestOperation, "phase") == "running" && Same(Text(root.TestOperation, "runId"), observed)) Complete(root, result);
247
+ else Update(root, x => { x.TestOperation["pendingFinished"] = CaptureResultData(x, result); x.TestOperation["pendingFinishedRunId"] = observed; });
248
+ }
249
+ }
250
+
251
+ /// <summary>plan与actual都只接受本coordinator拥有且native GUID唯一匹配的running test operation。</summary>
252
+ private static object CancelPlan(BridgeRequest request)
253
+ {
254
+ var args = request.DeserializeArgs<CancelArgs>();
255
+ var root = PrepareCancel(args, false);
256
+ return CancelData(root, false, true, ActiveIdsRequired(root));
257
+ }
258
+
259
+ /// <summary>journal先冻结cancel identity,随后仅对该TestJobData.editModeRunner调用一次OnRunCancel。</summary>
260
+ private static object Cancel(BridgeRequest request, string cancelDigest, CancellationToken cancellationToken)
261
+ {
262
+ var args = request.DeserializeArgs<CancelArgs>();
263
+ var root = PrepareCancel(args, true);
264
+ var runId = Text(root.TestOperation, "runId");
265
+ var existingCancelId = Text(root.TestOperation, "cancelRequestId");
266
+ if (!string.IsNullOrEmpty(existingCancelId))
267
+ {
268
+ if (!Same(existingCancelId, request.RequestId) || !Same(Text(root.TestOperation, "cancelRequestDigest"), cancelDigest))
269
+ throw new BridgeCommandException("E_REQUEST_ID_REUSED", "Test cancellation identity changed after acceptance.");
270
+ return CancelAcceptedData(root, runId);
271
+ }
272
+ var dispatch = new CancelDispatchIdentity { RootRequestId = root.RequestId, RootRequestDigest = root.RequestDigest, EditorSessionId = root.EditorSessionId, AbsoluteDeadlineUtc = root.AbsoluteDeadlineUtc, RunId = runId, CancelRequestId = request.RequestId, CancelRequestDigest = cancelDigest };
273
+ var cancelAdmissionOwner = CaptureAdmissionOwner(request.RequestId);
274
+ Update(root, value => { AddAdmissionOwnerFields(value.TestOperation, cancelAdmissionOwner); value.TestOperation["cancelRequested"] = true; value.TestOperation["cancelRequestId"] = dispatch.CancelRequestId; value.TestOperation["cancelRequestDigest"] = dispatch.CancelRequestDigest; value.TestOperation["cancelRootRequestDigest"] = dispatch.RootRequestDigest; value.TestOperation["cancelRunId"] = dispatch.RunId; value.TestOperation["cancelPhaseBefore"] = Text(value.TestOperation, "phase"); value.TestOperation["cancelEffectState"] = "dispatching"; });
275
+ bool isOwned;
276
+ try
277
+ {
278
+ root = Required();
279
+ if (!MatchesCancelDispatch(root, dispatch) || cancellationToken.IsCancellationRequested || DateTimeOffset.UtcNow >= dispatch.AbsoluteDeadlineUtc
280
+ || !Same(dispatch.EditorSessionId, EditorSessionId()) || !UnityCliSessionMutationLease.TryIsOwnedBy(dispatch.RootRequestId, dispatch.RootRequestDigest, out isOwned) || !isOwned)
281
+ throw new BridgeCommandException("E_EXECUTION_TIMEOUT", "Test cancellation dispatch authorization is not exact.");
282
+ }
283
+ catch
284
+ {
285
+ TryStoreCancelDispatchTimeout(dispatch, "Test cancellation dispatch authorization became uncertain before OnRunCancel; cancellation was not invoked.", "outcome_unknown");
286
+ throw new BridgeCommandException("E_EXECUTION_TIMEOUT", "Test cancellation authorization expired before its effect.", "Inspect test.run before submitting another cancellation.");
287
+ }
288
+ string reason;
289
+ var outcome = TryCancelExactRun(dispatch, cancellationToken, out reason);
290
+ if (outcome != CancelDispatchOutcome.Returned)
291
+ {
292
+ var message = outcome == CancelDispatchOutcome.OutcomeUnknown
293
+ ? "Exact Unity Test Runner cancellation may have occurred but its return state is unknown."
294
+ : "Exact Unity Test Runner cancellation was not invoked: " + reason + ".";
295
+ TryStoreCancelDispatchTimeout(dispatch, message, outcome == CancelDispatchOutcome.OutcomeUnknown ? "outcome_unknown" : "not_invoked");
296
+ throw new BridgeCommandException("E_EXECUTION_TIMEOUT", message, "Inspect test.run state before deciding whether to submit another cancellation.");
297
+ }
298
+ try
299
+ {
300
+ root = Required();
301
+ if (!MatchesCancelDispatch(root, dispatch)) throw new BridgeCommandException("E_EXECUTION_TIMEOUT", "Test cancellation root changed after OnRunCancel.");
302
+ Update(root, value => value.TestOperation["cancelEffectState"] = "dispatched");
303
+ }
304
+ catch
305
+ {
306
+ TryStoreCancelDispatchTimeout(dispatch, "Test cancellation occurred but its dispatched state could not be durably proven.", "outcome_unknown");
307
+ throw new BridgeCommandException("E_EXECUTION_TIMEOUT", "Test cancellation outcome is unknown after OnRunCancel.", "Inspect test.run before submitting another cancellation.");
308
+ }
309
+ return CancelAcceptedData(root, runId);
310
+ }
311
+
312
+ private static object CancelStatus(BridgeRequest request)
313
+ {
314
+ var args = request.DeserializeArgs<CancelStatusArgs>();
315
+ if (args == null || !IsSafeId(args.CancelRequestId) || !IsSha256(args.RootRequestDigest)) throw new BridgeCommandException("E_SCHEMA_INVALID", "cancelRequestId and rootRequestDigest are required.");
316
+ object durable;
317
+ if (UnityCliActiveOperation.TryGetTerminalBySelector(CancelTerminalScope, args.CancelRequestId, args.RootRequestDigest, out durable))
318
+ return new Dictionary<string, object> { { "terminal", true }, { "result", CancelTerminalData(durable) } };
319
+ var root = Load();
320
+ if (root != null && Same(Text(root.TestOperation, "cancelRequestId"), args.CancelRequestId)
321
+ && Same(root.RequestDigest, args.RootRequestDigest))
322
+ return new Dictionary<string, object> { { "terminal", false }, { "accepted", true }, { "rootRequestId", root.RequestId }, { "runId", Text(root.TestOperation, "cancelRunId") } };
323
+ throw new BridgeCommandException("E_REQUEST_NOT_FOUND", "Test cancellation request was not found.");
324
+ }
325
+
326
+ private static Root PrepareCancel(CancelArgs args, bool allowAcceptedReplay)
327
+ {
328
+ if (args == null || string.IsNullOrWhiteSpace(args.ExpectedEditorSessionId)) throw new BridgeCommandException("E_SCHEMA_INVALID", "expectedEditorSessionId is required.");
329
+ var root = Load();
330
+ if (root == null) throw new BridgeCommandException("E_TEST_RUN_NOT_ACTIVE", "No tracked test.run operation is active.", "Start test.run before calling test.cancel.");
331
+ if (!Same(root.EditorSessionId, args.ExpectedEditorSessionId) || !Same(root.EditorSessionId, EditorSessionId())) throw new BridgeCommandException("E_EDITOR_SESSION_REPLACED", "The selected Editor session changed before test cancellation.");
332
+ if (!UnityCliSessionMutationLease.IsOwnedBy(root.RequestId, root.RequestDigest)) throw new BridgeCommandException("E_TEST_CANCEL_NOT_OWNED", "The active test run is not owned by the tracked test.run operation.");
333
+ if (Text(root.TestOperation, "phase") != "running" || Bool(root.TestOperation, "cancelRequested") && !allowAcceptedReplay) throw new BridgeCommandException("E_TEST_CANCEL_IDENTITY_UNPROVEN", "No uncancelled running test operation has a proven run GUID.", "Wait until test.run is running or inspect its terminal result.");
334
+ ActiveIdsRequired(root);
335
+ return root;
336
+ }
337
+
338
+ private static string[] ActiveIdsRequired(Root root)
339
+ {
340
+ string[] ids; string reason = null; var runId = Text(root.TestOperation, "runId");
341
+ if (!Guid.TryParse(runId, out _) || !TryReadActiveRunIds(out ids, out reason) || ids.Length != 1 || !Same(ids[0], runId))
342
+ throw new BridgeCommandException("E_TEST_CANCEL_IDENTITY_UNPROVEN", "The active Unity Test Framework run cannot be uniquely matched to the tracked operation: " + (reason ?? "identity-mismatch") + ".");
343
+ return ids;
344
+ }
345
+
346
+ private static void TickCancel(Root root)
347
+ {
348
+ var effectState = Text(root.TestOperation, "cancelEffectState");
349
+ if (Same(effectState, "dispatching"))
350
+ {
351
+ TryFreezeCancelOutcomeUnknown(root, "Test cancellation return state could not be durably confirmed; the cancellation effect may have occurred.");
352
+ return;
353
+ }
354
+ if (!Same(effectState, "dispatched")) return;
355
+ string[] ids; string reason;
356
+ if (!TryReadActiveRunIds(out ids, out reason)) return;
357
+ if (!ids.Any(id => Same(id, Text(root.TestOperation, "cancelRunId")))) FinishCancelled(root);
358
+ }
359
+
360
+ /// <summary>校验dispatch后重读root仍与effect前冻结的完整身份和selector一致。</summary>
361
+ private static bool MatchesCancelDispatch(Root root, CancelDispatchIdentity dispatch)
362
+ {
363
+ return root != null && Same(root.RequestId, dispatch.RootRequestId) && Same(root.RequestDigest, dispatch.RootRequestDigest)
364
+ && Same(root.EditorSessionId, dispatch.EditorSessionId) && root.AbsoluteDeadlineUtc == dispatch.AbsoluteDeadlineUtc
365
+ && Same(Text(root.TestOperation, "runId"), dispatch.RunId) && Same(Text(root.TestOperation, "cancelRunId"), dispatch.RunId)
366
+ && Same(Text(root.TestOperation, "cancelRequestId"), dispatch.CancelRequestId)
367
+ && Same(Text(root.TestOperation, "cancelRequestDigest"), dispatch.CancelRequestDigest)
368
+ && Same(Text(root.TestOperation, "cancelRootRequestDigest"), dispatch.RootRequestDigest)
369
+ && Same(Text(root.TestOperation, "cancelEffectState"), "dispatching");
370
+ }
371
+
372
+ /// <summary>I/O或身份不确定时直接以冻结selector发布first terminal;root状态只能best-effort推进,不能阻塞terminal。</summary>
373
+ private static bool TryStoreCancelDispatchTimeout(CancelDispatchIdentity dispatch, string message, string effectState)
374
+ {
375
+ try
376
+ {
377
+ var terminal = ProtocolEnvelopeFactory.Error(dispatch.CancelRequestId, "E_EXECUTION_TIMEOUT", message, null, new[] { "Inspect the exact test.run business state before starting another run or cancellation." });
378
+ UnityCliActiveOperation.StoreTerminalFirst(CancelTerminalScope, dispatch.CancelRequestId, dispatch.CancelRequestDigest, dispatch.RootRequestDigest, terminal);
379
+ try
380
+ {
381
+ var current = Load();
382
+ if (MatchesCancelDispatch(current, dispatch))
383
+ {
384
+ current.TestOperation["cancelRequested"] = Same(effectState, "outcome_unknown");
385
+ current.TestOperation["cancelEffectState"] = effectState;
386
+ Save(current);
387
+ }
388
+ }
389
+ catch { }
390
+ return true;
391
+ }
392
+ catch { return false; }
393
+ }
394
+
395
+ /// <summary>effect后的取消不确定性先按三元identity写first terminal;写失败保留root供下一Tick重试。</summary>
396
+ private static bool TryFreezeCancelOutcomeUnknown(Root root, string message)
397
+ {
398
+ var cancelRequestId = Text(root.TestOperation, "cancelRequestId");
399
+ var cancelDigest = Text(root.TestOperation, "cancelRequestDigest");
400
+ if (!IsSafeId(cancelRequestId) || !IsSha256(cancelDigest) || !Same(Text(root.TestOperation, "cancelRootRequestDigest"), root.RequestDigest))
401
+ return false;
402
+ try
403
+ {
404
+ var terminal = ProtocolEnvelopeFactory.Error(cancelRequestId, "E_EXECUTION_TIMEOUT", message, null, new[] { "Inspect the exact test.run business state before starting another run or cancellation." });
405
+ UnityCliActiveOperation.StoreTerminalFirst(CancelTerminalScope, cancelRequestId, cancelDigest, root.RequestDigest, terminal);
406
+ Update(root, value => value.TestOperation["cancelEffectState"] = "outcome_unknown");
407
+ return true;
408
+ }
409
+ catch { return false; }
410
+ }
411
+
412
+ private static void FinishCancelled(Root root)
413
+ {
414
+ string[] ids; string reason;
415
+ if (!TryReadActiveRunIds(out ids, out reason)) ids = new string[0];
416
+ var data = CancelData(root, true, false, ids);
417
+ cancelTerminalRequestId = Text(root.TestOperation, "cancelRequestId");
418
+ var cancelDigest = Text(root.TestOperation, "cancelRequestDigest");
419
+ if (!IsSafeId(cancelTerminalRequestId) || !IsSha256(cancelDigest)
420
+ || !Same(Text(root.TestOperation, "cancelRootRequestDigest"), root.RequestDigest))
421
+ throw new BridgeCommandException("E_EXECUTION_TIMEOUT", "Test cancellation terminal identity is incomplete; outcome is unknown.");
422
+ var cancelEnvelope = ProtocolEnvelopeFactory.Success(cancelTerminalRequestId, data);
423
+ UnityCliActiveOperation.StoreTerminalFirst(CancelTerminalScope, cancelTerminalRequestId, cancelDigest, root.RequestDigest, cancelEnvelope);
424
+ CompleteAdmissionRoot(ReadAdmissionOwnerFields(root.TestOperation, cancelTerminalRequestId));
425
+ cancelTerminalData = data;
426
+ Finish(root, ProtocolEnvelopeFactory.Error(root.RequestId, "E_TEST_RUN_CANCELLED", "The exact tracked Unity test run was cancelled.", data, new[] { "Inspect the test.cancel proof before starting another test run." }));
427
+ }
428
+
429
+ private static Dictionary<string, object> CancelAcceptedData(Root root, string runId)
430
+ {
431
+ return new Dictionary<string, object> { { "terminal", false }, { "accepted", true }, { "rootRequestId", root.RequestId }, { "rootRequestDigest", root.RequestDigest }, { "runId", runId } };
432
+ }
433
+
434
+ private static string CancelTerminalStartResponse(string requestId, object envelope)
435
+ {
436
+ var parsed = UnityCliSerializer.Parse(UnityCliSerializer.Serialize(envelope)) as Dictionary<string, object>;
437
+ object ok;
438
+ if (parsed == null || !parsed.TryGetValue("ok", out ok) || !(ok is bool))
439
+ return SerializeBridgeExceptionEnvelope(requestId, new BridgeCommandException("E_EXECUTION_TIMEOUT", "Test cancellation terminal cache is invalid; outcome is unknown."));
440
+ if (!(bool)ok) return UnityCliSerializer.Serialize(parsed);
441
+ return UnityCliSerializer.Serialize(ProtocolEnvelopeFactory.Success(requestId, new Dictionary<string, object> { { "terminal", true }, { "result", CancelTerminalData(parsed) } }));
442
+ }
443
+
444
+ private static object CancelTerminalData(object envelope)
445
+ {
446
+ var parsed = UnityCliSerializer.Parse(UnityCliSerializer.Serialize(envelope)) as Dictionary<string, object>;
447
+ object ok; object data;
448
+ if (parsed == null || !parsed.TryGetValue("ok", out ok) || !(ok is bool) || !(bool)ok
449
+ || !parsed.TryGetValue("data", out data) || !(data is Dictionary<string, object>))
450
+ throw new BridgeCommandException("E_EXECUTION_TIMEOUT", "Test cancellation terminal cache is invalid; outcome is unknown.");
451
+ return data;
452
+ }
453
+
454
+ private static Dictionary<string, object> CancelData(Root root, bool cancelled, bool dryRun, string[] activeIds)
455
+ {
456
+ return new Dictionary<string, object> { { "cancelled", cancelled }, { "dryRun", dryRun }, { "rootRequestId", root.RequestId }, { "runId", Text(root.TestOperation, "runId") }, { "platform", Text(root.TestOperation, "platform") }, { "activeRunIds", activeIds }, { "editorSessionId", root.EditorSessionId }, { "plannedEffects", new List<object> { new Dictionary<string, object> { { "type", "test-run-cancel" }, { "rootRequestId", root.RequestId }, { "runId", Text(root.TestOperation, "runId") } } } } };
457
+ }
458
+
459
+ private static CancelDispatchOutcome TryCancelExactRun(CancelDispatchIdentity dispatch, CancellationToken cancellationToken, out string reason)
460
+ {
461
+ reason = null;
462
+ var invoked = false;
463
+ try
464
+ {
465
+ var holderType = typeof(TestRunnerApi).Assembly.GetType("UnityEditor.TestTools.TestRunner.TestRun.TestJobDataHolder", false);
466
+ var property = holderType == null ? null : holderType.GetProperty("instance", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy);
467
+ var holder = property == null ? null : property.GetValue(null, null);
468
+ var field = holderType == null ? null : holderType.GetField("TestRuns", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
469
+ var runs = holder == null || field == null ? null : field.GetValue(holder) as IEnumerable;
470
+ if (runs == null) { reason = "active-runs-missing"; return CancelDispatchOutcome.NotInvoked; }
471
+ object match = null;
472
+ foreach (var run in runs)
473
+ {
474
+ var type = run.GetType();
475
+ var guid = type.GetField("guid", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)?.GetValue(run) as string;
476
+ var running = type.GetField("isRunning", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)?.GetValue(run);
477
+ if (Same(guid, dispatch.RunId) && running is bool && (bool)running) { if (match != null) { reason = "duplicate-run-id"; return CancelDispatchOutcome.NotInvoked; } match = run; }
478
+ }
479
+ if (match == null) { reason = "exact-run-missing"; return CancelDispatchOutcome.NotInvoked; }
480
+ var runnerField = match.GetType().GetField("editModeRunner", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
481
+ var runner = runnerField == null ? null : runnerField.GetValue(match);
482
+ var cancel = runner == null ? null : runner.GetType().GetMethod("OnRunCancel", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, Type.EmptyTypes, null);
483
+ if (cancel == null) { reason = "cancel-owner-missing"; return CancelDispatchOutcome.NotInvoked; }
484
+ bool isOwned;
485
+ Root current;
486
+ try { current = Required(); }
487
+ catch { reason = "dispatch-root-unreadable"; return CancelDispatchOutcome.NotInvoked; }
488
+ if (!MatchesCancelDispatch(current, dispatch) || cancellationToken.IsCancellationRequested || DateTimeOffset.UtcNow >= dispatch.AbsoluteDeadlineUtc
489
+ || !Same(dispatch.EditorSessionId, EditorSessionId()) || !UnityCliSessionMutationLease.TryIsOwnedBy(dispatch.RootRequestId, dispatch.RootRequestDigest, out isOwned) || !isOwned)
490
+ { reason = "dispatch-authorization-expired"; return CancelDispatchOutcome.NotInvoked; }
491
+ invoked = true;
492
+ cancel.Invoke(runner, null);
493
+ return CancelDispatchOutcome.Returned;
494
+ }
495
+ catch (TargetInvocationException exception) { reason = exception.InnerException == null ? exception.GetType().Name : exception.InnerException.GetType().Name; return invoked ? CancelDispatchOutcome.OutcomeUnknown : CancelDispatchOutcome.NotInvoked; }
496
+ catch (Exception exception) { reason = exception.GetType().Name; return invoked ? CancelDispatchOutcome.OutcomeUnknown : CancelDispatchOutcome.NotInvoked; }
497
+ }
498
+
499
+ private static Root Lease() { var root = Load(); return root != null && UnityCliSessionMutationLease.IsOwnedBy(root.RequestId, root.RequestDigest) ? root : null; }
500
+ private static void RecoverAfterDeadline(Root root) { object pending; if (root.TestOperation.TryGetValue("pendingFinished", out pending) && pending is Dictionary<string, object>) { ResolveRunIdentity(root); return; } string[] ids; string reason; var runId = Text(root.TestOperation, "runId") ?? Text(root.TestOperation, "returnedRunId") ?? Text(root.TestOperation, "observedRunId"); if (TryReadActiveRunIds(out ids, out reason) && ids.Length == 1 && Same(ids[0], runId)) return; if (DateTimeOffset.UtcNow >= root.AbsoluteDeadlineUtc + RecoveryGrace) Fail(root, "E_EXECUTION_TIMEOUT", "TestRunner callback terminal is unavailable after recovery grace."); }
501
+ private static void RecoverRunIdentity(Root root) { var phase = Text(root.TestOperation, "phase"); if (phase == "execute_dispatching" || phase == "run_identity_pending") ResolveRunIdentity(root); }
502
+ private static void ResolveRunIdentity(Root root)
503
+ {
504
+ root = Required(); var returned = Text(root.TestOperation, "returnedRunId"); var observed = Text(root.TestOperation, "observedRunId"); if (!string.IsNullOrEmpty(returned) && !string.IsNullOrEmpty(observed) && !Same(returned, observed)) { Fail(root, "E_EXECUTION_TIMEOUT", "TestRunnerApi returned GUID does not match RunStarted attribution."); return; }
505
+ var candidate = returned ?? observed; object pending; if (root.TestOperation.TryGetValue("pendingFinished", out pending) && pending is Dictionary<string, object>) { if (string.IsNullOrEmpty(candidate) || !Same(Text(root.TestOperation, "pendingFinishedRunId"), candidate)) { Fail(root, "E_EXECUTION_TIMEOUT", "Synchronous RunFinished result has no matching durable run identity."); return; } Update(root, x => { x.TestOperation["runId"] = candidate; x.TestOperation["phase"] = "running"; }); CompletePending(Required(), (Dictionary<string, object>)pending); return; }
506
+ string[] ids; string reason; if (!TryReadActiveRunIds(out ids, out reason) || ids.Length != 1 || string.IsNullOrEmpty(candidate) || !Same(ids[0], candidate)) { Fail(root, "E_EXECUTION_TIMEOUT", "TestRunnerApi active run identity could not be matched after Execute: " + (reason ?? "identity-mismatch") + "."); return; }
507
+ Update(root, x => { x.TestOperation["runId"] = candidate; x.TestOperation["observedRunId"] = candidate; x.TestOperation["phase"] = "running"; });
508
+ }
509
+ private static void CompletePending(Root root, Dictionary<string, object> data) { var summary = data["summary"] as Dictionary<string, object>; if (summary == null) { Fail(root, "E_EXECUTION_TIMEOUT", "Pending RunFinished summary is corrupt."); return; } object artifactFailed; if (data.TryGetValue("artifactWriteFailed", out artifactFailed) && artifactFailed is bool && (bool)artifactFailed) { data.Remove("artifactWriteFailed"); Finish(root, ProtocolEnvelopeFactory.Error(root.RequestId, "E_TEST_ARTIFACT_WRITE_FAILED", "RunFinished was proven but its NUnit XML artifact could not be written.", data, new[] { "Inspect the returned test summary and verify the UnityCli data directory is writable." })); return; } var failed = Convert.ToInt32(summary["failed"], CultureInfo.InvariantCulture); var count = Convert.ToInt32(summary["testCount"], CultureInfo.InvariantCulture); object envelope = count == 0 ? (object)ProtocolEnvelopeFactory.Error(root.RequestId, "E_TESTS_NOT_FOUND", "The requested filters matched no Unity tests.", data, new[] { "Inspect the available test names and relax the test filters." }) : failed > 0 ? (object)ProtocolEnvelopeFactory.Error(root.RequestId, "E_TESTS_FAILED", "One or more Unity tests failed.", data, new[] { "Inspect failures and the optional NUnit XML artifact." }) : ProtocolEnvelopeFactory.Success(root.RequestId, data); Finish(root, envelope); }
510
+ private static void Complete(Root root, ITestResultAdaptor result) { Finish(root, ResultEnvelope(root, result)); }
511
+ private static object ResultEnvelope(Root root, ITestResultAdaptor result) { var data = CaptureResultData(root, result); object artifactFailed; if (data.TryGetValue("artifactWriteFailed", out artifactFailed) && artifactFailed is bool && (bool)artifactFailed) { data.Remove("artifactWriteFailed"); return ProtocolEnvelopeFactory.Error(root.RequestId, "E_TEST_ARTIFACT_WRITE_FAILED", "RunFinished was proven but its NUnit XML artifact could not be written.", data, new[] { "Inspect the returned test summary and verify the UnityCli data directory is writable." }); } var failed = result.FailCount; var count = result.PassCount + result.FailCount + result.SkipCount + result.InconclusiveCount; return count == 0 ? (object)ProtocolEnvelopeFactory.Error(root.RequestId, "E_TESTS_NOT_FOUND", "The requested filters matched no Unity tests.", data, new[] { "Inspect the available test names and relax the test filters." }) : failed > 0 ? (object)ProtocolEnvelopeFactory.Error(root.RequestId, "E_TESTS_FAILED", "One or more Unity tests failed.", data, new[] { "Inspect failures and the optional NUnit XML artifact." }) : ProtocolEnvelopeFactory.Success(root.RequestId, data); }
512
+ private static Dictionary<string, object> CaptureResultData(Root root, ITestResultAdaptor result) { var summary = new Dictionary<string, object> { { "platform", Text(root.TestOperation, "platform") }, { "status", result.FailCount == 0 ? "passed" : "failed" }, { "testCount", (long)(result.PassCount + result.FailCount + result.SkipCount + result.InconclusiveCount) }, { "passed", (long)result.PassCount }, { "failed", (long)result.FailCount }, { "skipped", (long)result.SkipCount }, { "inconclusive", (long)result.InconclusiveCount }, { "duration", result.Duration }, { "startedAt", result.StartTime.ToUniversalTime().ToString("O", CultureInfo.InvariantCulture) }, { "finishedAt", result.EndTime.ToUniversalTime().ToString("O", CultureInfo.InvariantCulture) } }; var data = new Dictionary<string, object> { { "summary", summary }, { "failures", Failures(result).Cast<object>().ToList() } }; if (Bool(root.TestOperation, "xml")) { try { data["xml"] = WriteXml(root, result); } catch { data["artifactWriteFailed"] = true; } } return data; }
513
+ private static Root Required() { var root = Load(); if (root == null) throw new BridgeCommandException("E_REQUEST_NOT_FOUND", "Test active operation was not found."); return root; }
514
+ private static Root Load()
515
+ {
516
+ try { var state = UnityCliActiveOperation.Load(Scope); return state == null ? null : Parse(state); }
517
+ catch (BridgeCommandException) { throw; }
518
+ catch (Exception exception) { throw new BridgeCommandException("E_EXECUTION_TIMEOUT", "Test active state cannot be read; outcome is unknown: " + exception.GetType().Name + "."); }
519
+ }
520
+ private static void Save(Root root) { UnityCliActiveOperation.Save(Scope, Data(root)); }
521
+ private static void Update(Root root, Action<Root> change)
522
+ {
523
+ var current = Required();
524
+ if (!Same(current.RequestId, root.RequestId) || !Same(current.RequestDigest, root.RequestDigest)
525
+ || !Same(current.EditorSessionId, root.EditorSessionId) || current.AbsoluteDeadlineUtc != root.AbsoluteDeadlineUtc)
526
+ throw new BridgeCommandException("E_EXECUTION_TIMEOUT", "Test active root changed before durable update; outcome is unknown.");
527
+ change(current);
528
+ Save(current);
529
+ }
530
+ private static void Finish(Root root, object envelope)
531
+ {
532
+ bool isOwned;
533
+ if (!UnityCliSessionMutationLease.TryIsOwnedBy(root.RequestId, root.RequestDigest, out isOwned) || !isOwned)
534
+ envelope = ProtocolEnvelopeFactory.Error(root.RequestId, "E_EXECUTION_TIMEOUT", "Test run lost its exact mutation lease after effect; outcome is unknown.", null, new[] { "Inspect the Unity Test Runner before submitting another mutation." });
535
+ root.TestOperation["phase"] = "terminal_pending";
536
+ root.TestOperation["terminalEnvelope"] = envelope;
537
+ Save(root);
538
+ var first = UnityCliActiveOperation.StoreTerminalFirst(Scope, root.RequestId, root.RequestDigest, envelope);
539
+ terminalRequestId = root.RequestId; terminalRequestDigest = root.RequestDigest; terminalEnvelope = first;
540
+ UnityCliActiveOperation.BeginExactTerminalCleanup(Scope, root.RequestId, root.RequestDigest);
541
+ }
542
+ private static void RecoverTerminalCleanup()
543
+ {
544
+ try
545
+ {
546
+ if (UnityCliActiveOperation.RetryExactTerminalCleanup(Scope)) return;
547
+ var root = Load();
548
+ if (root == null) return;
549
+ object terminal;
550
+ if (!UnityCliActiveOperation.TryGetTerminal(Scope, root.RequestId, root.RequestDigest, out terminal))
551
+ {
552
+ object pending;
553
+ if (root.TestOperation.TryGetValue("terminalEnvelope", out pending) && pending != null)
554
+ terminal = UnityCliActiveOperation.StoreTerminalFirst(Scope, root.RequestId, root.RequestDigest, pending);
555
+ }
556
+ if (terminal != null) UnityCliActiveOperation.BeginExactTerminalCleanup(Scope, root.RequestId, root.RequestDigest);
557
+ }
558
+ catch { }
559
+ }
560
+ private static void Fail(Root root, string code, string message) { Finish(root, ProtocolEnvelopeFactory.Error(root.RequestId, code, message, null, new[] { "Inspect editor.state and retry." })); }
561
+ private static object Status(BridgeRequest request) { var input = request.DeserializeArgs<StatusArgs>(); if (input == null || !IsSafeId(input.RootRequestId) || !IsSha256(input.RootRequestDigest)) throw new BridgeCommandException("E_SCHEMA_INVALID", "rootRequestId and rootRequestDigest are required."); object durable; if (UnityCliActiveOperation.TryGetTerminal(Scope, input.RootRequestId, input.RootRequestDigest, out durable)) return ProtocolEnvelopeFactory.Success(request.RequestId, new Dictionary<string, object> { { "terminal", true }, { "rootEnvelope", durable } }); var root = Required(); if (!Same(root.RequestId, input.RootRequestId)) throw new BridgeCommandException("E_REQUEST_NOT_FOUND", "Test request was not found."); if (!Same(root.RequestDigest, input.RootRequestDigest)) throw new BridgeCommandException("E_REQUEST_ID_REUSED", "Test requestId was reused with different input."); return ProtocolEnvelopeFactory.Success(request.RequestId, new Dictionary<string, object> { { "terminal", false }, { "accepted", true }, { "rootRequestDigest", root.RequestDigest } }); }
562
+ private static Root NewRoot(BridgeRequest request, string digest, Args args) { DateTimeOffset deadline; if (!DateTimeOffset.TryParse(request.Execution.AbsoluteDeadlineUtc, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal, out deadline)) throw new BridgeCommandException("E_SCHEMA_INVALID", "Request deadline is invalid."); return new Root { RequestId = request.RequestId, RequestDigest = digest, EditorSessionId = EditorSessionId(), AbsoluteDeadlineUtc = deadline, TestOperation = new Dictionary<string, object> { { "phase", "queued" }, { "platform", args.Platform ?? "EditMode" }, { "xml", args.Xml }, { "testNames", args.TestNames ?? new string[0] }, { "groupNames", args.GroupNames ?? new string[0] }, { "categoryNames", args.CategoryNames ?? new string[0] }, { "assemblyNames", args.AssemblyNames ?? new string[0] }, { "lease", digest }, { "filterFingerprint", FilterFingerprint(args) } } }; }
563
+ private static Root Parse(Dictionary<string, object> state) { object id; object digest; object session; object deadline; object operation; if (!state.TryGetValue("requestId", out id) || !state.TryGetValue("requestDigest", out digest) || !state.TryGetValue("editorSessionId", out session) || !state.TryGetValue("absoluteDeadlineUtc", out deadline) || !state.TryGetValue("testOperation", out operation) || !(operation is Dictionary<string, object>)) throw new InvalidDataException("Test active state is incomplete."); DateTimeOffset parsed; if (!DateTimeOffset.TryParse(deadline as string, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal, out parsed)) throw new InvalidDataException("Test active deadline is invalid."); return new Root { RequestId = id as string, RequestDigest = digest as string, EditorSessionId = session as string, AbsoluteDeadlineUtc = parsed, TestOperation = (Dictionary<string, object>)operation }; }
564
+ private static Dictionary<string, object> Data(Root root) { return new Dictionary<string, object> { { "requestId", root.RequestId }, { "requestDigest", root.RequestDigest }, { "editorSessionId", root.EditorSessionId }, { "absoluteDeadlineUtc", root.AbsoluteDeadlineUtc.ToString("O", CultureInfo.InvariantCulture) }, { "testOperation", root.TestOperation } }; }
565
+ private static bool CanObserveCallback(Root root, params string[] phases) { return root != null && root.TestOperation != null && phases.Contains(Text(root.TestOperation, "phase")); }
566
+ private static string BusyStart(string id) { return UnityCliSerializer.Serialize(ProtocolEnvelopeFactory.Error(id, "E_UNITY_BUSY", "Another mutation owns the selected Unity instance.", null, new[] { "Wait for the current mutation to reach its terminal result, then retry." }, true, 250)); }
567
+ private static string Accepted(string id, string digest) { return UnityCliSerializer.Serialize(ProtocolEnvelopeFactory.Success(id, new Dictionary<string, object> { { "terminal", false }, { "accepted", true }, { "rootRequestDigest", digest } })); }
568
+ private static string Terminal(string id, object envelope) { return UnityCliSerializer.Serialize(ProtocolEnvelopeFactory.Success(id, new Dictionary<string, object> { { "terminal", true }, { "rootEnvelope", envelope } })); }
569
+ private static string TestTreeHash(ITestAdaptor root) { var names = new List<string>(); CollectTestNames(root, names); names.Sort(StringComparer.Ordinal); return Sha256Hex(Encoding.UTF8.GetBytes(string.Join("\n", names))); }
570
+ private static void CollectTestNames(ITestAdaptor node, List<string> names) { if (node == null) return; if (node.HasChildren && node.Children != null) { foreach (var child in node.Children) CollectTestNames(child, names); return; } names.Add(node.UniqueName ?? node.FullName ?? node.Name ?? string.Empty); }
571
+ private static bool TryReadActiveRunIds(out string[] runIds, out string reason) { runIds = new string[0]; reason = null; try { var holderType = typeof(TestRunnerApi).Assembly.GetType("UnityEditor.TestTools.TestRunner.TestRun.TestJobDataHolder", false); var property = holderType == null ? null : holderType.GetProperty("instance", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy); var holder = property == null ? null : property.GetValue(null, null); var field = holderType == null ? null : holderType.GetField("TestRuns", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); var runs = holder == null || field == null ? null : field.GetValue(holder) as IEnumerable; if (runs == null) { reason = "active-runs-missing"; return false; } var ids = new List<string>(); foreach (var run in runs) { var type = run.GetType(); var running = type.GetField("isRunning", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); var guid = type.GetField("guid", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (running == null || guid == null) { reason = "run-fields-missing"; return false; } if (running.GetValue(run) is bool && (bool)running.GetValue(run)) ids.Add(guid.GetValue(run) as string); } runIds = ids.Where(x => Guid.TryParse(x, out _)).Distinct(StringComparer.Ordinal).ToArray(); return true; } catch (Exception ex) { reason = ex.GetType().Name; return false; } }
572
+ private static IEnumerable<Dictionary<string, object>> Failures(ITestResultAdaptor node)
573
+ {
574
+ var failures = new List<Dictionary<string, object>>();
575
+ CollectFailures(node, failures);
576
+ return failures;
577
+ }
578
+ private static void CollectFailures(ITestResultAdaptor node, List<Dictionary<string, object>> failures)
579
+ {
580
+ if (node == null || failures.Count >= 100) return;
581
+ if (node.HasChildren && node.Children != null) { foreach (var child in node.Children) CollectFailures(child, failures); return; }
582
+ if (node.TestStatus != TestStatus.Failed) return;
583
+ failures.Add(new Dictionary<string, object> { { "fullName", BoundedText(node.FullName, 1024) }, { "message", BoundedText(node.Message, 4096) }, { "stackTrace", BoundedText(node.StackTrace, 8192) }, { "duration", node.Duration } });
584
+ }
585
+ private static string BoundedText(string value, int limit) { value = value ?? string.Empty; return value.Length <= limit ? value : value.Substring(0, limit); }
586
+ private static Dictionary<string, object> WriteXml(Root root, ITestResultAdaptor result) { var path = Path.Combine(DataDir(), "test-results", InstanceId(), root.RequestId + ".xml"); Directory.CreateDirectory(Path.GetDirectoryName(path)); File.WriteAllText(path, result.ToXml().OuterXml, new UTF8Encoding(false)); var bytes = File.ReadAllBytes(path); using (var sha = SHA256.Create()) return new Dictionary<string, object> { { "path", path }, { "kind", "nunit-xml" }, { "hash", Hex(sha.ComputeHash(bytes)) }, { "size", (long)bytes.Length } }; }
587
+ private static ExecutionSettings Settings(Dictionary<string, object> op) { return new ExecutionSettings(new Filter { testMode = Text(op, "platform") == "PlayMode" ? TestMode.PlayMode : TestMode.EditMode, testNames = Strings(op, "testNames"), groupNames = Strings(op, "groupNames"), categoryNames = Strings(op, "categoryNames"), assemblyNames = Strings(op, "assemblyNames") }); }
588
+ private static string Text(Dictionary<string, object> x, string key) { object value; return x != null && x.TryGetValue(key, out value) ? value as string : null; } private static bool Bool(Dictionary<string, object> x, string key) { object value; return x != null && x.TryGetValue(key, out value) && value is bool && (bool)value; } private static bool Same(string left, string right) { return !string.IsNullOrEmpty(left) && string.Equals(left, right, StringComparison.Ordinal); } private static string[] Strings(Dictionary<string, object> x, string key) { object value; if (x == null || !x.TryGetValue(key, out value)) return new string[0]; var items = value as IEnumerable; return items == null ? new string[0] : items.Cast<object>().OfType<string>().ToArray(); }
589
+ private static string FilterFingerprint(Args a) { return Sha256Hex(Encoding.UTF8.GetBytes(UnityCliSerializer.Serialize(new Dictionary<string, object> { { "platform", a.Platform ?? "EditMode" }, { "xml", a.Xml }, { "testNames", a.TestNames ?? new string[0] }, { "groupNames", a.GroupNames ?? new string[0] }, { "categoryNames", a.CategoryNames ?? new string[0] }, { "assemblyNames", a.AssemblyNames ?? new string[0] } }))); }
590
+ private static void Validate(Args a) { if (a == null || string.IsNullOrWhiteSpace(a.ExpectedEditorSessionId) || (a.Platform != null && a.Platform != "EditMode" && a.Platform != "PlayMode")) throw new BridgeCommandException("E_SCHEMA_INVALID", "platform and expectedEditorSessionId are invalid."); if (!string.Equals(a.ExpectedEditorSessionId, EditorSessionId(), StringComparison.Ordinal)) throw new BridgeCommandException("E_EDITOR_SESSION_REPLACED", "The selected Editor session changed before tests began."); }
591
+ private sealed class Args { public string Platform { get; set; } public string[] TestNames { get; set; } public string[] GroupNames { get; set; } public string[] CategoryNames { get; set; } public string[] AssemblyNames { get; set; } public bool Xml { get; set; } public string ExpectedEditorSessionId { get; set; } }
592
+ private sealed class StatusArgs { public string RootRequestId { get; set; } public string RootRequestDigest { get; set; } }
593
+ private sealed class CancelArgs { public string ExpectedEditorSessionId { get; set; } }
594
+ private sealed class CancelStatusArgs { public string CancelRequestId { get; set; } public string RootRequestDigest { get; set; } }
595
+ }
596
+ }
597
+ }
598
+ #endif